Building Medical Digital Twins with Pulse: Open Source Simulation Tools for Developers and Researchers
×
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 
12 class SEPatient;
14 class SEGasCompartment;
18 class SEFluidCircuit;
19 class SEFluidCircuitNode;
20 class SEFluidCircuitPath;
23 
24 namespace 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;
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();
71  void UpdateVolumes();
72  void UpdateResistances();
73  void UpdateAlveolarCompliances();
74  double CalculateSuctioningPattern(double baseResistance_cmH2O_s_Per_L, double flow_L_Per_s);
75  void UpdateInspiratoryExpiratoryRatio();
76  void UpdateDiffusion();
77  void UpdatePulmonaryCapillary();
78  void UpdatePulmonaryShunt();
79  SESegment* GetSegement(const std::vector<SESegment*>& segments, double volume_L);
80  //Overrides
81  void SetRespiratoryResistance();
82  void SetRespiratoryCompliance();
83 
84  //Actions
85  void Pneumothorax();
86  void Hemothorax();
87  void MechanicalVentilation();
88  void SupplementalOxygen();
89  // Driver
90  void CalculateDriver();
91  void ApplyDriver();
92  void SetBreathCycleFractions();
93  void ConsciousRespiration();
94  double VolumeToDriverPressure(double TargetVolume);
95  void UpdateDriverPressure();
96  /****/void CalculateMechanoreceptors();
97  void UpdateDriverPeriod();
98  double UpdateTargetVentilation(double targetAlveolarVentilation_L_Per_min);
99  // Aerosol Deposition and various Effects
100  void ProcessAerosolSubstances();
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_MinimumAllowableInpiratoryAndExpiratoryPeriod_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  // Compartments
205  SEGasCompartment* m_Environment;
206  SEGasCompartment* m_Lungs;
207  SEGasCompartment* m_LeftAlveoli;
208  SEGasCompartment* m_RightAlveoli;
209  SEGasCompartment* m_PleuralCavity;
210  SEGasCompartment* m_LeftPleuralCavity;
211  SEGasCompartment* m_RightPleuralCavity;
212  SEGasCompartment* m_Carina;
213  SEGasCompartment* m_LeftLung;
214  SEGasCompartment* m_RightLung;
215  SEGasCompartment* m_AnatomicDeadSpace;
216  SEGasCompartment* m_AlveolarDeadSpace;
217  SEGasCompartment* m_RightAlveolarDeadSpace;
218  SEGasCompartment* m_LeftAlveolarDeadSpace;
219  SEGasCompartment* m_Alveoli;
220  SEGasSubstanceQuantity* m_CarinaO2;
221  SEGasSubstanceQuantity* m_LeftAlveoliO2;
222  SEGasSubstanceQuantity* m_RightAlveoliO2;
223  // Mechanical Ventilation
224  SEGasCompartment* m_MechanicalVentilationConnection;
225  SELiquidCompartment* m_MechanicalVentilationAerosolConnection;
226  // Aerosol
227  SELiquidCompartment* m_AerosolAirway;
228  SELiquidCompartment* m_AerosolCarina;
229  SELiquidCompartment* m_AerosolLeftAnatomicDeadSpace;
230  SELiquidCompartment* m_AerosolLeftAlveolarDeadSpace;
231  SELiquidCompartment* m_AerosolLeftAlveoli;
232  SELiquidCompartment* m_AerosolRightAnatomicDeadSpace;
233  SELiquidCompartment* m_AerosolRightAlveolarDeadSpace;
234  SELiquidCompartment* m_AerosolRightAlveoli;
235  std::vector<SELiquidCompartment*> m_AerosolEffects;
236  SELiquidCompartment* m_LeftLungExtravascular;
237  SELiquidCompartment* m_RightLungExtravascular;
238  // Cardiovascular
239  SELiquidCompartment* m_LeftPulmonaryCapillaries;
240  SELiquidCompartment* m_RightPulmonaryCapillaries;
241  SELiquidSubstanceQuantity* m_AortaO2;
242  SELiquidSubstanceQuantity* m_AortaCO2;
243 
244  // Circuits
245  SEFluidCircuit* m_RespiratoryCircuit;
246 
247  // These are the components we will iterate on for actions
248  struct LungComponent
249  {
250  eSide Side;
251  SEFluidCircuitNode* AlveoliNode;
252  SEFluidCircuitNode* DeadSpaceNode;
253  SEFluidCircuitPath* ResistancePath;
254  SEFluidCircuitPath* CompliancePath;
255  SELiquidCompartmentLink* ShuntLink;
256  SELiquidCompartmentLink* ArteriesLink;
257  SELiquidCompartmentLink* VeinsLink;
258  SEFluidCircuitPath* ShuntPath;
259  SEFluidCircuitPath* ArteriesPath;
260  SEFluidCircuitPath* VeinsPath;
261  SEGasCompartment* AlveoliCompartment;
262  SELiquidCompartment* CapillaryCompartment;
263  };
264  std::map<eLungCompartment, LungComponent> m_LungComponents;
265  // Nodes
266  SEFluidCircuitNode* m_AirwayNode;
267  SEFluidCircuitNode* m_LeftPleuralNode;
268  SEFluidCircuitNode* m_RespiratoryMuscleNode;
269  SEFluidCircuitNode* m_RightPleuralNode;
270  SEFluidCircuitNode* m_AmbientNode;
271  SEFluidCircuitNode* m_StomachNode;
272  // Paths
273  SEFluidCircuitPath* m_CarinaToLeftAnatomicDeadSpace; // base only
274  SEFluidCircuitPath* m_CarinaToRightAnatomicDeadSpace; // base only
275  SEFluidCircuitPath* m_LeftAnatomicDeadSpaceToLeftAlveolarDeadSpace; // base only
276  SEFluidCircuitPath* m_RightAnatomicDeadSpaceToRightAlveolarDeadSpace; // base only
277  SEFluidCircuitPath* m_LeftAlveolarDeadSpaceToLeftAlveoli; // base only
278  SEFluidCircuitPath* m_RightAlveolarDeadSpaceToRightAlveoli; // base only
279 
280  SEFluidCircuitPath* m_LeftPleuralToRespiratoryMuscle;
281  SEFluidCircuitPath* m_RightPleuralToRespiratoryMuscle;
282  SEFluidCircuitPath* m_DriverPressurePath;
283  SEFluidCircuitPath* m_AirwayToPharynx;
284  SEFluidCircuitPath* m_PharynxToEnvironment;
285  SEFluidCircuitPath* m_PharynxToCarina;
286  SEFluidCircuitPath* m_AirwayToStomach;
287  SEFluidCircuitPath* m_EnvironmentToLeftChestLeak;
288  SEFluidCircuitPath* m_EnvironmentToRightChestLeak;
289  SEFluidCircuitPath* m_LeftAlveoliLeakToLeftPleural;
290  SEFluidCircuitPath* m_RightAlveoliLeakToRightPleural;
291  SEFluidCircuitPath* m_LeftNeedleToLeftPleural;
292  SEFluidCircuitPath* m_RightNeedleToRightPleural;
293  SEFluidCircuitPath* m_LeftPulmonaryCapillary;
294  SEFluidCircuitPath* m_RightPulmonaryCapillary;
295  SEFluidCircuitPath* m_ConnectionToAirway;
296  SEFluidCircuitPath* m_GroundToConnection;
297 
298  SEFluidCircuitPath* m_LeftCardiovascularLeak;
299  SEFluidCircuitPath* m_RightCardiovascularLeak;
300  SEFluidCircuitPath* m_LeftRespirtoryLeak;
301  SEFluidCircuitPath* m_RightRespirtoryLeak;
302 
303  SEFluidCircuitPath* m_LeftAlveoliToLeftPleuralConnection;
304  SEFluidCircuitPath* m_RightAlveoliToRightPleuralConnection;
305 
306  SEFluidCircuitCalculator* m_Calculator;
307  SEGasTransporter* m_GasTransporter;
308  SELiquidTransporter* m_AerosolTransporter;
309 
310  // Substance
311  SESubstance* m_Oversedation;
312  };
313 END_NAMESPACE
Definition: PBPhysiology.h:24
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:50
Definition: SEPatient.h:13
Definition: SERespiratoryMechanicsModifiers.h:9
Definition: SERunningAverage.h:8
Definition: SESegment.h:7
Definition: SESubstance.h:15
Definition: SESubstanceTransport.h:86
Definition: Logger.h:14

Distributed under the Apache License, Version 2.0.

See accompanying NOTICE file for details.