openCARP
Doxygen code documentation for the open cardiac electrophysiology simulator openCARP
sim_utils.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) NumeriCor GmbH
2 // SPDX-License-Identifier: LicenseRef-APL-1.1
3 
12 #ifndef _SIM_UTILS_H
13 #define _SIM_UTILS_H
14 
15 #include <cstdio>
16 #include <cstdlib>
17 #include <cstring>
18 
19 #include "sf_interface.h"
20 #include "timer_utils.h"
21 #include "physics_types.h"
22 #include "build_info.h"
23 
24 
25 #ifndef CARP_PARAMS
26 #define CARP_PARAMS
27 #include <openCARP_p.h>
28 #include <openCARP_d.h>
29 #endif
30 
31 #include "IGBheader.h"
32 
33 #ifdef WITH_POWERCAPPING
34 #endif
35 
36 namespace opencarp {
37 
40 
43 #define DATAOUT_NONE 0
44 #define DATAOUT_SURF 1
45 #define DATAOUT_VOL 2
46 #define DATAOUT_VTX 3
47 
48 #ifdef WITH_POWERCAPPING
49 class powercapping_manager;
50 #endif
51 
52 namespace user_globals {
56  extern std::map<mesh_t, sf_mesh> mesh_reg;
58  extern std::map<SF::quadruple<int>, SF::index_mapping<mesh_int_t> > map_reg;
60  extern std::map<physic_t, Basic_physic*> physics_reg;
62  extern timer_manager* tm_manager;
64  extern std::map<datavec_t, sf_vec*> datavec_reg;
66  extern FILE* petsc_error_fd;
68  extern bool using_legacy_stimuli;
70  extern MPI_Comm IO_Intercomm;
71 #ifdef WITH_POWERCAPPING
73  extern powercapping_manager *pc_manager;
74 #endif
75 }
76 
83 void parse_params_cpy(int argc, char** argv);
84 
88 void register_physics();
92 void initialize_physics();
96 void destroy_physics();
97 
101 void simulate();
102 
104 void post_process();
105 
112 void parse_mesh_types();
113 
121 void setup_meshes(bool require_fibers);
122 
126 void output_meshes();
127 
135 
144  const hashmap::unordered_set<int>& output_tags,
145  SF::vector<mesh_int_t>& output_idx,
146  bool async);
147 
155  const SF::vector<mesh_t>& mesh_ids);
156 
161  const SF::vector<mesh_int_t>& selected_idx);
162 
163 // flags to go with solution type
164 #define SOLV_METH(A,B) (B & A##_FLAG)
165 #define MONODOMAIN_FLAG 1
166 #define ITERATE_FLAG 2
167 #define CN_PARAB_FLAG 4
168 #define PURKINJE_FLAG 8
169 #define O2dT_PARAB_FLAG 16
170 #define PSEUDO_BIDM_FLAG 32
171 
172 // simulation modes
173 #define MONODOMAIN 0
174 #define BIDOMAIN 1
175 #define PSEUDO_BIDM 2
176 
177 // post processing options
178 // keep in jive with post_processing_opts in carp.prm
179 #define RECOVER_PHIE 1
180 #define OPTICAL_MAP 2
181 #define ACTIVATING_FUNCTION 4
182 #define AXIAL_CURRENTS 8
183 #define FILAMENTS 16
184 #define CURRENT_DENSITIES 32
185 #define LEADFIELD 64
186 
187 // experiment defs, keep in jive with carp.prm
188 #define EXP_NORMAL 0
189 #define EXP_OUTPUT_FEM 1
190 #define EXP_LAPLACE 2
191 #define EXP_SETUP_MESH 3
192 #define EXP_POSTPROCESS 4
193 
200 unsigned int classify_soln_methods();
201 
214 
217 
219 void setup_petsc_err_log();
220 
235 void set_io_dirs(char *sim_ID, char *pp_ID, IO_t init);
236 
237 bool setup_IO(int argc, char **argv);
242 void update_cwd();
249 int set_dir(IO_t dest);
250 
256 void basic_timer_setup();
257 
258 #ifdef WITH_POWERCAPPING
263 void basic_powercapping_setup();
264 #endif
265 
270 int plot_protocols(const char *);
271 
279 Basic_physic* get_physics(physic_t p, bool error_if_missing = true);
280 
282 short get_mesh_dim(mesh_t id);
283 
290 void register_data(sf_vec* dat, datavec_t d);
291 
292 [[noreturn]] void cleanup_and_exit();
293 
294 // return the direcotry path of a given file
295 char* get_file_dir(const char* file);
304 
306 struct prog_stats {
307  double op;
308  double start;
309  double last;
310  double curr;
311 };
312 
313 struct sync_io_item {
318  bool elem_flag;
320 };
321 
324  int IO_id;
327 };
329 {
330  private:
335  sf_vec* fill_output_buffer(const sync_io_item & it);
336 
337 
338  void register_output_async(sf_vec* inp_data,
339  const mesh_t inp_meshid,
340  const int dpn,
341  const char* name,
342  const char* units,
343  const SF::vector<mesh_int_t>* idx,
344  bool elem_data);
345 
346  public:
350  std::map<SF::mixed_tuple<mesh_t, int>, sf_vec*> buffmap;
351  std::map<SF::mixed_tuple<mesh_t, int>, sf_vec*> buffmap_elem;
352 
353  void register_output_sync(sf_vec* inp_data,
354  const mesh_t inp_meshid,
355  const int dpn,
356  const char* name,
357  const char* units,
358  const SF::vector<mesh_int_t>* idx = NULL,
359  bool elem_data = false);
360 
372  void register_output(sf_vec* inp_data,
373  const mesh_t inp_meshid,
374  const int dpn,
375  const char* name,
376  const char* units,
377  const SF::vector<mesh_int_t>* idx = NULL,
378  bool elem_data = false);
379 
381  void write_data();
382 
391  IGBheader* get_igb_header(const sf_vec* vec);
392 
395 };
396 
409 bool output_parameter_file(const char *fname, int argc, char **argv);
410 
425 bool render_parameter_file_value(const std::string& value,
426  bool aggregate_value,
427  std::string* rendered,
428  std::string* error);
429 
431 void savequit();
432 
434 void show_build_info();
435 
436 } // namespace opencarp
437 
438 #endif
The scatterer registry class.
The abstract physics interface we can use to trigger all physics.
Definition: physics_types.h:44
std::map< SF::mixed_tuple< mesh_t, int >, sf_vec * > buffmap_elem
Definition: sim_utils.h:351
IGBheader * get_igb_header(const sf_vec *vec)
Get the pointer to the igb header for a vector that was registered for output.
Definition: sim_utils.cc:2963
void write_data()
write registered data to disk
Definition: sim_utils.cc:2883
SF::vector< async_io_item > async_IOs
Definition: sim_utils.h:348
void register_output_sync(sf_vec *inp_data, const mesh_t inp_meshid, const int dpn, const char *name, const char *units, const SF::vector< mesh_int_t > *idx=NULL, bool elem_data=false)
Definition: sim_utils.cc:2709
std::map< SF::mixed_tuple< mesh_t, int >, sf_vec * > buffmap
map data spec -> PETSc vector buffer
Definition: sim_utils.h:350
void close_files_and_cleanup()
close file descriptors
Definition: sim_utils.cc:2939
void register_output(sf_vec *inp_data, const mesh_t inp_meshid, const int dpn, const char *name, const char *units, const SF::vector< mesh_int_t > *idx=NULL, bool elem_data=false)
Register a data vector for output.
Definition: sim_utils.cc:2850
SF::vector< sync_io_item > sync_IOs
Definition: sim_utils.h:347
std::map< int, std::string > units
Definition: stimulate.cc:26
MPI_Comm IO_Intercomm
Communicator between IO and compute worlds.
Definition: main.cc:48
FILE * petsc_error_fd
file descriptor for petsc error output
Definition: main.cc:44
timer_manager * tm_manager
a manager for the various physics timers
Definition: main.cc:40
std::map< datavec_t, sf_vec * > datavec_reg
important solution vectors from different physics
Definition: main.cc:42
std::map< SF::quadruple< int >, SF::index_mapping< mesh_int_t > > map_reg
Registriy for the inter domain mappings.
Definition: main.cc:36
bool using_legacy_stimuli
flag storing whether legacy stimuli are used
Definition: main.cc:46
SF::scatter_registry scatter_reg
Registry for the different scatter objects.
Definition: main.cc:32
std::map< mesh_t, sf_mesh > mesh_reg
Registry for the different meshes used in a multi-physics simulation.
Definition: main.cc:34
std::map< physic_t, Basic_physic * > physics_reg
the physics
Definition: main.cc:38
physic_t
Identifier for the different physics we want to set up.
Definition: physics_types.h:36
sf_vec * get_data(datavec_t d)
Retrieve a petsc data vector from the data registry.
Definition: sim_utils.cc:2080
void initialize_physics()
Initialize all physics in the registry.
Definition: sim_utils.cc:1219
bool setup_IO(int argc, char **argv)
Definition: sim_utils.cc:1555
void parse_params_cpy(int argc, char **argv)
Initialize input parameters on a copy of the real command line parameters.
Definition: sim_utils.cc:1150
SF::meshdata< mesh_int_t, mesh_real_t > sf_mesh
Definition: sf_interface.h:33
datavec_t
Enum used to adress the different data vectors stored in the data registry.
Definition: physics_types.h:84
int set_dir(IO_t dest)
Definition: sim_utils.cc:1615
void cleanup_and_exit()
Definition: sim_utils.cc:2650
void register_physics()
Register physics to the physics registry.
Definition: sim_utils.cc:1197
void post_process()
do postprocessing
Definition: sim_utils.cc:2025
void check_and_convert_params()
Here we want to put all parameter checks, conversions and modifications that have been littered throu...
Definition: sim_utils.cc:1346
short get_mesh_dim(mesh_t id)
get (lowest) dimension of the mesh used in the experiment
Definition: sim_utils.cc:2692
bool output_parameter_file(const char *fname, int argc, char **argv)
Definition: sim_utils.cc:3053
void show_build_info()
show the build info, exit if -buildinfo was provided. This code runs before MPI_Init().
Definition: sim_utils.cc:1334
void savequit()
save state and quit simulator
Definition: sim_utils.cc:3143
void set_io_dirs(char *sim_ID, char *pp_ID, IO_t init)
Definition: sim_utils.cc:1484
void register_data(sf_vec *dat, datavec_t d)
Register a data vector in the global registry.
Definition: sim_utils.cc:2090
bool render_parameter_file_value(const std::string &value, bool aggregate_value, std::string *rendered, std::string *error)
Definition: sim_utils.cc:3128
void basic_timer_setup()
Here we set up the timers that we always want to have, independent of physics.
Definition: sim_utils.cc:1627
char * get_file_dir(const char *file)
Definition: sim_utils.cc:2668
IO_t
The different output (directory) types.
Definition: sim_utils.h:39
@ POSTPROC
Definition: sim_utils.h:39
@ CURDIR
Definition: sim_utils.h:39
@ OUTPUT
Definition: sim_utils.h:39
void intersect_output_restriction(SF::vector< mesh_int_t > *&restr, const SF::vector< mesh_int_t > &selected_idx)
Intersect an existing output restriction with another local index set.
Definition: sim_utils.cc:2523
int plot_protocols(const char *fname)
plot simulation protocols (I/O timers, stimuli, boundary conditions, etc)
Definition: sim_utils.cc:1719
mesh_t
The enum identifying the different meshes we might want to load.
Definition: sf_interface.h:44
void setup_meshes(bool require_fibers=true)
Read in the reference mesh and use its data to populate all meshes registered in the mesh registry.
Definition: sim_utils.cc:2235
bool parse_gridout_tags(hashmap::unordered_set< int > &output_tags)
Parse the gridout_tags idset into a unique set of region IDs.
Definition: sim_utils.cc:2434
void validate_gridout_tags(hashmap::unordered_set< int > &output_tags, const SF::vector< mesh_t > &mesh_ids)
Warn about selected gridout tags that are absent from the relevant meshes.
Definition: sim_utils.cc:2473
void output_meshes()
Definition: sim_utils.cc:2553
Basic_physic * get_physics(physic_t p, bool error_if_missing)
Convinience function to get a physics.
Definition: sim_utils.cc:2064
unsigned int classify_soln_methods()
void destroy_physics()
Destroy all physics in the registry.
Definition: sim_utils.cc:1243
tagreg_t
tag regions types. must be in line with carp.prm
Definition: sim_utils.h:42
@ tagreg_cylinder
Definition: sim_utils.h:42
@ tagreg_list
Definition: sim_utils.h:42
@ tagreg_sphere
Definition: sim_utils.h:42
@ tagreg_block
Definition: sim_utils.h:42
void build_tagged_nodal_output_restriction(sf_mesh &mesh, const hashmap::unordered_set< int > &output_tags, SF::vector< mesh_int_t > &output_idx, bool async)
Build a local output-vector restriction from mesh element tags.
Definition: sim_utils.cc:2456
void update_cwd()
save the current working directory to curdir so that we can switch back to it if needed.
Definition: sim_utils.cc:1610
void setup_petsc_err_log()
set up error logs for PETSc, so that it doesnt print errors to stderr.
Definition: sim_utils.cc:2677
void simulate()
Main simulate loop.
Definition: sim_utils.cc:1937
void log_runtime_apl_notice()
log the runtime APL notice for the simulator binary.
Definition: sim_utils.cc:1469
void parse_mesh_types()
Parse the phys_type CLI parameters and set up (empty) SF::meshdata meshes.
Definition: sim_utils.cc:2100
Basic physics types.
Interface to SlimFem.
const SF::vector< mesh_int_t > * restr_idx
when using asyncIO, here we store the different IDs associated to the vectors we output
Definition: sim_utils.h:325
SF::vector< mesh_int_t > restr_petsc_idx
pointer to index vector with nodal indices we restrict to.
Definition: sim_utils.h:326
int IO_id
pointer to data registered for output
Definition: sim_utils.h:324
for display execution progress and statistical data of electrical solve
Definition: sim_utils.h:306
double curr
current output wallclock time
Definition: sim_utils.h:310
double start
output start wallclock time
Definition: sim_utils.h:308
double last
last output wallclock time
Definition: sim_utils.h:309
double op
output period
Definition: sim_utils.h:307
SF::vector< mesh_int_t > restr_global_idx
pointer to index vector used for restricting output.
Definition: sim_utils.h:316
bool elem_flag
igb header we use for output
Definition: sim_utils.h:318
IGBheader igb
global canonical indices matching restr_idx.
Definition: sim_utils.h:317
const SF::vector< mesh_int_t > * restr_idx
pointer to data registered for output
Definition: sim_utils.h:315
SF::mixed_tuple< mesh_t, int > spec
flag whether the data is elements-wise
Definition: sim_utils.h:319
Timers and timer manager.