GCC Code Coverage Report


Directory: ./
File: Core/felisceParam.hpp
Date: 2024-04-14 07:32:34
Exec Total Coverage
Lines: 14 14 100.0%
Branches: 0 0 -%

Line Branch Exec Source
1 // ______ ______ _ _ _____ ______
2 // | ____| ____| | (_)/ ____| | ____|
3 // | |__ | |__ | | _| (___ ___| |__
4 // | __| | __| | | | |\___ \ / __| __|
5 // | | | |____| |____| |____) | (__| |____
6 // |_| |______|______|_|_____/ \___|______|
7 // Finite Elements for Life Sciences and Engineering
8 //
9 // License: LGL2.1 License
10 // FELiScE default license: LICENSE in root folder
11 //
12 // Main authors: J. Foulon & J-F. Gerbeau & V. Martin
13 //
14
15 #ifndef _FELISCE_PARAM_HPP
16 #define _FELISCE_PARAM_HPP
17
18 // System includes
19 #include <cstdlib>
20 #include <map>
21 #include <unordered_map>
22
23 // External includes
24
25 // Project includes
26 #include "Core/getPotCustomized.hpp"
27 #include "Core/shared_pointers.hpp"
28 #include "Geometry/geometricMeshRegion.hpp"
29 #include "Core/felisce.hpp"
30 #include "Core/felisce_error.hpp"
31 #include "Core/singleton.hpp"
32 #include "Core/chrono.hpp"
33 #include "Core/util_string.hpp"
34 #include "Core/commandLineOption.hpp"
35 #include "Hyperelasticity/enumHyperelasticity.hpp"
36 #include "Hyperelasticity/pressureData.hpp"
37 #include "HyperelasticityLaws/HyperElasticLaw.hpp"
38
39 // TODO: Refactor all this in order to use variables instead of member variables, otherwise this object is very heavy
40
41 namespace felisce
42 {
43 typedef std::unordered_map<std::string,ElementFieldDynamicValue*> ElementFieldDynamicValueMapType;
44
45 /**
46 * @class UniqueFelisceParam
47 * @brief Auxiliary class for reading the felisce data in the data file and on the command line option.
48 */
49 class UniqueFelisceParam
50 {
51 private:
52 std::unordered_map<std::string, std::vector<std::string> > m_help;
53
54 //Disable default copy-constructor and copy-assignement.
55 //If copy-constructor is needed, proper copy of ElementFieldDynamicValueMap has
56 //to be written.
57 UniqueFelisceParam(const UniqueFelisceParam &);
58 UniqueFelisceParam(UniqueFelisceParam &);
59 UniqueFelisceParam& operator=(const UniqueFelisceParam&);
60 UniqueFelisceParam& operator=(UniqueFelisceParam&);
61
62 std::size_t mInstanceIndex = 0;
63
64 public:
65
66 /// Pointer definition of UniqueFelisceParam
67 FELISCE_CLASS_POINTER_DEFINITION(UniqueFelisceParam);
68
69 UniqueFelisceParam(const std::size_t instanceIndex = 0);
70
71 virtual ~UniqueFelisceParam();
72
73 const std::size_t& getInstanceIndex() { return mInstanceIndex; };
74
75 CommandLineOption initialize(const int argc, const char** argv);
76
77 void initialize(CommandLineOption & opt);
78
79 /*!
80 \brief Read the felisce data in the data file and on the command line option.
81 */
82 void parseInputFile(int argc,char **argv,std::string filename);
83
84 /*!
85 \brief Read the felisce data in the data file and on the command line option.
86 With data only dependent on the application.
87 */
88 465 virtual void userParseInputFile(GetPotCustomized& /*gpc*/){};
89
90 /*!
91 * In verbose mode, display the read values .
92 */
93 void print(int verbose = 0, std::ostream& outstr = std::cout) const;
94
95 /*!
96 * Display help about available Felisce data, like a manpage.
97 */
98 void printHelp();
99
100 /*
101 * Get an *elementFieldDynamicValue from ElementFieldDynamicValueMap,
102 * returns NULL the std::unordered_map does not contain it.
103 */
104 ElementFieldDynamicValue *elementFieldDynamicValue(const char* name);
105
106 /*
107 * \brief Expand environment variables $HOME, $FELISCE_DATA_DIR, $FELISCE_INRIA_DATA_DIR and $FELISCE_RESULT_DIR in a std::string.
108 *
109 * \param[in] inputPath The input std::string, that may contains $HOME or $FELISCE_DATA_DIR or $FELISCE_INRIA_DATA_DIR or FELISCE_RESULT_DIR
110 * \param[in] datafile data file where inputPath come from, for debug message purpose
111 * \param[in] section data file section where inputPath come from, for debug message purpose
112 * \param[in] inputPathName data file variable where inputPath come from, for debug message purpose
113 * \param[out] pathExpanded inputPathName where environment variables have been expanded
114 *
115 * FEL_ERROR is called in case of errors, with various corresponding error
116 * messages.
117 */
118 std::string expandEnvironmentVariables(const std::string inputPath,
119 const std::string datafile, const std::string section, const std::string inputPathName);
120
121 public:
122
123 int tmpLinSolverVerbose;
124
125 //Debug
126 int m_verbose,m_refVerbose;
127
128 // Chrono
129 Chrono timer;
130 bool chronoToScreen;
131 bool chronoToFile;
132
133 // Data
134 std::string inputDirectory;
135 std::string inputDirRaw;
136 std::string inputFile;
137 std::string podBasisFile;
138 felInt timeMaxCaseFile;
139 bool readDisplFromFile;
140 bool readPreStressedDisplFromFile;
141
142 // Transient
143 double timeStep;
144 double timeMax;
145 double time;
146 double timeStepCharact;
147 int iteration;
148 int timeIterationMax;
149 int frequencyWriteSolution;
150 int periodNbSteps;
151 std::vector<int> intervalWriteSolution;
152 std::string integrationTimeMethod;
153 bool writeSolutionMeshes;
154
155 // Variable
156 std::vector<std::string> nameVariable;
157 bool non_p1_mesh = false;
158 std::vector<int> typeOfFiniteElement;
159 std::vector<int> degreeOfExactness;
160 std::vector<bool> decomposePlaneTransverse;
161 std::vector<int> planeDegreeOfExactness;
162 std::vector<int> transverseDegreeOfExactness;
163 std::vector<PhysicalVariable> physicalVariable;
164
165 // Mesh
166 std::string meshDir;
167 std::string meshDirRaw;
168 std::vector<std::string> inputMesh;
169 std::vector<std::string> outputMesh;
170 felInt outputFileFormat;
171 std::vector<int> idMesh;
172 std::string resultDirRaw;
173 std::string resultDir;
174 std::string resultDirStressesRaw;
175 std::string resultDirStresses;
176 std::vector<std::string> prefixName;
177 std::string CVGraphInterface;
178 std::unordered_map<std::string , std::map<int, std::string> > felName2MapintRef2DescLine;
179 bool duplicateSupportDof;
180 bool effective2dGEOmesh;
181 bool flipNormal;
182 bool readNodesReferences;
183 // List of surfaces (or segments) that are part of the domain and not boundary of tetrahedra (or surfaces)
184 std::vector<felInt> notBoundarySurfaceLabels;
185 bool reinterpolation;
186 bool extendToLowerDimensions;
187 std::string choiceDirectionTangent;
188 bool whenExtrudePreserveOriginalCoordinates;
189 bool checkVolumeOrientation;
190 bool checkNormalOrientation;
191 int numCoor = 0; // Number of coordinates (2D/3D)
192
193 // Geometry
194 struct S_Geo {
195 double tolrescaling = 1.;
196 } Geo;
197
198 // Physics
199 int unit;
200 double spaceUnit; // This number multiplies all the coordinates of the mesh. Example: if the mesh is in millimeters, spaceUnit = 0.1 convert it in centimeters
201 std::string model;
202 int testCase;
203 double u_max_inlet;
204 double max_flow_scaling;
205 double T_sis;
206 double T;
207 double symmetry;
208 std::vector<int> dimension;
209
210 // ROM
211 std::string ROMmethod;
212 bool solveEigenProblem;
213 bool optimizePotential;
214 double chiSchrodinger;
215 bool useROM;
216 felInt dimRomBasis;
217 felInt dimCollocationPts;
218 felInt numApproxMode;
219 felInt nCutOff;
220 std::string collocationPtsFile;
221 bool useImprovedRec;
222 felInt dimOrthComp;
223 int orderALP;
224 bool readBasisFromFile;
225 bool writeBasisEvolution;
226 bool hasSource;
227 int numberOfSource;
228 felInt numberOfSnapshot;
229 felInt samplingFrequency;
230
231 // POD
232 bool verbose_ensight;
233 int nbTestCase;
234 int snap_centered;
235 int L2Mass;
236 std::string output_dir;
237 std::string output_file;
238 std::string case_dir;
239 std::string case_file_name;
240 std::string snap_interval;
241 std::string variable_name;
242 std::string podFolder;
243 double timeStepSnap;
244
245 // Optimal reconstruction
246 double targetHR;
247 double timeWindowSize;
248 std::string image_modality;
249 double sistolicTime;
250 std::string patients_data_dir;
251 double HRwindowSize;
252 int nbMeasures;
253 int nbModes;
254 std::string targetTime;
255 bool useField2Measures;
256 bool doSnapshotsSVD;
257 bool calculateRieszRepresenters;
258 std::string measuresFile;
259 std::string targetSim;
260 std::string rrFolder;
261 std::string fieldFolder;
262 std::string hashTableMesh;
263 std::string modelReductionTechnique;
264
265 // Pressure estimation
266 int inletBoundaryLabel;
267 int wallBoundaryLabel;
268 std::vector<int> outletBoundaryLabels;
269 std::vector<std::string> testFunctionsPath;
270 std::vector<std::string> uStarPath;
271
272 // PostProcCFD
273 std::string caseDirCFD;
274 std::string caseFileNameCFD;
275
276 // Fluid
277 int orderBdfNS;
278 int orderBdfFS;
279 bool quasistatic;
280 double density;
281 double viscosity;
282 double NS_alpha; // like a capacitance in Rp,C,Rd lumpedModelBC model
283 double NS_beta; // like inverse of distal resistance in Rp,C,Rd lumpedModelBC model
284 double NS_gamma; // like proximal resistance in Rp,C,Rd lumpedModelBC model
285 int NSmodifFlag; // flag: 0 = no modified NS model
286 int NS_modifLabel; // currentLabel where we apply modified NS terms
287 int inletLabel; // label of an inlet of interest
288 int outletLabel; // label of an outlet of interest
289 double referenceValue1; // any reference value (general purpose)
290 double referenceValue2; // any reference value (general purpose)
291 double referenceValue3; // any reference value (general purpose)
292 double referenceValue4; // any reference value (general purpose)
293 int characteristicMethod; // to switch from semi-implicit resolution to method of characteristics
294 int addedBoundaryFlag; // flag: 0 = no stabilization
295 std::vector<int> stabilizationLabel; // label where we use stabilization
296 double stabilizationCoef; // coef for tune stabilization
297 int explicitAdvection;
298 int CVGraphInterfaceVariationalBC;
299 double NitscheStabilizParam; //Nitsche's stabilization parameter
300 double NitschePenaltyParam; //Nitsche's penalty parameter
301 double ContactTolerance; //Tolerance value for the contact with a simple straight wall handled by the structure
302 bool useSymmetricStress;
303 int NSequationFlag; // Flag to choose implementation method of advective term
304 double stabSUPG; // SUPG stabilization parameter
305 double stabdiv; // stab parameter div div
306 int typeSUPG; // type of SUPG stabilization
307 int NSStabType; // type of stabilization for advection and finite element for NS equation
308 double stabFOVel; // velocity jump coefficient for face-oriented stabilization
309 double stabFOPre; // pressure jump coefficient for face-oriented stabilization
310 int orderPressureExtrapolation; // order of the pressure extrapolation for NSFracStep solvers
311 int incrementalFS;
312 double coefRotScheme; // coef for the rotational incremental NSFracStep solvers
313 int useALEformulation; // 0: no ALE 1: standard ALE, 2: stabilized ALE
314 bool bcInRefConfiguration; // = true means BC are applied on the reference ALE configuration
315 bool useElasticExtension;
316 bool initALEDispByFile;
317 bool updateMeshByVelocity;
318 double theta; // theta parameter (0 \geq theta \geq 1) in the theta-method (time marching)
319 bool nonLinearFluid; //bool non linear solver
320 int timeScheme;
321 double gammaNM;
322 double betaNM;
323
324 // Poroelasticity
325 double biotCoefficient;
326 double biotModulus;
327 double isoPermeab;
328 double anisoPermeab;
329 int validationTest;
330 bool scalePressureEq;
331
332 // FSI
333 bool fsiCoupling;
334 std::string typeOfInterface;
335 int fsiRNscheme;
336 double gammaRN; // Robin parameter for iterative RN coupling with solid
337 bool useLumpedMassRN;
338 bool useMassLumping;
339 std::vector<int> fsiInterfaceLabel;
340 double domainDecompositionToll;
341 int domainDecompositionMaxIt;
342 bool hasOldMaster;
343
344 // ZeroMQ
345 std::string socketTransport; // communication transport protocol (tcp, ipc, inproc,...)
346 std::string socketAddress; // transport-specific address (interface) to connect to (ex: 127.0.0.1 for localhost)
347 std::string socketPort; // for tcp transport, specifies the port on the interface
348
349 //immersed data for the structure penalisation
350 bool hasImmersedData;
351 std::string meshDirImmersedStruct;
352 std::string meshFileImmersedStruct;
353 double penaltyCoeffImmersedStruct;
354 int allowProjectionImmersedStruct;
355 double valueSourceImmersedStruct;
356 int useMassMatrix; // specify the content of the fourth block of the fluid matrix for the implicit immersed problems. 1: Penalisation coefficient * Mass matrix of the structure. 0: Penalisation coefficient.
357 bool hasDivDivStab; // modification of the SUPG and div div stabilization to improve mass convervation across the valve (cf. Kamensky et al., CMAME, 284, 1005-1053)
358 double localDivDivPenalty;
359 bool divDivStabPostProcess; // boolean to print the results relative to the intersection of the structure mesh with the fluid mesh in files "intersection.****.scl"
360 bool intersectedSubElementsPostProcess; // boolean to print the results relative to the edges of the fluid mesh intersected by the structure mesh in files "intersectedEdges.****.scl"
361 bool useFDlagrangeMult;
362 bool massConstraint;
363 std::vector<felInt> japanLabels;
364 bool BHstab;
365 bool BPstab;
366 double stabCoeffLag;
367 bool useFicItf;
368 bool flipItfNormal;
369 bool useAverageNormal;
370
371 // M1G library interface
372 struct S_M1G {
373 bool enable;
374 int verbose;
375 std::vector<int> labelPhys;
376 std::vector<int> labelFict;
377 std::vector<felInt> triLst;
378 std::vector<felInt> verLst;
379 std::string outdir;
380 bool writeM1Gmeshes;
381 } M1G;
382
383 //fkpp
384 std::vector<double> sourcePos;
385
386 // Nitsche-XFEM formulation
387 bool useDynamicStructure;
388 bool useGhostPenalty;
389 double coefGhostPenalty;
390 bool useProjectionForNitscheXFEM;
391 bool useInterfaceFlowStab;
392 felInt couplingSchemeStoppingCriteria;
393 bool useODESolve;
394 bool usePenaltyFreeNitscheMethod;
395 felInt contactDarcy;
396 double epsDarcy;
397 double kDarcy;
398 bool writeXFEMmeshes;
399 bool confIntersection;
400 std::vector<int> structures; // Structure label (mesh file)
401 std::vector<int> numficxstr; // Number of fictitious structure per structure
402 std::vector<int> fictitious; // Fictitious structure label (mesh file)(one or more for evry structure)
403 std::vector<int> meanLabel;
404
405 // Solid
406 double densitySolid;
407 double young;
408 double poisson;
409 double coeffReaction; //coeff for diaphragm and chest reaction - lung model, mechanically induced respiration
410 double lambda_lame;
411 double mu_lame;
412 double thickness;
413 double alpha_rayleigh;
414 double beta_rayleigh;
415 bool hasRayleighDamping;
416 int planeStressStrain;
417 int volumicOrSurfacicForce;
418 struct CiarletGeymonatType {
419 double kappa1;
420 double kappa2;
421 } CiarletGeymonat;
422 struct OgdenType {
423 double C1;
424 double C2;
425 double a;
426 } Ogden;
427 int nbSubRegions;
428 int flagJacobi;
429
430 double hyperelastic_bulk; // for penalization term in hyperelasticity constitutive law.
431 double volumic_mass;
432 bool hasSolidMidpoint;
433 double solidRadius;
434 std::string typeOfElasticityModel;
435 std::string typeOfShellModel;
436 std::vector<int> contactLabelPair;
437 std::vector<int> rayOrientation;
438 double contactGap;
439 bool evalEnergy;
440 bool velocityConstrained;
441
442 // Beam
443 struct Beam {
444 int sub_integration;
445 bool timoshenko;
446 double diameter;
447 double inner_diameter;
448 double depth;
449 double cross_area;
450 double effective_area_y;
451 double effective_area_z;
452 double moment_of_intertia_y;
453 double moment_of_intertia_z;
454 double torsional_inertia;
455 } beam;
456
457 //elec
458 bool hasCoupledAtriaVent;
459 int orderBdfEdp;
460 int orderBdfIonic;
461 //elec - model
462 std::string typeOfIonicModel;
463
464 std::string CellsType;
465
466 bool spontaneous;
467 bool hasHeteroTauClose;
468 bool hasHeteroCourtPar;
469 bool hasHeteroCondAtria;
470 bool hasAppliedExteriorCurrent;
471 //elec - Schaf solver
472 bool printIonicVar;
473 double tauOpen;
474 double tauClose;
475 double tauCloseEndo;
476 double tauCloseCell;
477 double tauCloseEpi;
478 double tauCloseRV;
479 double tauIn;
480 double tauOut;
481 double kTanhMSR;
482 double vMin;
483 double vMax;
484 double vGate;
485 //elec - FhN solver
486 double epsilon;
487 double beta;
488 double gammaEl;
489 double f0;
490 double alpha;
491 //elec - MV solver parameters for inverse problem
492 double tau_so_1_epi;
493 double tau_so_1_endo;
494 double tau_so_1_mcel;
495 double tau_so_1_rv;
496 //elec - MV conductance parameters
497 double gfi_rv;
498 double gfi_endo;
499 double gfi_mid;
500 double gfi_epi;
501 double gso_rv;
502 double gso_endo;
503 double gso_mid;
504 double gso_epi;
505 double gsi_rv;
506 double gsi_endo;
507 double gsi_mid;
508 double gsi_epi;
509 //elec - Courtemanche solver parameters for inverse problem
510 double g_Na_PM;
511 double g_Na_CT;
512 double g_Na_BB;
513 //elec - Luenberger filter
514 bool stateFilter;
515 bool schroFilter;
516 bool electrodeControl;
517 double aFilter;
518 double gain;
519 std::string observDir;
520 std::string observFileName;
521 //elec - parameters
522 double Am;
523 double Cm;
524 bool monodomain;
525 double extraTransvTensor;
526 double intraTransvTensor;
527 double extraFiberTensor;
528 double intraFiberTensor;
529 double extraTransvTensorAtria;
530 double intraTransvTensorAtria;
531 double extraFiberTensorAtria;
532 double intraFiberTensorAtria;
533 double extraTransvTensorVent;
534 double intraTransvTensorVent;
535 double extraFiberTensorVent;
536 double intraFiberTensorVent;
537 double sigmaThorax;
538 double sigmaLung;
539 double sigmaBone;
540 //elec - applied current
541 std::string typeOfAppliedCurrent;
542 std::string typeOfAppliedCurrentExt;
543
544 //MEA
545 int NbElectrodes;
546 std::vector<int> ElecStim;
547 std::vector<double> pulseValues;
548 std::vector<double> pulseValuesDuration;
549 std::vector<std::string> pulseType;
550 std::vector<double> timePeriodMEA;
551 std::vector<double> timePeriodMEAtrain;
552 std::vector<double> trainDuration;
553 std::vector<double> tMaxStim;
554 std::vector<double> Ri;
555 std::vector<double> Rel;
556 std::vector<double> Cel;
557 std::vector<double> Diam;
558
559 double timePeriod;
560 double timePeriodVentricle;
561 double timePeriodAtria;
562 int beatNumber;
563 double beatDecreasing;
564 std::vector<double> delayStim;
565 std::vector<double> delayStimVentricles;
566 double stimTime;
567 double stimTimeLV;
568 double stimTimeRV;
569 double Iapp_x_coord;
570 double Iapp_y_coord;
571 double Iapp_z_coord;
572 //elec - pathologies
573 //elec - infarct
574 bool hasInfarct;
575 double x_infarct;
576 double y_infarct;
577 double z_infarct;
578 double radius_infarct;
579 //elec - ventricles BBB
580 bool hasVentriclesBundleBrunchBlock;
581 std::string sideOfBBB;
582 bool BBBwithDelay;
583 bool BBBwithAngleBlock;
584 double BBBDelayStim;
585 double angleIappBBB;
586 //elec - Bachmann Bundle Block
587 bool hasPartialBachmannBundleBlock;
588 double valueBBBlock;
589 //elec - Wenckebach atrioventricular Block
590 bool hasWenckebachBlock;
591 //elec - Kent Bundle
592 bool hasKentBundle;
593 //elec - Torsades de pointe
594 bool torsade;
595 double torsadeTimeBegin;
596 double torsadeTimeEnd;
597 double tauCloseTorsade;
598 double tauCloseEndoTorsade;
599 double tauCloseCellTorsade;
600 double tauCloseEpiTorsade;
601 double tauCloseRVTorsade;
602 //elec - ECGwriter
603 bool writeECG;
604 bool writeElectrodesMeas;
605 bool writeElectrodesMean;
606 bool writeMatrixECG;
607 std::string ECGelectrodeFile;
608 std::string ECGmatchFile;
609 std::string ECGThoraxmatchFile;
610 std::string ECGmatrixFile;
611 std::string ECGfileName;
612 bool ECGtabHeader;
613 bool ECGcreateFigure;
614 //elec - dataAssimilation
615 bool dataAssimilation;
616 double minLSPotTM;
617 double maxLSPotTM;
618 double insidePar;
619 double outsidePar;
620
621 //fsi 1D, possibly other parameters for 2D/3D:
622 std::vector<double> betaNormalized;
623 std::vector<double> sectionAtRest;
624
625 //initial condition
626 bool hasInitialCondition; // has or not initial conditions.
627 bool restartSolution; // use previous solution as initial solution.
628 std::string restartSolutionDirRaw; // directory where the initial solution is backed up.
629 std::string restartSolutionDir; // directory where the initial solution is backed up.
630 int restartSolutionIter; // iteration of the backup solution used by the restart.
631 std::vector <std::string> nameVariableInitCond; // variable associate to the IC (to be saved if doing backup).
632 std::vector<std::string> componentInitCond; // components associate to the IC.
633 std::vector<double> valueInitCond; // value associate to the IC.
634 int frequencyBackup; // frequancy of backup (if == 0 , not doing backup copies).
635
636 // Boundary condition
637 int essentialBoundaryConditionsMethod; // 2:penalization or 0:pseudo-elimination.
638 std::vector<std::string> type; // Dirichlet, Neumann, NeumannNormal, Robin, RobinNormal, EmbedFSI.
639 std::vector<std::string> typeValue; // Constant, Vector, FunctionT, FunctionS, FunctionTS or EnsightFile
640 std::vector<int> numLabel; // number of labels concerned by this boundary condition.
641 std::vector<int> label; // label (number) in the mesh file.
642 std::vector<std::string> labelName; // name in the mesh file.
643 std::vector<std::string> variable; // variable to apply BC.
644 std::vector<std::string> component; // components associate to the BC.
645 std::vector<double> value; // value associate to the BC.
646 std::vector<double> userParameter; // container for all others parameters.
647 std::vector<double> alphaRobin; // coeff before variable of Robin BC: betaRobin * grad u dot n + alphaRobin * u = g.
648 std::vector<double> betaRobin; // coeff before normal derivative of Robin BC: betaRobin * grad u dot n + alphaRobin * u = g.
649 std::vector<double> alphaRobinNormal; // coeff before variable of RobinNormal BC
650 double penValueForEmbedFSI; //penalization value for imposing EmbedFSI bc.
651 std::string bcCondDir; // directory of input boundary values files (ensight files).
652 bool useEssDerivedBoundaryCondition;//true if you want to use essential BC DERIVED, even without having any dirichlet BC, added for embedFSI, to impose 0 displacement at the surface boarders
653 std::string modeLung;
654 //TEST_RECUP_DONNEE
655 std::string bc_potExtraCell;
656
657
658 //BCdata x SimplifiedFSI model and boundary condition.
659 //common properties
660 bool switchSimplFSIOff;
661 double tssParam;
662 bool tssConsistent;
663
664 bool nonLinearKoiterModel;
665 bool zeroDisplacementAtBoarders;
666 double densityStructure;
667 double viscosityStructure;
668 //properties of the shell
669 double youngShell;
670 double poissonShell;
671 double widthShell;
672 //properties of the fibers
673 double widthFiber;
674 double preStressFibers;
675 double youngFibers;
676 std::vector<double> fiberDensity; // Density of fibers by label (coefficient multiplying (preStressFibers+extraTension) and youngFibers). The list is ordered as the labels defining the EmbedFSI type of BC.
677 double fiberDispersionParameter;
678 double outsidePressure;
679 //properties for 2D testing
680 double radius;
681
682 //other
683 int idCase;
684 std::string nameTest;
685 double incomingPressure;
686 double propCardiacCycle;
687
688 //NSHeat
689 double coeffOfThermalExpansion;
690 double thermalDiffusion;
691 double initialTemperature;
692 double referenceTemperature;
693 std::vector<double> gravity;
694 std::vector<felInt> stevinoLabels;
695 double flowRate;
696
697 // data for retinal autoregulation parameters
698 bool autoregulated;
699 double maxT;
700 double q;
701 double up;
702 double down;
703 double nominalPressure;
704 bool useRegulationInWindkessel;
705 std::vector<double> lumpedModelBC_regParam;
706 double windkesselProp;
707 int idControlFreeCase;
708 bool exportPrincipalDirectionsAndCurvature;
709 bool exportDofPartition;
710
711 //IOPcoupling
712 std::vector<int> labelIOPMesh;
713 std::vector<int> labelNSMesh;
714 double porousParam;
715 bool computeSteklov;
716 double relaxationParam;
717 bool exportSteklovData;
718 int optionForSteklov;
719 std::string steklovDataDir;
720 std::string steklovDataDirRaw;
721 std::string steklovMatrixName;
722 int accelerationMethod;
723 double omegaAcceleration;
724 bool lumpedTest;
725 bool notConnectedCylinders;
726
727 bool useRoSteklov;
728 int nbOfLaplacianEigenFunction;
729 double percentageOfExtraEig;
730 int lowRank;
731 bool tryAcceleration;
732 double projOnlineRatio;
733 bool onlyConstResp;
734
735 // export configuration
736 bool exportP1Normal;
737 std::vector<int> labelExportP1Normal;
738 bool exportAll;
739 bool exportLaplacianEigenValues;
740 bool exportLaplacianEigenVectors;
741 bool exportSteklovEigenValues;
742 bool exportSteklovEigenVectors;
743 bool exportFTOfSteklovEigenVectors;
744 bool exportInputOfSteklov;
745 bool exportOutputOfSteklov;
746 bool exportOnlyLastInput;
747 bool exportOnlyLastOutput;
748 bool exportMassMatrix;
749 bool exportLaplacianMatrix;
750 bool exportSteklovMatrix;
751 bool exportReducedEigenMatrix;
752 bool exportOffLineVolumeSolution;
753 bool exportFiltrationVelocity;
754
755
756 std::string bcCondDirRaw; // directory of input boundary values files (ensight files).
757
758
759 //move mesh
760 bool hasMoveMesh;
761 bool hasMoveFibers;
762 std::string MoveMeshMatchFile;
763 double scaleCoeff;
764
765 // bc - lumpedModelBC BC (fluid)
766 std::vector<int> lumpedModelBCType;
767 std::vector<int> lumpedModelBCAlgo;
768 std::vector<int> lumpedModelBCLabel;
769 std::vector<double> lumpedModelBC_Rprox;
770 std::vector<double> lumpedModelBC_Rdist;
771 std::vector<double> lumpedModelBC_C;
772 std::vector<double> lumpedModelBC_Pvenous;
773 std::vector<double> lumpedModelBC_Pdist_init;
774 std::vector<std::string> lumpedModelBCName;
775
776 // linear/non linear compliance (C=C(V))
777 int lumpedModelBC_C_type;
778 int powerNonLinearCompliance;
779 double lumpedModelBC_volumeMax;
780 double lumpedModelBC_volumeMin;
781 // volume at rest
782 double lumpedModelBC_volume0;
783 double lumpedModelBC_referenceVolume0;
784
785 // bc - fluid bc (user parameters)
786 double inflowPressureMaxQuiteInspi;
787 double inflowPressureMaxSpiroInspi;
788 double inflowPressureMaxSpiroExpi;
789 int inflowLabel;
790
791 // bc - to impose the tangential components of the velocity std::vector equal to 0
792 std::vector<int> compTangBClabel;
793
794 //CardiacCycle input condition
795 int CardiacCycleLabel;
796 bool CardiacCycle;
797 double duration_ejection;
798 double duration_isovol_relax;
799 double duration_filling;
800 double duration_isovol_contract;
801
802 double cardiacOutput; // volume of blood ejected per minute (typicaly in liter)
803 double heartRate; // number of heart beat per minute
804
805 //FusionDof
806 bool FusionDof;
807 std::vector<std::string> FusionVariable; //variable whose dofs have to be fusioned
808 std::vector<int> FusionNumLabel; // total number of labels to be fusioned
809 std::vector<int> FusionLabel; // label (number) in the mesh file.
810 double FusionTolerance;
811 std::vector<bool> AllToOne; // All dofs fusioned in a single one
812 bool AllInLabelToOne; // All dofs of a label fusioned in a single one
813
814 //EmbeddedInterface
815 bool EmbeddedInterface;
816 std::vector<std::string> EmbeddedVariable; //variable whose dofs have to be matched
817 std::vector<int> EmbeddedNumInterface; // total number of labels to be matched
818 std::vector<int> EmbeddedLabelPairs; // label (number) in the mesh file.
819 double EmbeddedMatchTolerance;
820
821 //Crack
822 bool hasCrack;
823 std::vector<std::string> CrackVariable; // variable used in crack term
824 std::vector<int> CrackNum; // total number of labels indicating crack
825 std::vector<int> CrackLabelPairs; // label (number) in the mesh file.
826 std::vector<int> CrackElemID; // label (number) in the mesh file.
827 double CrackConstant; // working crack "spring" constant
828 double CrackConstantBefore; // crack "spring" constant before cracking
829 double CrackConstantAfter; // crack "spring" constant after cracking
830 double CrackTolerance; // tolerance between points for crack
831 double CrackStressTolerance; // tolerance for stress before switching to "CrackConstant"
832
833 //Penalization valves
834 bool PenalizationMethod;
835 double Gamma_penalization;
836 std::vector<int> closed_penalization;
837
838 //RISModels
839 bool RISModels;
840 int initiallyOpenedValveIndex; // index of which valve is initially open
841 int crashIfStatusNotAdmissible; // variable to prevent the simulation to stop if a status is not admissible
842 std::vector<int> closed_surf;
843 std::vector<int> open_surf;
844 std::vector<int> fake_surf;
845 int nbTimeSteps_refractory_time; // number of time steps used for defining the refractory time
846 int nbTimeSteps_linear_transition; // number of time steps used for defining the linear evolution in the value of the resistances
847 std::vector<int> nbTimeSteps_linear_transition_twoValves; // number of time steps used for defining the linear evolution in the value of the resistances of the proximal and distal valves
848 double R_active_surf; // resistance of closed valve
849 double R_inactive_surf; // resistance of open valve
850 double R_activeClosed_TwoValves_Intermediate; // resistance of closed valve just after the closing - only used for two valves
851 double R_activeClosed_TwoValves_Final; // final resistance of closed valve after several iterations after the closing - only used for two valves
852 double R_FirstValve_ClosingSpeed; // rate of speed for the evolution of the resistance of the closed surface of the first valve from R_Intermediate to R_Final - only used for two valves
853 double R_SecondValve_ClosingSpeed; // rate of speed for the evolution of the resistance of the closed surface of the second valve from R_Intermediate to R_Final - only used for two valves
854 double flow_ref_oneValve; // flow reference for one valve
855 std::vector<double> flow_ref_twoValves; // flow reference for two valves
856 int preventValvesFromOpeningTooFast; // specify if a closed valve should be prevented from opening if another valve has recently closed
857 int nbIterationsPreventValvesFromOpeningTooFast; // number of iterations during a closed valve cannot open whereas another valve has recently closed
858 int verboseRIS; // verbose for the RIS model
859
860 //Pressure correction for full closed cavity where only displacements are imposed on its boundaries
861 bool useElectroMechanicalPressure; // introducing electromechanical pressure
862 bool usePressureCorrection; // introducing pressure correction
863 bool correctionExternalPressure; // introducing external pressure correction
864 bool correctionALEPressure; // introducing ALE pressure correction
865 int typeOfPressureCorrection; // type of pressure correction. 0 for enabling the pressure correction anytime, 1 only when all the valves are closed.
866 std::vector<int> labelsToCorrectPressure; // vector of labels where the pressure correction is applied
867 std::vector<int> signPressureCorrection; // vector of coefficients (-1 or 1) for the correction of the pressure
868 std::vector<int> labelsToComputeMeanPressure; // vector of labels where the mean pressure is computed and used for the pressure correction
869 std::vector<int> labelsToComputeFluxThrough; // vector of labels where the flux through is computed and used for the ALE pressure correction
870 std::vector<int> exteriorNormalOfLabelsToComputeFluxThrough; // vector of orientation of the exterior normals of the labels where the flux through is computed and used for the ALE pressure correction
871 std::vector<int> forbiddenLabelsForCorrection; // vector of labels where the resistive term called in computeElementArrayBoundaryCondition will not be applied in order to avoid duplications
872 int verbosePressureCorrection; // verbose for the pressure correction
873
874 //Stiffening
875 bool stiffening;
876 std::vector<int> stiffeningLabels;
877 int skipStiffeningFirstIteration;
878 double initStiff;
879 double finalStiff;
880
881 //Regurgitation
882 bool regurgitation;
883 int regurgitationType;
884 std::vector<double> regurgitationPosition;
885 std::vector<int> regurgitationLabels;
886 double regurgitationRadius;
887
888 //ShellModels
889
890 // PETSc
891 int linearSolverVerbose;
892 std::vector<std::string> solver;
893 std::vector<int> gmresRestart;
894 std::vector<std::string> preconditioner;
895 std::vector<std::string> setPreconditionerOption;
896 std::vector<double> relativeTolerance;
897 std::vector<double> absoluteTolerance;
898 std::vector<double> solutionTolerance;
899 std::vector<double> divergenceTolerance;
900 std::vector<int> maxIteration;
901 std::vector<int> maxIterationSNES;
902 std::vector<int> maxFunctionEvaluatedSNES;
903 std::vector<bool> initSolverWithPreviousSolution;
904
905 //verdandi
906 //The background error variance value.
907 double stateErrorVarianceValue;
908 double Kparameter;
909 double RHSparameter;
910
911 //cvgraph
912 std::string compartmentName;
913 std::vector<int> interfaceLabels;
914 std::vector<int> correspondingInterfaceLabels;
915 bool withCVG;
916 std::string dataFileCVG;
917 //interpolator parameters (Still in cvgraph section)
918 double interpolatorThreshold;
919 int maxDepth;
920 int idVarToExchange;
921
922 //ElementField
923 ElementFieldDynamicValueMapType elementFieldDynamicValueMap;
924
925 // Hyperelastic variables
926 struct hyperElasticLawVariables {
927 std::vector<std::string> type; /// Dirichlet, Neumann, NeumannNormal, Robin, RobinNormal, EmbedFSI.
928 std::vector<int> numLabel; /// Number of labels concerned by this boundary condition.
929 std::vector<int> label; /// Label (number) in the mesh file.
930 Private::Hyperelasticity::PressureData::Pointer pressureData; /// The pressure data considered
931 HyperElasticityLawManager::Pointer hyperElasticLaws; /// Pointer to the hyperelastic law manager considered
932 HyperelasticityNS::TimeScheme timeSchemeHyperelasticity; /// The time scheme considered
933 } hyperElasticLaw;
934 };
935
936 /**
937 * @class FelisceParam
938 * @brief Read the felisce data in the data file and on the command line option.
939 */
940 class FelisceParam
941 : public Singleton<UniqueFelisceParam>
942 {
943 friend class Singleton<UniqueFelisceParam>;
944
945 protected:
946 FelisceParam();
947 virtual ~FelisceParam();
948
949 public:
950
951 /*
952 Folling data are read in configuration file and on the command line.
953 They are grouped by configuration file sections.
954 */
955
956 30281 static const int& verbose(const std::size_t instanceIndex = 0) {
957 30281 return FelisceParam::instance(instanceIndex).m_verbose;
958 }
959
960 static const bool& chronoToFile(const std::size_t instanceIndex = 0) {
961 return FelisceParam::instance(instanceIndex).chronoToFile;
962 }
963
964 4 static void linearSolverVerboseOFF(const std::size_t instanceIndex = 0) {
965 4 FelisceParam::instance(instanceIndex).tmpLinSolverVerbose = FelisceParam::instance(instanceIndex).linearSolverVerbose;
966 4 FelisceParam::instance(instanceIndex).linearSolverVerbose = 0;
967 4 }
968
969 4 static void linearSolverVerboseON(const std::size_t instanceIndex = 0) {
970 /// Use it ONLY after the OFF version!
971 4 FelisceParam::instance(instanceIndex).linearSolverVerbose = FelisceParam::instance(instanceIndex).tmpLinSolverVerbose;
972 4 }
973
974 15 static void alterVerbosity(int newValue, const std::size_t instanceIndex = 0) {
975 15 FelisceParam::instance(instanceIndex).m_refVerbose=FelisceParam::instance(instanceIndex).m_verbose;
976 15 FelisceParam::instance(instanceIndex).m_verbose=newValue;
977 15 }
978 static void restoreVerbosity(const std::size_t instanceIndex = 0) {
979 /// Use it ONLY after alterVerbosity
980 FelisceParam::instance(instanceIndex).m_verbose=FelisceParam::instance(instanceIndex).m_refVerbose;
981 }
982 };
983
984 }
985
986 #endif
987