@@ -1038,6 +1038,24 @@ namespace HeatBalFiniteDiffManager {
10381038 OutputProcessor::Group::Building,
10391039 OutputProcessor::EndUseCat::Heating);
10401040 }
1041+
1042+ // Setup EMS Actuator for Sky LW Radiation Override (per-surface)
1043+ if (state.dataSurface ->Surface (SurfNum).ExtBoundCond == DataSurfaces::ExternalEnvironment) {
1044+ EnergyPlus::SetupEMSActuator (state,
1045+ " CondFD Surface" ,
1046+ state.dataSurface ->Surface (SurfNum).Name ,
1047+ " Sky Longwave Radiation Override" ,
1048+ " [W/m2]" ,
1049+ SurfaceFD (SurfNum).enetActuator .isActuated ,
1050+ SurfaceFD (SurfNum).enetActuator .actuatedValue );
1051+ SetupOutputVariable (state,
1052+ " CondFD EMS Sky Longwave Radiation Override Heat Flux" ,
1053+ Constant::Units::W_m2,
1054+ SurfaceFD (SurfNum).enetActuatorReport ,
1055+ OutputProcessor::TimeStepType::Zone,
1056+ OutputProcessor::StoreType::Average,
1057+ state.dataSurface ->Surface (SurfNum).Name );
1058+ }
10411059 }
10421060
10431061 int TotNodes = ConstructFD (state.dataSurface ->Surface (SurfNum).Construction ).TotNodes ; // Full size nodes, start with outside face.
@@ -1594,6 +1612,8 @@ namespace HeatBalFiniteDiffManager {
15941612
15951613 auto &s_hbfd = state.dataHeatBalFiniteDiffMgr ;
15961614 auto const &surface (state.dataSurface ->Surface (Surf));
1615+ auto &surfaceFD = s_hbfd->SurfaceFD (Surf);
1616+ surfaceFD.enetActuatorReport = surfaceFD.enetActuator .isActuated ? surfaceFD.enetActuator .actuatedValue : 0.0 ;
15971617 int const surface_ExtBoundCond (surface.ExtBoundCond );
15981618
15991619 Real64 Tsky;
@@ -1625,7 +1645,6 @@ namespace HeatBalFiniteDiffManager {
16251645 if (surface_ExtBoundCond == Surf) { // adiabatic surface, PT added since it is not the same as interzone wall
16261646 // as Outside Boundary Condition Object can be left blank.
16271647
1628- auto &surfaceFD = s_hbfd->SurfaceFD (Surf);
16291648 InteriorBCEqns (state,
16301649 Delt,
16311650 NodeIn,
@@ -1699,7 +1718,6 @@ namespace HeatBalFiniteDiffManager {
16991718
17001719 // Boundary Conditions from Simulation for Exterior
17011720 Real64 const hconvo (state.dataMstBal ->HConvExtFD (Surf));
1702-
17031721 Real64 const hrad (state.dataMstBal ->HAirFD (Surf));
17041722 Real64 const hsky (state.dataMstBal ->HSkyFD (Surf));
17051723 Real64 const hgnd (state.dataMstBal ->HGrndFD (Surf));
@@ -1708,6 +1726,11 @@ namespace HeatBalFiniteDiffManager {
17081726 Real64 const Tgnd (Tgndsurface);
17091727 Real64 const Tsurr (TsurrSurface);
17101728
1729+ // Sky longwave radiation actuator and reusable variables
1730+ auto const &enetAct = s_hbfd->SurfaceFD (Surf).enetActuator ;
1731+ Real64 const eHsky = (enetAct.isActuated ) ? 0.0 : hsky;
1732+ Real64 const eHskyTsky = (enetAct.isActuated ) ? enetAct.actuatedValue : hsky * Tsky;
1733+
17111734 if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD) {
17121735
17131736 int const ConstrNum (surface.Construction );
@@ -1724,8 +1747,8 @@ namespace HeatBalFiniteDiffManager {
17241747 if (mat->ROnly || mat->group == Material::Group::AirGap) { // R Layer or Air Layer **********
17251748 // Use algebraic equation for TDT based on R
17261749 Real64 const Rlayer (mat->Resistance );
1727- TDT_i = (TDT_p + (QRadSWOutFD + hgnd * Tgnd + (hconvo + hrad) * Toa + hsky * Tsky + hsurr * Tsurr) * Rlayer) /
1728- (1.0 + (hconvo + hgnd + hrad + hsky + hsurr) * Rlayer);
1750+ TDT_i = (TDT_p + (QRadSWOutFD + hgnd * Tgnd + (hconvo + hrad) * Toa + eHskyTsky + hsurr * Tsurr) * Rlayer) /
1751+ (1.0 + (hconvo + hgnd + hrad + eHsky + hsurr) * Rlayer);
17291752
17301753 } else { // Regular or phase change material layer
17311754
@@ -1793,27 +1816,27 @@ namespace HeatBalFiniteDiffManager {
17931816 if (s_hbfd->CondFDSchemeType == CondFDScheme::CrankNicholsonSecondOrder) { // Second Order equation
17941817 Real64 const Cp_DelX_RhoS_2Delt (Cp * DelX * RhoS / (2.0 * Delt));
17951818 Real64 const kt_2DelX (kt / (2.0 * DelX));
1796- Real64 const hsum (0.5 * (hconvo + hgnd + hrad + hsky + hsurr));
1819+ Real64 const hsum (0.5 * (hconvo + hgnd + hrad + eHsky + hsurr));
17971820 TDT_i = (QRadSWOutFD + Cp_DelX_RhoS_2Delt * TD_i + kt_2DelX * (TDT_p - TD_i + TD (i + 1 )) + hgnd * Tgnd +
1798- (hconvo + hrad) * Toa + hsky * Tsky + hsurr * Tsurr - hsum * TD_i) /
1821+ (hconvo + hrad) * Toa + eHskyTsky + hsurr * Tsurr - hsum * TD_i) /
17991822 (hsum + kt_2DelX + Cp_DelX_RhoS_2Delt);
18001823 } else if (s_hbfd->CondFDSchemeType == CondFDScheme::FullyImplicitFirstOrder) { // First Order
18011824 Real64 const Two_Delt_DelX (2.0 * Delt_DelX);
18021825 Real64 const Cp_DelX2_RhoS (Cp * pow_2 (DelX) * RhoS);
18031826 Real64 const Two_Delt_kt (2.0 * Delt * kt);
1804- TDT_i = (Two_Delt_DelX * (QRadSWOutFD + hgnd * Tgnd + (hconvo + hrad) * Toa + hsky * Tsky + hsurr * Tsurr) +
1827+ TDT_i = (Two_Delt_DelX * (QRadSWOutFD + hgnd * Tgnd + (hconvo + hrad) * Toa + eHskyTsky + hsurr * Tsurr) +
18051828 Cp_DelX2_RhoS * TD_i + Two_Delt_kt * TDT_p) /
1806- (Two_Delt_DelX * (hconvo + hgnd + hrad + hsky + hsurr) + Two_Delt_kt + Cp_DelX2_RhoS);
1829+ (Two_Delt_DelX * (hconvo + hgnd + hrad + eHsky + hsurr) + Two_Delt_kt + Cp_DelX2_RhoS);
18071830 }
18081831
18091832 } else { // HMovInsul > 0.0: Transparent insulation on outside
18101833 // Transparent insulation additions
18111834
18121835 // Movable Insulation Layer Outside surface temp
18131836
1814- Real64 const TInsulOut (
1815- (QRadSWOutMvInsulFD + hgnd * Tgnd + HMovInsul * TDT_i + (hconvo + hrad) * Toa + hsky * Tsky + hsurr * Tsurr) /
1816- (hconvo + hgnd + HMovInsul + hrad + hsky + hsurr)); // Temperature of outside face of Outside Insulation
1837+ Real64 const TInsulOut =
1838+ (QRadSWOutMvInsulFD + hgnd * Tgnd + HMovInsul * TDT_i + (hconvo + hrad) * Toa + eHskyTsky + hsurr * Tsurr) /
1839+ (hconvo + hgnd + HMovInsul + hrad + eHsky + hsurr);
18171840 Real64 const Two_Delt_DelX (2.0 * Delt_DelX);
18181841 Real64 const Cp_DelX2_RhoS (Cp * pow_2 (DelX) * RhoS);
18191842 Real64 const Two_Delt_kt (2.0 * Delt * kt);
@@ -1844,15 +1867,15 @@ namespace HeatBalFiniteDiffManager {
18441867 // One formulation that works for Fully Implicit and CrankNicholson and massless wall
18451868
18461869 Real64 const Toa_TDT_i (Toa - TDT_i);
1847- Real64 const QNetSurfFromOutside (
1848- QRadSWOutFD + (hgnd * (-TDT_i + Tgnd) + (hconvo + hrad) * Toa_TDT_i + hsky * (- TDT_i + Tsky) + hsurr * (-TDT_i + Tsurr) ));
1870+ Real64 const QNetSurfFromOutside =
1871+ QRadSWOutFD + (hgnd * (-TDT_i + Tgnd) + (hconvo + hrad) * Toa_TDT_i - eHsky * TDT_i + eHskyTsky + hsurr * (-TDT_i + Tsurr));
18491872
18501873 // Same sign convention as CTFs
18511874 state.dataHeatBalSurf ->SurfOpaqOutFaceCondFlux (Surf) = -QNetSurfFromOutside;
18521875
18531876 // Report all outside BC heat fluxes
18541877 state.dataHeatBalSurf ->SurfQdotRadOutRepPerArea (Surf) =
1855- -(hgnd * (TDT_i - Tgnd) + hrad * (-Toa_TDT_i) + hsky * ( TDT_i - Tsky) + hsurr * (TDT_i - Tsurr));
1878+ -(hgnd * (TDT_i - Tgnd) + hrad * (-Toa_TDT_i) + eHsky * TDT_i - eHskyTsky + hsurr * (TDT_i - Tsurr));
18561879 state.dataHeatBalSurf ->SurfQdotRadOutRep (Surf) = surface.Area * state.dataHeatBalSurf ->SurfQdotRadOutRepPerArea (Surf);
18571880 state.dataHeatBalSurf ->SurfQRadOutReport (Surf) = state.dataHeatBalSurf ->SurfQdotRadOutRep (Surf) * state.dataGlobal ->TimeStepZoneSec ;
18581881
0 commit comments