From aa8256f1f0924fb642241e76373f167827a23297 Mon Sep 17 00:00:00 2001 From: amirroth Date: Thu, 22 Aug 2024 11:09:24 -0400 Subject: [PATCH] Fix variable absorptance, thermochromic window, and PCM issues --- src/EnergyPlus/DataHeatBalance.hh | 1 - src/EnergyPlus/DataSurfaces.cc | 15 ++++++--------- src/EnergyPlus/HeatBalFiniteDiffManager.cc | 17 +++++++++++++++-- src/EnergyPlus/HeatBalFiniteDiffManager.hh | 3 +++ src/EnergyPlus/HeatBalanceManager.cc | 15 +++++++++++---- .../PhaseChangeModeling/HysteresisModel.cc | 5 +++-- .../PhaseChangeModeling/HysteresisModel.hh | 2 +- 7 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/EnergyPlus/DataHeatBalance.hh b/src/EnergyPlus/DataHeatBalance.hh index ace8c4e559a..45581913d2c 100644 --- a/src/EnergyPlus/DataHeatBalance.hh +++ b/src/EnergyPlus/DataHeatBalance.hh @@ -1792,7 +1792,6 @@ struct HeatBalanceData : BaseGlobalStruct bool AnyKiva = false; // Kiva used bool AnyAirBoundary = false; // Construction:AirBoundary used (implies grouped solar and radiant is present) bool AnyBSDF = false; // True if any WindowModelType == WindowModel:: BSDF - bool AnyVariableAbsorptance = false; // true if any MaterialProperty:VariableAbsorptance is present int MaxNumberOfWarmupDays = 25; // Maximum number of warmup days allowed int MinNumberOfWarmupDays = 1; // Minimum number of warmup days allowed Real64 CondFDRelaxFactor = 1.0; // Relaxation factor, for looping across all the surfaces. diff --git a/src/EnergyPlus/DataSurfaces.cc b/src/EnergyPlus/DataSurfaces.cc index 9a1d640137f..b96e1c5da76 100644 --- a/src/EnergyPlus/DataSurfaces.cc +++ b/src/EnergyPlus/DataSurfaces.cc @@ -730,16 +730,13 @@ Real64 AbsBackSide(EnergyPlusData &state, int SurfNum) void GetVariableAbsorptanceSurfaceList(EnergyPlusData &state) { - if (!state.dataHeatBal->AnyVariableAbsorptance) return; + if (!state.dataMaterial->AnyVariableAbsorptance) return; for (int surfNum : state.dataSurface->AllHTSurfaceList) { auto const &thisSurface = state.dataSurface->Surface(surfNum); - int ConstrNum = thisSurface.Construction; - auto const &thisConstruct = state.dataConstruction->Construct(ConstrNum); - int TotLayers = thisConstruct.TotLayers; - if (TotLayers == 0) continue; - int materNum = thisConstruct.LayerPoint(1); - if (materNum == 0) continue; // error finding material number - auto const *mat = state.dataMaterial->materials(materNum); + auto const &thisConstruct = state.dataConstruction->Construct(thisSurface.Construction); + if (thisConstruct.TotLayers == 0) continue; + if (thisConstruct.LayerPoint(1) == 0) continue; // error finding material number + auto const *mat = state.dataMaterial->materials(thisConstruct.LayerPoint(1)); if (mat->group != Material::Group::Regular) continue; if (mat->absorpVarCtrlSignal != Material::VariableAbsCtrlSignal::Invalid) { @@ -768,7 +765,7 @@ void GetVariableAbsorptanceSurfaceList(EnergyPlusData &state) } } } -} +} // GetVariableAbsorptanceSurfaceList() Compass4 AzimuthToCompass4(Real64 azimuth) { diff --git a/src/EnergyPlus/HeatBalFiniteDiffManager.cc b/src/EnergyPlus/HeatBalFiniteDiffManager.cc index 7466454736f..0625bed5b60 100644 --- a/src/EnergyPlus/HeatBalFiniteDiffManager.cc +++ b/src/EnergyPlus/HeatBalFiniteDiffManager.cc @@ -486,6 +486,9 @@ namespace HeatBalFiniteDiffManager { thisSurface.PhaseChangeState = Material::Phase::Transition; thisSurface.PhaseChangeStateOld = Material::Phase::Transition; thisSurface.PhaseChangeStateOldOld = Material::Phase::Transition; + thisSurface.PhaseChangeStateRep = Material::phaseInts[(int)Material::Phase::Transition]; + thisSurface.PhaseChangeStateOldRep = Material::phaseInts[(int)Material::Phase::Transition]; + thisSurface.PhaseChangeStateOldOldRep = Material::phaseInts[(int)Material::Phase::Transition]; thisSurface.PhaseChangeTemperatureReverse = 50; state.dataMstBal->TempOutsideAirFD(SurfNum) = 0.0; @@ -831,6 +834,9 @@ namespace HeatBalFiniteDiffManager { SurfaceFD(Surf).PhaseChangeState.allocate(TotNodes + 1); SurfaceFD(Surf).PhaseChangeStateOld.allocate(TotNodes + 1); SurfaceFD(Surf).PhaseChangeStateOldOld.allocate(TotNodes + 1); + SurfaceFD(Surf).PhaseChangeStateRep.allocate(TotNodes + 1); + SurfaceFD(Surf).PhaseChangeStateOldRep.allocate(TotNodes + 1); + SurfaceFD(Surf).PhaseChangeStateOldOldRep.allocate(TotNodes + 1); SurfaceFD(Surf).PhaseChangeTemperatureReverse.allocate(TotNodes + 1); SurfaceFD(Surf).condMaterialActuators.allocate(TotLayers); SurfaceFD(Surf).specHeatMaterialActuators.allocate(TotLayers); @@ -866,6 +872,9 @@ namespace HeatBalFiniteDiffManager { SurfaceFD(Surf).PhaseChangeState = Material::Phase::Transition; SurfaceFD(Surf).PhaseChangeStateOld = Material::Phase::Transition; SurfaceFD(Surf).PhaseChangeStateOldOld = Material::Phase::Transition; + SurfaceFD(Surf).PhaseChangeStateRep = Material::phaseInts[(int)Material::Phase::Transition]; + SurfaceFD(Surf).PhaseChangeStateOldRep = Material::phaseInts[(int)Material::Phase::Transition]; + SurfaceFD(Surf).PhaseChangeStateOldOldRep = Material::phaseInts[(int)Material::Phase::Transition]; SurfaceFD(Surf).PhaseChangeTemperatureReverse = 50; SurfaceFD(Surf).condNodeReport = 0.0; SurfaceFD(Surf).specHeatNodeReport = 0.0; @@ -993,14 +1002,14 @@ namespace HeatBalFiniteDiffManager { SetupOutputVariable(state, format("CondFD Phase Change State {}", node), Constant::Units::None, - (int&)SurfaceFD(SurfNum).PhaseChangeState(node), + (int&)SurfaceFD(SurfNum).PhaseChangeStateRep(node), OutputProcessor::TimeStepType::Zone, OutputProcessor::StoreType::Average, state.dataSurface->Surface(SurfNum).Name); SetupOutputVariable(state, format("CondFD Phase Change Previous State {}", node), Constant::Units::None, - (int&)SurfaceFD(SurfNum).PhaseChangeStateOld(node), + (int&)SurfaceFD(SurfNum).PhaseChangeStateOldRep(node), OutputProcessor::TimeStepType::Zone, OutputProcessor::StoreType::Average, state.dataSurface->Surface(SurfNum).Name); @@ -1267,6 +1276,8 @@ namespace HeatBalFiniteDiffManager { surfaceFD.PhaseChangeStateOldOld = surfaceFD.PhaseChangeStateOld; surfaceFD.PhaseChangeStateOld = surfaceFD.PhaseChangeState; + surfaceFD.PhaseChangeStateOldOldRep = surfaceFD.PhaseChangeStateOldRep; + surfaceFD.PhaseChangeStateOldRep = surfaceFD.PhaseChangeStateRep; } // Time Loop //PT solving time steps TempSurfOutTmp = surfaceFD.TDT(1); @@ -2681,6 +2692,8 @@ namespace HeatBalFiniteDiffManager { surfFD.PhaseChangeTemperatureReverse(finiteDifferenceLayerIndex), surfFD.PhaseChangeStateOld(finiteDifferenceLayerIndex), surfFD.PhaseChangeState(finiteDifferenceLayerIndex)); + + surfFD.PhaseChangeStateRep(finiteDifferenceLayerIndex) = Material::phaseInts[(int)surfFD.PhaseChangeState(finiteDifferenceLayerIndex)]; updatedDensity = mat->getDensity(temperaturePrevious); updatedThermalConductivity = mat->getConductivity(temperatureUpdated); } diff --git a/src/EnergyPlus/HeatBalFiniteDiffManager.hh b/src/EnergyPlus/HeatBalFiniteDiffManager.hh index 0748cb57382..39d2a3eab68 100644 --- a/src/EnergyPlus/HeatBalFiniteDiffManager.hh +++ b/src/EnergyPlus/HeatBalFiniteDiffManager.hh @@ -151,6 +151,9 @@ namespace HeatBalFiniteDiffManager { Array1D PhaseChangeState; Array1D PhaseChangeStateOld; Array1D PhaseChangeStateOldOld; + Array1D PhaseChangeStateRep; + Array1D PhaseChangeStateOldRep; + Array1D PhaseChangeStateOldOldRep; Array1D PhaseChangeTemperatureReverse; Array1D condMaterialActuators; Array1D specHeatMaterialActuators; diff --git a/src/EnergyPlus/HeatBalanceManager.cc b/src/EnergyPlus/HeatBalanceManager.cc index 88a8ce962dd..27d432b8b9c 100644 --- a/src/EnergyPlus/HeatBalanceManager.cc +++ b/src/EnergyPlus/HeatBalanceManager.cc @@ -1487,6 +1487,7 @@ namespace HeatBalanceManager { ErrorsFound = true; continue; } else if (mat->group == Material::Group::GlassTCParent) { + ++GlassLayer; // reset layer pointer to the first glazing in the TC GlazingGroup auto const *matGlassTC = dynamic_cast(mat); assert(matGlassTC != nullptr); @@ -5207,6 +5208,10 @@ namespace HeatBalanceManager { constr.numTCChildConstrs = matGlassTC->numMatRefs; constr.TCChildConstrs.allocate(constr.numTCChildConstrs); + // The master thermochromic construction uses the first (i.e., lowest temp) glazing + constr.LayerPoint(constr.TCLayerNum) = matGlassTC->matRefs(1).matNum; + constr.specTemp = matGlassTC->matRefs(1).specTemp; + for (int iTC = 1; iTC <= constr.numTCChildConstrs; ++iTC) { ++NumNewConst; auto &constrNew = state.dataConstruction->Construct(NumNewConst); @@ -5214,13 +5219,15 @@ namespace HeatBalanceManager { constrNew = constr; // This should be a deep copy constrNew.Name = format("{}_TC_{:.0R}", constr.Name, matGlassTC->matRefs(iTC).specTemp); constrNew.LayerPoint(constrNew.TCLayerNum) = matGlassTC->matRefs(iTC).matNum; - - constr.TCChildConstrs(iTC).specTemp = matGlassTC->matRefs(iTC).specTemp; - constr.TCChildConstrs(iTC).constrNum = NumNewConst; - + constrNew.specTemp = matGlassTC->matRefs(iTC).specTemp; + constrNew.isTCWindow = true; constrNew.isTCMaster = false; constrNew.TCMasterConstrNum = Loop; + + constr.TCChildConstrs(iTC).specTemp = matGlassTC->matRefs(iTC).specTemp; + constr.TCChildConstrs(iTC).constrNum = NumNewConst; + } } state.dataHeatBal->TotConstructs = NumNewConst; diff --git a/src/EnergyPlus/PhaseChangeModeling/HysteresisModel.cc b/src/EnergyPlus/PhaseChangeModeling/HysteresisModel.cc index 1f6087a6789..abc0a082473 100644 --- a/src/EnergyPlus/PhaseChangeModeling/HysteresisModel.cc +++ b/src/EnergyPlus/PhaseChangeModeling/HysteresisModel.cc @@ -365,13 +365,13 @@ namespace Material { } if (mat->hasEMPD) { - ShowSevereCustomMessage(state, eoh, format("Material {} already has EMPD properties defined.", mat->Name, s_ipsc->cCurrentModuleObject)); + ShowSevereCustomMessage(state, eoh, format("Material {} already has EMPD properties defined.", mat->Name)); ErrorsFound = true; continue; } if (mat->hasHAMT) { - ShowSevereCustomMessage(state, eoh, format("Material {} already has HAMT properties defined.", mat->Name, s_ipsc->cCurrentModuleObject)); + ShowSevereCustomMessage(state, eoh, format("Material {} already has HAMT properties defined.", mat->Name)); ErrorsFound = true; continue; } @@ -399,6 +399,7 @@ namespace Material { matPC->deltaTempFreezingLow = s_ipsc->rNumericArgs(13); matPC->specHeatTransition = (matPC->specificHeatSolid + matPC->specificHeatLiquid) / 2.0; matPC->CpOld = matPC->specificHeatSolid; + matPC->hasPCM = true; } } diff --git a/src/EnergyPlus/PhaseChangeModeling/HysteresisModel.hh b/src/EnergyPlus/PhaseChangeModeling/HysteresisModel.hh index 79a3aad84be..52238afde94 100644 --- a/src/EnergyPlus/PhaseChangeModeling/HysteresisModel.hh +++ b/src/EnergyPlus/PhaseChangeModeling/HysteresisModel.hh @@ -73,7 +73,7 @@ namespace Material { Num }; - static constexpr std::array stateInts = {-2, -1, 0, 1, 2}; + static constexpr std::array phaseInts = {-2, -1, 0, 1, 2}; struct MaterialPhaseChange : public MaterialBase {