Skip to content

Commit 88d338d

Browse files
ntatum94StevenAWhite
authored andcommitted
Added logic and tuning for the segments
1 parent 27868bb commit 88d338d

File tree

3 files changed

+36
-16
lines changed

3 files changed

+36
-16
lines changed

projects/biogears/libBiogears/src/engine/Controller/BioGears.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5602,54 +5602,54 @@ void BioGears::SetupInternalTemperature()
56025602
SEThermalCircuitNode& TorsoSkin = cIntemperature.CreateNode(BGE::InternalTemperatureNode::InternalTorsoSkin);
56035603
TorsoSkin.GetTemperature().SetValue(33.0, TemperatureUnit::C);
56045604
SEThermalCircuitPath& TorsoSkinToTemperatureGround = cIntemperature.CreatePath(TorsoSkin, Ground, BGE::InternalTemperaturePath::InternalTorsoSkinToTemperatureGround);
5605-
TorsoSkinToTemperatureGround.GetCapacitanceBaseline().SetValue((1.0 - skinMassFraction) * m_Patient->GetWeight(MassUnit::kg) * GetConfiguration().GetBodySpecificHeat(HeatCapacitancePerMassUnit::J_Per_K_kg), HeatCapacitanceUnit::J_Per_K);
5605+
TorsoSkinToTemperatureGround.GetCapacitanceBaseline().SetValue(31.43, HeatCapacitanceUnit::kcal_Per_C);
56065606
TorsoSkin.GetHeatBaseline().SetValue(TorsoSkinToTemperatureGround.GetCapacitanceBaseline().GetValue(HeatCapacitanceUnit::J_Per_K) * TorsoSkin.GetTemperature().GetValue(TemperatureUnit::K), EnergyUnit::J);
56075607

56085608
SEThermalCircuitNode& HeadSkin = cIntemperature.CreateNode(BGE::InternalTemperatureNode::InternalHeadSkin);
56095609
HeadSkin.GetTemperature().SetValue(33.0, TemperatureUnit::C);
56105610
SEThermalCircuitPath& HeadSkinToTemperatureGround = cIntemperature.CreatePath(HeadSkin, Ground, BGE::InternalTemperaturePath::InternalHeadSkinToTemperatureGround);
5611-
HeadSkinToTemperatureGround.GetCapacitanceBaseline().SetValue((1.0 - skinMassFraction) * m_Patient->GetWeight(MassUnit::kg) * GetConfiguration().GetBodySpecificHeat(HeatCapacitancePerMassUnit::J_Per_K_kg), HeatCapacitanceUnit::J_Per_K);
5611+
HeadSkinToTemperatureGround.GetCapacitanceBaseline().SetValue(3.01, HeatCapacitanceUnit::kcal_Per_C);
56125612
HeadSkin.GetHeatBaseline().SetValue(HeadSkinToTemperatureGround.GetCapacitanceBaseline().GetValue(HeatCapacitanceUnit::J_Per_K) * HeadSkin.GetTemperature().GetValue(TemperatureUnit::K), EnergyUnit::J);
56135613

56145614
SEThermalCircuitNode& LeftArmSkin = cIntemperature.CreateNode(BGE::InternalTemperatureNode::InternalLeftArmSkin);
56155615
LeftArmSkin.GetTemperature().SetValue(33.0, TemperatureUnit::C);
56165616
SEThermalCircuitPath& LeftArmSkinToTemperatureGround = cIntemperature.CreatePath(LeftArmSkin, Ground, BGE::InternalTemperaturePath::InternalLeftArmSkinToTemperatureGround);
5617-
LeftArmSkinToTemperatureGround.GetCapacitanceBaseline().SetValue((1.0 - skinMassFraction) * m_Patient->GetWeight(MassUnit::kg) * GetConfiguration().GetBodySpecificHeat(HeatCapacitancePerMassUnit::J_Per_K_kg), HeatCapacitanceUnit::J_Per_K);
5617+
LeftArmSkinToTemperatureGround.GetCapacitanceBaseline().SetValue(5.46, HeatCapacitanceUnit::kcal_Per_C);
56185618
LeftArmSkin.GetHeatBaseline().SetValue(LeftArmSkinToTemperatureGround.GetCapacitanceBaseline().GetValue(HeatCapacitanceUnit::J_Per_K) * LeftArmSkin.GetTemperature().GetValue(TemperatureUnit::K), EnergyUnit::J);
56195619

