What’s New in the Pulse Physiology Engine 4.4.0
×
RespiratoryModel.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/SEGasCompartmentGraph.h"
10#include "cdm/compartment/fluid/SELiquidCompartmentGraph.h"
11
12class SEPatient;
18class SEFluidCircuit;
23
24namespace pulse
25{
26 class PBPhysiology;
27 class EngineTest;
39 class PULSE_DECL RespiratoryModel : public RespiratorySystem, public Model
40 {
41 friend PBPhysiology;//friend the serialization class
42 friend EngineTest;
43 public:
44 RespiratoryModel(Data& data);
45 virtual ~RespiratoryModel();
46
47 virtual void Clear() override;
48
49 // Set members to a stable homeostatic state
50 virtual void Initialize() override;
51 // Set pointers and other member varialbes common to both homeostatic initialization and loading a state
52 virtual void SetUp() override;
53
54 virtual void AtSteadyState() override;
55 virtual void PreProcess() override;
56 virtual void Process(bool solve_and_transport=true) override;
57 virtual void PostProcess(bool solve_and_transport=true) override;
58
59 protected:
60 void ComputeExposedModelParameters() override;/*TODO ExpandedLungs*/
61 eLungCompartment GetLungCompartment(const std::string& cmpt);
62 std::string GetCompartmentName(eLungCompartment m);
63
64 //Tuning
65 void TuneCircuit();
66
67 //PreProcess
68 void CalculateWork();
69 void CalculateFatigue();
70 void UpdateChestWallCompliances();/*TODO ExpandedLungs*/
71 SESegment* GetSegement(const std::vector<SESegment*>& segments, double volume_L);
72 void UpdateAlveolarCompliances();
73 void UpdateVolumes();
74 void UpdateResistances();/*TODO ExpandedLungs*/
75 double CalculateSuctioningPattern(double baseResistance_cmH2O_s_Per_L, double flow_L_Per_s);
76 void UpdateInspiratoryExpiratoryRatio();
77 void UpdateDiffusion();
78 // If Cardiovascular
79 void UpdatePulmonaryCapillary();
80 void UpdatePulmonaryShunt();
81 // Aerosol Deposition and various Effects
82 void ProcessAerosolSubstances();
83 //Actions
84 void Pneumothorax();
85 void Hemothorax();
86 void MechanicalVentilation();
87 void SupplementalOxygen();
88 // Driver
89 void CalculateDriver();
90 void ApplyDriver();
91 void SetBreathCycleFractions();
92 void ConsciousRespiration();
93 double VolumeToDriverPressure(double TargetVolume);/*TODO ExpandedLungs*/
94 void UpdateDriverPressure();
95 /****/void CalculateMechanoreceptors();
96 void UpdateDriverPeriod();
97 double UpdateTargetVentilation(double targetAlveolarVentilation_L_Per_min);
98 //Overrides
99 void SetRespiratoryResistance();
100 void SetRespiratoryCompliance();
101
102 //Process
103 void CalculateVitalSigns();
104 void Debugging();
105
106 // Serializable member variables (Set in Initialize and in schema)
107
108 // CalculateVitalSigns()
109 bool m_BreathingCycle;
110 bool m_NotBreathing;
111 double m_TopBreathTotalVolume_L;
112 double m_TopCarinaO2;
113 double m_TopBreathElapsedTime_min;
114 double m_BottomBreathElapsedTime_min;
115 double m_BottomBreathTotalVolume_L;
116 double m_BottomBreathAlveoliPressure_cmH2O;
117 double m_BottomBreathAirwayPressure_cmH2O;
118 double m_PeakAlveolarPressure_cmH2O;
119 double m_MaximalAlveolarPressure_cmH2O;
120 double m_LastCardiacCycleBloodPH;
121 SERunningAverage* m_BloodPHRunningAverage;
122 SERunningAverage* m_MeanAirwayPressure_cmH2O;
123 // Compliances
124 double m_PreviousLeftLungPressureDiff_cmH2O;
125 double m_PreviousRightLungPressureDiff_cmH2O;
126 double m_PreviousLeftLungVolume_L;
127 double m_PreviousRightLungVolume_L;
128 double m_PreviousLeftPleuralPressureDiff_cmH2O;
129 double m_PreviousRightPleuralPressureDiff_cmH2O;
130 double m_PreviousLeftPleuralVolume_L;
131 double m_PreviousRightPleuralVolume_L;
132
133 // Expanded pulmonary methodology
134 std::vector<double> m_AlveoliVolumeIncrement_L;
135 std::vector<double> m_TopBreathAcinarZoneVolumes_L;
136 std::vector<double> m_BottomBreathAcinarZoneVolumes_L;
137 std::vector<double> m_PreviousShuntScalingFactor;
138
139 // Respiratory Driver
140 double m_ArterialO2PartialPressure_mmHg;
141 double m_ArterialCO2PartialPressure_mmHg;
142 double m_BreathingCycleTime_s;
143 double m_DriverPressure_cmH2O;
144 double m_ElapsedBreathingCycleTime_min;
145 double m_IERatioScaleFactor;
146 double m_PeakInspiratoryPressure_cmH2O;
147 double m_PeakExpiratoryPressure_cmH2O;
148 double m_PreviousTargetAlveolarVentilation_L_Per_min;
149 double m_VentilationFrequency_Per_min;
150 double m_VentilationPeriod_s;
151 double m_VentilationToTidalVolumeSlope;
152 SERunningAverage* m_ArterialO2RunningAverage_mmHg;
153 SERunningAverage* m_ArterialCO2RunningAverage_mmHg;
154 SERunningAverage* m_MixedExpiredCO2RunningAverage_mmHg;
155
156 // Muscle Pressure Waveform
157 double m_ExpiratoryHoldFraction;
158 double m_ExpiratoryReleaseFraction;
159 double m_ExpiratoryRiseFraction;
160 double m_InspiratoryHoldFraction;
161 double m_InspiratoryReleaseFraction;
162 double m_InspiratoryRiseFraction;
163 double m_InspiratoryToExpiratoryPauseFraction;
164 double m_ResidueFraction;
165 double m_PreviousDyspneaSeverity;
166 double m_MechanoreceptorsDyspneaFactor;
167 double m_AppliedMechanoreceptorsDyspneaFactor;
168
169 // Positive Pressure Ventilation
170 bool m_PositivePressureVentilation;
171
172 // Conscious Respiration
173 bool m_ActiveConsciousRespirationCommand;
174
175 // Disease States
176 double m_LeftAlveoliDecrease_L;
177 double m_RightAlveoliDecrease_L;
178
179 // Overrides
180 double m_RespiratoryResistanceOverride_cmH2O_s_Per_L;
181 double m_RespiratoryComplianceOverride_L_Per_cmH2O;
182
183 // Stateless member variable (Set in SetUp())
184 SERespiratoryMechanicsModifiers* m_MechanicsModifiers;
185 // Respiratory Driver
186 double m_MaxDriverPressure_cmH2O;
187 // Configuration parameters
188 double m_CentralControlGainConstant;
189 double m_DefaultOpenResistance_cmH2O_s_Per_L;
190 double m_DefaultClosedResistance_cmH2O_s_Per_L;
191 double m_PeripheralControlGainConstant;
192 double m_RespOpenResistance_cmH2O_s_Per_L;
193 double m_RespClosedResistance_cmH2O_s_Per_L;
194 double m_VentilationTidalVolumeIntercept;
195 double m_VentilatoryOcclusionPressure_cmH2O;
196 double m_MinimumAllowableTidalVolume_L;
197 double m_MinimumAllowableInspiratoryAndExpiratoryPeriod_s;
198 // State between functions (i.e. shared between methods in preprocess, set to a default value at the start of preprocess)
199 double m_AverageLocalTissueBronchodilationEffects;
200
201 // Patient
202 SEPatientActionCollection* m_PatientActions;
203
204 // Variables independent of how the lungs are modelled
205 SEFluidCircuit* m_RespiratoryCircuit;
206 SEFluidCircuitCalculator* m_Calculator;
207 SEGasTransporter* m_GasTransporter;
208 SELiquidTransporter* m_AerosolTransporter;
209 // Nodes
210 SEFluidCircuitNode* m_PharynxNode;
211 SEFluidCircuitNode* m_RespiratoryMuscleNode;
212 SEFluidCircuitNode* m_LeftPleuralNode;
213 SEFluidCircuitNode* m_RightPleuralNode;
214 SEFluidCircuitNode* m_AmbientNode;
215 SEFluidCircuitNode* m_StomachNode;
216 // Paths
217 SEFluidCircuitPath* m_LeftPleuralToRespiratoryMuscle;
218 SEFluidCircuitPath* m_RightPleuralToRespiratoryMuscle;
219 SEFluidCircuitPath* m_DriverPressurePath;
220 SEFluidCircuitPath* m_NasalCavityToPharynx;
221 SEFluidCircuitPath* m_MouthToPharynx;
222 SEFluidCircuitPath* m_PharynxToEnvironment;
223 SEFluidCircuitPath* m_LarynxToTrachea;
224 SEFluidCircuitPath* m_MouthToStomach;
225 // Compartments
226 SEGasCompartment* m_Environment;
227 SEGasCompartment* m_Trachea;
228 SEGasSubstanceQuantity* m_TracheaO2;
229 SEGasCompartment* m_Lungs;
230 SEGasCompartment* m_LeftLung;
231 SEGasCompartment* m_RightLung;
232 SEGasCompartment* m_PleuralCavity;
233 SEGasCompartment* m_LeftPleuralCavity;
234 SEGasCompartment* m_RightPleuralCavity;
235 SEGasCompartment* m_AnatomicDeadSpace;
236 SEGasCompartment* m_AlveolarDeadSpace;
237 SEGasCompartment* m_RightAlveolarDeadSpace;
238 SEGasCompartment* m_LeftAlveolarDeadSpace;
239 SEGasCompartment* m_Alveoli;
240 SEGasCompartment* m_LeftAlveoli;
241 SEGasCompartment* m_RightAlveoli;
242 SEGasSubstanceQuantity* m_LeftAlveoliO2;
243 SEGasSubstanceQuantity* m_RightAlveoliO2;
244 // Mechanical Ventilation
245 SEGasCompartment* m_MechanicalVentilationConnection;
246 SEFluidCircuitNode* m_MechanicalVentilationDeadSpace;
247 SELiquidCompartment* m_MechanicalVentilationAerosolConnection;
248 SEFluidCircuitPath* m_ConnectionToDeadSpace;
249 SEFluidCircuitPath* m_GroundToConnection;
250 // Cardiovascular
251 SELiquidSubstanceQuantity* m_AortaO2;
252 SELiquidSubstanceQuantity* m_AortaCO2;
253 // Substance
254 SESubstance* m_Oversedation;
255
257 // Lung Configuration Specific Variables //
259
260 // These are the lung components we will iterate on for actions
261 struct LungComponent
262 {
263 eSide Side;
264 SEFluidCircuitNode* AlveoliNode;
265 SEFluidCircuitNode* DeadSpaceNode;
266 SEFluidCircuitPath* ResistancePath;
267 SEFluidCircuitPath* CompliancePath;
268 SEFluidCircuitPath* ShuntPath;
269 SEFluidCircuitPath* ArteriesPath;
270 SEFluidCircuitPath* VeinsPath;
271 SEGasCompartment* AlveoliCompartment;
272 SELiquidCompartment* CapillaryCompartment;
273 SELiquidCompartmentLink* ShuntLink;
274 SELiquidCompartmentLink* ArteriesLink;
275 SELiquidCompartmentLink* VeinsLink;
276 SELiquidCompartment* AerosolDeadSpace;
277 SELiquidCompartment* AerosolAlveoli;
278 };
279 std::map<eLungCompartment, LungComponent> m_LungComponents;
280 // Paths
281 SEFluidCircuitPath* m_TracheaToRightLung;
282 SEFluidCircuitPath* m_TracheaToLeftLung;
283
285 // Currently only for default lung configuration //
287
288 // Aerosol
289 SELiquidCompartment* m_AerosolMouth;
290 SELiquidCompartment* m_AerosolTrachea;
291 SELiquidCompartment* m_AerosolNasalCavity;
292 SELiquidCompartment* m_AerosolPharynx;
293 SELiquidCompartment* m_AerosolLarynx;
294 std::vector<SELiquidCompartment*> m_AerosolUpperAirwayInlets;
295 SELiquidCompartment* m_AerosolLeftConductingAirways;
296 SELiquidCompartment* m_AerosolLeftAlveolarDeadSpace;
297 SELiquidCompartment* m_AerosolLeftAlveoli;
298 SELiquidCompartment* m_AerosolRightConductingAirways;
299 SELiquidCompartment* m_AerosolRightAlveolarDeadSpace;
300 SELiquidCompartment* m_AerosolRightAlveoli;
301 std::vector<SELiquidCompartment*> m_AerosolEffects;
302 SELiquidCompartment* m_LeftLungExtravascular;
303 SELiquidCompartment* m_RightLungExtravascular;
304
305 SEFluidCircuitPath* m_TracheaToLeftConductingAirways;
306 SEFluidCircuitPath* m_TracheaToRightConductingAirways;
307 SEFluidCircuitPath* m_LeftConductingAirwaysToLeftAlveolarDeadSpace;
308 SEFluidCircuitPath* m_RightConductingAirwaysToRightAlveolarDeadSpace;
309 SEFluidCircuitPath* m_LeftAlveolarDeadSpaceToLeftAlveoli;
310 SEFluidCircuitPath* m_RightAlveolarDeadSpaceToRightAlveoli;
311
312 SEFluidCircuitPath* m_EnvironmentToLeftChestLeak;
313 SEFluidCircuitPath* m_EnvironmentToRightChestLeak;
314 SEFluidCircuitPath* m_LeftAlveoliLeakToLeftPleural;
315 SEFluidCircuitPath* m_RightAlveoliLeakToRightPleural;
316 SEFluidCircuitPath* m_LeftNeedleToLeftPleural;
317 SEFluidCircuitPath* m_RightNeedleToRightPleural;
318
319 SEFluidCircuitPath* m_LeftCardiovascularLeak;
320 SEFluidCircuitPath* m_RightCardiovascularLeak;
321 SEFluidCircuitPath* m_LeftRespirtoryLeak;
322 SEFluidCircuitPath* m_RightRespirtoryLeak;
323
324 SEFluidCircuitPath* m_LeftAlveoliToLeftPleuralConnection;
325 SEFluidCircuitPath* m_RightAlveoliToRightPleuralConnection;
326 };
327END_NAMESPACE
Definition: PBPhysiology.h:25
Definition: SECircuitCalculator.h:24
Definition: SEConsciousRespirationCommand.h:8
Definition: SEFluidCircuit.h:12
Definition: SEFluidCircuitNode.h:10
Definition: SEFluidCircuitPath.h:9
Definition: SEGasCompartment.h:14
Definition: SEGasSubstanceQuantity.h:10
Definition: SELiquidCompartment.h:11
Definition: SELiquidSubstanceQuantity.h:12
Definition: SEPatientActionCollection.h:54
Definition: SEPatient.h:13
Definition: SERespiratoryMechanicsModifiers.h:9
Definition: SERunningAverage.h:8
Definition: SESegment.h:7
Definition: SESubstance.h:16
Definition: SESubstanceTransport.h:86
Definition: Logger.h:14

Distributed under the Apache License, Version 2.0.

See accompanying NOTICE file for details.