Feellgood
settings.h
Go to the documentation of this file.
1 #ifndef settings_h
2 #define settings_h
3 
9 #include <cmath>
10 #include <string>
11 #include <vector>
12 
13 #include <yaml-cpp/yaml.h>
14 
15 #include "absorbing_ends.h"
16 #include "expression_parser.h"
17 #include "triangle.h"
18 #include "tetra.h"
19 
26  {
29  };
30 
41  {
42  UNDEF = -1,
43  RtoR3 = 1,
44  R4toR3 = 2
46  };
47 
71 class Settings
72  {
73 public:
80  Settings();
81 
83  static void dumpDefaults();
84 
87  static void dumpTemplate();
88 
90  void toYaml(void);
91 
93  std::string evolMetadata() const;
94 
96  std::string solMetadata(const double t) const;
97 
99  void read(YAML::Node);
100 
102  bool read(const std::string& filename);
103 
105  inline int getPrecision(void) const { return precision; }
106 
108  inline std::string getFileDisplayName(void) const { return fileDisplayName; }
109 
111  inline void setFileDisplayName(const std::string &_s) { fileDisplayName = _s; }
112 
114  inline void setPbName(const std::string &str) { pbName = str; }
115 
117  inline std::string getPbName(void) const { return pbName; }
118 
120  inline void setSimName(const std::string &str) { simName = str; }
121 
123  inline std::string getSimName(void) const { return simName; }
124 
126  inline void setScale(const double s) { _scale = s; }
127 
129  inline double getScale(void) const { return _scale; }
130 
132  inline void set_MAXITER(const int i) { MAXITER = i; }
133 
135  int verbose;
136 
138  double time_step;
139 
142 
144  bool recenter;
145 
148 
150  double threshold;
151 
155 
158 
160  bool V_file;
161 
163  bool spin_acc;
164 
166  std::string sMx;
167 
169  std::string sMy;
170 
172  std::string sMz;
173 
175  std::string sM;
176 
178  std::string sBx;
179 
181  std::string sBy;
182 
184  std::string sBz;
185 
187  std::string sB;
188 
190  std::string sB_space;
191 
193  std::string sB_time;
194 
198  std::string sJnMultiplier;
199 
201  std::string restoreFileName;
202 
204  double initial_time = NAN;
205 
207  double DUMAX; // 0.1 for magnetostatic simulations; 0.02 for the dynamics
208 
210  double TOL;
211 
213  int MAXITER;
214 
216  std::vector<Tetra::prm> paramTetra;
217 
222  template <typename T>
223  int findRegionIdx(const std::string &name ) const
224  {
225  typename std::vector<T>::const_iterator containerBegin, containerEnd;
226  if constexpr (std::is_same_v<T,Tetra::prm>)
227  { containerBegin = paramTetra.begin(); containerEnd = paramTetra.end(); }
228  else if constexpr (std::is_same_v<T,Triangle::prm>)
229  { containerBegin = paramTriangle.begin(); containerEnd = paramTriangle.end(); }
230 
231  typename std::vector<T>::const_iterator result = std::find_if(
232  containerBegin, containerEnd,
233  [name] (const T &p) { return (p.regName == name);} );
234  int idx(-2);
235  if (result == containerEnd)
236  { idx = -1; }
237  else
238  { idx = std::distance(containerBegin, result); }
239  return idx;
240  }
241 
243  std::vector<Triangle::prm> paramTriangle;
244 
246  std::string r_path_output_dir;
247 
249  std::vector<std::string> evol_columns;
250 
252  double tf;
253 
255  double dt_min;
256 
258  double dt_max;
259 
263  inline mag_exprType getMagType() const
264  {
265  if (mag_parser.parameter_count() < 4)
266  { return POSITION_ONLY; }
267  else
268  { return POSITION_AND_REGIONS; }
269  }
270 
275  inline Eigen::Vector3d getMagnetization(const Eigen::Ref<const Eigen::Vector3d> p) const
276  {
277  Eigen::Vector3d tmp = mag_parser.get_vector(p);
278  tmp.normalize();
279  return tmp;
280  }
281 
286  inline Eigen::Vector3d getMagnetization(const Eigen::Ref<const Eigen::Vector3d> p,
287  const std::vector<std::string> &regions) const
288  {
289  Eigen::Vector3d tmp = mag_parser.get_vector(p, regions);
290  tmp.normalize();
291  return tmp;
292  }
293 
298  inline Eigen::Vector3d getField(const double t_val) const
299  {
300  // If this is not meaningful, return a vector of NAN.
301  if (field_type != RtoR3)
302  { return {NAN, NAN, NAN}; }
303 
304  return (field_parser.get_vector(t_val))/mu0;
305  }
306 
310  inline field_exprType getFieldType(void) const
311  { return field_type; }
312 
317  inline Eigen::Vector3d getFieldSpace(const Eigen::Ref<const Eigen::Vector3d> p) const
318  { return field_space_parser.get_vector(p); }
319 
324  inline double getFieldTime(const double t_val) const
325  { return (field_time_parser.get_scalar(t_val))/mu0; }
326 
331  inline double jnMultiplier(const double t_val) const
332  { return jn_multiplier_parser.is_set() ? jn_multiplier_parser.get_scalar(t_val) : 1.0; }
333 
334 private:
335  using MetadataItem = std::pair<std::string, std::string>;
337  std::vector<MetadataItem> userMetadata;
338  int precision;
339  std::string fileDisplayName;
340  double _scale;
341  std::string simName;
342  std::string pbName;
350 
353 
354  // field(x,y,z,t) = field_time(t) * field_space(x,y,z) with field_time R -> R
355  // and field_space R³->R³
358 
361 
365 
367  std::ostringstream commonMetadata() const;
368 
370  const bool NORMALIZE = true;
371 
373  std::vector<std::pair<std::string, std::string>> settings_checksums;
374 
376  std::pair<std::string, std::string> mesh_checksum;
377  };
378 
379 #endif /* settings_h */
absorbing ends, to absorb the spin waves reaching the ends of a wire instead of reflecting them (sett...
Definition: expression_parser.h:22
bool is_set() const
Definition: expression_parser.h:55
double get_scalar(double arg) const
Definition: expression_parser.cpp:89
Eigen::Vector3d get_vector(double arg) const
Definition: expression_parser.cpp:125
int parameter_count() const
Definition: expression_parser.h:60
Container for all the settings provided by the user, with conversions to/from YAML.
Definition: settings.h:72
std::vector< Triangle::prm > paramTriangle
Definition: settings.h:243
std::string getFileDisplayName(void) const
Definition: settings.h:108
void setPbName(const std::string &str)
Definition: settings.h:114
std::string pbName
Definition: settings.h:342
std::string sB_space
Definition: settings.h:190
Eigen::Vector3d getMagnetization(const Eigen::Ref< const Eigen::Vector3d > p) const
Definition: settings.h:275
void toYaml(void)
Definition: settings.cpp:275
std::string r_path_output_dir
Definition: settings.h:246
double DUMAX
Definition: settings.h:207
void read(YAML::Node)
Definition: settings.cpp:469
int verbose
Definition: settings.h:135
static void dumpTemplate()
Definition: settings.cpp:267
bool spin_acc
Definition: settings.h:163
int getPrecision(void) const
Definition: settings.h:105
std::vector< std::pair< std::string, std::string > > settings_checksums
Definition: settings.h:373
std::string sB_time
Definition: settings.h:193
void setScale(const double s)
Definition: settings.h:126
const bool NORMALIZE
Definition: settings.h:370
Nodes::index recentering_direction
Definition: settings.h:147
int MAXITER
Definition: settings.h:213
bool V_file
Definition: settings.h:160
std::vector< MetadataItem > userMetadata
Definition: settings.h:337
Eigen::Vector3d getFieldSpace(const Eigen::Ref< const Eigen::Vector3d > p) const
Definition: settings.h:317
std::pair< std::string, std::string > MetadataItem
Definition: settings.h:335
AbsorbingEnds absorb
Definition: settings.h:154
std::string evolMetadata() const
Definition: settings.cpp:448
std::string sMz
Definition: settings.h:172
std::pair< std::string, std::string > mesh_checksum
Definition: settings.h:376
field_exprType getFieldType(void) const
Definition: settings.h:310
double jnMultiplier(const double t_val) const
Definition: settings.h:331
ExpressionParser field_time_parser
Definition: settings.h:357
ExpressionParser field_parser
Definition: settings.h:352
ExpressionParser field_space_parser
Definition: settings.h:360
double dt_max
Definition: settings.h:258
double initial_time
Definition: settings.h:204
ExpressionParser mag_parser
Definition: settings.h:343
std::string sM
Definition: settings.h:175
ExpressionParser jn_multiplier_parser
Definition: settings.h:364
void setFileDisplayName(const std::string &_s)
Definition: settings.h:111
std::string sBz
Definition: settings.h:184
int findRegionIdx(const std::string &name) const
Definition: settings.h:223
double getScale(void) const
Definition: settings.h:129
Eigen::Vector3d getMagnetization(const Eigen::Ref< const Eigen::Vector3d > p, const std::vector< std::string > &regions) const
Definition: settings.h:286
std::string simName
Definition: settings.h:341
double getFieldTime(const double t_val) const
Definition: settings.h:324
std::string getPbName(void) const
Definition: settings.h:117
std::string sMy
Definition: settings.h:169
std::string sBx
Definition: settings.h:178
void setSimName(const std::string &str)
Definition: settings.h:120
int precision
Definition: settings.h:338
std::string solMetadata(const double t) const
Definition: settings.cpp:458
Settings()
Definition: settings.cpp:255
std::string restoreFileName
Definition: settings.h:201
mag_exprType getMagType() const
Definition: settings.h:263
bool recenter
Definition: settings.h:144
std::string getSimName(void) const
Definition: settings.h:123
double TOL
Definition: settings.h:210
double tf
Definition: settings.h:252
double threshold
Definition: settings.h:150
std::vector< std::string > evol_columns
Definition: settings.h:249
static void dumpDefaults()
Definition: settings.cpp:265
Eigen::Vector3d getField(const double t_val) const
Definition: settings.h:298
void set_MAXITER(const int i)
Definition: settings.h:132
double _scale
Definition: settings.h:340
std::string fileDisplayName
Definition: settings.h:339
std::string sB
Definition: settings.h:187
double dt_min
Definition: settings.h:255
std::string sJnMultiplier
Definition: settings.h:198
std::string sMx
Definition: settings.h:166
std::vector< Tetra::prm > paramTetra
Definition: settings.h:216
field_exprType field_type
Definition: settings.h:349
std::string sBy
Definition: settings.h:181
int save_period
Definition: settings.h:141
double time_step
Definition: settings.h:138
int scalfmmNbTh
Definition: settings.h:157
std::ostringstream commonMetadata() const
Definition: settings.cpp:418
index
Definition: node.h:33
field_exprType
Definition: settings.h:41
@ RtoR3
B(t)
Definition: settings.h:43
@ UNDEF
undefined
Definition: settings.h:42
@ R4toR3
Definition: settings.h:44
mag_exprType
Definition: settings.h:26
@ POSITION_AND_REGIONS
M(x, y, z, regions)
Definition: settings.h:28
@ POSITION_ONLY
M(x, y, z)
Definition: settings.h:27
Definition: absorbing_ends.h:26
namespace Tetra header containing Tet class, some constants, and integrales
contains namespace Triangle header containing Tri class, and some constants and a less_than operator ...