56205620
SEThermalCircuitNode& RightArmSkin = cIntemperature.CreateNode(BGE::InternalTemperatureNode::InternalRightArmSkin);
56215621
RightArmSkin.GetTemperature().SetValue(33.0, TemperatureUnit::C);
56225622
SEThermalCircuitPath& RightArmSkinToTemperatureGround = cIntemperature.CreatePath(RightArmSkin, Ground, BGE::InternalTemperaturePath::InternalRightArmSkinToTemperatureGround);
5623-
RightArmSkinToTemperatureGround.GetCapacitanceBaseline().SetValue((1.0 - skinMassFraction) * m_Patient->GetWeight(MassUnit::kg) * GetConfiguration().GetBodySpecificHeat(HeatCapacitancePerMassUnit::J_Per_K_kg), HeatCapacitanceUnit::J_Per_K);
5623+
RightArmSkinToTemperatureGround.GetCapacitanceBaseline().SetValue(5.46, HeatCapacitanceUnit::kcal_Per_C);
56245624
RightArmSkin.GetHeatBaseline().SetValue(RightArmSkinToTemperatureGround.GetCapacitanceBaseline().GetValue(HeatCapacitanceUnit::J_Per_K) * RightArmSkin.GetTemperature().GetValue(TemperatureUnit::K), EnergyUnit::J);
56255625

56265626
SEThermalCircuitNode& LeftLegSkin = cIntemperature.CreateNode(BGE::InternalTemperatureNode::InternalLeftLegSkin);
56275627
LeftLegSkin.GetTemperature().SetValue(33.0, TemperatureUnit::C);
56285628
SEThermalCircuitPath& LeftLegSkinToTemperatureGround = cIntemperature.CreatePath(LeftLegSkin, Ground, BGE::InternalTemperaturePath::InternalLeftLegSkinToTemperatureGround);
5629-
LeftLegSkinToTemperatureGround.GetCapacitanceBaseline().SetValue((1.0 - skinMassFraction) * m_Patient->GetWeight(MassUnit::kg) * GetConfiguration().GetBodySpecificHeat(HeatCapacitancePerMassUnit::J_Per_K_kg), HeatCapacitanceUnit::J_Per_K);
5629+
LeftLegSkinToTemperatureGround.GetCapacitanceBaseline().SetValue(15.92, HeatCapacitanceUnit::kcal_Per_C);
56305630
LeftLegSkin.GetHeatBaseline().SetValue(LeftLegSkinToTemperatureGround.GetCapacitanceBaseline().GetValue(HeatCapacitanceUnit::J_Per_K) * LeftLegSkin.GetTemperature().GetValue(TemperatureUnit::K), EnergyUnit::J);
56315631

56325632
SEThermalCircuitNode& RightLegSkin = cIntemperature.CreateNode(BGE::InternalTemperatureNode::InternalRightLegSkin);
56335633
RightLegSkin.GetTemperature().SetValue(33.0, TemperatureUnit::C);
56345634
SEThermalCircuitPath& RightLegSkinToTemperatureGround = cIntemperature.CreatePath(RightLegSkin, Ground, BGE::InternalTemperaturePath::InternalRightLegSkinToTemperatureGround);
5635-
RightLegSkinToTemperatureGround.GetCapacitanceBaseline().SetValue((1.0 - skinMassFraction) * m_Patient->GetWeight(MassUnit::kg) * GetConfiguration().GetBodySpecificHeat(HeatCapacitancePerMassUnit::J_Per_K_kg), HeatCapacitanceUnit::J_Per_K);
5635+
RightLegSkinToTemperatureGround.GetCapacitanceBaseline().SetValue(15.92, HeatCapacitanceUnit::kcal_Per_C);
56365636
RightLegSkin.GetHeatBaseline().SetValue(RightLegSkinToTemperatureGround.GetCapacitanceBaseline().GetValue(HeatCapacitanceUnit::J_Per_K) * RightLegSkin.GetTemperature().GetValue(TemperatureUnit::K), EnergyUnit::J);
56375637

