diff --git a/data/config/DebugRun.config b/data/config/DebugRun.config index a8dc373ab57a224afa6d603e408c240287f4ef71..0125847b47c17bd4033fc18d66966b0d6007c79f 100644 --- a/data/config/DebugRun.config +++ b/data/config/DebugRun.config @@ -31,9 +31,4 @@ Macro EngineUnitTest=EngineUnitTestDriver FastPlot Baseline=unit_tests/pulse/ Co Macro EngineUnitTestFull=EngineUnitTestDriver FullPlot Baseline=unit_tests/pulse/ Computed=./test_results/unit_tests/pulse Macro ScenarioTest=ScenarioTestDriver FastPlot Baseline=scenarios/ Computed=./test_results/scenarios -#patient/BasicStandard.json = ScenarioTest - -patient/HemorrhageSeverity1.json = ScenarioTest -patient/HemorrhageSeverityMultipleCompartments.json = ScenarioTest -patient/HemorrhageSeverityToFlowToSeverity.json = ScenarioTest -patient/HemorrhageVaryingSeverity.json = ScenarioTest +patient/BasicStandard.json = ScenarioTest diff --git a/docs/Doxygen/bootstrap/css/customdoxygen.css b/docs/Doxygen/bootstrap/css/customdoxygen.css index ba6e315d7a0db6ac69a8a7640a60083d8eacb388..7fd3ac3ed5e19eef349263bd5cad1f9cff88f20f 100644 --- a/docs/Doxygen/bootstrap/css/customdoxygen.css +++ b/docs/Doxygen/bootstrap/css/customdoxygen.css @@ -188,16 +188,20 @@ a.qindexHL { border: 1px double #869DCA; } +.contents a:visited { + color: #ffffff; +} + .contents a.qindexHL:visited { color: #ffffff; } a.code, a.code:visited, a.line, a.line:visited { - color: #4665A2; + color: #ffffff; } a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { - color: #4665A2; + color: #ffffff; } /* @end */ diff --git a/docs/Doxygen/customdoxygen.css b/docs/Doxygen/customdoxygen.css index 725ee7e17e7e8eb5dcafdeacd1f71070019f19dd..7ce3c0828d2510131e95fbc946760657c4d6b4e8 100644 --- a/docs/Doxygen/customdoxygen.css +++ b/docs/Doxygen/customdoxygen.css @@ -206,16 +206,20 @@ a.qindexHL { border: 1px double #869DCA; } +.contents a:visited { + color: #ffffff; +} + .contents a.qindexHL:visited { color: #ffffff; } a.code, a.code:visited, a.line, a.line:visited { - color: #4665A2; + color: #ffffff; } a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { - color: #4665A2; + color: #ffffff; } /* @end */ diff --git a/src/cpp/cdm/circuit/SECircuitCalculator.cpp b/src/cpp/cdm/circuit/SECircuitCalculator.cpp index b280ec7d9b25c7e8f2d5705e43b1fd5830028c0a..ab29741603cf8a74b1542110e4f25fcefe7c2a6e 100644 --- a/src/cpp/cdm/circuit/SECircuitCalculator.cpp +++ b/src/cpp/cdm/circuit/SECircuitCalculator.cpp @@ -254,7 +254,6 @@ void SECircuitCalculator::ParseIn() //The b matrix will have all of the right side values (known values) from the KCL equation //Variables used in the loop double dStartingCompliance = 0.0; - double dStartingInertance = 0.0; for (NodeType* n : m_circuit->GetNodes()) { //Sum of the flows at each node is 0 diff --git a/src/cpp/cdm/circuit/SECircuitPath.cpp b/src/cpp/cdm/circuit/SECircuitPath.cpp index 5f9e53bf8c5da6ef60bdf3281bfe666b8a0b927c..70f12d7fee24a5755271ae9db6d4534b12cc8c64 100644 --- a/src/cpp/cdm/circuit/SECircuitPath.cpp +++ b/src/cpp/cdm/circuit/SECircuitPath.cpp @@ -101,17 +101,17 @@ SECircuitNode& SECircuitPath::GetTargetN template bool SECircuitPath::HasValidElements() const { - int numRCI = (HasResistance() ? 1 : 0) + + unsigned short numRCI = (HasResistance() ? 1 : 0) + (HasCapacitance() ? 1 : 0) + (HasInductance() ? 1 : 0); - int numNextRCI = (HasNextResistance() ? 1 : 0) + + unsigned short numNextRCI = (HasNextResistance() ? 1 : 0) + (HasNextCapacitance() ? 1 : 0) + (HasNextInductance() ? 1 : 0); - int numSrcState = (HasSwitch() ? 1 : 0) + + unsigned short numSrcState = (HasSwitch() ? 1 : 0) + (HasValve() ? 1 : 0) + (HasFluxSource() ? 1 : 0) + (HasPotentialSource() ? 1 : 0); - int numNextSrcState = (HasNextSwitch() ? 1 : 0) + + unsigned short numNextSrcState = (HasNextSwitch() ? 1 : 0) + (HasNextValve() ? 1 : 0) + (HasNextFluxSource() ? 1 : 0) + (HasNextPotentialSource() ? 1 : 0); diff --git a/src/cpp/cdm/utils/unitconversion/UnitConversionEngine.cpp b/src/cpp/cdm/utils/unitconversion/UnitConversionEngine.cpp index b01ae65c7218d3af82f9279a4017eeaf9dac8a18..8140b9bf5f41ed6672fc0e54219785a989e8bc3a 100644 --- a/src/cpp/cdm/utils/unitconversion/UnitConversionEngine.cpp +++ b/src/cpp/cdm/utils/unitconversion/UnitConversionEngine.cpp @@ -77,9 +77,9 @@ inline bool CIEQUAL(std::string strA, std::string strB) } std::transform(strA.begin(), strA.end(), strA.begin(), - [](unsigned char c) { return std::tolower(c); }); + [](std::string::value_type c) { return static_cast(std::tolower(c)); }); std::transform(strB.begin(), strB.end(), strB.begin(), - [](unsigned char c) { return std::tolower(c); }); + [](std::string::value_type c) { return static_cast(std::tolower(c)); }); return strA == strB; } diff --git a/src/cpp/cpm/controller/SetupCircuitsAndCompartments.cpp b/src/cpp/cpm/controller/SetupCircuitsAndCompartments.cpp index 98a7104d2a8d0324ebf2c6b879acfa617d2d18a7..bc8fcfec9e6fcc8f7e22d5f1509749a8c1f4a4c1 100644 --- a/src/cpp/cpm/controller/SetupCircuitsAndCompartments.cpp +++ b/src/cpp/cpm/controller/SetupCircuitsAndCompartments.cpp @@ -179,11 +179,11 @@ void PulseController::SetupCardiovascular() double systolicPressureTarget_mmHg = m_InitialPatient->GetSystolicArterialPressureBaseline(PressureUnit::mmHg); double heartRate_bpm = m_InitialPatient->GetHeartRateBaseline(FrequencyUnit::Per_min); - double strokeVolumeTarget_mL = 81.0; + const double strokeVolumeTarget_mL = 81.0; double cardiacOutputTarget_mL_Per_s = heartRate_bpm / 60.0 * strokeVolumeTarget_mL; - double diastolicPressureTarget_mmHg = 80.0; - double centralVenousPressureTarget_mmHg = 4.0; - double pulmonaryShuntFractionFactor = 0.009; // Used to set the pulmonary shunt fraction. Actual shunt will be roughly double this value (two lungs). + const double diastolicPressureTarget_mmHg = 80.0; + const double centralVenousPressureTarget_mmHg = 4.0; + const double pulmonaryShuntFractionFactor = 0.009; // Used to set the pulmonary shunt fraction. Actual shunt will be roughly double this value (two lungs). // The way this works is we compute resistances and compliances based on the hemodynamic variables above that are either in the patient // file or we use the defaults if nothing is there. Because the actual impedance depends on the frequency, the computations assume a resting heart rate. // So if a user needs to put pressures in the patient file assuming that the pts baseline hr is in the normal range (around 72). @@ -193,14 +193,14 @@ void PulseController::SetupCardiovascular() // We compute a tuning modifier to adjust some baseline resistances and compliances to get closer to the target systolic and diastolic pressures from the patient file // The tuning method in cardiovascular will do the fine tuning. This just speeds up the process. /// \todo Make these a function of the systolic and diastolic pressure by fitting a curve to the data from the variations test - double systemicResistanceModifier = 0.849; - double largeArteriesComplianceModifier = 0.4333; + const double systemicResistanceModifier = 0.849; + const double largeArteriesComplianceModifier = 0.4333; // Volume fractions and flow rates from \cite valtin1995renal // Pressure targets derived from information available in \cite guyton2006medical and \cite van2013davis double VolumeFractionAorta = 0.05, VascularPressureTargetAorta = 1.0 * systolicPressureTarget_mmHg, VascularFlowTargetAorta = 1.0 * cardiacOutputTarget_mL_Per_s; double VolumeFractionArmLeft = 0.01, VascularPressureTargetArmLeft = 0.33 * systolicPressureTarget_mmHg, VascularFlowTargetArmLeft = male ? 0.01448 * cardiacOutputTarget_mL_Per_s : 0.01664 * cardiacOutputTarget_mL_Per_s; - double VolumeFractionArmRight = VolumeFractionArmLeft, VascularPressureTargetArmRight = 0.33 * systolicPressureTarget_mmHg, VascularFlowTargetArmRight = VascularFlowTargetArmLeft; + double VolumeFractionArmRight = VolumeFractionArmLeft, VascularPressureTargetArmRight = 0.33 * systolicPressureTarget_mmHg; double VolumeFractionBone = 0.07, VascularPressureTargetBone = 0.33 * systolicPressureTarget_mmHg, VascularFlowTargetBone = 0.05 * cardiacOutputTarget_mL_Per_s; double VolumeFractionBrain = 0.012, VascularPressureTargetBrain = 0.08 * systolicPressureTarget_mmHg, VascularFlowTargetBrain = 0.12 * cardiacOutputTarget_mL_Per_s; double VolumeFractionFat = male ? 0.05 : 0.085, VascularPressureTargetFat = 0.33 * systolicPressureTarget_mmHg, VascularFlowTargetFat = male ? 0.05 * cardiacOutputTarget_mL_Per_s : 0.0085 * cardiacOutputTarget_mL_Per_s; @@ -209,11 +209,11 @@ void PulseController::SetupCardiovascular() double VolumeFractionKidney = 0.0202, VascularPressureTargetKidney = 0.33 * systolicPressureTarget_mmHg, VascularFlowTargetKidney = male ? 0.098 * cardiacOutputTarget_mL_Per_s : 0.088 * cardiacOutputTarget_mL_Per_s; double VolumeFractionLargeIntestine = 0.019, VascularPressureTargetLargeIntestine = 0.33 * systolicPressureTarget_mmHg, VascularFlowTargetLargeIntestine = male ? 0.04 * cardiacOutputTarget_mL_Per_s : 0.05 * cardiacOutputTarget_mL_Per_s; double VolumeFractionLegLeft = 0.0151, VascularPressureTargetLegLeft = 0.33 * systolicPressureTarget_mmHg, VascularFlowTargetLegLeft = male ? 0.02872 * cardiacOutputTarget_mL_Per_s : 0.0330 * cardiacOutputTarget_mL_Per_s; - double VolumeFractionLegRight = VolumeFractionLegLeft, VascularPressureTargetLegRight = 0.33 * systolicPressureTarget_mmHg, VascularFlowTargetLegRight = VascularFlowTargetLegLeft; + double VolumeFractionLegRight = VolumeFractionLegLeft, VascularPressureTargetLegRight = 0.33 * systolicPressureTarget_mmHg; double VolumeFractionLiver = 0.106, VascularPressureTargetLiver = 0.25 * systolicPressureTarget_mmHg, VascularFlowTargetLiver = 0.075 * cardiacOutputTarget_mL_Per_s; double VolumeFractionMuscle = male ? 0.14 : 0.105, VascularPressureTargetMuscle = 0.33 * systolicPressureTarget_mmHg, VascularFlowTargetMuscle = male ? 0.17 * cardiacOutputTarget_mL_Per_s : 0.12 * cardiacOutputTarget_mL_Per_s; double VolumeFractionMyocardium = 0.007, VascularPressureTargetMyocardium = 0.33 * systolicPressureTarget_mmHg, VascularFlowTargetMyocardium = male ? 0.04 * cardiacOutputTarget_mL_Per_s : 0.05 * cardiacOutputTarget_mL_Per_s; - double VolumeFractionPulmArtRight = 0.034 * RightLungRatio, VascularPressureTargetPulmArtRight = 0.13333 * systolicPressureTarget_mmHg, VascularFlowTargetPulmArtRight = RightLungRatio * cardiacOutputTarget_mL_Per_s * (1 - pulmonaryShuntFractionFactor); + double VolumeFractionPulmArtRight = 0.034 * RightLungRatio, VascularPressureTargetPulmArtRight = 0.13333 * systolicPressureTarget_mmHg; double VolumeFractionPulmCapRight = 0.023 * RightLungRatio, VascularPressureTargetPulmCapRight = 0.0650 * systolicPressureTarget_mmHg, VascularFlowTargetPulmCapRight = RightLungRatio * cardiacOutputTarget_mL_Per_s * (1 - pulmonaryShuntFractionFactor); double VolumeFractionPulmVeinsRight = 0.068 * RightLungRatio, VascularPressureTargetPulmVeinsRight = 0.03846 * systolicPressureTarget_mmHg, VascularFlowTargetPulmVeinsRight = RightLungRatio * cardiacOutputTarget_mL_Per_s * (1 - pulmonaryShuntFractionFactor); double VolumeFractionPulmArtLeft = 0.034 * LeftLungRatio, VascularPressureTargetPulmArtLeft = 0.13333 * systolicPressureTarget_mmHg, VascularFlowTargetPulmArtLeft = LeftLungRatio * cardiacOutputTarget_mL_Per_s * (1 - pulmonaryShuntFractionFactor); @@ -223,8 +223,9 @@ void PulseController::SetupCardiovascular() double VolumeFractionSmallIntestine = 0.038, VascularPressureTargetSmallIntestine = 0.33 * systolicPressureTarget_mmHg, VascularFlowTargetSmallIntestine = male ? 0.1 * cardiacOutputTarget_mL_Per_s : 0.11 * cardiacOutputTarget_mL_Per_s; double VolumeFractionSplanchnic = 0.0116, VascularPressureTargetSplanchnic = 0.33 * systolicPressureTarget_mmHg, VascularFlowTargetSplanchnic = male ? 0.0258 * cardiacOutputTarget_mL_Per_s : 0.0255 * cardiacOutputTarget_mL_Per_s; double VolumeFractionSpleen = 0.014, VascularPressureTargetSpleen = 0.33 * systolicPressureTarget_mmHg, VascularFlowTargetSpleen = 0.03 * cardiacOutputTarget_mL_Per_s; - double VolumeFractionVenaCava = 0.247, VascularPressureTargetVenaCava = 0.0333 * systolicPressureTarget_mmHg, VascularFlowTargetVenaCava = 1.0 * cardiacOutputTarget_mL_Per_s; - /*Portal Vein is path only*/ double VascularPressureTargetPortalVein = 0.25 * systolicPressureTarget_mmHg, VascularFlowTargetPortalVein = VascularFlowTargetLargeIntestine + VascularFlowTargetSmallIntestine + VascularFlowTargetSplanchnic + VascularFlowTargetSpleen; + double VolumeFractionVenaCava = 0.247, VascularPressureTargetVenaCava = 0.0333 * systolicPressureTarget_mmHg; + /*Portal Vein is path only*/ + double VascularFlowTargetPortalVein = VascularFlowTargetLargeIntestine + VascularFlowTargetSmallIntestine + VascularFlowTargetSplanchnic + VascularFlowTargetSpleen; // Compute resistances from mean flow rates and pressure targets double ResistanceAorta = 1.12 * (VascularPressureTargetHeartLeft - systolicPressureTarget_mmHg) / VascularFlowTargetAorta; /*No Downstream Resistance Aorta*/ @@ -242,7 +243,6 @@ void PulseController::SetupCardiovascular() double ResistanceLiver = 1.1 * (systolicPressureTarget_mmHg - VascularPressureTargetLiver) / VascularFlowTargetLiver, ResistanceLiverVenous = (VascularPressureTargetLiver - VascularPressureTargetVenaCava) / (VascularFlowTargetLiver + VascularFlowTargetPortalVein); double ResistanceMuscle = 1.15 * (systolicPressureTarget_mmHg - VascularPressureTargetMuscle) / VascularFlowTargetMuscle, ResistanceMuscleVenous = (VascularPressureTargetMuscle - VascularPressureTargetVenaCava) / VascularFlowTargetMuscle; double ResistanceMyocardium = 0.95 * (systolicPressureTarget_mmHg - VascularPressureTargetMyocardium) / VascularFlowTargetMyocardium, ResistanceMyocardiumVenous = (VascularPressureTargetMyocardium - VascularPressureTargetVenaCava) / VascularFlowTargetMyocardium; - double ResistancePulmArtRight = 1.0 * (VascularPressureTargetHeartRight - VascularPressureTargetPulmArtRight) / VascularFlowTargetPulmArtRight; /*No Downstream Resistance PulmArt*/ double ResistancePulmCapRight = 1.0 * (VascularPressureTargetPulmArtRight - VascularPressureTargetPulmCapRight) / VascularFlowTargetPulmCapRight; /*No Downstream Resistance PulmCap*/ double ResistancePulmVeinsRight = 1.0 * (VascularPressureTargetPulmCapRight - VascularPressureTargetPulmVeinsRight) / VascularFlowTargetPulmVeinsRight;/*No Downstream Resistance PulmVeins*/ double ResistancePulmArtLeft = 1.0 * (VascularPressureTargetHeartRight - VascularPressureTargetPulmArtLeft) / VascularFlowTargetPulmArtLeft; /*No Downstream Resistance PulmArt*/ @@ -488,7 +488,7 @@ void PulseController::SetupCardiovascular() LeftHeart3ToGround.GetPressureSourceBaseline().SetValue(0.0, PressureUnit::mmHg); SEFluidCircuitPath& LeftHeart1ToAorta2 = cCardiovascular.CreatePath(LeftHeart1, Aorta2, pulse::CardiovascularPath::LeftHeart1ToAorta2); LeftHeart1ToAorta2.SetNextValve(eGate::Closed); - SEFluidCircuitPath& Aorta2ToAorta3 = cCardiovascular.CreatePath(Aorta2, Aorta3, pulse::CardiovascularPath::Aorta2ToAorta3); + cCardiovascular.CreatePath(Aorta2, Aorta3, pulse::CardiovascularPath::Aorta2ToAorta3); SEFluidCircuitPath& Aorta3ToAorta1 = cCardiovascular.CreatePath(Aorta3, Aorta1, pulse::CardiovascularPath::Aorta3ToAorta1); Aorta3ToAorta1.GetResistanceBaseline().SetValue(ResistanceAorta, PressureTimePerVolumeUnit::mmHg_s_Per_mL); SEFluidCircuitPath& Aorta1ToAorta4 = cCardiovascular.CreatePath(Aorta1, Aorta4, pulse::CardiovascularPath::Aorta1ToAorta4); @@ -1158,7 +1158,6 @@ void PulseController::SetupRenal() //assuming there is a left and right kidney node in cardiovascular AND that a baseline volume is set (as a function of patient mass): double leftKidneyFluidVolume_mL = cCardiovascular.GetNode(pulse::CardiovascularNode::LeftKidney1)->GetVolumeBaseline(VolumeUnit::mL); - double rightKidneyFluidVolume_mL = cCardiovascular.GetNode(pulse::CardiovascularNode::RightKidney1)->GetVolumeBaseline(VolumeUnit::mL); double singleKidneyLargeVasculatureFluidVolume_mL = leftKidneyFluidVolume_mL / 2; //Total large vasculature fluid volume double singleKidneySmallVasculatureFluidVolume_mL = leftKidneyFluidVolume_mL / 2; //Total small vasculature fluid volume @@ -2748,7 +2747,7 @@ void PulseController::SetupCerebrospinalFluid() SEFluidCircuitPath& Brain1ToVascularCSFBarrier = cCombinedCardiovascular.CreatePath(*Brain1, VascularCSFBarrier, pulse::CerebrospinalFluidPath::Brain1ToVascularCSFBarrier); Brain1ToVascularCSFBarrier.GetComplianceBaseline().SetValue(brainVascularCompliance, VolumePerPressureUnit::mL_Per_mmHg); //Vascular Volume - SEFluidCircuitPath& VascularCSFBarrierToIntracranialSpace1 = cCombinedCardiovascular.CreatePath(VascularCSFBarrier, IntracranialSpace1, pulse::CerebrospinalFluidPath::VascularCSFBarrierToIntracranialSpace1); + cCombinedCardiovascular.CreatePath(VascularCSFBarrier, IntracranialSpace1, pulse::CerebrospinalFluidPath::VascularCSFBarrierToIntracranialSpace1); SEFluidCircuitPath& GroundToIntracranialSpace1 = cCombinedCardiovascular.CreatePath(*Ground, IntracranialSpace1, pulse::CerebrospinalFluidPath::GroundToIntracranialSpace1); GroundToIntracranialSpace1.GetFlowSourceBaseline().SetValue(0.0, VolumePerTimeUnit::mL_Per_s); //Absorption/Production Path @@ -2756,7 +2755,7 @@ void PulseController::SetupCerebrospinalFluid() SEFluidCircuitPath& IntracranialSpace1ToIntracranialSpace2 = cCombinedCardiovascular.CreatePath(IntracranialSpace1, IntracranialSpace2, pulse::CerebrospinalFluidPath::IntracranialSpace1ToIntracranialSpace2); IntracranialSpace1ToIntracranialSpace2.GetComplianceBaseline().SetValue(70.0, VolumePerPressureUnit::mL_Per_mmHg); //CSF Volume - SEFluidCircuitPath& IntracranialSpace2ToGround = cCombinedCardiovascular.CreatePath(IntracranialSpace2, *Ground, pulse::CerebrospinalFluidPath::IntracranialSpace2ToGround); + cCombinedCardiovascular.CreatePath(IntracranialSpace2, *Ground, pulse::CerebrospinalFluidPath::IntracranialSpace2ToGround); cCombinedCardiovascular.SetNextAndCurrentFromBaselines(); cCombinedCardiovascular.StateChange(); @@ -2782,18 +2781,18 @@ void PulseController::SetupRespiratory() cRespiratory.AddNode(*Ambient); //Input parameters - double RespiratorySystemCompliance_L_Per_cmH20 = 0.1; /// \cite Levitzky2013pulmonary - double RespiratorySideCompliance_L_Per_cmH2O = RespiratorySystemCompliance_L_Per_cmH20 / 2.0; //compliances in parallel sum, so divide by 2 for each lung - double LungCompliance_L_Per_cmH2O = 2.0 * RespiratorySideCompliance_L_Per_cmH2O; //compliances in series, so multiply by 2 for equal split - double ChestWallCompliance_L_Per_cmH2O = LungCompliance_L_Per_cmH2O; // =0.1 L/cmH2O each /// \cite kacmarek2016egan p233 - double IntrapleuralPressure_cmH2O = -5.0; /// \cite Levitzky2013pulmonary - double TotalAirwayResistance_cmH2O_s_Per_L = 1.5; /// \cite Levitzky2013pulmonary + const double RespiratorySystemCompliance_L_Per_cmH20 = 0.1; /// \cite Levitzky2013pulmonary + const double RespiratorySideCompliance_L_Per_cmH2O = RespiratorySystemCompliance_L_Per_cmH20 / 2.0; //compliances in parallel sum, so divide by 2 for each lung + const double LungCompliance_L_Per_cmH2O = 2.0 * RespiratorySideCompliance_L_Per_cmH2O; //compliances in series, so multiply by 2 for equal split + const double ChestWallCompliance_L_Per_cmH2O = LungCompliance_L_Per_cmH2O; // =0.1 L/cmH2O each /// \cite kacmarek2016egan p233 + const double IntrapleuralPressure_cmH2O = -5.0; /// \cite Levitzky2013pulmonary + const double TotalAirwayResistance_cmH2O_s_Per_L = 1.5; /// \cite Levitzky2013pulmonary //Should add up to 100% of total airway resistance /// \cite kacmarek2016egan - double TracheaResistancePercent = 0.5; - double BronchiResistancePercent = 0.3; - double AlveoliDuctResistancePercent = 0.2; + const double TracheaResistancePercent = 0.5; + const double BronchiResistancePercent = 0.3; + const double AlveoliDuctResistancePercent = 0.2; //Based on equivalent resistance circuit math double TracheaResistance = TotalAirwayResistance_cmH2O_s_Per_L - (BronchiResistancePercent * TotalAirwayResistance_cmH2O_s_Per_L + AlveoliDuctResistancePercent * TotalAirwayResistance_cmH2O_s_Per_L) / 2; @@ -2897,8 +2896,8 @@ void PulseController::SetupRespiratory() LeftAlveoliToLeftPleuralConnection.GetComplianceBaseline().SetValue(LungCompliance_L_Per_cmH2O, VolumePerPressureUnit::L_Per_cmH2O); LeftAlveoliToLeftPleuralConnection.SetNextPolarizedState(eGate::Closed); //Need a no element path to be able to include a node with no volume, so it doesn't get modified by compliances - SEFluidCircuitPath& RightPleuralConnectionToRightPleural = cRespiratory.CreatePath(RightPleuralConnection, RightPleural, pulse::RespiratoryPath::RightPleuralConnectionToRightPleural); - SEFluidCircuitPath& LeftPleuralConnectionToLeftPleural = cRespiratory.CreatePath(LeftPleuralConnection, LeftPleural, pulse::RespiratoryPath::LeftPleuralConnectionToLeftPleural); + cRespiratory.CreatePath(RightPleuralConnection, RightPleural, pulse::RespiratoryPath::RightPleuralConnectionToRightPleural); + cRespiratory.CreatePath(LeftPleuralConnection, LeftPleural, pulse::RespiratoryPath::LeftPleuralConnectionToLeftPleural); //---------------------------------------------------------------------------------------------------------------------------------------------- // Path between alveoli and pleural - for right pleural leak SEFluidCircuitPath& RightAlveoliToRightAlveoliLeak = cRespiratory.CreatePath(RightAlveoli, RightAlveoliLeak, pulse::RespiratoryPath::RightAlveoliToRightAlveoliLeak); @@ -3136,7 +3135,7 @@ void PulseController::SetupGastrointestinal() SEFluidCircuitPath& SmallIntestineC1ToSmallIntestine1 = cCombinedCardiovascular.CreatePath(SmallIntestineC1, *SmallIntestine1, pulse::ChymePath::SmallIntestineC1ToSmallIntestine1); SmallIntestineC1ToSmallIntestine1.GetFlowSourceBaseline().SetValue(0, VolumePerTimeUnit::mL_Per_min); - SEFluidCircuitPath& GroundToSmallIntestineC1 = cCombinedCardiovascular.CreatePath(*Ground, SmallIntestineC1, pulse::ChymePath::GroundToSmallIntestineC1); + cCombinedCardiovascular.CreatePath(*Ground, SmallIntestineC1, pulse::ChymePath::GroundToSmallIntestineC1); if (m_Config->IsTissueEnabled()) { @@ -3174,7 +3173,6 @@ void PulseController::SetupAnesthesiaMachine() double ventilatorVolume_L = 1.0; double ventilatorCompliance_L_Per_cmH2O = 0.1; double dValveOpenResistance = m_Config->GetMachineOpenResistance(PressureTimePerVolumeUnit::cmH2O_s_Per_L); - double dValveClosedResistance = m_Config->GetMachineClosedResistance(PressureTimePerVolumeUnit::cmH2O_s_Per_L); double dSwitchOpenResistance = m_Config->GetDefaultOpenFlowResistance(PressureTimePerVolumeUnit::cmH2O_s_Per_L); double dSwitchClosedResistance = m_Config->GetDefaultClosedFlowResistance(PressureTimePerVolumeUnit::cmH2O_s_Per_L); double dLowResistance = 0.01; @@ -3510,7 +3508,6 @@ void PulseController::SetupMechanicalVentilation() ////////////////////// // GAS COMPARTMENTS // SEGasCompartment* gAirway = m_Compartments->GetGasCompartment(pulse::PulmonaryCompartment::Airway); - SEGasCompartment* gAmbient = m_Compartments->GetGasCompartment(pulse::EnvironmentCompartment::Ambient); ////////////////// // Compartments // SEGasCompartment& gConnection = m_Compartments->CreateGasCompartment(pulse::MechanicalVentilationCompartment::Connection); @@ -3531,7 +3528,6 @@ void PulseController::SetupMechanicalVentilation() /////////////////////////////////// // LIQUID (AEROSOL) COMPARTMENTS // SELiquidCompartment* lAirway = m_Compartments->GetLiquidCompartment(pulse::PulmonaryCompartment::Airway); - SELiquidCompartment* lAmbient = m_Compartments->GetLiquidCompartment(pulse::EnvironmentCompartment::Ambient); ////////////////// // Compartments // SELiquidCompartment& lConnection = m_Compartments->CreateLiquidCompartment(pulse::MechanicalVentilationCompartment::Connection); @@ -3878,7 +3874,7 @@ void PulseController::SetupNonRebreatherMask() Ports.GetPressure().SetValue(0.0, PressureUnit::cmH2O); Ports.GetNextPressure().SetValue(0.0, PressureUnit::cmH2O); // Define path on the combined graph, this is a simple circuit, no reason to make a independent circuit at this point - SEFluidCircuitPath& GroundToOxygenSource = CombinedNonRebreatherMask.CreatePath(Ambient, OxygenSource, pulse::NonRebreatherMaskPath::NonRebreatherMaskPressure); + CombinedNonRebreatherMask.CreatePath(Ambient, OxygenSource, pulse::NonRebreatherMaskPath::NonRebreatherMaskPressure); SEFluidCircuitPath& OxygenInlet = CombinedNonRebreatherMask.CreatePath(OxygenSource, Bag, pulse::NonRebreatherMaskPath::NonRebreatherMaskOxygenInlet); OxygenInlet.GetResistanceBaseline().SetValue(PortsResistance_cmH2O_s_Per_L, PressureTimePerVolumeUnit::cmH2O_s_Per_L); SEFluidCircuitPath& ReservoirValve = CombinedNonRebreatherMask.CreatePath(Bag, Mask, pulse::NonRebreatherMaskPath::NonRebreatherMaskReservoirValve); @@ -4021,7 +4017,6 @@ void PulseController::SetupExternalTemperature() SEThermalCircuit& exthermal = m_Circuits->GetExternalTemperatureCircuit(); double dNoResistance = m_Config->GetDefaultClosedHeatResistance(HeatResistanceUnit::K_Per_W); - double dMaxResistance = m_Config->GetDefaultOpenHeatResistance(HeatResistanceUnit::K_Per_W); //Define Nodes //Initialize temperatures to a reasonable value (ambient temperature hasn't been read in yet) double dAmbientTemperature_K = 295.4; //~72F diff --git a/src/cpp/cpm/controller/Substances.cpp b/src/cpp/cpm/controller/Substances.cpp index 0d3454f676b3d0101e84d17c13aeb72d863fee9c..43851a84cae7a85c48491d20c0d987dee7d53c19 100644 --- a/src/cpp/cpm/controller/Substances.cpp +++ b/src/cpp/cpm/controller/Substances.cpp @@ -573,10 +573,6 @@ void PulseSubstances::WriteBloodGases() { SELiquidSubstanceQuantity* O2 = cmpt->GetSubstanceQuantity(*m_O2); SELiquidSubstanceQuantity* CO2 = cmpt->GetSubstanceQuantity(*m_CO2); - SELiquidSubstanceQuantity* Hb = cmpt->GetSubstanceQuantity(*m_Hb); - SELiquidSubstanceQuantity* HbO2 = cmpt->GetSubstanceQuantity(*m_HbO2); - SELiquidSubstanceQuantity* HbCO2 = cmpt->GetSubstanceQuantity(*m_HbCO2); - SELiquidSubstanceQuantity* HbO2CO2 = cmpt->GetSubstanceQuantity(*m_HbO2CO2); SELiquidSubstanceQuantity* HCO3 = cmpt->GetSubstanceQuantity(*m_HCO3); ss << "InitializeBloodGases(*cmpts.GetLiquidCompartment(pulse::VascularCompartment::" << cmpt->GetName() << "), Hb_total_mM, " << O2->GetSaturation() << ", " << O2->GetMolarity(AmountPerVolumeUnit::mmol_Per_L) << ", " << CO2->GetSaturation() << ", " << CO2->GetMolarity(AmountPerVolumeUnit::mmol_Per_L) << ", " << HCO3->GetMolarity(AmountPerVolumeUnit::mmol_Per_L) << ", " << cmpt->GetPH().GetValue() << ");"; diff --git a/src/cpp/cpm/physiology/Cardiovascular.cpp b/src/cpp/cpm/physiology/Cardiovascular.cpp index 30d4d4a23ac6fdc79d7e48584961b637d907cfdd..c8aef96cdbc2d7a69d02d2a59c547c7ffc67bbc5 100644 --- a/src/cpp/cpm/physiology/Cardiovascular.cpp +++ b/src/cpp/cpm/physiology/Cardiovascular.cpp @@ -663,36 +663,36 @@ void Cardiovascular::PostProcess(bool solve_and_transport) void Cardiovascular::CalculateVitalSigns() { // Grab data from the circuit in order to calculate a running mean - double AortaNodePressure_mmHg = m_Aorta->GetPressure(PressureUnit::mmHg); - double AortaNodeCO2PartialPressure_mmHg = m_AortaCO2 == nullptr ? 0 : m_AortaCO2->GetPartialPressure(PressureUnit::mmHg); // This is here so we can Tune circuit w/o substances - double LeftPulmonaryArteryVolume_mL = m_LeftPulmonaryArteries->GetVolume(VolumeUnit::mL); - double RightPulmonaryArteryVolume_mL = m_RightPulmonaryArteries->GetVolume(VolumeUnit::mL); - double TotalPulmonaryArteryVolume_mL = LeftPulmonaryArteryVolume_mL + RightPulmonaryArteryVolume_mL; - double LeftPulmonaryArteryPressure_mmHg = m_LeftPulmonaryArteries->GetPressure(PressureUnit::mmHg); - double RightPulmonaryArteryPressure_mmHg = m_RightPulmonaryArteries->GetPressure(PressureUnit::mmHg); - - double LeftPulmonaryVeinVolume_mL = m_LeftPulmonaryVeins->GetVolume(VolumeUnit::mL); - double RightPulmonaryVeinVolume_mL = m_RightPulmonaryVeins->GetVolume(VolumeUnit::mL); - double TotalPulmonaryVeinVolume_mL = LeftPulmonaryVeinVolume_mL + RightPulmonaryVeinVolume_mL; - double LeftPulmonaryVeinPressure_mmHg = m_LeftPulmonaryVeins->GetPressure(PressureUnit::mmHg); - double RightPulmonaryVeinPressure_mmHg = m_RightPulmonaryVeins->GetPressure(PressureUnit::mmHg); - - double PulmonaryArteryNodePressure_mmHg = (LeftPulmonaryArteryVolume_mL*LeftPulmonaryArteryPressure_mmHg + RightPulmonaryArteryVolume_mL*RightPulmonaryArteryPressure_mmHg) / TotalPulmonaryArteryVolume_mL; - double PulmVeinNodePressure_mmHg = (LeftPulmonaryVeinVolume_mL*LeftPulmonaryVeinPressure_mmHg + RightPulmonaryVeinVolume_mL*RightPulmonaryVeinPressure_mmHg) / TotalPulmonaryVeinVolume_mL; - double PulmCapFlow_mL_Per_s = m_LeftPulmonaryArteriesToCapillaries->GetNextFlow(VolumePerTimeUnit::mL_Per_s) - + m_RightPulmonaryArteriesToCapillaries->GetNextFlow(VolumePerTimeUnit::mL_Per_s); - double PulmShuntFlow_mL_Per_s = m_LeftPulmonaryArteriesToVeins->GetNextFlow(VolumePerTimeUnit::mL_Per_s) - + m_RightPulmonaryArteriesToVeins->GetNextFlow(VolumePerTimeUnit::mL_Per_s); - - double VenaCavaPressure_mmHg = m_VenaCava->GetPressure(PressureUnit::mmHg); - - double SkinFlow_mL_Per_s = m_pAortaToSkin->GetNextFlow(VolumePerTimeUnit::mL_Per_s); - double LHeartFlow_mL_Per_s = m_LeftHeartToAorta->GetNextFlow(VolumePerTimeUnit::mL_Per_s); - double LHeartVolume_mL = m_LeftHeart->GetVolume(VolumeUnit::mL); - - double muscleFlow_mL_Per_s = m_pAortaToMuscle->GetNextFlow(VolumePerTimeUnit::mL_Per_s); - - double gutFlow_mL_Per_s = m_pAortaToLargeIntestine->GetNextFlow(VolumePerTimeUnit::mL_Per_s) + + const double AortaNodePressure_mmHg = m_Aorta->GetPressure(PressureUnit::mmHg); + const double AortaNodeCO2PartialPressure_mmHg = m_AortaCO2 == nullptr ? 0 : m_AortaCO2->GetPartialPressure(PressureUnit::mmHg); // This is here so we can Tune circuit w/o substances + const double LeftPulmonaryArteryVolume_mL = m_LeftPulmonaryArteries->GetVolume(VolumeUnit::mL); + const double RightPulmonaryArteryVolume_mL = m_RightPulmonaryArteries->GetVolume(VolumeUnit::mL); + const double TotalPulmonaryArteryVolume_mL = LeftPulmonaryArteryVolume_mL + RightPulmonaryArteryVolume_mL; + const double LeftPulmonaryArteryPressure_mmHg = m_LeftPulmonaryArteries->GetPressure(PressureUnit::mmHg); + const double RightPulmonaryArteryPressure_mmHg = m_RightPulmonaryArteries->GetPressure(PressureUnit::mmHg); + + const double LeftPulmonaryVeinVolume_mL = m_LeftPulmonaryVeins->GetVolume(VolumeUnit::mL); + const double RightPulmonaryVeinVolume_mL = m_RightPulmonaryVeins->GetVolume(VolumeUnit::mL); + const double TotalPulmonaryVeinVolume_mL = LeftPulmonaryVeinVolume_mL + RightPulmonaryVeinVolume_mL; + const double LeftPulmonaryVeinPressure_mmHg = m_LeftPulmonaryVeins->GetPressure(PressureUnit::mmHg); + const double RightPulmonaryVeinPressure_mmHg = m_RightPulmonaryVeins->GetPressure(PressureUnit::mmHg); + + const double PulmonaryArteryNodePressure_mmHg = (LeftPulmonaryArteryVolume_mL*LeftPulmonaryArteryPressure_mmHg + RightPulmonaryArteryVolume_mL*RightPulmonaryArteryPressure_mmHg) / TotalPulmonaryArteryVolume_mL; + const double PulmVeinNodePressure_mmHg = (LeftPulmonaryVeinVolume_mL*LeftPulmonaryVeinPressure_mmHg + RightPulmonaryVeinVolume_mL*RightPulmonaryVeinPressure_mmHg) / TotalPulmonaryVeinVolume_mL; + const double PulmCapFlow_mL_Per_s = m_LeftPulmonaryArteriesToCapillaries->GetNextFlow(VolumePerTimeUnit::mL_Per_s) + + m_RightPulmonaryArteriesToCapillaries->GetNextFlow(VolumePerTimeUnit::mL_Per_s); + const double PulmShuntFlow_mL_Per_s = m_LeftPulmonaryArteriesToVeins->GetNextFlow(VolumePerTimeUnit::mL_Per_s) + + m_RightPulmonaryArteriesToVeins->GetNextFlow(VolumePerTimeUnit::mL_Per_s); + + const double VenaCavaPressure_mmHg = m_VenaCava->GetPressure(PressureUnit::mmHg); + + const double SkinFlow_mL_Per_s = m_pAortaToSkin->GetNextFlow(VolumePerTimeUnit::mL_Per_s); + const double LHeartFlow_mL_Per_s = m_LeftHeartToAorta->GetNextFlow(VolumePerTimeUnit::mL_Per_s); + const double LHeartVolume_mL = m_LeftHeart->GetVolume(VolumeUnit::mL); + + const double muscleFlow_mL_Per_s = m_pAortaToMuscle->GetNextFlow(VolumePerTimeUnit::mL_Per_s); + + const double gutFlow_mL_Per_s = m_pAortaToLargeIntestine->GetNextFlow(VolumePerTimeUnit::mL_Per_s) + m_pAortaToSmallIntestine->GetNextFlow(VolumePerTimeUnit::mL_Per_s) + m_pAortaToSplanchnic->GetNextFlow(VolumePerTimeUnit::mL_Per_s); @@ -995,7 +995,6 @@ void Cardiovascular::Hemorrhage() SEHemorrhage* h; bool completeStateChange = false; double TotalLossRate_mL_Per_s = 0.0; - double internal_rate_mL_Per_s = 0.0; std::vector invalid_hemorrhages; const std::map & hems = m_data.GetActions().GetPatientActions().GetHemorrhages(); //Loop over all hemorrhages to check for validity @@ -1219,7 +1218,7 @@ void Cardiovascular::Hemorrhage() //Add bleed link for transport //Find the source compartment (may be a leaf) to make the graph work (i.e., to transport) - SELiquidCompartment* sourceCompartment; + SELiquidCompartment* sourceCompartment = nullptr; if (std::find(compartment->GetNodeMapping().GetNodes().begin(), compartment->GetNodeMapping().GetNodes().end(), node) != compartment->GetNodeMapping().GetNodes().end()) { sourceCompartment = compartment; @@ -1236,6 +1235,8 @@ void Cardiovascular::Hemorrhage() } } } + + if (sourceCompartment == nullptr) Fatal("Unable to find the correct source compartment."); SELiquidCompartmentLink& newHemorrhageLink = m_data.GetCompartments().CreateLiquidLink(*sourceCompartment, *m_Groundcmpt, compartment->GetName() + "Hemorrhage"); newHemorrhageLink.MapPath(*newHemorrhagePath); @@ -1360,7 +1361,6 @@ void Cardiovascular::PericardialEffusion() double flowCubed_mL3_Per_s3 = 0.0; double compliance_mL_Per_mmHg = 0.0; double intrapericardialVolume_mL = m_Pericardium->GetVolume(VolumeUnit::mL); - double intrapericardialPressure_mmHg = m_Pericardium->GetPressure(PressureUnit::mmHg); double effusionRate_mL_Per_s = m_data.GetActions().GetPatientActions().GetPericardialEffusion()->GetEffusionRate().GetValue(VolumePerTimeUnit::mL_Per_s); if (effusionRate_mL_Per_s <= 0.1 && effusionRate_mL_Per_s > 0.0) @@ -1793,10 +1793,10 @@ void Cardiovascular::MetabolicToneResponse() double coreTempDelta_degC = MAX(coreTemp_degC - coreTempSet_degC, 0.0); coreTempDelta_degC = MIN(coreTempDelta_degC, 1.0); //A 1 degree increase in core temperature is the where the cardiovascular response on resistances is capped //The skin multiplier is used to increase the skin blood flow resistance, effectively reducing the skin blood flow leading to less heat transfered from core to skin. - double skinMultiplier = 1.0 / MAX((coreTemp_degC - 35.0), 0.001); - double coreTempLow_degC = m_data.GetConfiguration().GetCoreTemperatureLow(TemperatureUnit::C); //36.8 degC + //double skinMultiplier = 1.0 / MAX((coreTemp_degC - 35.0), 0.001); + //double coreTempLow_degC = m_data.GetConfiguration().GetCoreTemperatureLow(TemperatureUnit::C); //36.8 degC /// \cite talebipour2006sauna - double tempMultiplier = 1.0 - 0.4*MIN(coreTempDelta_degC, 1.0); //Approximate 40% reduction in peripheral resistance due to core temperature rise of 1 degree. + // double tempMultiplier = 1.0 - 0.4*MIN(coreTempDelta_degC, 1.0); //Approximate 40% reduction in peripheral resistance due to core temperature rise of 1 degree. double metabolicModifier = 1.0; //The metabolic multiplier is used as a tuned response to represent cardiovascular resistance effects during exercise double sp0 = 1.5; @@ -1809,7 +1809,6 @@ void Cardiovascular::MetabolicToneResponse() //Reducing resistances scaling with metabolic rate increase and changes in core temperature double resistanceNew__mmHg_s_Per_mL = 0.0; - double complianceNew_mL_Per_mmHg = 0.0; for (SEFluidCircuitPath* Path : m_systemicResistancePaths) { @@ -1854,8 +1853,7 @@ void Cardiovascular::AdjustVascularTone() //The baroreceptor response adjusts the systemic resistances and compliances according to the multiplier calculated in Nervous.cpp double UpdatedResistance_mmHg_s_Per_mL = 0.0; double UpdatedCompliance_mL_Per_mmHg = 0.0; - double totalResistanceChange_mmHg_s_Per_mL = 0.0; - double totalComplianceChange_mL_Per_mmHg = 0.0; + if (m_data.GetNervous().GetBaroreceptorFeedback() == eSwitch::On) { for (SEFluidCircuitPath* Path : m_systemicResistancePaths) @@ -2028,7 +2026,7 @@ void Cardiovascular::TuneCircuit() double systolic_mmHg = 0, tgt_systolic_mmHg = 0; double diastolic_mmHg = 0, tgt_diastolic_mmHg = 0; double cardiacOutput_mL_Per_min = 0, tgt_cardiacOutput_mL_Per_min = 0; - double meanCVP_mmHg = 0, tgt_meanCVP_mmHg = 0; + double meanCVP_mmHg = 0; double blood_mL = 0, tgt_blood_mL = 0; double time_s = 0; @@ -2367,9 +2365,9 @@ void Cardiovascular::TuneTissue(double time_s, DataTrack& circuitTrk, std::ofstr } // Tuning variables - double pressuretolerance = 0.01; - double stabPercentTolerance = 0.25; - double stabCheckTime_s = 15.0; + const double pressuretolerance = 0.01; + const double stabPercentTolerance = 0.25; + const double stabCheckTime_s = 15.0; double currentStableTime_s; double maxStableTime_s = 20; diff --git a/src/cpp/cpm/physiology/Drugs.cpp b/src/cpp/cpm/physiology/Drugs.cpp index c173aacadabec295c49ce2b1fe60e59018d70525..e1c1a9d3931751873428686e816278a629206cc7 100644 --- a/src/cpp/cpm/physiology/Drugs.cpp +++ b/src/cpp/cpm/physiology/Drugs.cpp @@ -315,7 +315,6 @@ void Drugs::AdministerSubstanceCompoundInfusion() SESubstanceCompoundInfusion* infusion; const SESubstanceCompound* compound; SELiquidSubstanceQuantity* subQ; - double concentration_ug_Per_mL=0; double rate_mL_Per_s = 0; double totalRate_mL_Per_s = 0; double massIncrement_ug=0; @@ -351,7 +350,7 @@ void Drugs::AdministerSubstanceCompoundInfusion() for (const SESubstanceConcentration* component : compound->GetComponents()) { subQ = m_venaCavaVascular->GetSubstanceQuantity(component->GetSubstance()); - double massIncrement_ug = rate_mL_Per_s*component->GetConcentration(MassPerVolumeUnit::ug_Per_mL)*m_dt_s; + massIncrement_ug = rate_mL_Per_s*component->GetConcentration(MassPerVolumeUnit::ug_Per_mL)*m_dt_s; subQ->GetMass().IncrementValue(massIncrement_ug, MassUnit::ug); subQ->Balance(BalanceLiquidBy::Mass); } @@ -393,7 +392,6 @@ void Drugs::CalculatePartitionCoefficients() double IntracellularPHEffects = 0; double PlasmaPHEffects = 0; double PHEffectPower = 0; - double PHEffects = 0; double EquationPartA = 0; double EquationPartB = 0; double EquationPartC = 0; diff --git a/src/cpp/cpm/physiology/Nervous.cpp b/src/cpp/cpm/physiology/Nervous.cpp index 81dc8dbff7bb8f6f3da95c7ab0c22bffb6a54b74..0fe7dc368f00e0c0a36c5a61a196d7a56fbc3cad 100644 --- a/src/cpp/cpm/physiology/Nervous.cpp +++ b/src/cpp/cpm/physiology/Nervous.cpp @@ -301,9 +301,8 @@ void Nervous::BaroreceptorFeedback() //update nu - the slope response of the firing rate //nu *= (1 - sedationDampeningEffect); TODO: Add this back when I have data for validation //Backout the pressure associated with the total sympathetic fraction from the last time step - double cumulativeMeanArterialPressure_mmHg = pow(((1.0 / m_TotalSympatheticFraction) - 1.0), (1.0 / nu)) * meanArterialPressureCombinedBaseline_mmHg; - double deltaPressure_mmHg = meanArterialPressure_mmHg - m_LastMeanArterialPressure_mmHg; - double baroreceptorPressure_mmHg = cumulativeMeanArterialPressure_mmHg + deltaPressure_mmHg; + // double cumulativeMeanArterialPressure_mmHg = pow(((1.0 / m_TotalSympatheticFraction) - 1.0), (1.0 / nu)) * meanArterialPressureCombinedBaseline_mmHg; + // double deltaPressure_mmHg = meanArterialPressure_mmHg - m_LastMeanArterialPressure_mmHg; m_TotalSympatheticFraction = 1.0 / (1.0 + pow( meanArterialPressure_mmHg / meanArterialPressureCombinedBaseline_mmHg, nu)); double parasympatheticFraction = 1.0 - m_TotalSympatheticFraction; m_LastMeanArterialPressure_mmHg = meanArterialPressure_mmHg; diff --git a/src/cpp/cpm/physiology/Renal.cpp b/src/cpp/cpm/physiology/Renal.cpp index 96255bc321fec6fe9cfa3041e7e787ce0cab84ad..a34082b6e080d06ebccda782c1f7077e18e8311e 100644 --- a/src/cpp/cpm/physiology/Renal.cpp +++ b/src/cpp/cpm/physiology/Renal.cpp @@ -515,9 +515,9 @@ void Renal::PostProcess(bool solve_and_transport) //-------------------------------------------------------------------------------------------------- void Renal::CalculateUltrafiltrationFeedback() { - //Tuning parameters - double glomerularOsmoticSensitivity = 1.0; - double bowmansOsmoticSensitivity = 1.0; + //Tuning parameters unused + const double glomerularOsmoticSensitivity = 1.0; + const double bowmansOsmoticSensitivity = 1.0; //Get substances SEFluidCircuitPath* glomerularOsmoticSourcePath = nullptr; @@ -583,9 +583,9 @@ void Renal::CalculateUltrafiltrationFeedback() //-------------------------------------------------------------------------------------------------- void Renal::CalculateReabsorptionFeedback() { - //Tuning parameters - double peritubularOsmoticSensitivity = 1.0; - double tubulesOsmoticSensitivity = 1.0; + //Tuning parameters, unused + const double peritubularOsmoticSensitivity = 1.0; + const double tubulesOsmoticSensitivity = 1.0; //Determine the permeability //Only allow water to be reabsorbed more easily @@ -630,7 +630,7 @@ void Renal::CalculateReabsorptionFeedback() //Set the filter resistance based on its physical properties //This is the Capillary Filtration Coefficient //We'll just assume this linear relationship for now - double filterResistance_mmHg_s_Per_mL = filterResistancePath->GetNextResistance().GetValue(PressureTimePerVolumeUnit::mmHg_s_Per_mL); + filterResistance_mmHg_s_Per_mL = filterResistancePath->GetNextResistance().GetValue(PressureTimePerVolumeUnit::mmHg_s_Per_mL); if (permeability_mL_Per_s_Per_mmHg_Per_m2 != 0 && surfaceArea_m2 != 0) filterResistance_mmHg_s_Per_mL = 1 / (permeability_mL_Per_s_Per_mmHg_Per_m2 * surfaceArea_m2); else @@ -661,11 +661,8 @@ void Renal::CalculateReabsorptionFeedback() void Renal::CalculateGluconeogenesis() { //Whatever Lactate shows up in the Ureter (i.e. what's excreted) is converted to Glucose and put in the TubularCapillaries (i.e. reabsorbed) - - SEFluidCircuitNode* tubulesNode = nullptr; SELiquidSubstanceQuantity* peritubularGlucose = nullptr; SELiquidSubstanceQuantity* ureterLactate = nullptr; - SEFluidCircuitPath* reabsorptionResistancePath = nullptr; double totalReabsorptionRate_mg_Per_s = 0.0; double totalLactateExcretionRate_mg_Per_s = 0.0; @@ -772,7 +769,6 @@ void Renal::CalculateActiveTransport() m_SubstanceTransport.leftGlucoseReabsorptionMass_mg = 0.0; m_SubstanceTransport.rightGlucoseReabsorptionMass_mg = 0.0; - unsigned int i = 0; for (SESubstance* sub : m_data.GetCompartments().GetLiquidCompartmentSubstances()) { if (!sub->HasClearance()) @@ -1835,7 +1831,6 @@ void Renal::CalculateTubuloglomerularFeedback() //Get substances and appropriate paths and node which will be utilized in this implementation SEFluidCircuitPath* tubulesPath = nullptr; SEFluidCircuitPath* afferentResistancePath = nullptr; - SEFluidCircuitNode* renalArteryNode = nullptr; //set sodium flow to initially be zero double sodiumFlow_mg_Per_s = 0.0; diff --git a/src/cpp/cpm/physiology/Tissue.cpp b/src/cpp/cpm/physiology/Tissue.cpp index 87cb7c86f4292e9d4420cfaa12ae9e8ae9a60108..9c35b10d0b4fd139e82f22dcfe3675423d86f833 100644 --- a/src/cpp/cpm/physiology/Tissue.cpp +++ b/src/cpp/cpm/physiology/Tissue.cpp @@ -415,18 +415,17 @@ void Tissue::CalculateDiffusion() // Sodium is special. We need to diffuse for renal function. // We will not treat sodium any differently once diffusion functionality is fully implemented. if (sub == m_Sodium) - double moved_ug = MoveMassByInstantDiffusion(*vascular, extracellular, *sub, m_dt_s); + MoveMassByInstantDiffusion(*vascular, extracellular, *sub, m_dt_s); continue; } - double moved_ug; ///////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////// Vascular to Extravascular-Extracellular ///////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// // --- First, instant diffusion --- - moved_ug = MoveMassByInstantDiffusion(*vascular, extracellular, *sub, m_dt_s); + MoveMassByInstantDiffusion(*vascular, extracellular, *sub, m_dt_s); // --- Second, simple diffusion --- // Compute the vascular to extracellular permeability coefficient @@ -444,7 +443,7 @@ void Tissue::CalculateDiffusion() double vToECpermeabilityCoefficient_mL_Per_s = vToECpermeabilityCoefficient_mL_Per_s_g * tissue->GetTotalMass(MassUnit::g); // A tuning factor helps tune the dynamics - note that concentrations will ALWAYS equilibrate in steady state given enough time regardless of the permeability double vToECPermeabilityTuningFactor = 1.0; - moved_ug = MoveMassBySimpleDiffusion(*vascular, extracellular, *sub, vToECPermeabilityTuningFactor*vToECpermeabilityCoefficient_mL_Per_s, m_dt_s); + MoveMassBySimpleDiffusion(*vascular, extracellular, *sub, vToECPermeabilityTuningFactor*vToECpermeabilityCoefficient_mL_Per_s, m_dt_s); // --- Third facilitated diffusion --- if (sub->HasMaximumDiffusionFlux()) @@ -453,13 +452,13 @@ void Tissue::CalculateDiffusion() double capCoverage_cm2 = massToAreaCoefficient_cm2_Per_g * tissue->GetTotalMass(MassUnit::g); double maximumMassFlux = sub->GetMaximumDiffusionFlux(MassPerAreaTimeUnit::g_Per_cm2_s); double combinedCoefficient_g_Per_s = maximumMassFlux*capCoverage_cm2; - moved_ug = MoveMassByFacilitatedDiffusion(*vascular, extracellular, *sub, combinedCoefficient_g_Per_s, m_dt_s); + MoveMassByFacilitatedDiffusion(*vascular, extracellular, *sub, combinedCoefficient_g_Per_s, m_dt_s); } // --- Fourth, and final vascular to EV-EC, Active diffusion --- double pumpRate_g_Per_s = 0.0; /// \todo Compute the pump rate from an empirically-determined baseline pump rate. - moved_ug = MoveMassByActiveTransport(*vascular, extracellular, *sub, pumpRate_g_Per_s, m_dt_s); + MoveMassByActiveTransport(*vascular, extracellular, *sub, pumpRate_g_Per_s, m_dt_s); #ifdef PROBE_BLOOD_GASES if (sub == &m_data.GetSubstances().GetO2() || sub == &m_data.GetSubstances().GetCO2()) @@ -475,12 +474,12 @@ void Tissue::CalculateDiffusion() ///////////////////////////////////////////////////////////////////////////////////////////////////////// // --- First, instant diffusion --- - moved_ug = MoveMassByInstantDiffusion(extracellular, intracellular, *sub, m_dt_s); + MoveMassByInstantDiffusion(extracellular, intracellular, *sub, m_dt_s); // --- Second, simple diffusion --- // Assuming that the capillary permeability coefficient is proportional to the cellular membrane permeability coefficient for a given tissue and substance double ECtoICPermeabilityFactor = 1.0; // This is the permeability constant - moved_ug = MoveMassBySimpleDiffusion(extracellular, intracellular, *sub, ECtoICPermeabilityFactor*vToECpermeabilityCoefficient_mL_Per_s, m_dt_s); + MoveMassBySimpleDiffusion(extracellular, intracellular, *sub, ECtoICPermeabilityFactor*vToECpermeabilityCoefficient_mL_Per_s, m_dt_s); // --- Third facilitated diffusion --- // In Pulse, only glucose moves by facilitated diffusion, and it is assumed that all glucose that gets to the @@ -490,7 +489,7 @@ void Tissue::CalculateDiffusion() // --- Fourth, and final vascular to EV-EC, Active diffusion --- pumpRate_g_Per_s = 0.0; /// \todo Compute the pump rate from an empirically-determined baseline pump rate. - moved_ug = MoveMassByActiveTransport(extracellular, intracellular, *sub, pumpRate_g_Per_s, m_dt_s); + MoveMassByActiveTransport(extracellular, intracellular, *sub, pumpRate_g_Per_s, m_dt_s); #ifdef PROBE_BLOOD_GASES if (sub == &m_data.GetSubstances().GetO2() || sub == &m_data.GetSubstances().GetCO2()) @@ -998,7 +997,7 @@ void Tissue::GlucoseLipidControl(double time_s) double bloodLipidDelta_mg_Per_mL = (currentBloodLipid_mg_Per_mL - m_RestingBloodLipid_mg_Per_mL); double insulinFeedback = currentInsulinConcentration_mg_Per_mL / m_RestingBloodInsulin_mg_Per_mL; double massDelta_mg = 0.0; - double evFlow_mL_Per_s = 0.0; + double vascularVolume = 0.0; double extravascularVolume = 0.0; double transferTimeConstant_per_s = 0.1; @@ -1163,13 +1162,10 @@ void Tissue::DistributeMassbyVolumeWeighted(SELiquidCompartment& cmpt, const SES if (mass == 0) return; SELiquidSubstanceQuantity* subQ = cmpt.GetSubstanceQuantity(sub); - if (mass < 0.0) + if (mass < 0.0 && -mass > subQ->GetMass(unit)) { - if (-mass > subQ->GetMass(unit)) - { mass = -subQ->GetMass(unit); Info("The amount of mass decrement to distribute by volume weighted was greater than available. High probability of negative mass. DistributeMassbyMassWeighted is preferred for decrements."); - } } if (!cmpt.HasChildren()) @@ -1186,11 +1182,11 @@ void Tissue::DistributeMassbyVolumeWeighted(SELiquidCompartment& cmpt, const SES for (SELiquidCompartment* leaf : cmpt.GetLeaves()) { double leafMass = mass * (leaf->GetVolume(VolumeUnit::mL) / volume_mL); - SELiquidSubstanceQuantity* subQ = leaf->GetSubstanceQuantity(sub); - subQ->GetMass().IncrementValue(leafMass, unit); - if (std::abs(subQ->GetMass(MassUnit::ug)) < ZERO_APPROX) + SELiquidSubstanceQuantity* leafSubQ = leaf->GetSubstanceQuantity(sub); + leafSubQ->GetMass().IncrementValue(leafMass, unit); + if (std::abs(leafSubQ->GetMass(MassUnit::ug)) < ZERO_APPROX) { - subQ->GetMass().SetValue(0.0, MassUnit::ug); + leafSubQ->GetMass().SetValue(0.0, MassUnit::ug); } } } @@ -1231,16 +1227,16 @@ void Tissue::DistributeMassbyMassWeighted(SELiquidCompartment& cmpt, const SESub double mass_ug = subQ->GetMass(MassUnit::ug); for (SELiquidCompartment* leaf : cmpt.GetLeaves()) { - SELiquidSubstanceQuantity* subQ = leaf->GetSubstanceQuantity(sub); + SELiquidSubstanceQuantity* leafSubQ = leaf->GetSubstanceQuantity(sub); double leafMass = 0.0; if (mass_ug != 0.0) { - leafMass = mass * (subQ->GetMass(MassUnit::ug) / mass_ug); + leafMass = mass * (leafSubQ->GetMass(MassUnit::ug) / mass_ug); } - subQ->GetMass().IncrementValue(leafMass, unit); - if (std::abs(subQ->GetMass(MassUnit::ug)) < ZERO_APPROX) + leafSubQ->GetMass().IncrementValue(leafMass, unit); + if (std::abs(leafSubQ->GetMass(MassUnit::ug)) < ZERO_APPROX) { - subQ->GetMass().SetValue(0.0, MassUnit::ug); + leafSubQ->GetMass().SetValue(0.0, MassUnit::ug); } } } @@ -1466,8 +1462,6 @@ double Tissue::MoveMassByInstantDiffusion(SELiquidCompartment& source, SELiquidC const SELiquidSubstanceQuantity* srcQ = source.GetSubstanceQuantity(sub); const SELiquidSubstanceQuantity* tgtQ = target.GetSubstanceQuantity(sub); - double sConc_ug = srcQ->GetMass(MassUnit::ug); - double tConc_ug = tgtQ->GetMass(MassUnit::ug); double sConc_ug_Per_mL = srcQ->GetConcentration(MassPerVolumeUnit::ug_Per_mL); double tConc_ug_Per_mL = tgtQ->GetConcentration(MassPerVolumeUnit::ug_Per_mL); double sVol_mL = source.GetVolume(VolumeUnit::mL);