What’s New in the Pulse Physiology Engine 4.4.0
×
CardiovascularModel.h
1/* Distributed under the Apache License, Version 2.0.
2 See accompanying NOTICE file for details.*/
3
4#pragma once
5
6#include "engine/common/system/Model.h"
7#include "engine/common/system/Systems.h"
8#include "cdm/circuit/fluid/SEFluidCircuitCalculator.h"
9#include "cdm/compartment/fluid/SELiquidCompartmentGraph.h"
10
11class SEPatient;
12class SEHemorrhage;
18class SEFluidCircuit;
22
23namespace pulse
24{
25 class PBPhysiology;
26 class EngineTest;
39 class PULSE_DECL CardiovascularModel : public CardiovascularSystem, public Model
40 {
41 friend PBPhysiology;//friend the serialization class
42 friend EngineTest;
43 public:
44 CardiovascularModel(Data& data);
45 virtual ~CardiovascularModel();
46
47 void Clear() override;
48
49 // Set members to a stable homeostatic state
50 void Initialize() override;
51 // Set pointers and other member varialbes common to both homeostatic initialization and loading a state
52 void SetUp() override;
53
54 void SetHeartRhythm(eHeartRhythm Rhythm) override;
55 void SetHeartRhythm(eHeartRhythm Rhythm, bool force);
56
57 void AtSteadyState() override;
58 void PreProcess() override;
59 void Process(bool solve_and_transport=true) override;
60 void PostProcess(bool solve_and_transport=true) override;
61
62 protected:
63 void ComputeExposedModelParameters() override;
64
65 // Initialize
66 void TuneCircuit();
67 void TunePaths(double systemicResistanceScale, double systemicComplianceScale, double aortaResistanceScale, double aortaComplianceScale, double rightHeartResistanceScale, double venaCavaComplianceScale);
68
69 //Condition Methods
70 void ChronicRenalStenosis();
71 void ChronicHeartFailure();
72 void ChronicPericardialEffusion();
73
74 //Condition/Action Methods
75 void ApplyAnemia(double reductionFactor);
76
77 // PreProcess:
78 void HeartDriver();
79 void AdjustVascularTone();
80 /****/void MetabolicToneResponse();
81 /****/void CutaneousVasomotorResponse();
82 void BeginDriverCycle();
83 /****/void RecordAndResetCardiacCycle();//Could be called out of order by arrythma
84 void CalculateHeartElastance();
85 void ProcessActions();
86 //Action methods
87 void CPR();
88 /****/double CalculateDepthForce(double compressionDepth_cm);
89 /****/double ShapeCPRForce(double compressionForce_N);
90 /****/void ApplyCPRForce(double compressionForce_N);
91 void Arrhythmia();
92 void Hemorrhage();
93 void PericardialEffusion();
94 void PericardialEffusionPressureApplication();
95 void TraumaticBrainInjury();
96 void UpdatePulmonaryCapillaries();
97 void CalculateHemothorax();
98 //Respiratory effects
99 void CalculatePleuralCavityVenousEffects();
100
101 // Process:
102 void CalculateVitalSigns();
103
104 // Serializable member variables (Set in Initialize and in schema)
105 //Driver
106 bool m_StartSystole;
107 bool m_HeartFlowDetected;
108 bool m_FullyCompressedHeart;
109 double m_StabilizedHeartRateBaseline_Per_min; // store for moving between arrhytmias
110 double m_StabilizedMeanArterialPressureBaseline_mmHg; // store for moving between arrhytmias
111 double m_StabilizedMeanPulmonaryArterialPressureBaseline_mmHg;
112 double m_CurrentDriverCycleTime_s;
113 double m_DriverCyclePeriod_s;
114 double m_LeftHeartElastanceModifier;// from Heart Failure and such
115 double m_LeftHeartElastance_mmHg_Per_mL;
116 double m_LeftHeartElastanceMax_mmHg_Per_mL;
117 double m_LeftHeartElastanceMin_mmHg_Per_mL;
118 double m_RightHeartElastance_mmHg_Per_mL;
119 double m_RightHeartElastanceMax_mmHg_Per_mL;
120 double m_RightHeartElastanceMin_mmHg_Per_mL;
121 // Arrhythmia
122 eSwitch m_EnableFeedbackAfterArrhythmiaTrasition;
123 bool m_StartCardiacArrest; // Can't go into cardiac arrest during the middle of a cycle
124 bool m_TransitionArrhythmia;
125 double m_CardiacArrestVitalsUpdateTimer_s;
126 // Transition Modifiers
127 SETemporalInterpolator* m_HeartRateBaseline_Per_min;
128 SETemporalInterpolator* m_HeartComplianceModifier;
129 SETemporalInterpolator* m_AortaComplianceModifier;
130 SETemporalInterpolator* m_VenaCavaComplianceModifier;
131 SETemporalInterpolator* m_PulmonaryComplianceModifier;
132 SETemporalInterpolator* m_SystemicVascularResistanceModifier;
133 SETemporalInterpolator* m_SystemicVascularComplianceModifier;
134 //CPR
135 double m_CompressionFrequencyCurrentTime_s;
136 double m_CompressionFrequencyDuration_s;
137 double m_CompressionPeriod_s;
138 double m_CompressionPeriodCurrentTime_s;
139 // Vitals and Averages
140 double m_CardiacCycleDiastolicVolume_mL; // Maximum left heart volume for the current cardiac cycle
141 double m_CardiacCycleAortaPressureLow_mmHg; // The current low for this cycle - Reset at the start of systole
142 double m_CardiacCycleAortaPressureHigh_mmHg; // The current high for this cycle - Reset at the start of systole
143 double m_CardiacCycleLeftHeartPressureLow_mmHg; // The current low for this cycle - Reset at the start of systole
144 double m_CardiacCycleLeftHeartPressureHigh_mmHg; // The current high for this cycle - Reset at the start of systole
145 double m_CardiacCyclePulmonaryArteryPressureLow_mmHg;
146 double m_CardiacCyclePulmonaryArteryPressureHigh_mmHg;
147 double m_CardiacCycleRightHeartPressureLow_mmHg; // The current low for this cycle - Reset at the start of systole
148 double m_CardiacCycleRightHeartPressureHigh_mmHg; // The current high for this cycle - Reset at the start of systole
149 double m_LastCardiacCycleMeanArterialCO2PartialPressure_mmHg;
150 double m_LastCardiacCycleMeanArterialO2PartialPressure_mmHg;
151 double m_CardiacCycleStrokeVolume_mL; // Total volume of the left heart flow for the current cardiac cycle
152 double m_PeripheralVolumeHigh_mL; // Max cycle volume in arms and legs
153 double m_PeripheralVolumeLow_mL; // Min cycle volume in arms and legs
154 //Needed for expanded pulmonary methodology
155 std::vector<double> m_LeftCardiacCyclePerfusionVolumes_mL;
156 std::vector<double> m_RightCardiacCyclePerfusionVolumes_mL;
157
158 SERunningAverage* m_CardiacCycleArterialPressure_mmHg;
159 SERunningAverage* m_CardiacCycleArterialCO2PartialPressure_mmHg;
160 SERunningAverage* m_CardiacCycleArterialO2PartialPressure_mmHg;
161 SERunningAverage* m_CardiacCyclePulmonaryCapillariesWedgePressure_mmHg;
162 SERunningAverage* m_CardiacCyclePulmonaryCapillariesFlow_mL_Per_s;
163 SERunningAverage* m_CardiacCyclePulmonaryShuntFlow_mL_Per_s;
164 SERunningAverage* m_CardiacCyclePulmonaryArteryPressure_mmHg;
165 SERunningAverage* m_CardiacCycleCentralVenousPressure_mmHg;
166 SERunningAverage* m_CardiacCycleSkinFlow_mL_Per_s;
167
168
169 // Stateless member variable (Set in SetUp())
170 SECardiovascularMechanicsModifiers* m_MechanicsModifiers;
171 // Hemorrhage
172 struct HemorrhageTrack
173 {
174 SELiquidCompartment* Compartment=nullptr;
175 std::map<SELiquidCompartment* , std::vector<SELiquidCompartmentLink*>> CmptHemorrhageLinks;
176 };
177 std::map<SEHemorrhage*, HemorrhageTrack*> m_HemorrhageTrack;
178 SEFluidCircuitPath* m_InternalHemorrhageToAorta;
179
180 double m_MAPCollapse_mmHg;
181 double m_MinIndividialSystemicResistance_mmHg_s_Per_mL;
182
183 SEFluidCircuitCalculator* m_CircuitCalculator;
184 SELiquidTransporter* m_Transporter;
185
186 SEFluidCircuit* m_CirculatoryCircuit;
187 SELiquidCompartmentGraph* m_CirculatoryGraph;
188
189 SEFluidCircuitNode* m_GroundNode;
190 SEFluidCircuitNode* m_AbdominalCavityNode;
191
192 SEFluidCircuitPath* m_AortaToBrain;
193 SEFluidCircuitPath* m_AortaToMyocardium;
194 SEFluidCircuitPath* m_AortaCompliancePath;
195 SEFluidCircuitPath* m_AortaResistancePath;
196 SEFluidCircuitNode* m_LeftPulmonaryVeinsNode;
197 SEFluidCircuitNode* m_RightPulmonaryVeinsNode;
198
199 SEFluidCircuitPath* m_VenaCavaCompliancePath;
200 SEFluidCircuitPath* m_VenaCavaResistancePath;
201
202 SEFluidCircuitPath* m_BrainToVenaCava;
203 SEFluidCircuitPath* m_MyocardiumToVenaCava;
204
205 SEFluidCircuitPath* m_LeftPulmonaryVeinsLeak;
206 SEFluidCircuitPath* m_RightPulmonaryVeinsLeak;
207
208 SEFluidCircuitPath* m_GndToPericardium;
209 SEFluidCircuitPath* m_PericardiumToGnd;
210
211 SEFluidCircuitPath* m_RightHeartToGnd;
212 SEFluidCircuitPath* m_RightHeartCompliancePath;
213 SEFluidCircuitPath* m_RightHeartResistancePath;
214
215 SEFluidCircuitPath* m_LeftHeartToGnd;
216 SEFluidCircuitPath* m_LeftHeartToAorta;
217 SEFluidCircuitPath* m_LeftHeartCompliancePath;
218
219 SEFluidCircuitPath* m_RightPulmonaryVenousReturnResistancePath;
220 SEFluidCircuitPath* m_LeftPulmonaryVenousReturnResistancePath;
221
222 SEFluidCircuitPath* m_BrainResistanceUpstreamPath;
223 SEFluidCircuitPath* m_BrainResistanceDownstreamPath;
224
225 SEFluidCircuitPath* m_GndToAbdominalCavity;
226 SEFluidCircuitPath* m_AbdominalCavityToGnd;
227
228 SEFluidCircuitPath* m_LeftRenalArteryPath;
229 SEFluidCircuitPath* m_RightRenalArteryPath;
230
231 SELiquidCompartment* m_Abdomen;
232 SELiquidCompartment* m_AbdominalCavity;
233 SELiquidCompartment* m_Aorta;
234 SELiquidSubstanceQuantity* m_AortaCO2;
235 SELiquidSubstanceQuantity* m_AortaO2;
236 SELiquidCompartment* m_Brain;
237 SELiquidCompartment* m_Ground;
238 SELiquidCompartment* m_LeftArm;
239 SELiquidCompartment* m_LeftHeart;
240 SELiquidCompartment* m_LeftLeg;
241 SELiquidCompartment* m_LeftPulmonaryCapillaries;
242 SELiquidCompartment* m_LeftPulmonaryArteries;
243 SELiquidCompartment* m_LeftPulmonaryVeins;
244 SELiquidCompartment* m_Pericardium;
245 SELiquidCompartment* m_RightArm;
246 SELiquidCompartment* m_RightHeart;
247 SELiquidCompartment* m_RightLeg;
248 SELiquidCompartment* m_RightPulmonaryCapillaries;
249 SELiquidCompartment* m_RightPulmonaryArteries;
250 SELiquidCompartment* m_RightPulmonaryVeins;
251 SELiquidCompartment* m_VenaCava;
252
253 SEGasCompartment* m_LeftPleuralCavity;
254 SEGasCompartment* m_RightPleuralCavity;
255 SEGasCompartment* m_PleuralCavity;
256 SEGasCompartment* m_Ambient;
257
258 std::vector<SEFluidCircuitPath*> m_HeartCompliancePaths;
259 std::vector<SEFluidCircuitPath*> m_AortaCompliancePaths;
260 std::vector<SEFluidCircuitPath*> m_AortaResistancePaths;
261 std::vector<SEFluidCircuitPath*> m_VenaCavaCompliancePaths;
262 std::vector<SEFluidCircuitPath*> m_VenaCavaResistancePaths;
263 std::vector<SEFluidCircuitPath*> m_PulmonaryCompliancePaths;
264 std::vector<SEFluidCircuitPath*> m_PulmonaryResistancePaths;
265 std::vector<SEFluidCircuitPath*> m_SystemicCompliancePaths;
266 std::vector<SEFluidCircuitPath*> m_SystemicResistancePaths;
267 std::vector<SEFluidCircuitPath*> m_MuscleResistancePaths;
268 std::vector<SEFluidCircuitPath*> m_SkinPaths;
269
270 //Needed for expanded pulmonary methodology
271 std::vector<SEFluidCircuitPath*> m_LeftPulmonaryArteriesToVeins;
272 std::vector<SEFluidCircuitPath*> m_LeftPulmonaryArteriesToCapillaries;
273 std::vector<SEFluidCircuitPath*> m_RightPulmonaryArteriesToVeins;
274 std::vector<SEFluidCircuitPath*> m_RightPulmonaryArteriesToCapillaries;
275 };
276END_NAMESPACE
Definition: PBPhysiology.h:25
Definition: SECardiovascularMechanicsModifiers.h:9
Definition: SECircuitCalculator.h:24
Definition: SEFluidCircuit.h:12
Definition: SEFluidCircuitNode.h:10
Definition: SEFluidCircuitPath.h:9
Definition: SEGasCompartment.h:14
Definition: SEHemorrhage.h:35
Definition: SELiquidCompartmentGraph.h:16
Definition: SELiquidCompartment.h:11
Definition: SELiquidSubstanceQuantity.h:12
Definition: SEPatient.h:13
Definition: SERunningAverage.h:8
Definition: SESubstanceTransport.h:86
Definition: SETemporalInterpolator.h:8
Definition: Logger.h:14

Distributed under the Apache License, Version 2.0.

See accompanying NOTICE file for details.