56385638
SEThermalCircuitPath& CoreToTemperatureGround = cIntemperature.CreatePath(Core, Ground, BGE::InternalTemperaturePath::InternalCoreToGround);
56395639
CoreToTemperatureGround.GetCapacitanceBaseline().SetValue((1.0 - skinMassFraction) * m_Patient->GetWeight(MassUnit::kg) * GetConfiguration().GetBodySpecificHeat(HeatCapacitancePerMassUnit::J_Per_K_kg), HeatCapacitanceUnit::J_Per_K);
56405640
Core.GetHeatBaseline().SetValue(CoreToTemperatureGround.GetCapacitanceBaseline().GetValue(HeatCapacitanceUnit::J_Per_K) * Core.GetTemperature().GetValue(TemperatureUnit::K), EnergyUnit::J);
56415641
SEThermalCircuitPath& CoreToTorsoSkin = cIntemperature.CreatePath(Core, TorsoSkin, BGE::InternalTemperaturePath::InternalCoreToInternalTorsoSkin);
5642-
CoreToTorsoSkin.GetResistanceBaseline().SetValue(34.3, HeatResistanceUnit::K_Per_W);
5642+
CoreToTorsoSkin.GetResistanceBaseline().SetValue(0.432, HeatResistanceUnit::C_s_Per_kcal);
56435643
SEThermalCircuitPath& CoreToHeadSkin = cIntemperature.CreatePath(Core, HeadSkin, BGE::InternalTemperaturePath::InternalCoreToInternalHeadSkin);
5644-
CoreToHeadSkin.GetResistanceBaseline().SetValue(34.4, HeatResistanceUnit::K_Per_W);
5644+
CoreToHeadSkin.GetResistanceBaseline().SetValue(0.443, HeatResistanceUnit::C_s_Per_kcal);
56455645
SEThermalCircuitPath& CoreToLeftArmSkin = cIntemperature.CreatePath(Core, LeftArmSkin, BGE::InternalTemperaturePath::InternalCoreToInternalLeftArmSkin);
5646-
CoreToLeftArmSkin.GetResistanceBaseline().SetValue(27.3, HeatResistanceUnit::K_Per_W);
5646+
CoreToLeftArmSkin.GetResistanceBaseline().SetValue(0.605, HeatResistanceUnit::C_s_Per_kcal);
56475647
SEThermalCircuitPath& CoreToRightArmSkin = cIntemperature.CreatePath(Core, RightArmSkin, BGE::InternalTemperaturePath::InternalCoreToInternalRightArmSkin);
5648-
CoreToRightArmSkin.GetResistanceBaseline().SetValue(27.3, HeatResistanceUnit::K_Per_W);
5648+
CoreToRightArmSkin.GetResistanceBaseline().SetValue(0.605, HeatResistanceUnit::C_s_Per_kcal);
56495649
SEThermalCircuitPath& CoreToLeftLegSkin = cIntemperature.CreatePath(Core, LeftLegSkin, BGE::InternalTemperaturePath::InternalCoreToInternalLeftLegSkin);
5650-
CoreToLeftLegSkin.GetResistanceBaseline().SetValue(44.5, HeatResistanceUnit::K_Per_W);
5650+
CoreToLeftLegSkin.GetResistanceBaseline().SetValue(1.423, HeatResistanceUnit::C_s_Per_kcal);
56515651
SEThermalCircuitPath& CoreToRightLegSkin = cIntemperature.CreatePath(Core, RightLegSkin, BGE::InternalTemperaturePath::InternalCoreToInternalRightLegSkin);
5652-
CoreToRightLegSkin.GetResistanceBaseline().SetValue(44.5, HeatResistanceUnit::K_Per_W);
5652+
CoreToRightLegSkin.GetResistanceBaseline().SetValue(1.423, HeatResistanceUnit::C_s_Per_kcal);
56535653

