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  void UpdateInspiratoryExpiratoryRatio();
75  void UpdateDiffusion();
76  void UpdatePulmonaryCapillary();
77  void UpdatePulmonaryShunt();
78  SESegment* GetSegement(const std::vector<SESegment*>& segments, double volume_L);
79  //Overrides
80  void SetRespiratoryResistance();
81  void SetRespiratoryCompliance();
82 
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);
94  void UpdateDriverPressure();
95  /****/void CalculateMechanoreceptors();
96  void UpdateDriverPeriod();
97  double UpdateTargetVentilation(double targetAlveolarVentilation_L_Per_min);
98  // Aerosol Deposition and various Effects
99  void ProcessAerosolSubstances();
100 
101  //Process
102  void CalculateVitalSigns();
103  void Debugging();
104 
105  // Serializable member variables (Set in Initialize and in schema)
106 
107  // CalculateVitalSigns()
108  bool m_BreathingCycle;
109  bool m_NotBreathing;
110  double m_TopBreathTotalVolume_L;
111  double m_TopCarinaO2;
112  double m_TopBreathElapsedTime_min;
113  double m_BottomBreathElapsedTime_min;
114  double m_BottomBreathTotalVolume_L;
115  double m_BottomBreathAlveoliPressure_cmH2O;
116  double m_BottomBreathAirwayPressure_cmH2O;
117  double m_PeakAlveolarPressure_cmH2O;
118  double m_MaximalAlveolarPressure_cmH2O;
119  double m_LastCardiacCycleBloodPH;
120  SERunningAverage* m_BloodPHRunningAverage;
121  SERunningAverage* m_MeanAirwayPressure_cmH2O;
122  // Compliances
123  double m_PreviousLeftLungPressureDiff_cmH2O;
124  double m_PreviousRightLungPressureDiff_cmH2O;
125  double m_PreviousLeftLungVolume_L;
126  double m_PreviousRightLungVolume_L;
127  double m_PreviousLeftPleuralPressureDiff_cmH2O;
128  double m_PreviousRightPleuralPressureDiff_cmH2O;
129  double m_PreviousLeftPleuralVolume_L;
130  double m_PreviousRightPleuralVolume_L;
131 
132  // Expanded pulmonary methodology
133  std::vector<double> m_AlveoliVolumeIncrement_L;
134  std::vector<double> m_TopBreathAcinarZoneVolumes_L;
135  std::vector<double> m_BottomBreathAcinarZoneVolumes_L;
136  std::vector<double> m_PreviousShuntScalingFactor;
137 
138  // Respiratory Driver
139  double m_ArterialO2PartialPressure_mmHg;
140  double m_ArterialCO2PartialPressure_mmHg;
141  double m_BreathingCycleTime_s;
142  double m_DriverPressure_cmH2O;
143  double m_ElapsedBreathingCycleTime_min;
144  double m_IERatioScaleFactor;
145  double m_PeakInspiratoryPressure_cmH2O;
146  double m_PeakExpiratoryPressure_cmH2O;
147  double m_PreviousTargetAlveolarVentilation_L_Per_min;
148  double m_VentilationFrequency_Per_min;
149  double m_VentilationPeriod_s;
150  double m_VentilationToTidalVolumeSlope;
151  SERunningAverage* m_ArterialO2RunningAverage_mmHg;
152  SERunningAverage* m_ArterialCO2RunningAverage_mmHg;
153  SERunningAverage* m_MixedExpiredCO2RunningAverage_mmHg;
154 
155  // Muscle Pressure Waveform
156  double m_ExpiratoryHoldFraction;
157  double m_ExpiratoryReleaseFraction;
158  double m_ExpiratoryRiseFraction;
159  double m_InspiratoryHoldFraction;
160  double m_InspiratoryReleaseFraction;
161  double m_InspiratoryRiseFraction;
162  double m_InspiratoryToExpiratoryPauseFraction;
163  double m_ResidueFraction;
164  double m_PreviousDyspneaSeverity;
165  double m_MechanoreceptorsDyspneaFactor;
166  double m_AppliedMechanoreceptorsDyspneaFactor;
167 
168  // Positive Pressure Ventilation
169  bool m_PositivePressureVentilation;
170 
171  // Conscious Respiration
172  bool m_ActiveConsciousRespirationCommand;
173 
174  // Disease States
175  double m_LeftAlveoliDecrease_L;
176  double m_RightAlveoliDecrease_L;
177 
178  // Overrides
179  double m_RespiratoryResistanceOverride_cmH2O_s_Per_L;
180  double m_RespiratoryComplianceOverride_L_Per_cmH2O;
181 
182  // Stateless member variable (Set in SetUp())
183  SERespiratoryMechanicsModifiers* m_MechanicsModifiers;
184  // Respiratory Driver
185  double m_MaxDriverPressure_cmH2O;
186  // Configuration parameters
187  double m_CentralControlGainConstant;
188  double m_DefaultOpenResistance_cmH2O_s_Per_L;
189  double m_DefaultClosedResistance_cmH2O_s_Per_L;
190  double m_PeripheralControlGainConstant;
191  double m_RespOpenResistance_cmH2O_s_Per_L;
192  double m_RespClosedResistance_cmH2O_s_Per_L;
193  double m_VentilationTidalVolumeIntercept;
194  double m_VentilatoryOcclusionPressure_cmH2O;
195  double m_MinimumAllowableTidalVolume_L;
196  double m_MinimumAllowableInpiratoryAndExpiratoryPeriod_s;
197  // State between functions (i.e. shared between methods in preprocess, set to a default value at the start of preprocess)
198  double m_AverageLocalTissueBronchodilationEffects;
199 
200  // Patient
201  SEPatientActionCollection* m_PatientActions;
202 
203  // Compartments
204  SEGasCompartment* m_Environment;
205  SEGasCompartment* m_Lungs;
206  SEGasCompartment* m_LeftAlveoli;
207  SEGasCompartment* m_RightAlveoli;
208  SEGasCompartment* m_PleuralCavity;
209  SEGasCompartment* m_LeftPleuralCavity;
210  SEGasCompartment* m_RightPleuralCavity;
211  SEGasCompartment* m_Carina;
212  SEGasCompartment* m_LeftLung;
213  SEGasCompartment* m_RightLung;
214  SEGasCompartment* m_AnatomicDeadSpace;
215  SEGasCompartment* m_AlveolarDeadSpace;
216  SEGasCompartment* m_RightAlveolarDeadSpace;
217  SEGasCompartment* m_LeftAlveolarDeadSpace;
218  SEGasCompartment* m_Alveoli;
219  SEGasSubstanceQuantity* m_CarinaO2;
220  SEGasSubstanceQuantity* m_LeftAlveoliO2;
221  SEGasSubstanceQuantity* m_RightAlveoliO2;
222  // Mechanical Ventilation
223  SEGasCompartment* m_MechanicalVentilationConnection;
224  SELiquidCompartment* m_MechanicalVentilationAerosolConnection;
225  // Aerosol
226  SELiquidCompartment* m_AerosolAirway;
227  SELiquidCompartment* m_AerosolCarina;
228  SELiquidCompartment* m_AerosolLeftAnatomicDeadSpace;
229  SELiquidCompartment* m_AerosolLeftAlveolarDeadSpace;
230  SELiquidCompartment* m_AerosolLeftAlveoli;
231  SELiquidCompartment* m_AerosolRightAnatomicDeadSpace;
232  SELiquidCompartment* m_AerosolRightAlveolarDeadSpace;
233  SELiquidCompartment* m_AerosolRightAlveoli;
234  std::vector<SELiquidCompartment*> m_AerosolEffects;
235  SELiquidCompartment* m_LeftLungExtravascular;
236  SELiquidCompartment* m_RightLungExtravascular;
237  // Cardiovascular
238  SELiquidCompartment* m_LeftPulmonaryCapillaries;
239  SELiquidCompartment* m_RightPulmonaryCapillaries;
240  SELiquidSubstanceQuantity* m_AortaO2;
241  SELiquidSubstanceQuantity* m_AortaCO2;
242 
243  // Circuits
244  SEFluidCircuit* m_RespiratoryCircuit;
245 
246  // These are the components we will iterate on for actions
247  struct LungComponent
248  {
249  eSide Side;
250  SEFluidCircuitNode* AlveoliNode;
251  SEFluidCircuitNode* DeadSpaceNode;
252  SEFluidCircuitPath* ResistancePath;
253  SEFluidCircuitPath* CompliancePath;
254  SELiquidCompartmentLink* ShuntLink;
255  SELiquidCompartmentLink* ArteriesLink;
256  SELiquidCompartmentLink* VeinsLink;
257  SEFluidCircuitPath* ShuntPath;
258  SEFluidCircuitPath* ArteriesPath;
259  SEFluidCircuitPath* VeinsPath;
260  SEGasCompartment* AlveoliCompartment;
261  SELiquidCompartment* CapillaryCompartment;
262  };
263  std::map<eLungCompartment, LungComponent> m_LungComponents;
264  // Nodes
265  SEFluidCircuitNode* m_AirwayNode;
266  SEFluidCircuitNode* m_LeftPleuralNode;
267  SEFluidCircuitNode* m_RespiratoryMuscleNode;
268  SEFluidCircuitNode* m_RightPleuralNode;
269  SEFluidCircuitNode* m_AmbientNode;
270  SEFluidCircuitNode* m_StomachNode;
271  // Paths
272  SEFluidCircuitPath* m_CarinaToLeftAnatomicDeadSpace; // base only
273  SEFluidCircuitPath* m_CarinaToRightAnatomicDeadSpace; // base only
274  SEFluidCircuitPath* m_LeftAnatomicDeadSpaceToLeftAlveolarDeadSpace; // base only
275  SEFluidCircuitPath* m_RightAnatomicDeadSpaceToRightAlveolarDeadSpace; // base only
276  SEFluidCircuitPath* m_LeftAlveolarDeadSpaceToLeftAlveoli; // base only
277  SEFluidCircuitPath* m_RightAlveolarDeadSpaceToRightAlveoli; // base only
278 
279  SEFluidCircuitPath* m_LeftPleuralToRespiratoryMuscle;
280  SEFluidCircuitPath* m_RightPleuralToRespiratoryMuscle;
281  SEFluidCircuitPath* m_DriverPressurePath;
282  SEFluidCircuitPath* m_AirwayToPharynx;
283  SEFluidCircuitPath* m_PharynxToEnvironment;
284  SEFluidCircuitPath* m_PharynxToCarina;
285  SEFluidCircuitPath* m_AirwayToStomach;
286  SEFluidCircuitPath* m_EnvironmentToLeftChestLeak;
287  SEFluidCircuitPath* m_EnvironmentToRightChestLeak;
288  SEFluidCircuitPath* m_LeftAlveoliLeakToLeftPleural;
289  SEFluidCircuitPath* m_RightAlveoliLeakToRightPleural;
290  SEFluidCircuitPath* m_LeftNeedleToLeftPleural;
291  SEFluidCircuitPath* m_RightNeedleToRightPleural;
292  SEFluidCircuitPath* m_LeftPulmonaryCapillary;
293  SEFluidCircuitPath* m_RightPulmonaryCapillary;
294  SEFluidCircuitPath* m_ConnectionToAirway;
295  SEFluidCircuitPath* m_GroundToConnection;
296 
297  SEFluidCircuitPath* m_LeftCardiovascularLeak;
298  SEFluidCircuitPath* m_RightCardiovascularLeak;
299  SEFluidCircuitPath* m_LeftRespirtoryLeak;
300  SEFluidCircuitPath* m_RightRespirtoryLeak;
301 
302  SEFluidCircuitPath* m_LeftAlveoliToLeftPleuralConnection;
303  SEFluidCircuitPath* m_RightAlveoliToRightPleuralConnection;
304 
305  SEFluidCircuitCalculator* m_Calculator;
306  SEGasTransporter* m_GasTransporter;
307  SELiquidTransporter* m_AerosolTransporter;
308 
309  // Substance
310  SESubstance* m_Oversedation;
311  };
312 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.