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 "expression_parser.h"
16 #include "triangle.h"
17 #include "tetra.h"
18 
25  {
28  };
29 
40  {
41  UNDEF = -1,
42  RtoR3 = 1,
43  R4toR3 = 2
45  };
46 
69 class Settings
70  {
71 public:
78  Settings();
79 
81  static void dumpDefaults();
82 
85  static void dumpTemplate();
86 
88  void toYaml(void);
89 
91  std::string evolMetadata() const;
92 
94  std::string solMetadata(const double t) const;
95 
97  void read(YAML::Node);
98 
100  bool read(const std::string& filename);
101 
103  inline int getPrecision(void) const { return precision; }
104 
106  inline std::string getFileDisplayName(void) const { return fileDisplayName; }
107 
109  inline void setFileDisplayName(const std::string &_s) { fileDisplayName = _s; }
110 
112  inline void setPbName(const std::string &str) { pbName = str; }
113 
115  inline std::string getPbName(void) const { return pbName; }
116 
118  inline void setSimName(const std::string &str) { simName = str; }
119 
121  inline std::string getSimName(void) const { return simName; }
122 
124  inline void setScale(const double s) { _scale = s; }
125 
127  inline double getScale(void) const { return _scale; }
128 
130  inline void set_MAXITER(const int i) { MAXITER = i; }
131 
133  int verbose;
134 
136  double time_step;
137 
140 
142  bool recenter;
143 
146 
148  double threshold;
149 
152 
154  bool V_file;
155 
157  bool spin_acc;
158 
160  std::string sMx;
161 
163  std::string sMy;
164 
166  std::string sMz;
167 
169  std::string sM;
170 
172  std::string sBx;
173 
175  std::string sBy;
176 
178  std::string sBz;
179 
181  std::string sB;
182 
184  std::string sB_space;
185 
187  std::string sB_time;
188 
190  std::string restoreFileName;
191 
193  double initial_time = NAN;
194 
196  double DUMAX; // 0.1 for magnetostatic simulations; 0.02 for the dynamics
197 
199  double TOL;
200 
202  int MAXITER;
203 
205  std::vector<Tetra::prm> paramTetra;
206 
211  template <typename T>
212  int findRegionIdx(const std::string &name ) const
213  {
214  typename std::vector<T>::const_iterator containerBegin, containerEnd;
215  if constexpr (std::is_same_v<T,Tetra::prm>)
216  { containerBegin = paramTetra.begin(); containerEnd = paramTetra.end(); }
217  else if constexpr (std::is_same_v<T,Triangle::prm>)
218  { containerBegin = paramTriangle.begin(); containerEnd = paramTriangle.end(); }
219 
220  typename std::vector<T>::const_iterator result = std::find_if(
221  containerBegin, containerEnd,
222  [name] (const T &p) { return (p.regName == name);} );
223  int idx(-2);
224  if (result == containerEnd)
225  { idx = -1; }
226  else
227  { idx = std::distance(containerBegin, result); }
228  return idx;
229  }
230 
232  std::vector<Triangle::prm> paramTriangle;
233 
235  std::string r_path_output_dir;
236 
238  std::vector<std::string> evol_columns;
239 
241  double tf;
242 
244  double dt_min;
245 
247  double dt_max;
248 
252  inline mag_exprType getMagType() const
253  {
254  if (mag_parser.parameter_count() < 4)
255  { return POSITION_ONLY; }
256  else
257  { return POSITION_AND_REGIONS; }
258  }
259 
264  inline Eigen::Vector3d getMagnetization(const Eigen::Ref<const Eigen::Vector3d> p) const
265  {
266  Eigen::Vector3d tmp = mag_parser.get_vector(p);
267  tmp.normalize();
268  return tmp;
269  }
270 
275  inline Eigen::Vector3d getMagnetization(const Eigen::Ref<const Eigen::Vector3d> p,
276  const std::vector<std::string> &regions) const
277  {
278  Eigen::Vector3d tmp = mag_parser.get_vector(p, regions);
279  tmp.normalize();
280  return tmp;
281  }
282 
287  inline Eigen::Vector3d getField(const double t_val) const
288  {
289  // If this is not meaningful, return a vector of NAN.
290  if (field_type != RtoR3)
291  { return {NAN, NAN, NAN}; }
292 
293  return (field_parser.get_vector(t_val))/mu0;
294  }
295 
299  inline field_exprType getFieldType(void) const
300  { return field_type; }
301 
306  inline Eigen::Vector3d getFieldSpace(const Eigen::Ref<const Eigen::Vector3d> p) const
307  { return field_space_parser.get_vector(p); }
308 
313  inline double getFieldTime(const double t_val) const
314  { return (field_time_parser.get_scalar(t_val))/mu0; }
315 
316 private:
317  using MetadataItem = std::pair<std::string, std::string>;
319  std::vector<MetadataItem> userMetadata;
320  int precision;
321  std::string fileDisplayName;
322  double _scale;
323  std::string simName;
324  std::string pbName;
332 
335 
336  // field(x,y,z,t) = field_time(t) * field_space(x,y,z) with field_time R -> R
337  // and field_space R³->R³
340 
343 
345  std::ostringstream commonMetadata() const;
346 
348  const bool NORMALIZE = true;
349 
351  std::vector<std::pair<std::string, std::string>> settings_checksums;
352 
354  std::pair<std::string, std::string> mesh_checksum;
355  };
356 
357 #endif /* settings_h */
Definition: expression_parser.h:22
double get_scalar(double arg) const
Definition: expression_parser.cpp:81
Eigen::Vector3d get_vector(double arg) const
Definition: expression_parser.cpp:117
int parameter_count() const
Definition: expression_parser.h:47
Container for all the settings provided by the user, with conversions to/from YAML.
Definition: settings.h:70
std::vector< Triangle::prm > paramTriangle
Definition: settings.h:232
std::string getFileDisplayName(void) const
Definition: settings.h:106
void setPbName(const std::string &str)
Definition: settings.h:112
std::string pbName
Definition: settings.h:324
std::string sB_space
Definition: settings.h:184
Eigen::Vector3d getMagnetization(const Eigen::Ref< const Eigen::Vector3d > p) const
Definition: settings.h:264
void toYaml(void)
Definition: settings.cpp:260
std::string r_path_output_dir
Definition: settings.h:235
double DUMAX
Definition: settings.h:196
void read(YAML::Node)
Definition: settings.cpp:429
int verbose
Definition: settings.h:133
static void dumpTemplate()
Definition: settings.cpp:252
bool spin_acc
Definition: settings.h:157
int getPrecision(void) const
Definition: settings.h:103
std::vector< std::pair< std::string, std::string > > settings_checksums
Definition: settings.h:351
std::string sB_time
Definition: settings.h:187
void setScale(const double s)
Definition: settings.h:124
const bool NORMALIZE
Definition: settings.h:348
Nodes::index recentering_direction
Definition: settings.h:145
int MAXITER
Definition: settings.h:202
bool V_file
Definition: settings.h:154
std::vector< MetadataItem > userMetadata
Definition: settings.h:319
Eigen::Vector3d getFieldSpace(const Eigen::Ref< const Eigen::Vector3d > p) const
Definition: settings.h:306
std::pair< std::string, std::string > MetadataItem
Definition: settings.h:317
std::string evolMetadata() const
Definition: settings.cpp:408
std::string sMz
Definition: settings.h:166
std::pair< std::string, std::string > mesh_checksum
Definition: settings.h:354
field_exprType getFieldType(void) const
Definition: settings.h:299
ExpressionParser field_time_parser
Definition: settings.h:339
ExpressionParser field_parser
Definition: settings.h:334
ExpressionParser field_space_parser
Definition: settings.h:342
double dt_max
Definition: settings.h:247
double initial_time
Definition: settings.h:193
ExpressionParser mag_parser
Definition: settings.h:325
std::string sM
Definition: settings.h:169
void setFileDisplayName(const std::string &_s)
Definition: settings.h:109
std::string sBz
Definition: settings.h:178
int findRegionIdx(const std::string &name) const
Definition: settings.h:212
double getScale(void) const
Definition: settings.h:127
Eigen::Vector3d getMagnetization(const Eigen::Ref< const Eigen::Vector3d > p, const std::vector< std::string > &regions) const
Definition: settings.h:275
std::string simName
Definition: settings.h:323
double getFieldTime(const double t_val) const
Definition: settings.h:313
std::string getPbName(void) const
Definition: settings.h:115
std::string sMy
Definition: settings.h:163
std::string sBx
Definition: settings.h:172
void setSimName(const std::string &str)
Definition: settings.h:118
int precision
Definition: settings.h:320
std::string solMetadata(const double t) const
Definition: settings.cpp:418
Settings()
Definition: settings.cpp:240
std::string restoreFileName
Definition: settings.h:190
mag_exprType getMagType() const
Definition: settings.h:252
bool recenter
Definition: settings.h:142
std::string getSimName(void) const
Definition: settings.h:121
double TOL
Definition: settings.h:199
double tf
Definition: settings.h:241
double threshold
Definition: settings.h:148
std::vector< std::string > evol_columns
Definition: settings.h:238
static void dumpDefaults()
Definition: settings.cpp:250
Eigen::Vector3d getField(const double t_val) const
Definition: settings.h:287
void set_MAXITER(const int i)
Definition: settings.h:130
double _scale
Definition: settings.h:322
std::string fileDisplayName
Definition: settings.h:321
std::string sB
Definition: settings.h:181
double dt_min
Definition: settings.h:244
std::string sMx
Definition: settings.h:160
std::vector< Tetra::prm > paramTetra
Definition: settings.h:205
field_exprType field_type
Definition: settings.h:331
std::string sBy
Definition: settings.h:175
int save_period
Definition: settings.h:139
double time_step
Definition: settings.h:136
int scalfmmNbTh
Definition: settings.h:151
std::ostringstream commonMetadata() const
Definition: settings.cpp:378
index
Definition: node.h:33
field_exprType
Definition: settings.h:40
@ RtoR3
B(t)
Definition: settings.h:42
@ UNDEF
undefined
Definition: settings.h:41
@ R4toR3
Definition: settings.h:43
mag_exprType
Definition: settings.h:25
@ POSITION_AND_REGIONS
M(x, y, z, regions)
Definition: settings.h:27
@ POSITION_ONLY
M(x, y, z)
Definition: settings.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 ...