56545654
cIntemperature.SetNextAndCurrentFromBaselines();
56555655
cIntemperature.StateChange();

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -682,29 +682,41 @@ void Energy::CalculateSweatRate()
682682
//--------------------------------------------------------------------------------------------------
683683
void Energy::UpdateHeatResistance()
684684
{
685+
double skinBloodFlow_m3_Per_s = m_data.GetCardiovascular().GetMeanSkinFlow().GetValue(VolumePerTimeUnit::m3_Per_s);
686+
std::vector<double> segmentedSkinBloodFlows;
687+
// mean * 6 compts * compartmental fraction for each segments blood flow
688+
segmentedSkinBloodFlows.push_back(6.0 * skinBloodFlow_m3_Per_s * (220.66 / 302.91)); // Trunk
689+
segmentedSkinBloodFlows.push_back(6.0 * skinBloodFlow_m3_Per_s * (46.69 / 302.91)); // Head
690+
segmentedSkinBloodFlows.push_back(6.0 * skinBloodFlow_m3_Per_s * (5.06 / 302.91)); // LArm
691+
segmentedSkinBloodFlows.push_back(6.0 * skinBloodFlow_m3_Per_s * (5.06 / 302.91)); // RArm
692+
segmentedSkinBloodFlows.push_back(6.0 * skinBloodFlow_m3_Per_s * (12.72 / 302.91)); // LLeg
693+
segmentedSkinBloodFlows.push_back(6.0 * skinBloodFlow_m3_Per_s * (12.72 / 302.91)); // RLeg
694+
int index = 0;
685695
for (SEThermalCircuitPath* coreToSkinPath : m_coreToSkinPaths) {
686-
double skinBloodFlow_m3_Per_s = m_data.GetCardiovascular().GetMeanSkinFlow().GetValue(VolumePerTimeUnit::m3_Per_s);
687696
double bloodDensity_kg_Per_m3 = m_data.GetBloodChemistry().GetBloodDensity().GetValue(MassPerVolumeUnit::kg_Per_m3);
688697
double bloodSpecificHeat_J_Per_K_kg = m_data.GetBloodChemistry().GetBloodSpecificHeat().GetValue(HeatCapacitancePerMassUnit::J_Per_K_kg);
689698

690699
double alphaScale = 0.5; // Scaling factor for convective heat transfer from core to skin (35 seems to be near the upper limit before non-stabilization)
700+
// Rough implementation to correlate burn location to skin location
701+
// ?????????????????????????? Wait until we can merge the burn updates to get better segmentation
691702
if (m_data.GetBloodChemistry().GetInflammatoryResponse().HasInflammationSource(CDM::enumInflammationSource::Burn)) {
692703
const double burnSurfaceAreaFraction = m_data.GetActions().GetPatientActions().GetBurnWound()->GetTotalBodySurfaceArea().GetValue();
693704
const double resInput = std::min(2.0 * burnSurfaceAreaFraction, 1.0); // Make >50% burn the worse case scenario
694705
const double targetAlpha = GeneralMath::LinearInterpolator(0.0, resInput, alphaScale, 20.0, resInput);
695-
const double lastAlpha = 1.0 / (coreToSkinPath->GetResistance(HeatResistanceUnit::K_Per_W) * bloodDensity_kg_Per_m3 * bloodSpecificHeat_J_Per_K_kg * skinBloodFlow_m3_Per_s);
706+
const double lastAlpha = 1.0 / (coreToSkinPath->GetResistance(HeatResistanceUnit::K_Per_W) * bloodDensity_kg_Per_m3 * bloodSpecificHeat_J_Per_K_kg * segmentedSkinBloodFlows[index]);
696707
const double rampGain = 1.0e-5;
697708
alphaScale = lastAlpha + rampGain * (targetAlpha - lastAlpha);
698709
}
699710

700711
// The heat transfer resistance from the core to the skin is inversely proportional to the skin blood flow.
701712
// When skin blood flow increases, then heat transfer resistance decreases leading to more heat transfer from core to skin.
702713
// The opposite occurs for skin blood flow decrease.
703-
double coreToSkinResistance_K_Per_W = 1.0 / (alphaScale * bloodDensity_kg_Per_m3 * bloodSpecificHeat_J_Per_K_kg * skinBloodFlow_m3_Per_s);
714+
double coreToSkinResistance_K_Per_W = 1.0 / (alphaScale * bloodDensity_kg_Per_m3 * bloodSpecificHeat_J_Per_K_kg * segmentedSkinBloodFlows[index]);
704715

705716
coreToSkinResistance_K_Per_W = BLIM(coreToSkinResistance_K_Per_W, 0.0001, 20.0);
706717

707718
coreToSkinPath->GetNextResistance().SetValue(coreToSkinResistance_K_Per_W, HeatResistanceUnit::K_Per_W);
719+
index += 1;
708720
}
709721
}
710722

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -700,6 +700,14 @@ void Environment::CalculateEvaporation()
700700
} else // Air
701701
{
702702
// Calculate the coefficient
703+
std::vector<double> segmentedSkinSurfaceAreaPercents; //Using male values for testing
704+
segmentedSkinSurfaceAreaPercents.push_back(0.36); // Trunk
705+
segmentedSkinSurfaceAreaPercents.push_back(0.07); // Head
706+
segmentedSkinSurfaceAreaPercents.push_back(0.184); // LArm
707+
segmentedSkinSurfaceAreaPercents.push_back(0.184); // RArm
708+
segmentedSkinSurfaceAreaPercents.push_back(0.386); // LLeg
709+
segmentedSkinSurfaceAreaPercents.push_back(0.386); // RLeg
710+
int index = 0;
703711
for (SEThermalCircuitPath* envSkinToGround : m_EnvironmentSkinToGroundPaths) {
704712
double dConvectiveTransferCoefficient_W_Per_m2_K = GetConvectiveHeatTranferCoefficient(HeatConductancePerAreaUnit::W_Per_m2_K);
705713
const double dLewisRelation_K_Per_kPa = 16.5;
@@ -730,7 +738,7 @@ void Environment::CalculateEvaporation()
730738
GetEvaporativeHeatTranferCoefficient().SetValue(dEvaporativeHeatTransferCoefficient_W_Per_m2_kPa, HeatConductancePerAreaUnit::W_Per_m2_K);
731739

732740
double dMaxEvaporativePotential = (1.0 / 1000.0) * (m_dWaterVaporPressureAtSkin_Pa - m_dWaterVaporPressureInAmbientAir_Pa) / (dClothingResistance_m2_kPa_Per_W + 1.0 / (fCl * dEvaporativeHeatTransferCoefficient_W_Per_m2_kPa));
733-
double dSurfaceArea_m2 = m_Patient->GetSkinSurfaceArea(AreaUnit::m2);
741+
double dSurfaceArea_m2 = m_Patient->GetSkinSurfaceArea(AreaUnit::m2) * segmentedSkinSurfaceAreaPercents[index];
734742

735743
double dSweatRate_kgPers = 0.0;
736744
if (m_data.GetEnergy().HasSweatRate()) {

0 commit comments

Comments
 (0)