Skip to content

Commit 0af74de

Browse files
ntatum94StevenAWhite
authored andcommitted
First step in adding burn surface temperature. Still need to add to xsd
1 parent 300674f commit 0af74de

File tree

6 files changed

+65
-0
lines changed

6 files changed

+65
-0
lines changed

projects/biogears/libBiogears/include/biogears/cdm/patient/actions/SEBurnWound.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class BIOGEARS_API SEBurnWound : public SEPatientAction {
5555
bool HasDegreeOfBurn() const;
5656
CDM::enumBurnDegree::value GetDegreeOfBurn() const;
5757
void SetDegreeOfBurn(CDM::enumBurnDegree::value value);
58+
void SEBurnWound::SetTimeOfBurn(SEScalarTime burnTime);
5859

5960
double GetBurnIntensity() const;
6061

@@ -76,6 +77,7 @@ class BIOGEARS_API SEBurnWound : public SEPatientAction {
7677
bool operator!=(const SEBurnWound& rhs) const;
7778

7879
std::vector<double> GetTBSACompartmentDistribution() const;
80+
double SEBurnWound::GetTimeSinceBurn(SEScalarTime currentTime) const;
7981

8082
double getLeftArmSA() const;
8183
double getRightArmSA() const;
@@ -96,6 +98,7 @@ class BIOGEARS_API SEBurnWound : public SEPatientAction {
9698
private:
9799
bool m_Inflammation;
98100
double m_DegreeModifier;
101+
double m_burnInitiationTime;
99102
CDM::enumBurnDegree::value m_DegreeOfBurn;
100103
SEScalar0To1* m_TBSA;
101104
std::vector<SEScalar0To1> m_compartments;

projects/biogears/libBiogears/include/biogears/cdm/system/physiology/SEEnergySystem.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@ class BIOGEARS_API SEEnergySystem : public SESystem {
126126
SEScalarTemperature& GetSkinTemperatureRightLeg();
127127
double GetSkinTemperatureRightLeg(const TemperatureUnit& unit) const;
128128

129+
bool HasBurnSkinTemperature() const;
130+
SEScalarTemperature& GetBurnSkinTemperature();
131+
double GetBurnSkinTemperature(const TemperatureUnit& unit) const;
132+
129133
bool HasSodiumLostToSweat() const;
130134
SEScalarMass& GetSodiumLostToSweat();
131135
double GetSodiumLostToSweat(const MassUnit& unit) const;
@@ -160,6 +164,7 @@ class BIOGEARS_API SEEnergySystem : public SESystem {
160164
SEScalarTemperature* m_SkinTemperatureRightArm;
161165
SEScalarTemperature* m_SkinTemperatureLeftLeg;
162166
SEScalarTemperature* m_SkinTemperatureRightLeg;
167+
SEScalarTemperature* m_BurnSkinTemperature;
163168
SEScalarMass* m_SodiumLostToSweat;
164169
SEScalarMassPerTime* m_SweatRate;
165170
SEScalarPower* m_TotalMetabolicRate;

projects/biogears/libBiogears/src/cdm/patient/actions/SEBurnWound.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ namespace biogears {
1919
SEBurnWound::SEBurnWound()
2020
: SEPatientAction()
2121
, m_DegreeModifier(1.0)
22+
, m_burnInitiationTime(0.0)
2223
, m_TBSA(new SEScalar0To1()) // User input, size of wound measured by total body surface area
2324
, m_compartments(5)
2425
{
@@ -165,6 +166,11 @@ void SEBurnWound::SetDegreeOfBurn(CDM::enumBurnDegree::value bd)
165166
}
166167
}
167168
//-----------------------------------------------------------------------------
169+
void SEBurnWound::SetTimeOfBurn(SEScalarTime burnTime)
170+
{
171+
m_burnInitiationTime = burnTime.GetValue();
172+
}
173+
//-----------------------------------------------------------------------------
168174
double SEBurnWound::GetBurnIntensity() const
169175
{
170176
return m_DegreeModifier * GetTotalBodySurfaceArea();
@@ -373,6 +379,12 @@ std::vector<double> SEBurnWound::GetTBSACompartmentDistribution() const
373379
m_compartments[4].GetValue() };
374380
}
375381
//-------------------------------------------------------------------------------
382+
double SEBurnWound::GetTimeSinceBurn(SEScalarTime currentTime) const
383+
{
384+
385+
return currentTime.GetValue() - m_burnInitiationTime;
386+
}
387+
//-------------------------------------------------------------------------------
376388
double SEBurnWound::getLeftArmSA() const { return m_compartments[0].GetValue(); }
377389
double SEBurnWound::getRightArmSA() const { return m_compartments[1].GetValue(); }
378390
double SEBurnWound::getTrunkSA() const { return m_compartments[2].GetValue(); }

projects/biogears/libBiogears/src/cdm/system/physiology/SEEnergySystem.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ constexpr char idSkinTemperatureLeftArm[] = "SkinTemperatureLeftArm";
4141
constexpr char idSkinTemperatureRightArm[] = "SkinTemperatureRightArm";
4242
constexpr char idSkinTemperatureLeftLeg[] = "SkinTemperatureLeftLeg";
4343
constexpr char idSkinTemperatureRightLeg[] = "SkinTemperatureRightLeg";
44+
constexpr char idBurnSkinTemperature[] = "BurnSkinTemperature";
4445
constexpr char idSodiumLostToSweat[] = "SodiumLostToSweat";
4546
constexpr char idSweatRate[] = "SweatRate";
4647
constexpr char idTotalMetabolicRate[] = "TotalMetabolicRate";
@@ -66,6 +67,7 @@ SEEnergySystem::SEEnergySystem(Logger* logger)
6667
m_SkinTemperatureRightArm = nullptr;
6768
m_SkinTemperatureLeftLeg = nullptr;
6869
m_SkinTemperatureRightLeg = nullptr;
70+
m_BurnSkinTemperature = nullptr;
6971
m_SodiumLostToSweat = nullptr;
7072
m_SweatRate = nullptr;
7173
m_TotalMetabolicRate = nullptr;
@@ -100,6 +102,7 @@ void SEEnergySystem::Clear()
100102
SAFE_DELETE(m_SkinTemperatureRightArm);
101103
SAFE_DELETE(m_SkinTemperatureLeftLeg);
102104
SAFE_DELETE(m_SkinTemperatureRightLeg);
105+
SAFE_DELETE(m_BurnSkinTemperature);
103106
SAFE_DELETE(m_SodiumLostToSweat);
104107
SAFE_DELETE(m_SweatRate);
105108
SAFE_DELETE(m_TotalMetabolicRate);
@@ -146,6 +149,8 @@ const SEScalar* SEEnergySystem::GetScalar(const std::string& name)
146149
return &GetSkinTemperatureLeftLeg();
147150
if (name == idSkinTemperatureRightLeg)
148151
return &GetSkinTemperatureRightLeg();
152+
if (name == idBurnSkinTemperature)
153+
return &GetBurnSkinTemperature();
149154
if (name == idSodiumLostToSweat)
150155
return &GetSodiumLostToSweat();
151156
if (name == idSweatRate)
@@ -196,6 +201,8 @@ bool SEEnergySystem::Load(const CDM::EnergySystemData& in)
196201
GetSkinTemperatureLeftLeg().Load(in.SkinTemperatureLeftLeg().get());
197202
if (in.SkinTemperatureRightLeg().present())
198203
GetSkinTemperatureRightLeg().Load(in.SkinTemperatureRightLeg().get());
204+
if (in.BurnSkinTemperature().present())
205+
GetBurnSkinTemperature().Load(in.BurnSkinTemperature().get());
199206
if (in.SodiumLostToSweat().present())
200207
GetSodiumLostToSweat().Load(in.SodiumLostToSweat().get());
201208
if (in.SweatRate().present())
@@ -255,6 +262,8 @@ void SEEnergySystem::Unload(CDM::EnergySystemData& data) const
255262
data.SkinTemperatureLeftLeg(std::unique_ptr<CDM::ScalarTemperatureData>(m_SkinTemperatureLeftLeg->Unload()));
256263
if (m_SkinTemperatureRightLeg != nullptr)
257264
data.SkinTemperatureRightLeg(std::unique_ptr<CDM::ScalarTemperatureData>(m_SkinTemperatureRightLeg->Unload()));
265+
if (m_BurnSkinTemperature != nullptr)
266+
data.BurnSkinTemperature(std::unique_ptr<CDM::ScalarTemperatureData>(m_BurnSkinTemperature->Unload()));
258267
if (m_SodiumLostToSweat != nullptr)
259268
data.SodiumLostToSweat(std::unique_ptr<CDM::ScalarMassData>(m_SodiumLostToSweat->Unload()));
260269
if (m_SweatRate != nullptr)
@@ -594,6 +603,25 @@ double SEEnergySystem::GetSkinTemperatureRightLeg(const TemperatureUnit& unit) c
594603
return m_SkinTemperatureRightLeg->GetValue(unit);
595604
}
596605
//-------------------------------------------------------------------------------
606+
bool SEEnergySystem::HasBurnSkinTemperature() const
607+
{
608+
return m_BurnSkinTemperature == nullptr ? false : m_BurnSkinTemperature->IsValid();
609+
}
610+
//-------------------------------------------------------------------------------
611+
SEScalarTemperature& SEEnergySystem::GetBurnSkinTemperature()
612+
{
613+
if (m_BurnSkinTemperature == nullptr)
614+
m_BurnSkinTemperature = new SEScalarTemperature();
615+
return *m_BurnSkinTemperature;
616+
}
617+
//-------------------------------------------------------------------------------
618+
double SEEnergySystem::GetBurnSkinTemperature(const TemperatureUnit& unit) const
619+
{
620+
if (m_BurnSkinTemperature == nullptr)
621+
return SEScalar::dNaN();
622+
return m_BurnSkinTemperature->GetValue(unit);
623+
}
624+
//-------------------------------------------------------------------------------
597625
bool SEEnergySystem::HasSodiumLostToSweat() const
598626
{
599627
return m_SodiumLostToSweat == nullptr ? false : m_SodiumLostToSweat->IsValid();
@@ -691,6 +719,7 @@ Tree<const char*> SEEnergySystem::GetPhysiologyRequestGraph() const
691719
.emplace_back(idSkinTemperatureRightArm)
692720
.emplace_back(idSkinTemperatureLeftLeg)
693721
.emplace_back(idSkinTemperatureRightLeg)
722+
.emplace_back(idBurnSkinTemperature)
694723
.emplace_back(idSodiumLostToSweat)
695724
.emplace_back(idSweatRate)
696725
.emplace_back(idTotalMetabolicRate)

projects/biogears/libBiogears/src/engine/Systems/Energy.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ void Energy::Initialize()
110110
GetSkinTemperatureRightArm().SetValue(33.0, TemperatureUnit::C);
111111
GetSkinTemperatureLeftLeg().SetValue(33.0, TemperatureUnit::C);
112112
GetSkinTemperatureRightLeg().SetValue(33.0, TemperatureUnit::C);
113+
GetBurnSkinTemperature().SetValue(33.0, TemperatureUnit::C);
113114
GetSkinTemperature().SetValue(33.0, TemperatureUnit::C);
114115
/// \cite phypers2006lactate
115116
GetLactateProductionRate().SetValue(1.3, AmountPerTimeUnit::mol_Per_day);
@@ -692,6 +693,7 @@ void Energy::UpdateHeatResistance()
692693
segmentedSkinBloodFlows.push_back(6.0 * skinBloodFlow_m3_Per_s * (2.925 / 11.89)); // LLeg
693694
segmentedSkinBloodFlows.push_back(6.0 * skinBloodFlow_m3_Per_s * (2.925 / 11.89)); // RLeg
694695
int index = 0;
696+
bool isAnySegmentBurned = false;
695697
for (SEThermalCircuitPath* coreToSkinPath : m_coreToSkinPaths) {
696698
double bloodDensity_kg_Per_m3 = m_data.GetBloodChemistry().GetBloodDensity().GetValue(MassPerVolumeUnit::kg_Per_m3);
697699
double bloodSpecificHeat_J_Per_K_kg = m_data.GetBloodChemistry().GetBloodSpecificHeat().GetValue(HeatCapacitancePerMassUnit::J_Per_K_kg);
@@ -715,6 +717,7 @@ void Energy::UpdateHeatResistance()
715717
}
716718
}
717719
if (isBurnWound) {
720+
isAnySegmentBurned = true;
718721
const double burnSurfaceAreaFraction = m_data.GetActions().GetPatientActions().GetBurnWound()->GetBurnIntensity();
719722
const double resInput = std::min(2.0 * burnSurfaceAreaFraction, 1.0); // Make >50% burn the worse case scenario
720723
const double targetAlpha = GeneralMath::LinearInterpolator(0.0, resInput, alphaScale, 20.0, resInput);
@@ -733,6 +736,17 @@ void Energy::UpdateHeatResistance()
733736
coreToSkinPath->GetNextResistance().SetValue(coreToSkinResistance_K_Per_W, HeatResistanceUnit::K_Per_W);
734737
index += 1;
735738
}
739+
if (isAnySegmentBurned) {
740+
SEBurnWound* burnAction = m_data.GetActions().GetPatientActions().GetBurnWound();
741+
double timeSinceBurn = burnAction->GetTimeSinceBurn(m_data.GetSimulationTime());
742+
if (timeSinceBurn != 0.0) {
743+
double t = timeSinceBurn;
744+
double burnTemperature = (30.3 * std::exp(-1.0 * std::pow(t - 7.81, 2) / 11.7)) + GetSkinTemperature(TemperatureUnit::C);
745+
GetBurnSkinTemperature().SetValue(burnTemperature, TemperatureUnit::C);
746+
} else {
747+
burnAction->SetTimeOfBurn(m_data.GetSimulationTime());
748+
}
749+
}
736750
}
737751

738752
//--------------------------------------------------------------------------------------------------

share/xsd/cdm/Physiology.xsd

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,8 @@ specific language governing permissions and limitations under the License.
355355
<!--<< @brief The left leg skin surface temperature.-->
356356
<xs:element name="SkinTemperatureRightLeg" type="ScalarTemperatureData" minOccurs="0" maxOccurs="1"/>
357357
<!--<< @brief The right leg skin surface temperature.-->
358+
<xs:element name="BurnSkinTemperature" type="ScalarTemperatureData" minOccurs="0" maxOccurs="1"/>
359+
<!--<< @brief The surface temperature of afflicted burn area.-->
358360
<xs:element name="SweatRate" type="ScalarMassPerTimeData" minOccurs="0" maxOccurs="1"/>
359361
<!--<< @brief Mass of sweat generated per unit time due to elevated core temperature -->
360362
<xs:element name="TotalMetabolicRate" type="ScalarPowerData" minOccurs="0" maxOccurs="1"/>

0 commit comments

Comments
 (0)