Cardiovascular.h
1 /**************************************************************************************
2 Copyright 2015 Applied Research Associates, Inc.
3 Licensed under the Apache License, Version 2.0 (the "License"); you may not use
4 this file except in compliance with the License. You may obtain a copy of the License
5 at:
6 http://www.apache.org/licenses/LICENSE-2.0
7 Unless required by applicable law or agreed to in writing, software distributed under
8 the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
9 CONDITIONS OF ANY KIND, either express or implied. See the License for the
10 specific language governing permissions and limitations under the License.
11 **************************************************************************************/
12 
13 #pragma once
14 #include <biogears/cdm/CommonDataModel.h>
15 #include <biogears/exports.h>
16 
17 #include <biogears/cdm/circuit/fluid/SEFluidCircuitCalculator.h>
18 #include <biogears/cdm/scenario/SEPatientActionCollection.h>
19 #include <biogears/cdm/substance/SESubstanceTransport.h>
20 #include <biogears/cdm/system/physiology/SECardiovascularSystem.h>
21 #include <biogears/cdm/utils/RunningAverage.h>
22 #include <biogears/engine/Controller/BioGearsSystem.h>
23 #include <biogears/schema/biogears/BioGearsPhysiology.hxx>
24 
25 namespace biogears {
26 class SELiquidCompartmentGraph;
27 class SEFluidCircuitCalculator;
28 class SEPatient;
29 class SEFluidCircuit;
30 class SELiquidCompartmentGraph;
31 class SEFluidCircuitNode;
32 class SEFluidCircuitPath;
33 class BioGears;
46 class BIOGEARS_API Cardiovascular : public SECardiovascularSystem, public BioGearsSystem {
47  friend class BioGears;
48  friend class BioGearsEngineTest;
49 
50 protected:
51  static auto make_unique(BioGears& bg) -> std::unique_ptr<Cardiovascular>;
54 
55 public:
56  virtual ~Cardiovascular() override;
57 
58  static size_t TypeHash() { return reinterpret_cast<size_t>(&TypeHash); }
59  static constexpr char const * const TypeTag() { return "Cardiovascular"; }
60  const char* classname() const override { return TypeTag(); }
61  size_t hash_code() const override { return TypeHash(); }
62 
63  void Clear() override;
64 
65  // Set members to a stable homeostatic state
66  void Initialize() override;
67 
68  // Load a state
69  virtual bool Load(const CDM::BioGearsCardiovascularSystemData& in);
70  virtual CDM::BioGearsCardiovascularSystemData* Unload() const override;
71 
72  //Assessments
73  SEScalar& CalculateCardiovascularSOFA();
74 
75 protected:
76  virtual void Unload(CDM::BioGearsCardiovascularSystemData& data) const;
77 
78  // Set pointers and other member variables common to both homeostatic initialization and loading a state
79  void SetUp() override;
80 
81 public:
82  void AtSteadyState() override;
83  void PreProcess() override;
84  void Process() override;
85  void PostProcess() override;
86 
87 private:
88  //Condition Methods
89  void ChronicRenalStenosis();
90  void ChronicAnemia();
91  void ChronicHeartFailure();
92  void ChronicPericardialEffusion();
93 
94  // PreProcess:
95  void HeartDriver();
96  void AdjustVascularTone();
97  void BeginCardiacCycle();
98  void CalculateHeartElastance();
99 
100  // IF STABILIZING
101  void TuneCircuit();
102  void TunePaths(double systemicResistanceScale, double systemicComplianceScale, double aortaResistanceScale, double aortaComplianceScale, double rightHeartResistanceScale, double venaCavaComplianceScale);
103  // ELSE
104  void MetabolicToneResponse();
105  void ProcessActions();
106  //Action methods
107  void CPR();
108  /****/ void CalculateAndSetCPRcompressionForce();
109  void Hemorrhage();
110  void PericardialEffusion();
111  void PericardialEffusionPressureApplication();
112  void CardiacArrest();
113  void TraumaticBrainInjury();
114 
115  // Process:
116  void CalculateVitalSigns();
117  void CalculateHeartRate();
118  void RecordAndResetCardiacCycle();
119 
120 protected:
121  // Override
122  void ProcessOverride();
123  void OverrideControlLoop();
124 
125 private:
126  // Serializable member variables (Set in Initialize and in schema)
127  //Driver
130  bool m_EnterCardiacArrest; // Can't go into cardiac arrest during the middle of a cycle
132  double m_CurrentCardiacCycleDuration_s; // How long have we been in this heart beat
133  double m_LeftHeartElastanceModifier; // from Heart Failure and such
140  //CPR
144  // Vitals and Averages
146  double m_CardiacCycleDiastolicVolume_mL; // Maximum left heart volume for the current cardiac cycle
147  double m_CardiacCycleAortaPressureLow_mmHg; // The current low for this cycle - Reset at the start of systole
148  double m_CardiacCycleAortaPressureHigh_mmHg; // The current high for this cycle - Reset at the start of systole
152  double m_CardiacCycleStrokeVolume_mL; // Total volume of the left heart flow for the current cardiac cycle
161 
162  // Stateless member variable (Set in SetUp())
163  double m_dT_s;
164  bool m_TuneCircuit = true;
165  std::string m_TuningFile;
166 
174  bool m_OverrideOnOffCheck = false;
175 
178 
180 
183 
186 
191 
196 
212 
221 
224 
227 
241 
242  std::vector<SEFluidCircuitPath*> m_systemicResistancePaths;
243  std::vector<SEFluidCircuitPath*> m_systemicCompliancePaths;
244  std::vector<SEFluidCircuitPath*> m_tissueResistancePaths;
245  std::vector<SEFluidCircuitPath*> m_cerebralResistancePaths;
246  std::vector<SEFluidCircuitPath*> m_splanchnicResistancePaths;
247  std::vector<SEFluidCircuitPath*> m_extrasplanchnicResistancePaths;
248  std::vector<SEFluidCircuitPath*> m_myocardiumResistancePaths;
249  std::vector<SEFluidCircuitPath*> m_muscleResistancePaths;
250 
252 };
253 }
bool m_EnterCardiacArrest
Definition: Cardiovascular.h:130
double m_OverrideHR_Conformant_Per_min
Definition: Cardiovascular.h:168
SELiquidCompartment * m_RightPulmonaryCapillaries
Definition: Cardiovascular.h:237
SEPatient * m_patient
Definition: Cardiovascular.h:179
static size_t TypeHash()
Definition: Cardiovascular.h:58
SEFluidCircuitPath * m_pVenaCavaHemorrhage
Definition: Cardiovascular.h:213
Definition: SEScalar.h:33
SEFluidCircuitPath * m_pBrainToVenaCava
Definition: Cardiovascular.h:199
SEFluidCircuitPath * m_pAortaToLeftKidney
Definition: Cardiovascular.h:201
double m_RightHeartElastanceMax_mmHg_Per_mL
Definition: Cardiovascular.h:138
SEFluidCircuitPath * m_pAortaToRightKidney
Definition: Cardiovascular.h:207
SEFluidCircuitPath * m_LeftPulmonaryArteriesToVeins
Definition: Cardiovascular.h:192
double m_dT_s
Definition: Cardiovascular.h:163
SEPatientActionCollection * m_PatientActions
Definition: Cardiovascular.h:251
double m_LeftHeartElastanceMin_mmHg_Per_mL
Definition: Cardiovascular.h:136
SEFluidCircuitPath * m_pAortaToSmallIntestine
Definition: Cardiovascular.h:209
SEFluidCircuitPath * m_pAortaToBrain
Definition: Cardiovascular.h:198
Definition: SELiquidCompartmentGraph.h:24
std::vector< SEFluidCircuitPath * > m_myocardiumResistancePaths
Definition: Cardiovascular.h:248
SEFluidCircuitPath * m_leftRenalArteryPath
Definition: Cardiovascular.h:225
double m_CardiacCycleAortaPressureLow_mmHg
Definition: Cardiovascular.h:147
double m_CardiacCycleStrokeVolume_mL
Definition: Cardiovascular.h:152
std::string m_TuningFile
Definition: Cardiovascular.h:165
SEFluidCircuitPath * m_VenaCavaCompliance
Definition: Cardiovascular.h:189
SEFluidCircuitPath * m_pAortaToSpleen
Definition: Cardiovascular.h:211
std::vector< SEFluidCircuitPath * > m_tissueResistancePaths
Definition: Cardiovascular.h:244
std::vector< SEFluidCircuitPath * > m_systemicResistancePaths
Definition: Cardiovascular.h:242
SEFluidCircuitPath * m_pGndToPericardium
Definition: Cardiovascular.h:214
double m_OverrideRHEMin_Conformant_mmHg
Definition: Cardiovascular.h:170
Definition: SEFluidCircuitCalculator.h:25
Definition: SELiquidSubstanceQuantity.h:28
Definition: SEFluidCircuitPath.h:25
SEFluidCircuitPath * m_LeftHeartToAorta
Definition: Cardiovascular.h:220
RunningAverage m_CardiacCyclePulmonaryCapillariesFlow_mL_Per_s
Definition: Cardiovascular.h:156
double m_CardiacCyclePulmonaryArteryPressureHigh_mmHg
Definition: Cardiovascular.h:150
double m_CardiacCycleDiastolicVolume_mL
Definition: Cardiovascular.h:146
SEFluidCircuitPath * m_pAortaToSkin
Definition: Cardiovascular.h:208
SELiquidCompartment * m_LeftPulmonaryVeins
Definition: Cardiovascular.h:234
SEFluidCircuitPath * m_RightPulmonaryArteriesToVeins
Definition: Cardiovascular.h:194
Definition: SEPatient.h:48
double m_LastCardiacCycleMeanArterialCO2PartialPressure_mmHg
Definition: Cardiovascular.h:151
SELiquidCompartment * m_RightHeart
Definition: Cardiovascular.h:236
SELiquidCompartment * m_VenaCava
Definition: Cardiovascular.h:240
SELiquidCompartment * m_RightPulmonaryArteries
Definition: Cardiovascular.h:238
std::vector< SEFluidCircuitPath * > m_extrasplanchnicResistancePaths
Definition: Cardiovascular.h:247
SEFluidCircuitPath * m_pAortaToBone
Definition: Cardiovascular.h:197
SEFluidCircuitPath * m_RightHeartResistance
Definition: Cardiovascular.h:190
SEFluidCircuitPath * m_pAortaToSplanchnic
Definition: Cardiovascular.h:210
Definition: RunningAverage.h:19
SELiquidTransporter m_transporter
Definition: Cardiovascular.h:177
SELiquidCompartment * m_LeftPulmonaryCapillaries
Definition: Cardiovascular.h:232
SEFluidCircuitNode * m_MainPulmonaryArteries
Definition: Cardiovascular.h:184
std::vector< SEFluidCircuitPath * > m_muscleResistancePaths
Definition: Cardiovascular.h:249
std::vector< SEFluidCircuitPath * > m_systemicCompliancePaths
Definition: Cardiovascular.h:243
double m_CompressionRatio
Definition: Cardiovascular.h:142
SEFluidCircuitPath * m_pAortaToLargeIntestine
Definition: Cardiovascular.h:202
SEFluidCircuitPath * m_pRightHeart
Definition: Cardiovascular.h:217
Definition: SEFluidCircuitNode.h:21
Definition: SELiquidCompartment.h:27
SEFluidCircuitPath * m_rightRenalArteryPath
Definition: Cardiovascular.h:226
SEFluidCircuitPath * m_pMyocardiumToVenaCava
Definition: Cardiovascular.h:206
SELiquidCompartment * m_LeftPulmonaryArteries
Definition: Cardiovascular.h:233
SELiquidCompartment * m_LeftHeart
Definition: Cardiovascular.h:231
RunningAverage m_CardiacCycleArterialPressure_mmHg
Definition: Cardiovascular.h:153
bool m_HeartFlowDetected
Definition: Cardiovascular.h:129
RunningAverage m_CardiacCycleCentralVenousPressure_mmHg
Definition: Cardiovascular.h:159
double m_OverrideRHEMax_Conformant_mmHg
Definition: Cardiovascular.h:172
Definition: SEFluidCircuit.h:20
std::vector< SEFluidCircuitPath * > m_splanchnicResistancePaths
Definition: Cardiovascular.h:246
Class corresponding to the BioGearsCardiovascularSystemData schema type.
Definition: BioGearsPhysiology.hxx:1375
RunningAverage m_CardiacCycleSkinFlow_mL_Per_s
Definition: Cardiovascular.h:160
double m_overrideTime_s
Definition: Cardiovascular.h:173
Definition: SECardiovascularSystem.h:35
BioGears & m_data
Definition: Cardiovascular.h:53
double m_OverrideLHEMax_Conformant_mmHg
Definition: Cardiovascular.h:171
Definition: BioGearsEngineTest.h:24
SEFluidCircuitPath * m_pMuscleToVenaCava
Definition: Cardiovascular.h:204
double m_CompressionPeriod_s
Definition: Cardiovascular.h:143
SEFluidCircuitPath * m_RightPulmonaryArteriesToCapillaries
Definition: Cardiovascular.h:195
double m_RightHeartElastanceMin_mmHg_Per_mL
Definition: Cardiovascular.h:139
SEFluidCircuitNode * m_LeftAtrium1
Definition: Cardiovascular.h:185
std::vector< SEFluidCircuitPath * > m_cerebralResistancePaths
Definition: Cardiovascular.h:245
size_t hash_code() const override
Definition: Cardiovascular.h:61
SEFluidCircuitCalculator m_circuitCalculator
Definition: Cardiovascular.h:176
SELiquidSubstanceQuantity * m_AortaCO2
Definition: Cardiovascular.h:229
SEFluidCircuitPath * m_pLeftHeart
Definition: Cardiovascular.h:219
double m_CurrentCardiacCycleDuration_s
Definition: Cardiovascular.h:132
SELiquidCompartment * m_RightPulmonaryVeins
Definition: Cardiovascular.h:239
bool m_StartSystole
Definition: Cardiovascular.h:128
SELiquidCompartment * m_Brain
Definition: Cardiovascular.h:230
RunningAverage m_CardiacCyclePulmonaryShuntFlow_mL_Per_s
Definition: Cardiovascular.h:157
SEFluidCircuitPath * m_AortaCompliance
Definition: Cardiovascular.h:187
SEFluidCircuitPath * m_pAortaToMyocardium
Definition: Cardiovascular.h:205
The Cardiovascular system utilizes circuit methodology to characterize the intravascular fluid dynami...
Definition: Cardiovascular.h:46
SEFluidCircuitPath * m_pBrainResistanceUpstream
Definition: Cardiovascular.h:222
double m_CurrentCardiacCycleTime_s
Definition: Cardiovascular.h:145
SEFluidCircuitPath * m_pBrainResistanceDownstream
Definition: Cardiovascular.h:223
double m_OverrideLHEMin_Conformant_mmHg
Definition: Cardiovascular.h:169
SELiquidCompartment * m_Pericardium
Definition: Cardiovascular.h:235
Manages and controls execution of all data/systems in BioGears.
Definition: BioGears.h:86
RunningAverage m_CardiacCycleArterialCO2PartialPressure_mmHg
Definition: Cardiovascular.h:154
double m_RightHeartElastance_mmHg_Per_mL
Definition: Cardiovascular.h:137
RunningAverage m_CardiacCyclePulmonaryCapillariesWedgePressure_mmHg
Definition: Cardiovascular.h:155
static constexpr char const *const TypeTag()
Definition: Cardiovascular.h:59
double m_minIndividialSystemicResistance__mmHg_s_Per_mL
Definition: Cardiovascular.h:167
double m_CardiacCyclePulmonaryArteryPressureLow_mmHg
Definition: Cardiovascular.h:149
Generic class for handling the BioGears stabilization methodology.
Definition: BioGearsSystem.h:23
SEFluidCircuitPath * m_pLeftHeartToGnd
Definition: Cardiovascular.h:218
double m_LeftHeartElastance_mmHg_Per_mL
Definition: Cardiovascular.h:134
double m_CardiacCyclePeriod_s
Definition: Cardiovascular.h:131
Definition: SEElectricalCircuit.h:18
SEFluidCircuitPath * m_pAortaToLiver
Definition: Cardiovascular.h:200
SEFluidCircuitPath * m_LeftPulmonaryArteriesToCapillaries
Definition: Cardiovascular.h:193
SEFluidCircuitPath * m_AortaResistance
Definition: Cardiovascular.h:188
SEFluidCircuitPath * m_pRightHeartToGnd
Definition: Cardiovascular.h:216
double m_CompressionTime_s
Definition: Cardiovascular.h:141
SELiquidCompartmentGraph * m_CirculatoryGraph
Definition: Cardiovascular.h:182
double m_LeftHeartElastanceMax_mmHg_Per_mL
Definition: Cardiovascular.h:135
RunningAverage m_CardiacCyclePulmonaryArteryPressure_mmHg
Definition: Cardiovascular.h:158
SEFluidCircuit * m_CirculatoryCircuit
Definition: Cardiovascular.h:181
double m_CardiacCycleAortaPressureHigh_mmHg
Definition: Cardiovascular.h:148
double m_LeftHeartElastanceModifier
Definition: Cardiovascular.h:133
Definition: SEPatientActionCollection.h:54
const char * classname() const override
Definition: Cardiovascular.h:60
SEFluidCircuitPath * m_pAortaToMuscle
Definition: Cardiovascular.h:203
SELiquidCompartment * m_Aorta
Definition: Cardiovascular.h:228
SEFluidCircuitPath * m_pPericardiumToGnd
Definition: Cardiovascular.h:215