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;/*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_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  // 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_AirwayNode;
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_AirwayToPharynx;
221  SEFluidCircuitPath* m_PharynxToEnvironment;
222  SEFluidCircuitPath* m_PharynxToCarina;
223  SEFluidCircuitPath* m_AirwayToStomach;
224  // Compartments
225  SEGasCompartment* m_Environment;
226  SEGasCompartment* m_Carina;
227  SEGasSubstanceQuantity* m_CarinaO2;
228  SEGasCompartment* m_Lungs;
229  SEGasCompartment* m_LeftLung;
230  SEGasCompartment* m_RightLung;
231  SEGasCompartment* m_PleuralCavity;
232  SEGasCompartment* m_LeftPleuralCavity;
233  SEGasCompartment* m_RightPleuralCavity;
234  SEGasCompartment* m_AnatomicDeadSpace;
235  SEGasCompartment* m_AlveolarDeadSpace;
236  SEGasCompartment* m_RightAlveolarDeadSpace;
237  SEGasCompartment* m_LeftAlveolarDeadSpace;
238  SEGasCompartment* m_Alveoli;
239  SEGasCompartment* m_LeftAlveoli;
240  SEGasCompartment* m_RightAlveoli;
241  SEGasSubstanceQuantity* m_LeftAlveoliO2;
242  SEGasSubstanceQuantity* m_RightAlveoliO2;
243  // Mechanical Ventilation
244  SEGasCompartment* m_MechanicalVentilationConnection;
245  SEFluidCircuitNode* m_MechanicalVentilationDeadSpace;
246  SELiquidCompartment* m_MechanicalVentilationAerosolConnection;
247  SEFluidCircuitPath* m_ConnectionToDeadSpace;
248  SEFluidCircuitPath* m_GroundToConnection;
249  // Cardiovascular
250  SELiquidSubstanceQuantity* m_AortaO2;
251  SELiquidSubstanceQuantity* m_AortaCO2;
252  // Substance
253  SESubstance* m_Oversedation;
254 
256  // Lung Configuration Specific Variables //
258 
259  // These are the lung components we will iterate on for actions
260  struct LungComponent
261  {
262  eSide Side;
263  SEFluidCircuitNode* AlveoliNode;
264  SEFluidCircuitNode* DeadSpaceNode;
265  SEFluidCircuitPath* ResistancePath;
266  SEFluidCircuitPath* CompliancePath;
267  SEFluidCircuitPath* ShuntPath;
268  SEFluidCircuitPath* ArteriesPath;
269  SEFluidCircuitPath* VeinsPath;
270  SEGasCompartment* AlveoliCompartment;
271  SELiquidCompartment* CapillaryCompartment;
272  SELiquidCompartmentLink* ShuntLink;
273  SELiquidCompartmentLink* ArteriesLink;
274  SELiquidCompartmentLink* VeinsLink;
275  };
276  std::map<eLungCompartment, LungComponent> m_LungComponents;
277  // Paths
278  SEFluidCircuitPath* m_CarinaToRightLung;
279  SEFluidCircuitPath* m_CarinaToLeftLung;
280 
282  // Currently only for default lung configuration //
284 
285  // Aerosol
286  SELiquidCompartment* m_AerosolAirway;
287  SELiquidCompartment* m_AerosolCarina;
288  SELiquidCompartment* m_AerosolLeftAnatomicDeadSpace;
289  SELiquidCompartment* m_AerosolLeftAlveolarDeadSpace;
290  SELiquidCompartment* m_AerosolLeftAlveoli;
291  SELiquidCompartment* m_AerosolRightAnatomicDeadSpace;
292  SELiquidCompartment* m_AerosolRightAlveolarDeadSpace;
293  SELiquidCompartment* m_AerosolRightAlveoli;
294  std::vector<SELiquidCompartment*> m_AerosolEffects;
295  SELiquidCompartment* m_LeftLungExtravascular;
296  SELiquidCompartment* m_RightLungExtravascular;
297 
298  SEFluidCircuitPath* m_CarinaToLeftAnatomicDeadSpace;
299  SEFluidCircuitPath* m_CarinaToRightAnatomicDeadSpace;
300  SEFluidCircuitPath* m_LeftAnatomicDeadSpaceToLeftAlveolarDeadSpace;
301  SEFluidCircuitPath* m_RightAnatomicDeadSpaceToRightAlveolarDeadSpace;
302  SEFluidCircuitPath* m_LeftAlveolarDeadSpaceToLeftAlveoli;
303  SEFluidCircuitPath* m_RightAlveolarDeadSpaceToRightAlveoli;
304 
305  SEFluidCircuitPath* m_EnvironmentToLeftChestLeak;
306  SEFluidCircuitPath* m_EnvironmentToRightChestLeak;
307  SEFluidCircuitPath* m_LeftAlveoliLeakToLeftPleural;
308  SEFluidCircuitPath* m_RightAlveoliLeakToRightPleural;
309  SEFluidCircuitPath* m_LeftNeedleToLeftPleural;
310  SEFluidCircuitPath* m_RightNeedleToRightPleural;
311 
312  SEFluidCircuitPath* m_LeftCardiovascularLeak;
313  SEFluidCircuitPath* m_RightCardiovascularLeak;
314  SEFluidCircuitPath* m_LeftRespirtoryLeak;
315  SEFluidCircuitPath* m_RightRespirtoryLeak;
316 
317  SEFluidCircuitPath* m_LeftAlveoliToLeftPleuralConnection;
318  SEFluidCircuitPath* m_RightAlveoliToRightPleuralConnection;
319  };
320 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:51
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.