LCOV - code coverage report
Current view: top level - EnergyPlus - HeatBalanceSurfaceManager.cc (source / functions) Hit Total Coverage
Test: lcov.output.filtered Lines: 4400 5606 78.5 %
Date: 2023-01-17 19:17:23 Functions: 42 47 89.4 %

          Line data    Source code
       1             : // EnergyPlus, Copyright (c) 1996-2023, The Board of Trustees of the University of Illinois,
       2             : // The Regents of the University of California, through Lawrence Berkeley National Laboratory
       3             : // (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge
       4             : // National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other
       5             : // contributors. All rights reserved.
       6             : //
       7             : // NOTICE: This Software was developed under funding from the U.S. Department of Energy and the
       8             : // U.S. Government consequently retains certain rights. As such, the U.S. Government has been
       9             : // granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable,
      10             : // worldwide license in the Software to reproduce, distribute copies to the public, prepare
      11             : // derivative works, and perform publicly and display publicly, and to permit others to do so.
      12             : //
      13             : // Redistribution and use in source and binary forms, with or without modification, are permitted
      14             : // provided that the following conditions are met:
      15             : //
      16             : // (1) Redistributions of source code must retain the above copyright notice, this list of
      17             : //     conditions and the following disclaimer.
      18             : //
      19             : // (2) Redistributions in binary form must reproduce the above copyright notice, this list of
      20             : //     conditions and the following disclaimer in the documentation and/or other materials
      21             : //     provided with the distribution.
      22             : //
      23             : // (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory,
      24             : //     the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be
      25             : //     used to endorse or promote products derived from this software without specific prior
      26             : //     written permission.
      27             : //
      28             : // (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form
      29             : //     without changes from the version obtained under this License, or (ii) Licensee makes a
      30             : //     reference solely to the software portion of its product, Licensee must refer to the
      31             : //     software as "EnergyPlus version X" software, where "X" is the version number Licensee
      32             : //     obtained under this License and may not use a different name for the software. Except as
      33             : //     specifically required in this Section (4), Licensee shall not use in a company name, a
      34             : //     product name, in advertising, publicity, or other promotional activities any name, trade
      35             : //     name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly
      36             : //     similar designation, without the U.S. Department of Energy's prior written consent.
      37             : //
      38             : // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
      39             : // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
      40             : // AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
      41             : // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
      42             : // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
      43             : // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
      44             : // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
      45             : // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
      46             : // POSSIBILITY OF SUCH DAMAGE.
      47             : 
      48             : // C++ Headers
      49             : #include <algorithm>
      50             : #include <cassert>
      51             : #include <cmath>
      52             : // ObjexxFCL Headers
      53             : #include <ObjexxFCL/Array.functions.hh>
      54             : #include <ObjexxFCL/Array1D.hh>
      55             : #include <ObjexxFCL/Array2D.hh>
      56             : #include <ObjexxFCL/Fmath.hh>
      57             : #include <ObjexxFCL/string.functions.hh>
      58             : 
      59             : // EnergyPlus Headers
      60             : #include <AirflowNetwork/Solver.hpp>
      61             : #include <EnergyPlus/ChilledCeilingPanelSimple.hh>
      62             : #include <EnergyPlus/Construction.hh>
      63             : #include <EnergyPlus/ConvectionCoefficients.hh>
      64             : #include <EnergyPlus/Data/EnergyPlusData.hh>
      65             : #include <EnergyPlus/DataContaminantBalance.hh>
      66             : #include <EnergyPlus/DataDaylighting.hh>
      67             : #include <EnergyPlus/DataDaylightingDevices.hh>
      68             : #include <EnergyPlus/DataEnvironment.hh>
      69             : #include <EnergyPlus/DataHeatBalFanSys.hh>
      70             : #include <EnergyPlus/DataHeatBalSurface.hh>
      71             : #include <EnergyPlus/DataHeatBalance.hh>
      72             : #include <EnergyPlus/DataLoopNode.hh>
      73             : #include <EnergyPlus/DataMoistureBalance.hh>
      74             : #include <EnergyPlus/DataMoistureBalanceEMPD.hh>
      75             : #include <EnergyPlus/DataRoomAirModel.hh>
      76             : #include <EnergyPlus/DataRuntimeLanguage.hh>
      77             : #include <EnergyPlus/DataSizing.hh>
      78             : #include <EnergyPlus/DataSurfaces.hh>
      79             : #include <EnergyPlus/DataSystemVariables.hh>
      80             : #include <EnergyPlus/DataViewFactorInformation.hh>
      81             : #include <EnergyPlus/DataWindowEquivalentLayer.hh>
      82             : #include <EnergyPlus/DataZoneEquipment.hh>
      83             : #include <EnergyPlus/DaylightingDevices.hh>
      84             : #include <EnergyPlus/DaylightingManager.hh>
      85             : #include <EnergyPlus/DisplayRoutines.hh>
      86             : #include <EnergyPlus/EcoRoofManager.hh>
      87             : #include <EnergyPlus/ElectricBaseboardRadiator.hh>
      88             : #include <EnergyPlus/FileSystem.hh>
      89             : #include <EnergyPlus/General.hh>
      90             : #include <EnergyPlus/GeneralRoutines.hh>
      91             : #include <EnergyPlus/HWBaseboardRadiator.hh>
      92             : #include <EnergyPlus/HeatBalFiniteDiffManager.hh>
      93             : #include <EnergyPlus/HeatBalanceAirManager.hh>
      94             : #include <EnergyPlus/HeatBalanceHAMTManager.hh>
      95             : #include <EnergyPlus/HeatBalanceIntRadExchange.hh>
      96             : #include <EnergyPlus/HeatBalanceKivaManager.hh>
      97             : #include <EnergyPlus/HeatBalanceSurfaceManager.hh>
      98             : #include <EnergyPlus/HighTempRadiantSystem.hh>
      99             : #include <EnergyPlus/InputProcessing/InputProcessor.hh>
     100             : #include <EnergyPlus/InternalHeatGains.hh>
     101             : #include <EnergyPlus/LowTempRadiantSystem.hh>
     102             : #include <EnergyPlus/MoistureBalanceEMPDManager.hh>
     103             : #include <EnergyPlus/OutputProcessor.hh>
     104             : #include <EnergyPlus/OutputReportPredefined.hh>
     105             : #include <EnergyPlus/OutputReportTabular.hh>
     106             : #include <EnergyPlus/Psychrometrics.hh>
     107             : #include <EnergyPlus/ScheduleManager.hh>
     108             : #include <EnergyPlus/SolarShading.hh>
     109             : #include <EnergyPlus/SteamBaseboardRadiator.hh>
     110             : #include <EnergyPlus/SurfaceGeometry.hh>
     111             : #include <EnergyPlus/SwimmingPool.hh>
     112             : #include <EnergyPlus/ThermalComfort.hh>
     113             : #include <EnergyPlus/UtilityRoutines.hh>
     114             : #include <EnergyPlus/WindowComplexManager.hh>
     115             : #include <EnergyPlus/WindowEquivalentLayer.hh>
     116             : #include <EnergyPlus/WindowManager.hh>
     117             : #include <EnergyPlus/WindowManagerExteriorData.hh>
     118             : #include <EnergyPlus/WindowManagerExteriorThermal.hh>
     119             : #include <EnergyPlus/ZoneTempPredictorCorrector.hh>
     120             : #include <WCECommon.hpp>
     121             : #include <WCEMultiLayerOptics.hpp>
     122             : #include <WCESingleLayerOptics.hpp>
     123             : #include <WCETarcog.hpp>
     124             : 
     125             : namespace EnergyPlus::HeatBalanceSurfaceManager {
     126             : 
     127             : // Module containing the routines dealing with the Heat Balance of the surfaces
     128             : 
     129             : // MODULE INFORMATION:
     130             : //       AUTHOR
     131             : //       DATE WRITTEN
     132             : //       MODIFIED       DJS (PSU Dec 2006) to add ecoroof
     133             : //       RE-ENGINEERED  na
     134             : 
     135             : // PURPOSE OF THIS MODULE:
     136             : // To encapsulate the data and algorithms required to
     137             : // manage the simluation of the surface heat balance for the building.
     138             : 
     139             : // METHODOLOGY EMPLOYED:
     140             : // na
     141             : 
     142             : // REFERENCES:
     143             : // The heat balance method is outlined in the "TARP Reference Manual", NIST, NBSIR 83-2655, Feb 1983.
     144             : // The methods are also summarized in many BSO Theses and papers.
     145             : 
     146             : // OTHER NOTES:
     147             : // This module was created from IBLAST subroutines
     148             : 
     149             : // USE STATEMENTS:
     150             : // Use statements for data only modules
     151             : // Using/Aliasing
     152             : using namespace DataEnvironment;
     153             : using namespace DataHeatBalance;
     154             : using namespace DataHeatBalSurface;
     155             : using namespace DataSurfaces;
     156             : 
     157             : // Use statements for access to subroutines in other modules
     158             : using namespace ScheduleManager;
     159             : using namespace SolarShading;
     160             : using namespace WindowManager;
     161             : using namespace FenestrationCommon;
     162             : using namespace SingleLayerOptics;
     163             : using namespace MultiLayerOptics;
     164             : 
     165             : // These are now external subroutines
     166             : // PUBLIC  CalcHeatBalanceOutsideSurf  ! The heat balance routines are now public because the
     167             : // PUBLIC  CalcHeatBalanceInsideSurf   ! radiant systems need access to them in order to simulate
     168             : 
     169     2568313 : void ManageSurfaceHeatBalance(EnergyPlusData &state)
     170             : {
     171             : 
     172             :     // SUBROUTINE INFORMATION:
     173             :     //       AUTHOR         Richard Liesen
     174             :     //       DATE WRITTEN   January 1998
     175             :     //       MODIFIED       na
     176             :     //       RE-ENGINEERED  na
     177             : 
     178             :     // PURPOSE OF THIS SUBROUTINE:
     179             :     // This subroutine manages the heat surface balance method of calculating
     180             :     // building thermal loads.  It is called from the HeatBalanceManager
     181             :     // at the time step level.  This driver manages the calls to all of
     182             :     // the other drivers and simulation algorithms.
     183             : 
     184             :     using HeatBalanceAirManager::ManageAirHeatBalance;
     185             :     using OutputReportTabular::GatherComponentLoadsSurface; // for writing tabular component loads output reports
     186             :     using ThermalComfort::ManageThermalComfort;
     187             : 
     188     2568313 :     auto &Surface(state.dataSurface->Surface);
     189             : 
     190     2568313 :     if (state.dataHeatBalSurfMgr->ManageSurfaceHeatBalancefirstTime) DisplayString(state, "Initializing Surfaces");
     191     2568313 :     InitSurfaceHeatBalance(state); // Initialize all heat balance related parameters
     192             : 
     193             :     // Solve the zone heat balance 'Detailed' solution
     194             :     // Call the outside and inside surface heat balances
     195     2568313 :     if (state.dataHeatBalSurfMgr->ManageSurfaceHeatBalancefirstTime) DisplayString(state, "Calculate Outside Surface Heat Balance");
     196     2568313 :     CalcHeatBalanceOutsideSurf(state);
     197     2568313 :     if (state.dataHeatBalSurfMgr->ManageSurfaceHeatBalancefirstTime) DisplayString(state, "Calculate Inside Surface Heat Balance");
     198     2568313 :     CalcHeatBalanceInsideSurf(state);
     199             : 
     200             :     // The air heat balance must be called before the temperature history
     201             :     // updates because there may be a radiant system in the building
     202     2568313 :     if (state.dataHeatBalSurfMgr->ManageSurfaceHeatBalancefirstTime) DisplayString(state, "Calculate Air Heat Balance");
     203     2568313 :     ManageAirHeatBalance(state);
     204             : 
     205             :     // IF NECESSARY, do one final "average" heat balance pass.  This is only
     206             :     // necessary if a radiant system is present and it was actually on for
     207             :     // part or all of the time step.
     208     2568313 :     UpdateFinalSurfaceHeatBalance(state);
     209             : 
     210             :     // Before we leave the Surface Manager the thermal histories need to be updated
     211     2568313 :     if (state.dataHeatBal->AnyCTF || state.dataHeatBal->AnyEMPD) {
     212     2417443 :         UpdateThermalHistories(state); // Update the thermal histories
     213             :     }
     214             : 
     215     2568313 :     if (state.dataHeatBal->AnyCondFD) {
     216     1759149 :         for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
     217     1625106 :             int const ConstrNum = Surface(SurfNum).Construction;
     218     1625106 :             if (ConstrNum <= 0) continue;                                            // Shading surface, not really a heat transfer surface
     219     1625106 :             if (state.dataConstruction->Construct(ConstrNum).TypeIsWindow) continue; //  Windows simulated in Window module
     220     1557822 :             if (Surface(SurfNum).HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::CondFD) continue;
     221     1507392 :             state.dataHeatBalFiniteDiffMgr->SurfaceFD(SurfNum).UpdateMoistureBalance();
     222             :         }
     223             :     }
     224             : 
     225     2568313 :     ManageThermalComfort(state, false); // "Record keeping" for the zone
     226             : 
     227     2568313 :     ReportSurfaceHeatBalance(state);
     228     2568313 :     if (state.dataGlobal->ZoneSizingCalc) GatherComponentLoadsSurface(state);
     229             : 
     230     2568313 :     CalcThermalResilience(state);
     231             : 
     232     2568313 :     if (state.dataOutRptTab->displayThermalResilienceSummary) {
     233      942558 :         ReportThermalResilience(state);
     234             :     }
     235             : 
     236     2568313 :     if (state.dataOutRptTab->displayCO2ResilienceSummary) {
     237       17922 :         ReportCO2Resilience(state);
     238             :     }
     239             : 
     240     2568313 :     if (state.dataOutRptTab->displayVisualResilienceSummary) {
     241       90411 :         ReportVisualResilience(state);
     242             :     }
     243             : 
     244     2568313 :     state.dataHeatBalSurfMgr->ManageSurfaceHeatBalancefirstTime = false;
     245     2568313 : }
     246             : 
     247             : // Beginning Initialization Section of the Module
     248             : //******************************************************************************
     249             : 
     250     2568509 : void InitSurfaceHeatBalance(EnergyPlusData &state)
     251             : {
     252             : 
     253             :     // SUBROUTINE INFORMATION:
     254             :     //       AUTHOR         Richard J. Liesen
     255             :     //       DATE WRITTEN   January 1998
     256             :     //       MODIFIED       Nov. 1999, FCW,
     257             :     //                      Move ComputeIntThermalAbsorpFactors
     258             :     //                      so called every timestep
     259             :     //       MODIFIED       Aug. 2017
     260             :     //                      Add initializations of surface data to linked air node value if defined
     261             : 
     262             :     // PURPOSE OF THIS SUBROUTINE:
     263             :     // This subroutine is for surface initializations within the
     264             :     // heat balance.
     265             : 
     266             :     // METHODOLOGY EMPLOYED:
     267             :     // Uses the status flags to trigger record keeping events.
     268             : 
     269             :     // Using/Aliasing
     270             :     using namespace SolarShading;
     271             :     using ConvectionCoefficients::InitInteriorConvectionCoeffs;
     272             :     using HeatBalanceIntRadExchange::CalcInteriorRadExchange;
     273             :     using HeatBalFiniteDiffManager::InitHeatBalFiniteDiff;
     274             :     using InternalHeatGains::ManageInternalHeatGains;
     275             : 
     276     2568509 :     auto &Surface(state.dataSurface->Surface);
     277             : 
     278     2568509 :     if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) DisplayString(state, "Initializing Outdoor environment for Surfaces");
     279             : 
     280             :     // set zone level wind dir to global value
     281             :     // Initialize zone outdoor environmental variables
     282             :     // Bulk Initialization for Temperatures & WindSpeed
     283             :     // using the zone, modify the zone  Dry/Wet BulbTemps
     284             : 
     285             :     //  DO ZoneNum = 1, NumOfZones
     286             :     //    Zone(ZoneNum)%WindSpeed = WindSpeedAt(Zone(ZoneNum)%Centroid%z)
     287             :     //  END DO
     288             : 
     289             :     // Initialize surface outdoor environmental variables
     290             :     // Bulk Initialization for Temperatures & WindSpeed
     291             :     // using the surface centroids, modify the surface Dry/Wet BulbTemps
     292     2568509 :     SetSurfaceOutBulbTempAt(state);
     293     2568509 :     CheckSurfaceOutBulbTempAt(state);
     294             : 
     295     2568509 :     SetSurfaceWindSpeedAt(state);
     296     2568509 :     SetSurfaceWindDirAt(state);
     297             :     //  DO SurfNum = 1, TotSurfaces
     298             :     //    IF (Surface(SurfNum)%ExtWind) Surface(SurfNum)%WindSpeed = WindSpeedAt(Surface(SurfNum)%Centroid%z)
     299             :     //  END DO
     300     2568509 :     if (state.dataGlobal->AnyLocalEnvironmentsInModel) {
     301      620862 :         for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
     302      613426 :             if (state.dataSurface->Surface(SurfNum).SurfLinkedOutAirNode > 0) {
     303        2706 :                 auto &linkedNode = state.dataLoopNodes->Node(state.dataSurface->Surface(SurfNum).SurfLinkedOutAirNode);
     304        2706 :                 state.dataSurface->SurfOutDryBulbTemp(SurfNum) = linkedNode.OutAirDryBulb;
     305        2706 :                 state.dataSurface->SurfOutWetBulbTemp(SurfNum) = linkedNode.OutAirWetBulb;
     306        2706 :                 state.dataSurface->SurfOutWindSpeed(SurfNum) = linkedNode.OutAirWindSpeed;
     307        2706 :                 state.dataSurface->SurfOutWindDir(SurfNum) = linkedNode.OutAirWindDir;
     308             :             }
     309             :         }
     310             :     }
     311             :     // Overwriting surface and zone level environmental data with EMS override value
     312     2568509 :     if (state.dataGlobal->AnyEnergyManagementSystemInModel) {
     313    38237398 :         for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
     314    37956507 :             if (state.dataSurface->SurfOutDryBulbTempEMSOverrideOn(SurfNum)) {
     315           0 :                 state.dataSurface->SurfOutDryBulbTemp(SurfNum) = state.dataSurface->SurfOutDryBulbTempEMSOverrideValue(SurfNum);
     316             :             }
     317    37956507 :             if (state.dataSurface->SurfOutWetBulbTempEMSOverrideOn(SurfNum)) {
     318           0 :                 state.dataSurface->SurfOutWetBulbTemp(SurfNum) = state.dataSurface->SurfOutWetBulbTempEMSOverrideValue(SurfNum);
     319             :             }
     320    37956507 :             if (state.dataSurface->SurfWindSpeedEMSOverrideOn(SurfNum)) {
     321           0 :                 state.dataSurface->SurfOutWindSpeed(SurfNum) = state.dataSurface->SurfWindSpeedEMSOverrideValue(SurfNum);
     322             :             }
     323    37956507 :             if (state.dataSurface->SurfWindDirEMSOverrideOn(SurfNum)) {
     324           0 :                 state.dataSurface->SurfOutWindDir(SurfNum) = state.dataSurface->SurfWindDirEMSOverrideValue(SurfNum);
     325             :             }
     326    37956507 :             if (state.dataSurface->SurfViewFactorGroundEMSOverrideOn(SurfNum)) {
     327           0 :                 Surface(SurfNum).ViewFactorGround = state.dataSurface->SurfViewFactorGroundEMSOverrideValue(SurfNum);
     328             :             }
     329             :         }
     330             :     }
     331             : 
     332             :     // Do the Begin Simulation initializations
     333     2568509 :     if (state.dataGlobal->BeginSimFlag) {
     334         771 :         AllocateSurfaceHeatBalArrays(state); // Allocate the Module Arrays before any inits take place
     335         771 :         state.dataHeatBalSurf->InterZoneWindow =
     336        1542 :             std::any_of(state.dataViewFactor->EnclSolInfo.begin(),
     337        1542 :                         state.dataViewFactor->EnclSolInfo.end(),
     338        4810 :                         [](DataViewFactorInformation::EnclosureViewFactorInformation const &e) { return e.HasInterZoneWindow; });
     339             :     }
     340     2568509 :     if (state.dataGlobal->BeginSimFlag || state.dataGlobal->AnySurfPropOverridesInModel) {
     341        5585 :         for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
     342        9632 :             for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
     343        4818 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
     344        4818 :                 int const firstSurf = thisSpace.HTSurfaceFirst;
     345        4818 :                 int const lastSurf = thisSpace.HTSurfaceLast;
     346       47024 :                 for (int SurfNum = firstSurf; SurfNum <= lastSurf; ++SurfNum) {
     347       42206 :                     int ConstrNum = state.dataSurface->SurfActiveConstruction(SurfNum); // SurfActiveConstruction set above
     348       42206 :                     state.dataHeatBalSurf->SurfAbsSolarInt(SurfNum) = state.dataConstruction->Construct(ConstrNum).InsideAbsorpSolar;
     349       42206 :                     state.dataHeatBalSurf->SurfAbsThermalInt(SurfNum) = state.dataConstruction->Construct(ConstrNum).InsideAbsorpThermal;
     350       42206 :                     state.dataHeatBalSurf->SurfRoughnessExt(SurfNum) = state.dataConstruction->Construct(ConstrNum).OutsideRoughness;
     351       42206 :                     state.dataHeatBalSurf->SurfAbsSolarExt(SurfNum) = state.dataConstruction->Construct(ConstrNum).OutsideAbsorpSolar;
     352       42206 :                     state.dataHeatBalSurf->SurfAbsThermalExt(SurfNum) = state.dataConstruction->Construct(ConstrNum).OutsideAbsorpThermal;
     353             :                 }
     354             :             }
     355             :         }
     356             :     }
     357             : 
     358             :     // Do the Begin Environment initializations
     359     2568509 :     if (state.dataGlobal->BeginEnvrnFlag) {
     360        6218 :         if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) DisplayString(state, "Initializing Temperature and Flux Histories");
     361        6218 :         InitThermalAndFluxHistories(state); // Set initial temperature and flux histories
     362             :     }
     363             : 
     364             :     // Calc movable insulation properties
     365     2568509 :     if (state.dataSurface->AnyMovableInsulation) {
     366       10122 :         EvalOutsideMovableInsulation(state);
     367       10122 :         EvalInsideMovableInsulation(state);
     368             :     }
     369             : 
     370             :     // There are no daily initializations done in this portion of the surface heat balance
     371             : 
     372             :     // There are no hourly initializations done in this portion of the surface heat balance
     373             : 
     374     2568509 :     GetGroundSurfacesReflectanceAverage(state);
     375             : 
     376             :     // Need to be called each timestep in order to check if surface points to new construction (EMS) and if does then
     377             :     // complex fenestration needs to be initialized for additional states
     378     2568509 :     TimestepInitComplexFenestration(state);
     379             : 
     380             :     // Calculate exterior-surface multipliers that account for anisotropy of
     381             :     // sky radiance
     382     2568509 :     if (state.dataEnvrn->SunIsUp && state.dataEnvrn->DifSolarRad > 0.0) {
     383      821926 :         AnisoSkyViewFactors(state);
     384             :     } else {
     385     1746583 :         state.dataSolarShading->SurfAnisoSkyMult = 0.0;
     386             :     }
     387             : 
     388             :     // Set shading flag for exterior windows (except flags related to daylighting) and
     389             :     // window construction (unshaded or shaded) to be used in heat balance calculation
     390     2568509 :     if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) DisplayString(state, "Initializing Window Shading");
     391             : 
     392     2568509 :     WindowShadingManager(state);
     393             : 
     394     2568509 :     CheckGlazingShadingStatusChange(state);
     395             : 
     396             :     // Calculate factors that are used to determine how much long-wave radiation from internal
     397             :     // gains is absorbed by interior surfaces
     398     2568509 :     if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) DisplayString(state, "Computing Interior Absorption Factors");
     399     2568509 :     if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) HeatBalanceIntRadExchange::InitInteriorRadExchange(state);
     400     2568509 :     ComputeIntThermalAbsorpFactors(state);
     401             : 
     402             :     // Calculate factors for diffuse solar absorbed by room surfaces and interior shades
     403     2568509 :     if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) DisplayString(state, "Computing Interior Diffuse Solar Absorption Factors");
     404     2568509 :     ComputeIntSWAbsorpFactors(state);
     405             : 
     406     2568509 :     if (state.dataHeatBalSurf->InterZoneWindow) {
     407       12147 :         if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) {
     408           6 :             DisplayString(state, "Computing Interior Diffuse Solar Exchange through Interzone Windows");
     409             :         }
     410       12147 :         ComputeDifSolExcZonesWIZWindows(state, state.dataGlobal->NumOfZones);
     411             :     }
     412             : 
     413     2568509 :     DaylightingManager::initDaylighting(state, state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime);
     414             : 
     415     2568509 :     CalcInteriorRadExchange(state, state.dataHeatBalSurf->SurfInsideTempHist(1), 0, state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea, _, "Main");
     416             : 
     417     2568509 :     if (state.dataSurface->AirflowWindows) WindowGapAirflowControl(state);
     418             : 
     419             :     // The order of these initializations is important currently.  Over time we hope to
     420             :     //  take the appropriate parts of these inits to the other heat balance managers
     421     2568509 :     if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) DisplayString(state, "Initializing Solar Heat Gains");
     422             : 
     423     2568509 :     InitSolarHeatGains(state);
     424             : 
     425     2568509 :     DaylightingManager::manageDaylighting(state);
     426             : 
     427     2568509 :     if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) DisplayString(state, "Initializing Internal Heat Gains");
     428     2568509 :     ManageInternalHeatGains(state, false);
     429     2568509 :     if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) DisplayString(state, "Initializing Interior Solar Distribution");
     430     2568509 :     InitIntSolarDistribution(state);
     431             : 
     432     2568509 :     if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) DisplayString(state, "Initializing Interior Convection Coefficients");
     433     2568509 :     InitInteriorConvectionCoeffs(state, state.dataHeatBalSurf->SurfTempInTmp);
     434             : 
     435     2568509 :     if (state.dataGlobal->BeginSimFlag) { // Now's the time to report surfaces, if desired
     436             :         //    if (firstTime) CALL DisplayString('Reporting Surfaces')
     437             :         //    CALL ReportSurfaces
     438         771 :         if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) DisplayString(state, "Gathering Information for Predefined Reporting");
     439         771 :         GatherForPredefinedReport(state);
     440             :     }
     441             : 
     442             :     // Initialize the temperature history terms for conduction through the surfaces
     443     2568509 :     if (state.dataHeatBal->AnyCondFD) {
     444      134043 :         InitHeatBalFiniteDiff(state);
     445             :     }
     446             : 
     447    21015074 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { // Loop through all surfaces...
     448    36909306 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
     449    18462741 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
     450    18462741 :             int const firstSurfOpaque = thisSpace.OpaqOrIntMassSurfaceFirst;
     451    18462741 :             int const lastSurfOpaque = thisSpace.OpaqOrIntMassSurfaceLast;
     452   156163195 :             for (int SurfNum = firstSurfOpaque; SurfNum <= lastSurfOpaque; ++SurfNum) {
     453   137700454 :                 auto const &surface(Surface(SurfNum));
     454   139630006 :                 if (surface.HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::CTF &&
     455     1929552 :                     surface.HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::EMPD)
     456     1779534 :                     continue;
     457             :                 // Outside surface temp of "normal" windows not needed in Window5 calculation approach
     458             :                 // Window layer temperatures are calculated in CalcHeatBalanceInsideSurf
     459             : 
     460   135920920 :                 int const ConstrNum = surface.Construction;
     461   135920920 :                 auto const &construct(state.dataConstruction->Construct(ConstrNum));
     462   135920920 :                 state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) = 0.0;
     463   135920920 :                 state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) = 0.0;
     464   135920920 :                 if (construct.NumCTFTerms <= 1) continue;
     465             : 
     466   975615007 :                 for (int Term = 1; Term <= construct.NumCTFTerms; ++Term) {
     467             :                     // [ l11 ] == ( 1, Term + 1, SurfNum ), [ l12 ] == ( 1, Term + 1, SurfNum )
     468             : 
     469             :                     // Sign convention for the various terms in the following two equations
     470             :                     // is based on the form of the Conduction Transfer Function equation
     471             :                     // given by:
     472             :                     // Qin,now  = (Sum of)(Y Tout) - (Sum of)(Z Tin) + (Sum of)(F Qin,old)
     473             :                     // Qout,now = (Sum of)(X Tout) - (Sum of)(Y Tin) + (Sum of)(F Qout,old)
     474             :                     // In both equations, flux is positive from outside to inside.
     475             : 
     476             :                     // Tuned Aliases and linear indexing
     477   848451607 :                     Real64 const ctf_cross(construct.CTFCross(Term));
     478             : 
     479   848451607 :                     Real64 const TH11(state.dataHeatBalSurf->SurfOutsideTempHist(Term + 1)(SurfNum));
     480   848451607 :                     Real64 const TH12(state.dataHeatBalSurf->SurfInsideTempHist(Term + 1)(SurfNum));
     481   848451607 :                     Real64 const QH11(state.dataHeatBalSurf->SurfOutsideFluxHist(Term + 1)(SurfNum));
     482   848451607 :                     Real64 const QH12(state.dataHeatBalSurf->SurfInsideFluxHist(Term + 1)(SurfNum));
     483   848451607 :                     state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) +=
     484   848451607 :                         ctf_cross * TH11 - construct.CTFInside(Term) * TH12 + construct.CTFFlux(Term) * QH12;
     485             : 
     486   848451607 :                     state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) +=
     487   848451607 :                         construct.CTFOutside(Term) * TH11 - ctf_cross * TH12 + construct.CTFFlux(Term) * QH11;
     488             :                 }
     489             :             }
     490             :         }
     491             :     }
     492     2568509 :     if (state.dataHeatBal->AnyInternalHeatSourceInInput) {
     493      648666 :         for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { // Loop through all surfaces...
     494      979074 :             for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
     495      489537 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
     496      489537 :                 int const firstSurfOpaque = thisSpace.OpaqOrIntMassSurfaceFirst;
     497      489537 :                 int const lastSurfOpaque = thisSpace.OpaqOrIntMassSurfaceLast;
     498     3788271 :                 for (int SurfNum = firstSurfOpaque; SurfNum <= lastSurfOpaque; ++SurfNum) {
     499     3298734 :                     auto const &surface(Surface(SurfNum));
     500     3298734 :                     int const ConstrNum = surface.Construction;
     501     3298734 :                     auto const &construct(state.dataConstruction->Construct(ConstrNum));
     502     3298734 :                     if (!construct.SourceSinkPresent) continue;
     503      721944 :                     if (surface.HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::CTF &&
     504      161478 :                         surface.HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::EMPD)
     505      161478 :                         continue;
     506      398988 :                     state.dataHeatBalFanSys->CTFTsrcConstPart(SurfNum) = 0.0;
     507      398988 :                     state.dataHeatBalFanSys->CTFTuserConstPart(SurfNum) = 0.0;
     508      398988 :                     if (construct.NumCTFTerms <= 1) continue;
     509     4391586 :                     for (int Term = 1; Term <= construct.NumCTFTerms; ++Term) {
     510     3992598 :                         Real64 const TH11(state.dataHeatBalSurf->SurfOutsideTempHist(Term + 1)(SurfNum));
     511     3992598 :                         Real64 const TH12(state.dataHeatBalSurf->SurfInsideTempHist(Term + 1)(SurfNum));
     512     3992598 :                         Real64 const QsrcHist1(state.dataHeatBalSurf->SurfQsrcHist(SurfNum, Term + 1));
     513             : 
     514     3992598 :                         state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) += construct.CTFSourceIn(Term) * QsrcHist1;
     515             : 
     516     3992598 :                         state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) += construct.CTFSourceOut(Term) * QsrcHist1;
     517             : 
     518     3992598 :                         state.dataHeatBalFanSys->CTFTsrcConstPart(SurfNum) +=
     519     7985196 :                             construct.CTFTSourceOut(Term) * TH11 + construct.CTFTSourceIn(Term) * TH12 + construct.CTFTSourceQ(Term) * QsrcHist1 +
     520     3992598 :                             construct.CTFFlux(Term) * state.dataHeatBalSurf->SurfTsrcHist(SurfNum, Term + 1);
     521             : 
     522     3992598 :                         state.dataHeatBalFanSys->CTFTuserConstPart(SurfNum) +=
     523     7985196 :                             construct.CTFTUserOut(Term) * TH11 + construct.CTFTUserIn(Term) * TH12 + construct.CTFTUserSource(Term) * QsrcHist1 +
     524     3992598 :                             construct.CTFFlux(Term) * state.dataHeatBalSurf->SurfTuserHist(SurfNum, Term + 1);
     525             :                     }
     526             :                 }
     527             :             } // ...end of surfaces DO loop for initializing temperature history terms for the surface heat balances
     528             :         }
     529             :     }
     530             : 
     531             :     // Zero out all of the radiant system heat balance coefficient arrays
     532    21015074 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { // Loop through all surfaces...
     533    36909306 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
     534    18462741 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
     535    18462741 :             int const firstSurf = thisSpace.HTSurfaceFirst;
     536    18462741 :             int const lastSurf = thisSpace.HTSurfaceLast;
     537   178178515 :             for (int SurfNum = firstSurf; SurfNum <= lastSurf; ++SurfNum) {
     538   159715774 :                 state.dataHeatBalFanSys->RadSysTiHBConstCoef(SurfNum) = 0.0;
     539   159715774 :                 state.dataHeatBalFanSys->RadSysTiHBToutCoef(SurfNum) = 0.0;
     540   159715774 :                 state.dataHeatBalFanSys->RadSysTiHBQsrcCoef(SurfNum) = 0.0;
     541   159715774 :                 state.dataHeatBalFanSys->RadSysToHBConstCoef(SurfNum) = 0.0;
     542   159715774 :                 state.dataHeatBalFanSys->RadSysToHBTinCoef(SurfNum) = 0.0;
     543   159715774 :                 state.dataHeatBalFanSys->RadSysToHBQsrcCoef(SurfNum) = 0.0;
     544             : 
     545   159715774 :                 state.dataHeatBalFanSys->QRadSysSource(SurfNum) = 0.0;
     546   159715774 :                 state.dataHeatBalFanSys->QPVSysSource(SurfNum) = 0.0;
     547   159715774 :                 state.dataHeatBalFanSys->SurfQHTRadSys(SurfNum) = 0.0;
     548   159715774 :                 state.dataHeatBalFanSys->SurfQHWBaseboard(SurfNum) = 0.0;
     549   159715774 :                 state.dataHeatBalFanSys->SurfQSteamBaseboard(SurfNum) = 0.0;
     550   159715774 :                 state.dataHeatBalFanSys->SurfQElecBaseboard(SurfNum) = 0.0;
     551   159715774 :                 state.dataHeatBalFanSys->SurfQCoolingPanel(SurfNum) = 0.0;
     552   159715774 :                 state.dataHeatBalFanSys->QPoolSurfNumerator(SurfNum) = 0.0;
     553   159715774 :                 state.dataHeatBalFanSys->PoolHeatTransCoefs(SurfNum) = 0.0;
     554             :             } // ...end of Zone Surf loop
     555             :         }
     556             :     } // ...end of Zone loop
     557             : 
     558     2568509 :     if (state.dataGlobal->ZoneSizingCalc) GatherComponentLoadsSurfAbsFact(state);
     559             : 
     560     2568509 :     if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) {
     561         771 :         DisplayString(state, "Completed Initializing Surface Heat Balance");
     562             :     }
     563     2568509 :     state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime = false;
     564     2568509 : }
     565             : 
     566         771 : void GatherForPredefinedReport(EnergyPlusData &state)
     567             : {
     568             : 
     569             :     // SUBROUTINE INFORMATION:
     570             :     //       AUTHOR         Jason Glazer
     571             :     //       DATE WRITTEN   August 2006
     572             :     //       MODIFIED       na
     573             :     //       RE-ENGINEERED  na
     574             : 
     575             :     // PURPOSE OF THIS SUBROUTINE:
     576             :     // This subroutine reports the information for the predefined reports
     577             :     // related to envelope components.
     578             : 
     579             :     // METHODOLOGY EMPLOYED:
     580             :     // na
     581             : 
     582             :     // REFERENCES:
     583             :     // na
     584             : 
     585             :     // Using/Aliasing
     586             :     using namespace OutputReportPredefined;
     587             :     using WindowManager::CalcNominalWindowCond;
     588             : 
     589             :     // Locals
     590             :     // SUBROUTINE ARGUMENT DEFINITIONS:
     591             :     // na
     592             : 
     593             :     // SUBROUTINE PARAMETER DEFINITIONS:
     594             :     // na
     595             : 
     596             :     // INTERFACE BLOCK SPECIFICATIONS:
     597             :     // na
     598             : 
     599             :     // DERIVED TYPE DEFINITIONS:
     600             :     // na
     601             : 
     602             :     // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
     603        1542 :     std::string surfName;
     604             :     int curCons;
     605             :     int zonePt;
     606             :     Real64 mult;
     607             :     Real64 curAzimuth;
     608             :     Real64 curTilt;
     609             :     Real64 windowArea;
     610             :     Real64 frameWidth;
     611             :     Real64 frameArea;
     612             :     Real64 dividerArea;
     613             :     // counts for object count report
     614         771 :     int SurfaceClassCount = int(SurfaceClass::Num);
     615        1542 :     Array1D_int numSurfaces(SurfaceClassCount);
     616        1542 :     Array1D_int numExtSurfaces(SurfaceClassCount);
     617             :     int frameDivNum;
     618             :     bool isExterior;
     619        1542 :     Array1D<Real64> computedNetArea; // holds the gross wall area minus the window and door areas
     620             : 
     621             :     // the following variables are for the CalcNominalWindowCond call but only SHGCSummer is needed
     622             :     Real64 nomCond;
     623             :     Real64 SHGCSummer;
     624             :     Real64 TransSolNorm;
     625             :     Real64 TransVisNorm;
     626             :     Real64 nomUfact;
     627             :     int errFlag;
     628             :     int curWSC;
     629             :     // following variables are totals for fenestration table
     630         771 :     Real64 windowAreaWMult(0.0);
     631         771 :     Real64 fenTotArea(0.0);
     632         771 :     Real64 fenTotAreaNorth(0.0);
     633         771 :     Real64 fenTotAreaNonNorth(0.0);
     634         771 :     Real64 ufactArea(0.0);
     635         771 :     Real64 ufactAreaNorth(0.0);
     636         771 :     Real64 ufactAreaNonNorth(0.0);
     637         771 :     Real64 shgcArea(0.0);
     638         771 :     Real64 shgcAreaNorth(0.0);
     639         771 :     Real64 shgcAreaNonNorth(0.0);
     640         771 :     Real64 vistranArea(0.0);
     641         771 :     Real64 vistranAreaNorth(0.0);
     642         771 :     Real64 vistranAreaNonNorth(0.0);
     643         771 :     Real64 intFenTotArea(0.0);
     644         771 :     Real64 intUfactArea(0.0);
     645         771 :     Real64 intShgcArea(0.0);
     646         771 :     Real64 intVistranArea(0.0);
     647             :     bool isNorth;
     648             : 
     649         771 :     constexpr std::array<std::string_view, static_cast<int>(WinShadingType::Num)> WindowShadingTypeNames = {
     650             :         "No Shade",  // 0
     651             :         "Shade Off", // 1
     652             :         "Interior Shade",
     653             :         "Switchable Glazing",
     654             :         "Exterior Shade",
     655             :         "Exterior Screen",
     656             :         "Interior Blind",
     657             :         "Exterior Blind",
     658             :         "Between Glass Shade",
     659             :         "Between Glass Blind",
     660             :     };
     661             : 
     662         771 :     constexpr std::array<std::string_view, static_cast<int>(WindowShadingControlType::Num)> WindowShadingControlTypeNames = {
     663             :         "Uncontrolled",
     664             :         "AlwaysOn",
     665             :         "AlwaysOff",
     666             :         "OnIfScheduleAllows",
     667             :         "OnIfHighSolarOnWindow",
     668             :         "OnIfHighHorizontalSolar",
     669             :         "OnIfHighOutdoorAirTemperature",
     670             :         "OnIfHighZoneAirTemperature",
     671             :         "OnIfHighZoneCooling",
     672             :         "OnIfHighGlare",
     673             :         "MeetDaylightIlluminanceSetpoint",
     674             :         "OnNightIfLowOutdoorTempAndOffDay",
     675             :         "OnNightIfLowInsideTempAndOffDay",
     676             :         "OnNightIfHeatingAndOffDay",
     677             :         "OnNightIfLowOutdoorTempAndOnDayIfCooling",
     678             :         "OnNightIfHeatingAndOnDayIfCooling",
     679             :         "OffNightAndOnDayIfCoolingAndHighSolarOnWindow",
     680             :         "OnNightAndOnDayIfCoolingAndHighSolarOnWindow",
     681             :         "OnIfHighOutdoorAirTempAndHighSolarOnWindow",
     682             :         "OnIfHighOutdoorAirTempAndHighHorizontalSolar",
     683             :         "OnIfHighZoneAirTempAndHighSolarOnWindow",
     684             :         "OnIfHighZoneAirTempAndHighHorizontalSolar"};
     685             : 
     686         771 :     constexpr std::array<std::string_view, static_cast<int>(NfrcProductOptions::Num)> NfrcProductNames = {
     687             :         "CasementDouble", "CasementSingle",   "DualAction",
     688             :         "Fixed",          "Garage",           "Greenhouse",
     689             :         "HingedEscape",   "HorizontalSlider", "Jal",
     690             :         "Pivoted",        "ProjectingSingle", "ProjectingDual",
     691             :         "DoorSidelite",   "Skylight",         "SlidingPatioDoor",
     692             :         "CurtainWall",    "SpandrelPanel",    "SideHingedDoor",
     693             :         "DoorTransom",    "TropicalAwning",   "TubularDaylightingDevice",
     694             :         "VerticalSlider"};
     695             : 
     696         771 :     constexpr std::array<Real64, static_cast<int>(NfrcProductOptions::Num)> NfrcWidth = {
     697             :         // width in meters from Table 4-3 of NFRC 100-2020
     698             :         1.200, 0.600, 1.200, //  CasementDouble,  CasementSingle,    DualAction,
     699             :         1.200, 2.134, 1.500, //  Fixed,           Garage,            Greenhouse,
     700             :         1.500, 1.500, 1.200, //  HingedEscape,    HorizontalSlider,  Jal,
     701             :         1.200, 1.500, 1.500, //  Pivoted,         ProjectingSingle,  ProjectingDual,
     702             :         0.600, 1.200, 2.000, //  DoorSidelite,    Skylight,          SlidingPatioDoor,
     703             :         2.000, 2.000, 1.920, //  CurtainWall,     SpandrelPanel,     SideHingedDoor,
     704             :         2.000, 1.500, 0.350, //  DoorTransom,     TropicalAwning,    TubularDaylightingDevice,
     705             :         1.200                //  VerticalSlider,
     706             :     };
     707             : 
     708         771 :     constexpr std::array<Real64, static_cast<int>(NfrcProductOptions::Num)> NfrcHeight = {
     709             :         // height in meters from Table 4-3 of NFRC 100-2020
     710             :         1.500, 1.500, 1.500, //  CasementDouble,  CasementSingle,    DualAction,
     711             :         1.500, 2.134, 1.200, //  Fixed,           Garage,            Greenhouse,
     712             :         1.200, 1.200, 1.500, //  HingedEscape,    HorizontalSlider,  Jal,
     713             :         1.500, 1.200, 0.600, //  Pivoted,         ProjectingSingle,  ProjectingDual,
     714             :         2.090, 1.200, 2.000, //  DoorSidelite,    Skylight,          SlidingPatioDoor,
     715             :         2.000, 1.200, 2.090, //  CurtainWall,     SpandrelPanel,     SideHingedDoor,
     716             :         0.600, 1.200, 0.350, //  DoorTransom,     TropicalAwning,    TubularDaylightingDevice,
     717             :         1.500                //  VerticalSlider,
     718             :     };
     719             : 
     720         771 :     constexpr std::array<NfrcVisionType, static_cast<int>(NfrcProductOptions::Num)> NfrcVision = {
     721             :         NfrcVisionType::DualHorizontal, NfrcVisionType::Single,
     722             :         NfrcVisionType::DualVertical, //  CasementDouble,  CasementSingle,    DualAction,
     723             :         NfrcVisionType::Single,         NfrcVisionType::Single,
     724             :         NfrcVisionType::Single, //  Fixed,           Garage,            Greenhouse,
     725             :         NfrcVisionType::Single,         NfrcVisionType::DualHorizontal,
     726             :         NfrcVisionType::Single, //  HingedEscape,    HorizontalSlider,  Jal,
     727             :         NfrcVisionType::Single,         NfrcVisionType::Single,
     728             :         NfrcVisionType::DualHorizontal, //  Pivoted,         ProjectingSingle,  ProjectingDual,
     729             :         NfrcVisionType::Single,         NfrcVisionType::Single,
     730             :         NfrcVisionType::DualHorizontal, //  DoorSidelite,    Skylight,          SlidingPatioDoor,
     731             :         NfrcVisionType::Single,         NfrcVisionType::Single,
     732             :         NfrcVisionType::Single, //  CurtainWall,     SpandrelPanel,     SideHingedDoor,
     733             :         NfrcVisionType::Single,         NfrcVisionType::Single,
     734             :         NfrcVisionType::Single,      //  DoorTransom,     TropicalAwning,    TubularDaylightingDevice,
     735             :         NfrcVisionType::DualVertical //  VerticalSlider
     736             :     };
     737             : 
     738         771 :     auto &Surface(state.dataSurface->Surface);
     739             : 
     740         771 :     numSurfaces = 0;
     741         771 :     numExtSurfaces = 0;
     742             : 
     743         771 :     computedNetArea.allocate(state.dataSurface->TotSurfaces);
     744         771 :     computedNetArea = 0.0; // start at zero, add wall area and subtract window and door area
     745             : 
     746             :     // set up for EIO <FenestrationAssembly> output
     747         771 :     if (state.dataHeatBal->TotFrameDivider > 0 && state.dataGeneral->Constructions) {
     748          18 :         print(state.files.eio,
     749             :               "{}\n",
     750             :               "! <FenestrationAssembly>,Construction Name,Frame and Divider Name,NFRC Product Type,"
     751          18 :               "Assembly U-Factor {W/m2-K},Assembly SHGC,Assembly Visible Transmittance");
     752             :     }
     753             :     static constexpr std::string_view FenestrationAssemblyFormat("FenestrationAssembly,{},{},{},{:.3R},{:.3R},{:.3R}\n");
     754        1542 :     std::vector<std::pair<int, int>> uniqConsFrame;
     755         771 :     std::pair<int, int> consAndFrame;
     756             : 
     757             :     // set up for EIO <FenestrationShadedState> output
     758         771 :     bool fenestrationShadedStateHeaderShown(false);
     759             :     static constexpr std::string_view FenestrationShadedStateFormat("FenestrationShadedState,{},{:.3R},{:.3R},{:.3R},{},{},{:.3R},{:.3R},{:.3R}\n");
     760        1542 :     std::vector<std::pair<int, int>> uniqShdConsFrame;
     761         771 :     std::pair<int, int> shdConsAndFrame;
     762             : 
     763       44533 :     for (int iSurf : state.dataSurface->AllSurfaceListReportOrder) {
     764       43762 :         zonePt = Surface(iSurf).Zone;
     765             :         // only exterior surfaces including underground
     766      135689 :         if ((Surface(iSurf).ExtBoundCond == ExternalEnvironment) || (Surface(iSurf).ExtBoundCond == Ground) ||
     767       89631 :             (Surface(iSurf).ExtBoundCond == GroundFCfactorMethod) || (Surface(iSurf).ExtBoundCond == KivaFoundation)) {
     768       20955 :             isExterior = true;
     769       20955 :             switch (Surface(iSurf).Class) {
     770       13065 :             case SurfaceClass::Wall:
     771             :             case SurfaceClass::Floor:
     772             :             case SurfaceClass::Roof: {
     773       13065 :                 surfName = Surface(iSurf).Name;
     774       13065 :                 curCons = Surface(iSurf).Construction;
     775       13065 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchOpCons, surfName, state.dataConstruction->Construct(curCons).Name);
     776       39195 :                 PreDefTableEntry(
     777       26130 :                     state, state.dataOutRptPredefined->pdchOpRefl, surfName, 1 - state.dataConstruction->Construct(curCons).OutsideAbsorpSolar);
     778       39195 :                 PreDefTableEntry(
     779       26130 :                     state, state.dataOutRptPredefined->pdchOpUfactNoFilm, surfName, state.dataHeatBal->NominalU(Surface(iSurf).Construction), 3);
     780       13065 :                 mult = state.dataHeatBal->Zone(zonePt).Multiplier * state.dataHeatBal->Zone(zonePt).ListMultiplier;
     781       13065 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchOpGrArea, surfName, Surface(iSurf).GrossArea * mult);
     782       13065 :                 computedNetArea(iSurf) += Surface(iSurf).GrossArea * mult;
     783       13065 :                 curAzimuth = Surface(iSurf).Azimuth;
     784             :                 // Round to two decimals, like the display in tables
     785             :                 // (PreDefTableEntry uses a fortran style write, that rounds rather than trim)
     786       13065 :                 curAzimuth = round(curAzimuth * 100.0) / 100.0;
     787       13065 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchOpAzimuth, surfName, curAzimuth);
     788       13065 :                 curTilt = Surface(iSurf).Tilt;
     789       13065 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchOpTilt, surfName, curTilt);
     790       13065 :                 if ((curTilt >= 60.0) && (curTilt < 180.0)) {
     791        8664 :                     if ((curAzimuth >= 315.0) || (curAzimuth < 45.0)) {
     792        2240 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchOpDir, surfName, "N");
     793        6424 :                     } else if ((curAzimuth >= 45.0) && (curAzimuth < 135.0)) {
     794        2053 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchOpDir, surfName, "E");
     795        4371 :                     } else if ((curAzimuth >= 135.0) && (curAzimuth < 225.0)) {
     796        2250 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchOpDir, surfName, "S");
     797        2121 :                     } else if ((curAzimuth >= 225.0) && (curAzimuth < 315.0)) {
     798        2121 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchOpDir, surfName, "W");
     799             :                     }
     800             :                 }
     801       13065 :             } break;
     802        5962 :             case SurfaceClass::Window:
     803             :             case SurfaceClass::TDD_Dome: {
     804        5962 :                 surfName = Surface(iSurf).Name;
     805        5962 :                 curCons = Surface(iSurf).Construction;
     806        5962 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenCons, surfName, state.dataConstruction->Construct(curCons).Name);
     807        5962 :                 zonePt = Surface(iSurf).Zone;
     808             :                 // if the construction report is requested the SummerSHGC is already calculated
     809        5962 :                 if (state.dataConstruction->Construct(curCons).SummerSHGC != 0) {
     810        5328 :                     SHGCSummer = state.dataConstruction->Construct(curCons).SummerSHGC;
     811        5328 :                     TransVisNorm = state.dataConstruction->Construct(curCons).VisTransNorm;
     812             :                 } else {
     813             :                     // must calculate Summer SHGC
     814         634 :                     if (!state.dataConstruction->Construct(curCons).WindowTypeEQL) {
     815         634 :                         CalcNominalWindowCond(state, curCons, 2, nomCond, SHGCSummer, TransSolNorm, TransVisNorm, errFlag);
     816         634 :                         state.dataConstruction->Construct(curCons).SummerSHGC = SHGCSummer;
     817         634 :                         state.dataConstruction->Construct(curCons).VisTransNorm = TransVisNorm;
     818         634 :                         state.dataConstruction->Construct(curCons).SolTransNorm = TransSolNorm;
     819             :                     }
     820             :                 }
     821        5962 :                 mult = state.dataHeatBal->Zone(zonePt).Multiplier * state.dataHeatBal->Zone(zonePt).ListMultiplier * Surface(iSurf).Multiplier;
     822             :                 // include the frame area if present
     823        5962 :                 windowArea = Surface(iSurf).GrossArea;
     824        5962 :                 frameArea = 0.0;
     825        5962 :                 dividerArea = 0.0;
     826        5962 :                 frameDivNum = Surface(iSurf).FrameDivider;
     827        5962 :                 if (frameDivNum != 0) {
     828         381 :                     frameWidth = state.dataSurface->FrameDivider(frameDivNum).FrameWidth;
     829         762 :                     frameArea = (Surface(iSurf).Height + 2.0 * frameWidth) * (Surface(iSurf).Width + 2.0 * frameWidth) -
     830         381 :                                 (Surface(iSurf).Height * Surface(iSurf).Width);
     831         381 :                     windowArea += frameArea;
     832         381 :                     dividerArea =
     833         381 :                         state.dataSurface->FrameDivider(frameDivNum).DividerWidth *
     834         762 :                         (state.dataSurface->FrameDivider(frameDivNum).HorDividers * Surface(iSurf).Width +
     835         762 :                          state.dataSurface->FrameDivider(frameDivNum).VertDividers * Surface(iSurf).Height -
     836         762 :                          state.dataSurface->FrameDivider(frameDivNum).HorDividers * state.dataSurface->FrameDivider(frameDivNum).VertDividers *
     837         381 :                              state.dataSurface->FrameDivider(frameDivNum).DividerWidth);
     838         762 :                     PreDefTableEntry(
     839         762 :                         state, state.dataOutRptPredefined->pdchFenFrameDivName, surfName, state.dataSurface->FrameDivider(frameDivNum).Name);
     840        1143 :                     PreDefTableEntry(state,
     841         381 :                                      state.dataOutRptPredefined->pdchFenFrameConductance,
     842             :                                      surfName,
     843         381 :                                      state.dataSurface->FrameDivider(frameDivNum).FrameConductance,
     844             :                                      3);
     845        1143 :                     PreDefTableEntry(state,
     846         381 :                                      state.dataOutRptPredefined->pdchFenDividerConductance,
     847             :                                      surfName,
     848         381 :                                      state.dataSurface->FrameDivider(frameDivNum).DividerConductance,
     849             :                                      3);
     850             : 
     851             :                     // report the selected NRFC product type (specific sizes) and the NFRC rating for the assembly (glass + frame + divider)
     852         381 :                     std::string_view NFRCname = NfrcProductNames[static_cast<int>(state.dataSurface->FrameDivider(frameDivNum).NfrcProductType)];
     853         381 :                     const auto windowWidth = NfrcWidth[static_cast<int>(state.dataSurface->FrameDivider(frameDivNum).NfrcProductType)];
     854         381 :                     const auto windowHeight = NfrcHeight[static_cast<int>(state.dataSurface->FrameDivider(frameDivNum).NfrcProductType)];
     855         381 :                     const auto vision = NfrcVision[static_cast<int>(state.dataSurface->FrameDivider(frameDivNum).NfrcProductType)];
     856             : 
     857         381 :                     PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenAssemNfrcType, surfName, NFRCname);
     858             : 
     859         381 :                     Real64 uValueAssembly{0.0};
     860         381 :                     Real64 shgcAssembly{0.0};
     861         381 :                     Real64 vtAssembly{0.0};
     862             : 
     863         381 :                     GetWindowAssemblyNfrcForReport(
     864         381 :                         state, iSurf, Surface(iSurf).Construction, windowWidth, windowHeight, vision, uValueAssembly, shgcAssembly, vtAssembly);
     865         381 :                     if (state.dataWindowManager->inExtWindowModel->isExternalLibraryModel()) {
     866           0 :                         state.dataHeatBal->NominalU(Surface(iSurf).Construction) =
     867           0 :                             GetIGUUValueForNFRCReport(state, iSurf, Surface(iSurf).Construction, windowWidth, windowHeight);
     868           0 :                         SHGCSummer = GetSHGCValueForNFRCReporting(state, iSurf, Surface(iSurf).Construction, windowWidth, windowHeight);
     869             :                     }
     870         381 :                     PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenAssemUfact, surfName, uValueAssembly, 3);
     871         381 :                     PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenAssemSHGC, surfName, shgcAssembly, 3);
     872         381 :                     PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenAssemVisTr, surfName, vtAssembly, 3);
     873             : 
     874             :                     // output EIO <FenestrationAssembly> for each unique combination of construction and frame/divider
     875         381 :                     if (state.dataGeneral->Constructions) {
     876         340 :                         consAndFrame = std::make_pair(curCons, frameDivNum);
     877         340 :                         if (std::find(uniqConsFrame.begin(), uniqConsFrame.end(), consAndFrame) == uniqConsFrame.end()) {
     878          30 :                             uniqConsFrame.push_back(consAndFrame);
     879          60 :                             print(state.files.eio,
     880             :                                   FenestrationAssemblyFormat,
     881          30 :                                   state.dataConstruction->Construct(curCons).Name,
     882          30 :                                   state.dataSurface->FrameDivider(frameDivNum).Name,
     883             :                                   NFRCname,
     884             :                                   uValueAssembly,
     885             :                                   shgcAssembly,
     886             :                                   vtAssembly);
     887             :                         }
     888             :                     }
     889             :                 }
     890        5962 :                 windowAreaWMult = windowArea * mult;
     891        5962 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenAreaOf1, surfName, windowArea);
     892        5962 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenFrameAreaOf1, surfName, frameArea);
     893        5962 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenDividerAreaOf1, surfName, dividerArea);
     894        5962 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenGlassAreaOf1, surfName, windowArea - (frameArea + dividerArea));
     895        5962 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenArea, surfName, windowAreaWMult);
     896        5962 :                 computedNetArea(Surface(iSurf).BaseSurf) -= windowAreaWMult;
     897        5962 :                 nomUfact = state.dataHeatBal->NominalU(Surface(iSurf).Construction);
     898        5962 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenUfact, surfName, nomUfact, 3);
     899             : 
     900        5962 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenSHGC, surfName, SHGCSummer, 3);
     901        5962 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenVisTr, surfName, TransVisNorm, 3);
     902        5962 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenParent, surfName, Surface(iSurf).BaseSurfName);
     903        5962 :                 curAzimuth = Surface(iSurf).Azimuth;
     904             :                 // Round to two decimals, like the display in tables
     905        5962 :                 curAzimuth = round(curAzimuth * 100.0) / 100.0;
     906        5962 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenAzimuth, surfName, curAzimuth);
     907        5962 :                 isNorth = false;
     908        5962 :                 curTilt = Surface(iSurf).Tilt;
     909        5962 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenTilt, surfName, curTilt);
     910        5962 :                 if ((curTilt >= 60.0) && (curTilt < 180.0)) {
     911        5565 :                     if ((curAzimuth >= 315.0) || (curAzimuth < 45.0)) {
     912        1397 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenDir, surfName, "N");
     913        1397 :                         isNorth = true;
     914        4168 :                     } else if ((curAzimuth >= 45.0) && (curAzimuth < 135.0)) {
     915        1011 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenDir, surfName, "E");
     916        3157 :                     } else if ((curAzimuth >= 135.0) && (curAzimuth < 225.0)) {
     917        2155 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenDir, surfName, "S");
     918        1002 :                     } else if ((curAzimuth >= 225.0) && (curAzimuth < 315.0)) {
     919        1002 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenDir, surfName, "W");
     920             :                     }
     921             :                 }
     922             : 
     923             :                 // Report table for every shading control state
     924        5962 :                 const auto totalStates{Surface(iSurf).windowShadingControlList.size()};
     925        5962 :                 if (frameDivNum != 0) {
     926         422 :                     for (unsigned int i = 0; i < totalStates; ++i) {
     927          41 :                         const auto windowWidth = NfrcWidth[static_cast<int>(state.dataSurface->FrameDivider(frameDivNum).NfrcProductType)];
     928          41 :                         const auto windowHeight = NfrcHeight[static_cast<int>(state.dataSurface->FrameDivider(frameDivNum).NfrcProductType)];
     929          41 :                         const auto vision = NfrcVision[static_cast<int>(state.dataSurface->FrameDivider(frameDivNum).NfrcProductType)];
     930             : 
     931          41 :                         const int stateConstrNum = Surface(iSurf).shadedConstructionList[i];
     932          41 :                         const auto stateUValue{GetIGUUValueForNFRCReport(state, iSurf, stateConstrNum, windowWidth, windowHeight)};
     933          41 :                         const auto stateSHGC{GetSHGCValueForNFRCReporting(state, iSurf, stateConstrNum, windowWidth, windowHeight)};
     934          41 :                         std::string const &constructionName{state.dataConstruction->Construct(stateConstrNum).Name};
     935             : 
     936          82 :                         PreDefTableEntry(state,
     937          41 :                                          state.dataOutRptPredefined->pdchFenShdFrameDiv,
     938             :                                          constructionName,
     939          41 :                                          state.dataSurface->FrameDivider(frameDivNum).Name);
     940          41 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenShdUfact, constructionName, stateUValue, 3);
     941          41 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenShdSHGC, constructionName, stateSHGC, 3);
     942         123 :                         PreDefTableEntry(state,
     943          41 :                                          state.dataOutRptPredefined->pdchFenShdVisTr,
     944             :                                          constructionName,
     945          41 :                                          state.dataConstruction->Construct(stateConstrNum).VisTransNorm,
     946             :                                          3);
     947             : 
     948          41 :                         Real64 stateAssemblyUValue{0.0};
     949          41 :                         Real64 stateAssemblySHGC{0.0};
     950          41 :                         Real64 stateAssemblyVT{0.0};
     951             : 
     952          41 :                         GetWindowAssemblyNfrcForReport(
     953             :                             state, iSurf, stateConstrNum, windowWidth, windowHeight, vision, stateAssemblyUValue, stateAssemblySHGC, stateAssemblyVT);
     954             : 
     955          41 :                         std::string_view NFRCname = NfrcProductNames[static_cast<int>(state.dataSurface->FrameDivider(frameDivNum).NfrcProductType)];
     956          41 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenShdAssemNfrcType, constructionName, NFRCname);
     957             : 
     958          41 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenShdAssemUfact, constructionName, stateAssemblyUValue, 3);
     959          41 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenShdAssemSHGC, constructionName, stateAssemblySHGC, 3);
     960          41 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenShdAssemVisTr, constructionName, stateAssemblyVT, 3);
     961             : 
     962          41 :                         if (state.dataGeneral->Constructions) {
     963          23 :                             if (!fenestrationShadedStateHeaderShown) {
     964           4 :                                 print(state.files.eio,
     965             :                                       "{}\n",
     966             :                                       "! <FenestrationShadedState>,Construction Name,Glass U-Factor {W/m2-K},"
     967             :                                       "Glass SHGC, Glass Visible Transmittance, Frame and Divider Name,NFRC Product Type,"
     968           4 :                                       "Assembly U-Factor {W/m2-K},Assembly SHGC,Assembly Visible Transmittance");
     969           4 :                                 fenestrationShadedStateHeaderShown = true;
     970             :                             }
     971             : 
     972          46 :                             shdConsAndFrame = std::make_pair(stateConstrNum, frameDivNum);
     973          23 :                             if (std::find(uniqShdConsFrame.begin(), uniqShdConsFrame.end(), shdConsAndFrame) == uniqShdConsFrame.end()) {
     974          14 :                                 uniqShdConsFrame.push_back(shdConsAndFrame);
     975          28 :                                 print(state.files.eio,
     976             :                                       FenestrationShadedStateFormat,
     977             :                                       constructionName,
     978             :                                       stateUValue,
     979             :                                       stateSHGC,
     980          14 :                                       state.dataConstruction->Construct(stateConstrNum).VisTransNorm,
     981          14 :                                       state.dataSurface->FrameDivider(frameDivNum).Name,
     982             :                                       NFRCname,
     983             :                                       stateAssemblyUValue,
     984             :                                       stateAssemblySHGC,
     985             :                                       stateAssemblyVT);
     986             :                             }
     987             :                         }
     988             :                     }
     989             :                 }
     990             : 
     991        5962 :                 curWSC = Surface(iSurf).activeWindowShadingControl;
     992             :                 // compute totals for area weighted averages
     993        5962 :                 fenTotArea += windowAreaWMult;
     994        5962 :                 ufactArea += nomUfact * windowAreaWMult;
     995        5962 :                 shgcArea += SHGCSummer * windowAreaWMult;
     996        5962 :                 vistranArea += TransVisNorm * windowAreaWMult;
     997        5962 :                 if (isNorth) {
     998        1397 :                     fenTotAreaNorth += windowAreaWMult;
     999        1397 :                     ufactAreaNorth += nomUfact * windowAreaWMult;
    1000        1397 :                     shgcAreaNorth += SHGCSummer * windowAreaWMult;
    1001        1397 :                     vistranAreaNorth += TransVisNorm * windowAreaWMult;
    1002             :                 } else {
    1003        4565 :                     fenTotAreaNonNorth += windowAreaWMult;
    1004        4565 :                     ufactAreaNonNorth += nomUfact * windowAreaWMult;
    1005        4565 :                     shgcAreaNonNorth += SHGCSummer * windowAreaWMult;
    1006        4565 :                     vistranAreaNonNorth += TransVisNorm * windowAreaWMult;
    1007             :                 }
    1008             :                 // shading
    1009        5962 :                 if (Surface(iSurf).HasShadeControl) {
    1010         143 :                     PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenSwitchable, surfName, "Yes");
    1011         143 :                     PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscName, surfName, state.dataSurface->WindowShadingControl(curWSC).Name);
    1012             :                     // shading report
    1013         286 :                     PreDefTableEntry(state,
    1014         143 :                                      state.dataOutRptPredefined->pdchWscShading,
    1015             :                                      surfName,
    1016         143 :                                      WindowShadingTypeNames[int(state.dataSurface->WindowShadingControl(curWSC).ShadingType)]);
    1017         286 :                     PreDefTableEntry(state,
    1018         143 :                                      state.dataOutRptPredefined->pdchWscControl,
    1019             :                                      surfName,
    1020         143 :                                      WindowShadingControlTypeNames[int(state.dataSurface->WindowShadingControl(curWSC).shadingControlType)]);
    1021             : 
    1022             :                     // output list of all possible shading contructions for shaded windows including those with storms
    1023         286 :                     std::string names = "";
    1024         290 :                     for (auto construction : Surface(iSurf).shadedConstructionList) {
    1025         147 :                         if (!names.empty()) names.append("; ");
    1026         147 :                         names.append(state.dataConstruction->Construct(construction).Name);
    1027             :                     }
    1028         143 :                     for (auto construction : Surface(iSurf).shadedStormWinConstructionList) {
    1029           0 :                         if (!names.empty()) names.append("; ");
    1030           0 :                         names.append(state.dataConstruction->Construct(construction).Name);
    1031             :                     }
    1032         143 :                     PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscShadCons, surfName, names);
    1033             : 
    1034         143 :                     if (state.dataSurface->WindowShadingControl(curWSC).GlareControlIsActive) {
    1035          30 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscGlare, surfName, "Yes");
    1036             :                     } else {
    1037         113 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchWscGlare, surfName, "No");
    1038             :                     }
    1039             :                 } else {
    1040        5819 :                     PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenSwitchable, surfName, "No");
    1041             :                 }
    1042        5962 :             } break;
    1043         386 :             case SurfaceClass::Door: {
    1044         386 :                 surfName = Surface(iSurf).Name;
    1045         386 :                 curCons = Surface(iSurf).Construction;
    1046         386 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchDrCons, surfName, state.dataConstruction->Construct(curCons).Name);
    1047        1158 :                 PreDefTableEntry(
    1048         772 :                     state, state.dataOutRptPredefined->pdchDrUfactNoFilm, surfName, state.dataHeatBal->NominalU(Surface(iSurf).Construction), 3);
    1049         386 :                 mult = state.dataHeatBal->Zone(zonePt).Multiplier * state.dataHeatBal->Zone(zonePt).ListMultiplier;
    1050         386 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchDrGrArea, surfName, Surface(iSurf).GrossArea * mult);
    1051         386 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchDrParent, surfName, Surface(iSurf).BaseSurfName);
    1052         386 :                 computedNetArea(Surface(iSurf).BaseSurf) -= Surface(iSurf).GrossArea * mult;
    1053         386 :             } break;
    1054        1542 :             default:
    1055        1542 :                 break;
    1056             :             }
    1057             :         } else {
    1058             :             // interior surfaces
    1059       22807 :             isExterior = false;
    1060       61315 :             if ((Surface(iSurf).Class == SurfaceClass::Wall) || (Surface(iSurf).Class == SurfaceClass::Floor) ||
    1061       30896 :                 (Surface(iSurf).Class == SurfaceClass::Roof) || (Surface(iSurf).Class == SurfaceClass::IntMass)) {
    1062       22713 :                 surfName = Surface(iSurf).Name;
    1063       22713 :                 curCons = Surface(iSurf).Construction;
    1064       22713 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntOpCons, surfName, state.dataConstruction->Construct(curCons).Name);
    1065       68139 :                 PreDefTableEntry(
    1066       45426 :                     state, state.dataOutRptPredefined->pdchIntOpRefl, surfName, 1 - state.dataConstruction->Construct(curCons).OutsideAbsorpSolar);
    1067       68139 :                 PreDefTableEntry(
    1068       45426 :                     state, state.dataOutRptPredefined->pdchIntOpUfactNoFilm, surfName, state.dataHeatBal->NominalU(Surface(iSurf).Construction), 3);
    1069       22713 :                 mult = state.dataHeatBal->Zone(zonePt).Multiplier * state.dataHeatBal->Zone(zonePt).ListMultiplier;
    1070       22713 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntOpGrArea, surfName, Surface(iSurf).GrossArea * mult);
    1071       22713 :                 computedNetArea(iSurf) += Surface(iSurf).GrossArea * mult;
    1072       22713 :                 curAzimuth = Surface(iSurf).Azimuth;
    1073             :                 // Round to two decimals, like the display in tables
    1074             :                 // (PreDefTableEntry uses a fortran style write, that rounds rather than trim)
    1075       22713 :                 curAzimuth = round(curAzimuth * 100.0) / 100.0;
    1076       22713 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntOpAzimuth, surfName, curAzimuth);
    1077       22713 :                 curTilt = Surface(iSurf).Tilt;
    1078       22713 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntOpTilt, surfName, curTilt);
    1079       22713 :                 if ((curTilt >= 60.0) && (curTilt < 180.0)) {
    1080       15102 :                     if ((curAzimuth >= 315.0) || (curAzimuth < 45.0)) {
    1081        5556 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntOpDir, surfName, "N");
    1082        9546 :                     } else if ((curAzimuth >= 45.0) && (curAzimuth < 135.0)) {
    1083        3138 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntOpDir, surfName, "E");
    1084        6408 :                     } else if ((curAzimuth >= 135.0) && (curAzimuth < 225.0)) {
    1085        3275 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntOpDir, surfName, "S");
    1086        3133 :                     } else if ((curAzimuth >= 225.0) && (curAzimuth < 315.0)) {
    1087        3133 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntOpDir, surfName, "W");
    1088             :                     }
    1089             :                 }
    1090             :                 // interior window report
    1091          94 :             } else if ((Surface(iSurf).Class == SurfaceClass::Window) || (Surface(iSurf).Class == SurfaceClass::TDD_Dome)) {
    1092          14 :                 if (!has_prefix(Surface(iSurf).Name,
    1093          14 :                                 "iz-")) { // don't count created interzone surfaces that are mirrors of other surfaces
    1094          12 :                     surfName = Surface(iSurf).Name;
    1095          12 :                     curCons = Surface(iSurf).Construction;
    1096          12 :                     PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenCons, surfName, state.dataConstruction->Construct(curCons).Name);
    1097          12 :                     zonePt = Surface(iSurf).Zone;
    1098          12 :                     mult = state.dataHeatBal->Zone(zonePt).Multiplier * state.dataHeatBal->Zone(zonePt).ListMultiplier * Surface(iSurf).Multiplier;
    1099             :                     // include the frame area if present
    1100          12 :                     windowArea = Surface(iSurf).GrossArea;
    1101          12 :                     if (Surface(iSurf).FrameDivider != 0) {
    1102           0 :                         frameWidth = state.dataSurface->FrameDivider(Surface(iSurf).FrameDivider).FrameWidth;
    1103           0 :                         frameArea = (Surface(iSurf).Height + 2 * frameWidth) * (Surface(iSurf).Width + 2 * frameWidth) -
    1104           0 :                                     (Surface(iSurf).Height * Surface(iSurf).Width);
    1105           0 :                         windowArea += frameArea;
    1106             :                     }
    1107          12 :                     windowAreaWMult = windowArea * mult;
    1108          12 :                     PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenAreaOf1, surfName, windowArea);
    1109          12 :                     PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenArea, surfName, windowAreaWMult);
    1110          12 :                     computedNetArea(Surface(iSurf).BaseSurf) -= windowAreaWMult;
    1111          12 :                     nomUfact = state.dataHeatBal->NominalU(Surface(iSurf).Construction);
    1112          12 :                     PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenUfact, surfName, nomUfact, 3);
    1113          12 :                     if (!state.dataConstruction->Construct(curCons).TypeIsAirBoundary) {
    1114             :                         // Solar properties not applicable for air boundary surfaces
    1115             :                         // if the construction report is requested the SummerSHGC is already calculated
    1116          12 :                         if (state.dataConstruction->Construct(curCons).SummerSHGC != 0) {
    1117          12 :                             SHGCSummer = state.dataConstruction->Construct(curCons).SummerSHGC;
    1118          12 :                             TransVisNorm = state.dataConstruction->Construct(curCons).VisTransNorm;
    1119             :                         } else {
    1120             :                             // must calculate Summer SHGC
    1121           0 :                             if (!state.dataConstruction->Construct(curCons).WindowTypeEQL) {
    1122           0 :                                 CalcNominalWindowCond(state, curCons, 2, nomCond, SHGCSummer, TransSolNorm, TransVisNorm, errFlag);
    1123             :                             }
    1124             :                         }
    1125          12 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenSHGC, surfName, SHGCSummer, 3);
    1126          12 :                         PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenVisTr, surfName, TransVisNorm, 3);
    1127             :                         // compute totals for area weighted averages
    1128          12 :                         intShgcArea += SHGCSummer * windowAreaWMult;
    1129          12 :                         intVistranArea += TransVisNorm * windowAreaWMult;
    1130             :                     }
    1131          12 :                     PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenParent, surfName, Surface(iSurf).BaseSurfName);
    1132             :                     // compute totals for area weighted averages
    1133          12 :                     intFenTotArea += windowAreaWMult;
    1134          12 :                     intUfactArea += nomUfact * windowAreaWMult;
    1135             :                 }
    1136          80 :             } else if (Surface(iSurf).Class == SurfaceClass::Door) {
    1137          80 :                 surfName = Surface(iSurf).Name;
    1138          80 :                 curCons = Surface(iSurf).Construction;
    1139          80 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntDrCons, surfName, state.dataConstruction->Construct(curCons).Name);
    1140         240 :                 PreDefTableEntry(
    1141         160 :                     state, state.dataOutRptPredefined->pdchIntDrUfactNoFilm, surfName, state.dataHeatBal->NominalU(Surface(iSurf).Construction), 3);
    1142          80 :                 mult = state.dataHeatBal->Zone(zonePt).Multiplier * state.dataHeatBal->Zone(zonePt).ListMultiplier;
    1143          80 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntDrGrArea, surfName, Surface(iSurf).GrossArea * mult);
    1144          80 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntDrParent, surfName, Surface(iSurf).BaseSurfName);
    1145          80 :                 computedNetArea(Surface(iSurf).BaseSurf) -= Surface(iSurf).GrossArea * mult;
    1146             :             }
    1147             :         }
    1148       43762 :         int currSurfaceClass = int(Surface(iSurf).Class);
    1149       43762 :         assert(currSurfaceClass < int(SurfaceClass::Num));
    1150       43762 :         assert(currSurfaceClass > int(SurfaceClass::None));
    1151       43762 :         ++numSurfaces(currSurfaceClass);
    1152       43762 :         if (isExterior) {
    1153       20955 :             ++numExtSurfaces(currSurfaceClass);
    1154             :         }
    1155       43762 :         if (Surface(iSurf).Class == SurfaceClass::Window) {
    1156       11441 :             if (state.dataSurface->SurfWinOriginalClass(iSurf) == SurfaceClass::GlassDoor ||
    1157        5467 :                 state.dataSurface->SurfWinOriginalClass(iSurf) == SurfaceClass::TDD_Diffuser) {
    1158         509 :                 int currOriginalSurfaceClass = int(state.dataSurface->SurfWinOriginalClass(iSurf));
    1159         509 :                 ++numSurfaces(currOriginalSurfaceClass);
    1160         509 :                 if (isExterior) {
    1161         507 :                     ++numExtSurfaces(currOriginalSurfaceClass);
    1162             :                 }
    1163             :             }
    1164             :         }
    1165             :     }
    1166             :     // for fins and overhangs just add them explicitly since not otherwise classified
    1167        1542 :     int totOverhangs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Shading:Overhang") +
    1168         771 :                        state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Shading:Overhang:Projection");
    1169         771 :     numSurfaces(int(SurfaceClass::Overhang)) = totOverhangs;
    1170         771 :     numExtSurfaces(int(SurfaceClass::Overhang)) = totOverhangs;
    1171        1542 :     int totFins = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Shading:Fin") +
    1172         771 :                   state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Shading:Fin:Projection");
    1173         771 :     numSurfaces(int(SurfaceClass::Fin)) = totFins;
    1174         771 :     numExtSurfaces(int(SurfaceClass::Fin)) = totFins;
    1175             :     // go through all the surfaces again and this time insert the net area results
    1176       44533 :     for (int iSurf : state.dataSurface->AllSurfaceListReportOrder) {
    1177       43762 :         zonePt = Surface(iSurf).Zone;
    1178       43762 :         auto const SurfaceClass(Surface(iSurf).Class);
    1179             :         // exterior surfaces including underground
    1180      135689 :         if ((Surface(iSurf).ExtBoundCond == ExternalEnvironment) || (Surface(iSurf).ExtBoundCond == Ground) ||
    1181       89631 :             (Surface(iSurf).ExtBoundCond == GroundFCfactorMethod) || (Surface(iSurf).ExtBoundCond == KivaFoundation)) {
    1182       20955 :             if ((SurfaceClass == SurfaceClass::Wall) || (SurfaceClass == SurfaceClass::Floor) || (SurfaceClass == SurfaceClass::Roof)) {
    1183       13065 :                 surfName = Surface(iSurf).Name;
    1184       13065 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchOpNetArea, surfName, computedNetArea(iSurf));
    1185             :             }
    1186             :         } else {
    1187       22807 :             if ((SurfaceClass == SurfaceClass::Wall) || (SurfaceClass == SurfaceClass::Floor) || (SurfaceClass == SurfaceClass::Roof)) {
    1188       20429 :                 surfName = Surface(iSurf).Name;
    1189       20429 :                 PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntOpNetArea, surfName, computedNetArea(iSurf));
    1190             :             }
    1191             :         } // interior surfaces
    1192             :     }
    1193             :     // total
    1194         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenArea, "Total or Average", fenTotArea);
    1195         771 :     if (fenTotArea > 0.0) {
    1196         678 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenUfact, "Total or Average", ufactArea / fenTotArea, 3);
    1197         678 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenSHGC, "Total or Average", shgcArea / fenTotArea, 3);
    1198         678 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenVisTr, "Total or Average", vistranArea / fenTotArea, 3);
    1199             :     } else {
    1200          93 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenUfact, "Total or Average", "-");
    1201          93 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenSHGC, "Total or Average", "-");
    1202          93 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenVisTr, "Total or Average", "-");
    1203             :     }
    1204             :     // north
    1205         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenArea, "North Total or Average", fenTotAreaNorth);
    1206         771 :     if (fenTotAreaNorth > 0.0) {
    1207         388 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenUfact, "North Total or Average", ufactAreaNorth / fenTotAreaNorth, 3);
    1208         388 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenSHGC, "North Total or Average", shgcAreaNorth / fenTotAreaNorth, 3);
    1209         388 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenVisTr, "North Total or Average", vistranAreaNorth / fenTotAreaNorth, 3);
    1210             :     } else {
    1211         383 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenUfact, "North Total or Average", "-");
    1212         383 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenSHGC, "North Total or Average", "-");
    1213         383 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenVisTr, "North Total or Average", "-");
    1214             :     }
    1215             :     // non-north
    1216         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenArea, "Non-North Total or Average", fenTotAreaNonNorth);
    1217         771 :     if (fenTotAreaNonNorth > 0.0) {
    1218         677 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenUfact, "Non-North Total or Average", ufactAreaNonNorth / fenTotAreaNonNorth, 3);
    1219         677 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenSHGC, "Non-North Total or Average", shgcAreaNonNorth / fenTotAreaNonNorth, 3);
    1220         677 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenVisTr, "Non-North Total or Average", vistranAreaNonNorth / fenTotAreaNonNorth, 3);
    1221             :     } else {
    1222          94 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenUfact, "Non-North Total or Average", "-");
    1223          94 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenSHGC, "Non-North Total or Average", "-");
    1224          94 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchFenVisTr, "Non-North Total or Average", "-");
    1225             :     }
    1226             :     // interior fenestration totals
    1227         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenArea, "Total or Average", intFenTotArea);
    1228         771 :     if (intFenTotArea > 0.0) {
    1229           6 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenUfact, "Total or Average", intUfactArea / intFenTotArea, 3);
    1230           6 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenSHGC, "Total or Average", intShgcArea / intFenTotArea, 3);
    1231           6 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenVisTr, "Total or Average", intVistranArea / intFenTotArea, 3);
    1232             :     } else {
    1233         765 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenUfact, "Total or Average", "-");
    1234         765 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenSHGC, "Total or Average", "-");
    1235         765 :         PreDefTableEntry(state, state.dataOutRptPredefined->pdchIntFenVisTr, "Total or Average", "-");
    1236             :     }
    1237             :     // counts
    1238         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntTot, "Wall", numSurfaces(int(SurfaceClass::Wall)));
    1239         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntExt, "Wall", numExtSurfaces(int(SurfaceClass::Wall)));
    1240         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntTot, "Floor", numSurfaces(int(SurfaceClass::Floor)));
    1241         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntExt, "Floor", numExtSurfaces(int(SurfaceClass::Floor)));
    1242         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntTot, "Roof", numSurfaces(int(SurfaceClass::Roof)));
    1243         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntExt, "Roof", numExtSurfaces(int(SurfaceClass::Roof)));
    1244         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntTot, "Internal Mass", numSurfaces(int(SurfaceClass::IntMass)));
    1245         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntExt, "Internal Mass", numExtSurfaces(int(SurfaceClass::IntMass)));
    1246         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntTot, "Building Detached Shading", numSurfaces(int(SurfaceClass::Detached_B)));
    1247         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntExt, "Building Detached Shading", numExtSurfaces(int(SurfaceClass::Detached_B)));
    1248         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntTot, "Fixed Detached Shading", numSurfaces(int(SurfaceClass::Detached_F)));
    1249         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntExt, "Fixed Detached Shading", numExtSurfaces(int(SurfaceClass::Detached_F)));
    1250         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntTot, "Window", numSurfaces(int(SurfaceClass::Window)));
    1251         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntExt, "Window", numExtSurfaces(int(SurfaceClass::Window)));
    1252         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntTot, "Door", numSurfaces(int(SurfaceClass::Door)));
    1253         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntExt, "Door", numExtSurfaces(int(SurfaceClass::Door)));
    1254         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntTot, "Glass Door", numSurfaces(int(SurfaceClass::GlassDoor)));
    1255         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntExt, "Glass Door", numExtSurfaces(int(SurfaceClass::GlassDoor)));
    1256         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntTot, "Shading", numSurfaces(int(SurfaceClass::Shading)));
    1257         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntExt, "Shading", numExtSurfaces(int(SurfaceClass::Shading)));
    1258         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntTot, "Overhang", numSurfaces(int(SurfaceClass::Overhang)));
    1259         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntExt, "Overhang", numExtSurfaces(int(SurfaceClass::Overhang)));
    1260         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntTot, "Fin", numSurfaces(int(SurfaceClass::Fin)));
    1261         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntExt, "Fin", numExtSurfaces(int(SurfaceClass::Fin)));
    1262         771 :     PreDefTableEntry(state, state.dataOutRptPredefined->pdchSurfCntTot, "Tubular Daylighting Device Dome", numSurfaces(int(SurfaceClass::TDD_Dome)));
    1263        1542 :     PreDefTableEntry(
    1264        1542 :         state, state.dataOutRptPredefined->pdchSurfCntExt, "Tubular Daylighting Device Dome", numExtSurfaces(int(SurfaceClass::TDD_Dome)));
    1265        1542 :     PreDefTableEntry(
    1266        1542 :         state, state.dataOutRptPredefined->pdchSurfCntTot, "Tubular Daylighting Device Diffuser", numSurfaces(int(SurfaceClass::TDD_Diffuser)));
    1267        1542 :     PreDefTableEntry(
    1268        1542 :         state, state.dataOutRptPredefined->pdchSurfCntExt, "Tubular Daylighting Device Diffuser", numExtSurfaces(int(SurfaceClass::TDD_Diffuser)));
    1269         771 : }
    1270             : 
    1271         771 : void AllocateSurfaceHeatBalArrays(EnergyPlusData &state)
    1272             : {
    1273             : 
    1274             :     // SUBROUTINE INFORMATION:
    1275             :     //       AUTHOR         Richard Liesen
    1276             :     //       DATE WRITTEN   February 1998
    1277             : 
    1278             :     // METHODOLOGY EMPLOYED:
    1279             :     // Uses the status flags to trigger variable allocation.
    1280             : 
    1281         771 :     auto &Surface(state.dataSurface->Surface);
    1282             : 
    1283             :     // Use the total number of surfaces to allocate variables to avoid a surface number limit
    1284         771 :     state.dataHeatBalSurf->SurfCTFConstInPart.dimension(state.dataSurface->TotSurfaces, 0.0);
    1285         771 :     state.dataHeatBalSurf->SurfCTFConstOutPart.dimension(state.dataSurface->TotSurfaces, 0.0);
    1286         771 :     state.dataHeatBalSurf->SurfCTFCross0.dimension(state.dataSurface->TotSurfaces, 0.0);
    1287         771 :     state.dataHeatBalSurf->SurfCTFInside0.dimension(state.dataSurface->TotSurfaces, 0.0);
    1288         771 :     state.dataHeatBalSurf->SurfTempOutHist.dimension(state.dataSurface->TotSurfaces, 0.0);
    1289         771 :     state.dataHeatBalSurf->SurfCTFSourceIn0.dimension(state.dataSurface->TotSurfaces, 0.0);
    1290         771 :     state.dataHeatBalSurf->SurfQSourceSinkHist.dimension(state.dataSurface->TotSurfaces, 0.0);
    1291         771 :     state.dataHeatBalSurf->SurfIsAdiabatic.dimension(state.dataSurface->TotSurfaces, 0);
    1292         771 :     state.dataHeatBalSurf->SurfIsSourceOrSink.dimension(state.dataSurface->TotSurfaces, 0);
    1293         771 :     state.dataHeatBalSurf->SurfIsOperatingPool.dimension(state.dataSurface->TotSurfaces, 0);
    1294         771 :     state.dataHeatBalSurf->SurfTempTerm.dimension(state.dataSurface->TotSurfaces, 0);
    1295         771 :     state.dataHeatBalSurf->SurfTempDiv.dimension(state.dataSurface->TotSurfaces, 0);
    1296         771 :     if (state.dataHeatBal->AnyInternalHeatSourceInInput) {
    1297          36 :         state.dataHeatBalFanSys->CTFTsrcConstPart.dimension(state.dataSurface->TotSurfaces, 0.0);
    1298          36 :         state.dataHeatBalFanSys->CTFTuserConstPart.dimension(state.dataSurface->TotSurfaces, 0.0);
    1299             :     }
    1300             : 
    1301         771 :     state.dataHeatBal->SurfTempEffBulkAir.dimension(state.dataSurface->TotSurfaces, DataHeatBalance::ZoneInitialTemp);
    1302         771 :     state.dataHeatBalSurf->SurfHConvInt.dimension(state.dataSurface->TotSurfaces, 0.0);
    1303         771 :     state.dataHeatBalSurf->SurfHcExt.dimension(state.dataSurface->TotSurfaces, 0.0);
    1304         771 :     state.dataHeatBalSurf->SurfHAirExt.dimension(state.dataSurface->TotSurfaces, 0.0);
    1305         771 :     state.dataHeatBalSurf->SurfHSkyExt.dimension(state.dataSurface->TotSurfaces, 0.0);
    1306         771 :     state.dataHeatBalSurf->SurfHGrdExt.dimension(state.dataSurface->TotSurfaces, 0.0);
    1307             : 
    1308         771 :     state.dataHeatBalSurf->SurfTempIn.dimension(state.dataSurface->TotSurfaces, 0.0);
    1309         771 :     state.dataHeatBalSurf->SurfTempInsOld.dimension(state.dataSurface->TotSurfaces, 0.0);
    1310         771 :     state.dataHeatBalSurf->SurfTempInTmp.dimension(state.dataSurface->TotSurfaces, 0.0);
    1311         771 :     state.dataHeatBalSurfMgr->RefAirTemp.dimension(state.dataSurface->TotSurfaces, 0.0);
    1312         771 :     state.dataHeatBalSurf->SurfQRadLWOutSrdSurfs.dimension(state.dataSurface->TotSurfaces, 0.0);
    1313             : 
    1314         771 :     state.dataHeatBal->SurfWinQRadSWwinAbs.dimension(state.dataSurface->TotSurfaces, DataWindowEquivalentLayer::CFSMAXNL + 1, 0.0);
    1315         771 :     state.dataHeatBal->SurfWinInitialDifSolwinAbs.dimension(state.dataSurface->TotSurfaces, DataWindowEquivalentLayer::CFSMAXNL, 0.0);
    1316         771 :     state.dataHeatBalSurf->SurfQRadSWOutMvIns.dimension(state.dataSurface->TotSurfaces, 0.0);
    1317         771 :     state.dataHeatBal->SurfQdotRadIntGainsInPerArea.dimension(state.dataSurface->TotSurfaces, 0.0);
    1318         771 :     state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside.dimension(state.dataSurface->TotSurfaces, 0.0);
    1319         771 :     state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside.dimension(state.dataSurface->TotSurfaces, 0.0);
    1320             : 
    1321         771 :     state.dataHeatBalSurf->SurfInsideTempHist.allocate(Construction::MaxCTFTerms);
    1322         771 :     state.dataHeatBalSurf->SurfOutsideTempHist.allocate(Construction::MaxCTFTerms);
    1323         771 :     state.dataHeatBalSurf->SurfInsideFluxHist.allocate(Construction::MaxCTFTerms);
    1324         771 :     state.dataHeatBalSurf->SurfOutsideFluxHist.allocate(Construction::MaxCTFTerms);
    1325       15420 :     for (int loop = 1; loop <= Construction::MaxCTFTerms; ++loop) {
    1326       14649 :         state.dataHeatBalSurf->SurfInsideTempHist(loop).dimension(state.dataSurface->TotSurfaces, 0);
    1327       14649 :         state.dataHeatBalSurf->SurfOutsideTempHist(loop).dimension(state.dataSurface->TotSurfaces, 0);
    1328       14649 :         state.dataHeatBalSurf->SurfInsideFluxHist(loop).dimension(state.dataSurface->TotSurfaces, 0);
    1329       14649 :         state.dataHeatBalSurf->SurfOutsideFluxHist(loop).dimension(state.dataSurface->TotSurfaces, 0);
    1330             :     }
    1331             : 
    1332         771 :     if (!state.dataHeatBal->SimpleCTFOnly || state.dataGlobal->AnyEnergyManagementSystemInModel) {
    1333         131 :         state.dataHeatBalSurf->SurfCurrNumHist.dimension(state.dataSurface->TotSurfaces, 0);
    1334             : 
    1335         131 :         state.dataHeatBalSurf->SurfInsideTempHistMaster.allocate(Construction::MaxCTFTerms);
    1336         131 :         state.dataHeatBalSurf->SurfOutsideTempHistMaster.allocate(Construction::MaxCTFTerms);
    1337         131 :         state.dataHeatBalSurf->SurfInsideFluxHistMaster.allocate(Construction::MaxCTFTerms);
    1338         131 :         state.dataHeatBalSurf->SurfOutsideFluxHistMaster.allocate(Construction::MaxCTFTerms);
    1339             : 
    1340        2620 :         for (int loop = 1; loop <= Construction::MaxCTFTerms; ++loop) {
    1341        2489 :             state.dataHeatBalSurf->SurfInsideTempHistMaster(loop).dimension(state.dataSurface->TotSurfaces, 0);
    1342        2489 :             state.dataHeatBalSurf->SurfOutsideTempHistMaster(loop).dimension(state.dataSurface->TotSurfaces, 0);
    1343        2489 :             state.dataHeatBalSurf->SurfInsideFluxHistMaster(loop).dimension(state.dataSurface->TotSurfaces, 0);
    1344        2489 :             state.dataHeatBalSurf->SurfOutsideFluxHistMaster(loop).dimension(state.dataSurface->TotSurfaces, 0);
    1345             :         }
    1346             :     }
    1347             : 
    1348         771 :     state.dataHeatBalSurf->SurfTempOut.dimension(state.dataSurface->TotSurfaces, 0.0);
    1349         771 :     state.dataHeatBalSurf->SurfTempInMovInsRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1350         771 :     state.dataHeatBalSurf->SurfQConvInReport.dimension(state.dataSurface->TotSurfaces, 0.0);
    1351         771 :     state.dataHeatBalSurf->SurfQdotConvInPerArea.dimension(state.dataSurface->TotSurfaces, 0.0);
    1352         771 :     state.dataHeatBalSurf->SurfQdotConvInRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1353             : 
    1354         771 :     state.dataHeatBalSurf->SurfQRadNetSurfInReport.dimension(state.dataSurface->TotSurfaces, 0.0);
    1355         771 :     state.dataHeatBalSurf->SurfQdotRadNetSurfInRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1356             : 
    1357         771 :     state.dataHeatBalSurf->SurfQRadSolarInReport.dimension(state.dataSurface->TotSurfaces, 0.0);
    1358         771 :     state.dataHeatBalSurf->SurfQdotRadSolarInRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1359         771 :     state.dataHeatBalSurf->SurfQdotRadSolarInRepPerArea.dimension(state.dataSurface->TotSurfaces, 0.0);
    1360             : 
    1361         771 :     state.dataHeatBalSurf->SurfQRadLightsInReport.dimension(state.dataSurface->TotSurfaces, 0.0);
    1362         771 :     state.dataHeatBalSurf->SurfQdotRadLightsInRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1363             : 
    1364         771 :     state.dataHeatBalSurf->SurfQRadIntGainsInReport.dimension(state.dataSurface->TotSurfaces, 0.0);
    1365         771 :     state.dataHeatBalSurf->SurfQdotRadIntGainsInRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1366             : 
    1367         771 :     state.dataHeatBalSurf->AnyRadiantSystems.dimension(state.dataSurface->TotSurfaces, false);
    1368         771 :     state.dataHeatBalSurf->SurfQRadHVACInReport.dimension(state.dataSurface->TotSurfaces, 0.0);
    1369         771 :     state.dataHeatBalSurf->SurfQdotRadHVACInRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1370         771 :     state.dataHeatBalSurf->SurfQdotRadHVACInPerArea.dimension(state.dataSurface->TotSurfaces, 0.0);
    1371             : 
    1372         771 :     state.dataHeatBalSurf->SurfQConvOutReport.dimension(state.dataSurface->TotSurfaces, 0.0);
    1373         771 :     state.dataHeatBalSurf->SurfQdotConvOutPerArea.dimension(state.dataSurface->TotSurfaces, 0.0);
    1374         771 :     state.dataHeatBalSurf->SurfQdotConvOutRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1375             : 
    1376         771 :     state.dataHeatBalSurf->SurfQdotRadOutRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1377         771 :     state.dataHeatBalSurf->SurfQdotRadOutRepPerArea.dimension(state.dataSurface->TotSurfaces, 0.0);
    1378         771 :     state.dataHeatBalSurf->SurfQRadOutReport.dimension(state.dataSurface->TotSurfaces, 0.0);
    1379             : 
    1380         771 :     state.dataHeatBalSurf->SurfQAirExtReport.dimension(state.dataSurface->TotSurfaces, 0.0);
    1381         771 :     state.dataHeatBalSurf->SurfQHeatEmiReport.dimension(state.dataSurface->TotSurfaces, 0.0);
    1382             : 
    1383         771 :     state.dataHeatBal->SurfOpaqSWOutAbsTotalReport.dimension(state.dataSurface->TotSurfaces, 0.0);
    1384         771 :     state.dataHeatBal->SurfOpaqSWOutAbsEnergyReport.dimension(state.dataSurface->TotSurfaces, 0.0);
    1385             : 
    1386         771 :     state.dataHeatBalSurf->SurfOpaqInsFaceCond.dimension(state.dataSurface->TotSurfaces, 0.0);
    1387         771 :     state.dataHeatBalSurf->SurfOpaqInsFaceCondFlux.dimension(state.dataSurface->TotSurfaces, 0.0);
    1388         771 :     state.dataHeatBalSurf->SurfOpaqInsFaceCondGainRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1389         771 :     state.dataHeatBalSurf->SurfOpaqInsFaceCondLossRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1390         771 :     state.dataHeatBalSurf->SurfOpaqInsFaceCondEnergy.dimension(state.dataSurface->TotSurfaces, 0.0);
    1391             : 
    1392         771 :     state.dataHeatBalSurf->SurfOpaqOutFaceCond.dimension(state.dataSurface->TotSurfaces, 0.0);
    1393         771 :     state.dataHeatBalSurf->SurfOpaqOutFaceCondFlux.dimension(state.dataSurface->TotSurfaces, 0.0);
    1394         771 :     state.dataHeatBalSurf->SurfOpaqExtFaceCondGainRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1395         771 :     state.dataHeatBalSurf->SurfOpaqExtFaceCondLossRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1396         771 :     state.dataHeatBalSurf->SurfOpaqOutFaceCondEnergy.dimension(state.dataSurface->TotSurfaces, 0.0);
    1397             : 
    1398         771 :     state.dataHeatBalSurf->SurfOpaqAvgFaceCondGainRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1399         771 :     state.dataHeatBalSurf->SurfOpaqAvgFaceCondLossRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1400         771 :     state.dataHeatBalSurf->SurfOpaqAvgFaceCond.dimension(state.dataSurface->TotSurfaces, 0.0);
    1401         771 :     state.dataHeatBalSurf->SurfOpaqAvgFaceCondFlux.dimension(state.dataSurface->TotSurfaces, 0.0);
    1402         771 :     state.dataHeatBalSurf->SurfOpaqAvgFaceCondEnergy.dimension(state.dataSurface->TotSurfaces, 0.0);
    1403             : 
    1404         771 :     state.dataHeatBalSurf->SurfOpaqStorageCondGainRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1405         771 :     state.dataHeatBalSurf->SurfOpaqStorageCondLossRep.dimension(state.dataSurface->TotSurfaces, 0.0);
    1406         771 :     state.dataHeatBalSurf->SurfOpaqStorageCond.dimension(state.dataSurface->TotSurfaces, 0.0);
    1407         771 :     state.dataHeatBalSurf->SurfOpaqStorageCondFlux.dimension(state.dataSurface->TotSurfaces, 0.0);
    1408         771 :     state.dataHeatBalSurf->SurfOpaqStorageCondEnergy.dimension(state.dataSurface->TotSurfaces, 0.0);
    1409             : 
    1410         771 :     state.dataHeatBalSurf->SurfOpaqInsFaceBeamSolAbsorbed.dimension(state.dataSurface->TotSurfaces, 0.0);
    1411             : 
    1412         771 :     state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs.dimension(state.dataSurface->TotSurfaces, 0.0);
    1413         771 :     state.dataHeatBalSurf->SurfOpaqQRadSWInAbs.dimension(state.dataSurface->TotSurfaces, 0.0);
    1414             : 
    1415         771 :     state.dataHeatBalSurf->SurfOpaqInitialDifSolInAbs.dimension(state.dataSurface->TotSurfaces, 0.0);
    1416         771 :     state.dataHeatBalSurf->SurfWinInitialDifSolInTrans.dimension(state.dataSurface->TotSurfaces, 0.0);
    1417             : 
    1418         771 :     state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea.dimension(state.dataSurface->TotSurfaces, 0.0);
    1419         771 :     state.dataHeatBalSurf->SurfQdotRadLightsInPerArea.dimension(state.dataSurface->TotSurfaces, 0.0);
    1420             : 
    1421         771 :     if (state.dataHeatBal->AnyInternalHeatSourceInInput) {
    1422          36 :         state.dataHeatBalSurf->SurfTempSource.dimension(state.dataSurface->TotSurfaces, 0.0);
    1423          36 :         state.dataHeatBalSurf->SurfTempUserLoc.dimension(state.dataSurface->TotSurfaces, 0.0);
    1424          36 :         state.dataHeatBalSurf->SurfTsrcHist.dimension(state.dataSurface->TotSurfaces, Construction::MaxCTFTerms, 0.0);
    1425          36 :         state.dataHeatBalSurf->SurfTuserHist.dimension(state.dataSurface->TotSurfaces, Construction::MaxCTFTerms, 0.0);
    1426          36 :         state.dataHeatBalSurf->SurfQsrcHist.dimension(state.dataSurface->TotSurfaces, Construction::MaxCTFTerms, 0.0);
    1427          36 :         state.dataHeatBalSurf->SurfTsrcHistM.dimension(state.dataSurface->TotSurfaces, Construction::MaxCTFTerms, 0.0);
    1428          36 :         state.dataHeatBalSurf->SurfTuserHistM.dimension(state.dataSurface->TotSurfaces, Construction::MaxCTFTerms, 0.0);
    1429          36 :         state.dataHeatBalSurf->SurfQsrcHistM.dimension(state.dataSurface->TotSurfaces, Construction::MaxCTFTerms, 0.0);
    1430             :     }
    1431             : 
    1432         771 :     state.dataHeatBalFanSys->RadSysTiHBConstCoef.dimension(state.dataSurface->TotSurfaces, 0.0);
    1433         771 :     state.dataHeatBalFanSys->RadSysTiHBToutCoef.dimension(state.dataSurface->TotSurfaces, 0.0);
    1434         771 :     state.dataHeatBalFanSys->RadSysTiHBQsrcCoef.dimension(state.dataSurface->TotSurfaces, 0.0);
    1435         771 :     state.dataHeatBalFanSys->RadSysToHBConstCoef.dimension(state.dataSurface->TotSurfaces, 0.0);
    1436         771 :     state.dataHeatBalFanSys->RadSysToHBTinCoef.dimension(state.dataSurface->TotSurfaces, 0.0);
    1437         771 :     state.dataHeatBalFanSys->RadSysToHBQsrcCoef.dimension(state.dataSurface->TotSurfaces, 0.0);
    1438         771 :     state.dataHeatBalFanSys->QRadSysSource.dimension(state.dataSurface->TotSurfaces, 0.0);
    1439         771 :     state.dataHeatBalFanSys->TCondFDSourceNode.dimension(state.dataSurface->TotSurfaces, 15.0);
    1440         771 :     state.dataHeatBalFanSys->SurfQHTRadSys.dimension(state.dataSurface->TotSurfaces, 0.0);
    1441         771 :     state.dataHeatBalFanSys->SurfQHWBaseboard.dimension(state.dataSurface->TotSurfaces, 0.0);
    1442         771 :     state.dataHeatBalFanSys->SurfQSteamBaseboard.dimension(state.dataSurface->TotSurfaces, 0.0);
    1443         771 :     state.dataHeatBalFanSys->SurfQElecBaseboard.dimension(state.dataSurface->TotSurfaces, 0.0);
    1444         771 :     state.dataHeatBalFanSys->SurfQCoolingPanel.dimension(state.dataSurface->TotSurfaces, 0.0);
    1445         771 :     state.dataHeatBalFanSys->QRadSurfAFNDuct.dimension(state.dataSurface->TotSurfaces, 0.0);
    1446             : 
    1447             :     // allocate terms used for pool surface heat balance
    1448         771 :     state.dataHeatBalFanSys->QPoolSurfNumerator.dimension(state.dataSurface->TotSurfaces, 0.0);
    1449         771 :     state.dataHeatBalFanSys->PoolHeatTransCoefs.dimension(state.dataSurface->TotSurfaces, 0.0);
    1450             : 
    1451             :     // allocate term used as sink for PV electricity
    1452         771 :     state.dataHeatBalFanSys->QPVSysSource.dimension(state.dataSurface->TotSurfaces, 0.0);
    1453             : 
    1454             :     // Allocate the moisture balance arrays
    1455         771 :     state.dataMstBal->TempOutsideAirFD.dimension(state.dataSurface->TotSurfaces, 0.0);
    1456         771 :     state.dataMstBal->RhoVaporAirOut.dimension(state.dataSurface->TotSurfaces, 0.0);
    1457         771 :     state.dataMstBal->RhoVaporSurfIn.dimension(state.dataSurface->TotSurfaces, 0.0);
    1458         771 :     state.dataMstBal->RhoVaporAirIn.dimension(state.dataSurface->TotSurfaces, 0.0);
    1459         771 :     state.dataMstBal->HConvExtFD.dimension(state.dataSurface->TotSurfaces, 0.0);
    1460         771 :     state.dataMstBal->HMassConvExtFD.dimension(state.dataSurface->TotSurfaces, 0.0);
    1461         771 :     state.dataMstBal->HConvInFD.dimension(state.dataSurface->TotSurfaces, 0.0);
    1462         771 :     state.dataMstBal->HMassConvInFD.dimension(state.dataSurface->TotSurfaces, 0.0);
    1463         771 :     state.dataMstBal->HSkyFD.dimension(state.dataSurface->TotSurfaces, 0.0);
    1464         771 :     state.dataMstBal->HGrndFD.dimension(state.dataSurface->TotSurfaces, 0.0);
    1465         771 :     state.dataMstBal->HAirFD.dimension(state.dataSurface->TotSurfaces, 0.0);
    1466             : 
    1467         771 :     state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea.dimension(state.dataSurface->TotSurfaces, 0.0);
    1468         771 :     state.dataHeatBalSurf->SurfQdotRadLightsInPerArea.dimension(state.dataSurface->TotSurfaces, 0.0);
    1469         771 :     state.dataSurface->SurfSkySolarInc.dimension(state.dataSurface->TotSurfaces, 0);
    1470         771 :     state.dataSurface->SurfGndSolarInc.dimension(state.dataSurface->TotSurfaces, 0);
    1471             :     // allocate movable insulation arrays
    1472         771 :     if (state.dataSurface->AnyMovableInsulation) {
    1473           5 :         state.dataHeatBalSurf->SurfMovInsulExtPresent.dimension(state.dataSurface->TotSurfaces, false);
    1474           5 :         state.dataHeatBalSurf->SurfMovInsulIntPresent.dimension(state.dataSurface->TotSurfaces, false);
    1475           5 :         state.dataHeatBalSurf->SurfMovInsulIntPresentPrevTS.dimension(state.dataSurface->TotSurfaces, false);
    1476           5 :         state.dataHeatBalSurf->SurfMovInsulHExt.dimension(state.dataSurface->TotSurfaces, 0.0);
    1477           5 :         state.dataHeatBalSurf->SurfMovInsulHInt.dimension(state.dataSurface->TotSurfaces, 0.0);
    1478             :     }
    1479         771 :     state.dataHeatBalSurf->SurfAbsSolarExt.dimension(state.dataSurface->TotSurfaces, 0.0);
    1480         771 :     state.dataHeatBalSurf->SurfAbsThermalExt.dimension(state.dataSurface->TotSurfaces, 0.0);
    1481         771 :     state.dataHeatBalSurf->SurfRoughnessExt.dimension(state.dataSurface->TotSurfaces, DataSurfaces::SurfaceRoughness::Invalid);
    1482         771 :     state.dataHeatBalSurf->SurfAbsSolarInt.dimension(state.dataSurface->TotSurfaces, 0.0);
    1483         771 :     state.dataHeatBalSurf->SurfAbsThermalInt.dimension(state.dataSurface->TotSurfaces, 0.0);
    1484             : 
    1485         771 :     DisplayString(state, "Setting up Surface Reporting Variables");
    1486             :     // Setup surface report variables CurrentModuleObject='Opaque Surfaces'
    1487       44533 :     for (int loop = 1; loop <= state.dataSurface->TotSurfaces; ++loop) {
    1488       43762 :         if (!Surface(loop).HeatTransSurf) continue;
    1489      126621 :         SetupOutputVariable(state,
    1490             :                             "Surface Inside Face Temperature",
    1491             :                             OutputProcessor::Unit::C,
    1492       42207 :                             state.dataHeatBalSurf->SurfTempIn(loop),
    1493             :                             OutputProcessor::SOVTimeStepType::Zone,
    1494             :                             OutputProcessor::SOVStoreType::State,
    1495       84414 :                             Surface(loop).Name);
    1496      126621 :         SetupOutputVariable(state,
    1497             :                             "Surface Inside Face Interior Movable Insulation Temperature",
    1498             :                             OutputProcessor::Unit::C,
    1499       42207 :                             state.dataHeatBalSurf->SurfTempInMovInsRep(loop),
    1500             :                             OutputProcessor::SOVTimeStepType::Zone,
    1501             :                             OutputProcessor::SOVStoreType::State,
    1502       84414 :                             Surface(loop).Name);
    1503             : 
    1504       42207 :         if (Surface(loop).ExtBoundCond != KivaFoundation) {
    1505      126507 :             SetupOutputVariable(state,
    1506             :                                 "Surface Outside Face Temperature",
    1507             :                                 OutputProcessor::Unit::C,
    1508       42169 :                                 state.dataHeatBalSurf->SurfTempOut(loop),
    1509             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1510             :                                 OutputProcessor::SOVStoreType::State,
    1511       84338 :                                 Surface(loop).Name);
    1512             :         }
    1513             : 
    1514      126621 :         SetupOutputVariable(state,
    1515             :                             "Surface Inside Face Adjacent Air Temperature",
    1516             :                             OutputProcessor::Unit::C,
    1517       42207 :                             state.dataHeatBal->SurfTempEffBulkAir(loop),
    1518             :                             OutputProcessor::SOVTimeStepType::Zone,
    1519             :                             OutputProcessor::SOVStoreType::State,
    1520       84414 :                             Surface(loop).Name);
    1521      126621 :         SetupOutputVariable(state,
    1522             :                             "Surface Inside Face Convection Heat Transfer Coefficient",
    1523             :                             OutputProcessor::Unit::W_m2K,
    1524       42207 :                             state.dataHeatBalSurf->SurfHConvInt(loop),
    1525             :                             OutputProcessor::SOVTimeStepType::Zone,
    1526             :                             OutputProcessor::SOVStoreType::State,
    1527       84414 :                             Surface(loop).Name);
    1528      126621 :         SetupOutputVariable(state,
    1529             :                             "Surface Inside Face Convection Heat Gain Rate",
    1530             :                             OutputProcessor::Unit::W,
    1531       42207 :                             state.dataHeatBalSurf->SurfQdotConvInRep(loop),
    1532             :                             OutputProcessor::SOVTimeStepType::Zone,
    1533             :                             OutputProcessor::SOVStoreType::State,
    1534       84414 :                             Surface(loop).Name);
    1535      126621 :         SetupOutputVariable(state,
    1536             :                             "Surface Inside Face Convection Heat Gain Rate per Area",
    1537             :                             OutputProcessor::Unit::W_m2,
    1538       42207 :                             state.dataHeatBalSurf->SurfQdotConvInPerArea(loop),
    1539             :                             OutputProcessor::SOVTimeStepType::Zone,
    1540             :                             OutputProcessor::SOVStoreType::State,
    1541       84414 :                             Surface(loop).Name);
    1542      126621 :         SetupOutputVariable(state,
    1543             :                             "Surface Inside Face Convection Heat Gain Energy",
    1544             :                             OutputProcessor::Unit::J,
    1545       42207 :                             state.dataHeatBalSurf->SurfQConvInReport(loop),
    1546             :                             OutputProcessor::SOVTimeStepType::Zone,
    1547             :                             OutputProcessor::SOVStoreType::Summed,
    1548       84414 :                             Surface(loop).Name);
    1549             : 
    1550      126621 :         SetupOutputVariable(state,
    1551             :                             "Surface Inside Face Net Surface Thermal Radiation Heat Gain Rate",
    1552             :                             OutputProcessor::Unit::W,
    1553       42207 :                             state.dataHeatBalSurf->SurfQdotRadNetSurfInRep(loop),
    1554             :                             OutputProcessor::SOVTimeStepType::Zone,
    1555             :                             OutputProcessor::SOVStoreType::State,
    1556       84414 :                             Surface(loop).Name);
    1557      126621 :         SetupOutputVariable(state,
    1558             :                             "Surface Inside Face Net Surface Thermal Radiation Heat Gain Rate per Area",
    1559             :                             OutputProcessor::Unit::W_m2,
    1560       42207 :                             state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(loop),
    1561             :                             OutputProcessor::SOVTimeStepType::Zone,
    1562             :                             OutputProcessor::SOVStoreType::State,
    1563       84414 :                             Surface(loop).Name);
    1564      126621 :         SetupOutputVariable(state,
    1565             :                             "Surface Inside Face Net Surface Thermal Radiation Heat Gain Energy",
    1566             :                             OutputProcessor::Unit::J,
    1567       42207 :                             state.dataHeatBalSurf->SurfQRadNetSurfInReport(loop),
    1568             :                             OutputProcessor::SOVTimeStepType::Zone,
    1569             :                             OutputProcessor::SOVStoreType::Summed,
    1570       84414 :                             Surface(loop).Name);
    1571             : 
    1572       42207 :         if (Surface(loop).Class != SurfaceClass::Window) {
    1573      108699 :             SetupOutputVariable(state,
    1574             :                                 "Surface Inside Face Solar Radiation Heat Gain Rate",
    1575             :                                 OutputProcessor::Unit::W,
    1576       36233 :                                 state.dataHeatBalSurf->SurfQdotRadSolarInRep(loop),
    1577             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1578             :                                 OutputProcessor::SOVStoreType::State,
    1579       72466 :                                 Surface(loop).Name);
    1580      108699 :             SetupOutputVariable(state,
    1581             :                                 "Surface Inside Face Solar Radiation Heat Gain Rate per Area",
    1582             :                                 OutputProcessor::Unit::W_m2,
    1583       36233 :                                 state.dataHeatBalSurf->SurfQdotRadSolarInRepPerArea(loop),
    1584             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1585             :                                 OutputProcessor::SOVStoreType::State,
    1586       72466 :                                 Surface(loop).Name);
    1587      108699 :             SetupOutputVariable(state,
    1588             :                                 "Surface Inside Face Solar Radiation Heat Gain Energy",
    1589             :                                 OutputProcessor::Unit::J,
    1590       36233 :                                 state.dataHeatBalSurf->SurfQRadSolarInReport(loop),
    1591             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1592             :                                 OutputProcessor::SOVStoreType::Summed,
    1593       72466 :                                 Surface(loop).Name);
    1594             : 
    1595      108699 :             SetupOutputVariable(state,
    1596             :                                 "Surface Inside Face Lights Radiation Heat Gain Rate",
    1597             :                                 OutputProcessor::Unit::W,
    1598       36233 :                                 state.dataHeatBalSurf->SurfQdotRadLightsInRep(loop),
    1599             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1600             :                                 OutputProcessor::SOVStoreType::State,
    1601       72466 :                                 Surface(loop).Name);
    1602      108699 :             SetupOutputVariable(state,
    1603             :                                 "Surface Inside Face Lights Radiation Heat Gain Rate per Area",
    1604             :                                 OutputProcessor::Unit::W_m2,
    1605       36233 :                                 state.dataHeatBalSurf->SurfQdotRadLightsInPerArea(loop),
    1606             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1607             :                                 OutputProcessor::SOVStoreType::State,
    1608       72466 :                                 Surface(loop).Name);
    1609      108699 :             SetupOutputVariable(state,
    1610             :                                 "Surface Inside Face Lights Radiation Heat Gain Energy",
    1611             :                                 OutputProcessor::Unit::J,
    1612       36233 :                                 state.dataHeatBalSurf->SurfQRadLightsInReport(loop),
    1613             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1614             :                                 OutputProcessor::SOVStoreType::Summed,
    1615       72466 :                                 Surface(loop).Name);
    1616             :         }
    1617             : 
    1618      126621 :         SetupOutputVariable(state,
    1619             :                             "Surface Inside Face Internal Gains Radiation Heat Gain Rate",
    1620             :                             OutputProcessor::Unit::W,
    1621       42207 :                             state.dataHeatBalSurf->SurfQdotRadIntGainsInRep(loop),
    1622             :                             OutputProcessor::SOVTimeStepType::Zone,
    1623             :                             OutputProcessor::SOVStoreType::State,
    1624       84414 :                             Surface(loop).Name);
    1625      126621 :         SetupOutputVariable(state,
    1626             :                             "Surface Inside Face Internal Gains Radiation Heat Gain Rate per Area",
    1627             :                             OutputProcessor::Unit::W_m2,
    1628       42207 :                             state.dataHeatBal->SurfQdotRadIntGainsInPerArea(loop),
    1629             :                             OutputProcessor::SOVTimeStepType::Zone,
    1630             :                             OutputProcessor::SOVStoreType::State,
    1631       84414 :                             Surface(loop).Name);
    1632      126621 :         SetupOutputVariable(state,
    1633             :                             "Surface Inside Face Internal Gains Radiation Heat Gain Energy",
    1634             :                             OutputProcessor::Unit::J,
    1635       42207 :                             state.dataHeatBalSurf->SurfQRadIntGainsInReport(loop),
    1636             :                             OutputProcessor::SOVTimeStepType::Zone,
    1637             :                             OutputProcessor::SOVStoreType::Summed,
    1638       84414 :                             Surface(loop).Name);
    1639             : 
    1640      126621 :         SetupOutputVariable(state,
    1641             :                             "Surface Inside Face System Radiation Heat Gain Rate",
    1642             :                             OutputProcessor::Unit::W,
    1643       42207 :                             state.dataHeatBalSurf->SurfQdotRadHVACInRep(loop),
    1644             :                             OutputProcessor::SOVTimeStepType::Zone,
    1645             :                             OutputProcessor::SOVStoreType::State,
    1646       84414 :                             Surface(loop).Name);
    1647      126621 :         SetupOutputVariable(state,
    1648             :                             "Surface Inside Face System Radiation Heat Gain Rate per Area",
    1649             :                             OutputProcessor::Unit::W_m2,
    1650       42207 :                             state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(loop),
    1651             :                             OutputProcessor::SOVTimeStepType::Zone,
    1652             :                             OutputProcessor::SOVStoreType::State,
    1653       84414 :                             Surface(loop).Name);
    1654      126621 :         SetupOutputVariable(state,
    1655             :                             "Surface Inside Face System Radiation Heat Gain Energy",
    1656             :                             OutputProcessor::Unit::J,
    1657       42207 :                             state.dataHeatBalSurf->SurfQRadHVACInReport(loop),
    1658             :                             OutputProcessor::SOVTimeStepType::Zone,
    1659             :                             OutputProcessor::SOVStoreType::Summed,
    1660       84414 :                             Surface(loop).Name);
    1661             : 
    1662       42207 :         if (Surface(loop).ExtBoundCond == ExternalEnvironment || state.dataGlobal->DisplayAdvancedReportVariables) {
    1663       51987 :             SetupOutputVariable(state,
    1664             :                                 "Surface Outside Face Outdoor Air Drybulb Temperature",
    1665             :                                 OutputProcessor::Unit::C,
    1666       17329 :                                 state.dataSurface->SurfOutDryBulbTemp(loop),
    1667             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1668             :                                 OutputProcessor::SOVStoreType::State,
    1669       34658 :                                 Surface(loop).Name);
    1670       51987 :             SetupOutputVariable(state,
    1671             :                                 "Surface Outside Face Outdoor Air Wetbulb Temperature",
    1672             :                                 OutputProcessor::Unit::C,
    1673       17329 :                                 state.dataSurface->SurfOutWetBulbTemp(loop),
    1674             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1675             :                                 OutputProcessor::SOVStoreType::State,
    1676       34658 :                                 Surface(loop).Name);
    1677       51987 :             SetupOutputVariable(state,
    1678             :                                 "Surface Outside Face Outdoor Air Wind Speed",
    1679             :                                 OutputProcessor::Unit::m_s,
    1680       17329 :                                 state.dataSurface->SurfOutWindSpeed(loop),
    1681             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1682             :                                 OutputProcessor::SOVStoreType::State,
    1683       34658 :                                 Surface(loop).Name);
    1684       51987 :             SetupOutputVariable(state,
    1685             :                                 "Surface Outside Face Outdoor Air Wind Direction",
    1686             :                                 OutputProcessor::Unit::deg,
    1687       17329 :                                 state.dataSurface->SurfOutWindDir(loop),
    1688             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1689             :                                 OutputProcessor::SOVStoreType::State,
    1690       34658 :                                 Surface(loop).Name);
    1691       51987 :             SetupOutputVariable(state,
    1692             :                                 "Surface Outside Face Convection Heat Gain Rate",
    1693             :                                 OutputProcessor::Unit::W,
    1694       17329 :                                 state.dataHeatBalSurf->SurfQdotConvOutRep(loop),
    1695             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1696             :                                 OutputProcessor::SOVStoreType::State,
    1697       34658 :                                 Surface(loop).Name);
    1698       51987 :             SetupOutputVariable(state,
    1699             :                                 "Surface Outside Face Convection Heat Gain Rate per Area",
    1700             :                                 OutputProcessor::Unit::W_m2,
    1701       17329 :                                 state.dataHeatBalSurf->SurfQdotConvOutPerArea(loop),
    1702             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1703             :                                 OutputProcessor::SOVStoreType::State,
    1704       34658 :                                 Surface(loop).Name);
    1705       51987 :             SetupOutputVariable(state,
    1706             :                                 "Surface Outside Face Convection Heat Gain Energy",
    1707             :                                 OutputProcessor::Unit::J,
    1708       17329 :                                 state.dataHeatBalSurf->SurfQConvOutReport(loop),
    1709             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1710             :                                 OutputProcessor::SOVStoreType::Summed,
    1711       34658 :                                 Surface(loop).Name);
    1712       51987 :             SetupOutputVariable(state,
    1713             :                                 "Surface Outside Face Convection Heat Transfer Coefficient",
    1714             :                                 OutputProcessor::Unit::W_m2K,
    1715       17329 :                                 state.dataHeatBalSurf->SurfHcExt(loop),
    1716             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1717             :                                 OutputProcessor::SOVStoreType::State,
    1718       34658 :                                 Surface(loop).Name);
    1719       51987 :             SetupOutputVariable(state,
    1720             :                                 "Surface Outside Face Net Thermal Radiation Heat Gain Rate",
    1721             :                                 OutputProcessor::Unit::W,
    1722       17329 :                                 state.dataHeatBalSurf->SurfQdotRadOutRep(loop),
    1723             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1724             :                                 OutputProcessor::SOVStoreType::State,
    1725       34658 :                                 Surface(loop).Name);
    1726       51987 :             SetupOutputVariable(state,
    1727             :                                 "Surface Outside Face Net Thermal Radiation Heat Gain Rate per Area",
    1728             :                                 OutputProcessor::Unit::W_m2,
    1729       17329 :                                 state.dataHeatBalSurf->SurfQdotRadOutRepPerArea(loop),
    1730             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1731             :                                 OutputProcessor::SOVStoreType::State,
    1732       34658 :                                 Surface(loop).Name);
    1733       51987 :             SetupOutputVariable(state,
    1734             :                                 "Surface Outside Face Net Thermal Radiation Heat Gain Energy",
    1735             :                                 OutputProcessor::Unit::J,
    1736       17329 :                                 state.dataHeatBalSurf->SurfQRadOutReport(loop),
    1737             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1738             :                                 OutputProcessor::SOVStoreType::Summed,
    1739       34658 :                                 Surface(loop).Name);
    1740       51987 :             SetupOutputVariable(state,
    1741             :                                 "Surface Outside Face Thermal Radiation to Air Heat Transfer Coefficient",
    1742             :                                 OutputProcessor::Unit::W_m2K,
    1743       17329 :                                 state.dataHeatBalSurf->SurfHAirExt(loop),
    1744             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1745             :                                 OutputProcessor::SOVStoreType::State,
    1746       34658 :                                 Surface(loop).Name);
    1747       51987 :             SetupOutputVariable(state,
    1748             :                                 "Surface Outside Face Thermal Radiation to Sky Heat Transfer Coefficient",
    1749             :                                 OutputProcessor::Unit::W_m2K,
    1750       17329 :                                 state.dataHeatBalSurf->SurfHSkyExt(loop),
    1751             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1752             :                                 OutputProcessor::SOVStoreType::State,
    1753       34658 :                                 Surface(loop).Name);
    1754       51987 :             SetupOutputVariable(state,
    1755             :                                 "Surface Outside Face Thermal Radiation to Ground Heat Transfer Coefficient",
    1756             :                                 OutputProcessor::Unit::W_m2K,
    1757       17329 :                                 state.dataHeatBalSurf->SurfHGrdExt(loop),
    1758             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1759             :                                 OutputProcessor::SOVStoreType::State,
    1760       34658 :                                 Surface(loop).Name);
    1761       51987 :             SetupOutputVariable(state,
    1762             :                                 "Surface Outside Face Thermal Radiation to Air Heat Transfer Rate",
    1763             :                                 OutputProcessor::Unit::W,
    1764       17329 :                                 state.dataHeatBalSurf->SurfQAirExtReport(loop),
    1765             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1766             :                                 OutputProcessor::SOVStoreType::State,
    1767       34658 :                                 Surface(loop).Name);
    1768       51987 :             SetupOutputVariable(state,
    1769             :                                 "Surface Outside Face Heat Emission to Air Rate",
    1770             :                                 OutputProcessor::Unit::W,
    1771       17329 :                                 state.dataHeatBalSurf->SurfQHeatEmiReport(loop),
    1772             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1773             :                                 OutputProcessor::SOVStoreType::State,
    1774       34658 :                                 Surface(loop).Name);
    1775             : 
    1776       17329 :             if (Surface(loop).Class != SurfaceClass::Window) {
    1777       34107 :                 SetupOutputVariable(state,
    1778             :                                     "Surface Outside Face Solar Radiation Heat Gain Rate",
    1779             :                                     OutputProcessor::Unit::W,
    1780       11369 :                                     state.dataHeatBal->SurfOpaqSWOutAbsTotalReport(loop),
    1781             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1782             :                                     OutputProcessor::SOVStoreType::Average,
    1783       22738 :                                     Surface(loop).Name);
    1784       34107 :                 SetupOutputVariable(state,
    1785             :                                     "Surface Outside Face Solar Radiation Heat Gain Rate per Area",
    1786             :                                     OutputProcessor::Unit::W_m2,
    1787       11369 :                                     state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(loop),
    1788             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1789             :                                     OutputProcessor::SOVStoreType::Average,
    1790       22738 :                                     Surface(loop).Name);
    1791       34107 :                 SetupOutputVariable(state,
    1792             :                                     "Surface Outside Face Solar Radiation Heat Gain Energy",
    1793             :                                     OutputProcessor::Unit::J,
    1794       11369 :                                     state.dataHeatBal->SurfOpaqSWOutAbsEnergyReport(loop),
    1795             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1796             :                                     OutputProcessor::SOVStoreType::Summed,
    1797       22738 :                                     Surface(loop).Name);
    1798             :             }
    1799             :         }
    1800      132032 :         if (Surface(loop).Class == SurfaceClass::Floor || Surface(loop).Class == SurfaceClass::Wall || Surface(loop).Class == SurfaceClass::IntMass ||
    1801       60583 :             Surface(loop).Class == SurfaceClass::Roof || Surface(loop).Class == SurfaceClass::Door) {
    1802             :             //      IF (DisplayAdvancedReportVariables) THEN  !CurrentModuleObject='Opaque Surfaces(Advanced)'
    1803      108690 :             SetupOutputVariable(state,
    1804             :                                 "Surface Inside Face Conduction Heat Transfer Rate",
    1805             :                                 OutputProcessor::Unit::W,
    1806       36230 :                                 state.dataHeatBalSurf->SurfOpaqInsFaceCond(loop),
    1807             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1808             :                                 OutputProcessor::SOVStoreType::State,
    1809       72460 :                                 Surface(loop).Name);
    1810      108690 :             SetupOutputVariable(state,
    1811             :                                 "Surface Inside Face Conduction Heat Gain Rate",
    1812             :                                 OutputProcessor::Unit::W,
    1813       36230 :                                 state.dataHeatBalSurf->SurfOpaqInsFaceCondGainRep(loop),
    1814             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1815             :                                 OutputProcessor::SOVStoreType::State,
    1816       72460 :                                 Surface(loop).Name);
    1817      108690 :             SetupOutputVariable(state,
    1818             :                                 "Surface Inside Face Conduction Heat Loss Rate",
    1819             :                                 OutputProcessor::Unit::W,
    1820       36230 :                                 state.dataHeatBalSurf->SurfOpaqInsFaceCondLossRep(loop),
    1821             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1822             :                                 OutputProcessor::SOVStoreType::State,
    1823       72460 :                                 Surface(loop).Name);
    1824      108690 :             SetupOutputVariable(state,
    1825             :                                 "Surface Inside Face Conduction Heat Transfer Rate per Area",
    1826             :                                 OutputProcessor::Unit::W_m2,
    1827       36230 :                                 state.dataHeatBalSurf->SurfOpaqInsFaceCondFlux(loop),
    1828             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1829             :                                 OutputProcessor::SOVStoreType::State,
    1830       72460 :                                 Surface(loop).Name);
    1831      108690 :             SetupOutputVariable(state,
    1832             :                                 "Surface Inside Face Conduction Heat Transfer Energy",
    1833             :                                 OutputProcessor::Unit::J,
    1834       36230 :                                 state.dataHeatBalSurf->SurfOpaqInsFaceCondEnergy(loop),
    1835             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1836             :                                 OutputProcessor::SOVStoreType::Summed,
    1837       72460 :                                 Surface(loop).Name);
    1838             : 
    1839       36230 :             if (Surface(loop).ExtBoundCond != KivaFoundation) {
    1840      108576 :                 SetupOutputVariable(state,
    1841             :                                     "Surface Outside Face Conduction Heat Transfer Rate",
    1842             :                                     OutputProcessor::Unit::W,
    1843       36192 :                                     state.dataHeatBalSurf->SurfOpaqOutFaceCond(loop),
    1844             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1845             :                                     OutputProcessor::SOVStoreType::State,
    1846       72384 :                                     Surface(loop).Name);
    1847      108576 :                 SetupOutputVariable(state,
    1848             :                                     "Surface Outside Face Conduction Heat Gain Rate",
    1849             :                                     OutputProcessor::Unit::W,
    1850       36192 :                                     state.dataHeatBalSurf->SurfOpaqExtFaceCondGainRep(loop),
    1851             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1852             :                                     OutputProcessor::SOVStoreType::State,
    1853       72384 :                                     Surface(loop).Name);
    1854      108576 :                 SetupOutputVariable(state,
    1855             :                                     "Surface Outside Face Conduction Heat Loss Rate",
    1856             :                                     OutputProcessor::Unit::W,
    1857       36192 :                                     state.dataHeatBalSurf->SurfOpaqExtFaceCondLossRep(loop),
    1858             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1859             :                                     OutputProcessor::SOVStoreType::State,
    1860       72384 :                                     Surface(loop).Name);
    1861      108576 :                 SetupOutputVariable(state,
    1862             :                                     "Surface Outside Face Conduction Heat Transfer Rate per Area",
    1863             :                                     OutputProcessor::Unit::W_m2,
    1864       36192 :                                     state.dataHeatBalSurf->SurfOpaqOutFaceCondFlux(loop),
    1865             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1866             :                                     OutputProcessor::SOVStoreType::State,
    1867       72384 :                                     Surface(loop).Name);
    1868      108576 :                 SetupOutputVariable(state,
    1869             :                                     "Surface Outside Face Conduction Heat Transfer Energy",
    1870             :                                     OutputProcessor::Unit::J,
    1871       36192 :                                     state.dataHeatBalSurf->SurfOpaqOutFaceCondEnergy(loop),
    1872             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1873             :                                     OutputProcessor::SOVStoreType::Summed,
    1874       72384 :                                     Surface(loop).Name);
    1875             : 
    1876      108576 :                 SetupOutputVariable(state,
    1877             :                                     "Surface Average Face Conduction Heat Transfer Rate",
    1878             :                                     OutputProcessor::Unit::W,
    1879       36192 :                                     state.dataHeatBalSurf->SurfOpaqAvgFaceCond(loop),
    1880             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1881             :                                     OutputProcessor::SOVStoreType::State,
    1882       72384 :                                     Surface(loop).Name);
    1883      108576 :                 SetupOutputVariable(state,
    1884             :                                     "Surface Average Face Conduction Heat Gain Rate",
    1885             :                                     OutputProcessor::Unit::W,
    1886       36192 :                                     state.dataHeatBalSurf->SurfOpaqAvgFaceCondGainRep(loop),
    1887             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1888             :                                     OutputProcessor::SOVStoreType::State,
    1889       72384 :                                     Surface(loop).Name);
    1890      108576 :                 SetupOutputVariable(state,
    1891             :                                     "Surface Average Face Conduction Heat Loss Rate",
    1892             :                                     OutputProcessor::Unit::W,
    1893       36192 :                                     state.dataHeatBalSurf->SurfOpaqAvgFaceCondLossRep(loop),
    1894             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1895             :                                     OutputProcessor::SOVStoreType::State,
    1896       72384 :                                     Surface(loop).Name);
    1897      108576 :                 SetupOutputVariable(state,
    1898             :                                     "Surface Average Face Conduction Heat Transfer Rate per Area",
    1899             :                                     OutputProcessor::Unit::W_m2,
    1900       36192 :                                     state.dataHeatBalSurf->SurfOpaqAvgFaceCondFlux(loop),
    1901             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1902             :                                     OutputProcessor::SOVStoreType::State,
    1903       72384 :                                     Surface(loop).Name);
    1904      108576 :                 SetupOutputVariable(state,
    1905             :                                     "Surface Average Face Conduction Heat Transfer Energy",
    1906             :                                     OutputProcessor::Unit::J,
    1907       36192 :                                     state.dataHeatBalSurf->SurfOpaqAvgFaceCondEnergy(loop),
    1908             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1909             :                                     OutputProcessor::SOVStoreType::Summed,
    1910       72384 :                                     Surface(loop).Name);
    1911             : 
    1912      108576 :                 SetupOutputVariable(state,
    1913             :                                     "Surface Heat Storage Rate",
    1914             :                                     OutputProcessor::Unit::W,
    1915       36192 :                                     state.dataHeatBalSurf->SurfOpaqStorageCond(loop),
    1916             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1917             :                                     OutputProcessor::SOVStoreType::State,
    1918       72384 :                                     Surface(loop).Name);
    1919      108576 :                 SetupOutputVariable(state,
    1920             :                                     "Surface Heat Storage Gain Rate",
    1921             :                                     OutputProcessor::Unit::W,
    1922       36192 :                                     state.dataHeatBalSurf->SurfOpaqStorageCondGainRep(loop),
    1923             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1924             :                                     OutputProcessor::SOVStoreType::State,
    1925       72384 :                                     Surface(loop).Name);
    1926      108576 :                 SetupOutputVariable(state,
    1927             :                                     "Surface Heat Storage Loss Rate",
    1928             :                                     OutputProcessor::Unit::W,
    1929       36192 :                                     state.dataHeatBalSurf->SurfOpaqStorageCondLossRep(loop),
    1930             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1931             :                                     OutputProcessor::SOVStoreType::State,
    1932       72384 :                                     Surface(loop).Name);
    1933      108576 :                 SetupOutputVariable(state,
    1934             :                                     "Surface Heat Storage Rate per Area",
    1935             :                                     OutputProcessor::Unit::W_m2,
    1936       36192 :                                     state.dataHeatBalSurf->SurfOpaqStorageCondFlux(loop),
    1937             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1938             :                                     OutputProcessor::SOVStoreType::State,
    1939       72384 :                                     Surface(loop).Name);
    1940      108576 :                 SetupOutputVariable(state,
    1941             :                                     "Surface Heat Storage Energy",
    1942             :                                     OutputProcessor::Unit::J,
    1943       36192 :                                     state.dataHeatBalSurf->SurfOpaqStorageCondEnergy(loop),
    1944             :                                     OutputProcessor::SOVTimeStepType::Zone,
    1945             :                                     OutputProcessor::SOVStoreType::Summed,
    1946       72384 :                                     Surface(loop).Name);
    1947             :             }
    1948             : 
    1949             :             //      ENDIF
    1950             :             // CurrentModuleObject='Opaque Surfaces'
    1951             : 
    1952      108690 :             SetupOutputVariable(state,
    1953             :                                 "Surface Inside Face Beam Solar Radiation Heat Gain Rate",
    1954             :                                 OutputProcessor::Unit::W,
    1955       36230 :                                 state.dataHeatBalSurf->SurfOpaqInsFaceBeamSolAbsorbed(loop),
    1956             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1957             :                                 OutputProcessor::SOVStoreType::State,
    1958       72460 :                                 Surface(loop).Name);
    1959             :         }
    1960       42207 :         if (state.dataConstruction->Construct(Surface(loop).Construction).SourceSinkPresent) {
    1961         426 :             SetupOutputVariable(state,
    1962             :                                 "Surface Internal Source Location Temperature",
    1963             :                                 OutputProcessor::Unit::C,
    1964         142 :                                 state.dataHeatBalSurf->SurfTempSource(loop),
    1965             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1966             :                                 OutputProcessor::SOVStoreType::State,
    1967         284 :                                 Surface(loop).Name);
    1968         426 :             SetupOutputVariable(state,
    1969             :                                 "Surface Internal User Specified Location Temperature",
    1970             :                                 OutputProcessor::Unit::C,
    1971         142 :                                 state.dataHeatBalSurf->SurfTempUserLoc(loop),
    1972             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1973             :                                 OutputProcessor::SOVStoreType::State,
    1974         284 :                                 Surface(loop).Name);
    1975             :         }
    1976             : 
    1977       42207 :         if (Surface(loop).Class == SurfaceClass::Window) { // CurrentModuleObject='Windows'
    1978       17922 :             SetupOutputVariable(state,
    1979             :                                 "Surface Shading Device Is On Time Fraction",
    1980             :                                 OutputProcessor::Unit::None,
    1981        5974 :                                 state.dataSurface->SurfWinFracTimeShadingDeviceOn(loop),
    1982             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1983             :                                 OutputProcessor::SOVStoreType::Average,
    1984       11948 :                                 Surface(loop).Name);
    1985       23896 :             SetupOutputVariable(state,
    1986             :                                 "Surface Storm Window On Off Status",
    1987             :                                 OutputProcessor::Unit::None,
    1988        5974 :                                 state.dataSurface->SurfWinStormWinFlag(loop),
    1989             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1990             :                                 OutputProcessor::SOVStoreType::State,
    1991       11948 :                                 Surface(loop).Name);
    1992       17922 :             SetupOutputVariable(state,
    1993             :                                 "Surface Window Blind Slat Angle",
    1994             :                                 OutputProcessor::Unit::deg,
    1995        5974 :                                 state.dataSurface->SurfWinSlatAngThisTSDeg(loop),
    1996             :                                 OutputProcessor::SOVTimeStepType::Zone,
    1997             :                                 OutputProcessor::SOVStoreType::State,
    1998       11948 :                                 Surface(loop).Name);
    1999             :         }
    2000             :         //    IF (DisplayAdvancedReportVariables) THEN  !CurrentModuleObject='Opaque Surfaces(Advanced)'
    2001      168828 :         SetupOutputVariable(state,
    2002             :                             "Surface Inside Face Convection Classification Index",
    2003             :                             OutputProcessor::Unit::None,
    2004       42207 :                             state.dataSurface->SurfIntConvClassificationRpt(loop),
    2005             :                             OutputProcessor::SOVTimeStepType::Zone,
    2006             :                             OutputProcessor::SOVStoreType::Average,
    2007       84414 :                             Surface(loop).Name);
    2008      168828 :         SetupOutputVariable(state,
    2009             :                             "Surface Inside Face Convection Model Equation Index",
    2010             :                             OutputProcessor::Unit::None,
    2011       42207 :                             state.dataSurface->SurfIntConvHcModelEq(loop),
    2012             :                             OutputProcessor::SOVTimeStepType::Zone,
    2013             :                             OutputProcessor::SOVStoreType::Average,
    2014       84414 :                             Surface(loop).Name);
    2015      168828 :         SetupOutputVariable(state,
    2016             :                             "Surface Inside Face Convection Reference Air Index",
    2017             :                             OutputProcessor::Unit::None,
    2018       42207 :                             state.dataSurface->SurfTAirRefRpt(loop),
    2019             :                             OutputProcessor::SOVTimeStepType::Zone,
    2020             :                             OutputProcessor::SOVStoreType::Average,
    2021       84414 :                             Surface(loop).Name);
    2022       42207 :         if (Surface(loop).ExtBoundCond == ExternalEnvironment) {
    2023       68320 :             SetupOutputVariable(state,
    2024             :                                 "Surface Outside Face Convection Classification Index",
    2025             :                                 OutputProcessor::Unit::None,
    2026       17080 :                                 state.dataSurface->SurfOutConvClassificationRpt(loop),
    2027             :                                 OutputProcessor::SOVTimeStepType::Zone,
    2028             :                                 OutputProcessor::SOVStoreType::Average,
    2029       34160 :                                 Surface(loop).Name);
    2030       68320 :             SetupOutputVariable(state,
    2031             :                                 "Surface Outside Face Forced Convection Model Equation Index",
    2032             :                                 OutputProcessor::Unit::None,
    2033       17080 :                                 state.dataSurface->SurfOutConvHfModelEq(loop),
    2034             :                                 OutputProcessor::SOVTimeStepType::Zone,
    2035             :                                 OutputProcessor::SOVStoreType::Average,
    2036       34160 :                                 Surface(loop).Name);
    2037       68320 :             SetupOutputVariable(state,
    2038             :                                 "Surface Outside Face Natural Convection Model Equation Index",
    2039             :                                 OutputProcessor::Unit::None,
    2040       17080 :                                 state.dataSurface->SurfOutConvHnModelEq(loop),
    2041             :                                 OutputProcessor::SOVTimeStepType::Zone,
    2042             :                                 OutputProcessor::SOVStoreType::Average,
    2043       34160 :                                 Surface(loop).Name);
    2044             :         }
    2045             : 
    2046      126621 :         SetupOutputVariable(state,
    2047             :                             "Surface Inside Face Heat Source Gain Rate per Area",
    2048             :                             OutputProcessor::Unit::W_m2,
    2049       42207 :                             state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(loop),
    2050             :                             OutputProcessor::SOVTimeStepType::Zone,
    2051             :                             OutputProcessor::SOVStoreType::Average,
    2052       84414 :                             Surface(loop).Name);
    2053      126621 :         SetupOutputVariable(state,
    2054             :                             "Surface Outside Face Heat Source Gain Rate per Area",
    2055             :                             OutputProcessor::Unit::W_m2,
    2056       42207 :                             state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(loop),
    2057             :                             OutputProcessor::SOVTimeStepType::Zone,
    2058             :                             OutputProcessor::SOVStoreType::Average,
    2059       84414 :                             Surface(loop).Name);
    2060             : 
    2061             :         //     ENDIF
    2062       42207 :         if (state.dataGlobal->DisplayAdvancedReportVariables) {
    2063        2240 :             SetupOutputVariable(state,
    2064             :                                 "Surface Construction Index",
    2065             :                                 OutputProcessor::Unit::None,
    2066         560 :                                 Surface(loop).Construction,
    2067             :                                 OutputProcessor::SOVTimeStepType::Zone,
    2068             :                                 OutputProcessor::SOVStoreType::Average,
    2069        1120 :                                 Surface(loop).Name);
    2070             :         }
    2071             :     }
    2072             : 
    2073        2313 :     SetupOutputVariable(state,
    2074             :                         "Site Total Surface Heat Emission to Air",
    2075             :                         OutputProcessor::Unit::J,
    2076         771 :                         state.dataHeatBalSurf->SumSurfaceHeatEmission,
    2077             :                         OutputProcessor::SOVTimeStepType::Zone,
    2078             :                         OutputProcessor::SOVStoreType::Summed,
    2079        1542 :                         "Environment");
    2080         771 : }
    2081             : 
    2082        6218 : void InitThermalAndFluxHistories(EnergyPlusData &state)
    2083             : {
    2084             : 
    2085             :     // SUBROUTINE INFORMATION:
    2086             :     //       AUTHOR         George Walton
    2087             :     //       DATE WRITTEN   March 1978
    2088             :     //       MODIFIED       na
    2089             :     //       RE-ENGINEERED  Feb98 (RKS)
    2090             : 
    2091             :     // PURPOSE OF THIS SUBROUTINE:
    2092             :     // This subroutine sets the initial temperature and flux histories
    2093             :     // needed for a stable and reasonable heat balance solution starting
    2094             :     // point.
    2095             : 
    2096             :     // METHODOLOGY EMPLOYED:
    2097             :     // This subroutine assumes that the simulation is at steady state at
    2098             :     // the beginning and then begins to vary.  Thus, the temperatures, the
    2099             :     // fluxes. and their histories can all be set to the same value.  Some
    2100             :     // of the initializations depend on the surface characteristics.  This
    2101             :     // requires a DO loop to perform the proper calculation.
    2102             : 
    2103             :     // REFERENCES:
    2104             :     // (I)BLAST legacy routine INITTH
    2105             : 
    2106             :     // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
    2107             :     int SurfNum; // DO loop counter for surfaces
    2108             :     int OSCMnum; // DO loop counter for Other side conditions modeled (OSCM)
    2109             : 
    2110        6218 :     auto &Surface(state.dataSurface->Surface);
    2111             : 
    2112             :     // First do the "bulk" initializations of arrays sized to NumOfZones
    2113       52491 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    2114       46273 :         state.dataHeatBal->ZoneMRT(zoneNum) = DataHeatBalance::ZoneInitialTemp; // module level array
    2115             :         // TODO: Reinitializing this entire struct may cause diffs
    2116       46273 :         new (&state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum)) ZoneTempPredictorCorrector::ZoneHeatBalanceData();
    2117             :         // Initialize the Zone Humidity Ratio here so that it is available for EMPD implementations
    2118       46273 :         auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum);
    2119       46273 :         thisZoneHB.ZoneAirHumRatAvg = state.dataEnvrn->OutHumRat;
    2120       46273 :         thisZoneHB.ZoneAirHumRat = state.dataEnvrn->OutHumRat;
    2121       46273 :         state.dataHeatBalFanSys->TempTstatAir(zoneNum) = DataHeatBalance::ZoneInitialTemp;
    2122             :     }
    2123             :     // Reset spaceHeatBalance even if doSpaceHeatBalance is false, beause spaceHB is used to gether zoneHB in some cases
    2124       52531 :     for (auto &thisSpaceHB : state.dataZoneTempPredictorCorrector->spaceHeatBalance) {
    2125       46313 :         new (&thisSpaceHB) ZoneTempPredictorCorrector::SpaceHeatBalanceData();
    2126             :         // Initialize the Zone Humidity Ratio here so that it is available for EMPD implementations
    2127       46313 :         thisSpaceHB.ZoneAirHumRatAvg = state.dataEnvrn->OutHumRat;
    2128       46313 :         thisSpaceHB.ZoneAirHumRat = state.dataEnvrn->OutHumRat;
    2129             :     }
    2130             : 
    2131             :     // "Bulk" initializations of arrays sized to TotSurfaces
    2132       52491 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    2133       92586 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    2134       46313 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    2135       46313 :             int const firstSurf = thisSpace.HTSurfaceFirst;
    2136       46313 :             int const lastSurf = thisSpace.HTSurfaceLast;
    2137      453582 :             for (int SurfNum = firstSurf; SurfNum <= lastSurf; ++SurfNum) {
    2138      407269 :                 state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = SurfInitialTemp;
    2139      407269 :                 state.dataHeatBalSurf->SurfTempIn(SurfNum) = SurfInitialTemp;        // module level array
    2140      407269 :                 state.dataHeatBalSurf->SurfTempInTmp(SurfNum) = SurfInitialTemp;     // module level array
    2141      407269 :                 state.dataHeatBalSurf->SurfHConvInt(SurfNum) = SurfInitialConvCoeff; // module level array
    2142      407269 :                 state.dataHeatBalSurf->SurfHcExt(SurfNum) = 0.0;
    2143      407269 :                 state.dataHeatBalSurf->SurfHAirExt(SurfNum) = 0.0;
    2144      407269 :                 state.dataHeatBalSurf->SurfHSkyExt(SurfNum) = 0.0;
    2145      407269 :                 state.dataHeatBalSurf->SurfHGrdExt(SurfNum) = 0.0;
    2146      407269 :                 state.dataHeatBalSurf->SurfTempOut(SurfNum) = 0.0;
    2147      407269 :                 state.dataHeatBalSurf->SurfTempInMovInsRep(SurfNum) = 0.0;
    2148      407269 :                 state.dataHeatBalSurf->SurfQConvInReport(SurfNum) = 0.0;
    2149      407269 :                 state.dataHeatBalSurf->SurfQdotConvInRep(SurfNum) = 0.0;
    2150      407269 :                 state.dataHeatBalSurf->SurfQdotConvInPerArea(SurfNum) = 0.0;
    2151      407269 :                 state.dataHeatBalSurf->SurfQRadNetSurfInReport(SurfNum) = 0.0;
    2152      407269 :                 state.dataHeatBalSurf->SurfQdotRadNetSurfInRep(SurfNum) = 0.0;
    2153      407269 :                 state.dataHeatBalSurf->SurfQRadSolarInReport(SurfNum) = 0.0;
    2154      407269 :                 state.dataHeatBalSurf->SurfQdotRadSolarInRep(SurfNum) = 0.0;
    2155      407269 :                 state.dataHeatBalSurf->SurfQdotRadSolarInRepPerArea(SurfNum) = 0.0;
    2156      407269 :                 state.dataHeatBalSurf->SurfQRadLightsInReport(SurfNum) = 0.0;
    2157      407269 :                 state.dataHeatBalSurf->SurfQdotRadLightsInRep(SurfNum) = 0.0;
    2158      407269 :                 state.dataHeatBalSurf->SurfQRadIntGainsInReport(SurfNum) = 0.0;
    2159      407269 :                 state.dataHeatBalSurf->SurfQdotRadIntGainsInRep(SurfNum) = 0.0;
    2160      407269 :                 state.dataHeatBalSurf->AnyRadiantSystems(SurfNum) = false;
    2161      407269 :                 state.dataHeatBalSurf->SurfQRadHVACInReport(SurfNum) = 0.0;
    2162      407269 :                 state.dataHeatBalSurf->SurfQdotRadHVACInRep(SurfNum) = 0.0;
    2163      407269 :                 state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(SurfNum) = 0.0;
    2164      407269 :                 state.dataHeatBalSurf->SurfQConvOutReport(SurfNum) = 0.0;
    2165      407269 :                 state.dataHeatBalSurf->SurfQdotConvOutRep(SurfNum) = 0.0;
    2166      407269 :                 state.dataHeatBalSurf->SurfQdotConvOutPerArea(SurfNum) = 0.0;
    2167      407269 :                 state.dataHeatBalSurf->SurfQRadOutReport(SurfNum) = 0.0;
    2168      407269 :                 state.dataHeatBalSurf->SurfQdotRadOutRep(SurfNum) = 0.0;
    2169      407269 :                 state.dataHeatBalSurf->SurfQdotRadOutRepPerArea(SurfNum) = 0.0;
    2170      407269 :                 state.dataHeatBalSurf->SurfQAirExtReport(SurfNum) = 0.0;
    2171      407269 :                 state.dataHeatBalSurf->SurfQHeatEmiReport(SurfNum) = 0.0;
    2172             :             } // end of  Surf array
    2173       46313 :             int const firstSurfOpaq = thisSpace.OpaqOrIntMassSurfaceFirst;
    2174       46313 :             int const lastSurfOpaq = thisSpace.OpaqOrIntMassSurfaceLast;
    2175       46313 :             if (firstSurfOpaq >= 0) {
    2176      395619 :                 for (int SurfNum = firstSurfOpaq; SurfNum <= lastSurfOpaq; ++SurfNum) {
    2177      349306 :                     state.dataHeatBalSurf->SurfOpaqInsFaceCond(SurfNum) = 0.0;
    2178      349306 :                     state.dataHeatBalSurf->SurfOpaqInsFaceCondFlux(SurfNum) = 0.0;
    2179      349306 :                     state.dataHeatBalSurf->SurfOpaqInsFaceCondEnergy(SurfNum) = 0.0;
    2180      349306 :                     state.dataHeatBalSurf->SurfOpaqInsFaceBeamSolAbsorbed(SurfNum) = 0.0;
    2181             :                 } // end of Zone Surf
    2182             :             }
    2183       46313 :             int const firstSurfWin = thisSpace.WindowSurfaceFirst;
    2184       46313 :             int const lastSurfWin = thisSpace.WindowSurfaceLast;
    2185       46313 :             if (firstSurfWin >= 0) {
    2186      104266 :                 for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    2187             :                     // Initialize window frame and divider temperatures
    2188       57953 :                     state.dataSurface->SurfWinFrameTempIn(SurfNum) = SurfInitialTemp;
    2189       57953 :                     state.dataSurface->SurfWinFrameTempInOld(SurfNum) = SurfInitialTemp;
    2190       57953 :                     state.dataSurface->SurfWinFrameTempSurfOut(SurfNum) = SurfInitialTemp;
    2191       57953 :                     state.dataSurface->SurfWinDividerTempIn(SurfNum) = SurfInitialTemp;
    2192       57953 :                     state.dataSurface->SurfWinDividerTempInOld(SurfNum) = SurfInitialTemp;
    2193       57953 :                     state.dataSurface->SurfWinDividerTempSurfOut(SurfNum) = SurfInitialTemp;
    2194             : 
    2195             :                     // Initialize previous-timestep shading indicators
    2196       57953 :                     state.dataSurface->SurfWinExtIntShadePrevTS(SurfNum) = WinShadingType::NoShade;
    2197       57953 :                     state.dataSurface->SurfWinShadingFlag(SurfNum) = WinShadingType::NoShade;
    2198             :                 } // end of Zone Surf
    2199             :             }
    2200             :         }
    2201             :     } // end of Zone
    2202             : 
    2203             :     // "Bulk" initializations of temperature arrays with dimensions (TotSurface,MaxCTFTerms,2)
    2204       52491 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    2205       92586 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    2206       46313 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    2207       46313 :             int const firstSurf = thisSpace.HTSurfaceFirst;
    2208       46313 :             int const lastSurf = thisSpace.HTSurfaceLast;
    2209      926260 :             for (int CTFTermNum = 1; CTFTermNum <= Construction::MaxCTFTerms; ++CTFTermNum) {
    2210     8618058 :                 for (int SurfNum = firstSurf; SurfNum <= lastSurf; ++SurfNum) {
    2211     7738111 :                     state.dataHeatBalSurf->SurfInsideTempHist(CTFTermNum)(SurfNum) = SurfInitialTemp;
    2212     7738111 :                     state.dataHeatBalSurf->SurfOutsideTempHist(CTFTermNum)(SurfNum) = SurfInitialTemp;
    2213     7738111 :                     state.dataHeatBalSurf->SurfInsideFluxHist(CTFTermNum)(SurfNum) = 0.0;
    2214     7738111 :                     state.dataHeatBalSurf->SurfOutsideFluxHist(CTFTermNum)(SurfNum) = 0.0;
    2215             :                 }
    2216             :             }
    2217             :         }
    2218             :     }
    2219        6218 :     if (!state.dataHeatBal->SimpleCTFOnly || state.dataGlobal->AnyEnergyManagementSystemInModel) {
    2220       14894 :         for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    2221       27502 :             for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    2222       13751 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
    2223       13751 :                 int const firstSurf = thisSpace.HTSurfaceFirst;
    2224       13751 :                 int const lastSurf = thisSpace.HTSurfaceLast;
    2225      144880 :                 for (int SurfNum = firstSurf; SurfNum <= lastSurf; ++SurfNum) {
    2226      131129 :                     state.dataHeatBalSurf->SurfCurrNumHist(SurfNum) = 0;
    2227             :                 }
    2228      275020 :                 for (int CTFTermNum = 1; CTFTermNum <= Construction::MaxCTFTerms; ++CTFTermNum) {
    2229     2752720 :                     for (int SurfNum = firstSurf; SurfNum <= lastSurf; ++SurfNum) {
    2230     2491451 :                         state.dataHeatBalSurf->SurfInsideTempHistMaster(CTFTermNum)(SurfNum) = SurfInitialTemp;
    2231     2491451 :                         state.dataHeatBalSurf->SurfOutsideTempHistMaster(CTFTermNum)(SurfNum) = SurfInitialTemp;
    2232     2491451 :                         state.dataHeatBalSurf->SurfInsideFluxHistMaster(CTFTermNum)(SurfNum) = 0.0;
    2233     2491451 :                         state.dataHeatBalSurf->SurfOutsideFluxHistMaster(CTFTermNum)(SurfNum) = 0.0;
    2234             :                     }
    2235             :                 }
    2236             :             }
    2237             :         }
    2238             :     }
    2239        6218 :     if (state.dataHeatBal->AnyInternalHeatSourceInInput) {
    2240        1170 :         for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    2241        1770 :             for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    2242         885 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
    2243         885 :                 int const firstSurf = thisSpace.HTSurfaceFirst;
    2244         885 :                 int const lastSurf = thisSpace.HTSurfaceLast;
    2245        7313 :                 for (int SurfNum = firstSurf; SurfNum <= lastSurf; ++SurfNum) {
    2246      128560 :                     for (int CTFTermNum = 1; CTFTermNum <= Construction::MaxCTFTerms; ++CTFTermNum) {
    2247      122132 :                         state.dataHeatBalSurf->SurfTsrcHist(SurfNum, CTFTermNum) = SurfInitialTemp;
    2248      122132 :                         state.dataHeatBalSurf->SurfTsrcHistM(SurfNum, CTFTermNum) = SurfInitialTemp;
    2249      122132 :                         state.dataHeatBalSurf->SurfTuserHist(SurfNum, CTFTermNum) = SurfInitialTemp;
    2250      122132 :                         state.dataHeatBalSurf->SurfTuserHistM(SurfNum, CTFTermNum) = SurfInitialTemp;
    2251      122132 :                         state.dataHeatBalSurf->SurfQsrcHist(SurfNum, CTFTermNum) = 0.0;
    2252      122132 :                         state.dataHeatBalSurf->SurfQsrcHistM(SurfNum, CTFTermNum) = 0.0;
    2253             :                     }
    2254             :                 }
    2255             :             }
    2256             :         }
    2257             :     }
    2258        6218 :     state.dataHeatBal->CondFDRelaxFactor = state.dataHeatBal->CondFDRelaxFactorInput;
    2259             : 
    2260             :     // Perform other initializations that depend on the surface characteristics
    2261       69187 :     for (int CTFTermNum = 1; CTFTermNum <= state.dataHeatBal->MaxCTFTerms + 1; ++CTFTermNum) {
    2262     4525220 :         for (SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    2263     4462251 :             if (!Surface(SurfNum).HeatTransSurf) continue; // Skip non-heat transfer surfaces
    2264             :             // Reset outside boundary conditions if necessary
    2265     4335125 :             if ((Surface(SurfNum).ExtBoundCond == ExternalEnvironment) || (Surface(SurfNum).ExtBoundCond == OtherSideCondModeledExt)) {
    2266     1672422 :                 state.dataHeatBalSurf->SurfOutsideTempHist(CTFTermNum)(SurfNum) = state.dataSurface->SurfOutDryBulbTemp(SurfNum);
    2267     2662703 :             } else if (Surface(SurfNum).ExtBoundCond == Ground) {
    2268      207088 :                 state.dataHeatBalSurf->SurfOutsideTempHist(CTFTermNum)(SurfNum) = state.dataEnvrn->GroundTemp;
    2269     2455615 :             } else if (Surface(SurfNum).ExtBoundCond == GroundFCfactorMethod) {
    2270       17289 :                 state.dataHeatBalSurf->SurfOutsideTempHist(CTFTermNum)(SurfNum) = state.dataEnvrn->GroundTempFC;
    2271             :             }
    2272             :             // Initialize the flux histories
    2273     4335125 :             state.dataHeatBalSurf->SurfOutsideFluxHist(CTFTermNum)(SurfNum) =
    2274     8670250 :                 state.dataConstruction->Construct(Surface(SurfNum).Construction).UValue *
    2275     4335125 :                 (state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum) - state.dataHeatBalSurf->SurfInsideTempHist(1)(SurfNum));
    2276     4335125 :             state.dataHeatBalSurf->SurfInsideFluxHist(CTFTermNum)(SurfNum) = state.dataHeatBalSurf->SurfOutsideFluxHist(2)(SurfNum);
    2277             :         }
    2278             :     }
    2279      426543 :     for (SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    2280             : 
    2281      420325 :         if (!Surface(SurfNum).HeatTransSurf) continue; // Skip non-heat transfer surfaces
    2282             : 
    2283      407274 :         if (state.dataSurface->SurfExtCavityPresent(SurfNum)) {
    2284          30 :             state.dataSurface->ExtVentedCavity(state.dataSurface->SurfExtCavNum(SurfNum)).TbaffleLast = 20.0;
    2285          30 :             state.dataSurface->ExtVentedCavity(state.dataSurface->SurfExtCavNum(SurfNum)).TairLast = 20.0;
    2286             :         }
    2287             :     }
    2288             :     // Initialize Kiva convection algorithms
    2289        6474 :     for (auto SurfNum : state.dataSurface->AllHTKivaSurfaceList) {
    2290         256 :         state.dataSurfaceGeometry->kivaManager.surfaceConvMap[SurfNum].in = KIVA_CONST_CONV(3.076);
    2291         256 :         state.dataSurfaceGeometry->kivaManager.surfaceConvMap[SurfNum].f = KIVA_HF_DEF;
    2292         256 :         state.dataSurfaceGeometry->kivaManager.surfaceConvMap[SurfNum].out = KIVA_CONST_CONV(0.0);
    2293             :     }
    2294        6218 :     if (!state.dataHeatBal->SimpleCTFOnly || state.dataGlobal->AnyEnergyManagementSystemInModel) {
    2295      133726 :         for (SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    2296      132583 :             if (!Surface(SurfNum).HeatTransSurf) continue;
    2297      131129 :             if ((Surface(SurfNum).ExtBoundCond == ExternalEnvironment) || (Surface(SurfNum).ExtBoundCond == OtherSideCondModeledExt)) {
    2298      992380 :                 for (int CTFTermNum = 1; CTFTermNum <= Construction::MaxCTFTerms; ++CTFTermNum) {
    2299      942761 :                     state.dataHeatBalSurf->SurfOutsideTempHistMaster(CTFTermNum)(SurfNum) = state.dataSurface->SurfOutDryBulbTemp(SurfNum);
    2300             :                 }
    2301       81510 :             } else if (Surface(SurfNum).ExtBoundCond == Ground) {
    2302       73360 :                 for (int CTFTermNum = 1; CTFTermNum <= Construction::MaxCTFTerms; ++CTFTermNum) {
    2303       69692 :                     state.dataHeatBalSurf->SurfOutsideTempHistMaster(CTFTermNum)(SurfNum) = state.dataEnvrn->GroundTemp;
    2304             :                 }
    2305       77842 :             } else if (Surface(SurfNum).ExtBoundCond == GroundFCfactorMethod) {
    2306       38720 :                 for (int CTFTermNum = 1; CTFTermNum <= Construction::MaxCTFTerms; ++CTFTermNum) {
    2307       36784 :                     state.dataHeatBalSurf->SurfOutsideTempHistMaster(CTFTermNum)(SurfNum) = state.dataEnvrn->GroundTempFC;
    2308             :                 }
    2309             :             }
    2310      789002 :             for (int CTFTermNum = 2; CTFTermNum <= state.dataConstruction->Construct(Surface(SurfNum).Construction).NumCTFTerms + 1; ++CTFTermNum) {
    2311      657873 :                 state.dataHeatBalSurf->SurfOutsideFluxHistMaster(CTFTermNum)(SurfNum) = state.dataHeatBalSurf->SurfOutsideFluxHist(2)(SurfNum);
    2312      657873 :                 state.dataHeatBalSurf->SurfInsideFluxHistMaster(CTFTermNum)(SurfNum) = state.dataHeatBalSurf->SurfOutsideFluxHist(2)(SurfNum);
    2313             :             }
    2314             :         }
    2315             :     }
    2316             : 
    2317        6218 :     if (state.dataSurface->TotOSCM >= 1) {
    2318         232 :         for (OSCMnum = 1; OSCMnum <= state.dataSurface->TotOSCM; ++OSCMnum) {
    2319         152 :             state.dataSurface->OSCM(OSCMnum).TConv = 20.0;
    2320         152 :             state.dataSurface->OSCM(OSCMnum).HConv = 4.0;
    2321         152 :             state.dataSurface->OSCM(OSCMnum).TRad = 20.0;
    2322         152 :             state.dataSurface->OSCM(OSCMnum).HRad = 4.0;
    2323             :         }
    2324             :     }
    2325        6218 : }
    2326             : 
    2327       10122 : void EvalOutsideMovableInsulation(EnergyPlusData &state)
    2328             : {
    2329             :     // This subroutine determines whether or not outside movable insulation on opaque surfaces is present at the current time.
    2330       20244 :     for (int SurfNum : state.dataHeatBalSurf->SurfMovInsulIndexList) {
    2331       10122 :         Real64 MovInsulSchedVal = GetCurrentScheduleValue(state, state.dataSurface->SurfSchedMovInsulExt(SurfNum));
    2332       10122 :         if (MovInsulSchedVal <= 0) { // Movable insulation not present at current time
    2333        6075 :             state.dataHeatBalSurf->SurfMovInsulExtPresent(SurfNum) = false;
    2334        6075 :             int ConstrNum = state.dataSurface->SurfActiveConstruction(SurfNum);
    2335        6075 :             state.dataHeatBalSurf->SurfAbsSolarExt(SurfNum) =
    2336        6075 :                 state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(1)).AbsorpSolar;
    2337        6075 :             state.dataHeatBalSurf->SurfAbsThermalExt(SurfNum) =
    2338        6075 :                 state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(1)).AbsorpThermal;
    2339        6075 :             state.dataHeatBalSurf->SurfRoughnessExt(SurfNum) =
    2340        6075 :                 state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(1)).Roughness;
    2341        6075 :             continue;
    2342             :         }
    2343        4047 :         int const MaterialIndex(state.dataSurface->SurfMaterialMovInsulExt(SurfNum));
    2344        4047 :         DataHeatBalance::MaterialGroup const MaterialGroupNum(state.dataMaterial->Material(MaterialIndex).Group);
    2345        4047 :         state.dataHeatBalSurf->SurfMovInsulExtPresent(SurfNum) = true;
    2346        4047 :         state.dataHeatBalSurf->SurfMovInsulHExt(SurfNum) = 1.0 / (MovInsulSchedVal * state.dataMaterial->Material(MaterialIndex).Resistance);
    2347        4047 :         if (MaterialGroupNum == DataHeatBalance::MaterialGroup::WindowGlass ||
    2348             :             MaterialGroupNum == DataHeatBalance::MaterialGroup::GlassEquivalentLayer) {
    2349        2022 :             state.dataHeatBalSurf->SurfAbsSolarExt(SurfNum) =
    2350        2022 :                 max(0.0, 1.0 - state.dataMaterial->Material(MaterialIndex).Trans - state.dataMaterial->Material(MaterialIndex).ReflectSolBeamFront);
    2351             :         } else {
    2352        2025 :             state.dataHeatBalSurf->SurfAbsSolarExt(SurfNum) = state.dataMaterial->Material(MaterialIndex).AbsorpSolar;
    2353             :         }
    2354        4047 :         state.dataHeatBalSurf->SurfAbsThermalExt(SurfNum) = state.dataMaterial->Material(MaterialIndex).AbsorpThermal;
    2355        4047 :         state.dataHeatBalSurf->SurfRoughnessExt(SurfNum) = state.dataMaterial->Material(MaterialIndex).Roughness;
    2356             :     }
    2357       10122 : }
    2358             : 
    2359       10122 : void EvalInsideMovableInsulation(EnergyPlusData &state)
    2360             : {
    2361             :     // This subroutine determines whether or not inside movable insulation is present at the current time.
    2362       20244 :     for (int SurfNum : state.dataHeatBalSurf->SurfMovInsulIndexList) {
    2363       10122 :         Real64 MovInsulSchedVal = GetCurrentScheduleValue(state, state.dataSurface->SurfSchedMovInsulInt(SurfNum));
    2364       10122 :         if (MovInsulSchedVal <= 0.0) { // Movable insulation not present at current time
    2365        4047 :             state.dataHeatBalSurf->SurfMovInsulIntPresent(SurfNum) = false;
    2366        4047 :             int ConstrNum = state.dataSurface->SurfActiveConstruction(SurfNum);
    2367        4047 :             state.dataHeatBalSurf->SurfAbsSolarInt(SurfNum) = state.dataConstruction->Construct(ConstrNum).InsideAbsorpSolar;
    2368        4047 :             state.dataHeatBalSurf->SurfAbsThermalInt(SurfNum) = state.dataConstruction->Construct(ConstrNum).InsideAbsorpThermal;
    2369        4047 :             continue;
    2370             :         }
    2371        6075 :         int const MaterialIndex(state.dataSurface->SurfMaterialMovInsulInt(SurfNum));
    2372        6075 :         DataHeatBalance::MaterialGroup const MaterialGroupNum(state.dataMaterial->Material(MaterialIndex).Group);
    2373        6075 :         state.dataHeatBalSurf->SurfMovInsulIntPresent(SurfNum) = true;
    2374        6075 :         state.dataHeatBalSurf->SurfMovInsulHInt(SurfNum) = 1.0 / (MovInsulSchedVal * state.dataMaterial->Material(MaterialIndex).Resistance);
    2375        6075 :         if (MaterialGroupNum == DataHeatBalance::MaterialGroup::WindowGlass ||
    2376             :             MaterialGroupNum == DataHeatBalance::MaterialGroup::GlassEquivalentLayer) {
    2377           0 :             state.dataHeatBalSurf->SurfAbsSolarInt(SurfNum) =
    2378           0 :                 max(0.0, 1.0 - state.dataMaterial->Material(MaterialIndex).Trans - state.dataMaterial->Material(MaterialIndex).ReflectSolBeamFront);
    2379             :         } else {
    2380        6075 :             state.dataHeatBalSurf->SurfAbsSolarInt(SurfNum) = state.dataMaterial->Material(MaterialIndex).AbsorpSolar;
    2381             :         }
    2382        6075 :         state.dataHeatBalSurf->SurfAbsThermalInt(SurfNum) = state.dataMaterial->Material(MaterialIndex).AbsorpThermal;
    2383             :     }
    2384       10122 : }
    2385             : 
    2386     2568509 : void InitSolarHeatGains(EnergyPlusData &state)
    2387             : {
    2388             : 
    2389             :     // SUBROUTINE INFORMATION:
    2390             :     //       AUTHOR         Anonymous
    2391             :     //       DATE WRITTEN   July 1977
    2392             :     //       MODIFIED       Mar99 (FW): handle movable interior shades and
    2393             :     //                                  switchable glazing
    2394             :     //                      Oct99 (FW): account for Window5 glass calculation approach
    2395             :     //                      May01 (FW): handle interior and exterior blinds
    2396             :     //                      Sep03 (FW): initialize SurfaceWindow%FrameQRadOutAbs
    2397             :     //                      May06 (RR): handle exterior window screens
    2398             :     //       RE-ENGINEERED  Feb98 (RKS)
    2399             : 
    2400             :     // PURPOSE OF THIS SUBROUTINE:
    2401             :     // This subroutine initializes the arrays associated with solar heat
    2402             :     // gains for both individual surfaces and for zones.  As a result,
    2403             :     // this routine sets the following variable arrays:
    2404             :     // QBV(unused), QDV, QC, QD; SurfOpaqQRadSWOutAbs and SurfOpaqQRadSWInAbs (for opaque surfaces);
    2405             :     // SurfWinQRadSWwinAbs (for windows)
    2406             : 
    2407             :     // METHODOLOGY EMPLOYED:
    2408             :     // If the sun is down, all of the pertinent arrays are zeroed.  If the
    2409             :     // sun is up, various calculations are made.
    2410             : 
    2411             :     // REFERENCES:
    2412             :     // (I)BLAST legacy routine QSUN
    2413             : 
    2414     2568509 :     auto &Surface(state.dataSurface->Surface);
    2415             : 
    2416             :     // Using/Aliasing
    2417             :     using DaylightingDevices::TransTDD;
    2418             :     using General::InterpSw;
    2419             :     using General::POLYF;
    2420             :     using SolarShading::CalcInteriorSolarDistribution;
    2421             :     using namespace DataWindowEquivalentLayer;
    2422             :     using SolarShading::SurfaceScheduledSolarInc;
    2423             :     using SolarShading::WindowScheduledSolarAbs;
    2424             : 
    2425     2568509 :     auto &AbsDiffWin = state.dataHeatBalSurfMgr->AbsDiffWin;
    2426     2568509 :     auto &AbsDiffWinGnd = state.dataHeatBalSurfMgr->AbsDiffWinGnd;
    2427     2568509 :     auto &AbsDiffWinSky = state.dataHeatBalSurfMgr->AbsDiffWinSky;
    2428             : 
    2429    21015074 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    2430    18446565 :         state.dataHeatBal->ZoneWinHeatGainRepEnergy(zoneNum) = 0.0;
    2431    18446565 :         state.dataHeatBal->ZoneWinHeatLossRepEnergy(zoneNum) = 0.0;
    2432    18446565 :         state.dataHeatBal->ZnOpqSurfInsFaceCondGnRepEnrg(zoneNum) = 0.0;
    2433    18446565 :         state.dataHeatBal->ZnOpqSurfInsFaceCondLsRepEnrg(zoneNum) = 0.0;
    2434    18446565 :         state.dataHeatBal->ZnOpqSurfExtFaceCondGnRepEnrg(zoneNum) = 0.0;
    2435    18446565 :         state.dataHeatBal->ZnOpqSurfExtFaceCondLsRepEnrg(zoneNum) = 0.0;
    2436             : 
    2437    18446565 :         state.dataHeatBal->ZoneWinHeatGain(zoneNum) = 0.0;
    2438    18446565 :         state.dataHeatBal->ZoneWinHeatGainRep(zoneNum) = 0.0;
    2439    18446565 :         state.dataHeatBal->ZoneWinHeatLossRep(zoneNum) = 0.0;
    2440    18446565 :         state.dataHeatBal->ZoneOpaqSurfInsFaceCond(zoneNum) = 0.0;
    2441    18446565 :         state.dataHeatBal->ZoneOpaqSurfInsFaceCondGainRep(zoneNum) = 0.0;
    2442    18446565 :         state.dataHeatBal->ZoneOpaqSurfInsFaceCondLossRep(zoneNum) = 0.0;
    2443    18446565 :         state.dataHeatBal->ZoneOpaqSurfExtFaceCond(zoneNum) = 0.0;
    2444    18446565 :         state.dataHeatBal->ZoneOpaqSurfExtFaceCondGainRep(zoneNum) = 0.0;
    2445    18446565 :         state.dataHeatBal->ZoneOpaqSurfExtFaceCondLossRep(zoneNum) = 0.0;
    2446             :     }
    2447    21002924 :     for (int enclNum = 1; enclNum <= state.dataViewFactor->NumOfSolarEnclosures; ++enclNum) {
    2448    18434415 :         state.dataHeatBal->EnclSolInitialDifSolReflW(enclNum) = 0.0;
    2449             :     }
    2450    21015074 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    2451    36909306 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    2452    18462741 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    2453    18462741 :             int const firstSurfOpaq = thisSpace.OpaqOrIntMassSurfaceFirst;
    2454    18462741 :             int const lastSurfOpaq = thisSpace.OpaqOrIntMassSurfaceLast;
    2455   156163195 :             for (int SurfNum = firstSurfOpaq; SurfNum <= lastSurfOpaq; ++SurfNum) {
    2456   137700454 :                 state.dataHeatBalSurf->SurfOpaqInsFaceCondGainRep(SurfNum) = 0.0;
    2457   137700454 :                 state.dataHeatBalSurf->SurfOpaqInsFaceCondLossRep(SurfNum) = 0.0;
    2458   137700454 :                 state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) = 0.0;
    2459   137700454 :                 state.dataHeatBalSurf->SurfQdotRadLightsInPerArea(SurfNum) = 0.0;
    2460   137700454 :                 state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(SurfNum) = 0.0;
    2461   137700454 :                 state.dataHeatBalSurf->SurfOpaqInitialDifSolInAbs(SurfNum) = 0.0;
    2462   137700454 :                 state.dataHeatBalSurf->SurfOpaqInsFaceBeamSolAbsorbed(SurfNum) = 0.0;
    2463   137700454 :                 state.dataHeatBal->SurfOpaqSWOutAbsTotalReport(SurfNum) = 0.0;
    2464   137700454 :                 state.dataHeatBal->SurfOpaqSWOutAbsEnergyReport(SurfNum) = 0.0;
    2465             :             }
    2466             : 
    2467    18462741 :             int const firstSurfWin = thisSpace.WindowSurfaceFirst;
    2468    18462741 :             int const lastSurfWin = thisSpace.WindowSurfaceLast;
    2469    40474011 :             for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    2470             :                 // Faster "inline" than calling SurfaceWindow( SurfNum ).InitSolarHeatGains()
    2471    22011270 :                 state.dataSurface->SurfWinFrameQRadOutAbs(SurfNum) = 0.0;
    2472    22011270 :                 state.dataSurface->SurfWinFrameQRadInAbs(SurfNum) = 0.0;
    2473    22011270 :                 state.dataSurface->SurfWinDividerQRadOutAbs(SurfNum) = 0.0;
    2474    22011270 :                 state.dataSurface->SurfWinDividerQRadInAbs(SurfNum) = 0.0;
    2475    22011270 :                 state.dataSurface->SurfWinIntSWAbsByShade(SurfNum) = 0.0;
    2476    22011270 :                 state.dataSurface->SurfWinIntLWAbsByShade(SurfNum) = 0.0;
    2477    22011270 :                 state.dataSurface->SurfWinConvHeatFlowNatural(SurfNum) = 0.0;
    2478    22011270 :                 state.dataSurface->SurfWinConvHeatGainToZoneAir(SurfNum) = 0.0;
    2479    22011270 :                 state.dataSurface->SurfWinRetHeatGainToZoneAir(SurfNum) = 0.0;
    2480    22011270 :                 state.dataSurface->SurfWinDividerHeatGain(SurfNum) = 0.0;
    2481             :             }
    2482             : 
    2483    40474011 :             for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    2484    22011270 :                 state.dataSurface->SurfWinGainConvGlazToZoneRep(SurfNum) = 0.0;
    2485    22011270 :                 state.dataSurface->SurfWinGainIRGlazToZoneRep(SurfNum) = 0.0;
    2486    22011270 :                 state.dataSurface->SurfWinLossSWZoneToOutWinRep(SurfNum) = 0.0;
    2487    22011270 :                 state.dataSurface->SurfWinGainFrameDividerToZoneRep(SurfNum) = 0.0;
    2488    22011270 :                 state.dataSurface->SurfWinGainConvShadeToZoneRep(SurfNum) = 0.0;
    2489    22011270 :                 state.dataSurface->SurfWinGainIRShadeToZoneRep(SurfNum) = 0.0;
    2490    22011270 :                 state.dataSurface->SurfWinGapConvHtFlowRep(SurfNum) = 0.0;
    2491    22011270 :                 state.dataSurface->SurfWinShadingAbsorbedSolar(SurfNum) = 0.0;
    2492    22011270 :                 state.dataSurface->SurfWinSysSolTransmittance(SurfNum) = 0.0;
    2493             :             }
    2494    40474011 :             for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    2495    22011270 :                 state.dataSurface->SurfWinHeatGain(SurfNum) = 0.0;
    2496    22011270 :                 state.dataSurface->SurfWinHeatGainRep(SurfNum) = 0.0;
    2497    22011270 :                 state.dataSurface->SurfWinHeatLossRep(SurfNum) = 0.0;
    2498    22011270 :                 state.dataSurface->SurfWinHeatGainRepEnergy(SurfNum) = 0.0;
    2499    22011270 :                 state.dataSurface->SurfWinHeatLossRepEnergy(SurfNum) = 0.0;
    2500    22011270 :                 state.dataSurface->SurfWinGapConvHtFlowRepEnergy(SurfNum) = 0.0;
    2501    22011270 :                 state.dataSurface->SurfWinShadingAbsorbedSolarEnergy(SurfNum) = 0.0;
    2502             :             }
    2503   147701928 :             for (int Lay = 1; Lay <= DataWindowEquivalentLayer::CFSMAXNL + 1; Lay++) {
    2504   283318077 :                 for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    2505   154078890 :                     state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) = 0.0;
    2506             :                 }
    2507             :             }
    2508             :         }
    2509             :     }
    2510     2568509 :     if (state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) {
    2511       44533 :         for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    2512       43762 :             state.dataSurface->SurfBmToDiffReflFacGnd(SurfNum) = Surface(SurfNum).ViewFactorGround;
    2513       43762 :             state.dataSurface->SurfSkyDiffReflFacGnd(SurfNum) = Surface(SurfNum).ViewFactorGround;
    2514             :         }
    2515             :     }
    2516             :     bool currSolRadPositive =
    2517     2568509 :         state.dataEnvrn->SunIsUp && (state.dataEnvrn->BeamSolarRad + state.dataEnvrn->GndSolarRad + state.dataEnvrn->DifSolarRad > 0.0);
    2518     2568509 :     bool sunset = (!currSolRadPositive) && state.dataEnvrn->PreviousSolRadPositive;
    2519     2568509 :     bool sunIsUpNoRad = state.dataEnvrn->SunIsUp && (!currSolRadPositive);
    2520     2568509 :     bool resetSolar = state.dataGlobal->BeginEnvrnFlag || sunIsUpNoRad ||
    2521     2568509 :                       sunset; // Reset at (1) Beginning of simulation (2) sunset time, and SunIsUp but not solar time.
    2522     2568509 :     state.dataEnvrn->PreviousSolRadPositive = currSolRadPositive;
    2523             : 
    2524     2568509 :     if (currSolRadPositive || resetSolar) {
    2525    84865845 :         for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    2526    83560683 :             state.dataHeatBal->SurfBmIncInsSurfIntensRep(SurfNum) = 0.0;
    2527    83560683 :             state.dataHeatBal->SurfBmIncInsSurfAmountRep(SurfNum) = 0.0;
    2528    83560683 :             state.dataHeatBal->SurfIntBmIncInsSurfIntensRep(SurfNum) = 0.0;
    2529    83560683 :             state.dataHeatBal->SurfIntBmIncInsSurfAmountRep(SurfNum) = 0.0;
    2530    83560683 :             state.dataHeatBal->SurfIntBmIncInsSurfAmountRepEnergy(SurfNum) = 0.0;
    2531             : 
    2532    83560683 :             state.dataHeatBal->SurfQRadSWOutIncident(SurfNum) = 0.0;
    2533    83560683 :             state.dataHeatBal->SurfQRadSWOutIncidentBeam(SurfNum) = 0.0;
    2534    83560683 :             state.dataHeatBal->SurfQRadSWOutIncidentSkyDiffuse(SurfNum) = 0.0;
    2535    83560683 :             state.dataHeatBal->SurfQRadSWOutIncidentGndDiffuse(SurfNum) = 0.0;
    2536             : 
    2537    83560683 :             state.dataHeatBal->SurfQRadSWOutIncBmToDiffReflGnd(SurfNum) = 0.0;
    2538    83560683 :             state.dataHeatBal->SurfQRadSWOutIncSkyDiffReflGnd(SurfNum) = 0.0;
    2539    83560683 :             state.dataHeatBal->SurfQRadSWOutIncBmToBmReflObs(SurfNum) = 0.0;
    2540    83560683 :             state.dataHeatBal->SurfQRadSWOutIncBmToDiffReflObs(SurfNum) = 0.0;
    2541    83560683 :             state.dataHeatBal->SurfQRadSWOutIncSkyDiffReflObs(SurfNum) = 0.0;
    2542             : 
    2543    83560683 :             state.dataSurface->SurfSkySolarInc(SurfNum) = 0.0;
    2544    83560683 :             state.dataSurface->SurfGndSolarInc(SurfNum) = 0.0;
    2545             :         }
    2546    10690575 :         for (int enclNum = 1; enclNum <= state.dataViewFactor->NumOfSolarEnclosures; ++enclNum) {
    2547     9385413 :             state.dataHeatBal->ZoneTransSolar(enclNum) = 0.0;
    2548     9385413 :             state.dataHeatBal->ZoneBmSolFrExtWinsRep(enclNum) = 0.0;
    2549     9385413 :             state.dataHeatBal->ZoneBmSolFrIntWinsRep(enclNum) = 0.0;
    2550     9385413 :             state.dataHeatBal->ZoneDifSolFrExtWinsRep(enclNum) = 0.0;
    2551     9385413 :             state.dataHeatBal->ZoneDifSolFrIntWinsRep(enclNum) = 0.0;
    2552     9385413 :             state.dataHeatBal->ZoneTransSolarEnergy(enclNum) = 0.0;
    2553     9385413 :             state.dataHeatBal->ZoneBmSolFrExtWinsRepEnergy(enclNum) = 0.0;
    2554     9385413 :             state.dataHeatBal->ZoneBmSolFrIntWinsRepEnergy(enclNum) = 0.0;
    2555     9385413 :             state.dataHeatBal->ZoneDifSolFrExtWinsRepEnergy(enclNum) = 0.0;
    2556     9385413 :             state.dataHeatBal->ZoneDifSolFrIntWinsRepEnergy(enclNum) = 0.0;
    2557             :         }
    2558    10696785 :         for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    2559    18791518 :             for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    2560     9399895 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
    2561     9399895 :                 int const firstSurfWin = thisSpace.WindowSurfaceFirst;
    2562     9399895 :                 int const lastSurfWin = thisSpace.WindowSurfaceLast;
    2563    20654938 :                 for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    2564    11255043 :                     state.dataSurface->SurfWinExtBeamAbsByShade(SurfNum) = 0.0;
    2565    11255043 :                     state.dataSurface->SurfWinExtDiffAbsByShade(SurfNum) = 0.0;
    2566    11255043 :                     state.dataSurface->SurfWinIntBeamAbsByShade(SurfNum) = 0.0;
    2567    11255043 :                     state.dataSurface->SurfWinInitialDifSolAbsByShade(SurfNum) = 0.0;
    2568    11255043 :                     state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfNum) = 0.0;
    2569    11255043 :                     state.dataHeatBal->SurfWinQRadSWwinAbsTotEnergy(SurfNum) = 0.0;
    2570    11255043 :                     state.dataHeatBal->SurfWinSWwinAbsTotalReport(SurfNum) = 0.0;
    2571    11255043 :                     state.dataHeatBalSurf->SurfWinInitialDifSolInTrans(SurfNum) = 0.0;
    2572    11255043 :                     state.dataHeatBal->SurfWinInitialDifSolInTransReport(SurfNum) = 0.0;
    2573             :                 }
    2574    20654938 :                 for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    2575    11255043 :                     state.dataSurface->SurfWinBlTsolBmBm(SurfNum) = 0.0;
    2576    11255043 :                     state.dataSurface->SurfWinBlTsolBmDif(SurfNum) = 0.0;
    2577    11255043 :                     state.dataSurface->SurfWinBlTsolDifDif(SurfNum) = 0.0;
    2578    11255043 :                     state.dataSurface->SurfWinBlGlSysTsolBmBm(SurfNum) = 0.0;
    2579    11255043 :                     state.dataSurface->SurfWinBlGlSysTsolDifDif(SurfNum) = 0.0;
    2580    11255043 :                     state.dataSurface->SurfWinScTsolBmBm(SurfNum) = 0.0;
    2581    11255043 :                     state.dataSurface->SurfWinScTsolBmDif(SurfNum) = 0.0;
    2582    11255043 :                     state.dataSurface->SurfWinScTsolDifDif(SurfNum) = 0.0;
    2583    11255043 :                     state.dataSurface->SurfWinScGlSysTsolBmBm(SurfNum) = 0.0;
    2584    11255043 :                     state.dataSurface->SurfWinScGlSysTsolDifDif(SurfNum) = 0.0;
    2585    11255043 :                     state.dataSurface->SurfWinGlTsolBmBm(SurfNum) = 0.0;
    2586    11255043 :                     state.dataSurface->SurfWinGlTsolBmDif(SurfNum) = 0.0;
    2587    11255043 :                     state.dataSurface->SurfWinGlTsolDifDif(SurfNum) = 0.0;
    2588             :                 }
    2589    20654938 :                 for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    2590    11255043 :                     state.dataSurface->SurfWinBmSolTransThruIntWinRep(SurfNum) = 0.0;
    2591    11255043 :                     state.dataSurface->SurfWinBmSolAbsdOutsReveal(SurfNum) = 0.0;
    2592    11255043 :                     state.dataSurface->SurfWinBmSolAbsdInsReveal(SurfNum) = 0.0;
    2593    11255043 :                     state.dataSurface->SurfWinBmSolRefldInsReveal(SurfNum) = 0.0;
    2594    11255043 :                     state.dataSurface->SurfWinOutsRevealDiffOntoGlazing(SurfNum) = 0.0;
    2595    11255043 :                     state.dataSurface->SurfWinInsRevealDiffOntoGlazing(SurfNum) = 0.0;
    2596    11255043 :                     state.dataSurface->SurfWinInsRevealDiffIntoZone(SurfNum) = 0.0;
    2597    11255043 :                     state.dataSurface->SurfWinOutsRevealDiffOntoFrame(SurfNum) = 0.0;
    2598    11255043 :                     state.dataSurface->SurfWinInsRevealDiffOntoFrame(SurfNum) = 0.0;
    2599             :                 }
    2600    20654938 :                 for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    2601    11255043 :                     state.dataSurface->SurfWinBmSolRefldOutsRevealReport(SurfNum) = 0.0;
    2602    11255043 :                     state.dataSurface->SurfWinBmSolRefldInsRevealReport(SurfNum) = 0.0;
    2603    11255043 :                     state.dataSurface->SurfWinBmSolAbsdInsRevealReport(SurfNum) = 0.0;
    2604    11255043 :                     state.dataSurface->SurfWinInsRevealDiffOntoGlazingReport(SurfNum) = 0.0;
    2605    11255043 :                     state.dataSurface->SurfWinInsRevealDiffIntoZoneReport(SurfNum) = 0.0;
    2606    11255043 :                     state.dataSurface->SurfWinInsRevealDiffOntoFrameReport(SurfNum) = 0.0;
    2607    11255043 :                     state.dataSurface->SurfWinBmSolTransThruIntWinRepEnergy(SurfNum) = 0.0;
    2608    11255043 :                     state.dataSurface->SurfWinBmSolRefldOutsRevealRepEnergy(SurfNum) = 0.0;
    2609    11255043 :                     state.dataSurface->SurfWinBmSolRefldInsRevealRepEnergy(SurfNum) = 0.0;
    2610             :                 }
    2611             : 
    2612    20654938 :                 for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    2613    11255043 :                     state.dataSurface->SurfWinTransSolar(SurfNum) = 0.0;
    2614    11255043 :                     state.dataSurface->SurfWinBmSolar(SurfNum) = 0.0;
    2615    11255043 :                     state.dataSurface->SurfWinBmBmSolar(SurfNum) = 0.0;
    2616    11255043 :                     state.dataSurface->SurfWinBmDifSolar(SurfNum) = 0.0;
    2617    11255043 :                     state.dataSurface->SurfWinDifSolar(SurfNum) = 0.0;
    2618    11255043 :                     state.dataSurface->SurfWinTransSolarEnergy(SurfNum) = 0.0;
    2619    11255043 :                     state.dataSurface->SurfWinBmSolarEnergy(SurfNum) = 0.0;
    2620    11255043 :                     state.dataSurface->SurfWinBmBmSolarEnergy(SurfNum) = 0.0;
    2621    11255043 :                     state.dataSurface->SurfWinBmDifSolarEnergy(SurfNum) = 0.0;
    2622    11255043 :                     state.dataSurface->SurfWinDifSolarEnergy(SurfNum) = 0.0;
    2623    11255043 :                     state.dataHeatBal->SurfWinBSDFBeamDirectionRep(SurfNum) = 0;
    2624    11255043 :                     state.dataHeatBal->SurfWinBSDFBeamThetaRep(SurfNum) = 0.0;
    2625    11255043 :                     state.dataHeatBal->SurfWinBSDFBeamPhiRep(SurfNum) = 0.0;
    2626             :                 }
    2627    75241353 :                 for (int Lay = 1; Lay <= state.dataHeatBal->MaxSolidWinLayers; Lay++) {
    2628   144703754 :                     for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    2629    78862296 :                         state.dataHeatBal->SurfWinQRadSWwinAbsLayer(SurfNum, Lay) = 0.0;
    2630             :                     }
    2631             :                 }
    2632    65799265 :                 for (int Lay = 1; Lay <= DataWindowEquivalentLayer::CFSMAXNL; Lay++) {
    2633   123929628 :                     for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    2634    67530258 :                         state.dataHeatBal->SurfWinInitialDifSolwinAbs(SurfNum, Lay) = 0.0;
    2635             :                     }
    2636             :                 }
    2637             :             }
    2638             :         }
    2639             :     }
    2640     2568509 :     if (resetSolar) {
    2641     4023965 :         for (int enclosureNum = 1; enclosureNum <= state.dataViewFactor->NumOfSolarEnclosures; ++enclosureNum) {
    2642     3540906 :             state.dataHeatBal->EnclSolQD(enclosureNum) = 0.0;
    2643     3540906 :             state.dataHeatBal->EnclSolQDforDaylight(enclosureNum) = 0.0;
    2644             :         }
    2645             : 
    2646             :         // TTD domes are currently not considered in the window list of a zone
    2647      483059 :         if ((int)state.dataDaylightingDevicesData->TDDPipe.size() > 0) {
    2648        1233 :             for (auto &e : state.dataDaylightingDevicesData->TDDPipe) {
    2649         822 :                 e.TransSolBeam = 0.0;
    2650         822 :                 e.TransSolDiff = 0.0;
    2651         822 :                 e.TransVisBeam = 0.0;
    2652         822 :                 e.TransVisDiff = 0.0;
    2653         822 :                 e.TransmittedSolar = 0.0;
    2654         822 :                 int SurfDome = e.Dome;
    2655         822 :                 state.dataSurface->SurfWinTransSolar(SurfDome) = 0.0;
    2656         822 :                 state.dataHeatBal->SurfQRadSWOutIncident(SurfDome) = 0.0;
    2657         822 :                 state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfDome) = 0.0;
    2658        6576 :                 for (int Lay = 1; Lay <= DataWindowEquivalentLayer::CFSMAXNL + 1; Lay++) {
    2659        5754 :                     state.dataHeatBal->SurfWinQRadSWwinAbs(SurfDome, Lay) = 0.0;
    2660             :                 }
    2661             :             }
    2662             :         }
    2663             : 
    2664      483059 :         if (state.dataSurface->CalcSolRefl) {
    2665       37007 :             for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    2666       33428 :                 state.dataSurface->SurfBmToBmReflFacObs(SurfNum) = 0.0;
    2667       33428 :                 state.dataSurface->SurfBmToDiffReflFacObs(SurfNum) = 0.0;
    2668       33428 :                 state.dataSurface->SurfBmToDiffReflFacGnd(SurfNum) = 0.0;
    2669             :             }
    2670             :         }
    2671    32004107 :         for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    2672    31521048 :             state.dataHeatBal->SurfInitialDifSolInAbsReport(SurfNum) = 0.0;
    2673    31521048 :             state.dataHeatBal->SurfCosIncidenceAngle(SurfNum) = 0.0;
    2674    31521048 :             state.dataHeatBal->SurfSWInAbsTotalReport(SurfNum) = 0.0;
    2675    31521048 :             state.dataSurface->SurfWinProfileAngHor(SurfNum) = 0.0;
    2676    31521048 :             state.dataSurface->SurfWinProfileAngVert(SurfNum) = 0.0;
    2677    31521048 :             state.dataSurface->SurfWinSysSolReflectance(SurfNum) = 0.0;
    2678    31521048 :             state.dataSurface->SurfWinSysSolAbsorptance(SurfNum) = 0.0;
    2679             :         }
    2680             :     }
    2681     2568509 :     if (currSolRadPositive) { // Sun is up, calculate solar quantities
    2682      822103 :         assert(equal_dimensions(state.dataSurface->SurfReflFacBmToBmSolObs,
    2683             :                                 state.dataSurface->SurfReflFacBmToDiffSolObs)); // For linear indexing
    2684      822103 :         assert(equal_dimensions(state.dataSurface->SurfReflFacBmToBmSolObs,
    2685             :                                 state.dataSurface->SurfReflFacBmToDiffSolGnd)); // For linear indexing
    2686      822103 :         Real64 GndReflSolarRad = 0.0;
    2687      822103 :         Real64 GndSolarRadInc = max(state.dataEnvrn->BeamSolarRad * state.dataEnvrn->SOLCOS(3) + state.dataEnvrn->DifSolarRad, 0.0);
    2688             : 
    2689    52861738 :         for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    2690    52039635 :             state.dataSurface->Surface(SurfNum).IncSolMultiplier = GetSurfIncidentSolarMultiplier(state, SurfNum);
    2691             :         }
    2692    52861738 :         for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    2693    52039635 :             Real64 SurfIncSolarMultiplier = state.dataSurface->Surface(SurfNum).IncSolMultiplier;
    2694    52039635 :             state.dataSurface->SurfSkySolarInc(SurfNum) =
    2695    52039635 :                 state.dataEnvrn->DifSolarRad * SurfIncSolarMultiplier * state.dataSolarShading->SurfAnisoSkyMult(SurfNum);
    2696    52039635 :             if (state.dataSurface->Surface(SurfNum).UseSurfPropertyGndSurfRefl) {
    2697        9408 :                 GndReflSolarRad = GndSolarRadInc * SurfIncSolarMultiplier *
    2698        4704 :                                   state.dataSurface->GroundSurfsProperty(state.dataSurface->Surface(SurfNum).SurfPropertyGndSurfIndex).SurfsReflAvg;
    2699        4704 :                 Surface(SurfNum).GndReflSolarRad = GndReflSolarRad;
    2700             :             } else {
    2701    52034931 :                 GndReflSolarRad = state.dataEnvrn->GndSolarRad * SurfIncSolarMultiplier;
    2702             :             }
    2703    52039635 :             state.dataSurface->SurfGndSolarInc(SurfNum) = GndReflSolarRad * Surface(SurfNum).ViewFactorGround;
    2704    52039635 :             state.dataSurface->SurfWinSkyGndSolarInc(SurfNum) = state.dataSurface->SurfGndSolarInc(SurfNum);
    2705    52039635 :             state.dataSurface->SurfWinBmGndSolarInc(SurfNum) = 0.0;
    2706             :         }
    2707      822103 :         if (state.dataSurface->CalcSolRefl) {
    2708             :             // [ lSH ] == ( HourOfDay, SurfNum ) // [ lSP ] == ( PreviousHour, SurfNum )
    2709        5881 :             Array1D<Real64>::size_type lSH = state.dataSurface->SurfReflFacBmToBmSolObs.index(state.dataGlobal->HourOfDay, 1) - 1;
    2710        5881 :             Array1D<Real64>::size_type lSP = state.dataSurface->SurfReflFacBmToBmSolObs.index(state.dataGlobal->PreviousHour, 1) - 1;
    2711             :             // For Complex Fenestrations:
    2712       74557 :             for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    2713       68676 :                 Real64 SurfIncSolarMultiplier = state.dataSurface->Surface(SurfNum).IncSolMultiplier;
    2714             : 
    2715       68676 :                 Real64 GndSurfReflectance = 0.0;
    2716       68676 :                 if (state.dataSurface->Surface(SurfNum).UseSurfPropertyGndSurfRefl) {
    2717           0 :                     GndSurfReflectance =
    2718           0 :                         state.dataSurface->GroundSurfsProperty(state.dataSurface->Surface(SurfNum).SurfPropertyGndSurfIndex).SurfsReflAvg;
    2719             :                 } else {
    2720       68676 :                     GndSurfReflectance = state.dataEnvrn->GndReflectance;
    2721             :                 }
    2722       68676 :                 Real64 currDifSolarRad = state.dataEnvrn->DifSolarRad * SurfIncSolarMultiplier;
    2723       68676 :                 Real64 currBeamSolarRad = state.dataEnvrn->BeamSolarRad * SurfIncSolarMultiplier;
    2724       68676 :                 state.dataSurface->SurfWinSkyGndSolarInc(SurfNum) =
    2725       68676 :                     currDifSolarRad * GndSurfReflectance * state.dataSurface->SurfReflFacSkySolGnd(SurfNum);
    2726       68676 :                 state.dataSurface->SurfWinBmGndSolarInc(SurfNum) =
    2727       68676 :                     currBeamSolarRad * state.dataEnvrn->SOLCOS(3) * GndSurfReflectance * state.dataSurface->SurfBmToDiffReflFacGnd(SurfNum);
    2728       68676 :                 state.dataSurface->SurfBmToBmReflFacObs(SurfNum) =
    2729      137352 :                     state.dataGlobal->WeightNow * state.dataSurface->SurfReflFacBmToBmSolObs[lSH + SurfNum] +
    2730       68676 :                     state.dataGlobal->WeightPreviousHour * state.dataSurface->SurfReflFacBmToBmSolObs[lSP + SurfNum];
    2731       68676 :                 state.dataSurface->SurfBmToDiffReflFacObs(SurfNum) =
    2732      137352 :                     state.dataGlobal->WeightNow * state.dataSurface->SurfReflFacBmToDiffSolObs[lSH + SurfNum] +
    2733       68676 :                     state.dataGlobal->WeightPreviousHour * state.dataSurface->SurfReflFacBmToDiffSolObs[lSP + SurfNum];
    2734       68676 :                 state.dataSurface->SurfBmToDiffReflFacGnd(SurfNum) =
    2735      137352 :                     state.dataGlobal->WeightNow * state.dataSurface->SurfReflFacBmToDiffSolGnd[lSH + SurfNum] +
    2736       68676 :                     state.dataGlobal->WeightPreviousHour * state.dataSurface->SurfReflFacBmToDiffSolGnd[lSP + SurfNum];
    2737             :                 // TH2 CR 9056
    2738       68676 :                 state.dataSurface->SurfSkySolarInc(SurfNum) +=
    2739      137352 :                     currBeamSolarRad * (state.dataSurface->SurfBmToBmReflFacObs(SurfNum) + state.dataSurface->SurfBmToDiffReflFacObs(SurfNum)) +
    2740       68676 :                     currDifSolarRad * state.dataSurface->SurfReflFacSkySolObs(SurfNum);
    2741       68676 :                 state.dataSurface->SurfGndSolarInc(SurfNum) =
    2742      137352 :                     currBeamSolarRad * state.dataEnvrn->SOLCOS(3) * GndSurfReflectance * state.dataSurface->SurfBmToDiffReflFacGnd(SurfNum) +
    2743       68676 :                     currDifSolarRad * GndSurfReflectance * state.dataSurface->SurfReflFacSkySolGnd(SurfNum);
    2744       68676 :                 state.dataSurface->SurfSkyDiffReflFacGnd(SurfNum) = state.dataSurface->SurfReflFacSkySolGnd(SurfNum);
    2745             :             }
    2746             :         }
    2747             : 
    2748      822103 :         CalcWindowProfileAngles(state);
    2749             : 
    2750      822103 :         if (state.dataHeatBal->CalcWindowRevealReflection) CalcBeamSolarOnWinRevealSurface(state);
    2751             : 
    2752      822103 :         if (state.dataWindowManager->inExtWindowModel->isExternalLibraryModel() && state.dataWindowManager->winOpticalModel->isSimplifiedModel()) {
    2753         826 :             CalcAbsorbedOnExteriorOpaqueSurfaces(state);
    2754         826 :             if (state.dataWindowManager->winOpticalModel->isSimplifiedModel()) {
    2755         826 :                 CalcInteriorSolarDistributionWCESimple(state);
    2756             :             }
    2757             :         } else {
    2758      821277 :             CalcInteriorSolarDistribution(state);
    2759             :         }
    2760             : 
    2761     6666610 :         for (int enclosureNum = 1; enclosureNum <= state.dataViewFactor->NumOfSolarEnclosures; ++enclosureNum) {
    2762             : 
    2763             :             // TH 3/24/2010 - QBV is not used!
    2764             :             // unused      QBV(ZoneNum) = (CBZone(ZoneNum) + EnclSolDB(ZoneNum))*BeamSolarRad
    2765             : 
    2766             :             // RJH 08/30/07 - QDV does not seem to ever be used. NOT USED!
    2767             :             // QDV(ZoneNum) = EnclSolDS(ZoneNum)*DifSolarRad &
    2768             :             //                +EnclSolDG(ZoneNum)*GndSolarRad
    2769             : 
    2770             :             // Original QD calc used only for EnclSolQSDifSol and daylighting calcs
    2771             :             // QDforDaylight(ZoneNum)  = EnclSolDB(ZoneNum)*BeamSolarRad  &
    2772             :             //                          +EnclSolDS(ZoneNum)*DifSolarRad  &
    2773             :             //                          +EnclSolDG(ZoneNum)*GndSolarRad
    2774             : 
    2775             :             //  Beam from interior windows (EnclSolDBIntWin) reflected from floor is counted in DayltgInterReflIllFrIntWins,
    2776             :             //  EnclSolDB needs to subtract this part since it is already counted in EnclSolDB.
    2777             :             //  Use EnclSolInitialDifSolReflW (Rob's previous work) as it better counts initial distribution of
    2778             :             //   diffuse solar rather than using weighted area*absorptance
    2779     5844507 :             state.dataHeatBal->EnclSolQDforDaylight(enclosureNum) =
    2780    11689014 :                 (state.dataHeatBal->EnclSolDB(enclosureNum) - state.dataHeatBal->EnclSolDBIntWin(enclosureNum)) * state.dataEnvrn->BeamSolarRad +
    2781    11689014 :                 state.dataHeatBal->EnclSolDBSSG(enclosureNum) + state.dataHeatBal->EnclSolInitialDifSolReflW(enclosureNum);
    2782             : 
    2783             :             // to exclude diffuse solar now absorbed/transmitted in CalcWinTransDifSolInitialDistribution
    2784             :             // EnclSolDB(ZoneNum) is Diffuse Solar from beam reflected from interior surfaces
    2785             :             // and transmitted through interior windows
    2786             :             // EnclSolDB is a factor that when multiplied by BeamSolarRad [W/m2] gives Watts
    2787             :             // QD(ZoneNum)  = EnclSolDB(ZoneNum)*BeamSolarRad  &
    2788             :             //                +EnclSolDS(ZoneNum)*DifSolarRad  &
    2789             :             //                +EnclSolDG(ZoneNum)*GndSolarRad
    2790    17533521 :             state.dataHeatBal->EnclSolQD(enclosureNum) = state.dataHeatBal->EnclSolDB(enclosureNum) * state.dataEnvrn->BeamSolarRad +
    2791    11689014 :                                                          state.dataHeatBal->EnclSolDBSSG(enclosureNum) +
    2792     5844507 :                                                          state.dataHeatBal->EnclSolInitialDifSolReflW(enclosureNum);
    2793             :         }
    2794             : 
    2795             :         // Flux of diffuse solar in each zone
    2796             : 
    2797     6666610 :         for (int enclNum = 1; enclNum <= state.dataViewFactor->NumOfSolarEnclosures; ++enclNum) {
    2798     5844507 :             state.dataHeatBal->EnclSolQSDifSol(enclNum) = state.dataHeatBal->EnclSolQDforDaylight(enclNum);
    2799             :         }
    2800             : 
    2801      822103 :         if (state.dataHeatBalSurf->InterZoneWindow) {
    2802       18955 :             for (int enclNum = 1; enclNum <= state.dataViewFactor->NumOfSolarEnclosures; ++enclNum) {
    2803       15164 :                 if (state.dataHeatBalSurf->EnclSolRecDifShortFromZ(enclNum)) {
    2804        9612 :                     Real64 EnclSolQSDifSol_sum(0.0); // Accumulator
    2805        9612 :                     auto lZone(state.dataHeatBalSurf->ZoneFractDifShortZtoZ.index(enclNum,
    2806        9612 :                                                                                   1)); // Tuned Linear indexing
    2807       48060 :                     for (int otherEnclNum = 1; otherEnclNum <= state.dataViewFactor->NumOfSolarEnclosures; ++otherEnclNum, ++lZone) {
    2808       38448 :                         if ((otherEnclNum != enclNum) && (state.dataHeatBalSurf->EnclSolRecDifShortFromZ(otherEnclNum))) {
    2809       35464 :                             EnclSolQSDifSol_sum += state.dataHeatBalSurf->ZoneFractDifShortZtoZ[lZone] *
    2810       17732 :                                                    state.dataHeatBal->EnclSolQDforDaylight(otherEnclNum); // [ lZone ] == ( enclNum, otherEnclNum )
    2811             :                         }
    2812             :                     }
    2813        9612 :                     state.dataHeatBal->EnclSolQSDifSol(enclNum) += EnclSolQSDifSol_sum;
    2814             :                 }
    2815             :             }
    2816             :         }
    2817             : 
    2818     6666610 :         for (int enclNum = 1; enclNum <= state.dataViewFactor->NumOfSolarEnclosures; ++enclNum) {
    2819     5844507 :             if (state.dataHeatBalSurf->InterZoneWindow)
    2820       15164 :                 state.dataHeatBal->EnclSolQSDifSol(enclNum) *=
    2821       15164 :                     state.dataHeatBalSurf->ZoneFractDifShortZtoZ(enclNum, enclNum) * state.dataViewFactor->EnclSolInfo(enclNum).solVMULT;
    2822             :             else
    2823     5829343 :                 state.dataHeatBal->EnclSolQSDifSol(enclNum) *= state.dataViewFactor->EnclSolInfo(enclNum).solVMULT;
    2824             :         }
    2825             : 
    2826             :         //    RJH - 09-12-07 commented out report varariable calcs here since they refer to old distribution method
    2827             :         //    DO SurfNum = 1, TotSurfaces
    2828             :         //      IF (.NOT. Surface(SurfNum)%HeatTransSurf) CYCLE
    2829             :         //!!! Following may need to be removed or changed when shelves are considered in adjacent reflection calculations
    2830             :         //      IF (Surface(SurfNum)%Class == SurfaceClass::Shading) CYCLE
    2831             :         //      ZoneNum = Surface(SurfNum)%Zone
    2832             :         // Diffuse solar entering zone through exterior windows is assumed to be uniformly
    2833             :         // distributed on inside face of surfaces of zone
    2834             :         //      DifIncInsSurfIntensRep(SurfNum) = (EnclSolDS(ZoneNum)*DifSolarRad + EnclSolDG(ZoneNum)*GndSolarRad) /  &
    2835             :         //        Zone(ZoneNum)%TotalSurfArea
    2836             :         //      DifIncInsSurfAmountRep(SurfNum) = (Surface(SurfNum)%Area + SurfaceWindow(SurfNum)%DividerArea) *  &
    2837             :         //        DifIncInsSurfIntensRep(SurfNum)
    2838             :         //      DifIncInsSurfAmountRepEnergy(SurfNum) = DifIncInsSurfAmountRep(SurfNum) * TimeStepZoneSec
    2839             :         //    END DO
    2840             : 
    2841             :         // Calculate Exterior Incident Short Wave (i.e. Solar) Radiation on shading surfaces
    2842      822103 :         if (state.dataSurface->BuildingShadingCount || state.dataSurface->FixedShadingCount || state.dataSurface->AttachedShadingCount) {
    2843     1766595 :             for (int SurfNum = state.dataSurface->ShadingSurfaceFirst; SurfNum <= state.dataSurface->ShadingSurfaceLast; SurfNum++) {
    2844     1502136 :                 Real64 GndSurfReflectance = 0.0;
    2845     1502136 :                 if (state.dataSurface->Surface(SurfNum).UseSurfPropertyGndSurfRefl) {
    2846           0 :                     GndSurfReflectance =
    2847           0 :                         state.dataSurface->GroundSurfsProperty(state.dataSurface->Surface(SurfNum).SurfPropertyGndSurfIndex).SurfsReflAvg;
    2848             :                 } else {
    2849     1502136 :                     GndSurfReflectance = state.dataEnvrn->GndReflectance;
    2850             :                 }
    2851             :                 // Cosine of incidence angle and solar incident on outside of surface, for reporting
    2852     1502136 :                 Real64 CosInc = state.dataHeatBal->SurfCosIncAng(state.dataGlobal->HourOfDay, state.dataGlobal->TimeStep, SurfNum);
    2853     1502136 :                 state.dataHeatBal->SurfCosIncidenceAngle(SurfNum) = CosInc;
    2854     1502136 :                 Real64 SurfIncSolarMultiplier = state.dataSurface->Surface(SurfNum).IncSolMultiplier;
    2855     1502136 :                 Real64 currDifSolarRad = state.dataEnvrn->DifSolarRad * SurfIncSolarMultiplier;
    2856     1502136 :                 Real64 currBeamSolarRad = state.dataEnvrn->BeamSolarRad * SurfIncSolarMultiplier;
    2857             :                 // Incident direct (unreflected) beam
    2858     1502136 :                 state.dataHeatBal->SurfQRadSWOutIncidentBeam(SurfNum) =
    2859     1502136 :                     currBeamSolarRad * state.dataHeatBal->SurfSunlitFrac(state.dataGlobal->HourOfDay, state.dataGlobal->TimeStep, SurfNum) * CosInc;
    2860             :                 // Incident (unreflected) diffuse solar from sky -- TDD_Diffuser calculated differently
    2861     1502136 :                 state.dataHeatBal->SurfQRadSWOutIncidentSkyDiffuse(SurfNum) = currDifSolarRad * state.dataSolarShading->SurfAnisoSkyMult(SurfNum);
    2862             :                 // Incident diffuse solar from sky diffuse reflected from ground plus beam reflected from ground
    2863     1502136 :                 state.dataHeatBal->SurfQRadSWOutIncidentGndDiffuse(SurfNum) = state.dataSurface->SurfGndSolarInc(SurfNum);
    2864             :                 // Incident diffuse solar from beam-to-diffuse reflection from ground
    2865     1502136 :                 state.dataHeatBal->SurfQRadSWOutIncBmToDiffReflGnd(SurfNum) =
    2866     1502136 :                     currBeamSolarRad * state.dataEnvrn->SOLCOS(3) * GndSurfReflectance * state.dataSurface->SurfBmToDiffReflFacGnd(SurfNum);
    2867             :                 // Incident diffuse solar from sky diffuse reflection from ground
    2868     1502136 :                 state.dataHeatBal->SurfQRadSWOutIncSkyDiffReflGnd(SurfNum) =
    2869     1502136 :                     currDifSolarRad * GndSurfReflectance * state.dataSurface->SurfSkyDiffReflFacGnd(SurfNum);
    2870             :                 // Total incident solar. Beam and sky reflection from obstructions, if calculated, is included
    2871             :                 // in SkySolarInc.
    2872     1502136 :                 state.dataHeatBal->SurfQRadSWOutIncident(SurfNum) =
    2873     3004272 :                     state.dataHeatBal->SurfQRadSWOutIncidentBeam(SurfNum) + state.dataHeatBal->SurfQRadSWOutIncidentSkyDiffuse(SurfNum) +
    2874     3004272 :                     state.dataHeatBal->SurfQRadSWOutIncBmToDiffReflGnd(SurfNum) + state.dataHeatBal->SurfQRadSWOutIncSkyDiffReflGnd(SurfNum);
    2875             :             }
    2876             :         }
    2877             : 
    2878     1644206 :         Array1D<Real64> currBeamSolar(state.dataSurface->TotSurfaces); // Local variable for BeamSolarRad
    2879             : 
    2880    21723483 :         for (int SurfNum : state.dataSurface->AllExtSolarSurfaceList) {
    2881    20901380 :             Real64 SurfIncSolarMultiplier = state.dataSurface->Surface(SurfNum).IncSolMultiplier;
    2882             :             // Regular surface
    2883    20901380 :             currBeamSolar(SurfNum) = state.dataEnvrn->BeamSolarRad * SurfIncSolarMultiplier;
    2884    20901380 :             Real64 currDifSolarRad = state.dataEnvrn->DifSolarRad * SurfIncSolarMultiplier;
    2885             :             // Cosine of incidence angle and solar incident on outside of surface, for reporting
    2886    20901380 :             state.dataHeatBal->SurfCosIncidenceAngle(SurfNum) =
    2887    20901380 :                 state.dataHeatBal->SurfCosIncAng(state.dataGlobal->HourOfDay, state.dataGlobal->TimeStep, SurfNum);
    2888             : 
    2889             :             // Report variables for various incident solar quantities
    2890             :             // Incident direct (unreflected) beam
    2891    20901380 :             state.dataHeatBal->SurfQRadSWOutIncidentBeam(SurfNum) =
    2892    41802760 :                 currBeamSolar(SurfNum) * state.dataHeatBal->SurfSunlitFrac(state.dataGlobal->HourOfDay, state.dataGlobal->TimeStep, SurfNum) *
    2893    20901380 :                 state.dataHeatBal->SurfCosIncidenceAngle(SurfNum);
    2894             : 
    2895    20901380 :             Real64 GndSurfReflectance = 0.0;
    2896    20901380 :             if (state.dataSurface->Surface(SurfNum).UseSurfPropertyGndSurfRefl) {
    2897        3528 :                 GndSurfReflectance =
    2898        3528 :                     state.dataSurface->GroundSurfsProperty(state.dataSurface->Surface(SurfNum).SurfPropertyGndSurfIndex).SurfsReflAvg;
    2899             :             } else {
    2900    20897852 :                 GndSurfReflectance = state.dataEnvrn->GndReflectance;
    2901             :             }
    2902             :             // Incident (unreflected) diffuse solar from sky -- TDD_Diffuser calculated differently
    2903    20901380 :             state.dataHeatBal->SurfQRadSWOutIncidentSkyDiffuse(SurfNum) = currDifSolarRad * state.dataSolarShading->SurfAnisoSkyMult(SurfNum);
    2904             :             // Incident diffuse solar from sky diffuse reflected from ground plus beam reflected from ground
    2905    20901380 :             state.dataHeatBal->SurfQRadSWOutIncidentGndDiffuse(SurfNum) = state.dataSurface->SurfGndSolarInc(SurfNum);
    2906             :             // Incident diffuse solar from beam-to-diffuse reflection from ground
    2907    20901380 :             state.dataHeatBal->SurfQRadSWOutIncBmToDiffReflGnd(SurfNum) =
    2908    20901380 :                 currBeamSolar(SurfNum) * state.dataEnvrn->SOLCOS(3) * GndSurfReflectance * state.dataSurface->SurfBmToDiffReflFacGnd(SurfNum);
    2909             : 
    2910             :             // Incident diffuse solar from sky diffuse reflection from ground
    2911    20901380 :             state.dataHeatBal->SurfQRadSWOutIncSkyDiffReflGnd(SurfNum) =
    2912    20901380 :                 currDifSolarRad * GndSurfReflectance * state.dataSurface->SurfSkyDiffReflFacGnd(SurfNum);
    2913             :             // Total incident solar. Beam and sky reflection from obstructions, if calculated, is included
    2914             :             // in SkySolarInc.
    2915             :             // SurfQRadSWOutIncident(SurfNum) = SurfQRadSWOutIncidentBeam(SurfNum) + SkySolarInc + GndSolarInc
    2916             :             // TH2 CR 9056
    2917    20901380 :             state.dataHeatBal->SurfQRadSWOutIncident(SurfNum) =
    2918    41802760 :                 state.dataHeatBal->SurfQRadSWOutIncidentBeam(SurfNum) + state.dataHeatBal->SurfQRadSWOutIncidentSkyDiffuse(SurfNum) +
    2919    41802760 :                 state.dataHeatBal->SurfQRadSWOutIncBmToDiffReflGnd(SurfNum) + state.dataHeatBal->SurfQRadSWOutIncSkyDiffReflGnd(SurfNum);
    2920             : 
    2921    20901380 :             if (state.dataSurface->CalcSolRefl) {
    2922             :                 // Incident beam solar from beam-to-beam (specular) reflection from obstructions
    2923       34945 :                 state.dataHeatBal->SurfQRadSWOutIncBmToBmReflObs(SurfNum) = state.dataSurface->SurfBmToBmReflFacObs(SurfNum) * currBeamSolar(SurfNum);
    2924             :                 // Incident diffuse solar from beam-to-diffuse reflection from obstructions
    2925       34945 :                 state.dataHeatBal->SurfQRadSWOutIncBmToDiffReflObs(SurfNum) =
    2926       34945 :                     state.dataSurface->SurfBmToDiffReflFacObs(SurfNum) * currBeamSolar(SurfNum);
    2927             :                 // Incident diffuse solar from sky diffuse reflection from obstructions
    2928       34945 :                 state.dataHeatBal->SurfQRadSWOutIncSkyDiffReflObs(SurfNum) = currDifSolarRad * state.dataSurface->SurfReflFacSkySolObs(SurfNum);
    2929             :                 // TH2 CR 9056: Add reflections from obstructions to the total incident
    2930      104835 :                 state.dataHeatBal->SurfQRadSWOutIncident(SurfNum) += state.dataHeatBal->SurfQRadSWOutIncBmToBmReflObs(SurfNum) +
    2931       69890 :                                                                      state.dataHeatBal->SurfQRadSWOutIncBmToDiffReflObs(SurfNum) +
    2932       34945 :                                                                      state.dataHeatBal->SurfQRadSWOutIncSkyDiffReflObs(SurfNum);
    2933             :             }
    2934             :         }
    2935      823335 :         for (int PipeNum = 1; PipeNum <= (int)state.dataDaylightingDevicesData->TDDPipe.size(); ++PipeNum) {
    2936        1232 :             int const SurfNum = state.dataDaylightingDevicesData->TDDPipe(PipeNum).Diffuser; // TDD: Diffuser object number
    2937        1232 :             int const SurfNum2 = state.dataDaylightingDevicesData->TDDPipe(PipeNum).Dome;    // TDD: DOME object number
    2938        1232 :             int const ConstrNum = state.dataSurface->SurfActiveConstruction(SurfNum);
    2939             : 
    2940             :             // Reconstruct the beam, sky, and ground radiation transmittance of just the TDD:DOME and TDD pipe
    2941             :             // by dividing out diffuse solar transmittance of TDD:DIFFUSER
    2942        1232 :             Real64 ConInc = state.dataHeatBal->SurfCosIncAng(state.dataGlobal->HourOfDay, state.dataGlobal->TimeStep, SurfNum2);
    2943             : 
    2944        1232 :             state.dataHeatBal->SurfCosIncidenceAngle(SurfNum) = ConInc;
    2945        1232 :             Real64 SurfIncSolarMultiplier = state.dataSurface->Surface(SurfNum).IncSolMultiplier;
    2946        3696 :             currBeamSolar(SurfNum) = state.dataEnvrn->BeamSolarRad * SurfIncSolarMultiplier *
    2947        2464 :                                      TransTDD(state, PipeNum, ConInc, DataDaylightingDevices::RadType::SolarBeam) /
    2948        1232 :                                      state.dataConstruction->Construct(ConstrNum).TransDiff;
    2949             : 
    2950        3696 :             state.dataSurface->SurfSkySolarInc(SurfNum) = state.dataEnvrn->DifSolarRad * SurfIncSolarMultiplier *
    2951        2464 :                                                           state.dataSolarShading->SurfAnisoSkyMult(SurfNum2) *
    2952        2464 :                                                           TransTDD(state, PipeNum, ConInc, DataDaylightingDevices::RadType::SolarAniso) /
    2953        1232 :                                                           state.dataConstruction->Construct(ConstrNum).TransDiff;
    2954             : 
    2955        3696 :             state.dataSurface->SurfGndSolarInc(SurfNum) = state.dataSurface->SurfGndSolarInc(SurfNum2) *
    2956        2464 :                                                           state.dataDaylightingDevicesData->TDDPipe(PipeNum).TransSolIso /
    2957        1232 :                                                           state.dataConstruction->Construct(ConstrNum).TransDiff;
    2958             :             // Incident direct (unreflected) beam
    2959        3696 :             state.dataHeatBal->SurfQRadSWOutIncidentBeam(SurfNum) = currBeamSolar(SurfNum) *
    2960        3696 :                                                                     state.dataHeatBal->SurfSunlitFrac(state.dataGlobal->HourOfDay,
    2961        1232 :                                                                                                       state.dataGlobal->TimeStep,
    2962        4928 :                                                                                                       SurfNum2) *
    2963             :                                                                     ConInc; // NOTE: sunlit and coninc array set to SurfNum2
    2964             : 
    2965             :             // Incident (unreflected) diffuse solar from sky -- TDD_Diffuser calculated differently
    2966        1232 :             state.dataHeatBal->SurfQRadSWOutIncidentSkyDiffuse(SurfNum) = state.dataSurface->SurfSkySolarInc(SurfNum);
    2967        1232 :             state.dataHeatBal->SurfQRadSWOutIncident(SurfNum) =
    2968        2464 :                 (state.dataHeatBal->SurfQRadSWOutIncidentBeam(SurfNum) + state.dataHeatBal->SurfQRadSWOutIncidentSkyDiffuse(SurfNum) +
    2969        2464 :                  state.dataHeatBal->SurfQRadSWOutIncBmToDiffReflGnd(SurfNum) + state.dataHeatBal->SurfQRadSWOutIncSkyDiffReflGnd(SurfNum));
    2970             :         }
    2971             : 
    2972      822719 :         for (int ShelfNum = 1; ShelfNum <= (int)state.dataDaylightingDevicesData->Shelf.size(); ++ShelfNum) {
    2973         616 :             int SurfNum = state.dataDaylightingDevicesData->Shelf(ShelfNum).Window;       // Daylighting shelf object number
    2974         616 :             int OutShelfSurf = state.dataDaylightingDevicesData->Shelf(ShelfNum).OutSurf; // Outside daylighting shelf present if > 0
    2975         616 :             state.dataHeatBal->SurfCosIncidenceAngle(SurfNum) =
    2976         616 :                 state.dataHeatBal->SurfCosIncAng(state.dataGlobal->HourOfDay, state.dataGlobal->TimeStep, SurfNum);
    2977         616 :             Real64 SurfIncSolarMultiplier = state.dataSurface->Surface(SurfNum).IncSolMultiplier;
    2978         616 :             currBeamSolar(SurfNum) = state.dataEnvrn->BeamSolarRad * SurfIncSolarMultiplier;
    2979             :             // Shelf diffuse solar radiation
    2980             :             Real64 ShelfSolarRad =
    2981        1232 :                 (currBeamSolar(SurfNum) * state.dataHeatBal->SurfSunlitFrac(state.dataGlobal->HourOfDay, state.dataGlobal->TimeStep, OutShelfSurf) *
    2982        1232 :                      state.dataHeatBal->SurfCosIncAng(state.dataGlobal->HourOfDay, state.dataGlobal->TimeStep, OutShelfSurf) +
    2983         616 :                  state.dataEnvrn->DifSolarRad * SurfIncSolarMultiplier * state.dataSolarShading->SurfAnisoSkyMult(OutShelfSurf)) *
    2984         616 :                 state.dataDaylightingDevicesData->Shelf(ShelfNum).OutReflectSol;
    2985             : 
    2986         616 :             Real64 GndReflSolarRad = state.dataEnvrn->GndSolarRad * SurfIncSolarMultiplier;
    2987         616 :             if (state.dataSurface->Surface(SurfNum).UseSurfPropertyGndSurfRefl) {
    2988           0 :                 GndReflSolarRad = state.dataSurface->Surface(SurfNum).GndReflSolarRad;
    2989             :             }
    2990             :             // Add all reflected solar from the outside shelf to the ground solar
    2991             :             // NOTE:  If the shelf blocks part of the view to the ground, the user must reduce the ground view factor!!
    2992         616 :             state.dataSurface->SurfGndSolarInc(SurfNum) =
    2993         616 :                 GndReflSolarRad * Surface(SurfNum).ViewFactorGround + ShelfSolarRad * state.dataDaylightingDevicesData->Shelf(ShelfNum).ViewFactor;
    2994             :         }
    2995             : 
    2996             :         // Calculate Exterior and Interior Absorbed Short Wave Radiation
    2997     6670327 :         for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    2998    11701404 :             for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    2999     5853180 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
    3000     5853180 :                 int const firstSurfOpaq = thisSpace.OpaqOrIntMassSurfaceFirst;
    3001     5853180 :                 int const lastSurfOpaq = thisSpace.OpaqOrIntMassSurfaceLast;
    3002    49246342 :                 for (int SurfNum = firstSurfOpaq; SurfNum <= lastSurfOpaq; ++SurfNum) {
    3003    43393162 :                     int const ConstrNum = state.dataSurface->Surface(SurfNum).Construction;
    3004    43393162 :                     Real64 SurfIncSolarMultiplier = state.dataSurface->Surface(SurfNum).IncSolMultiplier;
    3005    43393162 :                     currBeamSolar(SurfNum) = state.dataEnvrn->BeamSolarRad * SurfIncSolarMultiplier;
    3006    43393162 :                     if (Surface(SurfNum).ExtSolar) {
    3007             :                         Real64 AbsExt =
    3008    12357628 :                             state.dataHeatBalSurf->SurfAbsSolarExt(SurfNum); // Absorptivity of outer most layer (or movable insulation if present)
    3009    12357628 :                         state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(SurfNum) =
    3010    24715256 :                             state.dataSurface->SurfOpaqAO(SurfNum) * currBeamSolar(SurfNum) +
    3011    12357628 :                             AbsExt * (state.dataSurface->SurfSkySolarInc(SurfNum) + state.dataSurface->SurfGndSolarInc(SurfNum));
    3012             :                     }
    3013    43393162 :                     if (ConstrNum > 0) {
    3014    43393162 :                         int SurfSolIncPtr = SurfaceScheduledSolarInc(state, SurfNum, ConstrNum);
    3015    43393162 :                         if (SurfSolIncPtr == 0) {
    3016    43392574 :                             if (state.dataConstruction->Construct(ConstrNum).TransDiff <= 0.0) {    // Opaque surface
    3017    43392574 :                                 int ShelfNum = state.dataSurface->SurfDaylightingShelfInd(SurfNum); // Daylighting shelf object number
    3018    43392574 :                                 int InShelfSurf = 0;                                                // Inside daylighting shelf surface number
    3019    43392574 :                                 if (ShelfNum > 0) {
    3020           0 :                                     InShelfSurf = state.dataDaylightingDevicesData->Shelf(ShelfNum).InSurf; // Inside daylighting shelf present if > 0
    3021             :                                 }
    3022    43392574 :                                 state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) +=
    3023    43392574 :                                     state.dataSurface->SurfOpaqAI(SurfNum) * currBeamSolar(SurfNum);
    3024    43392574 :                                 if (InShelfSurf > 0) { // Inside daylighting shelf
    3025             :                                     // Shelf surface area is divided by 2 because only one side sees beam (Area was multiplied by 2 during init)
    3026           0 :                                     state.dataHeatBalSurf->SurfOpaqInsFaceBeamSolAbsorbed(SurfNum) =
    3027           0 :                                         state.dataSurface->SurfOpaqAI(SurfNum) * currBeamSolar(SurfNum) * (0.5 * Surface(SurfNum).Area);
    3028             :                                 } else { // Regular surface
    3029    43392574 :                                     state.dataHeatBalSurf->SurfOpaqInsFaceBeamSolAbsorbed(SurfNum) =
    3030    43392574 :                                         state.dataSurface->SurfOpaqAI(SurfNum) * currBeamSolar(SurfNum) * Surface(SurfNum).Area;
    3031             :                                 }
    3032             :                             }
    3033             :                         } else {
    3034         588 :                             state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) += state.dataSurface->SurfOpaqAI(SurfNum);
    3035             :                         }
    3036             :                     }
    3037             :                 }
    3038     5853180 :                 int const firstSurfWin = thisSpace.WindowSurfaceFirst;
    3039     5853180 :                 int const lastSurfWin = thisSpace.WindowSurfaceLast;
    3040    12978939 :                 for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    3041     7125759 :                     if (Surface(SurfNum).ExtSolar || state.dataSurface->SurfWinOriginalClass(SurfNum) == SurfaceClass::TDD_Diffuser) {
    3042             :                         // Exclude special shading surfaces which required SurfOpaqQRadSWOut calculations above
    3043     7117249 :                         int const ConstrNum = state.dataSurface->SurfActiveConstruction(SurfNum);
    3044     7117249 :                         Real64 CosInc = state.dataHeatBal->SurfCosIncidenceAngle(SurfNum); // Cosine of incidence angle of beam solar on glass
    3045     7117249 :                         Real64 BeamSolar = currBeamSolar(SurfNum);                         // Local variable for BeamSolarRad
    3046     7117249 :                         Real64 SkySolarInc = state.dataSurface->SurfSkySolarInc(SurfNum);  // Sky diffuse solar incident on a surface
    3047     7117249 :                         Real64 GndSolarInc = state.dataSurface->SurfGndSolarInc(SurfNum);  // Ground diffuse solar incident on a surface
    3048             : 
    3049     7117249 :                         WinShadingType ShadeFlag = state.dataSurface->SurfWinShadingFlag(SurfNum);
    3050             : 
    3051    14219777 :                         if (state.dataSurface->SurfWinWindowModelType(SurfNum) == WindowModel::Detailed &&
    3052     7102528 :                             !state.dataWindowManager->inExtWindowModel->isExternalLibraryModel()) {
    3053     7101702 :                             int TotGlassLay = state.dataConstruction->Construct(ConstrNum).TotGlassLayers; // Number of glass layers
    3054    16328601 :                             for (int Lay = 1; Lay <= TotGlassLay; ++Lay) {
    3055     9226899 :                                 AbsDiffWin(Lay) = state.dataConstruction->Construct(ConstrNum).AbsDiff(Lay);
    3056             :                             }
    3057             : 
    3058     7101702 :                             if (IS_SHADED(ShadeFlag)) { // Shaded window
    3059             : 
    3060      123072 :                                 int const ConstrNumSh = state.dataSurface->SurfWinActiveShadedConstruction(SurfNum); // Shaded window construction
    3061             : 
    3062      123072 :                                 if (ANY_SHADE_SCREEN(ShadeFlag)) { // Shade/screen on
    3063       92932 :                                     for (int Lay = 1; Lay <= TotGlassLay; ++Lay) {
    3064       59208 :                                         AbsDiffWin(Lay) = state.dataConstruction->Construct(ConstrNumSh).AbsDiff(Lay);
    3065             :                                     }
    3066       33724 :                                     state.dataSurface->SurfWinExtDiffAbsByShade(SurfNum) =
    3067       33724 :                                         state.dataConstruction->Construct(ConstrNumSh).AbsDiffShade * (SkySolarInc + GndSolarInc);
    3068       89348 :                                 } else if (ANY_BLIND(ShadeFlag)) { // Blind on
    3069       18094 :                                     int SurfWinSlatsAngIndex = state.dataSurface->SurfWinSlatsAngIndex(SurfNum);
    3070       18094 :                                     Real64 SurfWinSlatsAngInterpFac = state.dataSurface->SurfWinSlatsAngInterpFac(SurfNum);
    3071             :                                     Real64 AbsDiffBlind;
    3072       18094 :                                     if (state.dataSurface->SurfWinMovableSlats(SurfNum)) {
    3073        3444 :                                         for (int Lay = 1; Lay <= TotGlassLay; ++Lay) {
    3074        3444 :                                             AbsDiffWin(Lay) = General::InterpGeneral(
    3075        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh).BlAbsDiff(SurfWinSlatsAngIndex, Lay),
    3076        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh)
    3077        3444 :                                                     .BlAbsDiff(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1), Lay),
    3078             :                                                 SurfWinSlatsAngInterpFac);
    3079        3444 :                                             AbsDiffWinGnd(Lay) = General::InterpGeneral(
    3080        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh).BlAbsDiffGnd(SurfWinSlatsAngIndex, Lay),
    3081        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh)
    3082        3444 :                                                     .BlAbsDiffGnd(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1), Lay),
    3083             :                                                 SurfWinSlatsAngInterpFac);
    3084        3444 :                                             AbsDiffWinSky(Lay) = General::InterpGeneral(
    3085        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh).BlAbsDiffSky(SurfWinSlatsAngIndex, Lay),
    3086        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh)
    3087        3444 :                                                     .BlAbsDiffSky(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1), Lay),
    3088             :                                                 SurfWinSlatsAngInterpFac);
    3089             :                                         }
    3090        1722 :                                         AbsDiffBlind =
    3091        1722 :                                             General::InterpGeneral(state.dataConstruction->Construct(ConstrNumSh).AbsDiffBlind(SurfWinSlatsAngIndex),
    3092        1722 :                                                                    state.dataConstruction->Construct(ConstrNumSh)
    3093        3444 :                                                                        .AbsDiffBlind(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1)),
    3094             :                                                                    SurfWinSlatsAngInterpFac);
    3095             :                                     } else {
    3096       37182 :                                         for (int Lay = 1; Lay <= TotGlassLay; ++Lay) {
    3097       20810 :                                             AbsDiffWin(Lay) = state.dataConstruction->Construct(ConstrNumSh).BlAbsDiff(1, Lay);
    3098       20810 :                                             AbsDiffWinGnd(Lay) = state.dataConstruction->Construct(ConstrNumSh).BlAbsDiffGnd(1, Lay);
    3099       20810 :                                             AbsDiffWinSky(Lay) = state.dataConstruction->Construct(ConstrNumSh).BlAbsDiffSky(1, Lay);
    3100             :                                         }
    3101       16372 :                                         AbsDiffBlind = state.dataConstruction->Construct(ConstrNumSh).AbsDiffBlind(1);
    3102             :                                     }
    3103       18094 :                                     state.dataSurface->SurfWinExtDiffAbsByShade(SurfNum) = AbsDiffBlind * (SkySolarInc + GndSolarInc);
    3104             : 
    3105       18094 :                                     if (state.dataHeatBal->Blind(state.dataSurface->SurfWinBlindNumber(SurfNum)).SlatOrientation ==
    3106             :                                         DataWindowEquivalentLayer::Orientation::Horizontal) {
    3107       18094 :                                         Real64 ACosTlt = std::abs(Surface(SurfNum).CosTilt);
    3108             :                                         Real64 AbsDiffBlindGnd;
    3109             :                                         Real64 AbsDiffBlindSky;
    3110       18094 :                                         if (state.dataSurface->SurfWinMovableSlats(SurfNum)) {
    3111        3444 :                                             AbsDiffBlindGnd = General::InterpGeneral(
    3112        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh).AbsDiffBlindGnd(SurfWinSlatsAngIndex),
    3113        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh)
    3114        3444 :                                                     .AbsDiffBlindGnd(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1)),
    3115             :                                                 SurfWinSlatsAngInterpFac);
    3116        3444 :                                             AbsDiffBlindSky = General::InterpGeneral(
    3117        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh).AbsDiffBlindSky(SurfWinSlatsAngIndex),
    3118        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh)
    3119        3444 :                                                     .AbsDiffBlindSky(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1)),
    3120             :                                                 SurfWinSlatsAngInterpFac);
    3121             :                                         } else {
    3122       16372 :                                             AbsDiffBlindGnd = state.dataConstruction->Construct(ConstrNumSh).AbsDiffBlindGnd(1);
    3123       16372 :                                             AbsDiffBlindSky = state.dataConstruction->Construct(ConstrNumSh).AbsDiffBlindSky(1);
    3124             :                                         }
    3125       18094 :                                         state.dataSurface->SurfWinExtDiffAbsByShade(SurfNum) =
    3126       36188 :                                             SkySolarInc * (0.5 * ACosTlt * AbsDiffBlindGnd + (1.0 - 0.5 * ACosTlt) * AbsDiffBlindSky) +
    3127       18094 :                                             GndSolarInc * ((1.0 - 0.5 * ACosTlt) * AbsDiffBlindGnd + 0.5 * ACosTlt * AbsDiffBlindSky);
    3128             :                                     }
    3129             :                                 }
    3130             : 
    3131             :                                 // Correct for shadowing of divider onto interior shading device (note that dividers are
    3132             :                                 // not allowed in windows with between-glass shade/blind)
    3133             : 
    3134      123072 :                                 if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag) && state.dataSurface->SurfWinDividerArea(SurfNum) > 0.0)
    3135         742 :                                     state.dataSurface->SurfWinExtDiffAbsByShade(SurfNum) *= state.dataSurface->SurfWinGlazedFrac(SurfNum);
    3136             : 
    3137      123072 :                                 if (ShadeFlag == WinShadingType::SwitchableGlazing) {                      // Switchable glazing
    3138       71254 :                                     Real64 SwitchFac = state.dataSurface->SurfWinSwitchingFactor(SurfNum); // Switching factor for switchable glazing
    3139      213762 :                                     for (int Lay = 1; Lay <= TotGlassLay; ++Lay) {
    3140      142508 :                                         AbsDiffWin(Lay) =
    3141      142508 :                                             InterpSw(SwitchFac, AbsDiffWin(Lay), state.dataConstruction->Construct(ConstrNumSh).AbsDiff(Lay));
    3142             :                                     }
    3143             :                                 }
    3144             : 
    3145             :                             } // End of check if window has shading device on
    3146             : 
    3147     7101702 :                             state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfNum) = 0.0;
    3148    16328601 :                             for (int Lay = 1; Lay <= TotGlassLay; ++Lay) {
    3149     9226899 :                                 state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) =
    3150     9226899 :                                     AbsDiffWin(Lay) * (SkySolarInc + GndSolarInc) + state.dataSurface->SurfWinA(SurfNum, Lay) * BeamSolar;
    3151             :                                 // SurfWinA is from InteriorSolarDistribution
    3152     9226899 :                                 if (ANY_BLIND(ShadeFlag)) {
    3153       22532 :                                     int ConstrNumSh = Surface(SurfNum).activeShadedConstruction;
    3154       22532 :                                     if (state.dataHeatBal->Blind(state.dataSurface->SurfWinBlindNumber(SurfNum)).SlatOrientation ==
    3155             :                                         DataWindowEquivalentLayer::Orientation::Horizontal) {
    3156       22532 :                                         Real64 ACosTlt = std::abs(Surface(SurfNum).CosTilt); // Absolute value of cosine of surface tilt angle
    3157             :                                         Real64 AbsDiffGlassLayGnd; // System glass layer ground diffuse solar absorptance with blind on
    3158             :                                         Real64 AbsDiffGlassLaySky; // System glass layer sky diffuse solar absorptance with blind on
    3159       22532 :                                         if (state.dataSurface->SurfWinMovableSlats(SurfNum)) {
    3160        5166 :                                             AbsDiffGlassLayGnd = General::InterpGeneral(
    3161        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh)
    3162        1722 :                                                     .BlAbsDiffGnd(state.dataSurface->SurfWinSlatsAngIndex(SurfNum), Lay),
    3163        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh)
    3164        3444 :                                                     .BlAbsDiffGnd(std::min(MaxSlatAngs, state.dataSurface->SurfWinSlatsAngIndex(SurfNum) + 1), Lay),
    3165        1722 :                                                 state.dataSurface->SurfWinSlatsAngInterpFac(SurfNum));
    3166        5166 :                                             AbsDiffGlassLaySky = General::InterpGeneral(
    3167        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh)
    3168        1722 :                                                     .BlAbsDiffSky(state.dataSurface->SurfWinSlatsAngIndex(SurfNum), Lay),
    3169        1722 :                                                 state.dataConstruction->Construct(ConstrNumSh)
    3170        3444 :                                                     .BlAbsDiffSky(std::min(MaxSlatAngs, state.dataSurface->SurfWinSlatsAngIndex(SurfNum) + 1), Lay),
    3171        1722 :                                                 state.dataSurface->SurfWinSlatsAngInterpFac(SurfNum));
    3172             :                                         } else {
    3173       20810 :                                             AbsDiffGlassLayGnd = state.dataConstruction->Construct(ConstrNumSh).BlAbsDiffGnd(1, Lay);
    3174       20810 :                                             AbsDiffGlassLaySky = state.dataConstruction->Construct(ConstrNumSh).BlAbsDiffSky(1, Lay);
    3175             :                                         }
    3176       22532 :                                         state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) =
    3177       45064 :                                             SkySolarInc * (0.5 * ACosTlt * AbsDiffGlassLayGnd + (1.0 - 0.5 * ACosTlt) * AbsDiffGlassLaySky) +
    3178       45064 :                                             GndSolarInc * ((1.0 - 0.5 * ACosTlt) * AbsDiffGlassLayGnd + 0.5 * ACosTlt * AbsDiffGlassLaySky) +
    3179       22532 :                                             state.dataSurface->SurfWinA(SurfNum, Lay) * BeamSolar;
    3180             :                                     }
    3181             :                                 }
    3182             :                                 // Total solar absorbed in solid layer (W), for reporting
    3183     9226899 :                                 state.dataHeatBal->SurfWinQRadSWwinAbsLayer(SurfNum, Lay) =
    3184     9226899 :                                     state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) * Surface(SurfNum).Area;
    3185             : 
    3186             :                                 // Total solar absorbed in all glass layers (W), for reporting
    3187     9226899 :                                 state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfNum) += state.dataHeatBal->SurfWinQRadSWwinAbsLayer(SurfNum, Lay);
    3188             :                             }
    3189     7101702 :                             state.dataHeatBal->SurfWinQRadSWwinAbsTotEnergy(SurfNum) =
    3190     7101702 :                                 state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfNum) * state.dataGlobal->TimeStepZoneSec;
    3191             :                             // Need to do it this way for now beaucse of scheduled surface gains. They do work only with
    3192             :                             // BSDF windows and overwriting absorbtances will work only for ordinary windows
    3193             :                             // } else if ( SurfaceWindow( SurfNum ).WindowModelType != WindowModel:: BSDF &&
    3194             :                             //   SurfaceWindow( SurfNum ).WindowModelType != WindowModel:: EQL &&
    3195             :                             //   inExtWindowModel->isExternalLibraryModel() ) {
    3196             :                             //   TotSolidLay = Construct( ConstrNum ).TotSolidLayers;
    3197             :                             //   for ( Lay = 1; Lay <= TotSolidLay; ++Lay ) {
    3198             :                             //     SurfWinQRadSWwinAbs( Lay, SurfNum ) = SurfWinA( Lay, SurfNum ) *
    3199             :                             //       ( SurfQRadSWOutIncident( SurfNum ) + QS( Surface( SurfNum ).Zone ) );
    3200             :                             //   }
    3201       15547 :                         } else if (state.dataSurface->SurfWinWindowModelType(SurfNum) == WindowModel::BSDF) {
    3202       12243 :                             int TotSolidLay = state.dataConstruction->Construct(ConstrNum).TotSolidLayers;
    3203             :                             // Number of solid layers in fenestration system (glass + shading)
    3204       12243 :                             int CurrentState = state.dataSurface->SurfaceWindow(SurfNum).ComplexFen.CurrentState;
    3205             :                             // Current state for Complex Fenestration
    3206             :                             // Examine for schedule surface gain
    3207             :                             Real64 SurfSolAbs =
    3208       12243 :                                 WindowScheduledSolarAbs(state,
    3209             :                                                         SurfNum,
    3210       12243 :                                                         ConstrNum); // Pointer to scheduled surface gains object for fenestration systems
    3211             : 
    3212       46277 :                             for (int Lay = 1; Lay <= TotSolidLay; ++Lay) {
    3213       34034 :                                 if (SurfSolAbs != 0) {
    3214         294 :                                     state.dataSurface->SurfWinA(SurfNum, Lay) =
    3215         294 :                                         GetCurrentScheduleValue(state, state.dataSurface->FenLayAbsSSG(SurfSolAbs).SchedPtrs(Lay));
    3216             :                                     // ABWin(Lay) = SurfWinA(SurfNum,Lay)
    3217         294 :                                     state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) = state.dataSurface->SurfWinA(SurfNum, Lay);
    3218             :                                 } else {
    3219             :                                     // Several notes about this equation.  First part is accounting for duffuse solar radiation for the ground
    3220             :                                     // and from the sky.  Second item (SurfWinA(SurfNum,Lay) * BeamSolar) is accounting for absorbed solar
    3221             :                                     // radiation originating from beam on exterior side.  Third item (SurfWinACFOverlap(SurfNum,Lay)) is
    3222             :                                     // accounting for absorptances from beam hitting back of the window which passes through rest of exterior
    3223             :                                     // windows
    3224       33740 :                                     state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) =
    3225       67480 :                                         state.dataSurface->SurfaceWindow(SurfNum).ComplexFen.State(CurrentState).WinSkyFtAbs(Lay) * SkySolarInc +
    3226       67480 :                                         state.dataSurface->SurfaceWindow(SurfNum).ComplexFen.State(CurrentState).WinSkyGndAbs(Lay) * GndSolarInc +
    3227       67480 :                                         state.dataSurface->SurfWinA(SurfNum, Lay) * BeamSolar +
    3228       33740 :                                         state.dataSurface->SurfWinACFOverlap(SurfNum, Lay) * BeamSolar;
    3229             :                                 }
    3230             :                                 // Total solar absorbed in solid layer (W), for reporting
    3231       34034 :                                 state.dataHeatBal->SurfWinQRadSWwinAbsLayer(SurfNum, Lay) =
    3232       34034 :                                     state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) * Surface(SurfNum).Area;
    3233             : 
    3234             :                                 // Total solar absorbed in all glass layers (W), for reporting
    3235       34034 :                                 state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfNum) += state.dataHeatBal->SurfWinQRadSWwinAbsLayer(SurfNum, Lay);
    3236             :                             }
    3237       12243 :                             state.dataHeatBal->SurfWinQRadSWwinAbsTotEnergy(SurfNum) =
    3238       12243 :                                 state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfNum) * state.dataGlobal->TimeStepZoneSec;
    3239             : 
    3240        3304 :                         } else if (state.dataSurface->SurfWinWindowModelType(SurfNum) == WindowModel::EQL) {
    3241        2478 :                             state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfNum) = 0.0;
    3242             :                             // EQLNum = Construct(Surface(SurfNum)%Construction)%EQLConsPtr
    3243             :                             int TotSolidLay =
    3244        2478 :                                 state.dataWindowEquivLayer->CFS(state.dataConstruction->Construct(Surface(SurfNum).Construction).EQLConsPtr).NL;
    3245       11564 :                             for (int Lay = 1; Lay <= TotSolidLay; ++Lay) {
    3246             :                                 // Absorbed window components include:
    3247             :                                 // (1) beam solar radiation absorbed by all layers in the fenestration
    3248             :                                 // (2) sky and ground reflected duffuse solar radiation absorbed by all layers
    3249             :                                 // (3) diffuse short wave incident on the inside face of the fenestration.  The short wave internal sources
    3250             :                                 //     include light, ...
    3251        9086 :                                 AbsDiffWin(Lay) = state.dataConstruction->Construct(ConstrNum).AbsDiffFrontEQL(Lay);
    3252        9086 :                                 state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) =
    3253        9086 :                                     state.dataSurface->SurfWinA(SurfNum, Lay) * BeamSolar + AbsDiffWin(Lay) * (SkySolarInc + GndSolarInc);
    3254             : 
    3255             :                                 // Total solar absorbed in solid layer (W), for reporting
    3256        9086 :                                 state.dataHeatBal->SurfWinQRadSWwinAbsLayer(SurfNum, Lay) =
    3257        9086 :                                     state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) * Surface(SurfNum).Area;
    3258             : 
    3259             :                                 // Total solar absorbed in all glass layers (W), for reporting
    3260        9086 :                                 state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfNum) += state.dataHeatBal->SurfWinQRadSWwinAbsLayer(SurfNum, Lay);
    3261             :                             }
    3262             : 
    3263        2478 :                             state.dataHeatBal->SurfWinQRadSWwinAbsTotEnergy(SurfNum) =
    3264        2478 :                                 state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfNum) * state.dataGlobal->TimeStepZoneSec;
    3265         826 :                         } else if (state.dataWindowManager->inExtWindowModel->isExternalLibraryModel()) {
    3266         826 :                             int SurfNum2 = SurfNum;
    3267         826 :                             if (state.dataSurface->SurfWinOriginalClass(SurfNum) == SurfaceClass::TDD_Diffuser) {
    3268           0 :                                 SurfNum2 = state.dataDaylightingDevicesData->TDDPipe(state.dataSurface->SurfWinTDDPipeNum(SurfNum)).Dome;
    3269             :                             }
    3270             : 
    3271         826 :                             std::pair<Real64, Real64> incomingAngle = getSunWCEAngles(state, SurfNum2, BSDFDirection::Incoming);
    3272         826 :                             Real64 Theta = incomingAngle.first;
    3273         826 :                             Real64 Phi = incomingAngle.second;
    3274             : 
    3275             :                             std::shared_ptr<CMultiLayerScattered> aLayer =
    3276        1652 :                                 CWindowConstructionsSimplified::instance().getEquivalentLayer(state, WavelengthRange::Solar, ConstrNum);
    3277             : 
    3278         826 :                             size_t totLayers = aLayer->getNumOfLayers();
    3279        1652 :                             for (size_t Lay = 1; Lay <= totLayers; ++Lay) {
    3280         826 :                                 Real64 AbWinDiff = aLayer->getAbsorptanceLayer(Lay, Side::Front, ScatteringSimple::Diffuse, Theta, Phi);
    3281             : 
    3282         826 :                                 state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) =
    3283         826 :                                     AbWinDiff * (SkySolarInc + GndSolarInc) + state.dataSurface->SurfWinA(SurfNum, Lay) * BeamSolar;
    3284             : 
    3285             :                                 // Total solar absorbed in solid layer (W), for reporting
    3286         826 :                                 state.dataHeatBal->SurfWinQRadSWwinAbsLayer(SurfNum, Lay) =
    3287         826 :                                     state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) * Surface(SurfNum).Area;
    3288             : 
    3289             :                                 // Total solar absorbed in all glass layers (W), for reporting
    3290         826 :                                 state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfNum) += state.dataHeatBal->SurfWinQRadSWwinAbsLayer(SurfNum, Lay);
    3291             :                             }
    3292             :                         }
    3293             : 
    3294             :                         // Solar absorbed by window frame and dividers
    3295     7117249 :                         int FrDivNum = Surface(SurfNum).FrameDivider; // Frame/divider number
    3296     7117249 :                         if (FrDivNum > 0) {
    3297      375572 :                             Real64 FrArea = state.dataSurface->SurfWinFrameArea(SurfNum);                    // Frame, divider area (m2)
    3298      375572 :                             Real64 FrProjOut = state.dataSurface->FrameDivider(FrDivNum).FrameProjectionOut; // Frame, divider outside projection (m)
    3299      375572 :                             Real64 FrProjIn = state.dataSurface->FrameDivider(FrDivNum).FrameProjectionIn;
    3300      375572 :                             Real64 DivArea = state.dataSurface->SurfWinDividerArea(SurfNum);
    3301      375572 :                             Real64 DivWidth = state.dataSurface->FrameDivider(FrDivNum).DividerWidth;
    3302      375572 :                             Real64 DivProjOut = state.dataSurface->FrameDivider(FrDivNum).DividerProjectionOut;
    3303      375572 :                             Real64 DivProjIn = state.dataSurface->FrameDivider(FrDivNum).DividerProjectionIn;
    3304      375572 :                             Real64 CosIncAngHorProj = 0.0;  // Cosine of incidence angle of sun on horizontal faces of a frame or divider projection
    3305      375572 :                             Real64 CosIncAngVertProj = 0.0; // Cosine of incidence angle of sun on vertical faces of a frame or divider projection
    3306      375572 :                             Real64 FracSunLit = 0.0;        // Fraction of window sunlit this time step
    3307             :                             Real64 BeamFaceInc;             // Beam solar incident window plane this time step (W/m2)
    3308             :                             Real64 DifSolarFaceInc;         // Diffuse solar incident on window plane this time step (W/m2)
    3309      375572 :                             Real64 SurfIncSolarMultiplier = state.dataSurface->Surface(SurfNum).IncSolMultiplier;
    3310      375572 :                             Real64 currBeamSolarRad = state.dataEnvrn->BeamSolarRad * SurfIncSolarMultiplier;
    3311      375572 :                             if (FrArea > 0.0 || DivArea > 0.0) {
    3312      205972 :                                 FracSunLit = state.dataHeatBal->SurfSunlitFrac(state.dataGlobal->HourOfDay, state.dataGlobal->TimeStep, SurfNum);
    3313      205972 :                                 BeamFaceInc = currBeamSolarRad *
    3314      205972 :                                               state.dataHeatBal->SurfSunlitFrac(state.dataGlobal->HourOfDay, state.dataGlobal->TimeStep, SurfNum) *
    3315             :                                               CosInc;
    3316      205972 :                                 DifSolarFaceInc = SkySolarInc + GndSolarInc;
    3317             :                             }
    3318      375572 :                             if (FracSunLit > 0.0) {
    3319      166207 :                                 if ((FrArea > 0.0 && (FrProjOut > 0.0 || FrProjIn > 0.0)) ||
    3320        2591 :                                     (DivArea > 0.0 && (DivProjOut > 0.0 || DivProjIn > 0.0))) {
    3321             :                                     // Dot products used to calculate beam solar incident on faces of
    3322             :                                     // frame and divider perpendicular to the glass surface.
    3323             :                                     // Note that SOLCOS is the current timestep's solar direction cosines.
    3324             :                                     //                  PhiWin = ASIN(WALCOS(3,SurfNum))
    3325             :                                     Real64 PhiWin =
    3326      154922 :                                         std::asin(Surface(SurfNum).OutNormVec(3)); // Altitude and azimuth angle of outward window normal (radians)
    3327      154922 :                                     Real64 ThWin = std::atan2(Surface(SurfNum).OutNormVec(2), Surface(SurfNum).OutNormVec(1));
    3328      154922 :                                     Real64 PhiSun = std::asin(state.dataEnvrn->SOLCOS(3)); // Altitude and azimuth angle of sun (radians)
    3329      154922 :                                     Real64 ThSun = std::atan2(state.dataEnvrn->SOLCOS(2), state.dataEnvrn->SOLCOS(1));
    3330      154922 :                                     Real64 const cos_PhiWin(std::cos(PhiWin));
    3331      154922 :                                     Real64 const cos_PhiSun(std::cos(PhiSun));
    3332      154922 :                                     CosIncAngHorProj =
    3333      154922 :                                         std::abs(std::sin(PhiWin) * cos_PhiSun * std::cos(ThWin - ThSun) - cos_PhiWin * std::sin(PhiSun));
    3334      154922 :                                     CosIncAngVertProj = std::abs(cos_PhiWin * cos_PhiSun * std::sin(ThWin - ThSun));
    3335             :                                 }
    3336             :                             }
    3337             :                             // Frame solar
    3338             :                             // (A window shade or blind, if present, is assumed to not shade the frame, so no special
    3339             :                             // treatment of frame solar needed if window has an exterior shade or blind.)
    3340      375572 :                             if (FrArea > 0.0) {
    3341      205972 :                                 Real64 FrIncSolarOut = BeamFaceInc; // Total solar incident on outside offrame including solar
    3342      205972 :                                 Real64 FrIncSolarIn = 0.0; // Total solar incident on inside offrame including solar on frame projection (W/m2)
    3343      205972 :                                 Real64 TransDiffGl = 0.0;  // Diffuse solar transmittance
    3344      205972 :                                 if (FrProjOut > 0.0 || FrProjIn > 0.0) {
    3345             :                                     Real64 BeamFrHorFaceInc =
    3346      371116 :                                         currBeamSolarRad * CosIncAngHorProj *
    3347      371116 :                                         (Surface(SurfNum).Width - state.dataSurface->FrameDivider(FrDivNum).VertDividers * DivWidth) * FracSunLit /
    3348      185558 :                                         FrArea;
    3349             :                                     Real64 BeamFrVertFaceInc =
    3350      371116 :                                         currBeamSolarRad * CosIncAngVertProj *
    3351      371116 :                                         (Surface(SurfNum).Height - state.dataSurface->FrameDivider(FrDivNum).HorDividers * DivWidth) * FracSunLit /
    3352      185558 :                                         FrArea;
    3353             :                                     // Beam solar on outside of frame
    3354      185558 :                                     FrIncSolarOut += (BeamFrHorFaceInc + BeamFrVertFaceInc) * FrProjOut;
    3355      185558 :                                     if (FrProjIn > 0.0) {
    3356      185558 :                                         Real64 TransGl = POLYF(CosInc, state.dataConstruction->Construct(ConstrNum).TransSolBeamCoef);
    3357      185558 :                                         TransDiffGl = state.dataConstruction->Construct(ConstrNum).TransDiff;
    3358      185558 :                                         if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing
    3359       70512 :                                             Real64 SwitchFac = state.dataSurface->SurfWinSwitchingFactor(SurfNum);
    3360       70512 :                                             int ConstrNumSh = Surface(SurfNum).activeShadedConstruction;
    3361       70512 :                                             Real64 TransGlSh = POLYF(CosInc, state.dataConstruction->Construct(ConstrNumSh).TransSolBeamCoef);
    3362       70512 :                                             TransGl = InterpSw(SwitchFac, TransGl, TransGlSh);
    3363       70512 :                                             Real64 TransDiffGlSh = state.dataConstruction->Construct(ConstrNumSh).TransDiff;
    3364       70512 :                                             TransDiffGl = InterpSw(SwitchFac, TransDiffGl, TransDiffGlSh);
    3365             :                                         }
    3366             :                                         // Beam solar on inside of frame
    3367      185558 :                                         FrIncSolarIn = (BeamFrHorFaceInc + BeamFrVertFaceInc) * FrProjIn * TransGl;
    3368             :                                     }
    3369             :                                 }
    3370             :                                 // Beam plus diffuse solar on outside of frame
    3371      205972 :                                 FrIncSolarOut += DifSolarFaceInc * (1.0 + 0.5 * state.dataSurface->SurfWinProjCorrFrOut(SurfNum));
    3372      205972 :                                 state.dataSurface->SurfWinFrameQRadOutAbs(SurfNum) =
    3373      205972 :                                     FrIncSolarOut * state.dataSurface->SurfWinFrameSolAbsorp(SurfNum);
    3374             :                                 // Add diffuse from beam reflected from window outside reveal surfaces
    3375      411944 :                                 state.dataSurface->SurfWinFrameQRadOutAbs(SurfNum) += currBeamSolarRad *
    3376      411944 :                                                                                       state.dataSurface->SurfWinOutsRevealDiffOntoFrame(SurfNum) *
    3377      205972 :                                                                                       state.dataSurface->SurfWinFrameSolAbsorp(SurfNum);
    3378             : 
    3379             :                                 // Beam plus diffuse solar on inside of frame
    3380      205972 :                                 FrIncSolarIn += DifSolarFaceInc * TransDiffGl * 0.5 * state.dataSurface->SurfWinProjCorrFrIn(SurfNum);
    3381      205972 :                                 state.dataSurface->SurfWinFrameQRadInAbs(SurfNum) = FrIncSolarIn * state.dataSurface->SurfWinFrameSolAbsorp(SurfNum);
    3382             :                                 // Add diffuse from beam reflected from window inside reveal surfaces
    3383      411944 :                                 state.dataSurface->SurfWinFrameQRadInAbs(SurfNum) += currBeamSolarRad *
    3384      411944 :                                                                                      state.dataSurface->SurfWinInsRevealDiffOntoFrame(SurfNum) *
    3385      205972 :                                                                                      state.dataSurface->SurfWinFrameSolAbsorp(SurfNum);
    3386             :                             }
    3387             : 
    3388             :                             // Divider solar
    3389             :                             // (An exterior shade or blind, when in place, is assumed to completely cover the divider.
    3390             :                             // Dividers are not allowed on windows with between-glass shade/blind so DivProjOut and
    3391             :                             // DivProjIn will be zero in this case.)
    3392      375572 :                             if (DivArea > 0.0) {                                                         // Solar absorbed by window divider
    3393      105466 :                                 Real64 DividerAbs = state.dataSurface->SurfWinDividerSolAbsorp(SurfNum); // Window divider solar absorptance
    3394      105466 :                                 if (state.dataSurface->SurfWinDividerType(SurfNum) == DataSurfaces::FrameDividerType::Suspended) {
    3395             :                                     // Suspended (between-glass) divider; account for effect glass on outside of divider
    3396             :                                     // (note that outside and inside projection for this type of divider are both zero)
    3397        8004 :                                     int MatNumGl = state.dataConstruction->Construct(ConstrNum).LayerPoint(1); // Outer glass layer material number
    3398             :                                     Real64 TransGl =
    3399        8004 :                                         state.dataMaterial->Material(MatNumGl).Trans; // Outer glass layer material number, switched construction
    3400        8004 :                                     Real64 ReflGl = state.dataMaterial->Material(MatNumGl).ReflectSolBeamFront;
    3401        8004 :                                     Real64 AbsGl = 1.0 - TransGl - ReflGl;
    3402        8004 :                                     Real64 SwitchFac = state.dataSurface->SurfWinSwitchingFactor(SurfNum);
    3403        8004 :                                     int ConstrNumSh = Surface(SurfNum).activeShadedConstruction;
    3404        8004 :                                     if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing
    3405           0 :                                         Real64 MatNumGlSh = state.dataConstruction->Construct(ConstrNumSh).LayerPoint(1);
    3406           0 :                                         Real64 TransGlSh = state.dataMaterial->Material(MatNumGlSh).Trans;
    3407           0 :                                         Real64 ReflGlSh = state.dataMaterial->Material(MatNumGlSh).ReflectSolBeamFront;
    3408           0 :                                         Real64 AbsGlSh = 1.0 - TransGlSh - ReflGlSh;
    3409           0 :                                         TransGl = InterpSw(SwitchFac, TransGl, TransGlSh);
    3410           0 :                                         ReflGl = InterpSw(SwitchFac, ReflGl, ReflGlSh);
    3411           0 :                                         AbsGl = InterpSw(SwitchFac, AbsGl, AbsGlSh);
    3412             :                                     }
    3413        8004 :                                     Real64 DividerRefl = 1.0 - DividerAbs; // Window divider solar reflectance
    3414        8004 :                                     DividerAbs = AbsGl + TransGl * (DividerAbs + DividerRefl * AbsGl) / (1.0 - DividerRefl * ReflGl);
    3415             :                                 }
    3416             : 
    3417      105466 :                                 Real64 BeamDivHorFaceInc = 0.0;  // Beam solar on divider's horizontal outside projection faces (W/m2)
    3418      105466 :                                 Real64 BeamDivVertFaceInc = 0.0; // Beam solar on divider's vertical outside projection faces (W/m2)
    3419             :                                 // Beam incident on horizontal and vertical projection faces of divider if no exterior shading
    3420      105466 :                                 if (DivProjOut > 0.0 && !ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) {
    3421      190440 :                                     BeamDivHorFaceInc = currBeamSolarRad * CosIncAngHorProj * state.dataSurface->FrameDivider(FrDivNum).HorDividers *
    3422       95220 :                                                         DivProjOut *
    3423      190440 :                                                         (Surface(SurfNum).Width - state.dataSurface->FrameDivider(FrDivNum).VertDividers * DivWidth) *
    3424             :                                                         FracSunLit / DivArea;
    3425       95220 :                                     BeamDivVertFaceInc =
    3426      190440 :                                         currBeamSolarRad * CosIncAngVertProj * state.dataSurface->FrameDivider(FrDivNum).VertDividers * DivProjOut *
    3427      190440 :                                         (Surface(SurfNum).Height - state.dataSurface->FrameDivider(FrDivNum).HorDividers * DivWidth) * FracSunLit /
    3428             :                                         DivArea;
    3429             :                                 }
    3430      105466 :                                 Real64 DivIncSolarOutBm =
    3431             :                                     0.0; // Diffuse solar incident on outside of divider including beam on divider projection (W/m2)
    3432      105466 :                                 Real64 DivIncSolarOutDif =
    3433             :                                     0.0; // Diffuse solar incident on outside of divider including diffuse on divider projection (W/m2)
    3434      105466 :                                 Real64 DivIncSolarInBm =
    3435             :                                     0.0; // Diffuse solar incident on inside of divider including beam on divider projection (W/m2)
    3436      105466 :                                 Real64 DivIncSolarInDif =
    3437             :                                     0.0; // Diffuse solar incident on inside of divider including diffuse on divider projection (W/m2)
    3438      210134 :                                 if (!ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag) &&
    3439      104668 :                                     !ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag)) { // No exterior or between-glass shading
    3440      104668 :                                     DivIncSolarOutBm = BeamFaceInc + BeamDivHorFaceInc + BeamDivVertFaceInc;
    3441      104668 :                                     DivIncSolarOutDif = DifSolarFaceInc * (1.0 + state.dataSurface->SurfWinProjCorrDivOut(SurfNum));
    3442      104668 :                                     if (DivProjIn > 0.0) {
    3443       95220 :                                         Real64 TransGl = POLYF(CosInc, state.dataConstruction->Construct(ConstrNum).TransSolBeamCoef);
    3444       95220 :                                         Real64 TransDiffGl = state.dataConstruction->Construct(ConstrNum).TransDiff; // Diffuse solar transmittance
    3445       95220 :                                         if (ShadeFlag == WinShadingType::SwitchableGlazing) {                        // Switchable glazing
    3446       70512 :                                             Real64 SwitchFac = state.dataSurface->SurfWinSwitchingFactor(SurfNum);
    3447       70512 :                                             int ConstrNumSh = Surface(SurfNum).activeShadedConstruction;
    3448       70512 :                                             Real64 TransGlSh = POLYF(CosInc, state.dataConstruction->Construct(ConstrNumSh).TransSolBeamCoef);
    3449             :                                             // Outer glass solar trans, refl, absorptance if switched
    3450       70512 :                                             TransGl = InterpSw(SwitchFac, TransGl, TransGlSh);
    3451       70512 :                                             Real64 TransDiffGlSh = state.dataConstruction->Construct(ConstrNumSh).TransDiff;
    3452             :                                             // Diffuse solar transmittance, switched construction
    3453       70512 :                                             TransDiffGl = InterpSw(SwitchFac, TransDiffGl, TransDiffGlSh);
    3454             :                                         }
    3455             :                                         // Beam plus diffuse solar on inside of divider
    3456             :                                         // BeamDivHorFaceIncIn - Beam solar on divider's horizontal inside projection faces (W/m2)
    3457             :                                         // BeamDivVertFaceIncIn - Beam solar on divider's vertical inside projection faces (W/m2)
    3458             :                                         Real64 BeamDivHorFaceIncIn =
    3459      190440 :                                             currBeamSolarRad * CosIncAngHorProj * state.dataSurface->FrameDivider(FrDivNum).HorDividers * DivProjIn *
    3460      190440 :                                             (Surface(SurfNum).Width - state.dataSurface->FrameDivider(FrDivNum).VertDividers * DivWidth) *
    3461       95220 :                                             FracSunLit / DivArea;
    3462             :                                         Real64 BeamDivVertFaceIncIn =
    3463       95220 :                                             currBeamSolarRad * CosIncAngVertProj * state.dataSurface->FrameDivider(FrDivNum).VertDividers *
    3464       95220 :                                             DivProjIn * (Surface(SurfNum).Height - state.dataSurface->FrameDivider(FrDivNum).HorDividers * DivWidth) *
    3465       95220 :                                             FracSunLit / DivArea;
    3466       95220 :                                         DivIncSolarInBm = TransGl * (BeamDivHorFaceIncIn + BeamDivVertFaceIncIn);
    3467       95220 :                                         DivIncSolarInDif = TransDiffGl * DifSolarFaceInc * state.dataSurface->SurfWinProjCorrDivIn(SurfNum);
    3468             :                                     }
    3469             :                                 } else { // Exterior shade, screen or blind present
    3470             : 
    3471         798 :                                     DivIncSolarOutBm = BeamFaceInc * (1.0 + state.dataSurface->SurfWinProjCorrDivOut(SurfNum));
    3472         798 :                                     DivIncSolarOutDif = DifSolarFaceInc * (1.0 + state.dataSurface->SurfWinProjCorrDivOut(SurfNum));
    3473        1596 :                                     DivIncSolarInBm = BeamFaceInc * state.dataSurface->SurfWinProjCorrDivIn(SurfNum) *
    3474         798 :                                                       state.dataConstruction->Construct(ConstrNum).TransDiff;
    3475        1596 :                                     DivIncSolarInDif = DifSolarFaceInc * state.dataSurface->SurfWinProjCorrDivIn(SurfNum) *
    3476         798 :                                                        state.dataConstruction->Construct(ConstrNum).TransDiff;
    3477             :                                 }
    3478      105466 :                                 if (!ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag) && !ANY_BETWEENGLASS_SHADE_BLIND(ShadeFlag)) {
    3479             :                                     // No exterior or between-glass shade, screen or blind
    3480      104668 :                                     state.dataSurface->SurfWinDividerQRadOutAbs(SurfNum) = DividerAbs * (DivIncSolarOutBm + DivIncSolarOutDif);
    3481      104668 :                                     state.dataSurface->SurfWinDividerQRadInAbs(SurfNum) = DividerAbs * (DivIncSolarInBm + DivIncSolarInDif);
    3482             :                                     // Exterior shade, screen or blind
    3483         798 :                                 } else if (ShadeFlag == WinShadingType::ExtBlind) { // Exterior blind
    3484           0 :                                     int BlNum = state.dataSurface->SurfWinBlindNumber(SurfNum);
    3485           0 :                                     int SlatsAngIndexLower = state.dataSurface->SurfWinSlatsAngIndex(SurfNum);
    3486           0 :                                     int SlatsAngIndexUpper = std::min(MaxProfAngs, SlatsAngIndexLower + 1);
    3487           0 :                                     Real64 SlatsAngInterpFac = state.dataSurface->SurfWinSlatsAngInterpFac(SurfNum);
    3488             : 
    3489             :                                     Real64 FrontDiffTrans;
    3490             :                                     Real64 TBlBmDif; // Blind diffuse-diffuse solar transmittance
    3491           0 :                                     if (state.dataSurface->SurfWinMovableSlats(SurfNum)) {
    3492           0 :                                         FrontDiffTrans =
    3493           0 :                                             General::InterpGeneral(state.dataHeatBal->Blind(BlNum).SolFrontDiffDiffTrans(SlatsAngIndexLower),
    3494           0 :                                                                    state.dataHeatBal->Blind(BlNum).SolFrontDiffDiffTrans(SlatsAngIndexUpper),
    3495             :                                                                    SlatsAngInterpFac);
    3496           0 :                                         TBlBmDif = General::InterpProfSlat(
    3497           0 :                                             state.dataHeatBal->Blind(BlNum).SolFrontBeamDiffTrans(SlatsAngIndexLower,
    3498           0 :                                                                                                   state.dataSurface->SurfWinProfAngIndex(SurfNum)),
    3499           0 :                                             state.dataHeatBal->Blind(BlNum).SolFrontBeamDiffTrans(SlatsAngIndexUpper,
    3500           0 :                                                                                                   state.dataSurface->SurfWinProfAngIndex(SurfNum)),
    3501           0 :                                             state.dataHeatBal->Blind(BlNum).SolFrontBeamDiffTrans(
    3502           0 :                                                 SlatsAngIndexLower, std::min(MaxProfAngs, state.dataSurface->SurfWinProfAngIndex(SurfNum) + 1)),
    3503           0 :                                             state.dataHeatBal->Blind(BlNum).SolFrontBeamDiffTrans(
    3504           0 :                                                 SlatsAngIndexUpper, std::min(MaxProfAngs, state.dataSurface->SurfWinProfAngIndex(SurfNum) + 1)),
    3505             :                                             SlatsAngInterpFac,
    3506           0 :                                             state.dataSurface->SurfWinProfAngInterpFac(SurfNum));
    3507             :                                     } else {
    3508           0 :                                         FrontDiffTrans = state.dataHeatBal->Blind(BlNum).SolFrontDiffDiffTrans(1);
    3509           0 :                                         TBlBmDif = General::InterpGeneral(
    3510           0 :                                             state.dataHeatBal->Blind(BlNum).SolFrontBeamDiffTrans(1, state.dataSurface->SurfWinProfAngIndex(SurfNum)),
    3511           0 :                                             state.dataHeatBal->Blind(BlNum).SolFrontBeamDiffTrans(
    3512           0 :                                                 1, std::min(MaxProfAngs, state.dataSurface->SurfWinProfAngIndex(SurfNum) + 1)),
    3513             :                                             SlatsAngInterpFac);
    3514             :                                     }
    3515             : 
    3516             :                                     // TBlBmBm - Blind beam-beam solar transmittance
    3517           0 :                                     Real64 TBlBmBm = state.dataSurface->SurfWinBlindBmBmTrans(SurfNum);
    3518           0 :                                     state.dataSurface->SurfWinDividerQRadOutAbs(SurfNum) =
    3519           0 :                                         DividerAbs * (DivIncSolarOutBm * (TBlBmBm + TBlBmDif) + DivIncSolarOutDif * FrontDiffTrans);
    3520           0 :                                     state.dataSurface->SurfWinDividerQRadInAbs(SurfNum) =
    3521           0 :                                         DividerAbs * (DivIncSolarInBm * (TBlBmBm + TBlBmDif) + DivIncSolarInDif * FrontDiffTrans);
    3522             : 
    3523         798 :                                 } else if (ShadeFlag == WinShadingType::ExtShade) { // Exterior shade
    3524         798 :                                     int ConstrNumSh = Surface(SurfNum).activeShadedConstruction;
    3525         798 :                                     state.dataSurface->SurfWinDividerQRadOutAbs(SurfNum) =
    3526         798 :                                         DividerAbs *
    3527        1596 :                                         state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNumSh).LayerPoint(1)).Trans *
    3528         798 :                                         (DivIncSolarOutBm + DivIncSolarOutDif);
    3529         798 :                                     state.dataSurface->SurfWinDividerQRadInAbs(SurfNum) =
    3530         798 :                                         DividerAbs *
    3531        1596 :                                         state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNumSh).LayerPoint(1)).Trans *
    3532         798 :                                         (DivIncSolarInBm + DivIncSolarInDif);
    3533             : 
    3534           0 :                                 } else if (ShadeFlag == WinShadingType::ExtScreen) { // Exterior screen
    3535           0 :                                     state.dataSurface->SurfWinDividerQRadOutAbs(SurfNum) =
    3536           0 :                                         DividerAbs *
    3537           0 :                                         (state.dataHeatBal->SurfaceScreens(state.dataSurface->SurfWinScreenNumber(SurfNum)).BmBmTrans +
    3538           0 :                                          state.dataHeatBal->SurfaceScreens(state.dataSurface->SurfWinScreenNumber(SurfNum)).BmDifTrans) *
    3539           0 :                                         (DivIncSolarOutBm + DivIncSolarOutDif);
    3540           0 :                                     state.dataSurface->SurfWinDividerQRadInAbs(SurfNum) =
    3541           0 :                                         DividerAbs *
    3542           0 :                                         (state.dataHeatBal->SurfaceScreens(state.dataSurface->SurfWinScreenNumber(SurfNum)).BmBmTrans +
    3543           0 :                                          state.dataHeatBal->SurfaceScreens(state.dataSurface->SurfWinScreenNumber(SurfNum)).BmDifTrans) *
    3544           0 :                                         (DivIncSolarInBm + DivIncSolarInDif);
    3545             :                                 }
    3546             :                             }
    3547             :                         }
    3548             :                     } // Surface(SurfNum)%ExtSolar
    3549             :                 }     // end of surface window loop
    3550             :             }         // end of space loop
    3551             :         }             // end of zone loop
    3552      823335 :         for (int PipeNum = 1; PipeNum <= (int)state.dataDaylightingDevicesData->TDDPipe.size(); ++PipeNum) {
    3553        1232 :             int const SurfNum = state.dataDaylightingDevicesData->TDDPipe(PipeNum).Dome; // TDD: DOME object number
    3554        1232 :             int const ConstrNum = Surface(SurfNum).Construction;
    3555        1232 :             int const TotGlassLay = state.dataConstruction->Construct(ConstrNum).TotGlassLayers; // Number of glass layers
    3556        1232 :             state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfNum) = 0.0;
    3557        2464 :             for (int Lay = 1; Lay <= TotGlassLay; ++Lay) {
    3558        1232 :                 AbsDiffWin(Lay) = state.dataConstruction->Construct(ConstrNum).AbsDiff(Lay);
    3559        1232 :                 state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) =
    3560        2464 :                     AbsDiffWin(Lay) * (state.dataSurface->SurfSkySolarInc(SurfNum) + state.dataSurface->SurfGndSolarInc(SurfNum)) +
    3561        1232 :                     state.dataSurface->SurfWinA(SurfNum, Lay) * currBeamSolar(SurfNum);
    3562        1232 :                 state.dataHeatBal->SurfWinQRadSWwinAbsLayer(SurfNum, Lay) =
    3563        1232 :                     state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) * Surface(SurfNum).Area;
    3564        1232 :                 state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfNum) += state.dataHeatBal->SurfWinQRadSWwinAbsLayer(SurfNum, Lay);
    3565        1232 :                 state.dataHeatBal->SurfWinQRadSWwinAbsTotEnergy(SurfNum) =
    3566        1232 :                     state.dataHeatBal->SurfWinQRadSWwinAbsTot(SurfNum) * state.dataGlobal->TimeStepZoneSec;
    3567             :             }
    3568             :         }
    3569             : 
    3570             :         // Average absorbed solar for representative surfaces
    3571      822103 :         if (state.dataSurface->UseRepresentativeSurfaceCalculations) {
    3572        9212 :             for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    3573       18032 :                 for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    3574        9016 :                     auto &thisSpace = state.dataHeatBal->space(spaceNum);
    3575        9016 :                     int firstSurf = thisSpace.OpaqOrIntMassSurfaceFirst;
    3576        9016 :                     int lastSurf = thisSpace.OpaqOrIntMassSurfaceLast;
    3577       87612 :                     for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    3578       78596 :                         auto &surface(state.dataSurface->Surface(surfNum));
    3579       78596 :                         if (surface.ConstituentSurfaceNums.size() > 1) {
    3580        2940 :                             Real64 QoutAtot = 0.0;
    3581        2940 :                             Real64 QinAtot = 0.0;
    3582        2940 :                             Real64 Atot = 0.0;
    3583        9212 :                             for (auto constSurfNum : surface.ConstituentSurfaceNums) {
    3584        6272 :                                 QoutAtot += state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(constSurfNum) * state.dataSurface->Surface(constSurfNum).Area;
    3585        6272 :                                 QinAtot += state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(constSurfNum) * state.dataSurface->Surface(constSurfNum).Area;
    3586        6272 :                                 Atot += state.dataSurface->Surface(constSurfNum).Area;
    3587             :                             }
    3588             : 
    3589        2940 :                             state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(surfNum) = QoutAtot / Atot;
    3590        2940 :                             state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(surfNum) = QinAtot / Atot;
    3591             :                         }
    3592             :                     }
    3593        9016 :                     firstSurf = thisSpace.WindowSurfaceFirst;
    3594        9016 :                     lastSurf = thisSpace.WindowSurfaceLast;
    3595       43904 :                     for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    3596       34888 :                         auto &surface(state.dataSurface->Surface(surfNum));
    3597       34888 :                         if (surface.ExtSolar && surface.ConstituentSurfaceNums.size() > 1) {
    3598        3724 :                             auto &surface(state.dataSurface->Surface(surfNum));
    3599             : 
    3600             :                             // Absorbed in glazing
    3601             :                             int totalGlassLayers =
    3602        3724 :                                 state.dataConstruction->Construct(state.dataSurface->SurfActiveConstruction(surfNum)).TotGlassLayers;
    3603       11172 :                             for (int layer = 1; layer <= totalGlassLayers; ++layer) {
    3604        7448 :                                 Real64 QAtot = 0.0;
    3605        7448 :                                 Real64 Atot = 0.0;
    3606       59584 :                                 for (auto constSurfNum : surface.ConstituentSurfaceNums) {
    3607       52136 :                                     QAtot +=
    3608       52136 :                                         state.dataHeatBal->SurfWinQRadSWwinAbs(constSurfNum, layer) * state.dataSurface->Surface(constSurfNum).Area;
    3609       52136 :                                     Atot += state.dataSurface->Surface(constSurfNum).Area;
    3610             :                                 }
    3611             : 
    3612        7448 :                                 state.dataHeatBal->SurfWinQRadSWwinAbs(surfNum, layer) = QAtot / Atot;
    3613             :                             }
    3614             : 
    3615             :                             // Absorbed by frame and dividers
    3616        3724 :                             if (surface.FrameDivider > 0) {
    3617         392 :                                 if (state.dataSurface->SurfWinFrameArea(surfNum) > 0.0) {
    3618           0 :                                     Real64 QoutAtot = 0.0;
    3619           0 :                                     Real64 QinAtot = 0.0;
    3620           0 :                                     Real64 Atot = 0.0;
    3621           0 :                                     for (auto constSurfNum : surface.ConstituentSurfaceNums) {
    3622           0 :                                         QoutAtot += state.dataSurface->SurfWinFrameQRadOutAbs(constSurfNum) *
    3623           0 :                                                     state.dataSurface->SurfWinFrameArea(constSurfNum);
    3624           0 :                                         QinAtot += state.dataSurface->SurfWinFrameQRadInAbs(constSurfNum) *
    3625           0 :                                                    state.dataSurface->SurfWinFrameArea(constSurfNum);
    3626           0 :                                         Atot += state.dataSurface->SurfWinFrameArea(constSurfNum);
    3627             :                                     }
    3628             : 
    3629           0 :                                     state.dataSurface->SurfWinFrameQRadOutAbs(surfNum) = QoutAtot / Atot;
    3630           0 :                                     state.dataSurface->SurfWinFrameQRadInAbs(surfNum) = QinAtot / Atot;
    3631             :                                 }
    3632         392 :                                 if (state.dataSurface->SurfWinDividerArea(surfNum) > 0.0) {
    3633           0 :                                     Real64 QoutAtot = 0.0;
    3634           0 :                                     Real64 QinAtot = 0.0;
    3635           0 :                                     Real64 Atot = 0.0;
    3636           0 :                                     for (auto constSurfNum : surface.ConstituentSurfaceNums) {
    3637           0 :                                         QoutAtot += state.dataSurface->SurfWinDividerQRadOutAbs(constSurfNum) *
    3638           0 :                                                     state.dataSurface->SurfWinDividerArea(constSurfNum);
    3639           0 :                                         QinAtot += state.dataSurface->SurfWinDividerQRadInAbs(constSurfNum) *
    3640           0 :                                                    state.dataSurface->SurfWinDividerArea(constSurfNum);
    3641           0 :                                         Atot += state.dataSurface->SurfWinDividerArea(constSurfNum);
    3642             :                                     }
    3643             : 
    3644           0 :                                     state.dataSurface->SurfWinDividerQRadOutAbs(surfNum) = QoutAtot / Atot;
    3645           0 :                                     state.dataSurface->SurfWinDividerQRadInAbs(surfNum) = QinAtot / Atot;
    3646             :                                 }
    3647             :                             }
    3648             :                         }
    3649             :                     }
    3650             :                 }
    3651             :             }
    3652             :         }
    3653             :     } // End of sun-up check
    3654     2568509 : }
    3655             : 
    3656     2568509 : void InitIntSolarDistribution(EnergyPlusData &state)
    3657             : {
    3658             : 
    3659             :     // SUBROUTINE INFORMATION:
    3660             :     //       AUTHOR         Anonymous
    3661             :     //       DATE WRITTEN   July 1977
    3662             :     //       MODIFIED       Oct 1999 (FW) to handle movable shades
    3663             :     //                      May 2000 (FW) to handle window frame and dividers
    3664             :     //                      May 2001 (FW) to handle window blinds
    3665             :     //                      Jan 2002 (FW) mods for between-glass shade/blind
    3666             :     //                      May 2006 (RR) to handle exterior window screens
    3667             :     //       RE-ENGINEERED  Mar98 (RKS)
    3668             : 
    3669             :     // PURPOSE OF THIS SUBROUTINE:
    3670             :     // This subroutine initializes the arrays associated with solar heat
    3671             :     // gains for both individual surfaces and for zones.
    3672             : 
    3673             :     // METHODOLOGY EMPLOYED:
    3674             :     // If the sun is down, all of the pertinent arrays are zeroed.  If the
    3675             :     // sun is up, various calculations are made.
    3676             : 
    3677             :     // REFERENCES:
    3678             :     // (I)BLAST legacy routine QSUN
    3679             : 
    3680             :     using DaylightingDevices::DistributeTDDAbsorbedSolar;
    3681             :     using General::InterpSw;
    3682             :     using namespace DataWindowEquivalentLayer;
    3683             : 
    3684     2568509 :     auto &Surface(state.dataSurface->Surface);
    3685             : 
    3686             :     // COMPUTE TOTAL SHORT-WAVE RADIATION ORIGINATING IN ZONE.
    3687             :     // Note: If sun is not up, QS is only internal gains
    3688    21002924 :     for (int enclosureNum = 1; enclosureNum <= state.dataViewFactor->NumOfSolarEnclosures; ++enclosureNum) {
    3689    18434415 :         Real64 sumSpaceQLTSW = 0.0;
    3690    36897156 :         for (int spaceNum : state.dataViewFactor->EnclSolInfo(enclosureNum).spaceNums) {
    3691    18462741 :             sumSpaceQLTSW += state.dataHeatBal->spaceIntGain(spaceNum).QLTSW;
    3692             :         }
    3693    18434415 :         state.dataHeatBal->EnclSolQSWRad(enclosureNum) = state.dataHeatBal->EnclSolQD(enclosureNum) + sumSpaceQLTSW;
    3694    18434415 :         state.dataHeatBal->EnclSolQSWRadLights(enclosureNum) = sumSpaceQLTSW;
    3695             :     }
    3696             : 
    3697     2568509 :     if (state.dataHeatBalSurf->InterZoneWindow) { // DO INTERZONE DISTRIBUTION.
    3698             : 
    3699       60735 :         for (int enclosureNum = 1; enclosureNum <= state.dataViewFactor->NumOfSolarEnclosures; ++enclosureNum) {
    3700             : 
    3701       48588 :             if (state.dataHeatBalSurf->EnclSolRecDifShortFromZ(enclosureNum)) {
    3702             : 
    3703      141120 :                 for (int OtherenclosureNum = 1; OtherenclosureNum <= state.dataViewFactor->NumOfSolarEnclosures; ++OtherenclosureNum) {
    3704             : 
    3705      112896 :                     if ((OtherenclosureNum != enclosureNum) && (state.dataHeatBalSurf->EnclSolRecDifShortFromZ(OtherenclosureNum))) {
    3706       44352 :                         Real64 sumSpaceQLTSW = 0.0;
    3707       88704 :                         for (int spaceNum : state.dataViewFactor->EnclSolInfo(OtherenclosureNum).spaceNums) {
    3708       44352 :                             sumSpaceQLTSW += state.dataHeatBal->spaceIntGain(spaceNum).QLTSW;
    3709             :                         }
    3710       44352 :                         state.dataHeatBal->EnclSolQSWRad(enclosureNum) +=
    3711       88704 :                             state.dataHeatBalSurf->ZoneFractDifShortZtoZ(enclosureNum, OtherenclosureNum) *
    3712       44352 :                             (state.dataHeatBal->EnclSolQD(OtherenclosureNum) + sumSpaceQLTSW);
    3713       44352 :                         state.dataHeatBal->ZoneDifSolFrIntWinsRep(enclosureNum) +=
    3714       88704 :                             state.dataHeatBalSurf->ZoneFractDifShortZtoZ(enclosureNum, OtherenclosureNum) *
    3715       44352 :                             state.dataHeatBal->EnclSolQD(OtherenclosureNum);
    3716       44352 :                         state.dataHeatBal->ZoneDifSolFrIntWinsRepEnergy(enclosureNum) =
    3717       44352 :                             state.dataHeatBal->ZoneDifSolFrIntWinsRep(enclosureNum) * state.dataGlobal->TimeStepZoneSec;
    3718             :                     }
    3719             :                 }
    3720             :             }
    3721             :         }
    3722             :     }
    3723             : 
    3724             :     // Beam and diffuse solar on inside surfaces from interior windows (for reporting)
    3725             : 
    3726     2568509 :     if (state.dataEnvrn->SunIsUp) {
    3727    83718206 :         for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    3728    82430116 :             if (!Surface(SurfNum).HeatTransSurf) continue;
    3729             :             //!!! Following may need to be removed or changed when shelves are considered in adjacent reflection calculations
    3730    80194121 :             if (Surface(SurfNum).Class == SurfaceClass::Shading) continue;
    3731    80192992 :             int const enclosureNum = Surface(SurfNum).SolarEnclIndex;
    3732    80192992 :             state.dataHeatBal->SurfIntBmIncInsSurfIntensRep(SurfNum) =
    3733    80192992 :                 state.dataHeatBal->ZoneBmSolFrIntWinsRep(enclosureNum) / state.dataViewFactor->EnclSolInfo(enclosureNum).TotalSurfArea;
    3734    80192992 :             state.dataHeatBal->SurfIntBmIncInsSurfAmountRep(SurfNum) =
    3735    80192992 :                 state.dataHeatBal->SurfIntBmIncInsSurfIntensRep(SurfNum) * (Surface(SurfNum).Area + state.dataSurface->SurfWinDividerArea(SurfNum));
    3736    80192992 :             state.dataHeatBal->SurfIntBmIncInsSurfAmountRepEnergy(SurfNum) =
    3737    80192992 :                 state.dataHeatBal->SurfIntBmIncInsSurfAmountRep(SurfNum) * state.dataGlobal->TimeStepZoneSec;
    3738             :             //      IntDifIncInsSurfIntensRep(SurfNum) = ZoneDifSolFrIntWinsRep(ZoneNum)/Zone(ZoneNum)%TotalSurfArea
    3739             :             //      IntDifIncInsSurfAmountRep(SurfNum) = IntDifIncInsSurfIntensRep(SurfNum) *  &
    3740             :             //                                             (Surface(SurfNum)%Area + SurfaceWindow(SurfNum)%DividerArea)
    3741             :             //      IntDifIncInsSurfAmountRepEnergy(SurfNum) = IntDifIncInsSurfAmountRep(SurfNum) * TimeStepZoneSec
    3742             :         }
    3743             :     }
    3744             : 
    3745             :     // COMPUTE CONVECTIVE GAINS AND ZONE FLUX DENSITY.
    3746    21002924 :     for (int enclosureNum = 1; enclosureNum <= state.dataViewFactor->NumOfSolarEnclosures; ++enclosureNum) {
    3747    18434415 :         auto &thisSolEnclosure = state.dataViewFactor->EnclSolInfo(enclosureNum);
    3748    18434415 :         if (state.dataHeatBalSurf->InterZoneWindow) {
    3749       48588 :             state.dataHeatBal->EnclSolQSWRad(enclosureNum) *=
    3750       48588 :                 state.dataHeatBalSurf->ZoneFractDifShortZtoZ(enclosureNum, enclosureNum) * thisSolEnclosure.solVMULT;
    3751             :             // CR 8695, VMULT not based on visible
    3752       48588 :             state.dataHeatBal->EnclSolQSWRadLights(enclosureNum) *=
    3753       48588 :                 state.dataHeatBalSurf->ZoneFractDifShortZtoZ(enclosureNum, enclosureNum) * thisSolEnclosure.solVMULT;
    3754             :         } else {
    3755    18385827 :             state.dataHeatBal->EnclSolQSWRad(enclosureNum) *= thisSolEnclosure.solVMULT;
    3756    18385827 :             state.dataHeatBal->EnclSolQSWRadLights(enclosureNum) *= thisSolEnclosure.solVMULT;
    3757             :         }
    3758             :     }
    3759             : 
    3760             :     // COMPUTE RADIANT GAINS ON SURFACES
    3761    21015074 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    3762    36909306 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    3763    18462741 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    3764    18462741 :             int const firstSurfOpaque = thisSpace.OpaqOrIntMassSurfaceFirst;
    3765    18462741 :             int const lastSurfOpaque = thisSpace.OpaqOrIntMassSurfaceLast;
    3766   156163195 :             for (int SurfNum = firstSurfOpaque; SurfNum <= lastSurfOpaque; ++SurfNum) {
    3767   137700454 :                 int const solEnclosureNum = Surface(SurfNum).SolarEnclIndex;
    3768   137700454 :                 int const ConstrNum = Surface(SurfNum).Construction;
    3769             : 
    3770   137700454 :                 Real64 AbsIntSurf = state.dataHeatBalSurf->SurfAbsSolarInt(SurfNum);
    3771             :                 // TODO - AbsIntSurfVis = InsideAbsorpSolar instead of InsideAbsorpVis?
    3772   137700454 :                 Real64 AbsIntSurfVis = state.dataConstruction->Construct(ConstrNum)
    3773   137700454 :                                            .InsideAbsorpSolar; // Inside opaque surface visible absorptance to fix CR 8695 change to
    3774             : 
    3775   137700454 :                 state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) += state.dataHeatBal->EnclSolQSWRad(solEnclosureNum) * AbsIntSurf;
    3776   137700454 :                 state.dataHeatBalSurf->SurfQdotRadLightsInPerArea(SurfNum) += state.dataHeatBal->EnclSolQSWRadLights(solEnclosureNum) * AbsIntSurfVis;
    3777             : 
    3778             :                 // Calculate absorbed solar on outside if movable exterior insulation in place
    3779   137761186 :                 if (state.dataSurface->AnyMovableInsulation &&
    3780       60732 :                     state.dataHeatBalSurf->SurfMovInsulExtPresent(SurfNum)) { // Movable outside insulation in place
    3781        4047 :                     Real64 AbsExt = state.dataHeatBalSurf->SurfAbsSolarExt(SurfNum);
    3782        4047 :                     state.dataHeatBalSurf->SurfQRadSWOutMvIns(SurfNum) =
    3783        8094 :                         state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(SurfNum) * AbsExt /
    3784        4047 :                         state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(1)).AbsorpSolar;
    3785             :                     // For transparent insulation, allow some sunlight to get through the movable insulation.
    3786             :                     // The equation below is derived by taking what is transmitted through the layer and applying
    3787             :                     // the fraction that is absorbed plus the back reflected portion (first order reflection only)
    3788             :                     // to the plane between the transparent insulation and the exterior surface face.
    3789        4047 :                     state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(SurfNum) =
    3790        8094 :                         state.dataMaterial->Material(state.dataSurface->SurfMaterialMovInsulExt(SurfNum)).Trans *
    3791        8094 :                         state.dataHeatBalSurf->SurfQRadSWOutMvIns(SurfNum) *
    3792        8094 :                         ((state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(1)).AbsorpSolar / AbsExt) +
    3793        4047 :                          (1 - state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(1)).AbsorpSolar));
    3794             :                 }
    3795             :                 // RJH 08/30/07 - Add SurfWinInitialDifSolInAbs, SurfWinInitialDifSolwinAbs, and SurfWinInitialDifSolAbsByShade
    3796             :                 // calced in CalcWinTransDifSolInitialDistribution to SurfOpaqQRadSWInAbs, SurfWinQRadSWwinAbs, and SurfWinIntSWAbsByShade here
    3797   137700454 :                 state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) += state.dataHeatBalSurf->SurfOpaqInitialDifSolInAbs(SurfNum);
    3798             :             } // end of opaque
    3799             : 
    3800    18462741 :             int const firstSurfWin = thisSpace.WindowSurfaceFirst;
    3801    18462741 :             int const lastSurfWin = thisSpace.WindowSurfaceLast;
    3802    40474011 :             for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) { // Window
    3803    22011270 :                 int const radEnclosureNum = Surface(SurfNum).RadEnclIndex;
    3804    22011270 :                 int const solEnclosureNum = Surface(SurfNum).SolarEnclIndex;
    3805    22011270 :                 int const ConstrNum = state.dataSurface->SurfActiveConstruction(SurfNum);
    3806             : 
    3807    22011270 :                 if (state.dataSurface->SurfWinWindowModelType(SurfNum) != WindowModel::EQL) {
    3808    22003161 :                     int const ConstrNumSh = state.dataSurface->SurfWinActiveShadedConstruction(SurfNum);
    3809             : 
    3810    22003161 :                     int TotGlassLayers = state.dataConstruction->Construct(ConstrNum).TotGlassLayers;
    3811    22003161 :                     WinShadingType ShadeFlag = state.dataSurface->SurfWinShadingFlag(SurfNum);
    3812             : 
    3813             :                     // These calculations are repeated from InitInternalHeatGains for the Zone Component Loads Report
    3814    22003161 :                     Real64 pulseMultipler = 0.01; // use to create a pulse for the load component report computations, the W/sqft pulse for the zone
    3815    22003161 :                     if (!state.dataGlobal->doLoadComponentPulseNow) {
    3816    22002885 :                         state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum) =
    3817    44005770 :                             state.dataViewFactor->EnclRadInfo(radEnclosureNum).radQThermalRad *
    3818    44005770 :                             state.dataViewFactor->EnclRadInfo(radEnclosureNum).radThermAbsMult * state.dataHeatBalSurf->SurfAbsThermalInt(SurfNum);
    3819             :                     } else {
    3820         276 :                         state.dataHeatBalSurfMgr->curQL = state.dataViewFactor->EnclRadInfo(radEnclosureNum).radQThermalRad;
    3821             :                         // for the loads component report during the special sizing run increase the radiant portion
    3822             :                         // a small amount to create a "pulse" of heat that is used for the
    3823         276 :                         state.dataHeatBalSurfMgr->adjQL =
    3824         276 :                             state.dataHeatBalSurfMgr->curQL + state.dataViewFactor->EnclRadInfo(radEnclosureNum).FloorArea * pulseMultipler;
    3825             :                         // ITABSF is the Inside Thermal Absorptance
    3826             :                         // EnclRadThermAbsMult is a multiplier for each zone/enclosure
    3827             :                         // SurfQdotRadIntGainsInPerArea is the thermal radiation absorbed on inside surfaces
    3828         276 :                         state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum) =
    3829         552 :                             state.dataHeatBalSurfMgr->adjQL * state.dataViewFactor->EnclRadInfo(radEnclosureNum).radThermAbsMult *
    3830         276 :                             state.dataHeatBalSurf->SurfAbsThermalInt(SurfNum);
    3831             :                     }
    3832             : 
    3833    22003161 :                     if (NOT_SHADED(ShadeFlag)) { // No window shading
    3834    49987066 :                         for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) {
    3835    28155561 :                             state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, IGlass) +=
    3836    28155561 :                                 state.dataHeatBal->EnclSolQSWRad(solEnclosureNum) * state.dataConstruction->Construct(ConstrNum).AbsDiffBack(IGlass);
    3837             :                         }
    3838      171656 :                     } else if (ConstrNumSh != 0 && ShadeFlag != WinShadingType::SwitchableGlazing) {
    3839             :                         // Interior, exterior or between-glass shade, screen or blind in place
    3840      196878 :                         for (int IGlass = 1; IGlass <= state.dataConstruction->Construct(ConstrNumSh).TotGlassLayers; ++IGlass) {
    3841      122513 :                             if (ANY_SHADE_SCREEN(ShadeFlag)) {
    3842       78441 :                                 state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, IGlass) +=
    3843      156882 :                                     state.dataHeatBal->EnclSolQSWRad(solEnclosureNum) *
    3844       78441 :                                     state.dataConstruction->Construct(ConstrNumSh).AbsDiffBack(IGlass);
    3845       44072 :                             } else if (BITF_TEST_ANY(BITF(ShadeFlag), BITF(WinShadingType::IntBlind) | BITF(WinShadingType::ExtBlind))) {
    3846             :                                 Real64 BlAbsDiffBk; // Glass layer back diffuse solar absorptance when blind in place
    3847       22368 :                                 if (state.dataSurface->SurfWinMovableSlats(SurfNum)) {
    3848        9393 :                                     BlAbsDiffBk = General::InterpGeneral(
    3849        3131 :                                         state.dataConstruction->Construct(ConstrNumSh)
    3850        3131 :                                             .BlAbsDiffBack(state.dataSurface->SurfWinSlatsAngIndex(SurfNum), IGlass),
    3851        3131 :                                         state.dataConstruction->Construct(ConstrNumSh)
    3852        6262 :                                             .BlAbsDiffBack(std::min(MaxSlatAngs, state.dataSurface->SurfWinSlatsAngIndex(SurfNum) + 1), IGlass),
    3853        3131 :                                         state.dataSurface->SurfWinSlatsAngInterpFac(SurfNum));
    3854             :                                 } else {
    3855       19237 :                                     BlAbsDiffBk = state.dataConstruction->Construct(ConstrNumSh).BlAbsDiffBack(1, IGlass);
    3856             :                                 }
    3857       22368 :                                 state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, IGlass) +=
    3858       22368 :                                     state.dataHeatBal->EnclSolQSWRad(solEnclosureNum) * BlAbsDiffBk;
    3859             :                             }
    3860             :                         }
    3861       74365 :                         if (ShadeFlag == WinShadingType::IntShade) {
    3862       67275 :                             state.dataSurface->SurfWinIntLWAbsByShade(SurfNum) = state.dataViewFactor->EnclRadInfo(radEnclosureNum).radQThermalRad *
    3863       44850 :                                                                                  state.dataConstruction->Construct(ConstrNumSh).ShadeAbsorpThermal *
    3864       22425 :                                                                                  state.dataViewFactor->EnclRadInfo(radEnclosureNum).radThermAbsMult;
    3865       51940 :                         } else if (ShadeFlag == WinShadingType::IntBlind) {
    3866             :                             Real64 EffBlEmiss; // Blind emissivity (thermal absorptance) as part of glazing system
    3867       21262 :                             if (state.dataSurface->SurfWinMovableSlats(SurfNum)) {
    3868        7734 :                                 EffBlEmiss = General::InterpGeneral(
    3869        2578 :                                     state.dataSurface->SurfaceWindow(SurfNum).EffShBlindEmiss(state.dataSurface->SurfWinSlatsAngIndex(SurfNum)),
    3870        2578 :                                     state.dataSurface->SurfaceWindow(SurfNum).EffShBlindEmiss(
    3871        5156 :                                         std::min(MaxSlatAngs, state.dataSurface->SurfWinSlatsAngIndex(SurfNum) + 1)),
    3872        2578 :                                     state.dataSurface->SurfWinSlatsAngInterpFac(SurfNum));
    3873             :                             } else {
    3874       18684 :                                 EffBlEmiss = state.dataSurface->SurfaceWindow(SurfNum).EffShBlindEmiss(1);
    3875             :                             }
    3876       42524 :                             state.dataSurface->SurfWinIntLWAbsByShade(SurfNum) = state.dataViewFactor->EnclRadInfo(radEnclosureNum).radQThermalRad *
    3877       21262 :                                                                                  EffBlEmiss *
    3878       21262 :                                                                                  state.dataViewFactor->EnclRadInfo(radEnclosureNum).radThermAbsMult;
    3879             :                         }
    3880       74365 :                         if (ANY_SHADE_SCREEN(ShadeFlag)) {
    3881       43167 :                             state.dataSurface->SurfWinIntSWAbsByShade(SurfNum) =
    3882       43167 :                                 state.dataHeatBal->EnclSolQSWRad(solEnclosureNum) * state.dataConstruction->Construct(ConstrNumSh).AbsDiffBackShade;
    3883       31198 :                         } else if (ANY_BLIND(ShadeFlag)) {
    3884             :                             Real64 AbsDiffBkBl;
    3885       31198 :                             if (state.dataSurface->SurfWinMovableSlats(SurfNum)) {
    3886        9393 :                                 AbsDiffBkBl = General::InterpGeneral(
    3887        3131 :                                     state.dataConstruction->Construct(ConstrNumSh).AbsDiffBackBlind(state.dataSurface->SurfWinSlatsAngIndex(SurfNum)),
    3888        3131 :                                     state.dataConstruction->Construct(ConstrNumSh)
    3889        6262 :                                         .AbsDiffBackBlind(std::min(MaxSlatAngs, state.dataSurface->SurfWinSlatsAngIndex(SurfNum) + 1)),
    3890        3131 :                                     state.dataSurface->SurfWinSlatsAngInterpFac(SurfNum));
    3891             :                             } else {
    3892       28067 :                                 AbsDiffBkBl = state.dataConstruction->Construct(ConstrNumSh).AbsDiffBackBlind(1);
    3893             :                             }
    3894       31198 :                             state.dataSurface->SurfWinIntSWAbsByShade(SurfNum) = state.dataHeatBal->EnclSolQSWRad(solEnclosureNum) * AbsDiffBkBl;
    3895             :                         }
    3896             :                         // Correct for divider shadowing
    3897       74365 :                         if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(ShadeFlag)) {
    3898       13760 :                             state.dataSurface->SurfWinIntSWAbsByShade(SurfNum) *= state.dataSurface->SurfWinGlazedFrac(SurfNum);
    3899       74365 :                         }
    3900             : 
    3901       97291 :                     } else if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing
    3902      213762 :                         for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) {
    3903             : 
    3904      142508 :                             state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, IGlass) +=
    3905      285016 :                                 state.dataHeatBal->EnclSolQSWRad(solEnclosureNum) *
    3906      285016 :                                 InterpSw(state.dataSurface->SurfWinSwitchingFactor(SurfNum),
    3907      142508 :                                          state.dataConstruction->Construct(ConstrNum).AbsDiffBack(IGlass),
    3908      142508 :                                          state.dataConstruction->Construct(ConstrNumSh).AbsDiffBack(IGlass));
    3909             :                         }
    3910             : 
    3911             :                     } // End of shading flag check
    3912             : 
    3913             :                     // Note that FrameQRadInAbs is initially calculated in InitSolarHeatGains
    3914    22003161 :                     if (state.dataSurface->SurfWinFrameArea(SurfNum) > 0.0)
    3915      592428 :                         state.dataSurface->SurfWinFrameQRadInAbs(SurfNum) +=
    3916     1184856 :                             (state.dataHeatBal->EnclSolQSWRad(solEnclosureNum) * state.dataSurface->SurfWinFrameSolAbsorp(SurfNum) +
    3917     1184856 :                              (state.dataViewFactor->EnclRadInfo(radEnclosureNum).radQThermalRad *
    3918     1184856 :                                   state.dataViewFactor->EnclRadInfo(radEnclosureNum).radThermAbsMult +
    3919     1184856 :                               state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(SurfNum)) *
    3920     1184856 :                                  state.dataSurface->SurfWinFrameEmis(SurfNum)) *
    3921      592428 :                             (1.0 + 0.5 * state.dataSurface->SurfWinProjCorrFrIn(SurfNum));          // Window has a frame
    3922    22003161 :                     if (state.dataSurface->SurfWinDividerArea(SurfNum) > 0.0) {                     // Window has dividers
    3923      262155 :                         Real64 DividerThermAbs = state.dataSurface->SurfWinDividerEmis(SurfNum);    // Window divider thermal absorptance
    3924      262155 :                         Real64 DividerSolAbs = state.dataSurface->SurfWinDividerSolAbsorp(SurfNum); // Window divider solar absorptance
    3925      262155 :                         if (state.dataSurface->SurfWinDividerType(SurfNum) ==
    3926             :                             DataSurfaces::FrameDividerType::Suspended) { // Suspended divider; account for inside glass
    3927       59178 :                             Real64 MatNumGl = state.dataConstruction->Construct(ConstrNum).LayerPoint(
    3928       59178 :                                 state.dataConstruction->Construct(ConstrNum).TotLayers); // Glass layer material number
    3929             :                             Real64 TransGl =
    3930       29589 :                                 state.dataMaterial->Material(MatNumGl).Trans; // Glass layer solar transmittance, reflectance, absorptance
    3931       29589 :                             Real64 ReflGl = state.dataMaterial->Material(MatNumGl).ReflectSolBeamBack;
    3932       29589 :                             Real64 AbsGl = 1.0 - TransGl - ReflGl;
    3933       29589 :                             Real64 DividerSolRefl = 1.0 - DividerSolAbs; // Window divider solar reflectance
    3934       29589 :                             DividerSolAbs = AbsGl + TransGl * (DividerSolAbs + DividerSolRefl * AbsGl) / (1.0 - DividerSolRefl * ReflGl);
    3935       29589 :                             DividerThermAbs = state.dataMaterial->Material(MatNumGl).AbsorpThermalBack;
    3936             :                         }
    3937             :                         // Correct for interior shade transmittance
    3938      262155 :                         if (ShadeFlag == WinShadingType::IntShade) {
    3939         742 :                             int MatNumSh = state.dataConstruction->Construct(ConstrNumSh)
    3940         742 :                                                .LayerPoint(state.dataConstruction->Construct(ConstrNumSh).TotLayers); // Shade layer material number
    3941         742 :                             DividerSolAbs *= state.dataMaterial->Material(MatNumSh).Trans;
    3942         742 :                             DividerThermAbs *= state.dataMaterial->Material(MatNumSh).TransThermal;
    3943      261413 :                         } else if (ShadeFlag == WinShadingType::IntBlind) {
    3944           0 :                             int BlNum = state.dataSurface->SurfWinBlindNumber(SurfNum);
    3945             :                             Real64 SolBackDiffDiffTrans;
    3946             :                             Real64 IRBackTrans;
    3947           0 :                             if (state.dataSurface->SurfWinMovableSlats(SurfNum)) {
    3948           0 :                                 int SurfWinSlatsAngIndex = state.dataSurface->SurfWinSlatsAngIndex(SurfNum);
    3949           0 :                                 Real64 SurfWinSlatsAngInterpFac = state.dataSurface->SurfWinSlatsAngInterpFac(SurfNum);
    3950           0 :                                 SolBackDiffDiffTrans = General::InterpGeneral(
    3951           0 :                                     state.dataHeatBal->Blind(BlNum).SolBackDiffDiffTrans(SurfWinSlatsAngIndex),
    3952           0 :                                     state.dataHeatBal->Blind(BlNum).SolBackDiffDiffTrans(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1)),
    3953             :                                     SurfWinSlatsAngInterpFac);
    3954           0 :                                 IRBackTrans = General::InterpGeneral(
    3955           0 :                                     state.dataHeatBal->Blind(BlNum).IRBackTrans(SurfWinSlatsAngIndex),
    3956           0 :                                     state.dataHeatBal->Blind(BlNum).IRBackTrans(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1)),
    3957             :                                     SurfWinSlatsAngInterpFac);
    3958             :                             } else {
    3959           0 :                                 SolBackDiffDiffTrans = state.dataHeatBal->Blind(BlNum).SolBackDiffDiffTrans(1);
    3960           0 :                                 IRBackTrans = state.dataHeatBal->Blind(BlNum).IRBackTrans(1);
    3961             :                             }
    3962           0 :                             DividerSolAbs *= SolBackDiffDiffTrans;
    3963           0 :                             DividerThermAbs *= IRBackTrans;
    3964             :                         }
    3965             :                         // Note that DividerQRadInAbs is initially calculated in InitSolarHeatGains
    3966      262155 :                         state.dataSurface->SurfWinDividerQRadInAbs(SurfNum) +=
    3967      524310 :                             (state.dataHeatBal->EnclSolQSWRad(solEnclosureNum) * DividerSolAbs +
    3968      524310 :                              (state.dataViewFactor->EnclRadInfo(radEnclosureNum).radQThermalRad *
    3969      524310 :                                   state.dataViewFactor->EnclRadInfo(radEnclosureNum).radThermAbsMult +
    3970      524310 :                               state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(SurfNum)) *
    3971      262155 :                                  DividerThermAbs) *
    3972      262155 :                             (1.0 + state.dataSurface->SurfWinProjCorrDivIn(SurfNum));
    3973             :                     }
    3974             :                 } else {
    3975             :                     // These calculations are repeated from InitInternalHeatGains for the Zone Component Loads Report
    3976        8109 :                     Real64 pulseMultipler = 0.01; // the W/sqft pulse for the zone
    3977        8109 :                     if (!state.dataGlobal->doLoadComponentPulseNow) {
    3978        8109 :                         state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum) =
    3979       16218 :                             state.dataViewFactor->EnclRadInfo(radEnclosureNum).radQThermalRad *
    3980       16218 :                             state.dataViewFactor->EnclRadInfo(radEnclosureNum).radThermAbsMult * state.dataHeatBalSurf->SurfAbsThermalInt(SurfNum);
    3981             :                     } else {
    3982           0 :                         state.dataHeatBalSurfMgr->curQL = state.dataViewFactor->EnclRadInfo(radEnclosureNum).radQThermalRad;
    3983             :                         // for the loads component report during the special sizing run increase the radiant portion
    3984             :                         // a small amount to create a "pulse" of heat that is used for the
    3985           0 :                         state.dataHeatBalSurfMgr->adjQL =
    3986           0 :                             state.dataHeatBalSurfMgr->curQL + state.dataViewFactor->EnclRadInfo(radEnclosureNum).FloorArea * pulseMultipler;
    3987             :                         // ITABSF is the Inside Thermal Absorptance
    3988             :                         // EnclRadThermAbsMult is a multiplier for each zone/radiant enclosure
    3989             :                         // SurfQdotRadIntGainsInPerArea is the thermal radiation absorbed on inside surfaces
    3990           0 :                         state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum) =
    3991           0 :                             state.dataHeatBalSurfMgr->adjQL * state.dataViewFactor->EnclRadInfo(radEnclosureNum).radThermAbsMult *
    3992           0 :                             state.dataHeatBalSurf->SurfAbsThermalInt(SurfNum);
    3993             :                     }
    3994             :                     // Radiations absorbed by the window layers coming from zone side
    3995        8109 :                     int EQLNum = state.dataConstruction->Construct(ConstrNum).EQLConsPtr;
    3996       37842 :                     for (int Lay = 1; Lay <= state.dataWindowEquivLayer->CFS(EQLNum).NL; ++Lay) {
    3997       29733 :                         state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) +=
    3998       29733 :                             state.dataHeatBal->EnclSolQSWRad(solEnclosureNum) * state.dataConstruction->Construct(ConstrNum).AbsDiffBackEQL(Lay);
    3999             :                     }
    4000             :                     // Window frame has not been included for equivalent layer model yet
    4001             : 
    4002             :                 } // end if for IF ( SurfaceWindow(SurfNum)%WindowModelType /= WindowModel:: EQL) THEN
    4003             : 
    4004    22011270 :                 if (Surface(SurfNum).ExtBoundCond > 0) { // Interzone surface
    4005             :                     // Short-wave radiation absorbed in panes of corresponding window in adjacent zone
    4006       27192 :                     int SurfNumAdjZone = Surface(SurfNum).ExtBoundCond; // Surface number in adjacent zone for interzone surfaces
    4007       27192 :                     if (state.dataSurface->SurfWinWindowModelType(SurfNumAdjZone) != WindowModel::EQL) {
    4008       27192 :                         int TotGlassLayers = state.dataConstruction->Construct(ConstrNum).TotGlassLayers;
    4009       54384 :                         for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) {
    4010       27192 :                             state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNumAdjZone, IGlass) +=
    4011       54384 :                                 state.dataHeatBal->EnclSolQSWRad(solEnclosureNum) *
    4012       27192 :                                 state.dataConstruction->Construct(Surface(SurfNumAdjZone).Construction).AbsDiff(IGlass);
    4013             :                             // Note that AbsDiff rather than AbsDiffBack is used in the above since the
    4014             :                             // radiation from the current zone is incident on the outside of the adjacent
    4015             :                             // zone's window.
    4016             :                         }
    4017             :                     } else { // IF (SurfaceWindow(SurfNumAdjZone)%WindowModelType == WindowModel:: EQL) THEN
    4018           0 :                         int const AdjConstrNum = Surface(SurfNumAdjZone).Construction;
    4019           0 :                         int const EQLNum = state.dataConstruction->Construct(AdjConstrNum).EQLConsPtr;
    4020           0 :                         for (int Lay = 1; Lay <= state.dataWindowEquivLayer->CFS(EQLNum).NL; ++Lay) {
    4021           0 :                             state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNumAdjZone, Lay) +=
    4022           0 :                                 state.dataHeatBal->EnclSolQSWRad(solEnclosureNum) * state.dataConstruction->Construct(ConstrNum).AbsDiffFrontEQL(Lay);
    4023             :                             // Note that AbsDiffFrontEQL rather than AbsDiffBackEQL is used in the above
    4024             :                             // since the radiation from the current zone is incident on the outside of the
    4025             :                             // adjacent zone's window.
    4026             :                         }
    4027             :                     }
    4028             :                 }
    4029             : 
    4030    22011270 :                 if (state.dataSurface->SurfWinWindowModelType(SurfNum) == WindowModel::Detailed) {
    4031    21963621 :                     int const ConstrNumSh = state.dataSurface->SurfWinActiveShadedConstruction(SurfNum);
    4032    21963621 :                     int TotGlassLayers = state.dataConstruction->Construct(ConstrNum).TotGlassLayers;
    4033    21963621 :                     WinShadingType ShadeFlag = state.dataSurface->SurfWinShadingFlag(SurfNum);
    4034    21963621 :                     if (NOT_SHADED(ShadeFlag)) { // No window shading
    4035    49940482 :                         for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) {
    4036    28122480 :                             state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, IGlass) += state.dataHeatBal->SurfWinInitialDifSolwinAbs(SurfNum, IGlass);
    4037             :                         }
    4038      145619 :                     } else if (ShadeFlag == WinShadingType::SwitchableGlazing) { // Switchable glazing
    4039      213762 :                         for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) {
    4040      142508 :                             state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, IGlass) += state.dataHeatBal->SurfWinInitialDifSolwinAbs(SurfNum, IGlass);
    4041             :                         }
    4042             :                     } else {
    4043             :                         // Interior, exterior or between-glass shade, screen or blind in place
    4044      196878 :                         for (int IGlass = 1; IGlass <= state.dataConstruction->Construct(ConstrNumSh).TotGlassLayers; ++IGlass) {
    4045      122513 :                             state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, IGlass) += state.dataHeatBal->SurfWinInitialDifSolwinAbs(SurfNum, IGlass);
    4046             :                         }
    4047       74365 :                         if (ANY_SHADE_SCREEN(ShadeFlag)) {
    4048       43167 :                             state.dataSurface->SurfWinIntSWAbsByShade(SurfNum) += state.dataSurface->SurfWinInitialDifSolAbsByShade(SurfNum);
    4049       31198 :                         } else if (ANY_BLIND(ShadeFlag)) {
    4050       31198 :                             state.dataSurface->SurfWinIntSWAbsByShade(SurfNum) += state.dataSurface->SurfWinInitialDifSolAbsByShade(SurfNum);
    4051             :                         }
    4052             :                     } // End of shading flag check
    4053       47649 :                 } else if (state.dataSurface->SurfWinWindowModelType(SurfNum) == WindowModel::BSDF) {
    4054       39540 :                     int TotGlassLayers = state.dataConstruction->Construct(ConstrNum).TotGlassLayers;
    4055      119289 :                     for (int IGlass = 1; IGlass <= TotGlassLayers; ++IGlass) {
    4056       79749 :                         state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, IGlass) += state.dataHeatBal->SurfWinInitialDifSolwinAbs(SurfNum, IGlass);
    4057             :                     }
    4058        8109 :                 } else if (state.dataSurface->SurfWinWindowModelType(SurfNum) == WindowModel::EQL) {
    4059             : 
    4060             :                     // ConstrNum   = Surface(SurfNum)%Construction
    4061        8109 :                     int EQLNum = state.dataConstruction->Construct(ConstrNum).EQLConsPtr;
    4062             : 
    4063       37842 :                     for (int Lay = 1; Lay <= state.dataWindowEquivLayer->CFS(EQLNum).NL; ++Lay) {
    4064       29733 :                         state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, Lay) += state.dataHeatBal->SurfWinInitialDifSolwinAbs(SurfNum, Lay);
    4065             :                     }
    4066             :                 }
    4067             : 
    4068             :             } // End of window
    4069             :         }
    4070             :     }
    4071     2568509 :     DistributeTDDAbsorbedSolar(state);
    4072     2568509 : }
    4073             : 
    4074     2568509 : void ComputeIntThermalAbsorpFactors(EnergyPlusData &state)
    4075             : {
    4076             : 
    4077             :     // SUBROUTINE INFORMATION:
    4078             :     //       AUTHOR         Legacy Code (George Walton)
    4079             :     //       DATE WRITTEN   Legacy: Dec 1976
    4080             :     //       MODIFIED       Nov. 99, FCW: to take into account movable interior shades and switchable glazing
    4081             :     //                      June 01, FCW: to take into account interior blinds.
    4082             : 
    4083             :     // PURPOSE OF THIS SUBROUTINE:
    4084             :     // This routine computes the fractions of long-wave radiation from lights, equipment and people
    4085             :     // that is absorbed by each zone surface.
    4086             : 
    4087             :     // METHODOLOGY EMPLOYED:
    4088             :     // The fraction is assumed to be proportional to the product of the surface area times its thermal absorptivity.
    4089             : 
    4090             :     // REFERENCES:
    4091             :     // BLAST Routine: CITAF - Compute Interior Thermal Absorption Factors
    4092             : 
    4093    21031250 :     for (auto &thisEnclosure : state.dataViewFactor->EnclRadInfo) {
    4094    18462741 :         if (!thisEnclosure.radReCalc) continue;
    4095      317188 :         for (int spaceNum : thisEnclosure.spaceNums) {
    4096      158632 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    4097      158632 :             int const firstSurfWin = thisSpace.WindowSurfaceFirst;
    4098      158632 :             int const lastSurfWin = thisSpace.WindowSurfaceLast;
    4099      545875 :             for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) {
    4100      387243 :                 WinShadingType ShadeFlag = state.dataSurface->SurfWinShadingFlag(SurfNum);
    4101      387243 :                 if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) {
    4102       10798 :                     Real64 BlindEmiss = state.dataSurface->SurfaceWindow(SurfNum).EffShBlindEmiss(1);
    4103       10798 :                     Real64 GlassEmiss = state.dataSurface->SurfaceWindow(SurfNum).EffGlassEmiss(1);
    4104       10798 :                     state.dataHeatBalSurf->SurfAbsThermalInt(SurfNum) = BlindEmiss + GlassEmiss;
    4105             :                 } else {
    4106      376445 :                     int ConstrNum = state.dataSurface->SurfActiveConstruction(SurfNum);
    4107      376445 :                     state.dataHeatBalSurf->SurfAbsThermalInt(SurfNum) = state.dataConstruction->Construct(ConstrNum).InsideAbsorpThermal;
    4108             :                 }
    4109             :             }
    4110             :         }
    4111             :     }
    4112     2568509 :     if (state.dataSurface->AnyMovableSlat) {
    4113       12150 :         for (int SurfNum : state.dataHeatBalSurf->SurfMovSlatsIndexList) {
    4114             :             // For window with an interior shade or blind, emissivity is a combination of glass and shade/blind emissivity
    4115        6075 :             WinShadingType ShadeFlag = state.dataSurface->SurfWinShadingFlag(SurfNum);
    4116        6075 :             if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) {
    4117        2578 :                 if (state.dataSurface->SurfWinMovableSlats(SurfNum)) {
    4118             :                     Real64 BlindEmiss;
    4119             :                     Real64 GlassEmiss;
    4120        2578 :                     int SurfWinSlatsAngIndex = state.dataSurface->SurfWinSlatsAngIndex(SurfNum);
    4121        2578 :                     Real64 SurfWinSlatsAngInterpFac = state.dataSurface->SurfWinSlatsAngInterpFac(SurfNum);
    4122        5156 :                     BlindEmiss = General::InterpGeneral(
    4123        2578 :                         state.dataSurface->SurfaceWindow(SurfNum).EffShBlindEmiss(SurfWinSlatsAngIndex),
    4124        5156 :                         state.dataSurface->SurfaceWindow(SurfNum).EffShBlindEmiss(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1)),
    4125             :                         SurfWinSlatsAngInterpFac);
    4126        5156 :                     GlassEmiss = General::InterpGeneral(
    4127        2578 :                         state.dataSurface->SurfaceWindow(SurfNum).EffGlassEmiss(SurfWinSlatsAngIndex),
    4128        5156 :                         state.dataSurface->SurfaceWindow(SurfNum).EffGlassEmiss(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1)),
    4129             :                         SurfWinSlatsAngInterpFac);
    4130        2578 :                     state.dataHeatBalSurf->SurfAbsThermalInt(SurfNum) = BlindEmiss + GlassEmiss;
    4131             :                 }
    4132             :             }
    4133             :         }
    4134             :     }
    4135             : 
    4136    21031250 :     for (auto &thisRadEnclosure : state.dataViewFactor->EnclRadInfo) {
    4137    18462741 :         if (!thisRadEnclosure.radReCalc) continue;
    4138      158556 :         Real64 SUM1 = 0.0;
    4139     1723138 :         for (int const SurfNum : thisRadEnclosure.SurfacePtr) {
    4140     1564582 :             auto &thisSurf = state.dataSurface->Surface(SurfNum);
    4141     1564582 :             int const ConstrNum = thisSurf.Construction;
    4142     1564582 :             WinShadingType ShadeFlag = state.dataSurface->SurfWinShadingFlag(SurfNum);
    4143     1564582 :             if (ShadeFlag != WinShadingType::SwitchableGlazing) {
    4144     1564582 :                 SUM1 += thisSurf.Area * state.dataHeatBalSurf->SurfAbsThermalInt(SurfNum);
    4145             :             } else { // Switchable glazing
    4146           0 :                 SUM1 += thisSurf.Area * General::InterpSw(state.dataSurface->SurfWinSwitchingFactor(SurfNum),
    4147           0 :                                                           state.dataConstruction->Construct(ConstrNum).InsideAbsorpThermal,
    4148           0 :                                                           state.dataConstruction->Construct(thisSurf.activeShadedConstruction).InsideAbsorpThermal);
    4149             :             }
    4150             : 
    4151             :             // Window frame and divider effects
    4152     1564582 :             if (state.dataSurface->SurfWinFrameArea(SurfNum) > 0.0)
    4153      178918 :                 SUM1 += state.dataSurface->SurfWinFrameArea(SurfNum) * (1.0 + 0.5 * state.dataSurface->SurfWinProjCorrFrIn(SurfNum)) *
    4154       89459 :                         state.dataSurface->SurfWinFrameEmis(SurfNum);
    4155     1564582 :             if (state.dataSurface->SurfWinDividerArea(SurfNum) > 0.0) {
    4156       88270 :                 Real64 DividerThermAbs = state.dataSurface->SurfWinDividerEmis(SurfNum); // Window divider thermal absorptance
    4157             :                 // Suspended (between-glass) divider; relevant emissivity is inner glass emissivity
    4158       88270 :                 if (state.dataSurface->SurfWinDividerType(SurfNum) == DataSurfaces::FrameDividerType::Suspended)
    4159          95 :                     DividerThermAbs = state.dataConstruction->Construct(ConstrNum).InsideAbsorpThermal;
    4160       88270 :                 if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) {
    4161             :                     // Interior shade or blind in place
    4162          14 :                     int const ConstrNumSh = thisSurf.activeShadedConstruction;
    4163          14 :                     if (state.dataSurface->SurfWinHasShadeOrBlindLayer(SurfNum)) {
    4164             :                         // Shade layer material number
    4165             :                         int MatNumSh =
    4166          14 :                             state.dataConstruction->Construct(ConstrNumSh).LayerPoint(state.dataConstruction->Construct(ConstrNumSh).TotLayers);
    4167             :                         // Shade or blind IR transmittance
    4168          14 :                         Real64 TauShIR = state.dataMaterial->Material(MatNumSh).TransThermal;
    4169             :                         // Effective emissivity of shade or blind
    4170          14 :                         Real64 EffShDevEmiss = state.dataSurface->SurfaceWindow(SurfNum).EffShBlindEmiss(1);
    4171          14 :                         if (ShadeFlag == WinShadingType::IntBlind) {
    4172           0 :                             TauShIR = state.dataHeatBal->Blind(state.dataSurface->SurfWinBlindNumber(SurfNum)).IRBackTrans(1);
    4173           0 :                             if (state.dataSurface->SurfWinMovableSlats(SurfNum)) {
    4174           0 :                                 int SurfWinSlatsAngIndex = state.dataSurface->SurfWinSlatsAngIndex(SurfNum);
    4175           0 :                                 Real64 SurfWinSlatsAngInterpFac = state.dataSurface->SurfWinSlatsAngInterpFac(SurfNum);
    4176           0 :                                 TauShIR = General::InterpGeneral(
    4177           0 :                                     state.dataHeatBal->Blind(state.dataSurface->SurfWinBlindNumber(SurfNum)).IRBackTrans(SurfWinSlatsAngIndex),
    4178           0 :                                     state.dataHeatBal->Blind(state.dataSurface->SurfWinBlindNumber(SurfNum))
    4179           0 :                                         .IRBackTrans(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1)),
    4180             :                                     SurfWinSlatsAngInterpFac);
    4181           0 :                                 EffShDevEmiss = General::InterpGeneral(
    4182           0 :                                     state.dataSurface->SurfaceWindow(SurfNum).EffShBlindEmiss(SurfWinSlatsAngIndex),
    4183           0 :                                     state.dataSurface->SurfaceWindow(SurfNum).EffShBlindEmiss(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1)),
    4184             :                                     SurfWinSlatsAngInterpFac);
    4185             :                             }
    4186             :                         }
    4187          14 :                         SUM1 += state.dataSurface->SurfWinDividerArea(SurfNum) * (EffShDevEmiss + DividerThermAbs * TauShIR);
    4188             :                     } else {
    4189             :                         // this is for EMS activated shade/blind but the window construction has no shade/blind layer
    4190           0 :                         SUM1 += state.dataSurface->SurfWinDividerArea(SurfNum) * (1.0 + state.dataSurface->SurfWinProjCorrDivIn(SurfNum)) *
    4191             :                                 DividerThermAbs;
    4192             :                     }
    4193             :                 } else {
    4194       88256 :                     SUM1 +=
    4195       88256 :                         state.dataSurface->SurfWinDividerArea(SurfNum) * (1.0 + state.dataSurface->SurfWinProjCorrDivIn(SurfNum)) * DividerThermAbs;
    4196             :                 }
    4197             :             }
    4198             : 
    4199             :         } // End of loop over surfaces in zone/enclosure
    4200      158556 :         thisRadEnclosure.radThermAbsMult = 1.0 / SUM1;
    4201             : 
    4202             :     } // End of loop over enclosures
    4203     2568509 : }
    4204             : 
    4205     2568509 : void ComputeIntSWAbsorpFactors(EnergyPlusData &state)
    4206             : {
    4207             : 
    4208             :     // SUBROUTINE INFORMATION:
    4209             :     //       AUTHOR         Legacy (George Walton)
    4210             :     //       DATE WRITTEN   Legacy (December 1980)
    4211             :     //       MODIFIED       Nov. 99, FW; now called every time step to account for movable
    4212             :     //                      window shades and insulation
    4213             :     //                      Mar. 00, FW; change name from ComputeVisLightingAbsorpFactors
    4214             :     //                      to ComputeIntSWAbsorpFactors
    4215             :     //                      May 00, FW; add window frame and divider effects
    4216             :     //                      June 01, FW: account for window blinds
    4217             :     //                      Nov 01, FW: account for absorptance of exterior shades and interior or exterior blinds
    4218             :     //                      Jan 03, FW: add between-glass shade/blind
    4219             :     //                      May 06, RR: account for exterior window screens
    4220             : 
    4221             :     // PURPOSE OF THIS SUBROUTINE:
    4222             :     // Computes VMULT, the inverse of the sum of area*(short-wave absorptance+transmittance) for
    4223             :     // the surfaces in a zone. VMULT is used to calculate the zone interior diffuse short-wave radiation
    4224             :     // absorbed by the inside of opaque zone surfaces or by the glass and shade/blind layers of zone windows.
    4225             : 
    4226             :     // Sets VCONV to zero (VCONV was formerly used to calculate convective gain due to short-wave
    4227             :     // radiation absorbed by interior window shades).
    4228             : 
    4229             :     // REFERENCES:
    4230             :     // BLAST Routine - CIVAF - Compute Surface Absorption Factors For Short Wave Radiation
    4231             :     //                         From Zone Lights And Diffuse Solar.
    4232             : 
    4233             :     // Avoid a division by zero of the user has entered a bunch of surfaces with zero absorptivity on the inside
    4234     2568509 :     Real64 constexpr SmallestAreaAbsProductAllowed(0.01);
    4235             : 
    4236    21031250 :     for (auto &thisSolEnclosure : state.dataViewFactor->EnclSolInfo) {
    4237    18462741 :         if (!thisSolEnclosure.radReCalc) continue;
    4238      158556 :         Real64 SUM1 = 0.0; // Intermediate calculation value for solar absorbed and transmitted
    4239             : 
    4240     1724317 :         for (int const SurfNum : thisSolEnclosure.SurfacePtr) {
    4241     1565761 :             auto &thisSurf = state.dataSurface->Surface(SurfNum);
    4242     1565761 :             int const ConstrNum = state.dataSurface->SurfActiveConstruction(SurfNum);
    4243     1565761 :             if (state.dataConstruction->Construct(ConstrNum).TransDiff <= 0.0) {
    4244             :                 // Opaque surface
    4245     1180623 :                 Real64 AbsIntSurf = state.dataHeatBalSurf->SurfAbsSolarInt(SurfNum); // Inside surface short-wave absorptance
    4246     1180623 :                 SUM1 += thisSurf.Area * AbsIntSurf;
    4247             : 
    4248             :             } else {
    4249             :                 // Window
    4250      385138 :                 if (!state.dataConstruction->Construct(thisSurf.Construction).WindowTypeEQL) {
    4251      379144 :                     WinShadingType ShadeFlag = state.dataSurface->SurfWinShadingFlag(SurfNum);
    4252             : 
    4253      379144 :                     Real64 AbsDiffTotWin = 0.0; // Sum of window layer short-wave absorptances
    4254      379144 :                     int const ConstrNumSh = state.dataSurface->SurfWinActiveShadedConstruction(SurfNum);
    4255      379144 :                     Real64 SwitchFac = state.dataSurface->SurfWinSwitchingFactor(SurfNum);
    4256             : 
    4257             :                     // Sum of absorptances of glass layers
    4258      888601 :                     for (int Lay = 1; Lay <= state.dataConstruction->Construct(ConstrNum).TotGlassLayers; ++Lay) {
    4259      509457 :                         Real64 AbsDiffLayWin = state.dataConstruction->Construct(ConstrNum).AbsDiffBack(Lay); // Window layer short-wave absorptance
    4260             : 
    4261             :                         // Window with shade, screen or blind
    4262      509457 :                         if (ConstrNumSh != 0) {
    4263      202763 :                             if (ANY_SHADE_SCREEN(ShadeFlag)) {
    4264        6013 :                                 AbsDiffLayWin = state.dataConstruction->Construct(ConstrNumSh).AbsDiffBack(Lay);
    4265      196750 :                             } else if (ANY_BLIND(ShadeFlag)) {
    4266        8641 :                                 if (state.dataSurface->SurfWinMovableSlats(SurfNum)) {
    4267        9393 :                                     AbsDiffLayWin = General::InterpGeneral(
    4268        3131 :                                         state.dataConstruction->Construct(ConstrNumSh)
    4269        3131 :                                             .BlAbsDiffBack(state.dataSurface->SurfWinSlatsAngIndex(SurfNum), Lay),
    4270        3131 :                                         state.dataConstruction->Construct(ConstrNumSh)
    4271        6262 :                                             .BlAbsDiffBack(std::min(MaxSlatAngs, state.dataSurface->SurfWinSlatsAngIndex(SurfNum) + 1), Lay),
    4272        3131 :                                         state.dataSurface->SurfWinSlatsAngInterpFac(SurfNum));
    4273             :                                 } else {
    4274        5510 :                                     AbsDiffLayWin = state.dataConstruction->Construct(ConstrNumSh).BlAbsDiffBack(1, Lay);
    4275             :                                 }
    4276             :                             }
    4277             :                         }
    4278             : 
    4279             :                         // Switchable glazing
    4280      509457 :                         if (ShadeFlag == WinShadingType::SwitchableGlazing)
    4281           0 :                             AbsDiffLayWin =
    4282           0 :                                 General::InterpSw(SwitchFac, AbsDiffLayWin, state.dataConstruction->Construct(ConstrNumSh).AbsDiffBack(Lay));
    4283             : 
    4284      509457 :                         AbsDiffTotWin += AbsDiffLayWin;
    4285             :                     }
    4286             : 
    4287      379144 :                     Real64 TransDiffWin = state.dataConstruction->Construct(ConstrNum).TransDiff; // Window diffuse short-wave transmittance
    4288      379144 :                     Real64 DiffAbsShade = 0.0;                                                    // Diffuse short-wave shade or blind absorptance
    4289             : 
    4290             :                     // Window with shade, screen or blind
    4291             : 
    4292      379144 :                     if (ConstrNumSh != 0) {
    4293      110375 :                         if (ANY_SHADE_SCREEN(ShadeFlag)) {
    4294        3853 :                             TransDiffWin = state.dataConstruction->Construct(ConstrNumSh).TransDiff;
    4295        3853 :                             DiffAbsShade = state.dataConstruction->Construct(ConstrNumSh).AbsDiffBackShade;
    4296      106522 :                         } else if (ANY_BLIND(ShadeFlag)) {
    4297        8603 :                             if (state.dataSurface->SurfWinMovableSlats(SurfNum)) {
    4298        3131 :                                 int SurfWinSlatsAngIndex = state.dataSurface->SurfWinSlatsAngIndex(SurfNum);
    4299        3131 :                                 Real64 SurfWinSlatsAngInterpFac = state.dataSurface->SurfWinSlatsAngInterpFac(SurfNum);
    4300        6262 :                                 TransDiffWin = General::InterpGeneral(
    4301        3131 :                                     state.dataConstruction->Construct(ConstrNumSh).BlTransDiff(SurfWinSlatsAngIndex),
    4302        6262 :                                     state.dataConstruction->Construct(ConstrNumSh).BlTransDiff(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1)),
    4303             :                                     SurfWinSlatsAngInterpFac);
    4304        6262 :                                 DiffAbsShade = General::InterpGeneral(
    4305        3131 :                                     state.dataConstruction->Construct(ConstrNumSh).AbsDiffBackBlind(SurfWinSlatsAngIndex),
    4306        6262 :                                     state.dataConstruction->Construct(ConstrNumSh).AbsDiffBackBlind(std::min(MaxSlatAngs, SurfWinSlatsAngIndex + 1)),
    4307             :                                     SurfWinSlatsAngInterpFac);
    4308             :                             } else {
    4309        5472 :                                 TransDiffWin = state.dataConstruction->Construct(ConstrNumSh).BlTransDiff(1);
    4310        5472 :                                 DiffAbsShade = state.dataConstruction->Construct(ConstrNumSh).AbsDiffBackBlind(1);
    4311             :                             }
    4312             :                         }
    4313             :                     }
    4314             : 
    4315             :                     // Switchable glazing
    4316             : 
    4317      379144 :                     if (ShadeFlag == WinShadingType::SwitchableGlazing)
    4318           0 :                         TransDiffWin = General::InterpSw(SwitchFac, TransDiffWin, state.dataConstruction->Construct(ConstrNumSh).TransDiff);
    4319             : 
    4320      379144 :                     SUM1 += thisSurf.Area * (TransDiffWin + AbsDiffTotWin + DiffAbsShade);
    4321             : 
    4322             :                     // Window frame and divider effects (shade area is glazed area plus divider area)
    4323             : 
    4324      379144 :                     if (state.dataSurface->SurfWinFrameArea(SurfNum) > 0.0)
    4325      178918 :                         SUM1 += state.dataSurface->SurfWinFrameArea(SurfNum) * state.dataSurface->SurfWinFrameSolAbsorp(SurfNum) *
    4326       89459 :                                 (1.0 + 0.5 * state.dataSurface->SurfWinProjCorrFrIn(SurfNum));
    4327      379144 :                     if (state.dataSurface->SurfWinDividerArea(SurfNum) > 0.0) {
    4328       88270 :                         Real64 DividerAbs = state.dataSurface->SurfWinDividerSolAbsorp(SurfNum); // Window divider solar absorptance
    4329       88270 :                         if (state.dataSurface->SurfWinDividerType(SurfNum) == DataSurfaces::FrameDividerType::Suspended) {
    4330             :                             // Suspended (between-glass) divider: account for glass on inside of divider
    4331         190 :                             Real64 MatNumGl = state.dataConstruction->Construct(ConstrNum).LayerPoint(
    4332         190 :                                 state.dataConstruction->Construct(ConstrNum).TotLayers); // Glass material number
    4333             :                             Real64 TransGl =
    4334          95 :                                 state.dataMaterial->Material(MatNumGl).Trans; // Glass layer short-wave transmittance, reflectance, absorptance
    4335          95 :                             Real64 ReflGl = state.dataMaterial->Material(MatNumGl).ReflectSolBeamBack;
    4336          95 :                             Real64 AbsGl = 1.0 - TransGl - ReflGl;
    4337          95 :                             Real64 DividerRefl = 1.0 - DividerAbs; // Window divider short-wave reflectance
    4338          95 :                             DividerAbs = AbsGl + TransGl * (DividerAbs + DividerRefl * AbsGl) / (1.0 - DividerRefl * ReflGl);
    4339             :                         }
    4340       88270 :                         if (ANY_INTERIOR_SHADE_BLIND(ShadeFlag)) {
    4341          14 :                             SUM1 += state.dataSurface->SurfWinDividerArea(SurfNum) * (DividerAbs + DiffAbsShade);
    4342             :                         } else {
    4343       88256 :                             SUM1 += state.dataSurface->SurfWinDividerArea(SurfNum) * (1.0 + state.dataSurface->SurfWinProjCorrDivIn(SurfNum)) *
    4344             :                                     DividerAbs;
    4345             :                         }
    4346             :                     }
    4347             :                 } else { // equivalent layer window
    4348             :                     // In equivalent layer window solid layers (Glazing and shades) are treated equally
    4349             :                     // frames and dividers are not supported
    4350        5994 :                     Real64 AbsDiffTotWin = 0.0;
    4351        5994 :                     Real64 AbsDiffLayWin = 0.0;
    4352        5994 :                     Real64 TransDiffWin = state.dataConstruction->Construct(ConstrNum).TransDiff;
    4353       28000 :                     for (int Lay = 1; Lay <= state.dataWindowEquivLayer->CFS(state.dataConstruction->Construct(ConstrNum).EQLConsPtr).NL; ++Lay) {
    4354       22006 :                         AbsDiffLayWin = state.dataConstruction->Construct(ConstrNum).AbsDiffBackEQL(Lay);
    4355       22006 :                         AbsDiffTotWin += AbsDiffLayWin;
    4356             :                     }
    4357        5994 :                     SUM1 += thisSurf.Area * (TransDiffWin + AbsDiffTotWin);
    4358             :                 }
    4359             :             } // End of check if opaque surface or window
    4360             :         }     // End of loop over surfaces in zone
    4361             : 
    4362      158556 :         if (SUM1 > SmallestAreaAbsProductAllowed) { // Everything is okay, proceed with the regular calculation
    4363      158551 :             thisSolEnclosure.solVMULT = 1.0 / SUM1;
    4364             : 
    4365             :         } else { // the sum of area*solar absorptance for all surfaces in the zone is zero--either the user screwed up
    4366             :             // or they really want to disallow any solar from being absorbed on the inside surfaces.  Fire off a
    4367             :             // nasty warning message and then assume that no solar is ever absorbed (basically everything goes
    4368             :             // back out whatever window is there.  Note that this also assumes that the shade has no effect.
    4369             :             // That's probably not correct, but how correct is it to assume that no solar is absorbed anywhere
    4370             :             // in the zone?
    4371           5 :             if (thisSolEnclosure.solAbsFirstCalc) {
    4372           3 :                 ShowWarningError(state,
    4373           2 :                                  "ComputeIntSWAbsorbFactors: Sum of area times inside solar absorption for all surfaces is zero in Zone: " +
    4374             :                                      thisSolEnclosure.Name);
    4375           1 :                 thisSolEnclosure.solAbsFirstCalc = false;
    4376             :             }
    4377           5 :             thisSolEnclosure.solVMULT = 0.0;
    4378             :         }
    4379             :     } // End of enclosure loop
    4380     2568509 : }
    4381             : 
    4382       12147 : void ComputeDifSolExcZonesWIZWindows(EnergyPlusData &state, int const NumberOfEnclosures) // Number of solar enclosures
    4383             : {
    4384             : 
    4385             :     // SUBROUTINE INFORMATION:
    4386             :     //       AUTHOR         Legacy Code
    4387             :     //       DATE WRITTEN
    4388             :     //       MODIFIED       Jun 2007 - Lawrie - Speed enhancements.
    4389             :     //       RE-ENGINEERED  Winkelmann, Lawrie
    4390             : 
    4391             :     // PURPOSE OF THIS SUBROUTINE:
    4392             :     // This subroutine computes the diffuse solar exchange factors between zones with
    4393             :     // interzone windows.
    4394             : 
    4395       12147 :     auto &Surface(state.dataSurface->Surface);
    4396             : 
    4397       12147 :     if (!allocated(state.dataHeatBalSurf->ZoneFractDifShortZtoZ)) {
    4398           6 :         state.dataHeatBalSurf->ZoneFractDifShortZtoZ.allocate(NumberOfEnclosures, NumberOfEnclosures);
    4399           6 :         state.dataHeatBalSurf->EnclSolRecDifShortFromZ.allocate(NumberOfEnclosures);
    4400           6 :         state.dataHeatBalSurfMgr->DiffuseArray.allocate(NumberOfEnclosures, NumberOfEnclosures);
    4401             :     }
    4402             : 
    4403       12147 :     state.dataHeatBalSurf->EnclSolRecDifShortFromZ = false;
    4404       12147 :     state.dataHeatBalSurf->ZoneFractDifShortZtoZ.to_identity();
    4405       12147 :     state.dataHeatBalSurfMgr->DiffuseArray.to_identity();
    4406             : 
    4407             :     //      IF (.not. ANY(Zone%HasInterZoneWindow)) RETURN  ! this caused massive diffs
    4408       12147 :     if (state.dataGlobal->KickOffSimulation || state.dataGlobal->KickOffSizing) return;
    4409             :     //            Compute fraction transmitted in one pass.
    4410             : 
    4411      101664 :     for (int const SurfNum : state.dataSurface->AllHTWindowSurfaceList) {
    4412       89568 :         if (Surface(SurfNum).ExtBoundCond <= 0) continue;
    4413       27072 :         if (Surface(SurfNum).ExtBoundCond == SurfNum) continue;
    4414       27072 :         if (state.dataConstruction->Construct(Surface(SurfNum).Construction).TransDiff <= 0.0) continue;
    4415             : 
    4416       27072 :         int surfEnclNum = Surface(SurfNum).SolarEnclIndex;
    4417       27072 :         if (!state.dataViewFactor->EnclSolInfo(surfEnclNum).HasInterZoneWindow) continue;
    4418       27072 :         int MZ = Surface(Surface(SurfNum).ExtBoundCond).SolarEnclIndex;
    4419       81216 :         state.dataHeatBalSurf->ZoneFractDifShortZtoZ(surfEnclNum, MZ) += state.dataConstruction->Construct(Surface(SurfNum).Construction).TransDiff *
    4420       54144 :                                                                          state.dataViewFactor->EnclSolInfo(surfEnclNum).solVMULT *
    4421       27072 :                                                                          Surface(SurfNum).Area;
    4422       27072 :         if (state.dataViewFactor->EnclSolInfo(surfEnclNum).solVMULT != 0.0) state.dataHeatBalSurf->EnclSolRecDifShortFromZ(surfEnclNum) = true;
    4423             :     }
    4424             :     //          Compute fractions for multiple passes.
    4425             : 
    4426       12096 :     Array2D<Real64>::size_type l(0u), m(0u), d(0u);
    4427       60480 :     for (int NZ = 1; NZ <= NumberOfEnclosures; ++NZ, d += NumberOfEnclosures + 1) {
    4428       48384 :         m = NZ - 1;
    4429       48384 :         Real64 D_d(0.0); // Local accumulator
    4430      241920 :         for (int MZ = 1; MZ <= NumberOfEnclosures; ++MZ, ++l, m += NumberOfEnclosures) {
    4431      193536 :             if (MZ == NZ) continue;
    4432      145152 :             state.dataHeatBalSurfMgr->DiffuseArray[l] =
    4433      290304 :                 state.dataHeatBalSurf->ZoneFractDifShortZtoZ[l] /
    4434      290304 :                 (1.0 - state.dataHeatBalSurf->ZoneFractDifShortZtoZ[l] *
    4435      145152 :                            state.dataHeatBalSurf->ZoneFractDifShortZtoZ[m]); // [ l ] == ( MZ, NZ ), [ m ] == ( NZ, MZ )
    4436      145152 :             D_d += state.dataHeatBalSurf->ZoneFractDifShortZtoZ[m] * state.dataHeatBalSurfMgr->DiffuseArray[l];
    4437             :         }
    4438       48384 :         state.dataHeatBalSurfMgr->DiffuseArray[d] += D_d; // [ d ] == ( NZ, NZ )
    4439             :     }
    4440             : 
    4441       12096 :     state.dataHeatBalSurf->ZoneFractDifShortZtoZ = state.dataHeatBalSurfMgr->DiffuseArray;
    4442             :     // added for CR 7999 & 7869
    4443       12096 :     assert(state.dataHeatBalSurf->ZoneFractDifShortZtoZ.isize1() == NumberOfEnclosures);
    4444       12096 :     assert(state.dataHeatBalSurf->ZoneFractDifShortZtoZ.isize2() == NumberOfEnclosures);
    4445       12096 :     l = 0u;
    4446       60480 :     for (int NZ = 1; NZ <= NumberOfEnclosures; ++NZ) {
    4447      161280 :         for (int MZ = 1; MZ <= NumberOfEnclosures; ++MZ, ++l) {
    4448      141120 :             if (MZ == NZ) continue;
    4449      108864 :             if (state.dataHeatBalSurf->ZoneFractDifShortZtoZ[l] > 0.0) { // [ l ] == ( MZ, NZ )
    4450       28224 :                 state.dataHeatBalSurf->EnclSolRecDifShortFromZ(NZ) = true;
    4451       28224 :                 break;
    4452             :             }
    4453             :         }
    4454             :     }
    4455             : 
    4456             :     //           Compute fractions for multiple zones.
    4457             : 
    4458       60480 :     for (int IZ = 1; IZ <= NumberOfEnclosures; ++IZ) {
    4459       48384 :         if (!state.dataHeatBalSurf->EnclSolRecDifShortFromZ(IZ)) continue;
    4460             : 
    4461      141120 :         for (int JZ = 1; JZ <= NumberOfEnclosures; ++JZ) {
    4462      112896 :             if (!state.dataHeatBalSurf->EnclSolRecDifShortFromZ(JZ)) continue;
    4463       72576 :             if (IZ == JZ) continue;
    4464       44352 :             if (state.dataHeatBalSurfMgr->DiffuseArray(IZ, JZ) == 0.0) continue;
    4465             : 
    4466      120960 :             for (int KZ = 1; KZ <= NumberOfEnclosures; ++KZ) {
    4467       96768 :                 if (!state.dataHeatBalSurf->EnclSolRecDifShortFromZ(KZ)) continue;
    4468       56448 :                 if (IZ == KZ) continue;
    4469       32256 :                 if (JZ == KZ) continue;
    4470        8064 :                 if (state.dataHeatBalSurfMgr->DiffuseArray(JZ, KZ) == 0.0) continue;
    4471           0 :                 state.dataHeatBalSurf->ZoneFractDifShortZtoZ(IZ, KZ) +=
    4472           0 :                     state.dataHeatBalSurfMgr->DiffuseArray(JZ, KZ) * state.dataHeatBalSurfMgr->DiffuseArray(IZ, JZ);
    4473             : 
    4474           0 :                 for (int LZ = 1; LZ <= NumberOfEnclosures; ++LZ) {
    4475           0 :                     if (!state.dataHeatBalSurf->EnclSolRecDifShortFromZ(LZ)) continue;
    4476           0 :                     if (IZ == LZ) continue;
    4477           0 :                     if (JZ == LZ) continue;
    4478           0 :                     if (KZ == LZ) continue;
    4479           0 :                     if (state.dataHeatBalSurfMgr->DiffuseArray(KZ, LZ) == 0.0) continue;
    4480           0 :                     state.dataHeatBalSurf->ZoneFractDifShortZtoZ(IZ, LZ) += state.dataHeatBalSurfMgr->DiffuseArray(KZ, LZ) *
    4481           0 :                                                                             state.dataHeatBalSurfMgr->DiffuseArray(JZ, KZ) *
    4482           0 :                                                                             state.dataHeatBalSurfMgr->DiffuseArray(IZ, JZ);
    4483             : 
    4484           0 :                     for (int MZ = 1; MZ <= NumberOfEnclosures; ++MZ) {
    4485           0 :                         if (!state.dataHeatBalSurf->EnclSolRecDifShortFromZ(MZ)) continue;
    4486           0 :                         if (IZ == MZ) continue;
    4487           0 :                         if (JZ == MZ) continue;
    4488           0 :                         if (KZ == MZ) continue;
    4489           0 :                         if (LZ == MZ) continue;
    4490           0 :                         if (state.dataHeatBalSurfMgr->DiffuseArray(LZ, MZ) == 0.0) continue;
    4491           0 :                         state.dataHeatBalSurf->ZoneFractDifShortZtoZ(IZ, MZ) +=
    4492           0 :                             state.dataHeatBalSurfMgr->DiffuseArray(LZ, MZ) * state.dataHeatBalSurfMgr->DiffuseArray(KZ, LZ) *
    4493           0 :                             state.dataHeatBalSurfMgr->DiffuseArray(JZ, KZ) * state.dataHeatBalSurfMgr->DiffuseArray(IZ, JZ);
    4494             :                     } // MZ Loop
    4495             : 
    4496             :                 } // LZ Loop
    4497             : 
    4498             :             } // KZ Loop
    4499             : 
    4500             :         } // JZ Loop
    4501             : 
    4502             :     } // IZ Loop
    4503             : }
    4504             : 
    4505      280891 : void InitEMSControlledSurfaceProperties(EnergyPlusData &state)
    4506             : {
    4507             : 
    4508             :     // SUBROUTINE INFORMATION:
    4509             :     //       AUTHOR         B. Griffith
    4510             :     //       DATE WRITTEN   April 2011
    4511             :     //       MODIFIED       na
    4512             :     //       RE-ENGINEERED  na
    4513             : 
    4514             :     // PURPOSE OF THIS SUBROUTINE:
    4515             :     // initialize material and construction surface properties if being overriden by EMS
    4516             : 
    4517             :     // METHODOLOGY EMPLOYED:
    4518             :     // update solar, thermal and visible absorptance values when actuated by EMS
    4519             : 
    4520             :     // REFERENCES:
    4521             :     // na
    4522             : 
    4523             :     // USE STATEMENTS:
    4524             :     // na
    4525             : 
    4526             :     // Locals
    4527             :     // SUBROUTINE ARGUMENT DEFINITIONS:
    4528             :     // na
    4529             : 
    4530             :     // SUBROUTINE PARAMETER DEFINITIONS:
    4531             :     // na
    4532             : 
    4533             :     // INTERFACE BLOCK SPECIFICATIONS:
    4534             :     // na
    4535             : 
    4536             :     // DERIVED TYPE DEFINITIONS:
    4537             :     // na
    4538             : 
    4539             :     // SUBROUTINE LOCAL VARIABLE DECLARATIONS:
    4540             :     int MaterNum;        // do loop counter over materials
    4541             :     int ConstrNum;       // do loop counter over constructions
    4542             :     int TotLayers;       // count of material layers in a construction
    4543             :     int InsideMaterNum;  // integer pointer for inside face's material layer
    4544             :     int OutsideMaterNum; // integer pointer for outside face's material layer
    4545             : 
    4546      280891 :     state.dataGlobal->AnySurfPropOverridesInModel = false;
    4547             :     // first determine if anything needs to be done, once yes, then always init
    4548     7490258 :     for (auto const &mat : state.dataMaterial->Material) {
    4549     7209367 :         if ((mat.AbsorpSolarEMSOverrideOn) || (mat.AbsorpThermalEMSOverrideOn) || (mat.AbsorpVisibleEMSOverrideOn)) {
    4550           0 :             state.dataGlobal->AnySurfPropOverridesInModel = true;
    4551           0 :             break;
    4552             :         }
    4553             :     }
    4554             : 
    4555      280891 :     if (!state.dataGlobal->AnySurfPropOverridesInModel) return; // quick return if nothing has ever needed to be done
    4556             : 
    4557             :     // first, loop over materials
    4558           0 :     for (MaterNum = 1; MaterNum <= state.dataHeatBal->TotMaterials; ++MaterNum) {
    4559           0 :         if (state.dataMaterial->Material(MaterNum).AbsorpSolarEMSOverrideOn) {
    4560           0 :             state.dataMaterial->Material(MaterNum).AbsorpSolar =
    4561           0 :                 max(min(state.dataMaterial->Material(MaterNum).AbsorpSolarEMSOverride, 0.9999), 0.0001);
    4562             :         } else {
    4563           0 :             state.dataMaterial->Material(MaterNum).AbsorpSolar = state.dataMaterial->Material(MaterNum).AbsorpSolarInput;
    4564             :         }
    4565           0 :         if (state.dataMaterial->Material(MaterNum).AbsorpThermalEMSOverrideOn) {
    4566           0 :             state.dataMaterial->Material(MaterNum).AbsorpThermal =
    4567           0 :                 max(min(state.dataMaterial->Material(MaterNum).AbsorpThermalEMSOverride, 0.9999), 0.0001);
    4568             :         } else {
    4569           0 :             state.dataMaterial->Material(MaterNum).AbsorpThermal = state.dataMaterial->Material(MaterNum).AbsorpThermalInput;
    4570             :         }
    4571           0 :         if (state.dataMaterial->Material(MaterNum).AbsorpVisibleEMSOverrideOn) {
    4572           0 :             state.dataMaterial->Material(MaterNum).AbsorpVisible =
    4573           0 :                 max(min(state.dataMaterial->Material(MaterNum).AbsorpVisibleEMSOverride, 0.9999), 0.0001);
    4574             :         } else {
    4575           0 :             state.dataMaterial->Material(MaterNum).AbsorpVisible = state.dataMaterial->Material(MaterNum).AbsorpVisibleInput;
    4576             :         }
    4577             :     } // loop over materials
    4578             : 
    4579             :     // second, loop over constructions
    4580           0 :     for (ConstrNum = 1; ConstrNum <= state.dataHeatBal->TotConstructs; ++ConstrNum) {
    4581           0 :         if (state.dataConstruction->Construct(ConstrNum).TypeIsWindow) continue; // only override opaque constructions
    4582           0 :         TotLayers = state.dataConstruction->Construct(ConstrNum).TotLayers;
    4583           0 :         if (TotLayers == 0) continue; // error condition
    4584           0 :         InsideMaterNum = state.dataConstruction->Construct(ConstrNum).LayerPoint(TotLayers);
    4585           0 :         if (InsideMaterNum != 0) {
    4586           0 :             state.dataConstruction->Construct(ConstrNum).InsideAbsorpVis = state.dataMaterial->Material(InsideMaterNum).AbsorpVisible;
    4587           0 :             state.dataConstruction->Construct(ConstrNum).InsideAbsorpSolar = state.dataMaterial->Material(InsideMaterNum).AbsorpSolar;
    4588           0 :             state.dataConstruction->Construct(ConstrNum).InsideAbsorpThermal = state.dataMaterial->Material(InsideMaterNum).AbsorpThermal;
    4589             :         }
    4590             : 
    4591           0 :         OutsideMaterNum = state.dataConstruction->Construct(ConstrNum).LayerPoint(1);
    4592           0 :         if (OutsideMaterNum != 0) {
    4593           0 :             state.dataConstruction->Construct(ConstrNum).OutsideAbsorpVis = state.dataMaterial->Material(OutsideMaterNum).AbsorpVisible;
    4594           0 :             state.dataConstruction->Construct(ConstrNum).OutsideAbsorpSolar = state.dataMaterial->Material(OutsideMaterNum).AbsorpSolar;
    4595           0 :             state.dataConstruction->Construct(ConstrNum).OutsideAbsorpThermal = state.dataMaterial->Material(OutsideMaterNum).AbsorpThermal;
    4596             :         }
    4597             :     }
    4598             : }
    4599             : 
    4600      280891 : void InitEMSControlledConstructions(EnergyPlusData &state)
    4601             : {
    4602             : 
    4603             :     // SUBROUTINE INFORMATION:
    4604             :     //       AUTHOR         B. Griffith
    4605             :     //       DATE WRITTEN   Jan 2012
    4606             :     //       MODIFIED       na
    4607             :     //       RE-ENGINEERED  na
    4608             : 
    4609             :     // PURPOSE OF THIS SUBROUTINE:
    4610             :     // change construction on surface if overriden by EMS
    4611             : 
    4612      280891 :     auto &Surface(state.dataSurface->Surface);
    4613             : 
    4614      280891 :     state.dataGlobal->AnyConstrOverridesInModel = false;
    4615    37904153 :     for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    4616    37629321 :         if (state.dataSurface->SurfEMSConstructionOverrideON(SurfNum)) {
    4617        6059 :             state.dataGlobal->AnyConstrOverridesInModel = true;
    4618        6059 :             break;
    4619             :         }
    4620             :     }
    4621      280891 :     if (!state.dataGlobal->AnyConstrOverridesInModel) return;
    4622             : 
    4623      424130 :     for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    4624             : 
    4625      418071 :         if (state.dataSurface->SurfEMSConstructionOverrideON(SurfNum) && (state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum) > 0)) {
    4626             : 
    4627       12118 :             if (state.dataConstruction->Construct(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum))
    4628        6059 :                     .TypeIsWindow) { // okay, allways allow windows
    4629        6059 :                 state.dataRuntimeLang->EMSConstructActuatorChecked(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum) = true;
    4630        6059 :                 state.dataRuntimeLang->EMSConstructActuatorIsOkay(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum) = true;
    4631             :             }
    4632             : 
    4633       12118 :             if ((state.dataRuntimeLang->EMSConstructActuatorChecked(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum)) &&
    4634        6059 :                 (state.dataRuntimeLang->EMSConstructActuatorIsOkay(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum))) {
    4635             : 
    4636        6059 :                 Surface(SurfNum).Construction = state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum);
    4637        6059 :                 state.dataConstruction->Construct(Surface(SurfNum).Construction).IsUsed = true;
    4638        6059 :                 state.dataSurface->SurfActiveConstruction(SurfNum) = state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum);
    4639             : 
    4640             :             } else { // have not checked yet or is not okay, so see if we need to warn about incompatible
    4641           0 :                 if (!state.dataRuntimeLang->EMSConstructActuatorChecked(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum)) {
    4642             :                     // check if constructions appear compatible
    4643             : 
    4644           0 :                     if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CTF ||
    4645           0 :                         Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::EMPD) {
    4646             :                         // compare old construction to new construction and see if terms match
    4647             :                         // set as okay and turn false if find a big problem
    4648           0 :                         state.dataRuntimeLang->EMSConstructActuatorIsOkay(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum) =
    4649             :                             true;
    4650           0 :                         state.dataRuntimeLang->EMSConstructActuatorChecked(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum) =
    4651             :                             true;
    4652           0 :                         if (state.dataConstruction->Construct(Surface(SurfNum).Construction).NumHistories !=
    4653           0 :                             state.dataConstruction->Construct(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum)).NumHistories) {
    4654             :                             // thow warning, but allow
    4655           0 :                             ShowWarningError(state,
    4656             :                                              "InitEMSControlledConstructions: EMS Construction State Actuator may be unrealistic, incompatible "
    4657             :                                              "CTF timescales are being used.");
    4658           0 :                             ShowContinueError(state,
    4659           0 :                                               format("Construction named = {} has CTF timesteps = {}",
    4660           0 :                                                      state.dataConstruction->Construct(Surface(SurfNum).Construction).Name,
    4661           0 :                                                      state.dataConstruction->Construct(Surface(SurfNum).Construction).NumHistories));
    4662           0 :                             ShowContinueError(
    4663             :                                 state,
    4664           0 :                                 format("While construction named = {} has CTF timesteps = {}",
    4665           0 :                                        state.dataConstruction->Construct(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum)).Name,
    4666           0 :                                        state.dataConstruction->Construct(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum)).NumHistories));
    4667           0 :                             ShowContinueError(state,
    4668           0 :                                               "Transient heat transfer modeling may not be valid for surface name = " + Surface(SurfNum).Name +
    4669             :                                                   ", and the simulation continues");
    4670             :                         }
    4671           0 :                         if (state.dataConstruction->Construct(Surface(SurfNum).Construction).NumCTFTerms !=
    4672           0 :                             state.dataConstruction->Construct(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum)).NumCTFTerms) {
    4673             :                             // throw warning, but allow
    4674           0 :                             ShowWarningError(state,
    4675             :                                              "InitEMSControlledConstructions: EMS Construction State Actuator may be unrealistic, incompatible "
    4676             :                                              "CTF terms are being used.");
    4677           0 :                             ShowContinueError(state,
    4678           0 :                                               format("Construction named = {} has number of CTF terms = {}",
    4679           0 :                                                      state.dataConstruction->Construct(Surface(SurfNum).Construction).Name,
    4680           0 :                                                      state.dataConstruction->Construct(Surface(SurfNum).Construction).NumCTFTerms));
    4681           0 :                             ShowContinueError(
    4682             :                                 state,
    4683           0 :                                 format("While construction named = {} has number of CTF terms = {}",
    4684           0 :                                        state.dataConstruction->Construct(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum)).Name,
    4685           0 :                                        state.dataConstruction->Construct(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum)).NumCTFTerms));
    4686           0 :                             ShowContinueError(
    4687             :                                 state,
    4688           0 :                                 "The actuator is allowed but the transient heat transfer modeling may not be valid for surface name = " +
    4689           0 :                                     Surface(SurfNum).Name + ", and the simulation continues");
    4690             :                         }
    4691             : 
    4692           0 :                         if (state.dataConstruction->Construct(Surface(SurfNum).Construction).SourceSinkPresent) {
    4693           0 :                             if (!state.dataConstruction->Construct(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum)).SourceSinkPresent) {
    4694             :                                 // thow warning, and do not allow
    4695           0 :                                 ShowSevereError(state, "InitEMSControlledConstructions: EMS Construction State Actuator not valid.");
    4696           0 :                                 ShowContinueError(state,
    4697           0 :                                                   "Construction named = " + state.dataConstruction->Construct(Surface(SurfNum).Construction).Name +
    4698             :                                                       " has internal source/sink");
    4699           0 :                                 ShowContinueError(
    4700             :                                     state,
    4701           0 :                                     "While construction named = " +
    4702           0 :                                         state.dataConstruction->Construct(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum)).Name +
    4703             :                                         " is not an internal source/sink construction");
    4704           0 :                                 ShowContinueError(state,
    4705           0 :                                                   "This actuator is not allowed for surface name = " + Surface(SurfNum).Name +
    4706             :                                                       ", and the simulation continues without the override");
    4707             : 
    4708           0 :                                 state.dataRuntimeLang->EMSConstructActuatorIsOkay(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum),
    4709           0 :                                                                                   SurfNum) = false;
    4710             :                             }
    4711             :                         }
    4712             : 
    4713           0 :                         if (state.dataRuntimeLang->EMSConstructActuatorIsOkay(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum),
    4714           0 :                                                                               SurfNum)) {
    4715           0 :                             Surface(SurfNum).Construction = state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum);
    4716             :                         }
    4717             : 
    4718           0 :                     } else if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD) {
    4719           0 :                         state.dataRuntimeLang->EMSConstructActuatorIsOkay(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum) =
    4720             :                             true;
    4721           0 :                         state.dataRuntimeLang->EMSConstructActuatorChecked(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum) =
    4722             :                             true;
    4723           0 :                         if (state.dataHeatBalFiniteDiffMgr->ConstructFD(Surface(SurfNum).Construction).TotNodes !=
    4724           0 :                             state.dataHeatBalFiniteDiffMgr->ConstructFD(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum)).TotNodes) {
    4725             :                             // thow warning, and do not allow
    4726           0 :                             ShowSevereError(state, "InitEMSControlledConstructions: EMS Construction State Actuator not valid.");
    4727           0 :                             ShowContinueError(state,
    4728           0 :                                               format("Construction named = {} has number of finite difference nodes ={}",
    4729           0 :                                                      state.dataConstruction->Construct(Surface(SurfNum).Construction).Name,
    4730           0 :                                                      state.dataHeatBalFiniteDiffMgr->ConstructFD(Surface(SurfNum).Construction).TotNodes));
    4731           0 :                             ShowContinueError(
    4732             :                                 state,
    4733           0 :                                 format("While construction named = {}has number of finite difference nodes ={}",
    4734           0 :                                        state.dataConstruction->Construct(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum)).Name,
    4735           0 :                                        state.dataHeatBalFiniteDiffMgr->ConstructFD(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum))
    4736           0 :                                            .TotNodes));
    4737           0 :                             ShowContinueError(state,
    4738           0 :                                               "This actuator is not allowed for surface name = " + Surface(SurfNum).Name +
    4739             :                                                   ", and the simulation continues without the override");
    4740             : 
    4741           0 :                             state.dataRuntimeLang->EMSConstructActuatorIsOkay(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum) =
    4742             :                                 false;
    4743             :                         }
    4744             : 
    4745           0 :                         if (state.dataConstruction->Construct(Surface(SurfNum).Construction).SourceSinkPresent) {
    4746           0 :                             if (!state.dataConstruction->Construct(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum)).SourceSinkPresent) {
    4747             :                                 // thow warning, and do not allow
    4748           0 :                                 ShowSevereError(state, "InitEMSControlledConstructions: EMS Construction State Actuator not valid.");
    4749           0 :                                 ShowContinueError(state,
    4750           0 :                                                   "Construction named = " + state.dataConstruction->Construct(Surface(SurfNum).Construction).Name +
    4751             :                                                       " has internal source/sink");
    4752           0 :                                 ShowContinueError(
    4753             :                                     state,
    4754           0 :                                     "While construction named = " +
    4755           0 :                                         state.dataConstruction->Construct(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum)).Name +
    4756             :                                         " is not an internal source/sink construction");
    4757           0 :                                 ShowContinueError(state,
    4758           0 :                                                   "This actuator is not allowed for surface name = " + Surface(SurfNum).Name +
    4759             :                                                       ", and the simulation continues without the override");
    4760             : 
    4761           0 :                                 state.dataRuntimeLang->EMSConstructActuatorIsOkay(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum),
    4762           0 :                                                                                   SurfNum) = false;
    4763             :                             }
    4764             :                         }
    4765             : 
    4766           0 :                         if (state.dataRuntimeLang->EMSConstructActuatorIsOkay(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum),
    4767           0 :                                                                               SurfNum)) {
    4768           0 :                             Surface(SurfNum).Construction = state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum);
    4769             :                         }
    4770             : 
    4771           0 :                     } else if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) { // don't allow
    4772           0 :                         ShowSevereError(state,
    4773             :                                         "InitEMSControlledConstructions: EMS Construction State Actuator not available with Heat transfer "
    4774             :                                         "algorithm CombinedHeatAndMoistureFiniteElement.");
    4775           0 :                         ShowContinueError(state,
    4776           0 :                                           "This actuator is not allowed for surface name = " + Surface(SurfNum).Name +
    4777             :                                               ", and the simulation continues without the override");
    4778           0 :                         state.dataRuntimeLang->EMSConstructActuatorChecked(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum) =
    4779             :                             true;
    4780           0 :                         state.dataRuntimeLang->EMSConstructActuatorIsOkay(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum) =
    4781             :                             false;
    4782             : 
    4783           0 :                     } else if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::Kiva) { // don't allow
    4784           0 :                         ShowSevereError(state,
    4785             :                                         "InitEMSControlledConstructions: EMS Construction State Actuator not available for Surfaces with "
    4786             :                                         "Foundation Outside Boundary Condition.");
    4787           0 :                         ShowContinueError(state,
    4788           0 :                                           "This actuator is not allowed for surface name = " + Surface(SurfNum).Name +
    4789             :                                               ", and the simulation continues without the override");
    4790           0 :                         state.dataRuntimeLang->EMSConstructActuatorChecked(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum) =
    4791             :                             true;
    4792           0 :                         state.dataRuntimeLang->EMSConstructActuatorIsOkay(state.dataSurface->SurfEMSConstructionOverrideValue(SurfNum), SurfNum) =
    4793             :                             false;
    4794             :                     }
    4795             : 
    4796             :                 } else {
    4797             :                     // do nothing, has been checked and is not okay with single warning already issued.
    4798             :                 }
    4799             :             }
    4800             :         } else {
    4801      412012 :             Surface(SurfNum).Construction = Surface(SurfNum).ConstructionStoredInputValue;
    4802      412012 :             state.dataSurface->SurfActiveConstruction(SurfNum) = Surface(SurfNum).ConstructionStoredInputValue;
    4803             :         }
    4804             :     }
    4805             : }
    4806             : 
    4807             : // End Initialization Section of the Module
    4808             : //******************************************************************************
    4809             : 
    4810             : // Begin Algorithm Section of the Module
    4811             : //******************************************************************************
    4812             : 
    4813             : // Beginning of Record Keeping subroutines for the HB Module
    4814             : // *****************************************************************************
    4815             : 
    4816     3487776 : void UpdateIntermediateSurfaceHeatBalanceResults(EnergyPlusData &state, Optional_int_const ZoneToResimulate)
    4817             : {
    4818     3487776 :     int firstZone = 1;
    4819     3487776 :     int lastZone = state.dataGlobal->NumOfZones;
    4820             : 
    4821     3487776 :     if (present(ZoneToResimulate)) {
    4822      808964 :         firstZone = ZoneToResimulate;
    4823      808964 :         lastZone = ZoneToResimulate;
    4824             :     }
    4825             : 
    4826    23190886 :     for (int zoneNum = firstZone; zoneNum <= lastZone; ++zoneNum) {
    4827    39422396 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    4828    19719286 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    4829    19719286 :             int const firstSurf = thisSpace.WindowSurfaceFirst;
    4830    19719286 :             int const lastSurf = thisSpace.WindowSurfaceLast;
    4831    42562048 :             for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    4832    22842762 :                 if (state.dataSurface->Surface(surfNum).ExtSolar) { // WindowManager's definition of ZoneWinHeatGain/Loss
    4833    22811520 :                     state.dataHeatBal->ZoneWinHeatGain(zoneNum) += state.dataSurface->SurfWinHeatGain(surfNum);
    4834             :                 }
    4835             :             }
    4836             :             // Update zone window heat gain reports (these intermediate values are also used for Sensible Heat Gain Summary in GatherHeatGainReport)
    4837    19719286 :             if (state.dataHeatBal->ZoneWinHeatGain(zoneNum) >= 0.0) {
    4838    11703638 :                 state.dataHeatBal->ZoneWinHeatGainRep(zoneNum) = state.dataHeatBal->ZoneWinHeatGain(zoneNum);
    4839    11703638 :                 state.dataHeatBal->ZoneWinHeatGainRepEnergy(zoneNum) =
    4840    11703638 :                     state.dataHeatBal->ZoneWinHeatGainRep(zoneNum) * state.dataGlobal->TimeStepZoneSec;
    4841             :             } else {
    4842     8015648 :                 state.dataHeatBal->ZoneWinHeatLossRep(zoneNum) = -state.dataHeatBal->ZoneWinHeatGain(zoneNum);
    4843     8015648 :                 state.dataHeatBal->ZoneWinHeatLossRepEnergy(zoneNum) =
    4844     8015648 :                     state.dataHeatBal->ZoneWinHeatLossRep(zoneNum) * state.dataGlobal->TimeStepZoneSec;
    4845             :             }
    4846             :         }
    4847             :     }
    4848             : 
    4849     3487776 :     if (state.dataSurface->UseRepresentativeSurfaceCalculations) {
    4850         687 :         UpdateNonRepresentativeSurfaceResults(state, ZoneToResimulate);
    4851             :     }
    4852             : 
    4853             :     // Set normalized properties used for reporting
    4854             : 
    4855             :     // Opaque or window surfaces (Skip TDD:DOME objects. Inside temp is handled by TDD:DIFFUSER.)
    4856    23190886 :     for (int zoneNum = firstZone; zoneNum <= lastZone; ++zoneNum) {
    4857    39422396 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    4858    19719286 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    4859    19719286 :             int const firstSurf = thisSpace.OpaqOrWinSurfaceFirst;
    4860    19719286 :             int const lastSurf = thisSpace.OpaqOrWinSurfaceLast;
    4861   188707914 :             for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    4862   168988628 :                 state.dataHeatBalSurf->SurfQdotConvInPerArea(surfNum) =
    4863   337977256 :                     -state.dataHeatBalSurf->SurfHConvInt(surfNum) *
    4864   168988628 :                     (state.dataHeatBalSurf->SurfTempIn(surfNum) - state.dataHeatBalSurfMgr->RefAirTemp(surfNum));
    4865             :             }
    4866             :         }
    4867             :     }
    4868             :     // Opaque surfaces
    4869    23190886 :     for (int zoneNum = firstZone; zoneNum <= lastZone; ++zoneNum) {
    4870    39422396 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    4871    19719286 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    4872    19719286 :             int const firstSurf = thisSpace.OpaqOrIntMassSurfaceFirst;
    4873    19719286 :             int const lastSurf = thisSpace.OpaqOrIntMassSurfaceLast;
    4874   165865152 :             for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    4875   146145866 :                 state.dataHeatBalSurf->SurfQdotRadSolarInRepPerArea(surfNum) =
    4876   146145866 :                     state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(surfNum) - state.dataHeatBalSurf->SurfQdotRadLightsInPerArea(surfNum);
    4877             :             }
    4878             :         }
    4879             :     }
    4880             :     // Inside face conduction calculation for Kiva surfaces
    4881     3588354 :     for (auto surfNum : state.dataSurface->AllHTKivaSurfaceList) {
    4882      100578 :         state.dataHeatBalSurf->SurfOpaqInsFaceCondFlux(surfNum) =
    4883      301734 :             -(state.dataHeatBalSurf->SurfQdotConvInPerArea(surfNum) + state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(surfNum) +
    4884      301734 :               state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(surfNum) + state.dataHeatBal->SurfQdotRadIntGainsInPerArea(surfNum) +
    4885      100578 :               state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(surfNum));
    4886             :     }
    4887     3487776 : }
    4888             : 
    4889         687 : void UpdateNonRepresentativeSurfaceResults(EnergyPlusData &state, Optional_int_const ZoneToResimulate)
    4890             : {
    4891         687 :     int firstZone = 1;
    4892         687 :     int lastZone = state.dataGlobal->NumOfZones;
    4893             : 
    4894         687 :     if (present(ZoneToResimulate)) {
    4895           0 :         firstZone = ZoneToResimulate;
    4896           0 :         lastZone = ZoneToResimulate;
    4897             :     }
    4898             : 
    4899       32289 :     for (int zoneNum = firstZone; zoneNum <= lastZone; ++zoneNum) {
    4900       63204 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    4901       31602 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    4902             :             // Heat transfer surfaces
    4903       31602 :             int firstSurf = thisSpace.HTSurfaceFirst;
    4904       31602 :             int lastSurf = thisSpace.HTSurfaceLast;
    4905      429375 :             for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    4906      397773 :                 auto &surface(state.dataSurface->Surface(surfNum));
    4907      397773 :                 int repSurfNum = surface.RepresentativeCalcSurfNum;
    4908             : 
    4909      397773 :                 if (surfNum != repSurfNum) {
    4910             : #if 0
    4911             :                 // Check for divergence
    4912             :                 Real64 surfConv = -state.dataHeatBalSurf->SurfHConvInt(surfNum) *
    4913             :                                   (state.dataHeatBalSurf->SurfTempIn(surfNum) - state.dataHeatBalSurfMgr->RefAirTemp(surfNum));
    4914             :                 Real64 repSurfConv = -state.dataHeatBalSurf->SurfHConvInt(repSurfNum) *
    4915             :                                      (state.dataHeatBalSurf->SurfTempIn(repSurfNum) - state.dataHeatBalSurfMgr->RefAirTemp(repSurfNum));
    4916             :                 Real64 diff = surfConv - repSurfConv;
    4917             :                 if (std::abs(diff) > 3.0 && state.dataSurface->Surface(repSurfNum).ConstituentSurfaceNums.size() == 2) {
    4918             :                     ShowWarningError(state, format("Difference in representative surface convection {:.3R} W/m2", diff));
    4919             :                     ShowContinueErrorTimeStamp(state, "");
    4920             :                     ShowContinueError(state, format("  Original Surface: {}", surface.Name));
    4921             :                     ShowContinueError(state, format("    Inside surface temperature: {:.3R} C", state.dataHeatBalSurf->SurfTempIn(surfNum)));
    4922             :                     ShowContinueError(state,
    4923             :                                       format("    Inside convection coefficient: {:.3R} W/m2-K", state.dataHeatBalSurf->SurfHConvInt(surfNum)));
    4924             :                     ShowContinueError(state,
    4925             :                                       format("    Sunlit fraction: {:.3R}",
    4926             :                                              state.dataHeatBal->SurfSunlitFrac(state.dataGlobal->HourOfDay, state.dataGlobal->TimeStep, surfNum)));
    4927             :                     ShowContinueError(state, format("    Outside absorbed solar: {:.3R} W/m2", state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(surfNum)));
    4928             :                     ShowContinueError(state,
    4929             :                                       format("    Outside long wave radiation: {:.3R} W/m2", state.dataHeatBalSurf->QdotRadOutRepPerArea(surfNum)));
    4930             :                     ShowContinueError(state, format("  Representative Surface: {}", state.dataSurface->Surface(repSurfNum).Name));
    4931             :                     ShowContinueError(state, format("    Inside surface temperature: {:.3R} C", state.dataHeatBalSurf->SurfTempIn(repSurfNum)));
    4932             :                     ShowContinueError(state,
    4933             :                                       format("    Inside convection coefficient: {:.3R} W/m2-K", state.dataHeatBalSurf->SurfHConvInt(repSurfNum)));
    4934             :                     ShowContinueError(state,
    4935             :                                       format("    Sunlit fraction: {:.3R}",
    4936             :                                              state.dataHeatBal->SurfSunlitFrac(state.dataGlobal->HourOfDay, state.dataGlobal->TimeStep, repSurfNum)));
    4937             :                     ShowContinueError(state,
    4938             :                                       format("    Outside absorbed solar: {:.3R} W/m2", state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(repSurfNum)));
    4939             :                     ShowContinueError(
    4940             :                         state, format("    Outside long wave radiation: {:.3R} W/m2", state.dataHeatBalSurf->QdotRadOutRepPerArea(repSurfNum)));
    4941             :                 }
    4942             : #endif
    4943             : 
    4944             :                     // Surface Heat Balance Arrays
    4945       89997 :                     state.dataHeatBalSurf->SurfTempIn(surfNum) = state.dataHeatBalSurf->SurfTempIn(repSurfNum);
    4946       89997 :                     state.dataHeatBalSurf->SurfTempOut(surfNum) = state.dataHeatBalSurf->SurfTempOut(repSurfNum);
    4947       89997 :                     state.dataHeatBal->SurfTempEffBulkAir(surfNum) = state.dataHeatBal->SurfTempEffBulkAir(repSurfNum);
    4948       89997 :                     state.dataHeatBalSurf->SurfHConvInt(surfNum) = state.dataHeatBalSurf->SurfHConvInt(repSurfNum);
    4949       89997 :                     state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(surfNum) = state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(repSurfNum);
    4950       89997 :                     state.dataHeatBal->SurfQdotRadIntGainsInPerArea(surfNum) = state.dataHeatBal->SurfQdotRadIntGainsInPerArea(repSurfNum);
    4951       89997 :                     state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(surfNum) = state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(repSurfNum);
    4952             : 
    4953       89997 :                     state.dataHeatBalSurf->SurfQdotConvOutPerArea(surfNum) = state.dataHeatBalSurf->SurfQdotConvOutPerArea(repSurfNum);
    4954       89997 :                     state.dataHeatBalSurf->SurfHcExt(surfNum) = state.dataHeatBalSurf->SurfHcExt(repSurfNum);
    4955       89997 :                     state.dataHeatBalSurf->SurfQdotRadOutRepPerArea(surfNum) = state.dataHeatBalSurf->SurfQdotRadOutRepPerArea(repSurfNum);
    4956       89997 :                     state.dataHeatBalSurf->SurfHAirExt(surfNum) = state.dataHeatBalSurf->SurfHAirExt(repSurfNum);
    4957       89997 :                     state.dataHeatBalSurf->SurfHSkyExt(surfNum) = state.dataHeatBalSurf->SurfHSkyExt(repSurfNum);
    4958       89997 :                     state.dataHeatBalSurf->SurfHGrdExt(surfNum) = state.dataHeatBalSurf->SurfHGrdExt(repSurfNum);
    4959             : 
    4960       89997 :                     state.dataSurface->SurfTAirRef(surfNum) = state.dataSurface->SurfTAirRef(repSurfNum);
    4961       89997 :                     if (state.dataSurface->SurfTAirRef(surfNum) != DataSurfaces::RefAirTemp::Invalid) {
    4962           0 :                         state.dataSurface->SurfTAirRefRpt(surfNum) = DataSurfaces::SurfTAirRefReportVals[state.dataSurface->SurfTAirRef(surfNum)];
    4963             :                     }
    4964             : 
    4965       89997 :                     state.dataSurface->SurfOutConvHfModelEq(surfNum) = state.dataSurface->SurfOutConvHfModelEq(repSurfNum);
    4966       89997 :                     state.dataSurface->SurfOutConvHnModelEq(surfNum) = state.dataSurface->SurfOutConvHnModelEq(repSurfNum);
    4967             : 
    4968       89997 :                     state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(surfNum) =
    4969       89997 :                         state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(repSurfNum);
    4970       89997 :                     state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(surfNum) =
    4971       89997 :                         state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(repSurfNum);
    4972             : 
    4973             :                     // Internal (non reporting variables)
    4974       89997 :                     state.dataHeatBalSurf->SurfTempInTmp(surfNum) = state.dataHeatBalSurf->SurfTempInTmp(repSurfNum);
    4975       89997 :                     state.dataHeatBalSurfMgr->RefAirTemp(surfNum) = state.dataHeatBalSurfMgr->RefAirTemp(repSurfNum);
    4976             :                 }
    4977             :             }
    4978             : 
    4979             :             // Opaque surfaces
    4980       31602 :             firstSurf = thisSpace.OpaqOrIntMassSurfaceFirst;
    4981       31602 :             lastSurf = thisSpace.OpaqOrIntMassSurfaceLast;
    4982      307089 :             for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    4983      275487 :                 auto &surface(state.dataSurface->Surface(surfNum));
    4984      275487 :                 int repSurfNum = surface.RepresentativeCalcSurfNum;
    4985             : 
    4986      275487 :                 if (surfNum != repSurfNum) {
    4987             :                     // Surface Heat Balance Arrays
    4988       11679 :                     state.dataHeatBalSurf->SurfQdotRadLightsInPerArea(surfNum) = state.dataHeatBalSurf->SurfQdotRadLightsInPerArea(repSurfNum);
    4989       11679 :                     state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(surfNum) = state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(repSurfNum);
    4990       11679 :                     state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(surfNum) = state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(repSurfNum);
    4991             :                 }
    4992             :             }
    4993             : 
    4994             :             // Window surfaces
    4995       31602 :             firstSurf = thisSpace.WindowSurfaceFirst;
    4996       31602 :             lastSurf = thisSpace.WindowSurfaceLast;
    4997      153888 :             for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    4998      122286 :                 auto &surface(state.dataSurface->Surface(surfNum));
    4999      122286 :                 int repSurfNum = surface.RepresentativeCalcSurfNum;
    5000             : 
    5001      122286 :                 if (surfNum != repSurfNum) {
    5002       78318 :                     auto areaRatio = surface.Area / state.dataSurface->Surface(surfNum).Area;
    5003             : 
    5004             :                     // Glazing
    5005       78318 :                     state.dataSurface->SurfWinGainConvGlazToZoneRep(surfNum) =
    5006       78318 :                         state.dataSurface->SurfWinGainConvGlazToZoneRep(repSurfNum) * areaRatio;
    5007       78318 :                     state.dataSurface->SurfWinGainIRGlazToZoneRep(surfNum) = state.dataSurface->SurfWinGainIRGlazToZoneRep(repSurfNum) * areaRatio;
    5008             : 
    5009             :                     // Frame
    5010       78318 :                     Real64 frameHeatGain = 0.0;
    5011       78318 :                     if (state.dataSurface->SurfWinFrameArea(surfNum) > 0.0) {
    5012           0 :                         auto frameAreaRatio = state.dataSurface->SurfWinFrameArea(surfNum) / state.dataSurface->SurfWinFrameArea(repSurfNum);
    5013           0 :                         state.dataSurface->SurfWinFrameHeatGain(surfNum) = state.dataSurface->SurfWinFrameHeatGain(repSurfNum) * frameAreaRatio;
    5014           0 :                         state.dataSurface->SurfWinFrameHeatLoss(surfNum) = state.dataSurface->SurfWinFrameHeatLoss(repSurfNum) * frameAreaRatio;
    5015           0 :                         state.dataSurface->SurfWinFrameTempIn(surfNum) = state.dataSurface->SurfWinFrameTempIn(repSurfNum);
    5016           0 :                         state.dataSurface->SurfWinFrameTempSurfOut(surfNum) = state.dataSurface->SurfWinFrameTempSurfOut(repSurfNum);
    5017           0 :                         frameHeatGain = state.dataSurface->SurfWinFrameHeatGain(surfNum) - state.dataSurface->SurfWinFrameHeatLoss(surfNum);
    5018             :                     }
    5019             : 
    5020             :                     // Divider
    5021       78318 :                     Real64 dividerHeatGain = 0.0;
    5022       78318 :                     if (state.dataSurface->SurfWinDividerArea(surfNum) > 0.0) {
    5023           0 :                         auto dividerAreaRatio = state.dataSurface->SurfWinDividerArea(surfNum) / state.dataSurface->SurfWinDividerArea(repSurfNum);
    5024           0 :                         state.dataSurface->SurfWinDividerHeatGain(surfNum) = state.dataSurface->SurfWinDividerHeatGain(repSurfNum) * dividerAreaRatio;
    5025           0 :                         state.dataSurface->SurfWinDividerHeatLoss(surfNum) = state.dataSurface->SurfWinDividerHeatLoss(repSurfNum) * dividerAreaRatio;
    5026           0 :                         state.dataSurface->SurfWinDividerTempIn(surfNum) = state.dataSurface->SurfWinDividerTempIn(repSurfNum);
    5027           0 :                         state.dataSurface->SurfWinDividerTempSurfOut(surfNum) = state.dataSurface->SurfWinDividerTempSurfOut(repSurfNum);
    5028           0 :                         dividerHeatGain = state.dataSurface->SurfWinDividerHeatGain(surfNum) - state.dataSurface->SurfWinDividerHeatLoss(surfNum);
    5029             :                     }
    5030             : 
    5031       78318 :                     state.dataSurface->SurfWinGainFrameDividerToZoneRep(surfNum) = frameHeatGain + dividerHeatGain;
    5032             : 
    5033             :                     // Whole window
    5034      234954 :                     state.dataSurface->SurfWinHeatGain(surfNum) = (state.dataSurface->SurfWinHeatGain(repSurfNum) -
    5035      156636 :                                                                    state.dataSurface->SurfWinGainFrameDividerToZoneRep(repSurfNum) * areaRatio) +
    5036       78318 :                                                                   state.dataSurface->SurfWinGainFrameDividerToZoneRep(surfNum);
    5037             :                 }
    5038             :             }
    5039             :         }
    5040             :     }
    5041         687 : }
    5042             : 
    5043     2568313 : void UpdateFinalSurfaceHeatBalance(EnergyPlusData &state)
    5044             : {
    5045             : 
    5046             :     // SUBROUTINE INFORMATION:
    5047             :     //       AUTHOR         Rick Strand
    5048             :     //       DATE WRITTEN   December 2000
    5049             :     //       MODIFIED       na
    5050             :     //       RE-ENGINEERED  na
    5051             : 
    5052             :     // PURPOSE OF THIS SUBROUTINE:
    5053             :     // If a radiant system is present and was on for part of the time step,
    5054             :     // then we probably need to make yet another pass through the heat balance.
    5055             :     // This is necessary because the heat source/sink to the surface that is
    5056             :     // the radiant system may have varied during the system time steps.
    5057             : 
    5058             :     // METHODOLOGY EMPLOYED:
    5059             :     // First, determine whether or not the radiant system was running.  If
    5060             :     // any of the Qsource terms are non-zero, then it was running.  Then,
    5061             :     // update the current source terms with the "average" value calculated
    5062             :     // by the radiant system algorithm.  This requires the "USE" of the
    5063             :     // radiant algorithm module.  Finally, using this source value, redo
    5064             :     // the inside and outside heat balances.
    5065             : 
    5066             :     using CoolingPanelSimple::UpdateCoolingPanelSourceValAvg;
    5067             :     using ElectricBaseboardRadiator::UpdateBBElecRadSourceValAvg;
    5068             :     using HighTempRadiantSystem::UpdateHTRadSourceValAvg;
    5069             :     using HWBaseboardRadiator::UpdateBBRadSourceValAvg;
    5070             :     using LowTempRadiantSystem::UpdateRadSysSourceValAvg;
    5071             :     using SteamBaseboardRadiator::UpdateBBSteamRadSourceValAvg;
    5072             :     using SwimmingPool::UpdatePoolSourceValAvg;
    5073             : 
    5074             :     bool LowTempRadSysOn;     // .TRUE. if a low temperature radiant system is running
    5075             :     bool HighTempRadSysOn;    // .TRUE. if a high temperature radiant system is running
    5076             :     bool HWBaseboardSysOn;    // .TRUE. if a water baseboard heater is running
    5077             :     bool SteamBaseboardSysOn; // .TRUE. if a steam baseboard heater is running
    5078             :     bool ElecBaseboardSysOn;  // .TRUE. if a steam baseboard heater is running
    5079             :     bool CoolingPanelSysOn;   // true if a simple cooling panel is running
    5080             :     bool SwimmingPoolOn;      // true if a pool is present (running)
    5081             : 
    5082     2568313 :     UpdateRadSysSourceValAvg(state, LowTempRadSysOn);
    5083     2568313 :     UpdateHTRadSourceValAvg(state, HighTempRadSysOn);
    5084     2568313 :     UpdateBBRadSourceValAvg(state, HWBaseboardSysOn);
    5085     2568313 :     UpdateBBSteamRadSourceValAvg(state, SteamBaseboardSysOn);
    5086     2568313 :     UpdateBBElecRadSourceValAvg(state, ElecBaseboardSysOn);
    5087     2568313 :     UpdateCoolingPanelSourceValAvg(state, CoolingPanelSysOn);
    5088     2568313 :     UpdatePoolSourceValAvg(state, SwimmingPoolOn);
    5089             : 
    5090     2568313 :     if (LowTempRadSysOn || HighTempRadSysOn || HWBaseboardSysOn || SteamBaseboardSysOn || ElecBaseboardSysOn || CoolingPanelSysOn || SwimmingPoolOn) {
    5091             :         // Solve the zone heat balance 'Detailed' solution
    5092             :         // Call the outside and inside surface heat balances
    5093       82934 :         CalcHeatBalanceOutsideSurf(state);
    5094       82934 :         CalcHeatBalanceInsideSurf(state);
    5095             :     }
    5096     2568313 : }
    5097             : 
    5098     2417443 : void UpdateThermalHistories(EnergyPlusData &state)
    5099             : {
    5100             : 
    5101             :     // SUBROUTINE INFORMATION:
    5102             :     //       AUTHOR         Russ Taylor
    5103             :     //       DATE WRITTEN   June 1990
    5104             :     //       MODIFIED       na
    5105             :     //       RE-ENGINEERED  Mar98 (RKS)
    5106             : 
    5107             :     // PURPOSE OF THIS SUBROUTINE:
    5108             :     // This subroutine updates and shifts the thermal and flux histories.
    5109             : 
    5110             :     // METHODOLOGY EMPLOYED:
    5111             :     // If a surface runs on the user selected subhourly time step, then the
    5112             :     // history terms for the temperatures and fluxes must simply be updated
    5113             :     // and shifted.  However, if the surface runs at a different (longer) time
    5114             :     // step, then the "master" history series is used for the interpolated
    5115             :     // update scheme.
    5116             : 
    5117             :     // REFERENCES:
    5118             :     // (I)BLAST legacy routine UTHRMH
    5119             :     // Taylor et.al., Impact of Simultaneous Simulation of Buildings and
    5120             :     // Mechanical Systems in Heat Balance Based Energy Analysis Programs
    5121             :     // on System Response and Control, Building Simulation '91, IBPSA, Nice, France.
    5122             : 
    5123     2417443 :     if (state.dataHeatBalSurfMgr->UpdateThermalHistoriesFirstTimeFlag) {
    5124         759 :         state.dataHeatBalSurfMgr->QExt1.dimension(state.dataSurface->TotSurfaces, 0.0);
    5125         759 :         state.dataHeatBalSurfMgr->QInt1.dimension(state.dataSurface->TotSurfaces, 0.0);
    5126         759 :         state.dataHeatBalSurfMgr->TempInt1.dimension(state.dataSurface->TotSurfaces, 0.0);
    5127         759 :         state.dataHeatBalSurfMgr->TempExt1.dimension(state.dataSurface->TotSurfaces, 0.0);
    5128         759 :         state.dataHeatBalSurfMgr->SumTime.dimension(state.dataSurface->TotSurfaces, 0.0);
    5129         759 :         if (state.dataHeatBal->AnyInternalHeatSourceInInput) {
    5130          31 :             state.dataHeatBalSurfMgr->Qsrc1.dimension(state.dataSurface->TotSurfaces, 0.0);
    5131          31 :             state.dataHeatBalSurfMgr->Tsrc1.dimension(state.dataSurface->TotSurfaces, 0.0);
    5132          31 :             state.dataHeatBalSurfMgr->Tuser1.dimension(state.dataSurface->TotSurfaces, 0.0);
    5133             :         }
    5134         759 :         state.dataHeatBalSurfMgr->UpdateThermalHistoriesFirstTimeFlag = false;
    5135             :     }
    5136             : 
    5137     2417443 :     auto &Surface(state.dataSurface->Surface);
    5138             : 
    5139    20604310 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    5140    36389910 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    5141    18203043 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    5142    18203043 :             int const firstSurfOpaq = thisSpace.OpaqOrIntMassSurfaceFirst;
    5143    18203043 :             int const lastSurfOpaq = thisSpace.OpaqOrIntMassSurfaceLast;
    5144   154236873 :             for (int SurfNum = firstSurfOpaq; SurfNum <= lastSurfOpaq; ++SurfNum) {
    5145             :                 // Loop through all (heat transfer) surfaces...  [ l11 ] = ( 1, 1, SurfNum ), [ l21 ] = ( 2, 1, SurfNum )
    5146   136033830 :                 auto const &surface(Surface(SurfNum));
    5147             : 
    5148   136304598 :                 if ((surface.HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::CTF) &&
    5149      270768 :                     (surface.HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::EMPD))
    5150      120750 :                     continue;
    5151             : 
    5152   135913080 :                 int const ConstrNum(surface.Construction);
    5153   135913080 :                 auto const &construct(state.dataConstruction->Construct(ConstrNum));
    5154             : 
    5155   135913080 :                 if (construct.NumCTFTerms == 0) continue; // Skip surfaces with no history terms
    5156             : 
    5157             :                 // Sign convention for the various terms in the following two equations
    5158             :                 // is based on the form of the Conduction Transfer Function equation
    5159             :                 // given by:
    5160             :                 // Qin,now  = (Sum of)(Y Tout) - (Sum of)(Z Tin) + (Sum of)(F Qin,old) + (Sum of)(V Qsrc)
    5161             :                 // Qout,now = (Sum of)(X Tout) - (Sum of)(Y Tin) + (Sum of)(F Qout,old) + (Sum of)(W Qsrc)
    5162             :                 // In both equations, flux is positive from outside to inside.  The V and W terms are for radiant systems only.
    5163             : 
    5164             :                 // Set current inside flux:
    5165   135913080 :                 Real64 const SurfOutsideTempCurr = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum);
    5166   271826160 :                 Real64 SurfInsideFluxHistCurr = SurfOutsideTempCurr * construct.CTFCross(0) -
    5167   135913080 :                                                 state.dataHeatBalSurf->SurfTempIn(SurfNum) * construct.CTFInside(0) +
    5168   135913080 :                                                 state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum); // Heat source/sink term for radiant systems
    5169             :                 // Only HT opaq surfaces are evaluated, previous if (surface.Class == SurfaceClass::Floor || surface.Class == SurfaceClass::Wall ||
    5170             :                 // surface.Class == SurfaceClass::IntMass || surface.Class == SurfaceClass::Roof || surface.Class == SurfaceClass::Door) checks are
    5171             :                 // reduncant.
    5172   135913080 :                 if (construct.SourceSinkPresent) {
    5173      398988 :                     SurfInsideFluxHistCurr += state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1) * construct.CTFSourceIn(0);
    5174             :                 }
    5175   135913080 :                 state.dataHeatBalSurf->SurfOpaqInsFaceCond(SurfNum) = surface.Area * SurfInsideFluxHistCurr;
    5176   135913080 :                 state.dataHeatBalSurf->SurfOpaqInsFaceCondFlux(SurfNum) = SurfInsideFluxHistCurr; // for reporting
    5177   135913080 :                 state.dataHeatBalSurf->SurfInsideFluxHist(1)(SurfNum) = SurfInsideFluxHistCurr;
    5178             : 
    5179             :                 // Update the temperature at the source/sink location (if one is present)
    5180   135913080 :                 if (construct.SourceSinkPresent) {
    5181      398988 :                     state.dataHeatBalSurf->SurfTempSource(SurfNum) = state.dataHeatBalSurf->SurfTsrcHist(SurfNum, 1) =
    5182      797976 :                         SurfOutsideTempCurr * construct.CTFTSourceOut(0) + state.dataHeatBalSurf->SurfTempIn(SurfNum) * construct.CTFTSourceIn(0) +
    5183      797976 :                         state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1) * construct.CTFTSourceQ(0) +
    5184      398988 :                         state.dataHeatBalFanSys->CTFTsrcConstPart(SurfNum);
    5185      398988 :                     state.dataHeatBalSurf->SurfTempUserLoc(SurfNum) = state.dataHeatBalSurf->SurfTuserHist(SurfNum, 1) =
    5186      797976 :                         SurfOutsideTempCurr * construct.CTFTUserOut(0) + state.dataHeatBalSurf->SurfTempIn(SurfNum) * construct.CTFTUserIn(0) +
    5187      797976 :                         state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1) * construct.CTFTUserSource(0) +
    5188      398988 :                         state.dataHeatBalFanSys->CTFTuserConstPart(SurfNum);
    5189             :                 }
    5190             : 
    5191   135913080 :                 if (surface.ExtBoundCond > 0) continue; // Don't need to evaluate outside for partitions
    5192             : 
    5193             :                 // Set current outside flux:
    5194    46530623 :                 if (construct.SourceSinkPresent) {
    5195      350370 :                     state.dataHeatBalSurf->SurfOutsideFluxHist(1)(SurfNum) =
    5196      700740 :                         SurfOutsideTempCurr * construct.CTFOutside(0) - state.dataHeatBalSurf->SurfTempIn(SurfNum) * construct.CTFCross(0) +
    5197      700740 :                         state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1) * construct.CTFSourceOut(0) +
    5198      350370 :                         state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum); // Heat source/sink term for radiant systems
    5199             :                 } else {
    5200   138540759 :                     state.dataHeatBalSurf->SurfOutsideFluxHist(1)(SurfNum) = SurfOutsideTempCurr * construct.CTFOutside(0) -
    5201    92360506 :                                                                              state.dataHeatBalSurf->SurfTempIn(SurfNum) * construct.CTFCross(0) +
    5202    46180253 :                                                                              state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum);
    5203             :                 }
    5204             :                 // switch sign for balance at outside face
    5205    46530623 :                 state.dataHeatBalSurf->SurfOpaqOutFaceCondFlux(SurfNum) = -state.dataHeatBalSurf->SurfOutsideFluxHist(1)(SurfNum);
    5206    46530623 :                 state.dataHeatBalSurf->SurfOpaqOutFaceCond(SurfNum) = surface.Area * state.dataHeatBalSurf->SurfOpaqOutFaceCondFlux(SurfNum);
    5207             :             }
    5208             :         }
    5209             :     } // ...end of loop over all (heat transfer) surfaces...
    5210             : 
    5211     2417443 :     if (state.dataHeatBal->SimpleCTFOnly && !state.dataGlobal->AnyConstrOverridesInModel) {
    5212             :         // Temporarily save the rvalue references of the last term arrays
    5213     4026960 :         Array1D<Real64> insideTemp(std::move(state.dataHeatBalSurf->SurfInsideTempHist(state.dataHeatBal->MaxCTFTerms + 1)));
    5214     4026960 :         Array1D<Real64> outsideTemp(std::move(state.dataHeatBalSurf->SurfOutsideTempHist(state.dataHeatBal->MaxCTFTerms + 1)));
    5215     4026960 :         Array1D<Real64> insideFlux(std::move(state.dataHeatBalSurf->SurfInsideFluxHist(state.dataHeatBal->MaxCTFTerms + 1)));
    5216     4026960 :         Array1D<Real64> outsideFlux(std::move(state.dataHeatBalSurf->SurfOutsideFluxHist(state.dataHeatBal->MaxCTFTerms + 1)));
    5217             :         // Shifting its internal pointer to data to the new object; Using the (Array1D && a) overload of the "=" operator
    5218    18016212 :         for (int HistTermNum = state.dataHeatBal->MaxCTFTerms + 1; HistTermNum >= 3; --HistTermNum) {
    5219    16002732 :             state.dataHeatBalSurf->SurfInsideTempHist(HistTermNum) = std::move(state.dataHeatBalSurf->SurfInsideTempHist(HistTermNum - 1));
    5220    16002732 :             state.dataHeatBalSurf->SurfOutsideTempHist(HistTermNum) = std::move(state.dataHeatBalSurf->SurfOutsideTempHist(HistTermNum - 1));
    5221    16002732 :             state.dataHeatBalSurf->SurfInsideFluxHist(HistTermNum) = std::move(state.dataHeatBalSurf->SurfInsideFluxHist(HistTermNum - 1));
    5222    16002732 :             state.dataHeatBalSurf->SurfOutsideFluxHist(HistTermNum) = std::move(state.dataHeatBalSurf->SurfOutsideFluxHist(HistTermNum - 1));
    5223             :         }
    5224             :         // Reuse the pointers of the last term arrays for the second term arrays
    5225     2013480 :         state.dataHeatBalSurf->SurfInsideTempHist(2) = std::move(insideTemp);
    5226     2013480 :         state.dataHeatBalSurf->SurfOutsideTempHist(2) = std::move(outsideTemp);
    5227     2013480 :         state.dataHeatBalSurf->SurfInsideFluxHist(2) = std::move(insideFlux);
    5228     2013480 :         state.dataHeatBalSurf->SurfOutsideFluxHist(2) = std::move(outsideFlux);
    5229             :         // Hard copy the values of the the 1st term to the 2nd (copying data instead of pointers to protect the 1st term arrays used in run time)
    5230     2013480 :         state.dataHeatBalSurf->SurfInsideTempHist(2) = state.dataHeatBalSurf->SurfInsideTempHist(1);
    5231     2013480 :         state.dataHeatBalSurf->SurfOutsideTempHist(2) = state.dataHeatBalSurf->SurfOutsideTempHist(1);
    5232     2013480 :         state.dataHeatBalSurf->SurfInsideFluxHist(2) = state.dataHeatBalSurf->SurfInsideFluxHist(1);
    5233     2013480 :         state.dataHeatBalSurf->SurfOutsideFluxHist(2) = state.dataHeatBalSurf->SurfOutsideFluxHist(1);
    5234     2013480 :         return;
    5235             :     }
    5236             : 
    5237     2556208 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    5238     4304490 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    5239     2152245 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    5240     2152245 :             int const firstSurfOpaq = thisSpace.OpaqOrIntMassSurfaceFirst;
    5241     2152245 :             int const lastSurfOpaq = thisSpace.OpaqOrIntMassSurfaceLast;
    5242    17615022 :             for (int SurfNum = firstSurfOpaq; SurfNum <= lastSurfOpaq; ++SurfNum) {
    5243             :                 // Loop through all (heat transfer) surfaces...  [ l11 ] = ( 1, 1, SurfNum ), [ l21 ] = ( 2, 1, SurfNum )
    5244    15462777 :                 if ((Surface(SurfNum).HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::CTF) &&
    5245           0 :                     (Surface(SurfNum).HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::EMPD))
    5246           0 :                     continue;
    5247    15462777 :                 if (state.dataHeatBalSurf->SurfCurrNumHist(SurfNum) == 0) { // First time step in a block for a surface, update arrays
    5248    12082460 :                     state.dataHeatBalSurfMgr->TempExt1(SurfNum) = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum);
    5249    12082460 :                     state.dataHeatBalSurfMgr->TempInt1(SurfNum) = state.dataHeatBalSurf->SurfInsideTempHist(1)(SurfNum);
    5250    12082460 :                     state.dataHeatBalSurfMgr->QExt1(SurfNum) = state.dataHeatBalSurf->SurfOutsideFluxHist(1)(SurfNum);
    5251    12082460 :                     state.dataHeatBalSurfMgr->QInt1(SurfNum) = state.dataHeatBalSurf->SurfInsideFluxHist(1)(SurfNum);
    5252             :                 }
    5253             :             }
    5254             :         }
    5255             : 
    5256             :     } // ...end of loop over all (heat transfer) surfaces...
    5257      403963 :     if (state.dataHeatBal->AnyInternalHeatSourceInInput) {
    5258      433362 :         for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    5259      656118 :             for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    5260      328059 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
    5261      328059 :                 int const firstSurfOpaq = thisSpace.OpaqOrIntMassSurfaceFirst;
    5262      328059 :                 int const lastSurfOpaq = thisSpace.OpaqOrIntMassSurfaceLast;
    5263     2550273 :                 for (int SurfNum = firstSurfOpaq; SurfNum <= lastSurfOpaq; ++SurfNum) {
    5264             :                     // Loop through all (heat transfer) surfaces...  [ l11 ] = ( 1, 1, SurfNum ), [ l21 ] = ( 2, 1, SurfNum )
    5265     2222214 :                     if ((Surface(SurfNum).HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::CTF) &&
    5266           0 :                         (Surface(SurfNum).HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::EMPD))
    5267           0 :                         continue;
    5268     2222214 :                     if (state.dataHeatBalSurf->SurfCurrNumHist(SurfNum) == 0) { // First time step in a block for a surface, update arrays
    5269     2210088 :                         state.dataHeatBalSurfMgr->Tsrc1(SurfNum) = state.dataHeatBalSurf->SurfTsrcHist(SurfNum, 1);
    5270     2210088 :                         state.dataHeatBalSurfMgr->Tuser1(SurfNum) = state.dataHeatBalSurf->SurfTuserHist(SurfNum, 1);
    5271     2210088 :                         state.dataHeatBalSurfMgr->Qsrc1(SurfNum) = state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1);
    5272             :                     }
    5273             :                 }
    5274             :             }
    5275             :         } // ...end of loop over all (heat transfer) surfaces...
    5276             :     }
    5277             : 
    5278             :     // SHIFT TEMPERATURE AND FLUX HISTORIES:
    5279             :     // SHIFT AIR TEMP AND FLUX SHIFT VALUES WHEN AT BOTTOM OF ARRAY SPACE.
    5280     2556208 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    5281     4304490 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    5282     2152245 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    5283     2152245 :             int const firstSurfOpaq = thisSpace.OpaqOrIntMassSurfaceFirst;
    5284     2152245 :             int const lastSurfOpaq = thisSpace.OpaqOrIntMassSurfaceLast;
    5285    17615022 :             for (int SurfNum = firstSurfOpaq; SurfNum <= lastSurfOpaq; ++SurfNum) {
    5286    15462777 :                 auto const &surface(Surface(SurfNum));
    5287             : 
    5288    15462777 :                 if ((surface.HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::CTF) &&
    5289           0 :                     (surface.HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::EMPD))
    5290           0 :                     continue;
    5291             : 
    5292    15462777 :                 int const ConstrNum(surface.Construction);
    5293    15462777 :                 auto const &construct(state.dataConstruction->Construct(ConstrNum));
    5294             : 
    5295    15462777 :                 ++state.dataHeatBalSurf->SurfCurrNumHist(SurfNum);
    5296    15462777 :                 state.dataHeatBalSurfMgr->SumTime(SurfNum) = double(state.dataHeatBalSurf->SurfCurrNumHist(SurfNum)) * state.dataGlobal->TimeStepZone;
    5297             : 
    5298    15462777 :                 if (state.dataHeatBalSurf->SurfCurrNumHist(SurfNum) == construct.NumHistories) {
    5299    12080868 :                     state.dataHeatBalSurf->SurfCurrNumHist(SurfNum) = 0;
    5300             : 
    5301    12080868 :                     if (construct.NumCTFTerms > 1) {
    5302    11910813 :                         int const numCTFTerms(construct.NumCTFTerms);
    5303   105560604 :                         for (int HistTermNum = numCTFTerms + 1; HistTermNum >= 3; --HistTermNum) { // Tuned Linear indexing
    5304    93649791 :                             state.dataHeatBalSurf->SurfInsideTempHistMaster(HistTermNum)(SurfNum) =
    5305    93649791 :                                 state.dataHeatBalSurf->SurfInsideTempHistMaster(HistTermNum - 1)(SurfNum);
    5306    93649791 :                             state.dataHeatBalSurf->SurfOutsideTempHistMaster(HistTermNum)(SurfNum) =
    5307    93649791 :                                 state.dataHeatBalSurf->SurfOutsideTempHistMaster(HistTermNum - 1)(SurfNum);
    5308    93649791 :                             state.dataHeatBalSurf->SurfInsideFluxHistMaster(HistTermNum)(SurfNum) =
    5309    93649791 :                                 state.dataHeatBalSurf->SurfInsideFluxHistMaster(HistTermNum - 1)(SurfNum);
    5310    93649791 :                             state.dataHeatBalSurf->SurfOutsideFluxHistMaster(HistTermNum)(SurfNum) =
    5311    93649791 :                                 state.dataHeatBalSurf->SurfOutsideFluxHistMaster(HistTermNum - 1)(SurfNum);
    5312    93649791 :                             state.dataHeatBalSurf->SurfOutsideTempHist(HistTermNum)(SurfNum) =
    5313    93649791 :                                 state.dataHeatBalSurf->SurfOutsideTempHistMaster(HistTermNum - 1)(SurfNum);
    5314    93649791 :                             state.dataHeatBalSurf->SurfInsideTempHist(HistTermNum)(SurfNum) =
    5315    93649791 :                                 state.dataHeatBalSurf->SurfInsideTempHistMaster(HistTermNum - 1)(SurfNum);
    5316    93649791 :                             state.dataHeatBalSurf->SurfOutsideFluxHist(HistTermNum)(SurfNum) =
    5317    93649791 :                                 state.dataHeatBalSurf->SurfOutsideFluxHistMaster(HistTermNum - 1)(SurfNum);
    5318    93649791 :                             state.dataHeatBalSurf->SurfInsideFluxHist(HistTermNum)(SurfNum) =
    5319    93649791 :                                 state.dataHeatBalSurf->SurfInsideFluxHistMaster(HistTermNum - 1)(SurfNum);
    5320             :                         }
    5321             :                     }
    5322             : 
    5323    12080868 :                     state.dataHeatBalSurf->SurfOutsideTempHistMaster(2)(SurfNum) = state.dataHeatBalSurfMgr->TempExt1(SurfNum);
    5324    12080868 :                     state.dataHeatBalSurf->SurfInsideTempHistMaster(2)(SurfNum) = state.dataHeatBalSurfMgr->TempInt1(SurfNum);
    5325    12080868 :                     state.dataHeatBalSurf->SurfOutsideFluxHistMaster(2)(SurfNum) = state.dataHeatBalSurfMgr->QExt1(SurfNum);
    5326    12080868 :                     state.dataHeatBalSurf->SurfInsideFluxHistMaster(2)(SurfNum) = state.dataHeatBalSurfMgr->QInt1(SurfNum);
    5327             : 
    5328    12080868 :                     state.dataHeatBalSurf->SurfOutsideTempHist(2)(SurfNum) = state.dataHeatBalSurf->SurfOutsideTempHistMaster(2)(SurfNum);
    5329    12080868 :                     state.dataHeatBalSurf->SurfInsideTempHist(2)(SurfNum) = state.dataHeatBalSurf->SurfInsideTempHistMaster(2)(SurfNum);
    5330    12080868 :                     state.dataHeatBalSurf->SurfOutsideFluxHist(2)(SurfNum) = state.dataHeatBalSurf->SurfOutsideFluxHistMaster(2)(SurfNum);
    5331    12080868 :                     state.dataHeatBalSurf->SurfInsideFluxHist(2)(SurfNum) = state.dataHeatBalSurf->SurfInsideFluxHistMaster(2)(SurfNum);
    5332             :                 } else {
    5333     3381909 :                     Real64 const sum_steps(state.dataHeatBalSurfMgr->SumTime(SurfNum) / construct.CTFTimeStep);
    5334     3381909 :                     if (construct.NumCTFTerms > 1) {
    5335     3381909 :                         int const numCTFTerms(construct.NumCTFTerms);
    5336    48952843 :                         for (int HistTermNum = numCTFTerms + 1; HistTermNum >= 3; --HistTermNum) { // Tuned Linear indexing
    5337             :                             // TH(SideNum, TermNum, SurfNum) = (THM(SideNum, TermNum, SurfNum) -
    5338             :                             //                                 (THM(SideNum, TermNum, SurfNum) - THM(SideNum, TermNum - 1, SurfNum)) * sum_steps;
    5339    45570934 :                             Real64 const THM_Out_1(state.dataHeatBalSurf->SurfOutsideTempHistMaster(HistTermNum)(SurfNum));
    5340    45570934 :                             Real64 const THM_In_1(state.dataHeatBalSurf->SurfInsideTempHistMaster(HistTermNum)(SurfNum));
    5341    45570934 :                             Real64 const THM_Out_2(state.dataHeatBalSurf->SurfOutsideTempHistMaster(HistTermNum - 1)(SurfNum));
    5342    45570934 :                             Real64 const THM_In_2(state.dataHeatBalSurf->SurfInsideTempHistMaster(HistTermNum - 1)(SurfNum));
    5343    45570934 :                             state.dataHeatBalSurf->SurfOutsideTempHist(HistTermNum)(SurfNum) = THM_Out_1 - (THM_Out_1 - THM_Out_2) * sum_steps;
    5344    45570934 :                             state.dataHeatBalSurf->SurfInsideTempHist(HistTermNum)(SurfNum) = THM_In_1 - (THM_In_1 - THM_In_2) * sum_steps;
    5345             : 
    5346    45570934 :                             Real64 const QHM_Out_1(state.dataHeatBalSurf->SurfOutsideFluxHistMaster(HistTermNum)(SurfNum));
    5347    45570934 :                             Real64 const QHM_In_1(state.dataHeatBalSurf->SurfInsideFluxHistMaster(HistTermNum)(SurfNum));
    5348    45570934 :                             Real64 const QHM_Out_2(state.dataHeatBalSurf->SurfOutsideFluxHistMaster(HistTermNum - 1)(SurfNum));
    5349    45570934 :                             Real64 const QHM_In_2(state.dataHeatBalSurf->SurfInsideFluxHistMaster(HistTermNum - 1)(SurfNum));
    5350    45570934 :                             state.dataHeatBalSurf->SurfOutsideFluxHist(HistTermNum)(SurfNum) = QHM_Out_1 - (QHM_Out_1 - QHM_Out_2) * sum_steps;
    5351    45570934 :                             state.dataHeatBalSurf->SurfInsideFluxHist(HistTermNum)(SurfNum) = QHM_In_1 - (QHM_In_1 - QHM_In_2) * sum_steps;
    5352             :                         }
    5353             :                     }
    5354             :                     // TH( 1, 2, SurfNum ) = THM( 1, 2, SurfNum ) - ( THM( 1, 2, SurfNum ) - TempExt1( SurfNum ) ) * sum_steps;
    5355     3381909 :                     state.dataHeatBalSurf->SurfOutsideTempHist(2)(SurfNum) =
    5356     6763818 :                         state.dataHeatBalSurf->SurfOutsideTempHistMaster(2)(SurfNum) -
    5357     3381909 :                         (state.dataHeatBalSurf->SurfOutsideTempHistMaster(2)(SurfNum) - state.dataHeatBalSurfMgr->TempExt1(SurfNum)) * sum_steps;
    5358     3381909 :                     state.dataHeatBalSurf->SurfInsideTempHist(2)(SurfNum) =
    5359     6763818 :                         state.dataHeatBalSurf->SurfInsideTempHistMaster(2)(SurfNum) -
    5360     3381909 :                         (state.dataHeatBalSurf->SurfInsideTempHistMaster(2)(SurfNum) - state.dataHeatBalSurfMgr->TempInt1(SurfNum)) * sum_steps;
    5361     3381909 :                     state.dataHeatBalSurf->SurfOutsideFluxHist(2)(SurfNum) =
    5362     6763818 :                         state.dataHeatBalSurf->SurfOutsideFluxHistMaster(2)(SurfNum) -
    5363     3381909 :                         (state.dataHeatBalSurf->SurfOutsideFluxHistMaster(2)(SurfNum) - state.dataHeatBalSurfMgr->QExt1(SurfNum)) * sum_steps;
    5364     3381909 :                     state.dataHeatBalSurf->SurfInsideFluxHist(2)(SurfNum) =
    5365     6763818 :                         state.dataHeatBalSurf->SurfInsideFluxHistMaster(2)(SurfNum) -
    5366     3381909 :                         (state.dataHeatBalSurf->SurfInsideFluxHistMaster(2)(SurfNum) - state.dataHeatBalSurfMgr->QInt1(SurfNum)) * sum_steps;
    5367             :                 }
    5368             :             }
    5369             :         }
    5370             :     } // ...end of loop over all (heat transfer) surfaces
    5371             : 
    5372      403963 :     if (state.dataHeatBal->AnyInternalHeatSourceInInput) {
    5373      433362 :         for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    5374      656118 :             for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    5375      328059 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
    5376      328059 :                 int const firstSurfOpaq = thisSpace.OpaqOrIntMassSurfaceFirst;
    5377      328059 :                 int const lastSurfOpaq = thisSpace.OpaqOrIntMassSurfaceLast;
    5378     2550273 :                 for (int SurfNum = firstSurfOpaq; SurfNum <= lastSurfOpaq; ++SurfNum) {
    5379     2222214 :                     auto const &surface(Surface(SurfNum));
    5380     2222214 :                     int const ConstrNum(surface.Construction);
    5381     2222214 :                     auto const &construct(state.dataConstruction->Construct(ConstrNum));
    5382     2222214 :                     if (!construct.SourceSinkPresent) continue;
    5383      398988 :                     if ((surface.HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::CTF) &&
    5384           0 :                         (surface.HeatTransferAlgorithm != DataSurfaces::HeatTransferModel::EMPD))
    5385           0 :                         continue;
    5386             : 
    5387      398988 :                     if (state.dataHeatBalSurf->SurfCurrNumHist(SurfNum) == 0) { // First time step in a block for a surface, update arrays
    5388      386832 :                         if (construct.NumCTFTerms > 1) {
    5389      386832 :                             int const numCTFTerms(construct.NumCTFTerms);
    5390      386832 :                             auto m(state.dataHeatBalSurf->SurfTsrcHistM.index(SurfNum, numCTFTerms));
    5391      386832 :                             auto m1(m + 1);
    5392     3834570 :                             for (int HistTermNum = numCTFTerms + 1; HistTermNum >= 3; --HistTermNum, --m, --m1) { // Tuned Linear indexing
    5393             :                                 // SurfTsrcHist( SurfNum, HistTerm ) = SurfTsrcHistM( SurfNum, HHistTerm ) = SurfTsrcHistM( SurfNum, HistTermNum - 1
    5394             :                                 // ); SurfQsrcHist( SurfNum, HistTerm ) = SurfQsrcHistM( SurfNum, HHistTerm ) = SurfQsrcHistM( SurfNum, HistTermNum -
    5395             :                                 // 1 );
    5396     3447738 :                                 state.dataHeatBalSurf->SurfTsrcHist[m1] = state.dataHeatBalSurf->SurfTsrcHistM[m1] =
    5397     3447738 :                                     state.dataHeatBalSurf->SurfTsrcHistM[m];
    5398     3447738 :                                 state.dataHeatBalSurf->SurfQsrcHist[m1] = state.dataHeatBalSurf->SurfQsrcHistM[m1] =
    5399     3447738 :                                     state.dataHeatBalSurf->SurfQsrcHistM[m];
    5400     3447738 :                                 state.dataHeatBalSurf->SurfTuserHist[m1] = state.dataHeatBalSurf->SurfTuserHistM[m1] =
    5401     3447738 :                                     state.dataHeatBalSurf->SurfTuserHistM[m];
    5402             :                             }
    5403             :                         }
    5404      386832 :                         state.dataHeatBalSurf->SurfTsrcHistM(SurfNum, 2) = state.dataHeatBalSurfMgr->Tsrc1(SurfNum);
    5405      386832 :                         state.dataHeatBalSurf->SurfTuserHistM(SurfNum, 2) = state.dataHeatBalSurfMgr->Tuser1(SurfNum);
    5406      386832 :                         state.dataHeatBalSurf->SurfQsrcHistM(SurfNum, 2) = state.dataHeatBalSurfMgr->Qsrc1(SurfNum);
    5407      386832 :                         state.dataHeatBalSurf->SurfTsrcHist(SurfNum, 2) = state.dataHeatBalSurf->SurfTsrcHistM(SurfNum, 2);
    5408      386832 :                         state.dataHeatBalSurf->SurfTuserHist(SurfNum, 2) = state.dataHeatBalSurf->SurfTuserHistM(SurfNum, 2);
    5409      386832 :                         state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 2) = state.dataHeatBalSurf->SurfQsrcHistM(SurfNum, 2);
    5410             :                     } else {
    5411       12156 :                         Real64 const sum_steps(state.dataHeatBalSurfMgr->SumTime(SurfNum) / construct.CTFTimeStep);
    5412             : 
    5413       12156 :                         if (construct.NumCTFTerms > 1) {
    5414       12156 :                             int const numCTFTerms(construct.NumCTFTerms);
    5415       12156 :                             auto m(state.dataHeatBalSurf->SurfTsrcHistM.index(SurfNum, numCTFTerms));
    5416       12156 :                             auto m1(m + 1);
    5417      158028 :                             for (int HistTermNum = numCTFTerms + 1; HistTermNum >= 3; --HistTermNum, --m, --m1) { // Tuned Linear indexing [ l ] == ()
    5418             :                                 // Real64 const SurfTsrcHistM_elem( SurfTsrcHistM( SurfNum, HistTermNum ) );
    5419             :                                 // SurfTsrcHist( SurfNum, HistTermNum ) = SurfTsrcHistM_elem - ( SurfTsrcHistM_elem - SurfTsrcHistM( SurfNum,
    5420             :                                 // HistTermNum
    5421             :                                 // - 1 ) ) * sum_steps;  Real64 const QsrcHistM_elem( SurfQsrcHistM( SurfNum, HistTermNum ) );  SurfQsrcHist( SurfNum,
    5422             :                                 // HistTermNum ) = QsrcHistM_elem - ( QsrcHistM_elem - SurfQsrcHistM( SurfNum, HistTermNum - 1 ) ) * sum_steps;
    5423      145872 :                                 Real64 const TsrcHistM_m1(state.dataHeatBalSurf->SurfTsrcHistM[m1]);
    5424      145872 :                                 state.dataHeatBalSurf->SurfTsrcHist[m1] =
    5425      145872 :                                     TsrcHistM_m1 - (TsrcHistM_m1 - state.dataHeatBalSurf->SurfTsrcHistM[m]) * sum_steps;
    5426      145872 :                                 Real64 const QsrcHistM_m1(state.dataHeatBalSurf->SurfQsrcHistM[m1]);
    5427      145872 :                                 state.dataHeatBalSurf->SurfQsrcHist[m1] =
    5428      145872 :                                     QsrcHistM_m1 - (QsrcHistM_m1 - state.dataHeatBalSurf->SurfQsrcHistM[m]) * sum_steps;
    5429      145872 :                                 Real64 const TuserHistM_m1(state.dataHeatBalSurf->SurfTuserHistM[m1]);
    5430      145872 :                                 state.dataHeatBalSurf->SurfTuserHist[m1] =
    5431      145872 :                                     TuserHistM_m1 - (TuserHistM_m1 - state.dataHeatBalSurf->SurfTuserHistM[m]) * sum_steps;
    5432             :                             }
    5433             :                         }
    5434             :                         // Tuned Linear indexing
    5435             :                         // SurfTsrcHist( SurfNum, 2 ) = SurfTsrcHistM( SurfNum, 2 ) - ( SurfTsrcHistM( SurfNum, 2 ) - Tsrc1( SurfNum ) ) * sum_steps;
    5436             :                         // SurfQsrcHist( SurfNum, 2 ) = SurfQsrcHistM( SurfNum, 2 ) - ( SurfQsrcHistM( SurfNum, 2 ) - Qsrc1( SurfNum ) ) * sum_steps;
    5437       12156 :                         auto const l2(state.dataHeatBalSurf->SurfTsrcHist.index(SurfNum, 2));
    5438       12156 :                         state.dataHeatBalSurf->SurfTsrcHist[l2] =
    5439       24312 :                             state.dataHeatBalSurf->SurfTsrcHistM[l2] -
    5440       12156 :                             (state.dataHeatBalSurf->SurfTsrcHistM[l2] - state.dataHeatBalSurfMgr->Tsrc1(SurfNum)) * sum_steps;
    5441       12156 :                         state.dataHeatBalSurf->SurfQsrcHist[l2] =
    5442       24312 :                             state.dataHeatBalSurf->SurfQsrcHistM[l2] -
    5443       12156 :                             (state.dataHeatBalSurf->SurfQsrcHistM[l2] - state.dataHeatBalSurfMgr->Qsrc1(SurfNum)) * sum_steps;
    5444       12156 :                         state.dataHeatBalSurf->SurfTuserHist[l2] =
    5445       24312 :                             state.dataHeatBalSurf->SurfTuserHistM[l2] -
    5446       12156 :                             (state.dataHeatBalSurf->SurfTuserHistM[l2] - state.dataHeatBalSurfMgr->Tuser1(SurfNum)) * sum_steps;
    5447             :                     }
    5448             :                 }
    5449             :             }
    5450             :         } // ...end of loop over all (heat transfer) surfaces...
    5451             :     }     // ...end of AnyInternalHeatSourceInInput
    5452             : }
    5453             : 
    5454     3487776 : void CalculateZoneMRT(EnergyPlusData &state,
    5455             :                       Optional_int_const ZoneToResimulate) // if passed in, then only calculate surfaces that have this zone
    5456             : {
    5457             : 
    5458             :     // SUBROUTINE INFORMATION:
    5459             :     //       AUTHOR         Rick Strand
    5460             :     //       DATE WRITTEN   November 2000
    5461             :     //       MODIFIED       na
    5462             :     //       RE-ENGINEERED  na
    5463             : 
    5464             :     // PURPOSE OF THIS SUBROUTINE:
    5465             :     // Calculates the current zone MRT for thermal comfort and radiation
    5466             :     // calculation purposes.
    5467             : 
    5468             :     Real64 SumAET; // Intermediate calculational variable (area*emissivity*T) sum
    5469             : 
    5470     3487776 :     auto &Surface(state.dataSurface->Surface);
    5471             : 
    5472     3487776 :     if (state.dataHeatBalSurfMgr->CalculateZoneMRTfirstTime) {
    5473         771 :         state.dataHeatBalSurfMgr->SurfaceAE.allocate(state.dataSurface->TotSurfaces);
    5474         771 :         state.dataHeatBalSurfMgr->ZoneAESum.allocate(state.dataGlobal->NumOfZones);
    5475         771 :         state.dataHeatBalSurfMgr->SurfaceAE = 0.0;
    5476         771 :         state.dataHeatBalSurfMgr->ZoneAESum = 0.0;
    5477       44533 :         for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    5478       43762 :             if (Surface(SurfNum).HeatTransSurf) {
    5479       42207 :                 state.dataHeatBalSurfMgr->SurfaceAE(SurfNum) =
    5480       42207 :                     Surface(SurfNum).Area * state.dataConstruction->Construct(Surface(SurfNum).Construction).InsideAbsorpThermal;
    5481       42207 :                 int ZoneNum = Surface(SurfNum).Zone;
    5482       42207 :                 if (ZoneNum > 0) state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum) += state.dataHeatBalSurfMgr->SurfaceAE(SurfNum);
    5483             :             }
    5484             :         }
    5485             :     }
    5486             : 
    5487    25190732 :     for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
    5488    21702956 :         if (present(ZoneToResimulate) && (ZoneNum != ZoneToResimulate)) continue;
    5489    19703110 :         SumAET = 0.0;
    5490    39422396 :         for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) {
    5491    19719286 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    5492   188711964 :             for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) {
    5493   168992678 :                 SumAET += state.dataHeatBalSurfMgr->SurfaceAE(SurfNum) * state.dataHeatBalSurf->SurfTempIn(SurfNum);
    5494             :             }
    5495    19719286 :             if (state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum) > 0.01) {
    5496    19717261 :                 state.dataHeatBal->ZoneMRT(ZoneNum) = SumAET / state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum);
    5497             :             } else {
    5498        2025 :                 if (state.dataHeatBalSurfMgr->CalculateZoneMRTfirstTime) {
    5499           3 :                     ShowWarningError(state,
    5500           2 :                                      "Zone areas*inside surface emissivities are summing to zero, for Zone=\"" +
    5501           3 :                                          state.dataHeatBal->Zone(ZoneNum).Name + "\"");
    5502           1 :                     ShowContinueError(state, "As a result, MRT will be set to MAT for that zone");
    5503             :                 }
    5504        2025 :                 state.dataHeatBal->ZoneMRT(ZoneNum) = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT;
    5505             :             }
    5506             :         }
    5507             :     }
    5508             : 
    5509     3487776 :     state.dataHeatBalSurfMgr->CalculateZoneMRTfirstTime = false;
    5510     3487776 : }
    5511             : 
    5512             : // End of Record Keeping subroutines for the HB Module
    5513             : // *****************************************************************************
    5514             : 
    5515             : // Beginning of Reporting subroutines for the HB Module
    5516             : // *****************************************************************************
    5517             : 
    5518     2568313 : void CalcThermalResilience(EnergyPlusData &state)
    5519             : {
    5520             :     // This function calculate timestep-wise heat index and humidex.
    5521             : 
    5522             :     // The computation of the heat index is a refinement of a result obtained by multiple regression analysis
    5523             :     // carried out by Lans P. Rothfusz and described in a 1990 National Weather Service (NWS)
    5524             :     // Technical Attachment (SR 90-23).
    5525             :     // Reference: https://www.wpc.ncep.noaa.gov/html/heatindex_equation.shtml
    5526             : 
    5527             :     // The current formula for determining the humidex was developed by J. M. Masterton and F. A. Richardson of
    5528             :     // Canada's Atmospheric Environment Service in 1979.
    5529             :     // Reference: Masterson, J., and F. Richardson, 1979: Humidex, a method of quantifying human
    5530             :     // discomfort due to excessive heat and humidity CLI 1-79, Environment Canada, Atmosheric Environment Servic
    5531             :     //        using OutputProcessor::ReqRepVars;
    5532     2568313 :     if (state.dataHeatBalSurfMgr->ManageSurfaceHeatBalancefirstTime) {
    5533        5585 :         for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
    5534       19256 :             SetupOutputVariable(state,
    5535             :                                 "Zone Heat Index",
    5536             :                                 OutputProcessor::Unit::C,
    5537        4814 :                                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndex,
    5538             :                                 OutputProcessor::SOVTimeStepType::Zone,
    5539             :                                 OutputProcessor::SOVStoreType::State,
    5540        9628 :                                 state.dataHeatBal->Zone(ZoneNum).Name);
    5541       19256 :             SetupOutputVariable(state,
    5542             :                                 "Zone Humidity Index",
    5543             :                                 OutputProcessor::Unit::None,
    5544        4814 :                                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidex,
    5545             :                                 OutputProcessor::SOVTimeStepType::Zone,
    5546             :                                 OutputProcessor::SOVStoreType::State,
    5547        9628 :                                 state.dataHeatBal->Zone(ZoneNum).Name);
    5548             :         }
    5549       21128 :         for (int Loop = 1; Loop <= state.dataOutputProcessor->NumOfReqVariables; ++Loop) {
    5550       20357 :             if (state.dataOutputProcessor->ReqRepVars(Loop).VarName == "Zone Heat Index") {
    5551           0 :                 state.dataHeatBalSurfMgr->reportVarHeatIndex = true;
    5552       20357 :             } else if (state.dataOutputProcessor->ReqRepVars(Loop).VarName == "Zone Humidity Index") {
    5553           0 :                 state.dataHeatBalSurfMgr->reportVarHumidex = true;
    5554             :             }
    5555             :         }
    5556             :     }
    5557             : 
    5558             :     // Calculate Heat Index and Humidex.
    5559             :     // The heat index equation set is fit to Fahrenheit units, so the zone air temperature values are first convert to F,
    5560             :     // then heat index is calculated and converted back to C.
    5561     2568313 :     if (state.dataHeatBalSurfMgr->reportVarHeatIndex || state.dataOutRptTab->displayThermalResilienceSummary) {
    5562             :         // Constance for heat index regression equation of Rothfusz.
    5563      942558 :         Real64 constexpr c1 = -42.379;
    5564      942558 :         Real64 constexpr c2 = 2.04901523;
    5565      942558 :         Real64 constexpr c3 = 10.14333127;
    5566      942558 :         Real64 constexpr c4 = -.22475541;
    5567      942558 :         Real64 constexpr c5 = -.00683783;
    5568      942558 :         Real64 constexpr c6 = -.05481717;
    5569      942558 :         Real64 constexpr c7 = .00122874;
    5570      942558 :         Real64 constexpr c8 = .00085282;
    5571      942558 :         Real64 constexpr c9 = -.00000199;
    5572     5667186 :         for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
    5573     4724628 :             Real64 const ZoneT = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).ZTAV;
    5574     4724628 :             Real64 const ZoneW = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).ZoneAirHumRatAvg;
    5575     4724628 :             Real64 const ZoneRH = Psychrometrics::PsyRhFnTdbWPb(state, ZoneT, ZoneW, state.dataEnvrn->OutBaroPress) * 100.0;
    5576     4724628 :             Real64 const ZoneTF = ZoneT * (9.0 / 5.0) + 32.0;
    5577             :             Real64 HI;
    5578             : 
    5579     4724628 :             if (ZoneTF < 80) {
    5580     4016756 :                 HI = 0.5 * (ZoneTF + 61.0 + (ZoneTF - 68.0) * 1.2 + (ZoneRH * 0.094));
    5581             :             } else {
    5582     2123616 :                 HI = c1 + c2 * ZoneTF + c3 * ZoneRH + c4 * ZoneTF * ZoneRH + c5 * ZoneTF * ZoneTF + c6 * ZoneRH * ZoneRH +
    5583     1415744 :                      c7 * ZoneTF * ZoneTF * ZoneRH + c8 * ZoneTF * ZoneRH * ZoneRH + c9 * ZoneTF * ZoneTF * ZoneRH * ZoneRH;
    5584      707872 :                 if (ZoneRH < 13 && ZoneTF < 112) {
    5585       29848 :                     HI -= (13 - ZoneRH) / 4 * std::sqrt((17 - abs(ZoneTF - 95)) / 17);
    5586      678024 :                 } else if (ZoneRH > 85 && ZoneTF < 87) {
    5587        8362 :                     HI += (ZoneRH - 85) / 10 * (87 - ZoneTF) / 5;
    5588             :                 }
    5589             :             }
    5590     4724628 :             HI = (HI - 32.0) * (5.0 / 9.0);
    5591     4724628 :             state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndex = HI;
    5592             :         }
    5593             :     }
    5594     2568313 :     if (state.dataHeatBalSurfMgr->reportVarHumidex || state.dataOutRptTab->displayThermalResilienceSummary) {
    5595     5667186 :         for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
    5596     4724628 :             Real64 const ZoneW = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).ZoneAirHumRatAvg;
    5597     4724628 :             Real64 const ZoneT = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).ZTAV;
    5598     4724628 :             Real64 const TDewPointK = Psychrometrics::PsyTdpFnWPb(state, ZoneW, state.dataEnvrn->OutBaroPress) + DataGlobalConstants::KelvinConv;
    5599     4724628 :             Real64 const e = 6.11 * std::exp(5417.7530 * ((1 / 273.16) - (1 / TDewPointK)));
    5600     4724628 :             Real64 const h = 5.0 / 9.0 * (e - 10.0);
    5601     4724628 :             Real64 const Humidex = ZoneT + h;
    5602     4724628 :             state.dataHeatBal->Resilience(ZoneNum).ZoneHumidex = Humidex;
    5603             :         }
    5604             :     }
    5605     2568313 : }
    5606             : 
    5607      942558 : void ReportThermalResilience(EnergyPlusData &state)
    5608             : {
    5609             : 
    5610      942558 :     int HINoBins = 5;                     // Heat Index range - number of bins
    5611      942558 :     int HumidexNoBins = 5;                // Humidex range - number of bins
    5612      942558 :     int SETNoBins = 5;                    // SET report column numbers
    5613      942558 :     int ColdHourOfSafetyNoBins = 5;       // Cold Stress Hour of Safety number of columns
    5614      942558 :     int HeatHourOfSafetyNoBins = 5;       // Heat Stress Hour of Safety number of columns
    5615      942558 :     int UnmetDegreeHourNoBins = 6;        // Unmet Degree Hour number of columns
    5616      942558 :     int DiscomfortWtExceedHourNoBins = 4; // Unmet Degree Hour number of columns
    5617             : 
    5618     1885116 :     Array1D_bool reportPeriodFlags;
    5619      942558 :     if (state.dataWeatherManager->TotReportPers > 0) {
    5620        5376 :         reportPeriodFlags.dimension(state.dataWeatherManager->TotThermalReportPers, false);
    5621       10752 :         General::findReportPeriodIdx(
    5622       10752 :             state, state.dataWeatherManager->ThermalReportPeriodInput, state.dataWeatherManager->TotThermalReportPers, reportPeriodFlags);
    5623             :     }
    5624             : 
    5625      942558 :     auto &ort(state.dataOutRptTab);
    5626      949470 :     for (int i = 1; i <= state.dataWeatherManager->TotThermalReportPers; i++) {
    5627        6912 :         if (reportPeriodFlags(i)) {
    5628           0 :             int curResMeterNumber = ort->meterNumTotalsBEPS(1);
    5629           0 :             state.dataWeatherManager->ThermalReportPeriodInput(i).totalElectricityUse += GetCurrentMeterValue(state, curResMeterNumber);
    5630             :         }
    5631             :     }
    5632             : 
    5633      942558 :     if (state.dataHeatBalSurfMgr->reportThermalResilienceFirstTime) {
    5634         656 :         if (state.dataHeatBal->TotPeople == 0) state.dataHeatBalSurfMgr->hasPierceSET = false;
    5635        3453 :         for (int iPeople = 1; iPeople <= state.dataHeatBal->TotPeople; ++iPeople) {
    5636        2797 :             if (!state.dataHeatBal->People(iPeople).Pierce) {
    5637        2786 :                 state.dataHeatBalSurfMgr->hasPierceSET = false;
    5638             :             }
    5639             :         }
    5640        4109 :         for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
    5641             :             // the whole period
    5642             :             // user specified reporting period
    5643        3458 :             for (int i = 1; i <= state.dataWeatherManager->TotThermalReportPers; i++) {
    5644           5 :                 state.dataHeatBalFanSys->ZoneHeatIndexHourBinsRepPeriod(ZoneNum, i).assign(HINoBins, 0.0);
    5645           5 :                 state.dataHeatBalFanSys->ZoneHeatIndexOccuHourBinsRepPeriod(ZoneNum, i).assign(HINoBins, 0.0);
    5646           5 :                 state.dataHeatBalFanSys->ZoneHeatIndexOccupiedHourBinsRepPeriod(ZoneNum, i).assign(HINoBins, 0.0);
    5647           5 :                 state.dataHeatBalFanSys->ZoneHumidexHourBinsRepPeriod(ZoneNum, i).assign(HumidexNoBins, 0.0);
    5648           5 :                 state.dataHeatBalFanSys->ZoneHumidexOccupiedHourBinsRepPeriod(ZoneNum, i).assign(HumidexNoBins, 0.0);
    5649           5 :                 state.dataHeatBalFanSys->ZoneHumidexOccuHourBinsRepPeriod(ZoneNum, i).assign(HumidexNoBins, 0.0);
    5650           5 :                 if (state.dataHeatBalSurfMgr->hasPierceSET) {
    5651           5 :                     state.dataHeatBalFanSys->ZoneLowSETHoursRepPeriod(ZoneNum, i).assign(SETNoBins, 0.0);
    5652           5 :                     state.dataHeatBalFanSys->ZoneHighSETHoursRepPeriod(ZoneNum, i).assign(SETNoBins, 0.0);
    5653             :                 }
    5654           5 :                 state.dataHeatBalFanSys->ZoneColdHourOfSafetyBinsRepPeriod(ZoneNum, i).assign(ColdHourOfSafetyNoBins, 0.0);
    5655           5 :                 state.dataHeatBalFanSys->ZoneHeatHourOfSafetyBinsRepPeriod(ZoneNum, i).assign(HeatHourOfSafetyNoBins, 0.0);
    5656           5 :                 state.dataHeatBalFanSys->ZoneUnmetDegreeHourBinsRepPeriod(ZoneNum, i).assign(UnmetDegreeHourNoBins, 0.0);
    5657           5 :                 state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccuHourBinsRepPeriod(ZoneNum, i).assign(DiscomfortWtExceedHourNoBins, 0.0);
    5658           5 :                 state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccupiedHourBinsRepPeriod(ZoneNum, i).assign(DiscomfortWtExceedHourNoBins, 0.0);
    5659             :             }
    5660        3453 :             state.dataHeatBalFanSys->lowSETLongestHoursRepPeriod = 0.0;
    5661        3453 :             state.dataHeatBalFanSys->highSETLongestHoursRepPeriod = 0.0;
    5662        3453 :             state.dataHeatBalFanSys->lowSETLongestStartRepPeriod = 0.0;
    5663        3453 :             state.dataHeatBalFanSys->highSETLongestStartRepPeriod = 0.0;
    5664             :         }
    5665         656 :         state.dataHeatBalSurfMgr->lowSETLongestHours.assign(state.dataGlobal->NumOfZones, 0.0);
    5666         656 :         state.dataHeatBalSurfMgr->highSETLongestHours.assign(state.dataGlobal->NumOfZones, 0.0);
    5667         656 :         state.dataHeatBalSurfMgr->lowSETLongestStart.assign(state.dataGlobal->NumOfZones, 0.0);
    5668         656 :         state.dataHeatBalSurfMgr->highSETLongestStart.assign(state.dataGlobal->NumOfZones, 0.0);
    5669         656 :         state.dataHeatBalSurfMgr->reportThermalResilienceFirstTime = false;
    5670             :     }
    5671             : 
    5672             :     // Count hours only during weather simulation periods
    5673      942558 :     if (DataGlobalConstants::KindOfSim::RunPeriodWeather == state.dataGlobal->KindOfSim && !state.dataGlobal->WarmupFlag) {
    5674             :         // use default value if there are no user inputs
    5675       70176 :         Real64 ColdTempThresh = 15.56;
    5676       70176 :         Real64 HeatTempThresh = 30.0;
    5677             :         // Trace current time step Zone Pierce SET; NaN if no occupant or SET not calculated
    5678             :         // Record last time step SET to trace SET unmet duration;
    5679             : 
    5680       70176 :         Real64 valueNotInit = -999.0;
    5681       70176 :         Real64 nearThreshold = 1.0;
    5682      491232 :         for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
    5683      421056 :             state.dataHeatBal->Resilience(ZoneNum).PierceSET = valueNotInit;
    5684      421056 :             state.dataHeatBal->Resilience(ZoneNum).PMV = valueNotInit;
    5685             :         }
    5686      421056 :         for (int iPeople = 1; iPeople <= state.dataHeatBal->TotPeople; ++iPeople) {
    5687      350880 :             int ZoneNum = state.dataHeatBal->People(iPeople).ZonePtr;
    5688      701760 :             state.dataHeatBal->Resilience(ZoneNum).ZoneNumOcc = state.dataHeatBal->People(iPeople).NumberOfPeople *
    5689      350880 :                                                                 GetCurrentScheduleValue(state, state.dataHeatBal->People(iPeople).NumberOfPeoplePtr);
    5690      350880 :             state.dataHeatBal->Resilience(ZoneNum).ZonePierceSETLastStep = state.dataHeatBal->Resilience(ZoneNum).ZonePierceSET;
    5691      350880 :             if (state.dataHeatBal->People(iPeople).Pierce) {
    5692           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZonePierceSET = state.dataThermalComforts->ThermalComfortData(iPeople).PierceSET;
    5693             :             } else {
    5694      350880 :                 state.dataHeatBal->Resilience(ZoneNum).ZonePierceSET = -1;
    5695             :             }
    5696             : 
    5697      350880 :             Real64 NumOcc = state.dataHeatBal->Resilience(ZoneNum).ZoneNumOcc;
    5698      350880 :             Real64 Temperature = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).ZTAV;
    5699      350880 :             ColdTempThresh = state.dataHeatBal->People(iPeople).ColdStressTempThresh;
    5700      350880 :             bool &CrossedColdThresh = state.dataHeatBal->Resilience(ZoneNum).CrossedColdThresh;
    5701      350880 :             if (Temperature > ColdTempThresh) { // safe
    5702      350880 :                 if (!CrossedColdThresh) {
    5703             :                     // compute the number of hours before threshold is reached
    5704      350880 :                     state.dataHeatBal->Resilience(ZoneNum).ZoneColdHourOfSafetyBins[0] += state.dataGlobal->TimeStepZone;
    5705             :                 }
    5706             :             } else { // danger
    5707             :                 // compute the total number of hours when the zone temperature falls in the dangerous range throughout the reporting period
    5708           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneColdHourOfSafetyBins[2] += state.dataGlobal->TimeStepZone;
    5709           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneColdHourOfSafetyBins[3] += NumOcc * state.dataGlobal->TimeStepZone;
    5710           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneColdHourOfSafetyBins[4] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5711             :                 // first time crossing threshold
    5712           0 :                 if (!CrossedColdThresh) {
    5713             :                     // compute the time when the zone crosses the threshold temperature
    5714             :                     int encodedMonDayHrMin;
    5715           0 :                     General::EncodeMonDayHrMin(encodedMonDayHrMin,
    5716           0 :                                                state.dataEnvrn->Month,
    5717           0 :                                                state.dataEnvrn->DayOfMonth,
    5718           0 :                                                state.dataGlobal->HourOfDay,
    5719           0 :                                                state.dataGlobal->TimeStepZone * (state.dataGlobal->TimeStep - 1) * 60);
    5720             :                     // fixme: not sure how to aggregate by zone
    5721           0 :                     state.dataHeatBal->Resilience(ZoneNum).ZoneColdHourOfSafetyBins[1] = encodedMonDayHrMin;
    5722           0 :                     CrossedColdThresh = true;
    5723             :                 }
    5724             :             }
    5725      350880 :             HeatTempThresh = state.dataHeatBal->People(iPeople).HeatStressTempThresh;
    5726      350880 :             bool &CrossedHeatThresh = state.dataHeatBal->Resilience(ZoneNum).CrossedHeatThresh;
    5727      350880 :             if (Temperature < HeatTempThresh) { // safe
    5728      349911 :                 if (!CrossedHeatThresh) {
    5729             :                     // compute the number of hours before threshold is reached
    5730      245354 :                     state.dataHeatBal->Resilience(ZoneNum).ZoneHeatHourOfSafetyBins[0] += state.dataGlobal->TimeStepZone;
    5731             :                 }
    5732             :             } else { // danger
    5733             :                 // compute the total number of hours when the zone temperature falls in the dangerous range throughout the reporting period
    5734         969 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatHourOfSafetyBins[2] += state.dataGlobal->TimeStepZone;
    5735         969 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatHourOfSafetyBins[3] += NumOcc * state.dataGlobal->TimeStepZone;
    5736         969 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatHourOfSafetyBins[4] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5737             :                 // first time crossing threshold
    5738         969 :                 if (!CrossedHeatThresh) {
    5739             :                     // compute the time when the zone crosses the threshold temperature
    5740             :                     int encodedMonDayHrMin;
    5741          20 :                     General::EncodeMonDayHrMin(encodedMonDayHrMin,
    5742           5 :                                                state.dataEnvrn->Month,
    5743           5 :                                                state.dataEnvrn->DayOfMonth,
    5744           5 :                                                state.dataGlobal->HourOfDay,
    5745           5 :                                                state.dataGlobal->TimeStepZone * (state.dataGlobal->TimeStep - 1) * 60);
    5746           5 :                     state.dataHeatBal->Resilience(ZoneNum).ZoneHeatHourOfSafetyBins[1] = encodedMonDayHrMin;
    5747           5 :                     CrossedHeatThresh = true;
    5748             :                 }
    5749             :             }
    5750             : 
    5751      350880 :             Real64 VeryHotPMVThresh = 3.0;
    5752      350880 :             Real64 WarmPMVThresh = 0.7;
    5753      350880 :             Real64 CoolPMVThresh = -0.7;
    5754      350880 :             Real64 VeryColdPMVThresh = -3.0;
    5755      350880 :             Real64 PMV = state.dataThermalComforts->ThermalComfortData(iPeople).FangerPMV;
    5756      350880 :             if (PMV < VeryColdPMVThresh) {
    5757           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneDiscomfortWtExceedOccuHourBins[0] +=
    5758           0 :                     (VeryColdPMVThresh - PMV) * NumOcc * state.dataGlobal->TimeStepZone;
    5759           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneDiscomfortWtExceedOccupiedHourBins[0] +=
    5760           0 :                     (VeryColdPMVThresh - PMV) * (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5761             :             }
    5762      350880 :             if (PMV < CoolPMVThresh) {
    5763           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneDiscomfortWtExceedOccuHourBins[1] +=
    5764           0 :                     (CoolPMVThresh - PMV) * NumOcc * state.dataGlobal->TimeStepZone;
    5765           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneDiscomfortWtExceedOccupiedHourBins[1] +=
    5766           0 :                     (CoolPMVThresh - PMV) * (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5767             :             }
    5768      350880 :             if (PMV > WarmPMVThresh) {
    5769           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneDiscomfortWtExceedOccuHourBins[2] +=
    5770           0 :                     (PMV - WarmPMVThresh) * NumOcc * state.dataGlobal->TimeStepZone;
    5771           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneDiscomfortWtExceedOccupiedHourBins[2] +=
    5772           0 :                     (PMV - WarmPMVThresh) * (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5773             :             }
    5774      350880 :             if (PMV > VeryHotPMVThresh) {
    5775           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneDiscomfortWtExceedOccuHourBins[3] +=
    5776           0 :                     (PMV - VeryHotPMVThresh) * NumOcc * state.dataGlobal->TimeStepZone;
    5777           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneDiscomfortWtExceedOccupiedHourBins[3] +=
    5778           0 :                     (PMV - VeryHotPMVThresh) * (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5779             :             }
    5780             : 
    5781             :             // check whether PierceSET changed for people in a zone
    5782      350880 :             if (state.dataHeatBal->Resilience(ZoneNum).PierceSET < valueNotInit + nearThreshold) {
    5783      350880 :                 state.dataHeatBal->Resilience(ZoneNum).PierceSET = state.dataHeatBal->Resilience(ZoneNum).ZonePierceSET;
    5784             :             } else {
    5785           0 :                 if (state.dataHeatBal->Resilience(ZoneNum).PierceSET != state.dataHeatBal->Resilience(ZoneNum).ZonePierceSET) {
    5786           0 :                     ShowRecurringWarningErrorAtEnd(state,
    5787           0 :                                                    fmt::format("Zone {} has multiple people objects with different PierceSet.", ZoneNum),
    5788           0 :                                                    state.dataHeatBalFanSys->PierceSETerrorIndex);
    5789             :                 }
    5790             :             }
    5791             : 
    5792             :             // check whether PierceSET, PMV, etc. changed for different people in a zone
    5793      350880 :             if (state.dataHeatBal->Resilience(ZoneNum).PMV < valueNotInit + nearThreshold) {
    5794      350880 :                 state.dataHeatBal->Resilience(ZoneNum).PMV = PMV;
    5795             :             } else {
    5796           0 :                 if (state.dataHeatBal->Resilience(ZoneNum).PMV != PMV) {
    5797           0 :                     ShowRecurringWarningErrorAtEnd(state,
    5798           0 :                                                    fmt::format("Zone {} has multiple people objects with different PMV.", ZoneNum),
    5799           0 :                                                    state.dataHeatBalFanSys->PMVerrorIndex);
    5800             :                 }
    5801             :             }
    5802             : 
    5803      350880 :             for (int i = 1; i <= state.dataWeatherManager->TotThermalReportPers; i++) {
    5804           0 :                 if (reportPeriodFlags(i)) {
    5805           0 :                     int ReportPeriodIdx = i;
    5806           0 :                     ColdTempThresh = state.dataHeatBal->People(iPeople).ColdStressTempThresh;
    5807           0 :                     bool &CrossedColdThreshRepPeriod = state.dataHeatBalFanSys->CrossedColdThreshRepPeriod(ZoneNum, ReportPeriodIdx);
    5808           0 :                     if (Temperature > ColdTempThresh) { // safe
    5809           0 :                         if (!CrossedColdThreshRepPeriod) {
    5810             :                             // compute the number of hours before threshold is reached
    5811           0 :                             state.dataHeatBalFanSys->ZoneColdHourOfSafetyBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] += state.dataGlobal->TimeStepZone;
    5812             :                         }
    5813             :                     } else { // danger
    5814             :                         // compute the total number of hours when the zone temperature falls in the dangerous range throughout the reporting period
    5815           0 :                         state.dataHeatBalFanSys->ZoneColdHourOfSafetyBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] += state.dataGlobal->TimeStepZone;
    5816           0 :                         state.dataHeatBalFanSys->ZoneColdHourOfSafetyBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] +=
    5817           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    5818           0 :                         state.dataHeatBalFanSys->ZoneColdHourOfSafetyBinsRepPeriod(ZoneNum, ReportPeriodIdx)[4] +=
    5819           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5820             :                         // first time crossing threshold
    5821           0 :                         if (!CrossedColdThreshRepPeriod) {
    5822             :                             // compute the time when the zone crosses the threshold temperature
    5823             :                             int encodedMonDayHrMin;
    5824           0 :                             General::EncodeMonDayHrMin(encodedMonDayHrMin,
    5825           0 :                                                        state.dataEnvrn->Month,
    5826           0 :                                                        state.dataEnvrn->DayOfMonth,
    5827           0 :                                                        state.dataGlobal->HourOfDay,
    5828           0 :                                                        state.dataGlobal->TimeStepZone * (state.dataGlobal->TimeStep - 1) * 60);
    5829             :                             // fixme: not sure how to aggregate by zone
    5830           0 :                             state.dataHeatBalFanSys->ZoneColdHourOfSafetyBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] = encodedMonDayHrMin;
    5831           0 :                             CrossedColdThreshRepPeriod = true;
    5832             :                         }
    5833             :                     }
    5834           0 :                     HeatTempThresh = state.dataHeatBal->People(iPeople).HeatStressTempThresh;
    5835           0 :                     bool &CrossedHeatThreshRepPeriod = state.dataHeatBalFanSys->CrossedHeatThreshRepPeriod(ZoneNum, ReportPeriodIdx);
    5836           0 :                     if (Temperature < HeatTempThresh) { // safe
    5837           0 :                         if (!CrossedHeatThreshRepPeriod) {
    5838             :                             // compute the number of hours before threshold is reached
    5839           0 :                             state.dataHeatBalFanSys->ZoneHeatHourOfSafetyBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] += state.dataGlobal->TimeStepZone;
    5840             :                         }
    5841             :                     } else { // danger
    5842             :                         // compute the total number of hours when the zone temperature falls in the dangerous range throughout the reporting period
    5843           0 :                         state.dataHeatBalFanSys->ZoneHeatHourOfSafetyBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] += state.dataGlobal->TimeStepZone;
    5844           0 :                         state.dataHeatBalFanSys->ZoneHeatHourOfSafetyBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] +=
    5845           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    5846           0 :                         state.dataHeatBalFanSys->ZoneHeatHourOfSafetyBinsRepPeriod(ZoneNum, ReportPeriodIdx)[4] +=
    5847           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5848             :                         // first time crossing threshold
    5849           0 :                         if (!CrossedHeatThreshRepPeriod) {
    5850             :                             // compute the time when the zone crosses the threshold temperature
    5851             :                             int encodedMonDayHrMin;
    5852           0 :                             General::EncodeMonDayHrMin(encodedMonDayHrMin,
    5853           0 :                                                        state.dataEnvrn->Month,
    5854           0 :                                                        state.dataEnvrn->DayOfMonth,
    5855           0 :                                                        state.dataGlobal->HourOfDay,
    5856           0 :                                                        state.dataGlobal->TimeStepZone * (state.dataGlobal->TimeStep - 1) * 60);
    5857           0 :                             state.dataHeatBalFanSys->ZoneHeatHourOfSafetyBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] = encodedMonDayHrMin;
    5858           0 :                             CrossedHeatThreshRepPeriod = true;
    5859             :                         }
    5860             :                     }
    5861             : 
    5862           0 :                     Real64 VeryHotPMVThresh = 3.0;
    5863           0 :                     Real64 WarmPMVThresh = 0.7;
    5864           0 :                     Real64 CoolPMVThresh = -0.7;
    5865           0 :                     Real64 VeryColdPMVThresh = -3.0;
    5866           0 :                     Real64 PMV = state.dataThermalComforts->ThermalComfortData(iPeople).FangerPMV;
    5867           0 :                     if (PMV < VeryColdPMVThresh) {
    5868           0 :                         state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] +=
    5869           0 :                             (VeryColdPMVThresh - PMV) * NumOcc * state.dataGlobal->TimeStepZone;
    5870           0 :                         state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] +=
    5871           0 :                             (VeryColdPMVThresh - PMV) * (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5872             :                     }
    5873           0 :                     if (PMV < CoolPMVThresh) {
    5874           0 :                         state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] +=
    5875           0 :                             (CoolPMVThresh - PMV) * NumOcc * state.dataGlobal->TimeStepZone;
    5876           0 :                         state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] +=
    5877           0 :                             (CoolPMVThresh - PMV) * (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5878             :                     }
    5879           0 :                     if (PMV > WarmPMVThresh) {
    5880           0 :                         state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] +=
    5881           0 :                             (PMV - WarmPMVThresh) * NumOcc * state.dataGlobal->TimeStepZone;
    5882           0 :                         state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] +=
    5883           0 :                             (PMV - WarmPMVThresh) * (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5884             :                     }
    5885           0 :                     if (PMV > VeryHotPMVThresh) {
    5886           0 :                         state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] +=
    5887           0 :                             (PMV - VeryHotPMVThresh) * NumOcc * state.dataGlobal->TimeStepZone;
    5888           0 :                         state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] +=
    5889           0 :                             (PMV - VeryHotPMVThresh) * (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5890             :                     }
    5891             :                 }
    5892             :             }
    5893             :         }
    5894      491232 :         for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
    5895      421056 :             Real64 HI = state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndex;
    5896      421056 :             Real64 Humidex = state.dataHeatBal->Resilience(ZoneNum).ZoneHumidex;
    5897             : 
    5898      421056 :             Real64 NumOcc = state.dataHeatBal->Resilience(ZoneNum).ZoneNumOcc;
    5899      421056 :             if (HI <= 26.7) {
    5900      405660 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexHourBins[0] += state.dataGlobal->TimeStepZone;
    5901      405660 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexOccuHourBins[0] += NumOcc * state.dataGlobal->TimeStepZone;
    5902      405660 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexOccupiedHourBins[0] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5903       15396 :             } else if (HI > 26.7 && HI <= 32.2) {
    5904       15275 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexHourBins[1] += state.dataGlobal->TimeStepZone;
    5905       15275 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexOccuHourBins[1] += NumOcc * state.dataGlobal->TimeStepZone;
    5906       15275 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexOccupiedHourBins[1] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5907         121 :             } else if (HI > 32.2 && HI <= 39.4) {
    5908         121 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexHourBins[2] += state.dataGlobal->TimeStepZone;
    5909         121 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexOccuHourBins[2] += NumOcc * state.dataGlobal->TimeStepZone;
    5910         121 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexOccupiedHourBins[2] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5911           0 :             } else if (HI > 39.4 && HI <= 51.7) {
    5912           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexHourBins[3] += state.dataGlobal->TimeStepZone;
    5913           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexOccuHourBins[3] += NumOcc * state.dataGlobal->TimeStepZone;
    5914           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexOccupiedHourBins[3] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5915             :             } else {
    5916           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexHourBins[4] += state.dataGlobal->TimeStepZone;
    5917           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexOccuHourBins[4] += NumOcc * state.dataGlobal->TimeStepZone;
    5918           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHeatIndexOccupiedHourBins[4] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5919             :             }
    5920             : 
    5921      421056 :             if (Humidex <= 29) {
    5922      404701 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexHourBins[0] += state.dataGlobal->TimeStepZone;
    5923      404701 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexOccuHourBins[0] += NumOcc * state.dataGlobal->TimeStepZone;
    5924      404701 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexOccupiedHourBins[0] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5925       16355 :             } else if (Humidex > 29 && Humidex <= 40) {
    5926       16355 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexHourBins[1] += state.dataGlobal->TimeStepZone;
    5927       16355 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexOccuHourBins[1] += NumOcc * state.dataGlobal->TimeStepZone;
    5928       16355 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexOccupiedHourBins[1] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5929           0 :             } else if (Humidex > 40 && Humidex <= 45) {
    5930           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexHourBins[2] += state.dataGlobal->TimeStepZone;
    5931           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexOccuHourBins[2] += NumOcc * state.dataGlobal->TimeStepZone;
    5932           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexOccupiedHourBins[2] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5933           0 :             } else if (Humidex > 45 && Humidex <= 50) {
    5934           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexHourBins[3] += state.dataGlobal->TimeStepZone;
    5935           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexOccuHourBins[3] += NumOcc * state.dataGlobal->TimeStepZone;
    5936           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexOccupiedHourBins[3] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5937             :             } else {
    5938           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexHourBins[4] += state.dataGlobal->TimeStepZone;
    5939           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexOccuHourBins[4] += NumOcc * state.dataGlobal->TimeStepZone;
    5940           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneHumidexOccupiedHourBins[4] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5941             :             }
    5942             : 
    5943      421056 :             Real64 Temperature = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).ZTAV;
    5944      421056 :             Real64 CoolingSetpoint = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ZoneNum);
    5945      421056 :             Real64 HeatingSetpoint = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ZoneNum);
    5946             : 
    5947      421056 :             if ((CoolingSetpoint > 0) && (Temperature > CoolingSetpoint)) {
    5948        8566 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneUnmetDegreeHourBins[0] += (Temperature - CoolingSetpoint) * state.dataGlobal->TimeStepZone;
    5949        8566 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneUnmetDegreeHourBins[1] +=
    5950        8566 :                     NumOcc * (Temperature - CoolingSetpoint) * state.dataGlobal->TimeStepZone;
    5951        8566 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneUnmetDegreeHourBins[2] +=
    5952        8566 :                     (NumOcc > 0) * (Temperature - CoolingSetpoint) * state.dataGlobal->TimeStepZone;
    5953             :             }
    5954      421056 :             if ((HeatingSetpoint > 0) && (Temperature < HeatingSetpoint)) {
    5955       16208 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneUnmetDegreeHourBins[3] += (HeatingSetpoint - Temperature) * state.dataGlobal->TimeStepZone;
    5956       16208 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneUnmetDegreeHourBins[4] +=
    5957       16208 :                     NumOcc * (HeatingSetpoint - Temperature) * state.dataGlobal->TimeStepZone;
    5958       16208 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneUnmetDegreeHourBins[5] +=
    5959       16208 :                     (NumOcc > 0) * (HeatingSetpoint - Temperature) * state.dataGlobal->TimeStepZone;
    5960             :             }
    5961             : 
    5962      421056 :             if (state.dataHeatBalSurfMgr->hasPierceSET) {
    5963             :                 int encodedMonDayHrMin;
    5964           0 :                 Real64 PierceSET = state.dataHeatBal->Resilience(ZoneNum).ZonePierceSET;
    5965           0 :                 Real64 PierceSETLast = state.dataHeatBal->Resilience(ZoneNum).ZonePierceSETLastStep;
    5966             : 
    5967           0 :                 if (PierceSET <= 12.2) {
    5968           0 :                     state.dataHeatBal->Resilience(ZoneNum).ZoneLowSETHours[0] += (12.2 - PierceSET) * state.dataGlobal->TimeStepZone;
    5969           0 :                     state.dataHeatBal->Resilience(ZoneNum).ZoneLowSETHours[1] += (12.2 - PierceSET) * NumOcc * state.dataGlobal->TimeStepZone;
    5970           0 :                     state.dataHeatBal->Resilience(ZoneNum).ZoneLowSETHours[2] += (12.2 - PierceSET) * (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5971             :                     // Reset duration when last step is out of range.
    5972           0 :                     if (PierceSETLast == -1 || PierceSETLast > 12.2) {
    5973           0 :                         General::EncodeMonDayHrMin(encodedMonDayHrMin,
    5974           0 :                                                    state.dataEnvrn->Month,
    5975           0 :                                                    state.dataEnvrn->DayOfMonth,
    5976           0 :                                                    state.dataGlobal->HourOfDay,
    5977           0 :                                                    state.dataGlobal->TimeStepZone * (state.dataGlobal->TimeStep - 1) * 60);
    5978           0 :                         state.dataHeatBalSurfMgr->lowSETLongestHours[ZoneNum - 1] = 0;
    5979           0 :                         state.dataHeatBalSurfMgr->lowSETLongestStart[ZoneNum - 1] = encodedMonDayHrMin;
    5980             :                     }
    5981             :                     // Keep the longest duration record.
    5982           0 :                     state.dataHeatBalSurfMgr->lowSETLongestHours[ZoneNum - 1] += state.dataGlobal->TimeStepZone;
    5983           0 :                     if (state.dataHeatBalSurfMgr->lowSETLongestHours[ZoneNum - 1] > state.dataHeatBal->Resilience(ZoneNum).ZoneLowSETHours[3] &&
    5984           0 :                         state.dataHeatBal->Resilience(ZoneNum).ZoneNumOcc > 0) {
    5985           0 :                         state.dataHeatBal->Resilience(ZoneNum).ZoneLowSETHours[3] = state.dataHeatBalSurfMgr->lowSETLongestHours[ZoneNum - 1];
    5986           0 :                         state.dataHeatBal->Resilience(ZoneNum).ZoneLowSETHours[4] = state.dataHeatBalSurfMgr->lowSETLongestStart[ZoneNum - 1];
    5987             :                     }
    5988           0 :                 } else if (PierceSET > 30) {
    5989           0 :                     state.dataHeatBal->Resilience(ZoneNum).ZoneHighSETHours[0] += (PierceSET - 30) * state.dataGlobal->TimeStepZone;
    5990           0 :                     state.dataHeatBal->Resilience(ZoneNum).ZoneHighSETHours[1] += (PierceSET - 30) * NumOcc * state.dataGlobal->TimeStepZone;
    5991           0 :                     state.dataHeatBal->Resilience(ZoneNum).ZoneHighSETHours[2] += (PierceSET - 30) * (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    5992           0 :                     if (PierceSETLast == -1 || PierceSETLast <= 30) {
    5993           0 :                         General::EncodeMonDayHrMin(encodedMonDayHrMin,
    5994           0 :                                                    state.dataEnvrn->Month,
    5995           0 :                                                    state.dataEnvrn->DayOfMonth,
    5996           0 :                                                    state.dataGlobal->HourOfDay,
    5997           0 :                                                    state.dataGlobal->TimeStepZone * (state.dataGlobal->TimeStep - 1) * 60);
    5998           0 :                         state.dataHeatBalSurfMgr->highSETLongestHours[ZoneNum - 1] = 0;
    5999           0 :                         state.dataHeatBalSurfMgr->highSETLongestStart[ZoneNum - 1] = encodedMonDayHrMin;
    6000             :                     }
    6001           0 :                     state.dataHeatBalSurfMgr->highSETLongestHours[ZoneNum - 1] += state.dataGlobal->TimeStepZone;
    6002           0 :                     if (state.dataHeatBalSurfMgr->highSETLongestHours[ZoneNum - 1] > state.dataHeatBal->Resilience(ZoneNum).ZoneHighSETHours[3] &&
    6003           0 :                         state.dataHeatBal->Resilience(ZoneNum).ZoneNumOcc > 0) {
    6004           0 :                         state.dataHeatBal->Resilience(ZoneNum).ZoneHighSETHours[3] = state.dataHeatBalSurfMgr->highSETLongestHours[ZoneNum - 1];
    6005           0 :                         state.dataHeatBal->Resilience(ZoneNum).ZoneHighSETHours[4] = state.dataHeatBalSurfMgr->highSETLongestStart[ZoneNum - 1];
    6006             :                     }
    6007             :                 }
    6008             : 
    6009           0 :                 if (state.dataHeatBal->Resilience(ZoneNum).ZoneNumOcc == 0) {
    6010           0 :                     state.dataHeatBalSurfMgr->lowSETLongestHours[ZoneNum - 1] = 0;
    6011           0 :                     state.dataHeatBalSurfMgr->highSETLongestHours[ZoneNum - 1] = 0;
    6012             :                 }
    6013             :             }
    6014             : 
    6015      421056 :             for (int i = 1; i <= state.dataWeatherManager->TotThermalReportPers; i++) {
    6016           0 :                 if (reportPeriodFlags(i)) {
    6017           0 :                     int ReportPeriodIdx = i;
    6018             : 
    6019           0 :                     if (HI <= 26.7) {
    6020           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] += state.dataGlobal->TimeStepZone;
    6021           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] +=
    6022           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6023           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] +=
    6024           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6025           0 :                     } else if (HI > 26.7 && HI <= 32.2) {
    6026           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] += state.dataGlobal->TimeStepZone;
    6027           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] +=
    6028           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6029           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] +=
    6030           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6031           0 :                     } else if (HI > 32.2 && HI <= 39.4) {
    6032           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] += state.dataGlobal->TimeStepZone;
    6033           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] +=
    6034           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6035           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] +=
    6036           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6037           0 :                     } else if (HI > 39.4 && HI <= 51.7) {
    6038           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] += state.dataGlobal->TimeStepZone;
    6039           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] +=
    6040           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6041           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] +=
    6042           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6043             :                     } else {
    6044           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[4] += state.dataGlobal->TimeStepZone;
    6045           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[4] +=
    6046           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6047           0 :                         state.dataHeatBalFanSys->ZoneHeatIndexOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[4] +=
    6048           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6049             :                     }
    6050             : 
    6051           0 :                     if (Humidex <= 29) {
    6052           0 :                         state.dataHeatBalFanSys->ZoneHumidexHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] += state.dataGlobal->TimeStepZone;
    6053           0 :                         state.dataHeatBalFanSys->ZoneHumidexOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] +=
    6054           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6055           0 :                         state.dataHeatBalFanSys->ZoneHumidexOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] +=
    6056           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6057           0 :                     } else if (Humidex > 29 && Humidex <= 40) {
    6058           0 :                         state.dataHeatBalFanSys->ZoneHumidexHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] += state.dataGlobal->TimeStepZone;
    6059           0 :                         state.dataHeatBalFanSys->ZoneHumidexOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] +=
    6060           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6061           0 :                         state.dataHeatBalFanSys->ZoneHumidexOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] +=
    6062           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6063           0 :                     } else if (Humidex > 40 && Humidex <= 45) {
    6064           0 :                         state.dataHeatBalFanSys->ZoneHumidexHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] += state.dataGlobal->TimeStepZone;
    6065           0 :                         state.dataHeatBalFanSys->ZoneHumidexOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] +=
    6066           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6067           0 :                         state.dataHeatBalFanSys->ZoneHumidexOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] +=
    6068           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6069           0 :                     } else if (Humidex > 45 && Humidex <= 50) {
    6070           0 :                         state.dataHeatBalFanSys->ZoneHumidexHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] += state.dataGlobal->TimeStepZone;
    6071           0 :                         state.dataHeatBalFanSys->ZoneHumidexOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] +=
    6072           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6073           0 :                         state.dataHeatBalFanSys->ZoneHumidexOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] +=
    6074           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6075             :                     } else {
    6076           0 :                         state.dataHeatBalFanSys->ZoneHumidexHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[4] += state.dataGlobal->TimeStepZone;
    6077           0 :                         state.dataHeatBalFanSys->ZoneHumidexOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[4] +=
    6078           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6079           0 :                         state.dataHeatBalFanSys->ZoneHumidexOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[4] +=
    6080           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6081             :                     }
    6082             : 
    6083           0 :                     if (state.dataHeatBalSurfMgr->hasPierceSET) {
    6084             :                         int encodedMonDayHrMin;
    6085           0 :                         Real64 PierceSET = state.dataHeatBal->Resilience(ZoneNum).ZonePierceSET;
    6086           0 :                         Real64 PierceSETLast = state.dataHeatBal->Resilience(ZoneNum).ZonePierceSETLastStep;
    6087           0 :                         if (PierceSET <= 12.2) {
    6088           0 :                             state.dataHeatBalFanSys->ZoneLowSETHoursRepPeriod(ZoneNum, ReportPeriodIdx)[0] +=
    6089           0 :                                 (12.2 - PierceSET) * state.dataGlobal->TimeStepZone;
    6090           0 :                             state.dataHeatBalFanSys->ZoneLowSETHoursRepPeriod(ZoneNum, ReportPeriodIdx)[1] +=
    6091           0 :                                 (12.2 - PierceSET) * NumOcc * state.dataGlobal->TimeStepZone;
    6092           0 :                             state.dataHeatBalFanSys->ZoneLowSETHoursRepPeriod(ZoneNum, ReportPeriodIdx)[2] +=
    6093           0 :                                 (12.2 - PierceSET) * (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6094             :                             // Reset duration when last step is out of range
    6095           0 :                             if (PierceSETLast == -1 || PierceSETLast > 12.2) {
    6096           0 :                                 General::EncodeMonDayHrMin(encodedMonDayHrMin,
    6097           0 :                                                            state.dataEnvrn->Month,
    6098           0 :                                                            state.dataEnvrn->DayOfMonth,
    6099           0 :                                                            state.dataGlobal->HourOfDay,
    6100           0 :                                                            state.dataGlobal->TimeStepZone * (state.dataGlobal->TimeStep - 1) * 60);
    6101           0 :                                 state.dataHeatBalFanSys->lowSETLongestHoursRepPeriod(ZoneNum, ReportPeriodIdx) = 0;
    6102           0 :                                 state.dataHeatBalFanSys->lowSETLongestStartRepPeriod(ZoneNum, ReportPeriodIdx) = encodedMonDayHrMin;
    6103           0 :                             } else if (General::isReportPeriodBeginning(state, ReportPeriodIdx)) { // or when it is the start of the period
    6104           0 :                                 General::EncodeMonDayHrMin(encodedMonDayHrMin,
    6105           0 :                                                            state.dataEnvrn->Month,
    6106           0 :                                                            state.dataEnvrn->DayOfMonth,
    6107           0 :                                                            state.dataGlobal->HourOfDay,
    6108           0 :                                                            state.dataGlobal->TimeStepZone * state.dataGlobal->TimeStep * 60);
    6109           0 :                                 state.dataHeatBalFanSys->highSETLongestHoursRepPeriod(ZoneNum, ReportPeriodIdx) = 0;
    6110           0 :                                 state.dataHeatBalFanSys->highSETLongestStartRepPeriod(ZoneNum, ReportPeriodIdx) = encodedMonDayHrMin;
    6111             :                             }
    6112             :                             // Keep the longest duration record.
    6113           0 :                             state.dataHeatBalFanSys->lowSETLongestHoursRepPeriod(ZoneNum, ReportPeriodIdx) += state.dataGlobal->TimeStepZone;
    6114           0 :                             if (state.dataHeatBalFanSys->lowSETLongestHoursRepPeriod(ZoneNum, ReportPeriodIdx) >
    6115           0 :                                     state.dataHeatBalFanSys->ZoneLowSETHoursRepPeriod(ZoneNum, ReportPeriodIdx)[3] &&
    6116           0 :                                 state.dataHeatBal->Resilience(ZoneNum).ZoneNumOcc > 0) {
    6117           0 :                                 state.dataHeatBalFanSys->ZoneLowSETHoursRepPeriod(ZoneNum, ReportPeriodIdx)[3] =
    6118           0 :                                     state.dataHeatBalFanSys->lowSETLongestHoursRepPeriod(ZoneNum, ReportPeriodIdx);
    6119           0 :                                 state.dataHeatBalFanSys->ZoneLowSETHoursRepPeriod(ZoneNum, ReportPeriodIdx)[4] =
    6120           0 :                                     state.dataHeatBalFanSys->lowSETLongestStartRepPeriod(ZoneNum, ReportPeriodIdx);
    6121             :                             }
    6122           0 :                         } else if (PierceSET > 30) {
    6123           0 :                             state.dataHeatBalFanSys->ZoneHighSETHoursRepPeriod(ZoneNum, ReportPeriodIdx)[0] +=
    6124           0 :                                 (PierceSET - 30) * state.dataGlobal->TimeStepZone;
    6125           0 :                             state.dataHeatBalFanSys->ZoneHighSETHoursRepPeriod(ZoneNum, ReportPeriodIdx)[1] +=
    6126           0 :                                 (PierceSET - 30) * NumOcc * state.dataGlobal->TimeStepZone;
    6127           0 :                             state.dataHeatBalFanSys->ZoneHighSETHoursRepPeriod(ZoneNum, ReportPeriodIdx)[2] +=
    6128           0 :                                 (PierceSET - 30) * (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6129             :                             // Reset duration when last step is out of range.
    6130           0 :                             if (PierceSETLast == -1 || PierceSETLast <= 30) {
    6131           0 :                                 General::EncodeMonDayHrMin(encodedMonDayHrMin,
    6132           0 :                                                            state.dataEnvrn->Month,
    6133           0 :                                                            state.dataEnvrn->DayOfMonth,
    6134           0 :                                                            state.dataGlobal->HourOfDay,
    6135           0 :                                                            state.dataGlobal->TimeStepZone * (state.dataGlobal->TimeStep - 1) * 60);
    6136           0 :                                 state.dataHeatBalFanSys->highSETLongestHoursRepPeriod(ZoneNum, ReportPeriodIdx) = 0;
    6137           0 :                                 state.dataHeatBalFanSys->highSETLongestStartRepPeriod(ZoneNum, ReportPeriodIdx) = encodedMonDayHrMin;
    6138           0 :                             } else if (General::isReportPeriodBeginning(state, ReportPeriodIdx)) { // or when it is the start of the period
    6139           0 :                                 General::EncodeMonDayHrMin(encodedMonDayHrMin,
    6140           0 :                                                            state.dataEnvrn->Month,
    6141           0 :                                                            state.dataEnvrn->DayOfMonth,
    6142           0 :                                                            state.dataGlobal->HourOfDay,
    6143           0 :                                                            state.dataGlobal->TimeStepZone * state.dataGlobal->TimeStep * 60);
    6144           0 :                                 state.dataHeatBalFanSys->highSETLongestHoursRepPeriod(ZoneNum, ReportPeriodIdx) = 0;
    6145           0 :                                 state.dataHeatBalFanSys->highSETLongestStartRepPeriod(ZoneNum, ReportPeriodIdx) = encodedMonDayHrMin;
    6146             :                             }
    6147           0 :                             state.dataHeatBalFanSys->highSETLongestHoursRepPeriod(ZoneNum, ReportPeriodIdx) += state.dataGlobal->TimeStepZone;
    6148           0 :                             if (state.dataHeatBalFanSys->highSETLongestHoursRepPeriod(ZoneNum, ReportPeriodIdx) >
    6149           0 :                                     state.dataHeatBalFanSys->ZoneHighSETHoursRepPeriod(ZoneNum, ReportPeriodIdx)[3] &&
    6150           0 :                                 state.dataHeatBal->Resilience(ZoneNum).ZoneNumOcc > 0) {
    6151           0 :                                 state.dataHeatBalFanSys->ZoneHighSETHoursRepPeriod(ZoneNum, ReportPeriodIdx)[3] =
    6152           0 :                                     state.dataHeatBalFanSys->highSETLongestHoursRepPeriod(ZoneNum, ReportPeriodIdx);
    6153           0 :                                 state.dataHeatBalFanSys->ZoneHighSETHoursRepPeriod(ZoneNum, ReportPeriodIdx)[4] =
    6154           0 :                                     state.dataHeatBalFanSys->highSETLongestStartRepPeriod(ZoneNum, ReportPeriodIdx);
    6155             :                             }
    6156             :                         }
    6157           0 :                         if (state.dataHeatBal->Resilience(ZoneNum).ZoneNumOcc == 0) {
    6158           0 :                             state.dataHeatBalFanSys->lowSETLongestHoursRepPeriod(ZoneNum, ReportPeriodIdx) = 0;
    6159           0 :                             state.dataHeatBalFanSys->highSETLongestHoursRepPeriod(ZoneNum, ReportPeriodIdx) = 0;
    6160             :                         }
    6161             :                     }
    6162             : 
    6163           0 :                     Real64 Temperature = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).ZTAV;
    6164           0 :                     Real64 CoolingSetpoint = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ZoneNum);
    6165           0 :                     Real64 HeatingSetpoint = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ZoneNum);
    6166             : 
    6167           0 :                     if ((CoolingSetpoint > 0) && (Temperature > CoolingSetpoint)) {
    6168           0 :                         state.dataHeatBalFanSys->ZoneUnmetDegreeHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] +=
    6169           0 :                             (Temperature - CoolingSetpoint) * state.dataGlobal->TimeStepZone;
    6170           0 :                         state.dataHeatBalFanSys->ZoneUnmetDegreeHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] +=
    6171           0 :                             NumOcc * (Temperature - CoolingSetpoint) * state.dataGlobal->TimeStepZone;
    6172           0 :                         state.dataHeatBalFanSys->ZoneUnmetDegreeHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] +=
    6173           0 :                             (NumOcc > 0) * (Temperature - CoolingSetpoint) * state.dataGlobal->TimeStepZone;
    6174             :                     }
    6175           0 :                     if ((HeatingSetpoint > 0) && (Temperature < HeatingSetpoint)) {
    6176           0 :                         state.dataHeatBalFanSys->ZoneUnmetDegreeHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] +=
    6177           0 :                             (HeatingSetpoint - Temperature) * state.dataGlobal->TimeStepZone;
    6178           0 :                         state.dataHeatBalFanSys->ZoneUnmetDegreeHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[4] +=
    6179           0 :                             NumOcc * (HeatingSetpoint - Temperature) * state.dataGlobal->TimeStepZone;
    6180           0 :                         state.dataHeatBalFanSys->ZoneUnmetDegreeHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[5] +=
    6181           0 :                             (NumOcc > 0) * (HeatingSetpoint - Temperature) * state.dataGlobal->TimeStepZone;
    6182             :                     }
    6183             :                 }
    6184             :             }
    6185             :         } // loop over zones
    6186             :     }
    6187      942558 : }
    6188             : 
    6189       17922 : void ReportCO2Resilience(EnergyPlusData &state)
    6190             : {
    6191       17922 :     int NoBins = 3;
    6192       17922 :     if (state.dataHeatBalSurfMgr->reportCO2ResilienceFirstTime) {
    6193        4109 :         for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
    6194        3456 :             for (int i = 1; i <= state.dataWeatherManager->TotCO2ReportPers; i++) {
    6195           3 :                 state.dataHeatBalFanSys->ZoneCO2LevelHourBinsRepPeriod(ZoneNum, i).assign(NoBins, 0.0);
    6196           3 :                 state.dataHeatBalFanSys->ZoneCO2LevelOccuHourBinsRepPeriod(ZoneNum, i).assign(NoBins, 0.0);
    6197           3 :                 state.dataHeatBalFanSys->ZoneCO2LevelOccupiedHourBinsRepPeriod(ZoneNum, i).assign(NoBins, 0.0);
    6198             :             }
    6199             :         }
    6200         656 :         state.dataHeatBalSurfMgr->reportCO2ResilienceFirstTime = false;
    6201         656 :         if (!state.dataContaminantBalance->Contaminant.CO2Simulation) {
    6202         642 :             if (state.dataOutRptTab->displayCO2ResilienceSummaryExplicitly) {
    6203           0 :                 ShowWarningError(state,
    6204             :                                  "Writing Annual CO2 Resilience Summary - CO2 Level Hours reports: "
    6205             :                                  "Zone Air CO2 Concentration output is required, "
    6206             :                                  "but no ZoneAirContaminantBalance object is defined.");
    6207             :             }
    6208         642 :             state.dataOutRptTab->displayCO2ResilienceSummary = false;
    6209         642 :             return;
    6210             :         }
    6211             :     }
    6212             : 
    6213       17280 :     if (DataGlobalConstants::KindOfSim::RunPeriodWeather == state.dataGlobal->KindOfSim && !state.dataGlobal->WarmupFlag) {
    6214           0 :         for (int iPeople = 1; iPeople <= state.dataHeatBal->TotPeople; ++iPeople) {
    6215           0 :             int ZoneNum = state.dataHeatBal->People(iPeople).ZonePtr;
    6216           0 :             state.dataHeatBal->Resilience(ZoneNum).ZoneNumOcc = state.dataHeatBal->People(iPeople).NumberOfPeople *
    6217           0 :                                                                 GetCurrentScheduleValue(state, state.dataHeatBal->People(iPeople).NumberOfPeoplePtr);
    6218             :         }
    6219             : 
    6220           0 :         Array1D_bool reportPeriodFlags;
    6221           0 :         if (state.dataWeatherManager->TotReportPers > 0) {
    6222           0 :             reportPeriodFlags.dimension(state.dataWeatherManager->TotCO2ReportPers, false);
    6223           0 :             General::findReportPeriodIdx(
    6224           0 :                 state, state.dataWeatherManager->CO2ReportPeriodInput, state.dataWeatherManager->TotCO2ReportPers, reportPeriodFlags);
    6225             :         }
    6226             : 
    6227           0 :         auto &ort(state.dataOutRptTab);
    6228           0 :         for (int i = 1; i <= state.dataWeatherManager->TotCO2ReportPers; i++) {
    6229           0 :             if (reportPeriodFlags(i)) {
    6230           0 :                 int curResMeterNumber = ort->meterNumTotalsBEPS(1);
    6231           0 :                 state.dataWeatherManager->CO2ReportPeriodInput(i).totalElectricityUse += GetCurrentMeterValue(state, curResMeterNumber);
    6232             :             }
    6233             :         }
    6234             : 
    6235           0 :         for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
    6236           0 :             Real64 ZoneAirCO2 = state.dataContaminantBalance->ZoneAirCO2Avg(ZoneNum);
    6237             : 
    6238           0 :             Real64 NumOcc = state.dataHeatBal->Resilience(ZoneNum).ZoneNumOcc;
    6239           0 :             if (ZoneAirCO2 <= 1000) {
    6240           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneCO2LevelHourBins[0] += state.dataGlobal->TimeStepZone;
    6241           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneCO2LevelOccuHourBins[0] += NumOcc * state.dataGlobal->TimeStepZone;
    6242           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneCO2LevelOccupiedHourBins[0] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6243           0 :             } else if (ZoneAirCO2 > 1000 && ZoneAirCO2 <= 5000) {
    6244           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneCO2LevelHourBins[1] += state.dataGlobal->TimeStepZone;
    6245           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneCO2LevelOccuHourBins[1] += NumOcc * state.dataGlobal->TimeStepZone;
    6246           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneCO2LevelOccupiedHourBins[1] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6247             :             } else {
    6248           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneCO2LevelHourBins[2] += state.dataGlobal->TimeStepZone;
    6249           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneCO2LevelOccuHourBins[2] += NumOcc * state.dataGlobal->TimeStepZone;
    6250           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneCO2LevelOccupiedHourBins[2] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6251             :             }
    6252           0 :             for (int i = 1; i <= state.dataWeatherManager->TotCO2ReportPers; i++) {
    6253           0 :                 if (reportPeriodFlags(i)) {
    6254           0 :                     int ReportPeriodIdx = i;
    6255           0 :                     if (ZoneAirCO2 <= 1000) {
    6256           0 :                         state.dataHeatBalFanSys->ZoneCO2LevelHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] += state.dataGlobal->TimeStepZone;
    6257           0 :                         state.dataHeatBalFanSys->ZoneCO2LevelOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] +=
    6258           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6259           0 :                         state.dataHeatBalFanSys->ZoneCO2LevelOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] +=
    6260           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6261           0 :                     } else if (ZoneAirCO2 > 1000 && ZoneAirCO2 <= 5000) {
    6262           0 :                         state.dataHeatBalFanSys->ZoneCO2LevelHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] += state.dataGlobal->TimeStepZone;
    6263           0 :                         state.dataHeatBalFanSys->ZoneCO2LevelOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] +=
    6264           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6265           0 :                         state.dataHeatBalFanSys->ZoneCO2LevelOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] +=
    6266           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6267             :                     } else {
    6268           0 :                         state.dataHeatBalFanSys->ZoneCO2LevelHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] += state.dataGlobal->TimeStepZone;
    6269           0 :                         state.dataHeatBalFanSys->ZoneCO2LevelOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] +=
    6270           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6271           0 :                         state.dataHeatBalFanSys->ZoneCO2LevelOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] +=
    6272           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6273             :                     }
    6274             :                 }
    6275             :             }
    6276             :         }
    6277             :     } // loop over zones
    6278             : }
    6279             : 
    6280       90411 : void ReportVisualResilience(EnergyPlusData &state)
    6281             : {
    6282       90411 :     int NoBins = 4;
    6283       90411 :     if (state.dataHeatBalSurfMgr->reportVisualResilienceFirstTime) {
    6284        4109 :         for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
    6285        3456 :             for (int i = 1; i <= state.dataWeatherManager->TotVisualReportPers; i++) {
    6286           3 :                 state.dataHeatBalFanSys->ZoneLightingLevelHourBinsRepPeriod(ZoneNum, i).assign(NoBins, 0.0);
    6287           3 :                 state.dataHeatBalFanSys->ZoneLightingLevelOccuHourBinsRepPeriod(ZoneNum, i).assign(NoBins, 0.0);
    6288           3 :                 state.dataHeatBalFanSys->ZoneLightingLevelOccupiedHourBinsRepPeriod(ZoneNum, i).assign(NoBins, 0.0);
    6289             :             }
    6290             :         }
    6291         656 :         state.dataHeatBalSurfMgr->reportVisualResilienceFirstTime = false;
    6292         656 :         if ((int)state.dataDaylightingData->daylightControl.size() == 0) {
    6293         603 :             if (state.dataOutRptTab->displayVisualResilienceSummaryExplicitly) {
    6294           0 :                 ShowWarningError(state,
    6295             :                                  "Writing Annual Visual Resilience Summary - Lighting Level Hours reports: "
    6296             :                                  "Zone Average Daylighting Reference Point Illuminance output is required, "
    6297             :                                  "but no Daylighting Control Object is defined.");
    6298             :             }
    6299         603 :             state.dataOutRptTab->displayVisualResilienceSummary = false;
    6300         603 :             return;
    6301             :         }
    6302             :     }
    6303             : 
    6304       89808 :     if (DataGlobalConstants::KindOfSim::RunPeriodWeather == state.dataGlobal->KindOfSim && !state.dataGlobal->WarmupFlag) {
    6305           0 :         for (int iPeople = 1; iPeople <= state.dataHeatBal->TotPeople; ++iPeople) {
    6306           0 :             int ZoneNum = state.dataHeatBal->People(iPeople).ZonePtr;
    6307           0 :             state.dataHeatBal->Resilience(ZoneNum).ZoneNumOcc = state.dataHeatBal->People(iPeople).NumberOfPeople *
    6308           0 :                                                                 GetCurrentScheduleValue(state, state.dataHeatBal->People(iPeople).NumberOfPeoplePtr);
    6309             :         }
    6310             :         // Accumulate across daylighting controls first
    6311           0 :         for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
    6312           0 :             state.dataDaylightingData->ZoneDaylight(ZoneNum).zoneAvgIllumSum = 0.0;
    6313             :         }
    6314           0 :         for (int daylightCtrlNum = 1; daylightCtrlNum <= (int)state.dataDaylightingData->daylightControl.size(); ++daylightCtrlNum) {
    6315           0 :             auto &thisDaylightControl = state.dataDaylightingData->daylightControl(daylightCtrlNum);
    6316           0 :             if (thisDaylightControl.PowerReductionFactor > 0) {
    6317           0 :                 for (int refPt = 1; refPt <= thisDaylightControl.TotalDaylRefPoints; ++refPt) {
    6318           0 :                     state.dataDaylightingData->ZoneDaylight(thisDaylightControl.zoneIndex).zoneAvgIllumSum +=
    6319           0 :                         thisDaylightControl.IllumSetPoint(refPt);
    6320             :                 }
    6321             :             } else {
    6322           0 :                 for (int refPt = 1; refPt <= thisDaylightControl.TotalDaylRefPoints; ++refPt) {
    6323           0 :                     state.dataDaylightingData->ZoneDaylight(thisDaylightControl.zoneIndex).zoneAvgIllumSum +=
    6324           0 :                         thisDaylightControl.DaylIllumAtRefPt(refPt);
    6325             :                 }
    6326             :             }
    6327             :         }
    6328             : 
    6329           0 :         Array1D_bool reportPeriodFlags;
    6330           0 :         if (state.dataWeatherManager->TotReportPers > 0) {
    6331           0 :             reportPeriodFlags.dimension(state.dataWeatherManager->TotVisualReportPers, false);
    6332           0 :             General::findReportPeriodIdx(
    6333           0 :                 state, state.dataWeatherManager->VisualReportPeriodInput, state.dataWeatherManager->TotVisualReportPers, reportPeriodFlags);
    6334             :         }
    6335             : 
    6336           0 :         auto &ort(state.dataOutRptTab);
    6337           0 :         for (int i = 1; i <= state.dataWeatherManager->TotVisualReportPers; i++) {
    6338           0 :             if (reportPeriodFlags(i)) {
    6339           0 :                 int curResMeterNumber = ort->meterNumTotalsBEPS(1);
    6340           0 :                 state.dataWeatherManager->VisualReportPeriodInput(i).totalElectricityUse += GetCurrentMeterValue(state, curResMeterNumber);
    6341             :             }
    6342             :         }
    6343             : 
    6344           0 :         for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) {
    6345           0 :             if (state.dataDaylightingData->ZoneDaylight(ZoneNum).totRefPts == 0) continue;
    6346             :             // Now divide by total reference points to get average
    6347             :             Real64 avgZoneIllum =
    6348           0 :                 state.dataDaylightingData->ZoneDaylight(ZoneNum).zoneAvgIllumSum / state.dataDaylightingData->ZoneDaylight(ZoneNum).totRefPts;
    6349             : 
    6350           0 :             Real64 NumOcc = state.dataHeatBal->Resilience(ZoneNum).ZoneNumOcc;
    6351           0 :             if (avgZoneIllum <= 100) {
    6352           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneLightingLevelHourBins[0] += state.dataGlobal->TimeStepZone;
    6353           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneLightingLevelOccuHourBins[0] += NumOcc * state.dataGlobal->TimeStepZone;
    6354           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneLightingLevelOccupiedHourBins[0] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6355           0 :             } else if (avgZoneIllum > 100 && avgZoneIllum <= 300) {
    6356           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneLightingLevelHourBins[1] += state.dataGlobal->TimeStepZone;
    6357           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneLightingLevelOccuHourBins[1] += NumOcc * state.dataGlobal->TimeStepZone;
    6358           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneLightingLevelOccupiedHourBins[1] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6359           0 :             } else if (avgZoneIllum > 300 && avgZoneIllum <= 500) {
    6360           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneLightingLevelHourBins[2] += state.dataGlobal->TimeStepZone;
    6361           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneLightingLevelOccuHourBins[2] += NumOcc * state.dataGlobal->TimeStepZone;
    6362           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneLightingLevelOccupiedHourBins[2] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6363             :             } else {
    6364           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneLightingLevelHourBins[3] += state.dataGlobal->TimeStepZone;
    6365           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneLightingLevelOccuHourBins[3] += NumOcc * state.dataGlobal->TimeStepZone;
    6366           0 :                 state.dataHeatBal->Resilience(ZoneNum).ZoneLightingLevelOccupiedHourBins[3] += (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6367             :             }
    6368           0 :             for (int i = 1; i <= state.dataWeatherManager->TotVisualReportPers; i++) {
    6369           0 :                 if (reportPeriodFlags(i)) {
    6370           0 :                     int ReportPeriodIdx = i;
    6371           0 :                     if (avgZoneIllum <= 100) {
    6372           0 :                         state.dataHeatBalFanSys->ZoneLightingLevelHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] += state.dataGlobal->TimeStepZone;
    6373           0 :                         state.dataHeatBalFanSys->ZoneLightingLevelOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] +=
    6374           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6375           0 :                         state.dataHeatBalFanSys->ZoneLightingLevelOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[0] +=
    6376           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6377           0 :                     } else if (avgZoneIllum > 100 && avgZoneIllum <= 300) {
    6378           0 :                         state.dataHeatBalFanSys->ZoneLightingLevelHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] += state.dataGlobal->TimeStepZone;
    6379           0 :                         state.dataHeatBalFanSys->ZoneLightingLevelOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] +=
    6380           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6381           0 :                         state.dataHeatBalFanSys->ZoneLightingLevelOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[1] +=
    6382           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6383           0 :                     } else if (avgZoneIllum > 300 && avgZoneIllum <= 500) {
    6384           0 :                         state.dataHeatBalFanSys->ZoneLightingLevelHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] += state.dataGlobal->TimeStepZone;
    6385           0 :                         state.dataHeatBalFanSys->ZoneLightingLevelOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] +=
    6386           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6387           0 :                         state.dataHeatBalFanSys->ZoneLightingLevelOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[2] +=
    6388           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6389             :                     } else {
    6390           0 :                         state.dataHeatBalFanSys->ZoneLightingLevelHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] += state.dataGlobal->TimeStepZone;
    6391           0 :                         state.dataHeatBalFanSys->ZoneLightingLevelOccuHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] +=
    6392           0 :                             NumOcc * state.dataGlobal->TimeStepZone;
    6393           0 :                         state.dataHeatBalFanSys->ZoneLightingLevelOccupiedHourBinsRepPeriod(ZoneNum, ReportPeriodIdx)[3] +=
    6394           0 :                             (NumOcc > 0) * state.dataGlobal->TimeStepZone;
    6395             :                     }
    6396             :                 }
    6397             :             }
    6398             :         }
    6399             :     } // loop over zones
    6400             : }
    6401             : 
    6402     2568313 : void ReportSurfaceHeatBalance(EnergyPlusData &state)
    6403             : {
    6404             : 
    6405             :     // SUBROUTINE INFORMATION:
    6406             :     //       AUTHOR         Linda Lawrie
    6407             :     //       DATE WRITTEN   Oct 2000
    6408             : 
    6409             :     // PURPOSE OF THIS SUBROUTINE:
    6410             :     // This subroutine puts the reporting part of the HBSurface Module in one area.
    6411             : 
    6412             :     using SolarShading::ReportSurfaceShading;
    6413     2568313 :     ReportSurfaceShading(state);
    6414             : 
    6415     2568313 :     if (state.dataSurface->UseRepresentativeSurfaceCalculations) {
    6416         687 :         ReportNonRepresentativeSurfaceResults(state);
    6417             :     }
    6418             : 
    6419             :     // Set derived surface output variables and other record keeping - after iterations are complete - all HT surfaces
    6420             : 
    6421             :     // Opaque or window surfaces
    6422    21013702 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    6423    36906954 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    6424    18461565 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    6425    18461565 :             int const firstSurf = thisSpace.OpaqOrWinSurfaceFirst;
    6426    18461565 :             int const lastSurf = thisSpace.OpaqOrWinSurfaceLast;
    6427   178164273 :             for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    6428   159702708 :                 auto &surface(state.dataSurface->Surface(surfNum));
    6429             :                 // Inside Face Convection - sign convention is positive means energy going into inside face from the air.
    6430   159702708 :                 state.dataHeatBalSurf->SurfQdotConvInRep(surfNum) = surface.Area * state.dataHeatBalSurf->SurfQdotConvInPerArea(surfNum);
    6431   159702708 :                 state.dataHeatBalSurf->SurfQConvInReport(surfNum) =
    6432   159702708 :                     state.dataHeatBalSurf->SurfQdotConvInRep(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6433             : 
    6434   159702708 :                 state.dataHeatBalSurf->SurfQdotRadNetSurfInRep(surfNum) = state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(surfNum) * surface.Area;
    6435   159702708 :                 state.dataHeatBalSurf->SurfQRadNetSurfInReport(surfNum) =
    6436   159702708 :                     state.dataHeatBalSurf->SurfQdotRadNetSurfInRep(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6437             : 
    6438   159702708 :                 state.dataHeatBalSurf->SurfQdotRadIntGainsInRep(surfNum) = state.dataHeatBal->SurfQdotRadIntGainsInPerArea(surfNum) * surface.Area;
    6439   159702708 :                 state.dataHeatBalSurf->SurfQRadIntGainsInReport(surfNum) =
    6440   159702708 :                     state.dataHeatBalSurf->SurfQdotRadIntGainsInRep(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6441             : 
    6442   159702708 :                 state.dataHeatBalSurf->SurfQdotRadHVACInRep(surfNum) = state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(surfNum) * surface.Area;
    6443   159702708 :                 state.dataHeatBalSurf->SurfQRadHVACInReport(surfNum) =
    6444   159702708 :                     state.dataHeatBalSurf->SurfQdotRadHVACInRep(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6445             : 
    6446   159702708 :                 state.dataHeatBalSurf->SurfQdotConvOutRep(surfNum) = state.dataHeatBalSurf->SurfQdotConvOutPerArea(surfNum) * surface.Area;
    6447             : 
    6448   159702708 :                 state.dataHeatBalSurf->SurfQConvOutReport(surfNum) =
    6449   159702708 :                     state.dataHeatBalSurf->SurfQdotConvOutRep(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6450             : 
    6451   159702708 :                 state.dataHeatBalSurf->SurfQdotRadOutRep(surfNum) = state.dataHeatBalSurf->SurfQdotRadOutRepPerArea(surfNum) * surface.Area;
    6452   159702708 :                 state.dataHeatBalSurf->SurfQRadOutReport(surfNum) =
    6453   159702708 :                     state.dataHeatBalSurf->SurfQdotRadOutRep(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6454             : 
    6455             :                 // Calculate surface heat emission to the air, positive values indicates heat transfer from surface to the outside
    6456   159702708 :                 state.dataHeatBalSurf->SurfQAirExtReport(surfNum) =
    6457   319405416 :                     surface.Area * state.dataHeatBalSurf->SurfHAirExt(surfNum) *
    6458   159702708 :                     (state.dataHeatBalSurf->SurfTempOut(surfNum) - state.dataSurface->SurfOutDryBulbTemp(surfNum));
    6459             : 
    6460             :                 // Subtract since SurfQdotConvOutRep's convention is opposite (positive values indicate heat transfer from the outside to the surface)
    6461   159702708 :                 state.dataHeatBalSurf->SurfQHeatEmiReport(surfNum) =
    6462   159702708 :                     state.dataHeatBalSurf->SurfQAirExtReport(surfNum) - state.dataHeatBalSurf->SurfQdotConvOutRep(surfNum);
    6463             :             }
    6464             :         }
    6465             :     }
    6466             : 
    6467     2568313 :     if (state.dataOutRptTab->displayHeatEmissionsSummary) {
    6468      938622 :         state.dataHeatBalSurf->SumSurfaceHeatEmission = 0.0;
    6469    42240186 :         for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    6470    41301564 :             if (state.dataSurface->Surface(SurfNum).ExtBoundCond == ExternalEnvironment) {
    6471    19251810 :                 state.dataHeatBalSurf->SumSurfaceHeatEmission +=
    6472    19251810 :                     state.dataHeatBalSurf->SurfQHeatEmiReport(SurfNum) * state.dataGlobal->TimeStepZoneSec;
    6473             :             }
    6474             :         }
    6475             :     }
    6476             : 
    6477             :     // Window surfaces
    6478    21013702 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    6479    36906954 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    6480    18461565 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    6481    18461565 :             int const firstSurf = thisSpace.WindowSurfaceFirst;
    6482    18461565 :             int const lastSurf = thisSpace.WindowSurfaceLast;
    6483    40471659 :             for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    6484    22010094 :                 auto &surface(state.dataSurface->Surface(surfNum));
    6485    22010094 :                 state.dataHeatBal->SurfWinInitialDifSolInTransReport(surfNum) =
    6486    22010094 :                     state.dataHeatBalSurf->SurfWinInitialDifSolInTrans(surfNum) * surface.Area;
    6487             : 
    6488             :                 // Absorbed short wave radiation
    6489             :                 int TotGlassLayers;
    6490    22010094 :                 int const constrNum = state.dataSurface->SurfActiveConstruction(surfNum);
    6491    22010094 :                 int const constrNumSh = state.dataSurface->SurfWinActiveShadedConstruction(surfNum);
    6492    22010094 :                 WinShadingType ShadeFlag = state.dataSurface->SurfWinShadingFlag(surfNum);
    6493    22010094 :                 if (state.dataSurface->SurfWinWindowModelType(surfNum) == WindowModel::EQL) {
    6494        8109 :                     TotGlassLayers = state.dataWindowEquivLayer->CFS(state.dataConstruction->Construct(constrNum).EQLConsPtr).NL;
    6495    22001985 :                 } else if (state.dataSurface->SurfWinWindowModelType(surfNum) == WindowModel::BSDF) {
    6496       39540 :                     TotGlassLayers = state.dataConstruction->Construct(constrNum).TotSolidLayers;
    6497    21962445 :                 } else if (NOT_SHADED(ShadeFlag) || ShadeFlag == WinShadingType::SwitchableGlazing) {
    6498    21888080 :                     TotGlassLayers = state.dataConstruction->Construct(constrNum).TotGlassLayers;
    6499             :                 } else {
    6500             :                     // Interior, exterior or between-glass shade, screen or blind in place
    6501       74365 :                     TotGlassLayers = state.dataConstruction->Construct(constrNumSh).TotGlassLayers;
    6502             :                 }
    6503    22010094 :                 state.dataHeatBal->SurfWinSWwinAbsTotalReport(surfNum) = 0.0;
    6504    22010094 :                 state.dataHeatBal->SurfSWInAbsTotalReport(surfNum) = 0.0;
    6505    22010094 :                 state.dataHeatBal->SurfInitialDifSolInAbsReport(surfNum) = 0.0;
    6506    50535204 :                 for (int lay = 1; lay <= TotGlassLayers; ++lay) {
    6507             :                     // Initial Transmitted Diffuse Solar Absorbed on Inside of Surface[W]
    6508    28525110 :                     state.dataHeatBal->SurfInitialDifSolInAbsReport(surfNum) +=
    6509    28525110 :                         state.dataHeatBal->SurfWinInitialDifSolwinAbs(surfNum, lay) * surface.Area;
    6510             :                     // Total Shortwave Radiation Absorbed on Inside of Surface[W]
    6511    28525110 :                     state.dataHeatBal->SurfSWInAbsTotalReport(surfNum) += state.dataHeatBal->SurfWinQRadSWwinAbs(surfNum, lay) * surface.Area;
    6512             :                     // Total Shortwave Absorbed:All solid Layers[W]
    6513    28525110 :                     state.dataHeatBal->SurfWinSWwinAbsTotalReport(surfNum) += state.dataHeatBal->SurfWinQRadSWwinAbs(surfNum, lay) * surface.Area;
    6514             :                 }
    6515             : 
    6516             :                 // Window heat gain/loss
    6517    22010094 :                 if (state.dataSurface->SurfWinHeatGain(surfNum) >= 0.0) {
    6518     7593707 :                     state.dataSurface->SurfWinHeatGainRep(surfNum) = state.dataSurface->SurfWinHeatGain(surfNum);
    6519     7593707 :                     state.dataSurface->SurfWinHeatGainRepEnergy(surfNum) =
    6520     7593707 :                         state.dataSurface->SurfWinHeatGainRep(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6521             :                 } else {
    6522    14416387 :                     state.dataSurface->SurfWinHeatLossRep(surfNum) = -state.dataSurface->SurfWinHeatGain(surfNum);
    6523    14416387 :                     state.dataSurface->SurfWinHeatLossRepEnergy(surfNum) =
    6524    14416387 :                         state.dataSurface->SurfWinHeatLossRep(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6525             :                 }
    6526    22010094 :                 state.dataSurface->SurfWinHeatTransferRepEnergy(surfNum) =
    6527    22010094 :                     state.dataSurface->SurfWinHeatGain(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6528    22010094 :                 if (state.dataSurface->SurfWinOriginalClass(surfNum) == DataSurfaces::SurfaceClass::TDD_Diffuser) { // Tubular daylighting device
    6529        4050 :                     int pipeNum = state.dataSurface->SurfWinTDDPipeNum(surfNum);
    6530        4050 :                     state.dataDaylightingDevicesData->TDDPipe(pipeNum).HeatGain = state.dataSurface->SurfWinHeatGainRep(surfNum);
    6531        4050 :                     state.dataDaylightingDevicesData->TDDPipe(pipeNum).HeatLoss = state.dataSurface->SurfWinHeatLossRep(surfNum);
    6532             :                 }
    6533             :             }
    6534             :         }
    6535             :     }
    6536             : 
    6537     2568313 :     if (state.dataSurface->AnyMovableInsulation) ReportIntMovInsInsideSurfTemp(state);
    6538             : 
    6539             :     // Opaque heat transfer surfaces
    6540    21013702 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    6541    36906954 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    6542    18461565 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    6543    18461565 :             int const firstSurf = thisSpace.OpaqOrIntMassSurfaceFirst;
    6544    18461565 :             int const lastSurf = thisSpace.OpaqOrIntMassSurfaceLast;
    6545   156154179 :             for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    6546   137692614 :                 auto &surface(state.dataSurface->Surface(surfNum));
    6547             : 
    6548   137692614 :                 state.dataHeatBal->SurfOpaqSWOutAbsTotalReport(surfNum) = state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(surfNum) * surface.Area;
    6549   137692614 :                 state.dataHeatBal->SurfOpaqSWOutAbsEnergyReport(surfNum) =
    6550   137692614 :                     state.dataHeatBal->SurfOpaqSWOutAbsTotalReport(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6551             : 
    6552   137692614 :                 state.dataHeatBalSurf->SurfQdotRadSolarInRep(surfNum) = state.dataHeatBalSurf->SurfQdotRadSolarInRepPerArea(surfNum) * surface.Area;
    6553   137692614 :                 state.dataHeatBalSurf->SurfQRadSolarInReport(surfNum) =
    6554   137692614 :                     state.dataHeatBalSurf->SurfQdotRadSolarInRep(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6555             : 
    6556   137692614 :                 state.dataHeatBalSurf->SurfQdotRadLightsInRep(surfNum) = state.dataHeatBalSurf->SurfQdotRadLightsInPerArea(surfNum) * surface.Area;
    6557   137692614 :                 state.dataHeatBalSurf->SurfQRadLightsInReport(surfNum) =
    6558   137692614 :                     state.dataHeatBalSurf->SurfQdotRadLightsInRep(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6559             : 
    6560             :                 // Initial Transmitted Diffuse Solar Absorbed on Inside of Surface[W]
    6561   137692614 :                 state.dataHeatBal->SurfInitialDifSolInAbsReport(surfNum) = state.dataHeatBalSurf->SurfOpaqInitialDifSolInAbs(surfNum) * surface.Area;
    6562             :                 // Total Shortwave Radiation Absorbed on Inside of Surface[W]
    6563   137692614 :                 state.dataHeatBal->SurfSWInAbsTotalReport(surfNum) = state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(surfNum) * surface.Area;
    6564             : 
    6565             :                 // inside face conduction updates
    6566   137692614 :                 state.dataHeatBalSurf->SurfOpaqInsFaceCond(surfNum) = state.dataHeatBalSurf->SurfOpaqInsFaceCondFlux(surfNum) * surface.Area;
    6567   137692614 :                 state.dataHeatBalSurf->SurfOpaqInsFaceCondEnergy(surfNum) =
    6568   137692614 :                     state.dataHeatBalSurf->SurfOpaqInsFaceCond(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6569   137692614 :                 state.dataHeatBalSurf->SurfOpaqInsFaceCondGainRep(surfNum) = 0.0;
    6570   137692614 :                 state.dataHeatBalSurf->SurfOpaqInsFaceCondLossRep(surfNum) = 0.0;
    6571   137692614 :                 if (state.dataHeatBalSurf->SurfOpaqInsFaceCond(surfNum) >= 0.0) {
    6572    66732264 :                     state.dataHeatBalSurf->SurfOpaqInsFaceCondGainRep(surfNum) = state.dataHeatBalSurf->SurfOpaqInsFaceCond(surfNum);
    6573             :                 } else {
    6574    70960350 :                     state.dataHeatBalSurf->SurfOpaqInsFaceCondLossRep(surfNum) = -state.dataHeatBalSurf->SurfOpaqInsFaceCond(surfNum);
    6575             :                 }
    6576             : 
    6577             :                 // outside face conduction updates
    6578   137692614 :                 state.dataHeatBalSurf->SurfOpaqOutFaceCond(surfNum) = surface.Area * state.dataHeatBalSurf->SurfOpaqOutFaceCondFlux(surfNum);
    6579   137692614 :                 state.dataHeatBalSurf->SurfOpaqOutFaceCondEnergy(surfNum) =
    6580   137692614 :                     state.dataHeatBalSurf->SurfOpaqOutFaceCond(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6581   137692614 :                 state.dataHeatBalSurf->SurfOpaqExtFaceCondGainRep(surfNum) = 0.0;
    6582   137692614 :                 state.dataHeatBalSurf->SurfOpaqExtFaceCondLossRep(surfNum) = 0.0;
    6583   137692614 :                 if (state.dataHeatBalSurf->SurfOpaqOutFaceCond(surfNum) >= 0.0) {
    6584   125475815 :                     state.dataHeatBalSurf->SurfOpaqExtFaceCondGainRep(surfNum) = state.dataHeatBalSurf->SurfOpaqOutFaceCond(surfNum);
    6585             :                 } else {
    6586    12216799 :                     state.dataHeatBalSurf->SurfOpaqExtFaceCondLossRep(surfNum) = -state.dataHeatBalSurf->SurfOpaqOutFaceCond(surfNum);
    6587             :                 }
    6588             :             }
    6589   156154179 :             for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    6590             :                 // do average surface conduction updates
    6591             : 
    6592   137692614 :                 state.dataHeatBalSurf->SurfOpaqAvgFaceCond(surfNum) =
    6593   137692614 :                     (state.dataHeatBalSurf->SurfOpaqInsFaceCond(surfNum) - state.dataHeatBalSurf->SurfOpaqOutFaceCond(surfNum)) / 2.0;
    6594   137692614 :                 state.dataHeatBalSurf->SurfOpaqAvgFaceCondFlux(surfNum) =
    6595   137692614 :                     (state.dataHeatBalSurf->SurfOpaqInsFaceCondFlux(surfNum) - state.dataHeatBalSurf->SurfOpaqOutFaceCondFlux(surfNum)) / 2.0;
    6596   137692614 :                 state.dataHeatBalSurf->SurfOpaqAvgFaceCondEnergy(surfNum) =
    6597   137692614 :                     state.dataHeatBalSurf->SurfOpaqAvgFaceCond(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6598   137692614 :                 state.dataHeatBalSurf->SurfOpaqAvgFaceCondGainRep(surfNum) = 0.0;
    6599   137692614 :                 state.dataHeatBalSurf->SurfOpaqAvgFaceCondLossRep(surfNum) = 0.0;
    6600   137692614 :                 if (state.dataHeatBalSurf->SurfOpaqAvgFaceCond(surfNum) >= 0.0) {
    6601    62194916 :                     state.dataHeatBalSurf->SurfOpaqAvgFaceCondGainRep(surfNum) = state.dataHeatBalSurf->SurfOpaqAvgFaceCond(surfNum);
    6602             :                 } else {
    6603    75497698 :                     state.dataHeatBalSurf->SurfOpaqAvgFaceCondLossRep(surfNum) = -state.dataHeatBalSurf->SurfOpaqAvgFaceCond(surfNum);
    6604             :                 }
    6605             : 
    6606             :                 // do surface storage rate updates
    6607   137692614 :                 state.dataHeatBalSurf->SurfOpaqStorageCondFlux(surfNum) =
    6608   137692614 :                     -(state.dataHeatBalSurf->SurfOpaqInsFaceCondFlux(surfNum) + state.dataHeatBalSurf->SurfOpaqOutFaceCondFlux(surfNum));
    6609   137692614 :                 state.dataHeatBalSurf->SurfOpaqStorageCond(surfNum) =
    6610   137692614 :                     -(state.dataHeatBalSurf->SurfOpaqInsFaceCond(surfNum) + state.dataHeatBalSurf->SurfOpaqOutFaceCond(surfNum));
    6611   137692614 :                 state.dataHeatBalSurf->SurfOpaqStorageCondEnergy(surfNum) =
    6612   137692614 :                     state.dataHeatBalSurf->SurfOpaqStorageCond(surfNum) * state.dataGlobal->TimeStepZoneSec;
    6613   137692614 :                 state.dataHeatBalSurf->SurfOpaqStorageCondGainRep(surfNum) = 0.0;
    6614   137692614 :                 state.dataHeatBalSurf->SurfOpaqStorageCondLossRep(surfNum) = 0.0;
    6615   137692614 :                 if (state.dataHeatBalSurf->SurfOpaqStorageCond(surfNum) >= 0.0) {
    6616    59137366 :                     state.dataHeatBalSurf->SurfOpaqStorageCondGainRep(surfNum) = state.dataHeatBalSurf->SurfOpaqStorageCond(surfNum);
    6617             :                 } else {
    6618    78555248 :                     state.dataHeatBalSurf->SurfOpaqStorageCondLossRep(surfNum) = -state.dataHeatBalSurf->SurfOpaqStorageCond(surfNum);
    6619             :                 }
    6620             :             }
    6621             :         }
    6622             :     }
    6623             : 
    6624     2568313 :     if (state.dataGlobal->ZoneSizingCalc && state.dataGlobal->CompLoadReportIsReq) {
    6625       61962 :         int TimeStepInDay = (state.dataGlobal->HourOfDay - 1) * state.dataGlobal->NumOfTimeStepInHour + state.dataGlobal->TimeStep;
    6626      433734 :         for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    6627      754320 :             for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    6628      382548 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
    6629      382548 :                 int firstSurf = thisSpace.OpaqOrIntMassSurfaceFirst;
    6630      382548 :                 int lastSurf = thisSpace.OpaqOrIntMassSurfaceLast;
    6631     2863722 :                 for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    6632     2481174 :                     state.dataOutRptTab->lightSWRadSeq(state.dataSize->CurOverallSimDay, TimeStepInDay, surfNum) =
    6633     2481174 :                         state.dataHeatBalSurf->SurfQdotRadLightsInRep(surfNum);
    6634     2481174 :                     state.dataOutRptTab->feneSolarRadSeq(state.dataSize->CurOverallSimDay, TimeStepInDay, surfNum) =
    6635     2481174 :                         state.dataHeatBalSurf->SurfQdotRadSolarInRep(surfNum);
    6636             :                 }
    6637      382548 :                 firstSurf = thisSpace.OpaqOrWinSurfaceFirst;
    6638      382548 :                 lastSurf = thisSpace.OpaqOrWinSurfaceLast;
    6639     3235494 :                 for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    6640     2852946 :                     auto &surface(state.dataSurface->Surface(surfNum));
    6641     2852946 :                     if (!state.dataGlobal->WarmupFlag) {
    6642      406656 :                         if (state.dataGlobal->isPulseZoneSizing) {
    6643      203328 :                             state.dataOutRptTab->loadConvectedWithPulse(state.dataSize->CurOverallSimDay, TimeStepInDay, surfNum) =
    6644      203328 :                                 state.dataHeatBalSurf->SurfQdotConvInRep(surfNum);
    6645             :                         } else {
    6646      203328 :                             state.dataOutRptTab->loadConvectedNormal(state.dataSize->CurOverallSimDay, TimeStepInDay, surfNum) =
    6647      203328 :                                 state.dataHeatBalSurf->SurfQdotConvInRep(surfNum);
    6648      203328 :                             state.dataOutRptTab->netSurfRadSeq(state.dataSize->CurOverallSimDay, TimeStepInDay, surfNum) =
    6649      203328 :                                 state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(surfNum) * surface.Area;
    6650             :                         }
    6651             :                     }
    6652             :                 }
    6653             :             }
    6654             :         }
    6655             :     }
    6656             : 
    6657     2568313 :     if (state.dataGlobal->DisplayAdvancedReportVariables) {
    6658      498258 :         for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    6659      753216 :             for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    6660      376608 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
    6661      376608 :                 int const firstSurf = thisSpace.OpaqOrIntMassSurfaceFirst;
    6662      376608 :                 int const lastSurf = thisSpace.OpaqOrIntMassSurfaceLast;
    6663     3062631 :                 for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    6664     2686023 :                     state.dataHeatBal->ZoneOpaqSurfInsFaceCond(zoneNum) += state.dataHeatBalSurf->SurfOpaqInsFaceCond(surfNum);
    6665     2686023 :                     state.dataHeatBal->ZoneOpaqSurfExtFaceCond(zoneNum) += state.dataHeatBalSurf->SurfOpaqOutFaceCond(surfNum);
    6666             :                 }
    6667      376608 :                 if (state.dataHeatBal->ZoneOpaqSurfInsFaceCond(zoneNum) >= 0.0) {
    6668      172700 :                     state.dataHeatBal->ZoneOpaqSurfInsFaceCondGainRep(zoneNum) = state.dataHeatBal->ZoneOpaqSurfInsFaceCond(zoneNum);
    6669      172700 :                     state.dataHeatBal->ZnOpqSurfInsFaceCondGnRepEnrg(zoneNum) =
    6670      172700 :                         state.dataHeatBal->ZoneOpaqSurfInsFaceCondGainRep(zoneNum) * state.dataGlobal->TimeStepZoneSec;
    6671             :                 } else {
    6672      203908 :                     state.dataHeatBal->ZoneOpaqSurfInsFaceCondLossRep(zoneNum) = -state.dataHeatBal->ZoneOpaqSurfInsFaceCond(zoneNum);
    6673      203908 :                     state.dataHeatBal->ZnOpqSurfInsFaceCondLsRepEnrg(zoneNum) =
    6674      203908 :                         state.dataHeatBal->ZoneOpaqSurfInsFaceCondLossRep(zoneNum) * state.dataGlobal->TimeStepZoneSec;
    6675             :                 }
    6676             : 
    6677      376608 :                 if (state.dataHeatBal->ZoneOpaqSurfExtFaceCond(zoneNum) >= 0.0) {
    6678      244893 :                     state.dataHeatBal->ZoneOpaqSurfExtFaceCondGainRep(zoneNum) = state.dataHeatBal->ZoneOpaqSurfExtFaceCond(zoneNum);
    6679      244893 :                     state.dataHeatBal->ZnOpqSurfExtFaceCondGnRepEnrg(zoneNum) =
    6680      244893 :                         state.dataHeatBal->ZoneOpaqSurfExtFaceCondGainRep(zoneNum) * state.dataGlobal->TimeStepZoneSec;
    6681             :                 } else {
    6682      131715 :                     state.dataHeatBal->ZoneOpaqSurfExtFaceCondLossRep(zoneNum) = -state.dataHeatBal->ZoneOpaqSurfExtFaceCond(zoneNum);
    6683      131715 :                     state.dataHeatBal->ZnOpqSurfExtFaceCondLsRepEnrg(zoneNum) =
    6684      131715 :                         state.dataHeatBal->ZoneOpaqSurfExtFaceCondLossRep(zoneNum) * state.dataGlobal->TimeStepZoneSec;
    6685             :                 }
    6686             :             }
    6687             :         }
    6688             :     }
    6689     2568313 : }
    6690             : 
    6691         687 : void ReportNonRepresentativeSurfaceResults(EnergyPlusData &state)
    6692             : {
    6693       32289 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) {
    6694       63204 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    6695       31602 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    6696             :             // Heat transfer surfaces
    6697       31602 :             int firstSurf = thisSpace.HTSurfaceFirst;
    6698       31602 :             int lastSurf = thisSpace.HTSurfaceLast;
    6699      429375 :             for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    6700      397773 :                 auto &surface(state.dataSurface->Surface(surfNum));
    6701      397773 :                 int repSurfNum = surface.RepresentativeCalcSurfNum;
    6702      397773 :                 if (surfNum != repSurfNum) {
    6703       89997 :                     state.dataSurface->SurfIntConvClassificationRpt(surfNum) = state.dataSurface->SurfIntConvClassificationRpt(repSurfNum);
    6704       89997 :                     state.dataSurface->SurfOutConvClassificationRpt(surfNum) = state.dataSurface->SurfOutConvClassificationRpt(repSurfNum);
    6705             :                 }
    6706             :             }
    6707             : 
    6708             :             // Windows
    6709       31602 :             if (state.dataGlobal->DisplayAdvancedReportVariables) {
    6710           0 :                 firstSurf = thisSpace.WindowSurfaceFirst;
    6711           0 :                 lastSurf = thisSpace.WindowSurfaceLast;
    6712           0 :                 for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    6713           0 :                     auto &surface(state.dataSurface->Surface(surfNum));
    6714           0 :                     int repSurfNum = surface.RepresentativeCalcSurfNum;
    6715           0 :                     if (surfNum != repSurfNum) {
    6716           0 :                         auto areaRatio = surface.Area / state.dataSurface->Surface(surfNum).Area;
    6717           0 :                         state.dataSurface->SurfWinGainConvGlazToZoneRep(surfNum) =
    6718           0 :                             state.dataSurface->SurfWinGainConvGlazToZoneRep(repSurfNum) * areaRatio;
    6719           0 :                         state.dataSurface->SurfWinGainIRGlazToZoneRep(surfNum) =
    6720           0 :                             state.dataSurface->SurfWinGainIRGlazToZoneRep(repSurfNum) * areaRatio;
    6721           0 :                         state.dataSurface->SurfWinLossSWZoneToOutWinRep(surfNum) =
    6722           0 :                             state.dataSurface->SurfWinLossSWZoneToOutWinRep(repSurfNum) * areaRatio;
    6723             :                     }
    6724             :                 }
    6725             :             }
    6726             :         }
    6727             :     }
    6728         687 : }
    6729             : 
    6730       10122 : void ReportIntMovInsInsideSurfTemp(EnergyPlusData &state)
    6731             : {
    6732       10122 :     state.dataHeatBalSurf->SurfTempInMovInsRep = state.dataHeatBalSurf->SurfTempIn;
    6733       20244 :     for (int SurfNum : state.dataHeatBalSurf->SurfMovInsulIndexList) {
    6734       10122 :         if (state.dataHeatBalSurf->SurfMovInsulIntPresent(SurfNum)) {
    6735        6075 :             state.dataHeatBalSurf->SurfTempInMovInsRep(SurfNum) = state.dataHeatBalSurf->SurfTempInTmp(SurfNum);
    6736             :         }
    6737             :     }
    6738       10122 : }
    6739             : // End of Reporting subroutines for the HB Module
    6740             : // *****************************************************************************
    6741             : 
    6742             : // *****************************************************************************
    6743             : // *****************************************************************************
    6744             : // *****************************************************************************
    6745             : // *****************************************************************************
    6746             : 
    6747             : // Formerly EXTERNAL SUBROUTINES (heavily related to HeatBalanceSurfaceManager) now moved into namespace
    6748             : 
    6749     3482238 : void CalcHeatBalanceOutsideSurf(EnergyPlusData &state,
    6750             :                                 Optional_int_const ZoneToResimulate) // if passed in, then only calculate surfaces that have this zone
    6751             : {
    6752             : 
    6753             :     // SUBROUTINE INFORMATION:
    6754             :     //       AUTHOR         George Walton
    6755             :     //       DATE WRITTEN   December 1979
    6756             :     //       MODIFIED       Jun 1990 (RDT for new CTF arrays);
    6757             :     //                      Aug 2000 (RJL for MTF moisture calculations)
    6758             :     //                      Sep 2000 (RKS for new radiant exchange algorithm)
    6759             :     //                      Dec 2000 (RKS for radiant system model addition)
    6760             :     //                      Apr 2002 (COP removed denominator from OSC calculation
    6761             :     //                      Jul 2008 (P.Biddulph include calls to HAMT)
    6762             :     //                      Jul 2011, M.J. Witte and C.O. Pedersen, add new fields to OSC for last T, max and min
    6763             :     //                      Sep 2011 LKL/BG - resimulate only zones needing it for Radiant systems
    6764             :     //       RE-ENGINEERED  Mar 1998 (RKS)
    6765             : 
    6766             :     // PURPOSE OF THIS SUBROUTINE:
    6767             :     // This subroutine performs a heat balance on the outside face of each
    6768             :     // surface in the building.
    6769             : 
    6770             :     // METHODOLOGY EMPLOYED:
    6771             :     // Various boundary conditions are set and additional parameters are set-
    6772             :     // up.  Then, the proper heat balance equation is selected based on the
    6773             :     // presence of movable insulation, thermal mass of the surface construction,
    6774             :     // and convection model being used.
    6775             : 
    6776             :     // REFERENCES:
    6777             :     // (I)BLAST legacy routine HBOUT
    6778             :     // 1989 ASHRAE Handbook of Fundamentals (Figure 1 on p. 22.4, convection correlations)
    6779             : 
    6780             :     // Using/Aliasing
    6781             :     using namespace DataEnvironment;
    6782             :     using namespace DataHeatBalance;
    6783             :     using namespace DataHeatBalSurface;
    6784             :     using namespace DataSurfaces;
    6785             :     using ConvectionCoefficients::InitExteriorConvectionCoeff;
    6786             :     using ConvectionCoefficients::SetExtConvectionCoeff;
    6787             :     using ConvectionCoefficients::SetIntConvectionCoeff;
    6788             :     using HeatBalanceIntRadExchange::CalcInteriorRadExchange;
    6789             :     using ScheduleManager::GetCurrentScheduleValue;
    6790             :     using ScheduleManager::GetScheduleIndex;
    6791             :     using namespace Psychrometrics;
    6792             :     using EcoRoofManager::CalcEcoRoof;
    6793             : 
    6794             :     // Locals
    6795             :     // SUBROUTINE ARGUMENT DEFINITIONS:
    6796             : 
    6797             :     // SUBROUTINE PARAMETER DEFINITIONS:
    6798     3482238 :     constexpr const char *RoutineNameGroundTemp("CalcHeatBalanceOutsideSurf:GroundTemp");
    6799     3482238 :     constexpr const char *RoutineNameGroundTempFC("CalcHeatBalanceOutsideSurf:GroundTempFC");
    6800     3482238 :     constexpr const char *RoutineNameOtherSideCoefNoCalcExt("CalcHeatBalanceOutsideSurf:OtherSideCoefNoCalcExt");
    6801     3482238 :     constexpr const char *RoutineNameOtherSideCoefCalcExt("CalcHeatBalanceOutsideSurf:OtherSideCoefCalcExt");
    6802     3482238 :     constexpr const char *RoutineNameOSCM("CalcHeatBalanceOutsideSurf:OSCM");
    6803     3482238 :     constexpr const char *RoutineNameExtEnvWetSurf("CalcHeatBalanceOutsideSurf:extEnvWetSurf");
    6804     3482238 :     constexpr const char *RoutineNameExtEnvDrySurf("CalcHeatBalanceOutsideSurf:extEnvDrySurf");
    6805     3482238 :     constexpr const char *RoutineNameNoWind("CalcHeatBalanceOutsideSurf:nowind");
    6806     3482238 :     constexpr const char *RoutineNameOther("CalcHeatBalanceOutsideSurf:interior/other");
    6807     3482238 :     constexpr const char *RoutineNameIZPart("CalcHeatBalanceOutsideSurf:IZPart");
    6808     3482238 :     constexpr const char *HBSurfManGroundHAMT("HBSurfMan:Ground:HAMT");
    6809     3482238 :     constexpr const char *HBSurfManRainHAMT("HBSurfMan:Rain:HAMT");
    6810     3482238 :     constexpr const char *HBSurfManDrySurfCondFD("HBSurfMan:DrySurf:CondFD");
    6811     3482238 :     constexpr const char *Outside("Outside");
    6812             : 
    6813     3482238 :     bool MovInsulErrorFlag = false; // Movable Insulation error flag
    6814             : 
    6815             :     // set ground surfaces average temperature
    6816     3482238 :     GetGroundSurfacesTemperatureAverage(state);
    6817             : 
    6818     3482238 :     auto &Surface(state.dataSurface->Surface);
    6819             : 
    6820     3482238 :     if (state.dataHeatBal->AnyInternalHeatSourceInInput) {
    6821    24122463 :         for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    6822             :             // Need to transfer any source/sink for a surface to the local array.  Note that
    6823             :             // the local array is flux (W/m2) while the QRadSysSource is heat transfer (W).
    6824             :             // This must be done at this location so that this is always updated correctly.
    6825    23137866 :             if (Surface(SurfNum).Area > 0.0)
    6826    23137866 :                 state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1) =
    6827    23137866 :                     state.dataHeatBalFanSys->QRadSysSource(SurfNum) / Surface(SurfNum).Area; // Make sure we don't divide by zero...
    6828             : 
    6829             :             // next we add source (actually a sink) from any integrated PV
    6830    23137866 :             if (Surface(SurfNum).Area > 0.0)
    6831    23137866 :                 state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1) +=
    6832    23137866 :                     state.dataHeatBalFanSys->QPVSysSource(SurfNum) / Surface(SurfNum).Area; // Make sure we don't divide by zero...
    6833             :         }
    6834             :     }
    6835             : 
    6836     3482238 :     if (present(ZoneToResimulate)) {
    6837     2426892 :         CalcInteriorRadExchange(
    6838     2426892 :             state, state.dataHeatBalSurf->SurfInsideTempHist(1), 0, state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea, ZoneToResimulate, Outside);
    6839             :     } else {
    6840     2673274 :         CalcInteriorRadExchange(state, state.dataHeatBalSurf->SurfInsideTempHist(1), 0, state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea, _, Outside);
    6841             :     }
    6842             : 
    6843    25151966 :     for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { // Loop through all surfaces...
    6844    43355632 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    6845    21685904 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    6846   205043170 :             for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) {
    6847   183357266 :                 if (Surface(SurfNum).Class == SurfaceClass::Window) continue;
    6848   159439732 :                 if (present(ZoneToResimulate)) {
    6849    18959488 :                     if ((zoneNum != ZoneToResimulate) && (state.dataSurface->SurfAdjacentZone(SurfNum) != ZoneToResimulate)) {
    6850    11639311 :                         continue; // skip surfaces that are not associated with this zone
    6851             :                     }
    6852             :                 }
    6853             :                 // Interior windows in partitions use "normal" heat balance calculations
    6854             :                 // For rest, Outside surface temp of windows not needed in Window5 calculation approach.
    6855             :                 // Window layer temperatures are calculated in CalcHeatBalanceInsideSurf
    6856             : 
    6857             :                 // Initializations for this surface
    6858   147800421 :                 int const ConstrNum = state.dataSurface->SurfActiveConstruction(SurfNum);
    6859   147800421 :                 Real64 HMovInsul = 0.0; // "Convection" coefficient of movable insulation
    6860   147800421 :                 Real64 HSky = 0.0;      // "Convection" coefficient from sky to surface
    6861   147800421 :                 Real64 HGround = 0.0;   // "Convection" coefficient from ground to surface
    6862   147800421 :                 Real64 HAir = 0.0;      // "Convection" coefficient from air to surface (radiation)
    6863   147800421 :                 state.dataHeatBalSurf->SurfHcExt(SurfNum) = 0.0;
    6864   147800421 :                 state.dataHeatBalSurf->SurfHAirExt(SurfNum) = 0.0;
    6865   147800421 :                 state.dataHeatBalSurf->SurfHSkyExt(SurfNum) = 0.0;
    6866   147800421 :                 state.dataHeatBalSurf->SurfHGrdExt(SurfNum) = 0.0;
    6867   147800421 :                 state.dataHeatBalSurf->SurfQRadLWOutSrdSurfs(SurfNum) = 0.0;
    6868             : 
    6869             :                 // Calculate heat extract due to additional heat flux source term as the surface boundary condition
    6870             : 
    6871   147800421 :                 if (Surface(SurfNum).OutsideHeatSourceTermSchedule) {
    6872       12573 :                     state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(SurfNum) =
    6873       12573 :                         EnergyPlus::ScheduleManager::GetCurrentScheduleValue(state, Surface(SurfNum).OutsideHeatSourceTermSchedule);
    6874             :                 }
    6875             : 
    6876             :                 // Calculate the current outside surface temperature TH(SurfNum,1,1) for the
    6877             :                 // various different boundary conditions
    6878   147800421 :                 switch (Surface(SurfNum).ExtBoundCond) {
    6879     9348947 :                 case Ground: { // Surface in contact with ground
    6880     9348947 :                     state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum) = state.dataEnvrn->GroundTemp;
    6881             : 
    6882             :                     // Set the only radiant system heat balance coefficient that is non-zero for this case
    6883     9348947 :                     if (state.dataConstruction->Construct(ConstrNum).SourceSinkPresent)
    6884     1391841 :                         state.dataHeatBalFanSys->RadSysToHBConstCoef(SurfNum) = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum);
    6885             : 
    6886             :                     // start HAMT
    6887     9348947 :                     if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    6888             :                         // Set variables used in the HAMT moisture balance
    6889       26913 :                         state.dataMstBal->TempOutsideAirFD(SurfNum) = state.dataEnvrn->GroundTemp;
    6890       26913 :                         state.dataMstBal->RhoVaporAirOut(SurfNum) = PsyRhovFnTdbRh(state, state.dataEnvrn->GroundTemp, 1.0, HBSurfManGroundHAMT);
    6891       26913 :                         state.dataMstBal->HConvExtFD(SurfNum) = state.dataHeatBal->HighHConvLimit;
    6892             : 
    6893       26913 :                         state.dataMstBal->HMassConvExtFD(SurfNum) =
    6894       53826 :                             state.dataMstBal->HConvExtFD(SurfNum) /
    6895      134565 :                             ((PsyRhoAirFnPbTdbW(
    6896             :                                   state,
    6897       26913 :                                   state.dataEnvrn->OutBaroPress,
    6898       26913 :                                   state.dataEnvrn->GroundTemp,
    6899       80739 :                                   PsyWFnTdbRhPb(state, state.dataEnvrn->GroundTemp, 1.0, state.dataEnvrn->OutBaroPress, RoutineNameGroundTemp)) +
    6900       53826 :                               state.dataMstBal->RhoVaporAirOut(SurfNum)) *
    6901       26913 :                              PsyCpAirFnW(state.dataEnvrn->OutHumRat));
    6902             : 
    6903       26913 :                         state.dataMstBal->HSkyFD(SurfNum) = HSky;
    6904       26913 :                         state.dataMstBal->HGrndFD(SurfNum) = HGround;
    6905       26913 :                         state.dataMstBal->HAirFD(SurfNum) = HAir;
    6906             :                     }
    6907             :                     // end HAMT
    6908             : 
    6909     9348947 :                     if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD) {
    6910             :                         // Set variables used in the FD moisture balance
    6911      416483 :                         state.dataMstBal->TempOutsideAirFD(SurfNum) = state.dataEnvrn->GroundTemp;
    6912      416483 :                         state.dataMstBal->RhoVaporAirOut(SurfNum) = PsyRhovFnTdbRhLBnd0C(state.dataEnvrn->GroundTemp, 1.0);
    6913      416483 :                         state.dataMstBal->HConvExtFD(SurfNum) = state.dataHeatBal->HighHConvLimit;
    6914      416483 :                         state.dataMstBal->HMassConvExtFD(SurfNum) =
    6915      832966 :                             state.dataMstBal->HConvExtFD(SurfNum) /
    6916     2082415 :                             ((PsyRhoAirFnPbTdbW(
    6917             :                                   state,
    6918      416483 :                                   state.dataEnvrn->OutBaroPress,
    6919      416483 :                                   state.dataEnvrn->GroundTemp,
    6920     1249449 :                                   PsyWFnTdbRhPb(state, state.dataEnvrn->GroundTemp, 1.0, state.dataEnvrn->OutBaroPress, RoutineNameGroundTemp)) +
    6921      832966 :                               state.dataMstBal->RhoVaporAirOut(SurfNum)) *
    6922      416483 :                              PsyCpAirFnW(state.dataEnvrn->OutHumRat));
    6923      416483 :                         state.dataMstBal->HSkyFD(SurfNum) = HSky;
    6924      416483 :                         state.dataMstBal->HGrndFD(SurfNum) = HGround;
    6925      416483 :                         state.dataMstBal->HAirFD(SurfNum) = HAir;
    6926             :                     }
    6927             :                     // Added for FCfactor grounds
    6928     9348947 :                 } break;
    6929      552681 :                 case GroundFCfactorMethod: { // Surface in contact with ground
    6930      552681 :                     state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum) = state.dataEnvrn->GroundTempFC;
    6931             : 
    6932             :                     // Set the only radiant system heat balance coefficient that is non-zero for this case
    6933      552681 :                     if (state.dataConstruction->Construct(ConstrNum).SourceSinkPresent)
    6934           0 :                         state.dataHeatBalFanSys->RadSysToHBConstCoef(SurfNum) = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum);
    6935             : 
    6936      552681 :                     if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    6937             :                         // Set variables used in the HAMT moisture balance
    6938           0 :                         state.dataMstBal->TempOutsideAirFD(SurfNum) = state.dataEnvrn->GroundTempFC;
    6939           0 :                         state.dataMstBal->RhoVaporAirOut(SurfNum) = PsyRhovFnTdbRh(state, state.dataEnvrn->GroundTempFC, 1.0, HBSurfManGroundHAMT);
    6940           0 :                         state.dataMstBal->HConvExtFD(SurfNum) = state.dataHeatBal->HighHConvLimit;
    6941             : 
    6942           0 :                         state.dataMstBal->HMassConvExtFD(SurfNum) =
    6943           0 :                             state.dataMstBal->HConvExtFD(SurfNum) /
    6944           0 :                             ((PsyRhoAirFnPbTdbW(
    6945             :                                   state,
    6946           0 :                                   state.dataEnvrn->OutBaroPress,
    6947           0 :                                   state.dataEnvrn->GroundTempFC,
    6948           0 :                                   PsyWFnTdbRhPb(state, state.dataEnvrn->GroundTempFC, 1.0, state.dataEnvrn->OutBaroPress, RoutineNameGroundTempFC)) +
    6949           0 :                               state.dataMstBal->RhoVaporAirOut(SurfNum)) *
    6950           0 :                              PsyCpAirFnW(state.dataEnvrn->OutHumRat));
    6951             : 
    6952           0 :                         state.dataMstBal->HSkyFD(SurfNum) = HSky;
    6953           0 :                         state.dataMstBal->HGrndFD(SurfNum) = HGround;
    6954           0 :                         state.dataMstBal->HAirFD(SurfNum) = HAir;
    6955             :                     }
    6956             : 
    6957      552681 :                     if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD) {
    6958             :                         // Set variables used in the FD moisture balance
    6959           0 :                         state.dataMstBal->TempOutsideAirFD(SurfNum) = state.dataEnvrn->GroundTempFC;
    6960           0 :                         state.dataMstBal->RhoVaporAirOut(SurfNum) = PsyRhovFnTdbRhLBnd0C(state.dataEnvrn->GroundTempFC, 1.0);
    6961           0 :                         state.dataMstBal->HConvExtFD(SurfNum) = state.dataHeatBal->HighHConvLimit;
    6962           0 :                         state.dataMstBal->HMassConvExtFD(SurfNum) =
    6963           0 :                             state.dataMstBal->HConvExtFD(SurfNum) /
    6964           0 :                             ((PsyRhoAirFnPbTdbW(
    6965             :                                   state,
    6966           0 :                                   state.dataEnvrn->OutBaroPress,
    6967           0 :                                   state.dataEnvrn->GroundTempFC,
    6968           0 :                                   PsyWFnTdbRhPb(state, state.dataEnvrn->GroundTempFC, 1.0, state.dataEnvrn->OutBaroPress, RoutineNameGroundTempFC)) +
    6969           0 :                               state.dataMstBal->RhoVaporAirOut(SurfNum)) *
    6970           0 :                              PsyCpAirFnW(state.dataEnvrn->OutHumRat));
    6971           0 :                         state.dataMstBal->HSkyFD(SurfNum) = HSky;
    6972           0 :                         state.dataMstBal->HGrndFD(SurfNum) = HGround;
    6973           0 :                         state.dataMstBal->HAirFD(SurfNum) = HAir;
    6974             :                     }
    6975      552681 :                 } break;
    6976       84183 :                 case OtherSideCoefNoCalcExt: {
    6977             :                     // Use Other Side Coefficients to determine the surface film coefficient and
    6978             :                     // the exterior boundary condition temperature
    6979             : 
    6980       84183 :                     int OPtr = Surface(SurfNum).OSCPtr;
    6981             :                     // Set surface temp from previous timestep
    6982       84183 :                     if (state.dataGlobal->BeginTimeStepFlag) {
    6983       83933 :                         state.dataSurface->OSC(OPtr).TOutsideSurfPast = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum);
    6984             :                     }
    6985             : 
    6986       84183 :                     if (state.dataSurface->OSC(OPtr).ConstTempScheduleIndex != 0) { // Determine outside temperature from schedule
    6987       76659 :                         state.dataSurface->OSC(OPtr).ConstTemp = GetCurrentScheduleValue(state, state.dataSurface->OSC(OPtr).ConstTempScheduleIndex);
    6988             :                     }
    6989             : 
    6990             :                     //  Allow for modification of TemperatureCoefficient with unitary sine wave.
    6991             :                     Real64 ConstantTempCoef; // Temperature Coefficient as input or modified using sine wave COP mod
    6992       84183 :                     if (state.dataSurface->OSC(OPtr).SinusoidalConstTempCoef) { // Sine wave C4
    6993        3465 :                         ConstantTempCoef =
    6994        3465 :                             std::sin(2 * DataGlobalConstants::Pi * state.dataGlobal->CurrentTime / state.dataSurface->OSC(OPtr).SinusoidPeriod);
    6995             :                     } else {
    6996       80718 :                         ConstantTempCoef = state.dataSurface->OSC(OPtr).ConstTempCoef;
    6997             :                     }
    6998             : 
    6999       84183 :                     state.dataSurface->OSC(OPtr).OSCTempCalc =
    7000      168366 :                         (state.dataSurface->OSC(OPtr).ZoneAirTempCoef * state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).MAT +
    7001      168366 :                          state.dataSurface->OSC(OPtr).ExtDryBulbCoef * state.dataSurface->SurfOutDryBulbTemp(SurfNum) +
    7002      168366 :                          ConstantTempCoef * state.dataSurface->OSC(OPtr).ConstTemp +
    7003      168366 :                          state.dataSurface->OSC(OPtr).GroundTempCoef * state.dataEnvrn->GroundTemp +
    7004      168366 :                          state.dataSurface->OSC(OPtr).WindSpeedCoef * state.dataSurface->SurfOutWindSpeed(SurfNum) *
    7005      168366 :                              state.dataSurface->SurfOutDryBulbTemp(SurfNum) +
    7006       84183 :                          state.dataSurface->OSC(OPtr).TPreviousCoef * state.dataSurface->OSC(OPtr).TOutsideSurfPast);
    7007             : 
    7008             :                     // Enforce max/min limits if applicable
    7009       84183 :                     if (state.dataSurface->OSC(OPtr).MinLimitPresent)
    7010       33255 :                         state.dataSurface->OSC(OPtr).OSCTempCalc =
    7011       33255 :                             max(state.dataSurface->OSC(OPtr).MinTempLimit, state.dataSurface->OSC(OPtr).OSCTempCalc);
    7012       84183 :                     if (state.dataSurface->OSC(OPtr).MaxLimitPresent)
    7013       33255 :                         state.dataSurface->OSC(OPtr).OSCTempCalc =
    7014       33255 :                             min(state.dataSurface->OSC(OPtr).MaxTempLimit, state.dataSurface->OSC(OPtr).OSCTempCalc);
    7015             : 
    7016       84183 :                     state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum) = state.dataSurface->OSC(OPtr).OSCTempCalc;
    7017             : 
    7018             :                     // Set the only radiant system heat balance coefficient that is non-zero for this case
    7019       84183 :                     if (state.dataConstruction->Construct(ConstrNum).SourceSinkPresent)
    7020           0 :                         state.dataHeatBalFanSys->RadSysToHBConstCoef(SurfNum) = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum);
    7021             : 
    7022      168366 :                     if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD ||
    7023       84183 :                         Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    7024             :                         // Set variables used in the FD moisture balance and HAMT
    7025           0 :                         state.dataMstBal->TempOutsideAirFD(SurfNum) = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum);
    7026           0 :                         state.dataMstBal->RhoVaporAirOut(SurfNum) =
    7027           0 :                             PsyRhovFnTdbWPb(state.dataMstBal->TempOutsideAirFD(SurfNum), state.dataEnvrn->OutHumRat, state.dataEnvrn->OutBaroPress);
    7028           0 :                         state.dataMstBal->HConvExtFD(SurfNum) = state.dataHeatBal->HighHConvLimit;
    7029           0 :                         state.dataMstBal->HMassConvExtFD(SurfNum) =
    7030           0 :                             state.dataMstBal->HConvExtFD(SurfNum) / ((PsyRhoAirFnPbTdbW(state,
    7031           0 :                                                                                         state.dataEnvrn->OutBaroPress,
    7032           0 :                                                                                         state.dataMstBal->TempOutsideAirFD(SurfNum),
    7033             :                                                                                         PsyWFnTdbRhPb(state,
    7034           0 :                                                                                                       state.dataMstBal->TempOutsideAirFD(SurfNum),
    7035             :                                                                                                       1.0,
    7036           0 :                                                                                                       state.dataEnvrn->OutBaroPress,
    7037           0 :                                                                                                       RoutineNameOtherSideCoefNoCalcExt)) +
    7038           0 :                                                                       state.dataMstBal->RhoVaporAirOut(SurfNum)) *
    7039           0 :                                                                      PsyCpAirFnW(state.dataEnvrn->OutHumRat));
    7040           0 :                         state.dataMstBal->HSkyFD(SurfNum) = HSky;
    7041           0 :                         state.dataMstBal->HGrndFD(SurfNum) = HGround;
    7042           0 :                         state.dataMstBal->HAirFD(SurfNum) = HAir;
    7043             :                     }
    7044             :                     // This ends the calculations for this surface and goes on to the next SurfNum
    7045       84183 :                 } break;
    7046        1353 :                 case OtherSideCoefCalcExt: { // A surface with other side coefficients that define the outside environment
    7047             :                     // First, set up the outside convection coefficient and the exterior temperature
    7048             :                     // boundary condition for the surface
    7049        1353 :                     int OPtr = Surface(SurfNum).OSCPtr;
    7050             :                     // Set surface temp from previous timestep
    7051        1353 :                     if (state.dataGlobal->BeginTimeStepFlag) {
    7052        1347 :                         state.dataSurface->OSC(OPtr).TOutsideSurfPast = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum);
    7053             :                     }
    7054             : 
    7055        1353 :                     if (state.dataSurface->OSC(OPtr).ConstTempScheduleIndex != 0) { // Determine outside temperature from schedule
    7056           0 :                         state.dataSurface->OSC(OPtr).ConstTemp = GetCurrentScheduleValue(state, state.dataSurface->OSC(OPtr).ConstTempScheduleIndex);
    7057             :                     }
    7058             : 
    7059        1353 :                     state.dataHeatBalSurf->SurfHcExt(SurfNum) = state.dataSurface->OSC(OPtr).SurfFilmCoef;
    7060             : 
    7061        1353 :                     state.dataSurface->OSC(OPtr).OSCTempCalc =
    7062        2706 :                         (state.dataSurface->OSC(OPtr).ZoneAirTempCoef * state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).MAT +
    7063        2706 :                          state.dataSurface->OSC(OPtr).ExtDryBulbCoef * state.dataSurface->SurfOutDryBulbTemp(SurfNum) +
    7064        2706 :                          state.dataSurface->OSC(OPtr).ConstTempCoef * state.dataSurface->OSC(OPtr).ConstTemp +
    7065        2706 :                          state.dataSurface->OSC(OPtr).GroundTempCoef * state.dataEnvrn->GroundTemp +
    7066        2706 :                          state.dataSurface->OSC(OPtr).WindSpeedCoef * state.dataSurface->SurfOutWindSpeed(SurfNum) *
    7067        2706 :                              state.dataSurface->SurfOutDryBulbTemp(SurfNum) +
    7068        1353 :                          state.dataSurface->OSC(OPtr).TPreviousCoef * state.dataSurface->OSC(OPtr).TOutsideSurfPast);
    7069             : 
    7070             :                     // Enforce max/min limits if applicable
    7071        1353 :                     if (state.dataSurface->OSC(OPtr).MinLimitPresent)
    7072           0 :                         state.dataSurface->OSC(OPtr).OSCTempCalc =
    7073           0 :                             max(state.dataSurface->OSC(OPtr).MinTempLimit, state.dataSurface->OSC(OPtr).OSCTempCalc);
    7074        1353 :                     if (state.dataSurface->OSC(OPtr).MaxLimitPresent)
    7075           0 :                         state.dataSurface->OSC(OPtr).OSCTempCalc =
    7076           0 :                             min(state.dataSurface->OSC(OPtr).MaxTempLimit, state.dataSurface->OSC(OPtr).OSCTempCalc);
    7077             : 
    7078        1353 :                     Real64 TempExt = state.dataSurface->OSC(OPtr).OSCTempCalc;
    7079             : 
    7080             :                     // Set the only radiant system heat balance coefficient that is non-zero for this case
    7081        1353 :                     if (state.dataConstruction->Construct(ConstrNum).SourceSinkPresent)
    7082           0 :                         state.dataHeatBalFanSys->RadSysToHBConstCoef(SurfNum) = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum);
    7083             : 
    7084        2706 :                     if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD ||
    7085        1353 :                         Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    7086             :                         // Set variables used in the FD moisture balance and HAMT
    7087           0 :                         state.dataMstBal->TempOutsideAirFD(SurfNum) = TempExt;
    7088           0 :                         state.dataMstBal->RhoVaporAirOut(SurfNum) =
    7089           0 :                             PsyRhovFnTdbWPb(state.dataMstBal->TempOutsideAirFD(SurfNum), state.dataEnvrn->OutHumRat, state.dataEnvrn->OutBaroPress);
    7090           0 :                         state.dataMstBal->HConvExtFD(SurfNum) = state.dataHeatBalSurf->SurfHcExt(SurfNum);
    7091           0 :                         state.dataMstBal->HMassConvExtFD(SurfNum) =
    7092           0 :                             state.dataMstBal->HConvExtFD(SurfNum) / ((PsyRhoAirFnPbTdbW(state,
    7093           0 :                                                                                         state.dataEnvrn->OutBaroPress,
    7094           0 :                                                                                         state.dataMstBal->TempOutsideAirFD(SurfNum),
    7095             :                                                                                         PsyWFnTdbRhPb(state,
    7096           0 :                                                                                                       state.dataMstBal->TempOutsideAirFD(SurfNum),
    7097             :                                                                                                       1.0,
    7098           0 :                                                                                                       state.dataEnvrn->OutBaroPress,
    7099           0 :                                                                                                       RoutineNameOtherSideCoefCalcExt)) +
    7100           0 :                                                                       state.dataMstBal->RhoVaporAirOut(SurfNum)) *
    7101           0 :                                                                      PsyCpAirFnW(state.dataEnvrn->OutHumRat));
    7102           0 :                         state.dataMstBal->HSkyFD(SurfNum) = state.dataHeatBalSurf->SurfHSkyExt(SurfNum);
    7103           0 :                         state.dataMstBal->HGrndFD(SurfNum) = state.dataHeatBalSurf->SurfHGrdExt(SurfNum);
    7104           0 :                         state.dataMstBal->HAirFD(SurfNum) = state.dataHeatBalSurf->SurfHAirExt(SurfNum);
    7105             :                     }
    7106             : 
    7107             :                     // Call the outside surface temp calculation and pass the necessary terms
    7108        1353 :                     if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CTF ||
    7109           0 :                         Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::EMPD) {
    7110        1353 :                         CalcOutsideSurfTemp(state, SurfNum, zoneNum, ConstrNum, HMovInsul, TempExt, MovInsulErrorFlag);
    7111        1353 :                         if (MovInsulErrorFlag) ShowFatalError(state, "CalcOutsideSurfTemp: Program terminates due to preceding conditions.");
    7112             :                     }
    7113             :                     // This ends the calculations for this surface and goes on to the next SurfNum
    7114        1353 :                 } break;
    7115      106269 :                 case OtherSideCondModeledExt: { // A surface with other side conditions determined from seperate, dynamic component
    7116             :                     // modeling that defines the "outside environment"
    7117             :                     // First, set up the outside convection coefficient and the exterior temperature
    7118             :                     // boundary condition for the surface
    7119      106269 :                     int OPtr = Surface(SurfNum).OSCMPtr;
    7120             :                     // EMS overrides
    7121      106269 :                     if (state.dataSurface->OSCM(OPtr).EMSOverrideOnTConv)
    7122           0 :                         state.dataSurface->OSCM(OPtr).TConv = state.dataSurface->OSCM(OPtr).EMSOverrideTConvValue;
    7123      106269 :                     if (state.dataSurface->OSCM(OPtr).EMSOverrideOnHConv)
    7124           0 :                         state.dataSurface->OSCM(OPtr).HConv = state.dataSurface->OSCM(OPtr).EMSOverrideHConvValue;
    7125      106269 :                     if (state.dataSurface->OSCM(OPtr).EMSOverrideOnTRad)
    7126           0 :                         state.dataSurface->OSCM(OPtr).TRad = state.dataSurface->OSCM(OPtr).EMSOverrideTRadValue;
    7127      106269 :                     if (state.dataSurface->OSCM(OPtr).EMSOverrideOnHrad)
    7128           0 :                         state.dataSurface->OSCM(OPtr).HRad = state.dataSurface->OSCM(OPtr).EMSOverrideHradValue;
    7129      106269 :                     state.dataHeatBalSurf->SurfHcExt(SurfNum) = state.dataSurface->OSCM(OPtr).HConv;
    7130             : 
    7131      106269 :                     Real64 TempExt = state.dataSurface->OSCM(OPtr).TConv;
    7132             : 
    7133             :                     // Set the only radiant system heat balance coefficient that is non-zero for this case
    7134      106269 :                     if (state.dataConstruction->Construct(ConstrNum).SourceSinkPresent)
    7135           0 :                         state.dataHeatBalFanSys->RadSysToHBConstCoef(SurfNum) = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum);
    7136             : 
    7137      212538 :                     if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD ||
    7138      106269 :                         Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    7139             :                         // Set variables used in the FD moisture balance and HAMT
    7140           0 :                         state.dataMstBal->TempOutsideAirFD(SurfNum) = TempExt;
    7141           0 :                         state.dataMstBal->RhoVaporAirOut(SurfNum) =
    7142           0 :                             PsyRhovFnTdbWPb(state.dataMstBal->TempOutsideAirFD(SurfNum), state.dataEnvrn->OutHumRat, state.dataEnvrn->OutBaroPress);
    7143           0 :                         state.dataMstBal->HConvExtFD(SurfNum) = state.dataHeatBalSurf->SurfHcExt(SurfNum);
    7144           0 :                         state.dataMstBal->HMassConvExtFD(SurfNum) =
    7145           0 :                             state.dataMstBal->HConvExtFD(SurfNum) /
    7146           0 :                             ((PsyRhoAirFnPbTdbW(
    7147             :                                   state,
    7148           0 :                                   state.dataEnvrn->OutBaroPress,
    7149           0 :                                   state.dataMstBal->TempOutsideAirFD(SurfNum),
    7150             :                                   PsyWFnTdbRhPb(
    7151           0 :                                       state, state.dataMstBal->TempOutsideAirFD(SurfNum), 1.0, state.dataEnvrn->OutBaroPress, RoutineNameOSCM)) +
    7152           0 :                               state.dataMstBal->RhoVaporAirOut(SurfNum)) *
    7153           0 :                              PsyCpAirFnW(state.dataEnvrn->OutHumRat));
    7154           0 :                         state.dataMstBal->HSkyFD(SurfNum) = state.dataSurface->OSCM(OPtr).HRad; // CR 8046, use sky term for surface to baffle IR
    7155           0 :                         state.dataMstBal->HGrndFD(SurfNum) = 0.0; // CR 8046, null out and use only sky term for surface to baffle IR
    7156           0 :                         state.dataMstBal->HAirFD(SurfNum) = 0.0;  // CR 8046, null out and use only sky term for surface to baffle IR
    7157             :                     }
    7158             : 
    7159             :                     // Call the outside surface temp calculation and pass the necessary terms
    7160      106269 :                     if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CTF ||
    7161           0 :                         Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::EMPD) {
    7162             : 
    7163      106269 :                         if (state.dataSurface->SurfExtCavityPresent(SurfNum)) {
    7164        8124 :                             CalcExteriorVentedCavity(state, SurfNum);
    7165             :                         }
    7166             : 
    7167      106269 :                         CalcOutsideSurfTemp(state, SurfNum, zoneNum, ConstrNum, HMovInsul, TempExt, MovInsulErrorFlag);
    7168      106269 :                         if (MovInsulErrorFlag) ShowFatalError(state, "CalcOutsideSurfTemp: Program terminates due to preceding conditions.");
    7169             : 
    7170           0 :                     } else if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD ||
    7171           0 :                                Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    7172           0 :                         if (state.dataSurface->SurfExtCavityPresent(SurfNum)) {
    7173           0 :                             CalcExteriorVentedCavity(state, SurfNum);
    7174             :                         }
    7175             :                     }
    7176             :                     // This ends the calculations for this surface and goes on to the next SurfNum
    7177      106269 :                 } break;
    7178    42720605 :                 case ExternalEnvironment: {
    7179             :                     // checking the EcoRoof presented in the external environment
    7180             :                     // recompute each load by calling ecoroof
    7181             : 
    7182             :                     Real64 TempExt;
    7183             : 
    7184    43164425 :                     if (state.dataSurface->SurfExtEcoRoof(SurfNum)) {
    7185      443820 :                         CalcEcoRoof(state, SurfNum, zoneNum, ConstrNum, TempExt);
    7186      443820 :                         continue;
    7187             :                     }
    7188             :                     // Roughness index of the exterior surface
    7189    42276785 :                     DataSurfaces::SurfaceRoughness RoughSurf = state.dataHeatBalSurf->SurfRoughnessExt(SurfNum);
    7190             :                     // Thermal absoptance of the exterior surface
    7191    42276785 :                     Real64 AbsThermSurf = state.dataHeatBalSurf->SurfAbsThermalExt(SurfNum);
    7192    42276785 :                     HMovInsul = 0;
    7193             :                     // Check for outside movable insulation
    7194    42276785 :                     if (state.dataSurface->AnyMovableInsulation && state.dataHeatBalSurf->SurfMovInsulExtPresent(SurfNum)) {
    7195        4047 :                         HMovInsul = state.dataHeatBalSurf->SurfMovInsulHExt(SurfNum);
    7196             :                     }
    7197             : 
    7198             :                     // Check for exposure to wind (exterior environment)
    7199    42276785 :                     if (Surface(SurfNum).ExtWind) {
    7200             : 
    7201             :                         // Calculate exterior heat transfer coefficients with windspeed (windspeed is calculated internally in subroutine)
    7202    42100160 :                         InitExteriorConvectionCoeff(state,
    7203             :                                                     SurfNum,
    7204             :                                                     HMovInsul,
    7205             :                                                     RoughSurf,
    7206             :                                                     AbsThermSurf,
    7207    42100160 :                                                     state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum),
    7208    42100160 :                                                     state.dataHeatBalSurf->SurfHcExt(SurfNum),
    7209    42100160 :                                                     state.dataHeatBalSurf->SurfHSkyExt(SurfNum),
    7210    42100160 :                                                     state.dataHeatBalSurf->SurfHGrdExt(SurfNum),
    7211    42100160 :                                                     state.dataHeatBalSurf->SurfHAirExt(SurfNum));
    7212             : 
    7213    42100160 :                         if (state.dataEnvrn->IsRain) { // Raining: since wind exposed, outside surface gets wet
    7214             : 
    7215        7100 :                             if (state.dataSurface->SurfExtConvCoeffIndex(SurfNum) <= 0) { // Reset SurfHcExt because of wetness
    7216        7100 :                                 state.dataHeatBalSurf->SurfHcExt(SurfNum) = 1000.0;
    7217             :                             } else { // User set
    7218           0 :                                 state.dataHeatBalSurf->SurfHcExt(SurfNum) = SetExtConvectionCoeff(state, SurfNum);
    7219             :                             }
    7220             : 
    7221        7100 :                             TempExt = state.dataSurface->SurfOutWetBulbTemp(SurfNum);
    7222             : 
    7223             :                             // start HAMT
    7224        7100 :                             if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    7225             :                                 // Set variables used in the HAMT moisture balance
    7226           0 :                                 state.dataMstBal->TempOutsideAirFD(SurfNum) = TempExt;
    7227           0 :                                 state.dataMstBal->RhoVaporAirOut(SurfNum) =
    7228           0 :                                     PsyRhovFnTdbRh(state, state.dataMstBal->TempOutsideAirFD(SurfNum), 1.0, HBSurfManRainHAMT);
    7229           0 :                                 state.dataMstBal->HConvExtFD(SurfNum) = state.dataHeatBalSurf->SurfHcExt(SurfNum);
    7230           0 :                                 state.dataMstBal->HMassConvExtFD(SurfNum) =
    7231           0 :                                     state.dataMstBal->HConvExtFD(SurfNum) /
    7232           0 :                                     ((PsyRhoAirFnPbTdbW(state,
    7233           0 :                                                         state.dataEnvrn->OutBaroPress,
    7234           0 :                                                         state.dataMstBal->TempOutsideAirFD(SurfNum),
    7235             :                                                         PsyWFnTdbRhPb(state,
    7236           0 :                                                                       state.dataMstBal->TempOutsideAirFD(SurfNum),
    7237             :                                                                       1.0,
    7238           0 :                                                                       state.dataEnvrn->OutBaroPress,
    7239           0 :                                                                       RoutineNameExtEnvWetSurf)) +
    7240           0 :                                       state.dataMstBal->RhoVaporAirOut(SurfNum)) *
    7241           0 :                                      PsyCpAirFnW(state.dataEnvrn->OutHumRat));
    7242           0 :                                 state.dataMstBal->HSkyFD(SurfNum) = state.dataHeatBalSurf->SurfHSkyExt(SurfNum);
    7243           0 :                                 state.dataMstBal->HGrndFD(SurfNum) = state.dataHeatBalSurf->SurfHGrdExt(SurfNum);
    7244           0 :                                 state.dataMstBal->HAirFD(SurfNum) = state.dataHeatBalSurf->SurfHAirExt(SurfNum);
    7245             :                             }
    7246             :                             // end HAMT
    7247        7100 :                             if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD) {
    7248             :                                 // Set variables used in the FD moisture balance
    7249           0 :                                 state.dataMstBal->TempOutsideAirFD(SurfNum) = TempExt;
    7250           0 :                                 state.dataMstBal->RhoVaporAirOut(SurfNum) = PsyRhovFnTdbRhLBnd0C(state.dataMstBal->TempOutsideAirFD(SurfNum), 1.0);
    7251           0 :                                 state.dataMstBal->HConvExtFD(SurfNum) = state.dataHeatBalSurf->SurfHcExt(SurfNum);
    7252           0 :                                 state.dataMstBal->HMassConvExtFD(SurfNum) =
    7253           0 :                                     state.dataMstBal->HConvExtFD(SurfNum) /
    7254           0 :                                     ((PsyRhoAirFnPbTdbW(state,
    7255           0 :                                                         state.dataEnvrn->OutBaroPress,
    7256           0 :                                                         state.dataMstBal->TempOutsideAirFD(SurfNum),
    7257             :                                                         PsyWFnTdbRhPb(state,
    7258           0 :                                                                       state.dataMstBal->TempOutsideAirFD(SurfNum),
    7259             :                                                                       1.0,
    7260           0 :                                                                       state.dataEnvrn->OutBaroPress,
    7261           0 :                                                                       RoutineNameExtEnvWetSurf)) +
    7262           0 :                                       state.dataMstBal->RhoVaporAirOut(SurfNum)) *
    7263           0 :                                      PsyCpAirFnW(state.dataEnvrn->OutHumRat));
    7264           0 :                                 state.dataMstBal->HSkyFD(SurfNum) = state.dataHeatBalSurf->SurfHSkyExt(SurfNum);
    7265           0 :                                 state.dataMstBal->HGrndFD(SurfNum) = state.dataHeatBalSurf->SurfHGrdExt(SurfNum);
    7266           0 :                                 state.dataMstBal->HAirFD(SurfNum) = state.dataHeatBalSurf->SurfHAirExt(SurfNum);
    7267             :                             }
    7268             : 
    7269             :                         } else { // Surface is dry, use the normal correlation
    7270             : 
    7271    42093060 :                             TempExt = state.dataSurface->SurfOutDryBulbTemp(SurfNum);
    7272             : 
    7273    82418030 :                             if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD ||
    7274    40324970 :                                 Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    7275             :                                 // Set variables used in the FD moisture balance and HAMT
    7276     1912741 :                                 state.dataMstBal->TempOutsideAirFD(SurfNum) = TempExt;
    7277     5738223 :                                 state.dataMstBal->RhoVaporAirOut(SurfNum) = PsyRhovFnTdbWPb(
    7278     5738223 :                                     state.dataMstBal->TempOutsideAirFD(SurfNum), state.dataEnvrn->OutHumRat, state.dataEnvrn->OutBaroPress);
    7279     1912741 :                                 state.dataMstBal->HConvExtFD(SurfNum) = state.dataHeatBalSurf->SurfHcExt(SurfNum);
    7280     1912741 :                                 state.dataMstBal->HMassConvExtFD(SurfNum) =
    7281     3825482 :                                     state.dataMstBal->HConvExtFD(SurfNum) /
    7282     9563705 :                                     ((PsyRhoAirFnPbTdbW(state,
    7283     1912741 :                                                         state.dataEnvrn->OutBaroPress,
    7284     1912741 :                                                         state.dataMstBal->TempOutsideAirFD(SurfNum),
    7285             :                                                         PsyWFnTdbRhPb(state,
    7286     1912741 :                                                                       state.dataMstBal->TempOutsideAirFD(SurfNum),
    7287             :                                                                       1.0,
    7288     1912741 :                                                                       state.dataEnvrn->OutBaroPress,
    7289     3825482 :                                                                       RoutineNameExtEnvDrySurf)) +
    7290     3825482 :                                       state.dataMstBal->RhoVaporAirOut(SurfNum)) *
    7291     1912741 :                                      PsyCpAirFnW(state.dataEnvrn->OutHumRat));
    7292             :                                 //  check for saturation conditions of air
    7293             :                                 // Local temporary saturated vapor density for checking
    7294     1912741 :                                 Real64 RhoVaporSat = PsyRhovFnTdbRh(state, state.dataMstBal->TempOutsideAirFD(SurfNum), 1.0, HBSurfManDrySurfCondFD);
    7295     1912741 :                                 if (state.dataMstBal->RhoVaporAirOut(SurfNum) > RhoVaporSat) state.dataMstBal->RhoVaporAirOut(SurfNum) = RhoVaporSat;
    7296     1912741 :                                 state.dataMstBal->HSkyFD(SurfNum) = state.dataHeatBalSurf->SurfHSkyExt(SurfNum);
    7297     1912741 :                                 state.dataMstBal->HGrndFD(SurfNum) = state.dataHeatBalSurf->SurfHGrdExt(SurfNum);
    7298     1912741 :                                 state.dataMstBal->HAirFD(SurfNum) = state.dataHeatBalSurf->SurfHAirExt(SurfNum);
    7299             :                             }
    7300             :                         }
    7301             : 
    7302             :                     } else { // No wind
    7303             : 
    7304             :                         // Calculate exterior heat transfer coefficients for windspeed = 0
    7305      176625 :                         InitExteriorConvectionCoeff(state,
    7306             :                                                     SurfNum,
    7307             :                                                     HMovInsul,
    7308             :                                                     RoughSurf,
    7309             :                                                     AbsThermSurf,
    7310      176625 :                                                     state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum),
    7311      176625 :                                                     state.dataHeatBalSurf->SurfHcExt(SurfNum),
    7312      176625 :                                                     state.dataHeatBalSurf->SurfHSkyExt(SurfNum),
    7313      176625 :                                                     state.dataHeatBalSurf->SurfHGrdExt(SurfNum),
    7314      176625 :                                                     state.dataHeatBalSurf->SurfHAirExt(SurfNum));
    7315             : 
    7316      176625 :                         TempExt = state.dataSurface->SurfOutDryBulbTemp(SurfNum);
    7317             : 
    7318      346524 :                         if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD ||
    7319      169899 :                             Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    7320             :                             // Set variables used in the FD moisture balance and HAMT
    7321        6726 :                             state.dataMstBal->TempOutsideAirFD(SurfNum) = TempExt;
    7322       20178 :                             state.dataMstBal->RhoVaporAirOut(SurfNum) = PsyRhovFnTdbWPb(
    7323       20178 :                                 state.dataMstBal->TempOutsideAirFD(SurfNum), state.dataEnvrn->OutHumRat, state.dataEnvrn->OutBaroPress);
    7324        6726 :                             state.dataMstBal->HConvExtFD(SurfNum) = state.dataHeatBalSurf->SurfHcExt(SurfNum);
    7325        6726 :                             state.dataMstBal->HMassConvExtFD(SurfNum) =
    7326       47082 :                                 state.dataMstBal->HConvExtFD(SurfNum) / ((PsyRhoAirFnPbTdbW(state,
    7327        6726 :                                                                                             state.dataEnvrn->OutBaroPress,
    7328        6726 :                                                                                             state.dataMstBal->TempOutsideAirFD(SurfNum),
    7329             :                                                                                             PsyWFnTdbRhPb(state,
    7330        6726 :                                                                                                           state.dataMstBal->TempOutsideAirFD(SurfNum),
    7331             :                                                                                                           1.0,
    7332        6726 :                                                                                                           state.dataEnvrn->OutBaroPress,
    7333       13452 :                                                                                                           RoutineNameNoWind)) +
    7334       13452 :                                                                           state.dataMstBal->RhoVaporAirOut(SurfNum)) *
    7335        6726 :                                                                          PsyCpAirFnW(state.dataEnvrn->OutHumRat));
    7336        6726 :                             state.dataMstBal->HSkyFD(SurfNum) = state.dataHeatBalSurf->SurfHSkyExt(SurfNum);
    7337        6726 :                             state.dataMstBal->HGrndFD(SurfNum) = state.dataHeatBalSurf->SurfHGrdExt(SurfNum);
    7338        6726 :                             state.dataMstBal->HAirFD(SurfNum) = state.dataHeatBalSurf->SurfHAirExt(SurfNum);
    7339             :                         }
    7340             :                     }
    7341             :                     // Calculate LWR from surrounding surfaces if defined for an exterior surface
    7342    42276785 :                     if (state.dataSurface->Surface(SurfNum).SurfHasSurroundingSurfProperty) {
    7343        5412 :                         int SrdSurfsNum = state.dataSurface->Surface(SurfNum).SurfSurroundingSurfacesNum;
    7344             :                         // Absolute temperature of the outside surface of an exterior surface
    7345        5412 :                         Real64 TSurf = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum) + DataGlobalConstants::KelvinConv;
    7346       18942 :                         for (int SrdSurfNum = 1; SrdSurfNum <= state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).TotSurroundingSurface;
    7347             :                              SrdSurfNum++) {
    7348             :                             // View factor of a surrounding surface
    7349       13530 :                             Real64 SrdSurfViewFac = state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).SurroundingSurfs(SrdSurfNum).ViewFactor;
    7350             :                             // Absolute temperature of a surrounding surface
    7351             :                             Real64 SrdSurfTempAbs =
    7352       13530 :                                 GetCurrentScheduleValue(
    7353       13530 :                                     state, state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).SurroundingSurfs(SrdSurfNum).TempSchNum) +
    7354       13530 :                                 DataGlobalConstants::KelvinConv;
    7355       13530 :                             state.dataHeatBalSurf->SurfQRadLWOutSrdSurfs(SurfNum) +=
    7356       13530 :                                 DataGlobalConstants::StefanBoltzmann * AbsThermSurf * SrdSurfViewFac * (pow_4(SrdSurfTempAbs) - pow_4(TSurf));
    7357             :                         }
    7358             :                     }
    7359             : 
    7360    86534291 :                     if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CTF ||
    7361    44200302 :                         Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::EMPD ||
    7362     1923517 :                         Surface(SurfNum).Class == SurfaceClass::TDD_Dome) {
    7363    40357318 :                         CalcOutsideSurfTemp(state, SurfNum, zoneNum, ConstrNum, HMovInsul, TempExt, MovInsulErrorFlag);
    7364    40357318 :                         if (MovInsulErrorFlag) ShowFatalError(state, "CalcOutsideSurfTemp: Program terminates due to preceding conditions.");
    7365    42276785 :                     }
    7366    42276785 :                 } break;
    7367      100578 :                 case KivaFoundation: {
    7368             :                     DataSurfaces::SurfaceRoughness RoughSurf =
    7369      100578 :                         state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(1)).Roughness;
    7370      100578 :                     Real64 AbsThermSurf = state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(1)).AbsorpThermal;
    7371             : 
    7372             :                     // Set Kiva exterior convection algorithms
    7373      100578 :                     InitExteriorConvectionCoeff(state,
    7374             :                                                 SurfNum,
    7375             :                                                 HMovInsul,
    7376             :                                                 RoughSurf,
    7377             :                                                 AbsThermSurf,
    7378      100578 :                                                 state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum),
    7379      100578 :                                                 state.dataHeatBalSurf->SurfHcExt(SurfNum),
    7380      100578 :                                                 state.dataHeatBalSurf->SurfHSkyExt(SurfNum),
    7381      100578 :                                                 state.dataHeatBalSurf->SurfHGrdExt(SurfNum),
    7382      100578 :                                                 state.dataHeatBalSurf->SurfHAirExt(SurfNum));
    7383      100578 :                 } break;
    7384    94885805 :                 default: { // for interior or other zone surfaces
    7385             : 
    7386    94885805 :                     if (Surface(SurfNum).ExtBoundCond == SurfNum) { // Regular partition/internal mass
    7387             : 
    7388    28484595 :                         state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum) = state.dataHeatBalSurf->SurfTempIn(SurfNum);
    7389             : 
    7390             :                         // No need to set any radiant system heat balance coefficients here--will be done during inside heat balance
    7391             : 
    7392    56848611 :                         if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD ||
    7393    28364016 :                             Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    7394             :                             // Set variables used in the FD moisture balance HAMT
    7395      120579 :                             state.dataMstBal->TempOutsideAirFD(SurfNum) = state.dataHeatBalSurf->SurfTempIn(SurfNum);
    7396      120579 :                             state.dataMstBal->RhoVaporAirOut(SurfNum) = state.dataMstBal->RhoVaporAirIn(SurfNum);
    7397      120579 :                             state.dataMstBal->HConvExtFD(SurfNum) = state.dataHeatBalSurf->SurfHConvInt(SurfNum);
    7398      120579 :                             state.dataMstBal->HMassConvExtFD(SurfNum) =
    7399      241158 :                                 state.dataMstBal->HConvExtFD(SurfNum) /
    7400      602895 :                                 ((PsyRhoAirFnPbTdbW(
    7401             :                                       state,
    7402      120579 :                                       state.dataEnvrn->OutBaroPress,
    7403      120579 :                                       state.dataMstBal->TempOutsideAirFD(SurfNum),
    7404             :                                       PsyWFnTdbRhPb(
    7405      361737 :                                           state, state.dataMstBal->TempOutsideAirFD(SurfNum), 1.0, state.dataEnvrn->OutBaroPress, RoutineNameOther)) +
    7406      241158 :                                   state.dataMstBal->RhoVaporAirOut(SurfNum)) *
    7407      120579 :                                  PsyCpAirFnW(state.dataEnvrn->OutHumRat));
    7408      120579 :                             state.dataMstBal->HSkyFD(SurfNum) = 0.0;
    7409      120579 :                             state.dataMstBal->HGrndFD(SurfNum) = 0.0;
    7410      120579 :                             state.dataMstBal->HAirFD(SurfNum) = 0.0;
    7411             :                         }
    7412             : 
    7413             :                     } else { // Interzone partition
    7414             : 
    7415    66401210 :                         state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum) =
    7416    66401210 :                             state.dataHeatBalSurf->SurfInsideTempHist(1)(Surface(SurfNum).ExtBoundCond);
    7417             : 
    7418             :                         // No need to set any radiant system heat balance coefficients here--will be done during inside heat balance
    7419             : 
    7420   131656154 :                         if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD ||
    7421    65254944 :                             Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    7422             :                             // Set variables used in the FD moisture balance and HAMT
    7423     1146266 :                             state.dataMstBal->TempOutsideAirFD(SurfNum) = state.dataHeatBalSurf->SurfInsideTempHist(1)(Surface(SurfNum).ExtBoundCond);
    7424     1146266 :                             state.dataMstBal->RhoVaporAirOut(SurfNum) = state.dataMstBal->RhoVaporAirIn(Surface(SurfNum).ExtBoundCond);
    7425     1146266 :                             state.dataMstBal->HConvExtFD(SurfNum) = state.dataHeatBalSurf->SurfHConvInt(Surface(SurfNum).ExtBoundCond);
    7426     1146266 :                             state.dataMstBal->HMassConvExtFD(SurfNum) =
    7427     8023862 :                                 state.dataMstBal->HConvExtFD(SurfNum) / ((PsyRhoAirFnPbTdbW(state,
    7428     1146266 :                                                                                             state.dataEnvrn->OutBaroPress,
    7429     1146266 :                                                                                             state.dataMstBal->TempOutsideAirFD(SurfNum),
    7430             :                                                                                             PsyWFnTdbRhPb(state,
    7431     1146266 :                                                                                                           state.dataMstBal->TempOutsideAirFD(SurfNum),
    7432             :                                                                                                           1.0,
    7433     1146266 :                                                                                                           state.dataEnvrn->OutBaroPress,
    7434     2292532 :                                                                                                           RoutineNameIZPart)) +
    7435     2292532 :                                                                           state.dataMstBal->RhoVaporAirOut(SurfNum)) *
    7436     1146266 :                                                                          PsyCpAirFnW(state.dataEnvrn->OutHumRat));
    7437     1146266 :                             state.dataMstBal->HSkyFD(SurfNum) = 0.0;
    7438     1146266 :                             state.dataMstBal->HGrndFD(SurfNum) = 0.0;
    7439     1146266 :                             state.dataMstBal->HAirFD(SurfNum) = 0.0;
    7440             :                         }
    7441             :                     }
    7442             :                     // This ends the calculations for this surface and goes on to the next SurfNum
    7443    94885805 :                 } break;
    7444             :                 }
    7445             : 
    7446   147356601 :                 state.dataHeatBalSurf->SurfQdotConvOutPerArea(SurfNum) = GetQdotConvOutPerArea(state, SurfNum);
    7447             :             }
    7448             :         }
    7449             :     } // ...end of DO loop over all surface (actually heat transfer surfaces)
    7450     3482238 : }
    7451             : 
    7452   147356601 : Real64 GetQdotConvOutPerArea(EnergyPlusData &state, int const SurfNum)
    7453             : {
    7454   147356601 :     auto &Surface(state.dataSurface->Surface);
    7455   147356601 :     int OPtr = Surface(SurfNum).OSCMPtr;
    7456   147356601 :     if (Surface(SurfNum).OSCMPtr > 0) { // Optr is set above in this case, use OSCM boundary data
    7457      106269 :         return -state.dataSurface->OSCM(OPtr).HConv * (state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum) - state.dataSurface->OSCM(OPtr).TConv);
    7458             :     } else {
    7459   147250332 :         if (state.dataEnvrn->IsRain) {
    7460       31572 :             return -state.dataHeatBalSurf->SurfHcExt(SurfNum) *
    7461       31572 :                    (state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum) - state.dataSurface->SurfOutWetBulbTemp(SurfNum));
    7462             :         } else {
    7463   147218760 :             return -state.dataHeatBalSurf->SurfHcExt(SurfNum) *
    7464   147218760 :                    (state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum) - state.dataSurface->SurfOutDryBulbTemp(SurfNum));
    7465             :         }
    7466             :     }
    7467             : }
    7468             : 
    7469     3487776 : void CalcHeatBalanceInsideSurf(EnergyPlusData &state,
    7470             :                                Optional_int_const ZoneToResimulate) // if passed in, then only calculate surfaces that have this zone
    7471             : {
    7472     3487776 :     auto &Surface(state.dataSurface->Surface);
    7473     3487776 :     if (state.dataHeatBalSurfMgr->calcHeatBalInsideSurfFirstTime) {
    7474         771 :         if (state.dataHeatBal->AnyEMPD) {
    7475           2 :             state.dataHeatBalSurf->MinIterations = MinEMPDIterations;
    7476             :         }
    7477         771 :         if (state.dataGlobal->DisplayAdvancedReportVariables) {
    7478          63 :             SetupOutputVariable(state,
    7479             :                                 "Surface Inside Face Heat Balance Calculation Iteration Count",
    7480             :                                 OutputProcessor::Unit::None,
    7481          21 :                                 state.dataHeatBal->InsideSurfIterations,
    7482             :                                 OutputProcessor::SOVTimeStepType::Zone,
    7483             :                                 OutputProcessor::SOVStoreType::Summed,
    7484          42 :                                 "Simulation");
    7485             :         }
    7486             :         // Precompute whether CTF temperature limits will be needed
    7487         771 :         state.dataHeatBalSurf->Zone_has_mixed_HT_models.resize(state.dataGlobal->NumOfZones + 1, false);
    7488        5585 :         for (int iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) {
    7489        9632 :             for (int spaceNum : state.dataHeatBal->Zone(iZone).spaceIndexes) {
    7490        4818 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
    7491       46745 :                 for (int iSurf = thisSpace.HTSurfaceFirst, eSurf = thisSpace.HTSurfaceLast; iSurf <= eSurf; ++iSurf) {
    7492       41973 :                     auto const alg(Surface(iSurf).HeatTransferAlgorithm);
    7493       41973 :                     if ((alg == DataSurfaces::HeatTransferModel::CondFD) || (alg == DataSurfaces::HeatTransferModel::HAMT) ||
    7494             :                         (alg == DataSurfaces::HeatTransferModel::Kiva)) {
    7495          46 :                         state.dataHeatBalSurf->Zone_has_mixed_HT_models[iZone] = true;
    7496          46 :                         break;
    7497             :                     }
    7498             :                 }
    7499             :             }
    7500             :         }
    7501         771 :         state.dataHeatBalSurfMgr->calcHeatBalInsideSurfFirstTime = false;
    7502             :     }
    7503             : 
    7504     3487776 :     if (state.dataGlobal->BeginEnvrnFlag && state.dataHeatBalSurfMgr->calcHeatBalInsideSurEnvrnFlag) {
    7505        6218 :         state.dataHeatBalSurf->SurfTempInsOld = 23.0;
    7506        6218 :         state.dataHeatBalSurfMgr->RefAirTemp = 23.0;
    7507        6218 :         state.dataHeatBal->SurfTempEffBulkAir = 23.0;
    7508        6218 :         state.dataHeatBalSurfMgr->calcHeatBalInsideSurfWarmupErrCount = 0;
    7509        6218 :         state.dataHeatBalSurfMgr->calcHeatBalInsideSurEnvrnFlag = false;
    7510             : 
    7511             :         // Initialize Kiva instances ground temperatures
    7512        6218 :         if (state.dataHeatBal->AnyKiva) {
    7513          59 :             state.dataSurfaceGeometry->kivaManager.initKivaInstances(state);
    7514             :         }
    7515             :     }
    7516     3487776 :     if (!state.dataGlobal->BeginEnvrnFlag) {
    7517     3479264 :         state.dataHeatBalSurfMgr->calcHeatBalInsideSurEnvrnFlag = true;
    7518             :     }
    7519             : 
    7520             :     // Pass correct list of surfaces to CalcHeatBalanceInsideSurf2
    7521     3487776 :     bool const PartialResimulate(present(ZoneToResimulate));
    7522             : 
    7523     3487776 :     if (!PartialResimulate) {
    7524             : 
    7525     2678812 :         if (state.dataHeatBal->AllCTF) {
    7526     2469152 :             CalcHeatBalanceInsideSurf2CTFOnly(state, 1, state.dataGlobal->NumOfZones, state.dataSurface->AllIZSurfaceList);
    7527             :         } else {
    7528     1048300 :             CalcHeatBalanceInsideSurf2(state,
    7529      209660 :                                        state.dataSurface->AllHTSurfaceList,
    7530      209660 :                                        state.dataSurface->AllIZSurfaceList,
    7531      209660 :                                        state.dataSurface->AllHTNonWindowSurfaceList,
    7532      209660 :                                        state.dataSurface->AllHTWindowSurfaceList);
    7533             :         }
    7534             :     } else {
    7535      808964 :         auto const &zoneHTSurfList(state.dataHeatBal->Zone(ZoneToResimulate).ZoneHTSurfaceList);
    7536      808964 :         auto const &zoneIZSurfList(state.dataHeatBal->Zone(ZoneToResimulate).ZoneIZSurfaceList);
    7537      808964 :         auto const &zoneHTNonWindowSurfList(state.dataHeatBal->Zone(ZoneToResimulate).ZoneHTNonWindowSurfaceList);
    7538      808964 :         auto const &zoneHTWindowSurfList(state.dataHeatBal->Zone(ZoneToResimulate).ZoneHTWindowSurfaceList);
    7539             :         // Cannot use CalcHeatBalanceInsideSurf2CTFOnly because resimulated zone includes adjacent interzone surfaces
    7540      808964 :         CalcHeatBalanceInsideSurf2(state, zoneHTSurfList, zoneIZSurfList, zoneHTNonWindowSurfList, zoneHTWindowSurfList, ZoneToResimulate);
    7541             :     }
    7542     3487776 :     CalculateZoneMRT(state, ZoneToResimulate); // Update here so that the proper value of MRT is available to radiant systems
    7543     3487776 :     UpdateIntermediateSurfaceHeatBalanceResults(state, ZoneToResimulate);
    7544     3487776 : }
    7545             : 
    7546     1018624 : void CalcHeatBalanceInsideSurf2(EnergyPlusData &state,
    7547             :                                 const std::vector<int> &HTSurfs,          // Heat transfer surfaces to simulate (opaque and windows)
    7548             :                                 const std::vector<int> &IZSurfs,          // Interzone heat transfer surfaces to simulate
    7549             :                                 const std::vector<int> &HTNonWindowSurfs, // Non-window heat transfer surfaces to simulate
    7550             :                                 const std::vector<int> &HTWindowSurfs,    // Window heat transfer surfaces to simulate
    7551             :                                 Optional_int_const ZoneToResimulate)
    7552             : {
    7553             :     // SUBROUTINE INFORMATION:
    7554             :     //       AUTHOR         George Walton
    7555             :     //       DATE WRITTEN   December 1979
    7556             :     //       MODIFIED       Jun 1990 (RDT for new CTF arrays)
    7557             :     //                      Dec 1999 (FCW for window calculation)
    7558             :     //                      May 2000 (FCW for window frame and dividers)
    7559             :     //                      Aug 2000 (RJL for MTF moisture calculations)
    7560             :     //                      Sep 2000 (RKS for new radiant exchange algorithm)
    7561             :     //                      Dec 2000 (RKS for radiant system model addition)
    7562             :     //                      Jul 2003 (CC) set the reference temperatures for inside surface heat balance
    7563             :     //                                    depending on convection algorithms and/or air models used
    7564             :     //                      May 2006 (RR  account for exterior window screen)
    7565             :     //                      Jul 2008 (P. Biddulph include calls to HAMT)
    7566             :     //                      Sep 2011 LKL/BG - resimulate only zones needing it for Radiant systems
    7567             :     //       RE-ENGINEERED  Mar 1998 (RKS)
    7568             : 
    7569             :     // PURPOSE OF THIS SUBROUTINE:
    7570             :     // This subroutine performs a heat balance on the inside face of each
    7571             :     // surface in the building.
    7572             : 
    7573             :     // METHODOLOGY EMPLOYED:
    7574             :     // Various boundary conditions are set and additional parameters are set-
    7575             :     // up.  Then, the proper heat balance equation is selected based on whether
    7576             :     // the surface is a partition or not and on whether or not movable
    7577             :     // insulation is present on the inside face.
    7578             : 
    7579             :     // REFERENCES:
    7580             :     // (I)BLAST legacy routine HBSRF
    7581             : 
    7582     1018624 :     constexpr const char *rhoAirZone("RhoAirZone");
    7583     1018624 :     constexpr const char *wsurf("Wsurf");
    7584     1018624 :     constexpr const char *HBSurfManInsideSurf("HB,SurfMan:InsideSurf");
    7585     1018624 :     constexpr const char *Inside("Inside");
    7586             : 
    7587             :     Real64 TempSurfOutTmp; // Local Temporary Surface temperature for the outside surface face
    7588             :     Real64 SurfTempInSat;  // Local temporary surface dew point temperature
    7589             : 
    7590             :     Real64 Wsurf;         // Moisture ratio for HAMT
    7591             :     Real64 RhoAirZone;    // Zone moisture density for HAMT
    7592             :     int OtherSideZoneNum; // Zone Number index for other side of an interzone partition HAMT
    7593     1018624 :     auto &Surface(state.dataSurface->Surface);
    7594             : 
    7595             :     // determine reference air temperatures
    7596    13242585 :     for (int SurfNum : HTSurfs) {
    7597             : 
    7598             :         // These conditions are not used in every SurfNum loop here so we don't use them to skip surfaces
    7599    12223961 :         if (Surface(SurfNum).Class == SurfaceClass::TDD_Dome) continue; // Skip TDD:DOME objects.  Inside temp is handled by TDD:DIFFUSER.
    7600    12223961 :         Real64 RefAirTemp = state.dataSurface->Surface(SurfNum).getInsideAirTemperature(state, SurfNum);
    7601    12223961 :         state.dataHeatBalSurfMgr->RefAirTemp(SurfNum) = RefAirTemp;
    7602    12223961 :         state.dataHeatBal->SurfTempEffBulkAir(SurfNum) = state.dataHeatBalSurfMgr->RefAirTemp(SurfNum);
    7603             :     }
    7604             : 
    7605             :     // Following variables must be reset due to possible recall of this routine by radiant and Resimulate routines.
    7606             :     // CalcWindowHeatBalance is called, then, multiple times and these need to be initialized before each call to
    7607             :     // CalcWindowHeatBalance.
    7608             :     // Only for Surface(SurfNum).Class == DataSurfaces::SurfaceClass::Window
    7609     1911314 :     for (int surfNum : HTWindowSurfs) {
    7610      892690 :         state.dataSurface->SurfWinHeatGain(surfNum) = 0.0;
    7611      892690 :         state.dataSurface->SurfWinHeatGainRep(surfNum) = 0.0;
    7612      892690 :         state.dataSurface->SurfWinHeatLossRep(surfNum) = 0.0;
    7613      892690 :         state.dataSurface->SurfWinGainConvGlazToZoneRep(surfNum) = 0.0;
    7614      892690 :         state.dataSurface->SurfWinGainIRGlazToZoneRep(surfNum) = 0.0;
    7615      892690 :         state.dataSurface->SurfWinLossSWZoneToOutWinRep(surfNum) = 0.0;
    7616      892690 :         state.dataSurface->SurfWinGainFrameDividerToZoneRep(surfNum) = 0.0;
    7617      892690 :         state.dataSurface->SurfWinGainConvShadeToZoneRep(surfNum) = 0.0;
    7618      892690 :         state.dataSurface->SurfWinGainIRShadeToZoneRep(surfNum) = 0.0;
    7619      892690 :         state.dataSurface->SurfWinFrameQRadOutAbs(surfNum) = 0.0;
    7620      892690 :         state.dataSurface->SurfWinFrameQRadInAbs(surfNum) = 0.0;
    7621      892690 :         state.dataSurface->SurfWinDividerQRadOutAbs(surfNum) = 0.0;
    7622      892690 :         state.dataSurface->SurfWinDividerQRadInAbs(surfNum) = 0.0;
    7623             :     }
    7624             : 
    7625     1018624 :     state.dataHeatBal->InsideSurfIterations = 0;
    7626             : 
    7627             :     // Calculate heat extract due to additional heat flux source term as the surface boundary condition
    7628     1018624 :     if (state.dataSurface->AnyHeatBalanceInsideSourceTerm) {
    7629           0 :         for (int SurfNum : HTSurfs) {
    7630           0 :             if (Surface(SurfNum).InsideHeatSourceTermSchedule) {
    7631           0 :                 state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(SurfNum) =
    7632           0 :                     EnergyPlus::ScheduleManager::GetCurrentScheduleValue(state, Surface(SurfNum).InsideHeatSourceTermSchedule);
    7633             :             }
    7634             :         }
    7635             :     }
    7636             : 
    7637             :     // Calculate Kiva instances
    7638     1018624 :     if (state.dataHeatBal->AnyKiva) {
    7639       65691 :         if (((state.dataSurfaceGeometry->kivaManager.settings.timestepType == HeatBalanceKivaManager::KivaManager::Settings::HOURLY &&
    7640       39572 :               state.dataGlobal->TimeStep == 1) ||
    7641       43794 :              state.dataSurfaceGeometry->kivaManager.settings.timestepType == HeatBalanceKivaManager::KivaManager::Settings::TIMESTEP) &&
    7642        4222 :             !state.dataGlobal->WarmupFlag) {
    7643         576 :             state.dataSurfaceGeometry->kivaManager.calcKivaInstances(state);
    7644             :         }
    7645             :     }
    7646             : 
    7647     1018624 :     bool Converged = false; // .TRUE. if inside heat balance has converged
    7648     6962170 :     while (!Converged) {    // Start of main inside heat balance DO loop...
    7649             : 
    7650     2971773 :         state.dataHeatBalSurf->SurfTempInsOld = state.dataHeatBalSurf->SurfTempIn; // Keep track of last iteration's temperature values
    7651             : 
    7652     2971773 :         if (state.dataHeatBal->AnyKiva) {
    7653      550139 :             for (auto &kivaSurf : state.dataSurfaceGeometry->kivaManager.surfaceMap) {
    7654      453305 :                 state.dataHeatBalSurf->SurfTempIn(kivaSurf.first) = kivaSurf.second.results.Trad - DataGlobalConstants::KelvinConv;
    7655             :             }
    7656             :         }
    7657             : 
    7658    11887092 :         HeatBalanceIntRadExchange::CalcInteriorRadExchange(state,
    7659     2971773 :                                                            state.dataHeatBalSurf->SurfTempIn,
    7660     2971773 :                                                            state.dataHeatBal->InsideSurfIterations,
    7661     2971773 :                                                            state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea,
    7662             :                                                            ZoneToResimulate,
    7663     2971773 :                                                            Inside); // Update the radiation balance
    7664             : 
    7665     2971773 :         if (state.dataHeatBal->AnyKiva) {
    7666      550139 :             for (auto &kivaSurf : state.dataSurfaceGeometry->kivaManager.surfaceMap) {
    7667      453305 :                 state.dataHeatBalSurf->SurfTempIn(kivaSurf.first) = state.dataHeatBalSurf->SurfTempInsOld(kivaSurf.first);
    7668             :             }
    7669             :         }
    7670             : 
    7671             :         // Every 30 iterations, recalculate the inside convection coefficients in case
    7672             :         // there has been a significant drift in the surface temperatures predicted.
    7673             :         // This is not fool-proof and it basically means that the outside surface
    7674             :         // heat balance is in error (potentially) once HConvIn is re-evaluated.
    7675             :         // The choice of 30 is not significant--just want to do this a couple of
    7676             :         // times before the iteration limit is hit.
    7677     2971773 :         if ((state.dataHeatBal->InsideSurfIterations > 0) && (mod(state.dataHeatBal->InsideSurfIterations, ItersReevalConvCoeff) == 0)) {
    7678          55 :             ConvectionCoefficients::InitInteriorConvectionCoeffs(state, state.dataHeatBalSurf->SurfTempIn, ZoneToResimulate);
    7679             :         }
    7680             : 
    7681     2971773 :         if (state.dataHeatBal->AnyEMPD || state.dataHeatBal->AnyHAMT) {
    7682     1432613 :             for (int SurfNum : HTSurfs) {
    7683     1325098 :                 auto &surface(Surface(SurfNum));
    7684     1325098 :                 if (surface.Class == SurfaceClass::TDD_Dome) continue; // Skip TDD:DOME objects.  Inside temp is handled by TDD:DIFFUSER.
    7685             : 
    7686             :                 // Calculate the inside surface moisture quantities
    7687             :                 // calculate the inside surface moisture transfer conditions
    7688             :                 // check for saturation conditions of air
    7689     1951057 :                 if ((surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::EMPD) ||
    7690      625959 :                     (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT)) {
    7691     1052476 :                     int ZoneNum = Surface(SurfNum).Zone;
    7692     1052476 :                     Real64 const MAT_zone(state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT);
    7693     1052476 :                     Real64 const ZoneAirHumRat_zone(max(state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).ZoneAirHumRat, 1.0e-5));
    7694     1052476 :                     Real64 const HConvIn_surf(state.dataMstBal->HConvInFD(SurfNum) = state.dataHeatBalSurf->SurfHConvInt(SurfNum));
    7695             : 
    7696     1052476 :                     state.dataMstBal->RhoVaporAirIn(SurfNum) =
    7697     2104952 :                         min(Psychrometrics::PsyRhovFnTdbWPb_fast(MAT_zone, ZoneAirHumRat_zone, state.dataEnvrn->OutBaroPress),
    7698     1052476 :                             Psychrometrics::PsyRhovFnTdbRh(state, MAT_zone, 1.0, HBSurfManInsideSurf));
    7699     1052476 :                     state.dataMstBal->HMassConvInFD(SurfNum) =
    7700     2104952 :                         HConvIn_surf / (Psychrometrics::PsyRhoAirFnPbTdbW_fast(state, state.dataEnvrn->OutBaroPress, MAT_zone, ZoneAirHumRat_zone) *
    7701     1052476 :                                         Psychrometrics::PsyCpAirFnW_fast(ZoneAirHumRat_zone));
    7702             :                 }
    7703             :             }
    7704             :         }
    7705             : 
    7706    39813721 :         for (int SurfNum : HTNonWindowSurfs) {
    7707             :             // Perform heat balance on the inside face of the surface ...
    7708             :             // The following are possibilities here:
    7709             :             //   (a) the surface is a pool (no movable insulation, no source/sink, only CTF solution algorithm)
    7710             :             //   (b) the surface is a partition, in which case the temperature of both sides are the same
    7711             :             //   (c) standard (or interzone) opaque surface with no movable insulation, normal heat balance equation
    7712             :             //   (d) standard (or interzone) window: call to CalcWindowHeatBalance to get window layer temperatures
    7713             :             //   (e) standard opaque surface with movable insulation, special two-part equation
    7714             :             // In the surface calculation there are the following Algorithm types for opaque surfaces that
    7715             :             // do not have movable insulation:
    7716             :             //   (a) the regular CTF calc (SolutionAlgo = UseCTF)
    7717             :             //   (b) the EMPD calc (Solutionalgo = UseEMPD)
    7718             :             //   (c) the CondFD calc (SolutionAlgo = UseCondFD)
    7719             :             //   (d) the HAMT calc (solutionalgo = UseHAMT).
    7720             : 
    7721    36841948 :             auto &surface(Surface(SurfNum));
    7722    36841948 :             if (state.dataSurface->UseRepresentativeSurfaceCalculations) {
    7723           0 :                 int repSurfNum = surface.RepresentativeCalcSurfNum;
    7724           0 :                 if (SurfNum != repSurfNum) continue;
    7725             :             }
    7726    36841948 :             int const ZoneNum = Surface(SurfNum).Zone;
    7727    36841948 :             Real64 &TH11(state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum));
    7728    36841948 :             int const ConstrNum = surface.Construction;
    7729    36841948 :             auto const &construct(state.dataConstruction->Construct(ConstrNum));
    7730    36841948 :             Real64 const MAT_zone(state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT);
    7731    36841948 :             Real64 const HConvIn_surf(state.dataMstBal->HConvInFD(SurfNum) = state.dataHeatBalSurf->SurfHConvInt(SurfNum));
    7732             : 
    7733    36841948 :             if (surface.ExtBoundCond == SurfNum) {
    7734             :                 // CR6869 -- let Window HB take care of it      IF (Surface(SurfNum)%ExtBoundCond == SurfNum) THEN
    7735             :                 // Surface is adiabatic
    7736     1407497 :                 if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CTF ||
    7737      245715 :                     surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::EMPD) { // Regular CTF Surface and/or EMPD surface
    7738             : 
    7739      916067 :                     if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::EMPD) {
    7740           0 :                         MoistureBalanceEMPDManager::CalcMoistureBalanceEMPD(
    7741           0 :                             state, SurfNum, state.dataHeatBalSurf->SurfTempInTmp(SurfNum), MAT_zone, SurfTempInSat);
    7742             :                     }
    7743             :                     // Pre-calculate a few terms
    7744      916067 :                     if (state.dataHeatBalSurf->AnyRadiantSystems(SurfNum))
    7745        6401 :                         state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(SurfNum) = GetSurfQdotRadHVACInPerArea(state, SurfNum);
    7746             :                     Real64 const TempTerm(
    7747     1832134 :                         state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) + state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum) +
    7748     2748201 :                         state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) + state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(SurfNum) +
    7749     2748201 :                         HConvIn_surf * state.dataHeatBalSurfMgr->RefAirTemp(SurfNum) + state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(SurfNum) +
    7750      916067 :                         state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(SurfNum) +
    7751      916067 :                         (state.dataHeatBalFanSys->QRadSurfAFNDuct(SurfNum) / state.dataGlobal->TimeStepZoneSec));
    7752      916067 :                     Real64 const TempDiv(1.0 / (construct.CTFInside(0) - construct.CTFCross(0) + HConvIn_surf + IterDampConst));
    7753             :                     // Calculate the current inside surface temperature
    7754     1832134 :                     if ((!state.dataSurface->SurfIsPool(SurfNum)) ||
    7755           0 :                         ((state.dataSurface->SurfIsPool(SurfNum)) &&
    7756           0 :                          (std::abs(state.dataHeatBalFanSys->QPoolSurfNumerator(SurfNum)) < PoolIsOperatingLimit) &&
    7757           0 :                          (std::abs(state.dataHeatBalFanSys->PoolHeatTransCoefs(SurfNum)) < PoolIsOperatingLimit))) {
    7758      916067 :                         if (construct.SourceSinkPresent) {
    7759           0 :                             state.dataHeatBalSurf->SurfTempInTmp(SurfNum) =
    7760           0 :                                 (TempTerm + construct.CTFSourceIn(0) * state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1) +
    7761           0 :                                  IterDampConst * state.dataHeatBalSurf->SurfTempInsOld(SurfNum)) *
    7762             :                                 TempDiv; // Constant portion of conduction eq (history terms) | LW radiation from internal sources | SW radiation
    7763             :                             // from internal sources | Convection from surface to zone air | Net radiant exchange with other zone
    7764             :                             // surfaces | Heat source/sink term for radiant systems | (if there is one present) | Radiant flux from a
    7765             :                             // high temperature radiant heater | Radiant flux from a hot water baseboard heater | Radiant flux from a
    7766             :                             // steam baseboard heater | Radiant flux from an electric baseboard heater | Iterative damping term (for
    7767             :                             // stability) | Conduction term (both partition sides same temp) | Conduction term (both partition sides
    7768             :                             // same temp) | Convection and damping term | Radiation from AFN ducts
    7769             :                         } else {
    7770      916067 :                             state.dataHeatBalSurf->SurfTempInTmp(SurfNum) =
    7771      916067 :                                 (TempTerm + IterDampConst * state.dataHeatBalSurf->SurfTempInsOld(SurfNum)) *
    7772             :                                 TempDiv; // Constant portion of conduction eq (history terms) | LW radiation from internal sources | SW radiation
    7773             :                             // from internal sources | Convection from surface to zone air | Net radiant exchange with other zone
    7774             :                             // surfaces | Heat source/sink term for radiant systems | (if there is one present) | Radiant flux from a
    7775             :                             // high temperature radiant heater | Radiant flux from a hot water baseboard heater | Radiant flux from a
    7776             :                             // steam baseboard heater | Radiant flux from an electric baseboard heater | Iterative damping term (for
    7777             :                             // stability) | Conduction term (both partition sides same temp) | Conduction term (both partition sides
    7778             :                             // same temp) | Convection and damping term | Radiation from AFN ducts
    7779             :                         }
    7780             :                     } else { // this is a pool and it has been simulated this time step
    7781           0 :                         state.dataHeatBalSurf->SurfTempInTmp(SurfNum) =
    7782           0 :                             (state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) + state.dataHeatBalFanSys->QPoolSurfNumerator(SurfNum) +
    7783           0 :                              IterDampConst * state.dataHeatBalSurf->SurfTempInsOld(SurfNum)) /
    7784           0 :                             (construct.CTFInside(0) - construct.CTFCross(0) + state.dataHeatBalFanSys->PoolHeatTransCoefs(SurfNum) +
    7785             :                              IterDampConst); // Constant part of conduction eq (history terms) | Pool modified terms (see
    7786             :                         // non-pool equation for details) | Iterative damping term (for stability) |
    7787             :                         // Conduction term (both partition sides same temp) | Pool and damping term
    7788             :                     }
    7789      916067 :                     if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::EMPD) {
    7790           0 :                         state.dataHeatBalSurf->SurfTempInTmp(SurfNum) -=
    7791           0 :                             state.dataMstBalEMPD->HeatFluxLatent(SurfNum) * TempDiv; // Conduction term (both partition sides same temp) |
    7792             :                         // Conduction term (both partition sides same temp) |
    7793             :                         // Convection and damping term
    7794           0 :                         if (SurfTempInSat > state.dataHeatBalSurf->SurfTempInTmp(SurfNum)) {
    7795           0 :                             state.dataHeatBalSurf->SurfTempInTmp(SurfNum) = SurfTempInSat; // Surface temp cannot be below dew point
    7796             :                         }
    7797             :                     }
    7798             :                     // if any mixed heat transfer models in zone, apply limits to CTF result
    7799      916067 :                     if (state.dataHeatBalSurf->Zone_has_mixed_HT_models[ZoneNum])
    7800      344062 :                         state.dataHeatBalSurf->SurfTempInTmp(SurfNum) =
    7801      688124 :                             max(MinSurfaceTempLimit,
    7802      344062 :                                 min(state.dataHeatBalSurf->MaxSurfaceTempLimit,
    7803      344062 :                                     state.dataHeatBalSurf->SurfTempInTmp(SurfNum))); // Limit Check //Tuned Precomputed condition to eliminate loop
    7804             : 
    7805      916067 :                     if (construct.SourceSinkPresent) { // Set the appropriate parameters for the radiant system
    7806             : 
    7807             :                         // Radiant system does not need the damping coefficient terms (hopefully) // Partitions are assumed to be symmetric
    7808           0 :                         Real64 const RadSysDiv(1.0 / (construct.CTFInside(0) - construct.CTFCross(0) + HConvIn_surf));
    7809           0 :                         state.dataHeatBalFanSys->RadSysToHBConstCoef(SurfNum) = state.dataHeatBalFanSys->RadSysTiHBConstCoef(SurfNum) =
    7810           0 :                             TempTerm * RadSysDiv; // Constant portion of conduction eq (history terms) | LW radiation from internal sources | SW
    7811             :                         // radiation from internal sources | Convection from surface to zone air | Radiant flux from
    7812             :                         // high temperature radiant heater | Radiant flux from a hot water baseboard heater | Radiant
    7813             :                         // flux from a steam baseboard heater | Radiant flux from an electric baseboard heater | Net
    7814             :                         // radiant exchange with other zone surfaces | Cond term (both partition sides same temp) | Cond
    7815             :                         // term (both partition sides same temp) | Convection and damping term
    7816           0 :                         state.dataHeatBalFanSys->RadSysToHBTinCoef(SurfNum) = state.dataHeatBalFanSys->RadSysTiHBToutCoef(SurfNum) =
    7817             :                             0.0; // The outside temp is assumed to be equal to the inside temp for a partition
    7818           0 :                         state.dataHeatBalFanSys->RadSysToHBQsrcCoef(SurfNum) = state.dataHeatBalFanSys->RadSysTiHBQsrcCoef(SurfNum) =
    7819           0 :                             construct.CTFSourceIn(0) * RadSysDiv; // QTF term for the source | Cond term (both partition sides same temp) | Cond
    7820             :                         // term (both partition sides same temp) | Convection and damping term
    7821      916067 :                     }
    7822             : 
    7823      245715 :                 } else if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD ||
    7824           0 :                            surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    7825             : 
    7826      245715 :                     if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT)
    7827           0 :                         HeatBalanceHAMTManager::ManageHeatBalHAMT(state,
    7828             :                                                                   SurfNum,
    7829           0 :                                                                   state.dataHeatBalSurf->SurfTempInTmp(SurfNum),
    7830             :                                                                   TempSurfOutTmp); // HAMT
    7831             : 
    7832      245715 :                     if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD) {
    7833      491430 :                         HeatBalFiniteDiffManager::ManageHeatBalFiniteDiff(
    7834      491430 :                             state, SurfNum, state.dataHeatBalSurf->SurfTempInTmp(SurfNum), TempSurfOutTmp);
    7835             :                     }
    7836             : 
    7837      245715 :                     TH11 = TempSurfOutTmp;
    7838             :                 }
    7839             : 
    7840     1161782 :                 state.dataHeatBalSurf->SurfTempIn(SurfNum) = state.dataHeatBalSurf->SurfTempInTmp(SurfNum);
    7841             : 
    7842             :             } else { // Standard surface or interzone surface
    7843    35680166 :                 bool movableInsulPresent = state.dataSurface->AnyMovableInsulation && state.dataHeatBalSurf->SurfMovInsulIntPresent(SurfNum);
    7844    35680166 :                 if (!movableInsulPresent) { // No movable insulation present, normal heat balance equation
    7845             : 
    7846    46897573 :                     if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CTF ||
    7847    11217407 :                         surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::EMPD) { // Regular CTF Surface and/or EMPD surface
    7848             : 
    7849    25161898 :                         if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::EMPD) {
    7850      699139 :                             MoistureBalanceEMPDManager::CalcMoistureBalanceEMPD(
    7851      699139 :                                 state, SurfNum, state.dataHeatBalSurf->SurfTempInTmp(SurfNum), MAT_zone, SurfTempInSat);
    7852             :                         }
    7853             :                         // Pre-calculate a few terms
    7854    25161898 :                         if (state.dataHeatBalSurf->AnyRadiantSystems(SurfNum))
    7855     7278966 :                             state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(SurfNum) = GetSurfQdotRadHVACInPerArea(state, SurfNum);
    7856             :                         Real64 const TempTerm(
    7857    50323796 :                             state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) + state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum) +
    7858    75485694 :                             state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) + state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(SurfNum) +
    7859    75485694 :                             HConvIn_surf * state.dataHeatBalSurfMgr->RefAirTemp(SurfNum) + state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(SurfNum) +
    7860    25161898 :                             state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(SurfNum) +
    7861    25161898 :                             (state.dataHeatBalFanSys->QRadSurfAFNDuct(SurfNum) / state.dataGlobal->TimeStepZoneSec));
    7862    25161898 :                         Real64 const TempDiv(1.0 / (construct.CTFInside(0) + HConvIn_surf + IterDampConst));
    7863             :                         // Calculate the current inside surface temperature
    7864    50323796 :                         if ((!state.dataSurface->SurfIsPool(SurfNum)) ||
    7865           0 :                             ((state.dataSurface->SurfIsPool(SurfNum)) &&
    7866           0 :                              (std::abs(state.dataHeatBalFanSys->QPoolSurfNumerator(SurfNum)) < PoolIsOperatingLimit) &&
    7867           0 :                              (std::abs(state.dataHeatBalFanSys->PoolHeatTransCoefs(SurfNum)) < PoolIsOperatingLimit))) {
    7868    25161898 :                             if (construct.SourceSinkPresent) {
    7869     1713103 :                                 state.dataHeatBalSurf->SurfTempInTmp(SurfNum) =
    7870     3426206 :                                     (TempTerm + construct.CTFSourceIn(0) * state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1) +
    7871     3426206 :                                      IterDampConst * state.dataHeatBalSurf->SurfTempInsOld(SurfNum) + construct.CTFCross(0) * TH11) *
    7872             :                                     TempDiv; // Constant part of conduction eq (history terms) | LW radiation from internal sources | SW
    7873             :                                 // radiation from internal sources | Convection from surface to zone air | Net radiant exchange
    7874             :                                 // with other zone surfaces | Heat source/sink term for radiant systems | (if there is one
    7875             :                                 // present) | Radiant flux from high temp radiant heater | Radiant flux from a hot water
    7876             :                                 // baseboard heater | Radiant flux from a steam baseboard heater | Radiant flux from an electric
    7877             :                                 // baseboard heater | Iterative damping term (for stability) | Current conduction from | the
    7878             :                                 // outside surface | Coefficient for conduction (current time) | Convection and damping term |
    7879             :                                 // Radiation from AFN ducts
    7880             :                             } else {
    7881    23448795 :                                 state.dataHeatBalSurf->SurfTempInTmp(SurfNum) =
    7882    23448795 :                                     (TempTerm + IterDampConst * state.dataHeatBalSurf->SurfTempInsOld(SurfNum) + construct.CTFCross(0) * TH11) *
    7883             :                                     TempDiv; // Constant part of conduction eq (history terms) | LW radiation from internal sources | SW
    7884             :                                 // radiation from internal sources | Convection from surface to zone air | Net radiant exchange
    7885             :                                 // with other zone surfaces | Heat source/sink term for radiant systems | (if there is one
    7886             :                                 // present) | Radiant flux from high temp radiant heater | Radiant flux from a hot water
    7887             :                                 // baseboard heater | Radiant flux from a steam baseboard heater | Radiant flux from an electric
    7888             :                                 // baseboard heater | Iterative damping term (for stability) | Current conduction from | the
    7889             :                                 // outside surface | Coefficient for conduction (current time) | Convection and damping term |
    7890             :                                 // Radiation from AFN ducts
    7891             :                             }
    7892             :                         } else { // surface is a pool and the pool has been simulated this time step
    7893           0 :                             state.dataHeatBalSurf->SurfTempInTmp(SurfNum) =
    7894           0 :                                 (state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) + state.dataHeatBalFanSys->QPoolSurfNumerator(SurfNum) +
    7895           0 :                                  IterDampConst * state.dataHeatBalSurf->SurfTempInsOld(SurfNum) + construct.CTFCross(0) * TH11) /
    7896           0 :                                 (construct.CTFInside(0) + state.dataHeatBalFanSys->PoolHeatTransCoefs(SurfNum) +
    7897             :                                  IterDampConst); // Constant part of conduction eq (history terms) | Pool modified terms
    7898             :                             // (see non-pool equation for details) | Iterative damping term (for
    7899             :                             // stability) | Current conduction from | the outside surface |
    7900             :                             // Coefficient for conduction (current time) | Pool and damping term
    7901             :                         }
    7902    25161898 :                         if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::EMPD) {
    7903      699139 :                             state.dataHeatBalSurf->SurfTempInTmp(SurfNum) -=
    7904      699139 :                                 state.dataMstBalEMPD->HeatFluxLatent(SurfNum) *
    7905             :                                 TempDiv; // Coefficient for conduction (current time) | Convection and damping term
    7906      699139 :                             if (SurfTempInSat > state.dataHeatBalSurf->SurfTempInTmp(SurfNum)) {
    7907           0 :                                 state.dataHeatBalSurf->SurfTempInTmp(SurfNum) = SurfTempInSat; // Surface temp cannot be below dew point
    7908             :                             }
    7909             :                         }
    7910             :                         // if any mixed heat transfer models in zone, apply limits to CTF result
    7911    25161898 :                         if (state.dataHeatBalSurf->Zone_has_mixed_HT_models[ZoneNum])
    7912     4134546 :                             state.dataHeatBalSurf->SurfTempInTmp(SurfNum) = max(
    7913             :                                 MinSurfaceTempLimit,
    7914     2067273 :                                 min(state.dataHeatBalSurf->MaxSurfaceTempLimit,
    7915     2067273 :                                     state.dataHeatBalSurf->SurfTempInTmp(SurfNum))); // Limit Check //Tuned Precomputed condition to eliminate loop
    7916             : 
    7917    25161898 :                         if (construct.SourceSinkPresent) { // Set the appropriate parameters for the radiant system
    7918             : 
    7919             :                             // Radiant system does not need the damping coefficient terms (hopefully)
    7920     1713103 :                             Real64 const RadSysDiv(1.0 / (construct.CTFInside(0) + HConvIn_surf));
    7921     1713103 :                             state.dataHeatBalFanSys->RadSysTiHBConstCoef(SurfNum) =
    7922     1713103 :                                 TempTerm * RadSysDiv; // Constant portion of cond eq (history terms) | LW radiation from internal sources | SW
    7923             :                             // radiation from internal sources | Convection from surface to zone air | Radiant flux
    7924             :                             // from high temp radiant heater | Radiant flux from a hot water baseboard heater |
    7925             :                             // Radiant flux from a steam baseboard heater | Radiant flux from an electric baseboard
    7926             :                             // heater | Net radiant exchange with other zone surfaces | Cond term (both partition
    7927             :                             // sides same temp) | Convection and damping term
    7928     1713103 :                             state.dataHeatBalFanSys->RadSysTiHBToutCoef(SurfNum) =
    7929     1713103 :                                 construct.CTFCross(0) * RadSysDiv; // Outside temp=inside temp for a partition |
    7930             :                             // Cond term (both partition sides same temp) |
    7931             :                             // Convection and damping term
    7932     1713103 :                             state.dataHeatBalFanSys->RadSysTiHBQsrcCoef(SurfNum) =
    7933     1713103 :                                 construct.CTFSourceIn(0) * RadSysDiv; // QTF term for the source | Cond term (both
    7934             :                             // partition sides same temp) | Convection and
    7935             :                             // damping term
    7936             : 
    7937     1713103 :                             if (surface.ExtBoundCond > 0) { // This is an interzone partition and we need to set outside params
    7938             :                                 // The inside coefficients of one side are equal to the outside coefficients of the other side.  But,
    7939             :                                 // the inside coefficients are set up once the heat balance equation for that side has been calculated.
    7940             :                                 // For both sides to actually have been set, we have to wait until we get to the second side in the surface
    7941             :                                 // derived type.  At that point, both inside coefficient sets have been evaluated.
    7942      272062 :                                 if (surface.ExtBoundCond < SurfNum) { // Both of the inside coefficients have now been set
    7943      136031 :                                     int OtherSideSurfNum = surface.ExtBoundCond;
    7944      136031 :                                     state.dataHeatBalFanSys->RadSysToHBConstCoef(OtherSideSurfNum) =
    7945      136031 :                                         state.dataHeatBalFanSys->RadSysTiHBConstCoef(SurfNum);
    7946      136031 :                                     state.dataHeatBalFanSys->RadSysToHBTinCoef(OtherSideSurfNum) =
    7947      136031 :                                         state.dataHeatBalFanSys->RadSysTiHBToutCoef(SurfNum);
    7948      136031 :                                     state.dataHeatBalFanSys->RadSysToHBQsrcCoef(OtherSideSurfNum) =
    7949      136031 :                                         state.dataHeatBalFanSys->RadSysTiHBQsrcCoef(SurfNum);
    7950      136031 :                                     state.dataHeatBalFanSys->RadSysToHBConstCoef(SurfNum) =
    7951      136031 :                                         state.dataHeatBalFanSys->RadSysTiHBConstCoef(OtherSideSurfNum);
    7952      136031 :                                     state.dataHeatBalFanSys->RadSysToHBTinCoef(SurfNum) =
    7953      136031 :                                         state.dataHeatBalFanSys->RadSysTiHBToutCoef(OtherSideSurfNum);
    7954      136031 :                                     state.dataHeatBalFanSys->RadSysToHBQsrcCoef(SurfNum) =
    7955      136031 :                                         state.dataHeatBalFanSys->RadSysTiHBQsrcCoef(OtherSideSurfNum);
    7956             :                                 }
    7957             :                             }
    7958    25161898 :                         }
    7959             : 
    7960    11324910 :                     } else if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD ||
    7961      806642 :                                surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    7962             : 
    7963    10064963 :                         if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    7964      353337 :                             if (surface.ExtBoundCond > 0) {
    7965             :                                 // HAMT get the correct other side zone zone air temperature --
    7966           0 :                                 int OtherSideSurfNum = surface.ExtBoundCond;
    7967             :                                 // ZoneNum = surface.Zone;
    7968           0 :                                 OtherSideZoneNum = Surface(OtherSideSurfNum).Zone;
    7969           0 :                                 state.dataMstBal->TempOutsideAirFD(SurfNum) =
    7970           0 :                                     state.dataZoneTempPredictorCorrector->zoneHeatBalance(OtherSideZoneNum).MAT;
    7971             :                             }
    7972      353337 :                             HeatBalanceHAMTManager::ManageHeatBalHAMT(state, SurfNum, state.dataHeatBalSurf->SurfTempInTmp(SurfNum), TempSurfOutTmp);
    7973             :                         }
    7974             : 
    7975    10064963 :                         if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD)
    7976    19423252 :                             HeatBalFiniteDiffManager::ManageHeatBalFiniteDiff(
    7977    19423252 :                                 state, SurfNum, state.dataHeatBalSurf->SurfTempInTmp(SurfNum), TempSurfOutTmp);
    7978             : 
    7979    10064963 :                         TH11 = TempSurfOutTmp;
    7980             : 
    7981      453305 :                     } else if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::Kiva) {
    7982             :                         // Read Kiva results for each surface
    7983      453305 :                         state.dataHeatBalSurf->SurfTempInTmp(SurfNum) =
    7984      453305 :                             state.dataSurfaceGeometry->kivaManager.surfaceMap[SurfNum].results.Tconv - DataGlobalConstants::KelvinConv;
    7985             : 
    7986      453305 :                         TH11 = 0.0;
    7987             :                     }
    7988             : 
    7989    35680166 :                     state.dataHeatBalSurf->SurfTempIn(SurfNum) = state.dataHeatBalSurf->SurfTempInTmp(SurfNum);
    7990             : 
    7991             :                 } else { // Movable insulation present
    7992           0 :                     Real64 HMovInsul = state.dataHeatBalSurf->SurfMovInsulHInt(SurfNum);
    7993           0 :                     if (construct.SourceSinkPresent) {
    7994             : 
    7995           0 :                         ShowSevereError(state, "Interior movable insulation is not valid with embedded sources/sinks");
    7996           0 :                         ShowContinueError(state, "Construction " + construct.Name + " contains an internal source or sink but also uses");
    7997           0 :                         ShowContinueError(state,
    7998           0 :                                           "interior movable insulation " +
    7999           0 :                                               state.dataMaterial->Material(state.dataSurface->SurfMaterialMovInsulInt(SurfNum)).Name +
    8000             :                                               " for a surface with that construction.");
    8001           0 :                         ShowContinueError(state,
    8002             :                                           "This is not currently allowed because the heat balance equations do not currently accommodate "
    8003             :                                           "this combination.");
    8004           0 :                         ShowFatalError(state, "CalcHeatBalanceInsideSurf: Program terminates due to preceding conditions.");
    8005             :                     }
    8006             : 
    8007           0 :                     Real64 F1 = HMovInsul / (HMovInsul + HConvIn_surf + IterDampConst);
    8008             : 
    8009           0 :                     if (state.dataHeatBalSurf->AnyRadiantSystems(SurfNum))
    8010           0 :                         state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(SurfNum) = GetSurfQdotRadHVACInPerArea(state, SurfNum);
    8011           0 :                     state.dataHeatBalSurf->SurfTempIn(SurfNum) =
    8012           0 :                         (state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) +
    8013           0 :                          construct.CTFCross(0) * TH11 +
    8014           0 :                          F1 * (state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum) +
    8015           0 :                                HConvIn_surf * state.dataHeatBalSurfMgr->RefAirTemp(SurfNum) +
    8016           0 :                                state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(SurfNum) + state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(SurfNum) +
    8017           0 :                                state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(SurfNum) +
    8018           0 :                                IterDampConst * state.dataHeatBalSurf->SurfTempInsOld(SurfNum))) /
    8019           0 :                         (construct.CTFInside(0) + HMovInsul - F1 * HMovInsul); // Convection from surface to zone air
    8020             : 
    8021           0 :                     state.dataHeatBalSurf->SurfTempInTmp(SurfNum) =
    8022           0 :                         (construct.CTFInside(0) * state.dataHeatBalSurf->SurfTempIn(SurfNum) +
    8023           0 :                          HMovInsul * state.dataHeatBalSurf->SurfTempIn(SurfNum) - state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) -
    8024           0 :                          state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) - construct.CTFCross(0) * TH11) /
    8025             :                         (HMovInsul);
    8026             :                     // if any mixed heat transfer models in zone, apply limits to CTF result
    8027           0 :                     if (state.dataHeatBalSurf->Zone_has_mixed_HT_models[ZoneNum])
    8028           0 :                         state.dataHeatBalSurf->SurfTempInTmp(SurfNum) =
    8029           0 :                             max(MinSurfaceTempLimit,
    8030           0 :                                 min(state.dataHeatBalSurf->MaxSurfaceTempLimit,
    8031           0 :                                     state.dataHeatBalSurf->SurfTempInTmp(SurfNum))); // Limit Check //Tuned Precomputed condition to eliminate loop
    8032             :                 }
    8033             :             }
    8034             :         }
    8035     5931363 :         for (int SurfNum : HTWindowSurfs) {
    8036     2959590 :             auto &surface(Surface(SurfNum));
    8037     2959590 :             if (state.dataSurface->UseRepresentativeSurfaceCalculations) {
    8038           0 :                 int repSurfNum = surface.RepresentativeCalcSurfNum;
    8039           0 :                 if (SurfNum != repSurfNum) continue;
    8040             :             }
    8041     2959590 :             Real64 &TH11(state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum));
    8042     2959590 :             int const ConstrNum = state.dataSurface->SurfActiveConstruction(SurfNum); // Not const, because storm window may change this
    8043     2959590 :             auto const &construct(state.dataConstruction->Construct(ConstrNum));
    8044     2959590 :             if (state.dataSurface->SurfWinOriginalClass(SurfNum) == SurfaceClass::TDD_Diffuser) { // Tubular daylighting device
    8045             :                 // Lookup up the TDD:DOME object
    8046           0 :                 int const pipeNum = state.dataSurface->SurfWinTDDPipeNum(SurfNum);
    8047           0 :                 int const domeNum = state.dataDaylightingDevicesData->TDDPipe(pipeNum).Dome;
    8048             :                 // Ueff = 1 / effective R value between TDD:DOME and TDD:DIFFUSER
    8049           0 :                 Real64 Ueff = 1.0 / state.dataDaylightingDevicesData->TDDPipe(pipeNum).Reff;
    8050             : 
    8051             :                 // Similar to opaque surface but outside surface temp of TDD:DOME is used, and no embedded sources/sinks.
    8052             :                 // Absorbed shortwave radiation is treated similar to a regular window, but only 1 glass layer is allowed.
    8053             :                 //   = SurfWinQRadSWwinAbs(SurfNum,1)/2.0
    8054           0 :                 Real64 const HConvIn_surf(state.dataMstBal->HConvInFD(SurfNum) = state.dataHeatBalSurf->SurfHConvInt(SurfNum));
    8055           0 :                 state.dataHeatBalSurf->SurfTempInTmp(SurfNum) =
    8056           0 :                     (state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum) + state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, 1) / 2.0 +
    8057           0 :                      state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(SurfNum) + HConvIn_surf * state.dataHeatBalSurfMgr->RefAirTemp(SurfNum) +
    8058           0 :                      state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(SurfNum) + IterDampConst * state.dataHeatBalSurf->SurfTempInsOld(SurfNum) +
    8059           0 :                      Ueff * state.dataHeatBalSurf->SurfOutsideTempHist(1)(domeNum)) /
    8060           0 :                     (Ueff + HConvIn_surf + IterDampConst); // LW radiation from internal sources | SW radiation from internal sources and
    8061             :                                                            // solar | Convection from surface to zone air | Net radiant exchange with
    8062             :                                                            // other zone surfaces | Iterative damping term (for stability) | Current
    8063             :                                                            // conduction from the outside surface | Coefficient for conduction (current
    8064             :                                                            // time) | Convection and damping term
    8065           0 :                 state.dataHeatBalSurf->SurfTempIn(SurfNum) = state.dataHeatBalSurf->SurfTempInTmp(SurfNum);
    8066             : 
    8067             :                 Real64 const Sigma_Temp_4(DataGlobalConstants::StefanBoltzmann *
    8068           0 :                                           pow_4(state.dataHeatBalSurf->SurfTempIn(SurfNum) + DataGlobalConstants::KelvinConv));
    8069             : 
    8070             :                 // Calculate window heat gain for TDD:DIFFUSER since this calculation is usually done in WindowManager
    8071           0 :                 if (state.dataHeatBalSurf->AnyRadiantSystems(SurfNum))
    8072           0 :                     state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(SurfNum) = GetSurfQdotRadHVACInPerArea(state, SurfNum);
    8073           0 :                 state.dataSurface->SurfWinHeatGain(SurfNum) =
    8074           0 :                     state.dataSurface->SurfWinTransSolar(SurfNum) +
    8075           0 :                     HConvIn_surf * surface.Area * (state.dataHeatBalSurf->SurfTempIn(SurfNum) - state.dataHeatBalSurfMgr->RefAirTemp(SurfNum)) +
    8076           0 :                     state.dataConstruction->Construct(surface.Construction).InsideAbsorpThermal * surface.Area *
    8077           0 :                         (Sigma_Temp_4 -
    8078           0 :                          (state.dataSurface->SurfWinIRfromParentZone(SurfNum) + state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(SurfNum))) -
    8079           0 :                     state.dataHeatBal->EnclSolQSWRad(surface.SolarEnclIndex) * surface.Area *
    8080           0 :                         state.dataConstruction->Construct(surface.Construction).TransDiff;
    8081             :                 // Transmitted solar | Convection | IR exchange | IR
    8082             :                 // Zone diffuse interior shortwave reflected back into the TDD
    8083             : 
    8084             :                 // fill out report vars for components of Window Heat Gain
    8085           0 :                 state.dataSurface->SurfWinGainConvGlazToZoneRep(SurfNum) =
    8086           0 :                     HConvIn_surf * surface.Area * (state.dataHeatBalSurf->SurfTempIn(SurfNum) - state.dataHeatBalSurfMgr->RefAirTemp(SurfNum));
    8087           0 :                 state.dataSurface->SurfWinGainIRGlazToZoneRep(SurfNum) =
    8088           0 :                     state.dataConstruction->Construct(surface.Construction).InsideAbsorpThermal * surface.Area *
    8089           0 :                     (Sigma_Temp_4 - (state.dataSurface->SurfWinIRfromParentZone(SurfNum) + state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(SurfNum)));
    8090           0 :                 state.dataSurface->SurfWinLossSWZoneToOutWinRep(SurfNum) = state.dataHeatBal->EnclSolQSWRad(surface.SolarEnclIndex) * surface.Area *
    8091           0 :                                                                            state.dataConstruction->Construct(surface.Construction).TransDiff;
    8092             :             } else {                                                // Regular window
    8093     2959590 :                 if (state.dataHeatBal->InsideSurfIterations == 0) { // Do windows only once
    8094             :                     // Get outside convection coeff for exterior window here to avoid calling
    8095             :                     // InitExteriorConvectionCoeff from CalcWindowHeatBalance, which avoids circular reference
    8096             :                     // (HeatBalanceSurfaceManager USEing and WindowManager and
    8097             :                     // WindowManager USEing HeatBalanceSurfaceManager)
    8098      892690 :                     if (surface.ExtBoundCond == ExternalEnvironment) {
    8099             :                         DataSurfaces::SurfaceRoughness RoughSurf =
    8100      892690 :                             state.dataMaterial->Material(construct.LayerPoint(1)).Roughness;                       // Outside surface roughness
    8101      892690 :                         Real64 EmisOut = state.dataMaterial->Material(construct.LayerPoint(1)).AbsorpThermalFront; // Glass outside surface emissivity
    8102      892690 :                         auto const shading_flag(state.dataSurface->SurfWinShadingFlag(SurfNum));
    8103      892690 :                         if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(shading_flag)) {
    8104             :                             // Exterior shade in place
    8105           0 :                             int const ConstrNumSh = Surface(SurfNum).activeShadedConstruction;
    8106           0 :                             if (ConstrNumSh != 0) {
    8107           0 :                                 RoughSurf = state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNumSh).LayerPoint(1)).Roughness;
    8108           0 :                                 EmisOut = state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNumSh).LayerPoint(1)).AbsorpThermal;
    8109             :                             }
    8110             :                         }
    8111             : 
    8112             :                         // Get the outside effective emissivity for Equivalent layer model
    8113      892690 :                         if (construct.WindowTypeEQL) {
    8114           0 :                             EmisOut = WindowEquivalentLayer::EQLWindowOutsideEffectiveEmiss(state, ConstrNum);
    8115             :                         }
    8116             :                         // Set Exterior Convection Coefficient...
    8117      892690 :                         if (state.dataSurface->SurfExtConvCoeffIndex(SurfNum) > 0) {
    8118             : 
    8119           0 :                             state.dataHeatBalSurf->SurfHcExt(SurfNum) = ConvectionCoefficients::SetExtConvectionCoeff(state, SurfNum);
    8120             : 
    8121      892690 :                         } else if (surface.ExtWind) { // Window is exposed to wind (and possibly rain)
    8122             : 
    8123             :                             // Calculate exterior heat transfer coefficients with windspeed (windspeed is calculated internally in
    8124             :                             // subroutine)
    8125      892690 :                             ConvectionCoefficients::InitExteriorConvectionCoeff(state,
    8126             :                                                                                 SurfNum,
    8127             :                                                                                 0.0,
    8128             :                                                                                 RoughSurf,
    8129             :                                                                                 EmisOut,
    8130             :                                                                                 TH11,
    8131      892690 :                                                                                 state.dataHeatBalSurf->SurfHcExt(SurfNum),
    8132      892690 :                                                                                 state.dataHeatBalSurf->SurfHSkyExt(SurfNum),
    8133      892690 :                                                                                 state.dataHeatBalSurf->SurfHGrdExt(SurfNum),
    8134      892690 :                                                                                 state.dataHeatBalSurf->SurfHAirExt(SurfNum));
    8135             : 
    8136      892690 :                             if (state.dataEnvrn->IsRain) {                          // Raining: since wind exposed, outside window surface gets wet
    8137           0 :                                 state.dataHeatBalSurf->SurfHcExt(SurfNum) = 1000.0; // Reset SurfHcExt because of wetness
    8138             :                             }
    8139             : 
    8140             :                         } else { // Not Wind exposed
    8141             : 
    8142             :                             // Calculate exterior heat transfer coefficients for windspeed = 0
    8143           0 :                             ConvectionCoefficients::InitExteriorConvectionCoeff(state,
    8144             :                                                                                 SurfNum,
    8145             :                                                                                 0.0,
    8146             :                                                                                 RoughSurf,
    8147             :                                                                                 EmisOut,
    8148             :                                                                                 TH11,
    8149           0 :                                                                                 state.dataHeatBalSurf->SurfHcExt(SurfNum),
    8150           0 :                                                                                 state.dataHeatBalSurf->SurfHSkyExt(SurfNum),
    8151           0 :                                                                                 state.dataHeatBalSurf->SurfHGrdExt(SurfNum),
    8152           0 :                                                                                 state.dataHeatBalSurf->SurfHAirExt(SurfNum));
    8153             :                         }
    8154             :                     } else { // Interior Surface
    8155             : 
    8156           0 :                         if (state.dataSurface->SurfExtConvCoeffIndex(SurfNum) > 0) {
    8157           0 :                             state.dataHeatBalSurf->SurfHcExt(SurfNum) = ConvectionCoefficients::SetExtConvectionCoeff(state, SurfNum);
    8158             :                         } else {
    8159             :                             // Exterior Convection Coefficient for the Interior or Interzone Window is the Interior Convection Coeff of
    8160             :                             // same
    8161           0 :                             state.dataHeatBalSurf->SurfHcExt(SurfNum) = state.dataHeatBalSurf->SurfHConvInt(surface.ExtBoundCond);
    8162             :                         }
    8163             :                     }
    8164             : 
    8165             :                     // Following call determines inside surface temperature of glazing, and of
    8166             :                     // frame and/or divider, if present
    8167      892690 :                     CalcWindowHeatBalance(
    8168      892690 :                         state, SurfNum, state.dataHeatBalSurf->SurfHcExt(SurfNum), state.dataHeatBalSurf->SurfTempInTmp(SurfNum), TH11);
    8169             : 
    8170      892690 :                     state.dataHeatBalSurf->SurfTempIn(SurfNum) = state.dataHeatBalSurf->SurfTempInTmp(SurfNum);
    8171             :                 }
    8172             :             }
    8173             :         } // ...end of inside surface heat balance equation selection
    8174             : 
    8175    42773311 :         for (int SurfNum : HTSurfs) {
    8176    39801538 :             int const ZoneNum = Surface(SurfNum).Zone;
    8177    39801538 :             auto &zone(state.dataHeatBal->Zone(ZoneNum));
    8178    39801538 :             Real64 &TH11(state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum));
    8179    39801538 :             Real64 &TH12(state.dataHeatBalSurf->SurfInsideTempHist(1)(SurfNum));
    8180    39801538 :             TH12 = state.dataHeatBalSurf->SurfTempIn(SurfNum);
    8181    39801538 :             state.dataHeatBalSurf->SurfTempOut(SurfNum) = TH11; // For reporting
    8182    39801538 :             if (state.dataSurface->SurfWinOriginalClass(SurfNum) == SurfaceClass::TDD_Dome) continue;
    8183    39801538 :             if (state.dataSurface->SurfWinOriginalClass(SurfNum) == SurfaceClass::TDD_Diffuser) { // Tubular daylighting device
    8184             :                 // Tubular daylighting devices are treated as one big object with an effective R value.
    8185             :                 // The outside face temperature of the TDD:DOME and the inside face temperature of the
    8186             :                 // TDD:DIFFUSER are calculated with the outside and inside heat balances respectively.
    8187             :                 // Below, the resulting temperatures are copied to the inside face of the TDD:DOME
    8188             :                 // and the outside face of the TDD:DIFFUSER for reporting.
    8189             : 
    8190             :                 // Set inside temp variables of TDD:DOME equal to inside temp of TDD:DIFFUSER
    8191           0 :                 int domeNum = state.dataDaylightingDevicesData->TDDPipe(state.dataSurface->SurfWinTDDPipeNum(SurfNum)).Dome;
    8192           0 :                 state.dataHeatBalSurf->SurfInsideTempHist(1)(domeNum) = state.dataHeatBalSurf->SurfTempIn(domeNum) =
    8193           0 :                     state.dataHeatBalSurf->SurfTempInTmp(domeNum) = state.dataHeatBalSurf->SurfTempIn(SurfNum);
    8194             : 
    8195             :                 // Set outside temp reporting variable of TDD:DOME (since it gets skipped otherwise)
    8196             :                 // Reset outside temp variables of TDD:DIFFUSER equal to outside temp of TDD:DOME
    8197           0 :                 TH11 = state.dataHeatBalSurf->SurfTempOut(SurfNum) = state.dataHeatBalSurf->SurfTempOut(domeNum) =
    8198           0 :                     state.dataHeatBalSurf->SurfOutsideTempHist(1)(domeNum);
    8199             :             }
    8200             : 
    8201    39801538 :             if ((TH12 > state.dataHeatBalSurf->MaxSurfaceTempLimit) || (TH12 < MinSurfaceTempLimit)) {
    8202           0 :                 TestSurfTempCalcHeatBalanceInsideSurf(state, TH12, SurfNum, zone, state.dataHeatBalSurfMgr->calcHeatBalInsideSurfWarmupErrCount);
    8203             :             }
    8204             : 
    8205             :         } // ...end of main loops over all surfaces for inside heat balances
    8206             : 
    8207             :         // Interzone surface updating: interzone surfaces have other side temperatures
    8208             :         // which can vary as the simulation iterates through the inside heat
    8209             :         // balance.  This block is intended to "lock" the opposite side (outside)
    8210             :         // temperatures to the correct value, namely the value calculated by the
    8211             :         // inside surface heat balance for the other side.
    8212             :         //        assert(state.dataHeatBalSurf->TH.index(1, 1, 1) == 0u); // Assumed for linear indexing below
    8213             :         //        auto const l211(state.dataHeatBalSurf->TH.index(2, 1, 1) - 1);
    8214    22052851 :         for (int SurfNum : IZSurfs) {
    8215    19081078 :             int const surfExtBoundCond(Surface(SurfNum).ExtBoundCond);
    8216             :             // Set the outside surface temperature to the inside surface temperature of the interzone pair.
    8217             :             // By going through all of the surfaces, this should pick up the other side as well as affect the next iteration.
    8218             :             // [ SurfNum - 1 ] == ( 1, 1, SurfNum )
    8219             :             // [ l211 + surfExtBoundCond ] == ( 2, 1, surfExtBoundCond )
    8220    19081078 :             state.dataHeatBalSurf->SurfTempOut(SurfNum) = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum) =
    8221    19081078 :                 state.dataHeatBalSurf->SurfInsideTempHist(1)(surfExtBoundCond);
    8222             :         }
    8223             : 
    8224     2971773 :         ++state.dataHeatBal->InsideSurfIterations;
    8225             : 
    8226             :         // Convergence check - Loop through all relevant non-window surfaces to check for convergence...
    8227     2971773 :         Real64 MaxDelTemp = 0.0; // Maximum change in surface temperature for any opaque surface from one iteration to the next
    8228    39813721 :         for (int SurfNum : HTNonWindowSurfs) {
    8229    36841948 :             MaxDelTemp = max(std::abs(state.dataHeatBalSurf->SurfTempIn(SurfNum) - state.dataHeatBalSurf->SurfTempInsOld(SurfNum)), MaxDelTemp);
    8230    36841948 :             if (Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD) {
    8231             :                 // also check all internal nodes as well as surface faces
    8232     9957341 :                 MaxDelTemp = max(MaxDelTemp, state.dataHeatBalFiniteDiffMgr->SurfaceFD(SurfNum).MaxNodeDelTemp);
    8233             :             }
    8234             :         } // ...end of loop to check for convergence
    8235             : 
    8236     2971773 :         if (!state.dataHeatBal->AnyCondFD) {
    8237     2008693 :             if (MaxDelTemp <= state.dataHeatBal->MaxAllowedDelTemp) Converged = true;
    8238             :         } else {
    8239      963080 :             if (MaxDelTemp <= state.dataHeatBal->MaxAllowedDelTempCondFD) Converged = true;
    8240             : 
    8241             :             // resets relaxation factor to speed up iterations when under-relaxation is not needed.
    8242      963080 :             if (state.dataHeatBal->InsideSurfIterations <= 1) {
    8243      327964 :                 state.dataHeatBal->CondFDRelaxFactor = state.dataHeatBal->CondFDRelaxFactorInput;
    8244             :             }
    8245      963080 :             if ((state.dataHeatBal->InsideSurfIterations > IterationsForCondFDRelaxChange) && !Converged) {
    8246             :                 // adjust relaxation factor down, assume large number of iterations is result of instability
    8247        1364 :                 state.dataHeatBal->CondFDRelaxFactor *= 0.9;
    8248        1364 :                 if (state.dataHeatBal->CondFDRelaxFactor < 0.1) state.dataHeatBal->CondFDRelaxFactor = 0.1;
    8249             :             }
    8250             :         }
    8251             : 
    8252             : #ifdef EP_Count_Calls
    8253             :         state.dataTimingsData->NumMaxInsideSurfIterations =
    8254             :             max(state.dataTimingsData->NumMaxInsideSurfIterations, state.dataHeatBal->InsideSurfIterations);
    8255             : #endif
    8256             : 
    8257     2971773 :         if (state.dataHeatBal->InsideSurfIterations < state.dataHeatBalSurf->MinIterations) Converged = false;
    8258             : 
    8259     2971773 :         if (state.dataHeatBal->InsideSurfIterations > MaxIterations) {
    8260           0 :             if (!state.dataGlobal->WarmupFlag) {
    8261           0 :                 ++state.dataHeatBalSurfMgr->calcHeatBalInsideSurfErrCount;
    8262           0 :                 if (state.dataHeatBalSurfMgr->calcHeatBalInsideSurfErrCount < 16) {
    8263           0 :                     if (!state.dataHeatBal->AnyCondFD) {
    8264           0 :                         ShowWarningError(state,
    8265           0 :                                          format("Inside surface heat balance did not converge with Max Temp Difference [C] ={:.3R} vs Max "
    8266             :                                                 "Allowed Temp Diff [C] ={:.3R}",
    8267             :                                                 MaxDelTemp,
    8268           0 :                                                 state.dataHeatBal->MaxAllowedDelTemp));
    8269           0 :                         ShowContinueErrorTimeStamp(state, "");
    8270             :                     } else {
    8271           0 :                         ShowWarningError(state,
    8272           0 :                                          format("Inside surface heat balance did not converge with Max Temp Difference [C] ={:.3R} vs Max "
    8273             :                                                 "Allowed Temp Diff [C] ={:.6R}",
    8274             :                                                 MaxDelTemp,
    8275           0 :                                                 state.dataHeatBal->MaxAllowedDelTempCondFD));
    8276           0 :                         ShowContinueErrorTimeStamp(state, "");
    8277             :                     }
    8278             :                 } else {
    8279           0 :                     ShowRecurringWarningErrorAtEnd(state,
    8280             :                                                    "Inside surface heat balance convergence problem continues",
    8281           0 :                                                    state.dataHeatBalSurfMgr->calcHeatBalInsideSurfErrPointer,
    8282             :                                                    MaxDelTemp,
    8283             :                                                    MaxDelTemp,
    8284             :                                                    _,
    8285             :                                                    "[C]",
    8286             :                                                    "[C]");
    8287             :                 }
    8288             :             }
    8289           0 :             break; // iteration loop
    8290             :         }
    8291             : 
    8292             :     } // ...end of main inside heat balance DO loop (ends when Converged)
    8293             : 
    8294             :     // Update SumHmXXXX for non-window EMPD or HAMT surfaces
    8295     1018624 :     if (state.dataHeatBal->AnyEMPD || state.dataHeatBal->AnyHAMT) {
    8296             : 
    8297             :         // these SumHmA* variables are only used for EMPD and HAMT and should be reset each time step (and every iteration)
    8298       94956 :         for (auto &thisZoneHB : state.dataZoneTempPredictorCorrector->zoneHeatBalance) {
    8299       54963 :             thisZoneHB.SumHmAW = 0.0;
    8300       54963 :             thisZoneHB.SumHmARa = 0.0;
    8301       54963 :             thisZoneHB.SumHmARaW = 0.0;
    8302             :         }
    8303             : 
    8304      381747 :         for (int SurfNum : HTNonWindowSurfs) {
    8305      341754 :             auto const &surface(Surface(SurfNum));
    8306      341754 :             int ZoneNum = surface.Zone;
    8307      341754 :             auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum);
    8308             : 
    8309      341754 :             if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::HAMT) {
    8310      171564 :                 HeatBalanceHAMTManager::UpdateHeatBalHAMT(state, SurfNum);
    8311             : 
    8312      171564 :                 Real64 const FD_Area_fac(state.dataMstBal->HMassConvInFD(SurfNum) * surface.Area);
    8313             : 
    8314      171564 :                 thisZoneHB.SumHmAW += FD_Area_fac * (state.dataMstBal->RhoVaporSurfIn(SurfNum) - state.dataMstBal->RhoVaporAirIn(SurfNum));
    8315             : 
    8316      171564 :                 Real64 const MAT_zone(state.dataZoneTempPredictorCorrector->zoneHeatBalance(surface.Zone).MAT);
    8317      514692 :                 RhoAirZone = Psychrometrics::PsyRhoAirFnPbTdbW(
    8318             :                     state,
    8319      171564 :                     state.dataEnvrn->OutBaroPress,
    8320             :                     MAT_zone,
    8321             :                     Psychrometrics::PsyWFnTdbRhPb(
    8322             :                         state,
    8323             :                         MAT_zone,
    8324      171564 :                         Psychrometrics::PsyRhFnTdbRhov(state, MAT_zone, state.dataMstBal->RhoVaporAirIn(SurfNum), rhoAirZone),
    8325      171564 :                         state.dataEnvrn->OutBaroPress));
    8326             : 
    8327      171564 :                 Real64 const surfInTemp(state.dataHeatBalSurf->SurfTempInTmp(SurfNum));
    8328      171564 :                 Wsurf =
    8329      514692 :                     Psychrometrics::PsyWFnTdbRhPb(state,
    8330             :                                                   surfInTemp,
    8331      171564 :                                                   Psychrometrics::PsyRhFnTdbRhov(state, surfInTemp, state.dataMstBal->RhoVaporSurfIn(SurfNum), wsurf),
    8332      171564 :                                                   state.dataEnvrn->OutBaroPress);
    8333             : 
    8334      171564 :                 thisZoneHB.SumHmARa += FD_Area_fac * RhoAirZone;
    8335             : 
    8336      171564 :                 thisZoneHB.SumHmARaW += FD_Area_fac * state.dataMstBal->RhoVaporSurfIn(SurfNum); // old eq'n: FD_Area_fac * RhoAirZone * Wsurf;
    8337             : 
    8338      170190 :             } else if (surface.HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::EMPD) {
    8339             :                 // need to calculate the amount of moisture that is entering or
    8340             :                 // leaving the zone  Qm [kg/sec] = hmi * Area * (Del Rhov)
    8341             :                 // {Hmi [m/sec];     Area [m2];    Rhov [kg moist/m3]  }
    8342             :                 // Positive values are into the zone and negative values are
    8343             :                 // leaving the zone.  SumHmAw is the sum of the moisture entering or
    8344             :                 // leaving the zone from all of the surfaces and is a rate.  Multiply
    8345             :                 // by time to get the actual amount affecting the zone volume of air.
    8346             : 
    8347      150018 :                 MoistureBalanceEMPDManager::UpdateMoistureBalanceEMPD(state, SurfNum);
    8348      150018 :                 state.dataMstBal->RhoVaporSurfIn(SurfNum) = state.dataMstBalEMPD->RVSurface(SurfNum);
    8349      150018 :                 Real64 const FD_Area_fac(state.dataMstBal->HMassConvInFD(SurfNum) * surface.Area);
    8350      150018 :                 thisZoneHB.SumHmAW += FD_Area_fac * (state.dataMstBal->RhoVaporSurfIn(SurfNum) - state.dataMstBal->RhoVaporAirIn(SurfNum));
    8351      150018 :                 Real64 const MAT_zone(state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT);
    8352      150018 :                 thisZoneHB.SumHmARa +=
    8353      150018 :                     FD_Area_fac *
    8354      600072 :                     Psychrometrics::PsyRhoAirFnPbTdbW(
    8355             :                         state,
    8356      150018 :                         state.dataEnvrn->OutBaroPress,
    8357             :                         MAT_zone,
    8358             :                         Psychrometrics::PsyWFnTdbRhPb(state,
    8359             :                                                       MAT_zone,
    8360      150018 :                                                       Psychrometrics::PsyRhFnTdbRhovLBnd0C(state, MAT_zone, state.dataMstBal->RhoVaporAirIn(SurfNum)),
    8361      150018 :                                                       state.dataEnvrn->OutBaroPress)); // surfInTemp, PsyWFnTdbRhPb( surfInTemp, PsyRhFnTdbRhovLBnd0C(
    8362             :                 // surfInTemp, RhoVaporAirIn( SurfNum ) ), OutBaroPress ) );
    8363      150018 :                 thisZoneHB.SumHmARaW += FD_Area_fac * state.dataMstBal->RhoVaporSurfIn(SurfNum);
    8364             :             }
    8365             :         }
    8366             :     }
    8367     1018624 : }
    8368             : 
    8369     2469152 : void CalcHeatBalanceInsideSurf2CTFOnly(EnergyPlusData &state,
    8370             :                                        const int FirstZone,             // First zone to simulate
    8371             :                                        const int LastZone,              // Last zone to simulate
    8372             :                                        const std::vector<int> &IZSurfs, // Last zone to simulate
    8373             :                                        Optional_int_const ZoneToResimulate)
    8374             : {
    8375             : 
    8376             :     // This function performs a heat balance on the inside face of each
    8377             :     // surface in the building. It is a copy of CalcHeatBalanceInsideSurf,
    8378             :     // simplified for CTF surfaces only.
    8379             : 
    8380             :     // REFERENCES:
    8381             :     // (I)BLAST legacy routine HBSRF
    8382     2469152 :     auto &Surface(state.dataSurface->Surface);
    8383             : 
    8384     2469152 :     constexpr const char *Inside("Inside");
    8385             : 
    8386     2469152 :     if (state.dataHeatBalSurfMgr->calcHeatBalInsideSurfCTFOnlyFirstTime) {
    8387             :         // Set up coefficient arrays that never change - loop over non-window HT surfaces
    8388        5478 :         for (int zoneNum = FirstZone; zoneNum <= LastZone; ++zoneNum) {
    8389        9464 :             for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    8390        4734 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
    8391        4734 :                 int const firstSurf = thisSpace.OpaqOrIntMassSurfaceFirst;
    8392        4734 :                 int const lastSurf = thisSpace.OpaqOrIntMassSurfaceLast;
    8393       40339 :                 for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    8394       35605 :                     int const ConstrNum = Surface(surfNum).Construction;
    8395       35605 :                     auto const &construct(state.dataConstruction->Construct(ConstrNum));
    8396       35605 :                     if (Surface(surfNum).ExtBoundCond == surfNum) {
    8397        5820 :                         state.dataHeatBalSurf->SurfIsAdiabatic(surfNum) = 1;
    8398             :                     } else {
    8399       29785 :                         state.dataHeatBalSurf->SurfIsAdiabatic(surfNum) = 0;
    8400             :                     }
    8401       35605 :                     if (construct.SourceSinkPresent) {
    8402         127 :                         state.dataHeatBalSurf->SurfIsSourceOrSink(surfNum) = 1;
    8403             :                     } else {
    8404       35478 :                         state.dataHeatBalSurf->SurfIsSourceOrSink(surfNum) = 0;
    8405             :                     }
    8406             :                 }
    8407             :             }
    8408             :         }
    8409             : 
    8410         748 :         state.dataHeatBalSurfMgr->calcHeatBalInsideSurfCTFOnlyFirstTime = false;
    8411             :     }
    8412             : 
    8413    20791201 :     for (int zoneNum = FirstZone; zoneNum <= LastZone; ++zoneNum) {
    8414    36660274 :         for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    8415    18338225 :             auto &thisSpace = state.dataHeatBal->space(spaceNum);
    8416             :             // loop over all heat transfer surface except TDD Dome.
    8417    18338225 :             int const firstSurf = thisSpace.OpaqOrWinSurfaceFirst;
    8418    18338225 :             int const lastSurf = thisSpace.OpaqOrWinSurfaceLast;
    8419             :             // determine reference air temperatures and other variable terms - loop over all surfaces
    8420   176974917 :             for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    8421   158636692 :                 auto &surface(Surface(surfNum));
    8422   158636692 :                 if (state.dataSurface->UseRepresentativeSurfaceCalculations) {
    8423      397773 :                     int repSurfNum = surface.RepresentativeCalcSurfNum;
    8424      397773 :                     if (surfNum != repSurfNum) continue;
    8425             :                 }
    8426             : 
    8427   158546695 :                 int const ConstrNum = Surface(surfNum).Construction;
    8428   158546695 :                 auto const &construct(state.dataConstruction->Construct(ConstrNum));
    8429   158546695 :                 state.dataHeatBalSurf->SurfCTFCross0(surfNum) = construct.CTFCross(0);
    8430   158546695 :                 state.dataHeatBalSurf->SurfCTFInside0(surfNum) = construct.CTFInside(0);
    8431   158546695 :                 state.dataHeatBalSurf->SurfCTFSourceIn0(surfNum) = construct.CTFSourceIn(0);
    8432   158546695 :                 state.dataHeatBalSurf->SurfTempOutHist(surfNum) = state.dataHeatBalSurf->SurfOutsideTempHist(1)(surfNum);
    8433   158546695 :                 if (construct.SourceSinkPresent) {
    8434      805953 :                     state.dataHeatBalSurf->SurfQSourceSinkHist(surfNum) = state.dataHeatBalSurf->SurfQsrcHist(surfNum, 1);
    8435             :                 }
    8436             : 
    8437   158546695 :                 if (state.dataHeatBalSurf->AnyRadiantSystems(surfNum))
    8438     1529500 :                     state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(surfNum) = GetSurfQdotRadHVACInPerArea(state, surfNum);
    8439             :                 // The special heat balance terms for pools are used only when the pool is operating, so IsPool can change
    8440   158546695 :                 if (state.dataSurface->SurfIsPool(surfNum)) {
    8441       13656 :                     if ((std::abs(state.dataHeatBalFanSys->QPoolSurfNumerator(surfNum)) >= PoolIsOperatingLimit) ||
    8442        2706 :                         (std::abs(state.dataHeatBalFanSys->PoolHeatTransCoefs(surfNum)) >= PoolIsOperatingLimit)) {
    8443        8244 :                         state.dataHeatBalSurf->SurfIsOperatingPool(surfNum) = 1;
    8444             :                     } else {
    8445        2706 :                         state.dataHeatBalSurf->SurfIsOperatingPool(surfNum) = 0;
    8446             :                     }
    8447             :                 }
    8448   158546695 :                 Real64 RefAirTemp = state.dataSurface->Surface(surfNum).getInsideAirTemperature(state, surfNum);
    8449   158546695 :                 state.dataHeatBalSurfMgr->RefAirTemp(surfNum) = RefAirTemp;
    8450   158546695 :                 state.dataHeatBal->SurfTempEffBulkAir(surfNum) = state.dataHeatBalSurfMgr->RefAirTemp(surfNum);
    8451             :             }
    8452             : 
    8453             :             // Following variables must be reset due to possible recall of this routine by radiant and Resimulate routines.
    8454             :             // CalcWindowHeatBalance is called, then, multiple times and these need to be initialized before each call to
    8455             :             // CalcWindowHeatBalance.
    8456             :             // Only for Surface(SurfNum).Class == DataSurfaces::SurfaceClass::Window
    8457    18338225 :             int const firstWindowSurf = thisSpace.WindowSurfaceFirst;
    8458    18338225 :             int const lastWindowSurf = thisSpace.WindowSurfaceLast;
    8459    40288297 :             for (int surfNum = firstWindowSurf; surfNum <= lastWindowSurf; ++surfNum) {
    8460    21950072 :                 state.dataSurface->SurfWinHeatGain(surfNum) = 0.0;
    8461    21950072 :                 state.dataSurface->SurfWinHeatGainRep(surfNum) = 0.0;
    8462    21950072 :                 state.dataSurface->SurfWinHeatLossRep(surfNum) = 0.0;
    8463    21950072 :                 state.dataSurface->SurfWinGainConvGlazToZoneRep(surfNum) = 0.0;
    8464    21950072 :                 state.dataSurface->SurfWinGainIRGlazToZoneRep(surfNum) = 0.0;
    8465    21950072 :                 state.dataSurface->SurfWinLossSWZoneToOutWinRep(surfNum) = 0.0;
    8466    21950072 :                 state.dataSurface->SurfWinGainFrameDividerToZoneRep(surfNum) = 0.0;
    8467    21950072 :                 state.dataSurface->SurfWinGainConvShadeToZoneRep(surfNum) = 0.0;
    8468    21950072 :                 state.dataSurface->SurfWinGainIRShadeToZoneRep(surfNum) = 0.0;
    8469    21950072 :                 state.dataSurface->SurfWinFrameQRadOutAbs(surfNum) = 0.0;
    8470    21950072 :                 state.dataSurface->SurfWinFrameQRadInAbs(surfNum) = 0.0;
    8471    21950072 :                 state.dataSurface->SurfWinDividerQRadOutAbs(surfNum) = 0.0;
    8472    21950072 :                 state.dataSurface->SurfWinDividerQRadInAbs(surfNum) = 0.0;
    8473             :             }
    8474             : 
    8475             :             // Calculate heat extract due to additional heat flux source term as the surface boundary condition - all HT surfaces
    8476    18338225 :             if (state.dataSurface->AnyHeatBalanceInsideSourceTerm) {
    8477      314325 :                 for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    8478      289179 :                     if (Surface(surfNum).InsideHeatSourceTermSchedule) {
    8479        4191 :                         state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(surfNum) =
    8480        4191 :                             EnergyPlus::ScheduleManager::GetCurrentScheduleValue(state, Surface(surfNum).InsideHeatSourceTermSchedule);
    8481             :                     }
    8482             :                 }
    8483             :             }
    8484             : 
    8485             :             // Set up coefficient arrays prior to calculations and precalc terms that do no change during iteration - non-window surfaces
    8486    18338225 :             int const firstNonWinSurf = thisSpace.OpaqOrIntMassSurfaceFirst;
    8487    18338225 :             int const lastNonWinSurf = thisSpace.OpaqOrIntMassSurfaceLast;
    8488    18338225 :             Real64 const timeStepZoneSeconds = state.dataGlobal->TimeStepZoneSec; // local for vectorization
    8489    18338225 :             Real64 const iterDampConstant = IterDampConst;                        // local for vectorization
    8490             :             // this loop auto-vectorizes
    8491   155024845 :             for (int surfNum = firstNonWinSurf; surfNum <= lastNonWinSurf; ++surfNum) {
    8492   136686620 :                 auto &surface(Surface(surfNum));
    8493   136686620 :                 if (state.dataSurface->UseRepresentativeSurfaceCalculations) {
    8494      275487 :                     int repSurfNum = surface.RepresentativeCalcSurfNum;
    8495      275487 :                     if (surfNum != repSurfNum) continue;
    8496             :                 }
    8497             : 
    8498             :                 // Pre-calculate a few terms before the iteration loop
    8499   136674941 :                 state.dataHeatBalSurf->SurfTempTerm(surfNum) =
    8500   273349882 :                     state.dataHeatBalSurf->SurfCTFConstInPart(surfNum) + state.dataHeatBal->SurfQdotRadIntGainsInPerArea(surfNum) +
    8501   410024823 :                     state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(surfNum) + state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(surfNum) +
    8502   273349882 :                     state.dataHeatBalSurf->SurfHConvInt(surfNum) * state.dataHeatBalSurfMgr->RefAirTemp(surfNum) +
    8503   273349882 :                     state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(surfNum) +
    8504   136674941 :                     (state.dataHeatBalFanSys->QRadSurfAFNDuct(surfNum) / timeStepZoneSeconds);
    8505   136674941 :                 state.dataHeatBalSurf->SurfTempDiv(surfNum) =
    8506   410024823 :                     1.0 / (state.dataHeatBalSurf->SurfCTFInside0(surfNum) -
    8507   273349882 :                            state.dataHeatBalSurf->SurfIsAdiabatic(surfNum) * state.dataHeatBalSurf->SurfCTFCross0(surfNum) +
    8508   273349882 :                            state.dataHeatBalSurf->SurfIsOperatingPool(surfNum) * state.dataHeatBalFanSys->PoolHeatTransCoefs(surfNum) +
    8509   273349882 :                            (!state.dataHeatBalSurf->SurfIsOperatingPool(surfNum)) * state.dataHeatBalSurf->SurfHConvInt(surfNum) + iterDampConstant);
    8510             :             }
    8511             :         }
    8512             :     }
    8513             : 
    8514     2469152 :     state.dataHeatBal->InsideSurfIterations = 0;
    8515     2469152 :     bool Converged = false; // .TRUE. if inside heat balance has converged
    8516    22878298 :     while (!Converged) {    // Start of main inside heat balance iteration loop...
    8517             : 
    8518    10204573 :         state.dataHeatBalSurf->SurfTempInsOld = state.dataHeatBalSurf->SurfTempIn; // Keep track of last iteration's temperature values
    8519             : 
    8520    40818292 :         HeatBalanceIntRadExchange::CalcInteriorRadExchange(state,
    8521    10204573 :                                                            state.dataHeatBalSurf->SurfTempIn,
    8522    10204573 :                                                            state.dataHeatBal->InsideSurfIterations,
    8523    10204573 :                                                            state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea,
    8524             :                                                            ZoneToResimulate,
    8525    10204573 :                                                            Inside); // Update the radiation balance
    8526             : 
    8527             :         // Every 30 iterations, recalculate the inside convection coefficients in case
    8528             :         // there has been a significant drift in the surface temperatures predicted.
    8529             :         // This is not fool-proof and it basically means that the outside surface
    8530             :         // heat balance is in error (potentially) once HConvIn is re-evaluated.
    8531             :         // The choice of 30 is not significant--just want to do this a couple of
    8532             :         // times before the iteration limit is hit.
    8533    10204573 :         if ((state.dataHeatBal->InsideSurfIterations > 0) && (mod(state.dataHeatBal->InsideSurfIterations, ItersReevalConvCoeff) == 0)) {
    8534        1706 :             ConvectionCoefficients::InitInteriorConvectionCoeffs(state, state.dataHeatBalSurf->SurfTempIn, ZoneToResimulate);
    8535             :             // Since HConvIn has changed re-calculate a few terms - non-window surfaces
    8536       12149 :             for (int zoneNum = FirstZone; zoneNum <= LastZone; ++zoneNum) {
    8537       20886 :                 for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    8538       10443 :                     auto &thisSpace = state.dataHeatBal->space(spaceNum);
    8539       10443 :                     int const firstSurf = thisSpace.OpaqOrIntMassSurfaceFirst;
    8540       10443 :                     int const lastSurf = thisSpace.OpaqOrIntMassSurfaceLast;
    8541             : 
    8542       10443 :                     Real64 const timeStepZoneSeconds = state.dataGlobal->TimeStepZoneSec; // local for vectorization
    8543       10443 :                     Real64 const iterDampConstant = IterDampConst;                        // local for vectorization
    8544             :                     // this loop auto-vectorizes
    8545       90516 :                     for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    8546       80073 :                         auto &surface(Surface(surfNum));
    8547       80073 :                         if (state.dataSurface->UseRepresentativeSurfaceCalculations) {
    8548           0 :                             int repSurfNum = surface.RepresentativeCalcSurfNum;
    8549           0 :                             if (surfNum != repSurfNum) continue;
    8550             :                         }
    8551             : 
    8552       80073 :                         state.dataHeatBalSurf->SurfTempTerm(surfNum) =
    8553      160146 :                             state.dataHeatBalSurf->SurfCTFConstInPart(surfNum) + state.dataHeatBal->SurfQdotRadIntGainsInPerArea(surfNum) +
    8554      240219 :                             state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(surfNum) + state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(surfNum) +
    8555      160146 :                             state.dataHeatBalSurf->SurfHConvInt(surfNum) * state.dataHeatBalSurfMgr->RefAirTemp(surfNum) +
    8556      160146 :                             state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(surfNum) +
    8557       80073 :                             (state.dataHeatBalFanSys->QRadSurfAFNDuct(surfNum) / timeStepZoneSeconds);
    8558       80073 :                         state.dataHeatBalSurf->SurfTempDiv(surfNum) =
    8559      240219 :                             1.0 / (state.dataHeatBalSurf->SurfCTFInside0(surfNum) -
    8560      160146 :                                    state.dataHeatBalSurf->SurfIsAdiabatic(surfNum) * state.dataHeatBalSurf->SurfCTFCross0(surfNum) +
    8561      160146 :                                    state.dataHeatBalSurf->SurfIsOperatingPool(surfNum) * state.dataHeatBalFanSys->PoolHeatTransCoefs(surfNum) +
    8562      160146 :                                    (!state.dataHeatBalSurf->SurfIsOperatingPool(surfNum)) * state.dataHeatBalSurf->SurfHConvInt(surfNum) +
    8563             :                                    iterDampConstant);
    8564             :                     }
    8565             :                 }
    8566             :             }
    8567             :         }
    8568             : 
    8569             :         // Loop over non-window surfaces
    8570    95846433 :         for (int zoneNum = FirstZone; zoneNum <= LastZone; ++zoneNum) {
    8571   171358924 :             for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    8572    85717064 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
    8573    85717064 :                 int const firstNonWinSurf = thisSpace.OpaqOrIntMassSurfaceFirst;
    8574    85717064 :                 int const lastNonWinSurf = thisSpace.OpaqOrIntMassSurfaceLast;
    8575    85717064 :                 Real64 const iterDampConstant = IterDampConst; // local for vectorization
    8576             :                 // this loop auto-vectorizes
    8577   730097584 :                 for (int surfNum = firstNonWinSurf; surfNum <= lastNonWinSurf; ++surfNum) {
    8578             :                     // Perform heat balance on the inside face of the surface ...
    8579             :                     // The following are possibilities here (this function only does CTF, see CalcHeatBalanceInsideSurf2 for others):
    8580             :                     //   (a) the surface is a pool (no movable insulation, no source/sink, only CTF solution algorithm)
    8581             :                     //   (b) the surface is adiabatic (a partition), in which case the temperature of both sides are the same
    8582             :                     //   (c) standard (or interzone) opaque surface with no movable insulation, normal heat balance equation
    8583             :                     //   (d) standard (or interzone) window: call to CalcWindowHeatBalance to get window layer temperatures
    8584             :                     //   (e) standard opaque surface with movable insulation, special two-part equation
    8585             :                     // In the surface calculation there are the following Algorithm types for opaque surfaces that
    8586             :                     // do not have movable insulation:
    8587             :                     //   (a) the regular CTF calc (SolutionAlgo = UseCTF)
    8588             :                     //   (b) the EMPD calc (Solutionalgo = UseEMPD)
    8589             :                     //   (c) the CondFD calc (SolutionAlgo = UseCondFD)
    8590             :                     //   (d) the HAMT calc (solutionalgo = UseHAMT).
    8591             : 
    8592             :                     // For adiabatic surface:
    8593             :                     // Adiabatic:   TempDiv = (1.0 / (construct.CTFInside(0) - construct.CTFCross(0) + HConvIn_surf + IterDampConst));
    8594             :                     // Adiabatic:   SurfTempInTmp(SurfNum) = (TempTerm + IterDampConst * SurfTempInsOld(SurfNum)) * TempDiv;
    8595             :                     // Ad+Source:   SurfTempInTmp(SurfNum) = (TempTerm + construct.CTFSourceIn(0) * SurfQsrcHist(SurfNum, 1) + IterDampConst *
    8596             :                     // SurfTempInsOld(SurfNum)) * TempDiv; Ad+Pool:     TempDiv = (1.0 / (construct.CTFInside(0) - construct.CTFCross(0) +
    8597             :                     // PoolHeatTransCoefs(SurfNum) + IterDampConst); Ad+Pool:     SurfTempInTmp(SurfNum) = (SurfCTFConstInPart(SurfNum) +
    8598             :                     // QPoolSurfNumerator(SurfNum) + IterDampConst * SurfTempInsOld(SurfNum)) * TempDiv;
    8599             : 
    8600             :                     // For standard or interzone surface:
    8601             :                     // Standard:    TempDiv = (1.0 / (construct.CTFInside(0) + HConvIn_surf + IterDampConst));
    8602             :                     // Standard:    SurfTempInTmp(SurfNum) = (TempTerm + IterDampConst * SurfTempInsOld(SurfNum) + construct.CTFCross(0) * TH11) *
    8603             :                     // TempDiv; Std+Source:  SurfTempInTmp(SurfNum) = (TempTerm + construct.CTFSourceIn(0) * SurfQsrcHist(SurfNum, 1) + IterDampConst
    8604             :                     // * SurfTempInsOld(SurfNum)) * TempDiv; Std+Pool:    TempDiv = (1.0 / (construct.CTFInside(0) + PoolHeatTransCoefs(SurfNum) +
    8605             :                     // IterDampConst); Std+Pool:    SurfTempInTmp(SurfNum) = (SurfCTFConstInPart(SurfNum) + QPoolSurfNumerator(SurfNum) +
    8606             :                     // IterDampConst* SurfTempInsOld(SurfNum) + construct.CTFCross(0) * TH11) * TempDiv;
    8607             : 
    8608             :                     // Composite with Adiabatic/Source/Pool flags:
    8609             :                     //              TempDiv = (1.0 / (construct.CTFInside(0) - SurfIsAdiabatic*construct.CTFCross(0)+
    8610             :                     //              SurfIsOperatingPool*PoolHeatTransCoefs(SurfNum) + IsNotPoolSurf*HConvIn_surf + IterDampConst));
    8611             :                     //              SurfTempInTmp(SurfNum) = (IsNotPoolSurf*TempTerm + IsSource*construct.CTFSourceIn(0) * SurfQsrcHist(SurfNum, 1) +
    8612             :                     //              SurfIsOperatingPool*SurfCTFConstInPart(SurfNum) + SurfIsOperatingPool*QPoolSurfNumerator(SurfNum)
    8613             :                     //                                        + IterDampConst * SurfTempInsOld(SurfNum)+
    8614             :                     //                                        IsNotAdiabatic*IsNotSource*construct.CTFCross(0)
    8615             :                     //                                        * TH11) * TempDiv;
    8616             : 
    8617             :                     // Calculate the current inside surface temperature
    8618   644380520 :                     state.dataHeatBalSurf->SurfTempInTmp(surfNum) =
    8619  1288761040 :                         ((!state.dataHeatBalSurf->SurfIsOperatingPool(surfNum)) *
    8620  1288761040 :                              (state.dataHeatBalSurf->SurfTempTerm(surfNum) + state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(surfNum)) +
    8621  1288761040 :                          state.dataHeatBalSurf->SurfIsSourceOrSink(surfNum) * state.dataHeatBalSurf->SurfCTFSourceIn0(surfNum) *
    8622  1288761040 :                              state.dataHeatBalSurf->SurfQSourceSinkHist(surfNum) +
    8623  1288761040 :                          state.dataHeatBalSurf->SurfIsOperatingPool(surfNum) * state.dataHeatBalSurf->SurfCTFConstInPart(surfNum) +
    8624  1288761040 :                          state.dataHeatBalSurf->SurfIsOperatingPool(surfNum) * state.dataHeatBalFanSys->QPoolSurfNumerator(surfNum) +
    8625  1288761040 :                          iterDampConstant * state.dataHeatBalSurf->SurfTempInsOld(surfNum) +
    8626  1288761040 :                          (!state.dataHeatBalSurf->SurfIsAdiabatic(surfNum)) * state.dataHeatBalSurf->SurfCTFCross0(surfNum) *
    8627  1288761040 :                              state.dataHeatBalSurf->SurfTempOutHist(surfNum)) *
    8628   644380520 :                         state.dataHeatBalSurf->SurfTempDiv(surfNum);
    8629             :                     // Constant part of conduction eq (history terms) | LW radiation from internal sources | SW
    8630             :                     // radiation from internal sources | Convection from surface to zone air | Net radiant
    8631             :                     // exchange with other zone surfaces | Heat source/sink term for radiant systems | (if there
    8632             :                     // is one present) | Radiant flux from high temp radiant heater | Radiant flux from a hot
    8633             :                     // water baseboard heater | Radiant flux from a steam baseboard heater | Radiant flux from
    8634             :                     // an electric baseboard heater | Iterative damping term (for stability) | Current
    8635             :                     // conduction from | the outside surface | Coefficient for conduction (current time) |
    8636             :                     // Convection and damping term | Radiation from AFN ducts
    8637             : 
    8638   644380520 :                     state.dataHeatBalSurf->SurfTempIn(surfNum) = state.dataHeatBalSurf->SurfTempInTmp(surfNum);
    8639             :                 }
    8640             : 
    8641             :                 // Loop over non-window surfaces (includes TubularDaylightingDomes)
    8642   730097584 :                 for (int surfNum = firstNonWinSurf; surfNum <= lastNonWinSurf; ++surfNum) {
    8643   644380520 :                     bool movableInsulPresent = state.dataSurface->AnyMovableInsulation && state.dataHeatBalSurf->SurfMovInsulIntPresent(surfNum);
    8644   644380520 :                     if (movableInsulPresent) { // Movable insulation present, recalc surface temps
    8645       16982 :                         Real64 HMovInsul = state.dataHeatBalSurf->SurfMovInsulHInt(surfNum);
    8646       16982 :                         Real64 F1 = HMovInsul / (HMovInsul + state.dataHeatBalSurf->SurfHConvInt(surfNum) + IterDampConst);
    8647       16982 :                         state.dataHeatBalSurf->SurfTempIn(surfNum) =
    8648       33964 :                             (state.dataHeatBalSurf->SurfCTFConstInPart(surfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(surfNum) +
    8649       33964 :                              state.dataHeatBalSurf->SurfCTFCross0(surfNum) * state.dataHeatBalSurf->SurfTempOutHist(surfNum) +
    8650       50946 :                              F1 * (state.dataHeatBal->SurfQdotRadIntGainsInPerArea(surfNum) +
    8651       33964 :                                    state.dataHeatBalSurf->SurfHConvInt(surfNum) * state.dataHeatBalSurfMgr->RefAirTemp(surfNum) +
    8652       33964 :                                    state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(surfNum) +
    8653       33964 :                                    state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(surfNum) +
    8654       33964 :                                    state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(surfNum) +
    8655       33964 :                                    IterDampConst * state.dataHeatBalSurf->SurfTempInsOld(surfNum))) /
    8656       16982 :                             (state.dataHeatBalSurf->SurfCTFInside0(surfNum) + HMovInsul - F1 * HMovInsul); // Convection from surface to zone air
    8657             : 
    8658       16982 :                         state.dataHeatBalSurf->SurfTempInTmp(surfNum) =
    8659       33964 :                             (state.dataHeatBalSurf->SurfCTFInside0(surfNum) * state.dataHeatBalSurf->SurfTempIn(surfNum) +
    8660       50946 :                              HMovInsul * state.dataHeatBalSurf->SurfTempIn(surfNum) - state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(surfNum) -
    8661       33964 :                              state.dataHeatBalSurf->SurfCTFConstInPart(surfNum) -
    8662       33964 :                              state.dataHeatBalSurf->SurfCTFCross0(surfNum) * state.dataHeatBalSurf->SurfTempOutHist(surfNum)) /
    8663             :                             (HMovInsul);
    8664             :                     }
    8665             : 
    8666   644380520 :                     if (state.dataHeatBal->AnyInternalHeatSourceInInput) {
    8667    12453260 :                         if (state.dataConstruction->Construct(Surface(surfNum).Construction).SourceSinkPresent) {
    8668             :                             // Set the appropriate parameters for the radiant system
    8669             :                             // Radiant system does not need the damping coefficient terms (hopefully)
    8670             :                             Real64 const RadSysDiv(1.0 /
    8671     2487853 :                                                    (state.dataHeatBalSurf->SurfCTFInside0(surfNum) + state.dataHeatBalSurf->SurfHConvInt(surfNum)));
    8672             :                             Real64 const TempTerm(
    8673     4975706 :                                 state.dataHeatBalSurf->SurfCTFConstInPart(surfNum) + state.dataHeatBal->SurfQdotRadIntGainsInPerArea(surfNum) +
    8674     4975706 :                                 state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(surfNum) +
    8675     4975706 :                                 state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(surfNum) +
    8676     4975706 :                                 state.dataHeatBalSurf->SurfHConvInt(surfNum) * state.dataHeatBalSurfMgr->RefAirTemp(surfNum) +
    8677     4975706 :                                 state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(surfNum) + state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(surfNum) +
    8678     2487853 :                                 (state.dataHeatBalFanSys->QRadSurfAFNDuct(surfNum) / state.dataGlobal->TimeStepZoneSec));
    8679     2487853 :                             state.dataHeatBalFanSys->RadSysTiHBConstCoef(surfNum) =
    8680     2487853 :                                 TempTerm * RadSysDiv; // Constant portion of cond eq (history terms) | LW radiation from internal sources | SW
    8681             :                             // radiation from internal sources | Convection from surface to zone air | Radiant flux
    8682             :                             // from high temp radiant heater | Radiant flux from a hot water baseboard heater |
    8683             :                             // Radiant flux from a steam baseboard heater | Radiant flux from an electric baseboard
    8684             :                             // heater | Net radiant exchange with other zone surfaces | Cond term (both partition
    8685             :                             // sides same temp) | Convection and damping term
    8686     2487853 :                             state.dataHeatBalFanSys->RadSysTiHBToutCoef(surfNum) =
    8687     2487853 :                                 state.dataHeatBalSurf->SurfCTFCross0(surfNum) * RadSysDiv; // Outside temp=inside temp for a partition |
    8688             :                             // Cond term (both partition sides same temp) |
    8689             :                             // Convection and damping term
    8690     2487853 :                             state.dataHeatBalFanSys->RadSysTiHBQsrcCoef(surfNum) =
    8691     2487853 :                                 state.dataHeatBalSurf->SurfCTFSourceIn0(surfNum) * RadSysDiv; // QTF term for the source | Cond term (both
    8692             :                             // partition sides same temp) | Convection and
    8693             :                             // damping term
    8694             : 
    8695     2487853 :                             if (Surface(surfNum).ExtBoundCond > 0) { // This is an interzone partition and we need to set outside params
    8696             :                                 // The inside coefficients of one side are equal to the outside coefficients of the other side.  But,
    8697             :                                 // the inside coefficients are set up once the heat balance equation for that side has been calculated.
    8698             :                                 // For both sides to actually have been set, we have to wait until we get to the second side in the surface
    8699             :                                 // derived type.  At that point, both inside coefficient sets have been evaluated.
    8700      998612 :                                 if (Surface(surfNum).ExtBoundCond <= surfNum) { // Both of the inside coefficients have now been set
    8701      499306 :                                     int OtherSideSurfNum = Surface(surfNum).ExtBoundCond;
    8702      499306 :                                     state.dataHeatBalFanSys->RadSysToHBConstCoef(OtherSideSurfNum) =
    8703      499306 :                                         state.dataHeatBalFanSys->RadSysTiHBConstCoef(surfNum);
    8704      499306 :                                     state.dataHeatBalFanSys->RadSysToHBTinCoef(OtherSideSurfNum) =
    8705      499306 :                                         state.dataHeatBalFanSys->RadSysTiHBToutCoef(surfNum);
    8706      499306 :                                     state.dataHeatBalFanSys->RadSysToHBQsrcCoef(OtherSideSurfNum) =
    8707      499306 :                                         state.dataHeatBalFanSys->RadSysTiHBQsrcCoef(surfNum);
    8708      499306 :                                     state.dataHeatBalFanSys->RadSysToHBConstCoef(surfNum) =
    8709      499306 :                                         state.dataHeatBalFanSys->RadSysTiHBConstCoef(OtherSideSurfNum);
    8710      499306 :                                     state.dataHeatBalFanSys->RadSysToHBTinCoef(surfNum) =
    8711      499306 :                                         state.dataHeatBalFanSys->RadSysTiHBToutCoef(OtherSideSurfNum);
    8712      499306 :                                     state.dataHeatBalFanSys->RadSysToHBQsrcCoef(surfNum) =
    8713      499306 :                                         state.dataHeatBalFanSys->RadSysTiHBQsrcCoef(OtherSideSurfNum);
    8714             :                                 }
    8715             :                             }
    8716             :                         }
    8717             :                     }
    8718             :                 }
    8719             : 
    8720             :                 // Loop over window surfaces
    8721    85717064 :                 int const firstWindowSurf = thisSpace.WindowSurfaceFirst;
    8722    85717064 :                 int const lastWindowSurf = thisSpace.WindowSurfaceLast;
    8723   186940088 :                 for (int surfNum = firstWindowSurf; surfNum <= lastWindowSurf; ++surfNum) {
    8724   101223024 :                     auto &surface(Surface(surfNum));
    8725   101223024 :                     if (state.dataSurface->UseRepresentativeSurfaceCalculations) {
    8726      400322 :                         int repSurfNum = surface.RepresentativeCalcSurfNum;
    8727      400322 :                         if (surfNum != repSurfNum) continue;
    8728             :                     }
    8729   100966638 :                     Real64 &TH11(state.dataHeatBalSurf->SurfOutsideTempHist(1)(surfNum));
    8730   100966638 :                     int const ConstrNum = state.dataSurface->SurfActiveConstruction(surfNum);
    8731   100966638 :                     auto const &construct(state.dataConstruction->Construct(ConstrNum));
    8732   100966638 :                     if (state.dataSurface->SurfWinOriginalClass(surfNum) == SurfaceClass::TDD_Diffuser) { // Tubular daylighting device
    8733             :                         // Lookup up the TDD:DOME object
    8734       20822 :                         int const pipeNum = state.dataSurface->SurfWinTDDPipeNum(surfNum);
    8735       20822 :                         int const domeNum = state.dataDaylightingDevicesData->TDDPipe(pipeNum).Dome;
    8736             :                         // Ueff = 1 / effective R value between TDD:DOME and TDD:DIFFUSER
    8737       20822 :                         Real64 Ueff = 1.0 / state.dataDaylightingDevicesData->TDDPipe(pipeNum).Reff;
    8738             : 
    8739             :                         // Similar to opaque surface but outside surface temp of TDD:DOME is used, and no embedded sources/sinks.
    8740             :                         // Absorbed shortwave radiation is treated similar to a regular window, but only 1 glass layer is allowed.
    8741             :                         //   = SurfWinQRadSWwinAbs(surfNum,1)/2.0
    8742       20822 :                         Real64 const HConvIn_surf(state.dataMstBal->HConvInFD(surfNum) = state.dataHeatBalSurf->SurfHConvInt(surfNum));
    8743       20822 :                         state.dataHeatBalSurf->SurfTempInTmp(surfNum) =
    8744       41644 :                             (state.dataHeatBal->SurfQdotRadIntGainsInPerArea(surfNum) + state.dataHeatBal->SurfWinQRadSWwinAbs(surfNum, 1) / 2.0 +
    8745       41644 :                              state.dataHeatBalSurf->SurfQAdditionalHeatSourceInside(surfNum) +
    8746       41644 :                              HConvIn_surf * state.dataHeatBalSurfMgr->RefAirTemp(surfNum) +
    8747       41644 :                              state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(surfNum) +
    8748       41644 :                              IterDampConst * state.dataHeatBalSurf->SurfTempInsOld(surfNum) +
    8749       41644 :                              Ueff * state.dataHeatBalSurf->SurfOutsideTempHist(1)(domeNum)) /
    8750       20822 :                             (Ueff + HConvIn_surf + IterDampConst); // LW radiation from internal sources | SW radiation from internal sources and
    8751             :                                                                    // solar | Convection from surface to zone air | Net radiant exchange with
    8752             :                                                                    // other zone surfaces | Iterative damping term (for stability) | Current
    8753             :                                                                    // conduction from the outside surface | Coefficient for conduction (current
    8754             :                                                                    // time) | Convection and damping term
    8755       20822 :                         state.dataHeatBalSurf->SurfTempIn(surfNum) = state.dataHeatBalSurf->SurfTempInTmp(surfNum);
    8756             :                         Real64 const Sigma_Temp_4(DataGlobalConstants::StefanBoltzmann *
    8757       20822 :                                                   pow_4(state.dataHeatBalSurf->SurfTempIn(surfNum) + DataGlobalConstants::KelvinConv));
    8758             : 
    8759             :                         // Calculate window heat gain for TDD:DIFFUSER since this calculation is usually done in WindowManager
    8760       20822 :                         if (state.dataHeatBalSurf->AnyRadiantSystems(surfNum))
    8761           0 :                             state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(surfNum) = GetSurfQdotRadHVACInPerArea(state, surfNum);
    8762       20822 :                         state.dataSurface->SurfWinHeatGain(surfNum) =
    8763       41644 :                             state.dataSurface->SurfWinTransSolar(surfNum) +
    8764       41644 :                             HConvIn_surf * surface.Area *
    8765       41644 :                                 (state.dataHeatBalSurf->SurfTempIn(surfNum) - state.dataHeatBalSurfMgr->RefAirTemp(surfNum)) +
    8766       41644 :                             state.dataConstruction->Construct(surface.Construction).InsideAbsorpThermal * surface.Area *
    8767       20822 :                                 (Sigma_Temp_4 -
    8768       41644 :                                  (state.dataSurface->SurfWinIRfromParentZone(surfNum) + state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(surfNum))) -
    8769       41644 :                             state.dataHeatBal->EnclSolQSWRad(surface.SolarEnclIndex) * surface.Area *
    8770       20822 :                                 state.dataConstruction->Construct(surface.Construction)
    8771       20822 :                                     .TransDiff; // Transmitted solar | Convection | IR exchange | IR
    8772             :                         // Zone diffuse interior shortwave reflected back into the TDD
    8773             : 
    8774             :                         // fill out report vars for components of Window Heat Gain
    8775       20822 :                         state.dataSurface->SurfWinGainConvGlazToZoneRep(surfNum) =
    8776       41644 :                             HConvIn_surf * surface.Area *
    8777       20822 :                             (state.dataHeatBalSurf->SurfTempIn(surfNum) - state.dataHeatBalSurfMgr->RefAirTemp(surfNum));
    8778       20822 :                         state.dataSurface->SurfWinGainIRGlazToZoneRep(surfNum) =
    8779       41644 :                             state.dataConstruction->Construct(surface.Construction).InsideAbsorpThermal * surface.Area *
    8780       20822 :                             (Sigma_Temp_4 -
    8781       20822 :                              (state.dataSurface->SurfWinIRfromParentZone(surfNum) + state.dataHeatBalSurf->SurfQdotRadHVACInPerArea(surfNum)));
    8782       62466 :                         state.dataSurface->SurfWinLossSWZoneToOutWinRep(surfNum) = state.dataHeatBal->EnclSolQSWRad(surface.SolarEnclIndex) *
    8783       41644 :                                                                                    surface.Area *
    8784       20822 :                                                                                    state.dataConstruction->Construct(surface.Construction).TransDiff;
    8785             :                     } else {                                                // Regular window
    8786   100945816 :                         if (state.dataHeatBal->InsideSurfIterations == 0) { // Do windows only once
    8787             :                             // Get outside convection coeff for exterior window here to avoid calling
    8788             :                             // InitExteriorConvectionCoeff from CalcWindowHeatBalance, which avoids circular reference
    8789             :                             // (HeatBalanceSurfaceManager USEing and WindowManager and
    8790             :                             // WindowManager USEing HeatBalanceSurfaceManager)
    8791    21867704 :                             if (surface.ExtBoundCond == ExternalEnvironment) {
    8792             :                                 DataSurfaces::SurfaceRoughness RoughSurf =
    8793    21840512 :                                     state.dataMaterial->Material(construct.LayerPoint(1)).Roughness; // Outside surface roughness
    8794             :                                 Real64 EmisOut =
    8795    21840512 :                                     state.dataMaterial->Material(construct.LayerPoint(1)).AbsorpThermalFront; // Glass outside surface emissivity
    8796    21840512 :                                 auto const shading_flag(state.dataSurface->SurfWinShadingFlag(surfNum));
    8797    21840512 :                                 if (ANY_EXTERIOR_SHADE_BLIND_SCREEN(shading_flag)) {
    8798             :                                     // Exterior shade in place
    8799       23903 :                                     int const ConstrNumSh = Surface(surfNum).activeShadedConstruction;
    8800       23903 :                                     if (ConstrNumSh != 0) {
    8801       13760 :                                         RoughSurf =
    8802       13760 :                                             state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNumSh).LayerPoint(1)).Roughness;
    8803       13760 :                                         EmisOut =
    8804       13760 :                                             state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNumSh).LayerPoint(1)).AbsorpThermal;
    8805             :                                     }
    8806             :                                 }
    8807             : 
    8808             :                                 // Get the outside effective emissivity for Equivalent layer model
    8809    21840512 :                                 if (construct.WindowTypeEQL) {
    8810        8109 :                                     EmisOut = WindowEquivalentLayer::EQLWindowOutsideEffectiveEmiss(state, ConstrNum);
    8811             :                                 }
    8812             :                                 // Set Exterior Convection Coefficient...
    8813    21840512 :                                 if (state.dataSurface->SurfExtConvCoeffIndex(surfNum) > 0) {
    8814             : 
    8815           0 :                                     state.dataHeatBalSurf->SurfHcExt(surfNum) = ConvectionCoefficients::SetExtConvectionCoeff(state, surfNum);
    8816             : 
    8817    21840512 :                                 } else if (surface.ExtWind) { // Window is exposed to wind (and possibly rain)
    8818             : 
    8819             :                                     // Calculate exterior heat transfer coefficients with windspeed (windspeed is calculated internally in
    8820             :                                     // subroutine)
    8821    21840512 :                                     ConvectionCoefficients::InitExteriorConvectionCoeff(state,
    8822             :                                                                                         surfNum,
    8823             :                                                                                         0.0,
    8824             :                                                                                         RoughSurf,
    8825             :                                                                                         EmisOut,
    8826             :                                                                                         TH11,
    8827    21840512 :                                                                                         state.dataHeatBalSurf->SurfHcExt(surfNum),
    8828    21840512 :                                                                                         state.dataHeatBalSurf->SurfHSkyExt(surfNum),
    8829    21840512 :                                                                                         state.dataHeatBalSurf->SurfHGrdExt(surfNum),
    8830    21840512 :                                                                                         state.dataHeatBalSurf->SurfHAirExt(surfNum));
    8831             : 
    8832    21840512 :                                     if (state.dataEnvrn->IsRain) { // Raining: since wind exposed, outside window surface gets wet
    8833        4724 :                                         state.dataHeatBalSurf->SurfHcExt(surfNum) = 1000.0; // Reset SurfHcExt because of wetness
    8834             :                                     }
    8835             : 
    8836             :                                 } else { // Not Wind exposed
    8837             : 
    8838             :                                     // Calculate exterior heat transfer coefficients for windspeed = 0
    8839           0 :                                     ConvectionCoefficients::InitExteriorConvectionCoeff(state,
    8840             :                                                                                         surfNum,
    8841             :                                                                                         0.0,
    8842             :                                                                                         RoughSurf,
    8843             :                                                                                         EmisOut,
    8844             :                                                                                         TH11,
    8845           0 :                                                                                         state.dataHeatBalSurf->SurfHcExt(surfNum),
    8846           0 :                                                                                         state.dataHeatBalSurf->SurfHSkyExt(surfNum),
    8847           0 :                                                                                         state.dataHeatBalSurf->SurfHGrdExt(surfNum),
    8848           0 :                                                                                         state.dataHeatBalSurf->SurfHAirExt(surfNum));
    8849             :                                 }
    8850             : 
    8851             :                             } else { // Interior Surface
    8852             : 
    8853       27192 :                                 if (state.dataSurface->SurfExtConvCoeffIndex(surfNum) > 0) {
    8854           0 :                                     state.dataHeatBalSurf->SurfHcExt(surfNum) = ConvectionCoefficients::SetExtConvectionCoeff(state, surfNum);
    8855             :                                 } else {
    8856             :                                     // Exterior Convection Coefficient for the Interior or Interzone Window is the Interior Convection Coeff of
    8857             :                                     // same
    8858       27192 :                                     state.dataHeatBalSurf->SurfHcExt(surfNum) = state.dataHeatBalSurf->SurfHConvInt(surface.ExtBoundCond);
    8859             :                                 }
    8860             :                             }
    8861             : 
    8862             :                             // Following call determines inside surface temperature of glazing, and of
    8863             :                             // frame and/or divider, if present
    8864    21867704 :                             CalcWindowHeatBalance(
    8865    21867704 :                                 state, surfNum, state.dataHeatBalSurf->SurfHcExt(surfNum), state.dataHeatBalSurf->SurfTempInTmp(surfNum), TH11);
    8866             : 
    8867    21867704 :                             state.dataHeatBalSurf->SurfTempIn(surfNum) = state.dataHeatBalSurf->SurfTempInTmp(surfNum);
    8868             :                         }
    8869             :                     }
    8870             :                 }
    8871             : 
    8872    85717064 :                 int const firstSurf = thisSpace.OpaqOrWinSurfaceFirst;
    8873    85717064 :                 int const lastSurf = thisSpace.OpaqOrWinSurfaceLast;
    8874   831320608 :                 for (int surfNum = firstSurf; surfNum <= lastSurf; ++surfNum) {
    8875   745603544 :                     auto &zone(state.dataHeatBal->Zone(zoneNum));
    8876             : 
    8877   745603544 :                     Real64 &TH11(state.dataHeatBalSurf->SurfOutsideTempHist(1)(surfNum));
    8878   745603544 :                     Real64 &TH12(state.dataHeatBalSurf->SurfInsideTempHist(1)(surfNum));
    8879   745603544 :                     TH12 = state.dataHeatBalSurf->SurfTempIn(surfNum);
    8880   745603544 :                     state.dataHeatBalSurf->SurfTempOut(surfNum) = TH11;                                   // For reporting
    8881   745603544 :                     if (state.dataSurface->SurfWinOriginalClass(surfNum) == SurfaceClass::TDD_Diffuser) { // Tubular daylighting device
    8882             :                         // Tubular daylighting devices are treated as one big object with an effective R value.
    8883             :                         // The outside face temperature of the TDD:DOME and the inside face temperature of the
    8884             :                         // TDD:DIFFUSER are calculated with the outside and inside heat balances respectively.
    8885             :                         // Below, the resulting temperatures are copied to the inside face of the TDD:DOME
    8886             :                         // and the outside face of the TDD:DIFFUSER for reporting.
    8887             : 
    8888             :                         // Set inside temp variables of TDD:DOME equal to inside temp of TDD:DIFFUSER
    8889       20822 :                         int domeNum = state.dataDaylightingDevicesData->TDDPipe(state.dataSurface->SurfWinTDDPipeNum(surfNum)).Dome;
    8890       20822 :                         state.dataHeatBalSurf->SurfInsideTempHist(1)(domeNum) = state.dataHeatBalSurf->SurfTempIn(domeNum) =
    8891       20822 :                             state.dataHeatBalSurf->SurfTempInTmp(domeNum) = state.dataHeatBalSurf->SurfTempIn(surfNum);
    8892             : 
    8893             :                         // Set outside temp reporting variable of TDD:DOME (since it gets skipped otherwise)
    8894             :                         // Reset outside temp variables of TDD:DIFFUSER equal to outside temp of TDD:DOME
    8895       20822 :                         TH11 = state.dataHeatBalSurf->SurfTempOut(surfNum) = state.dataHeatBalSurf->SurfTempOut(domeNum) =
    8896       20822 :                             state.dataHeatBalSurf->SurfOutsideTempHist(1)(domeNum);
    8897             :                     }
    8898             : 
    8899   745603544 :                     if ((TH12 > state.dataHeatBalSurf->MaxSurfaceTempLimit) || (TH12 < MinSurfaceTempLimit)) {
    8900           0 :                         TestSurfTempCalcHeatBalanceInsideSurf(
    8901           0 :                             state, TH12, surfNum, zone, state.dataHeatBalSurfMgr->calcHeatBalInsideSurfWarmupErrCount);
    8902             :                     }
    8903             :                 }
    8904             :             }
    8905             :         } // ...end of main loops over all surfaces for inside heat balances
    8906             : 
    8907             :         // Interzone surface updating: interzone surfaces have other side temperatures
    8908             :         // which can vary as the simulation iterates through the inside heat
    8909             :         // balance.  This block is intended to "lock" the opposite side (outside)
    8910             :         // temperatures to the correct value, namely the value calculated by the
    8911             :         // inside surface heat balance for the other side.
    8912             :         //        assert(state.dataHeatBalSurf->TH.index(1, 1, 1) == 0u); // Assumed for linear indexing below
    8913             :         //        auto const l211(state.dataHeatBalSurf->TH.index(2, 1, 1) - 1);
    8914   308675469 :         for (int SurfNum : IZSurfs) {
    8915   298470896 :             int const surfExtBoundCond(Surface(SurfNum).ExtBoundCond);
    8916             :             // Set the outside surface temperature to the inside surface temperature of the interzone pair.
    8917             :             // By going through all of the surfaces, this should pick up the other side as well as affect the next iteration.
    8918             :             // [ SurfNum - 1 ] == ( 1, 1, SurfNum )
    8919             :             // [ l211 + surfExtBoundCond ] == ( 2, 1, surfExtBoundCond )
    8920   298470896 :             state.dataHeatBalSurf->SurfTempOut(SurfNum) = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum) =
    8921   298470896 :                 state.dataHeatBalSurf->SurfInsideTempHist(1)(surfExtBoundCond);
    8922   298470896 :             state.dataHeatBalSurf->SurfTempOutHist(SurfNum) = state.dataHeatBalSurf->SurfTempOut(SurfNum);
    8923             :         }
    8924             : 
    8925    10204573 :         ++state.dataHeatBal->InsideSurfIterations;
    8926             : 
    8927             :         // Convergence check - Loop through all relevant non-window surfaces to check for convergence...
    8928    10204573 :         Real64 MaxDelTemp = 0.0; // Maximum change in surface temperature for any opaque surface from one iteration to the next
    8929    95846433 :         for (int zoneNum = FirstZone; zoneNum <= LastZone; ++zoneNum) {
    8930   171358924 :             for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) {
    8931    85717064 :                 auto &thisSpace = state.dataHeatBal->space(spaceNum);
    8932    85717064 :                 int const firstNonWinSurf = thisSpace.OpaqOrIntMassSurfaceFirst;
    8933    85717064 :                 int const lastNonWinSurf = thisSpace.OpaqOrIntMassSurfaceLast;
    8934   730097584 :                 for (int surfNum = firstNonWinSurf; surfNum <= lastNonWinSurf; ++surfNum) {
    8935   644380520 :                     Real64 delta = state.dataHeatBalSurf->SurfTempIn(surfNum) - state.dataHeatBalSurf->SurfTempInsOld(surfNum);
    8936   644380520 :                     Real64 absDif = std::abs(delta);
    8937   644380520 :                     MaxDelTemp = std::max(absDif, MaxDelTemp);
    8938             :                 }
    8939             :             }
    8940             :         } // ...end of loop to check for convergence
    8941             : 
    8942    10204573 :         if (MaxDelTemp <= state.dataHeatBal->MaxAllowedDelTemp) Converged = true;
    8943             : 
    8944             : #ifdef EP_Count_Calls
    8945             :         state.dataTimingsData->NumMaxInsideSurfIterations =
    8946             :             max(state.dataTimingsData->NumMaxInsideSurfIterations, state.dataHeatBal->InsideSurfIterations);
    8947             : #endif
    8948             : 
    8949    10204573 :         if (state.dataHeatBal->InsideSurfIterations < state.dataHeatBalSurf->MinIterations) Converged = false;
    8950             : 
    8951    10204573 :         if (state.dataHeatBal->InsideSurfIterations > MaxIterations) {
    8952           0 :             if (!state.dataGlobal->WarmupFlag) {
    8953           0 :                 ++state.dataHeatBalSurfMgr->calcHeatBalInsideSurfErrCount;
    8954           0 :                 if (state.dataHeatBalSurfMgr->calcHeatBalInsideSurfErrCount < 16) {
    8955           0 :                     ShowWarningError(state,
    8956           0 :                                      format("Inside surface heat balance did not converge with Max Temp Difference [C] ={:.3R} vs Max Allowed "
    8957             :                                             "Temp Diff [C] ={:.6R}",
    8958             :                                             MaxDelTemp,
    8959           0 :                                             state.dataHeatBal->MaxAllowedDelTempCondFD));
    8960           0 :                     ShowContinueErrorTimeStamp(state, "");
    8961             :                 } else {
    8962           0 :                     ShowRecurringWarningErrorAtEnd(state,
    8963             :                                                    "Inside surface heat balance convergence problem continues",
    8964           0 :                                                    state.dataHeatBalSurfMgr->calcHeatBalInsideSurfErrPointer,
    8965             :                                                    MaxDelTemp,
    8966             :                                                    MaxDelTemp,
    8967             :                                                    _,
    8968             :                                                    "[C]",
    8969             :                                                    "[C]");
    8970             :                 }
    8971             :             }
    8972           0 :             break; // iteration loop
    8973             :         }
    8974             : 
    8975             :     } // ...end of main inside heat balance iteration loop (ends when Converged)
    8976     2469152 : }
    8977             : 
    8978     8814867 : Real64 GetSurfQdotRadHVACInPerArea(EnergyPlusData &state, int const SurfNum)
    8979             : {
    8980    17629734 :     return state.dataHeatBalFanSys->SurfQHTRadSys(SurfNum) + state.dataHeatBalFanSys->SurfQHWBaseboard(SurfNum) +
    8981    17629734 :            state.dataHeatBalFanSys->SurfQSteamBaseboard(SurfNum) + state.dataHeatBalFanSys->SurfQElecBaseboard(SurfNum) +
    8982     8814867 :            state.dataHeatBalFanSys->SurfQCoolingPanel(SurfNum);
    8983             : }
    8984             : 
    8985           0 : void TestSurfTempCalcHeatBalanceInsideSurf(EnergyPlusData &state, Real64 TH12, int const SurfNum, ZoneData &zone, int WarmupSurfTemp)
    8986             : {
    8987           0 :     std::string surfName = state.dataSurface->Surface(SurfNum).Name;
    8988             : 
    8989           0 :     if ((TH12 > state.dataHeatBalSurf->MaxSurfaceTempLimit) || (TH12 < MinSurfaceTempLimit)) {
    8990           0 :         if (state.dataGlobal->WarmupFlag) ++WarmupSurfTemp;
    8991           0 :         if (!state.dataGlobal->WarmupFlag || WarmupSurfTemp > 10 || state.dataGlobal->DisplayExtraWarnings) {
    8992           0 :             if (TH12 < MinSurfaceTempLimit) {
    8993           0 :                 if (state.dataSurface->SurfLowTempErrCount(SurfNum) == 0) {
    8994           0 :                     ShowSevereMessage(
    8995           0 :                         state, format("Temperature (low) out of bounds [{:.2R}] for zone=\"{}\", for surface=\"{}\"", TH12, zone.Name, surfName));
    8996           0 :                     ShowContinueErrorTimeStamp(state, "");
    8997           0 :                     if (!zone.TempOutOfBoundsReported) {
    8998           0 :                         ShowContinueError(state, "Zone=\"" + zone.Name + "\", Diagnostic Details:");
    8999           0 :                         if (zone.FloorArea > 0.0) {
    9000           0 :                             ShowContinueError(state, format("...Internal Heat Gain [{:.3R}] W/m2", zone.InternalHeatGains / zone.FloorArea));
    9001             :                         } else {
    9002           0 :                             ShowContinueError(state, format("...Internal Heat Gain (no floor) [{:.3R}] W", zone.InternalHeatGains));
    9003             :                         }
    9004           0 :                         if (state.afn->simulation_control.type == AirflowNetwork::ControlType::NoMultizoneOrDistribution) {
    9005           0 :                             ShowContinueError(state, format("...Infiltration/Ventilation [{:.3R}] m3/s", zone.NominalInfilVent));
    9006           0 :                             ShowContinueError(state, format("...Mixing/Cross Mixing [{:.3R}] m3/s", zone.NominalMixing));
    9007             :                         } else {
    9008           0 :                             ShowContinueError(state, "...Airflow Network Simulation: Nominal Infiltration/Ventilation/Mixing not available.");
    9009             :                         }
    9010           0 :                         if (zone.IsControlled) {
    9011           0 :                             ShowContinueError(state, "...Zone is part of HVAC controlled system.");
    9012             :                         } else {
    9013           0 :                             ShowContinueError(state, "...Zone is not part of HVAC controlled system.");
    9014             :                         }
    9015           0 :                         zone.TempOutOfBoundsReported = true;
    9016             :                     }
    9017           0 :                     ShowRecurringSevereErrorAtEnd(state,
    9018           0 :                                                   "Temperature (low) out of bounds for zone=" + zone.Name + " for surface=" + surfName,
    9019           0 :                                                   state.dataSurface->SurfLowTempErrCount(SurfNum),
    9020             :                                                   TH12,
    9021             :                                                   TH12,
    9022             :                                                   _,
    9023             :                                                   "C",
    9024             :                                                   "C");
    9025             :                 } else {
    9026           0 :                     ShowRecurringSevereErrorAtEnd(state,
    9027           0 :                                                   "Temperature (low) out of bounds for zone=" + zone.Name + " for surface=" + surfName,
    9028           0 :                                                   state.dataSurface->SurfLowTempErrCount(SurfNum),
    9029             :                                                   TH12,
    9030             :                                                   TH12,
    9031             :                                                   _,
    9032             :                                                   "C",
    9033             :                                                   "C");
    9034             :                 }
    9035             :             } else {
    9036           0 :                 if (state.dataSurface->SurfHighTempErrCount(SurfNum) == 0) {
    9037           0 :                     ShowSevereMessage(
    9038           0 :                         state, format("Temperature (high) out of bounds ({:.2R}] for zone=\"{}\", for surface=\"{}\"", TH12, zone.Name, surfName));
    9039           0 :                     ShowContinueErrorTimeStamp(state, "");
    9040           0 :                     if (!zone.TempOutOfBoundsReported) {
    9041           0 :                         ShowContinueError(state, "Zone=\"" + zone.Name + "\", Diagnostic Details:");
    9042           0 :                         if (zone.FloorArea > 0.0) {
    9043           0 :                             ShowContinueError(state, format("...Internal Heat Gain [{:.3R}] W/m2", zone.InternalHeatGains / zone.FloorArea));
    9044             :                         } else {
    9045           0 :                             ShowContinueError(state, format("...Internal Heat Gain (no floor) [{:.3R}] W", zone.InternalHeatGains));
    9046             :                         }
    9047           0 :                         if (state.afn->simulation_control.type == AirflowNetwork::ControlType::NoMultizoneOrDistribution) {
    9048           0 :                             ShowContinueError(state, format("...Infiltration/Ventilation [{:.3R}] m3/s", zone.NominalInfilVent));
    9049           0 :                             ShowContinueError(state, format("...Mixing/Cross Mixing [{:.3R}] m3/s", zone.NominalMixing));
    9050             :                         } else {
    9051           0 :                             ShowContinueError(state, "...Airflow Network Simulation: Nominal Infiltration/Ventilation/Mixing not available.");
    9052             :                         }
    9053           0 :                         if (zone.IsControlled) {
    9054           0 :                             ShowContinueError(state, "...Zone is part of HVAC controlled system.");
    9055             :                         } else {
    9056           0 :                             ShowContinueError(state, "...Zone is not part of HVAC controlled system.");
    9057             :                         }
    9058           0 :                         zone.TempOutOfBoundsReported = true;
    9059             :                     }
    9060           0 :                     ShowRecurringSevereErrorAtEnd(state,
    9061           0 :                                                   "Temperature (high) out of bounds for zone=" + zone.Name + " for surface=" + surfName,
    9062           0 :                                                   state.dataSurface->SurfHighTempErrCount(SurfNum),
    9063             :                                                   TH12,
    9064             :                                                   TH12,
    9065             :                                                   _,
    9066             :                                                   "C",
    9067             :                                                   "C");
    9068             :                 } else {
    9069           0 :                     ShowRecurringSevereErrorAtEnd(state,
    9070           0 :                                                   "Temperature (high) out of bounds for zone=" + zone.Name + " for surface=" + surfName,
    9071           0 :                                                   state.dataSurface->SurfHighTempErrCount(SurfNum),
    9072             :                                                   TH12,
    9073             :                                                   TH12,
    9074             :                                                   _,
    9075             :                                                   "C",
    9076             :                                                   "C");
    9077             :                 }
    9078             :             }
    9079           0 :             if (zone.EnforcedReciprocity) {
    9080           0 :                 if (WarmupSurfTemp > 3) {
    9081           0 :                     ShowSevereError(state, "CalcHeatBalanceInsideSurf: Zone=\"" + zone.Name + "\" has view factor enforced reciprocity");
    9082           0 :                     ShowContinueError(state, " and is having temperature out of bounds errors. Please correct zone geometry and rerun.");
    9083           0 :                     ShowFatalError(state, "CalcHeatBalanceInsideSurf: Program terminates due to preceding conditions.");
    9084             :                 }
    9085           0 :             } else if (WarmupSurfTemp > 10) {
    9086           0 :                 ShowFatalError(state, "CalcHeatBalanceInsideSurf: Program terminates due to preceding conditions.");
    9087             :             }
    9088             :         }
    9089             :     }
    9090           0 :     if ((TH12 > state.dataHeatBalSurf->MaxSurfaceTempLimitBeforeFatal) || (TH12 < MinSurfaceTempLimitBeforeFatal)) {
    9091           0 :         if (!state.dataGlobal->WarmupFlag) {
    9092           0 :             if (TH12 < MinSurfaceTempLimitBeforeFatal) {
    9093           0 :                 ShowSevereError(state,
    9094           0 :                                 format("Temperature (low) out of bounds [{:.2R}] for zone=\"{}\", for surface=\"{}\"", TH12, zone.Name, surfName));
    9095           0 :                 ShowContinueErrorTimeStamp(state, "");
    9096           0 :                 if (!zone.TempOutOfBoundsReported) {
    9097           0 :                     ShowContinueError(state, "Zone=\"" + zone.Name + "\", Diagnostic Details:");
    9098           0 :                     if (zone.FloorArea > 0.0) {
    9099           0 :                         ShowContinueError(state, format("...Internal Heat Gain [{:.3R}] W/m2", zone.InternalHeatGains / zone.FloorArea));
    9100             :                     } else {
    9101           0 :                         ShowContinueError(state, format("...Internal Heat Gain (no floor) [{:.3R}] W", zone.InternalHeatGains / zone.FloorArea));
    9102             :                     }
    9103           0 :                     if (state.afn->simulation_control.type == AirflowNetwork::ControlType::NoMultizoneOrDistribution) {
    9104           0 :                         ShowContinueError(state, format("...Infiltration/Ventilation [{:.3R}] m3/s", zone.NominalInfilVent));
    9105           0 :                         ShowContinueError(state, format("...Mixing/Cross Mixing [{:.3R}] m3/s", zone.NominalMixing));
    9106             :                     } else {
    9107           0 :                         ShowContinueError(state, "...Airflow Network Simulation: Nominal Infiltration/Ventilation/Mixing not available.");
    9108             :                     }
    9109           0 :                     if (zone.IsControlled) {
    9110           0 :                         ShowContinueError(state, "...Zone is part of HVAC controlled system.");
    9111             :                     } else {
    9112           0 :                         ShowContinueError(state, "...Zone is not part of HVAC controlled system.");
    9113             :                     }
    9114           0 :                     zone.TempOutOfBoundsReported = true;
    9115             :                 }
    9116           0 :                 ShowFatalError(state, "Program terminates due to preceding condition.");
    9117             :             } else {
    9118           0 :                 ShowSevereError(state,
    9119           0 :                                 format("Temperature (high) out of bounds [{:.2R}] for zone=\"{}\", for surface=\"{}\"", TH12, zone.Name, surfName));
    9120           0 :                 ShowContinueErrorTimeStamp(state, "");
    9121           0 :                 if (!zone.TempOutOfBoundsReported) {
    9122           0 :                     ShowContinueError(state, "Zone=\"" + zone.Name + "\", Diagnostic Details:");
    9123           0 :                     if (zone.FloorArea > 0.0) {
    9124           0 :                         ShowContinueError(state, format("...Internal Heat Gain [{:.3R}] W/m2", zone.InternalHeatGains / zone.FloorArea));
    9125             :                     } else {
    9126           0 :                         ShowContinueError(state, format("...Internal Heat Gain (no floor) [{:.3R}] W", zone.InternalHeatGains / zone.FloorArea));
    9127             :                     }
    9128           0 :                     if (state.afn->simulation_control.type == AirflowNetwork::ControlType::NoMultizoneOrDistribution) {
    9129           0 :                         ShowContinueError(state, format("...Infiltration/Ventilation [{:.3R}] m3/s", zone.NominalInfilVent));
    9130           0 :                         ShowContinueError(state, format("...Mixing/Cross Mixing [{:.3R}] m3/s", zone.NominalMixing));
    9131             :                     } else {
    9132           0 :                         ShowContinueError(state, "...Airflow Network Simulation: Nominal Infiltration/Ventilation/Mixing not available.");
    9133             :                     }
    9134           0 :                     if (zone.IsControlled) {
    9135           0 :                         ShowContinueError(state, "...Zone is part of HVAC controlled system.");
    9136             :                     } else {
    9137           0 :                         ShowContinueError(state, "...Zone is not part of HVAC controlled system.");
    9138             :                     }
    9139           0 :                     zone.TempOutOfBoundsReported = true;
    9140             :                 }
    9141           0 :                 ShowFatalError(state, "Program terminates due to preceding condition.");
    9142             :             }
    9143             :         } else {
    9144           0 :             if (TH12 < -10000. || TH12 > 10000.) {
    9145           0 :                 ShowSevereError(
    9146             :                     state,
    9147           0 :                     format("CalcHeatBalanceInsideSurf: The temperature of {:.2R} C for zone=\"{}\", for surface=\"{}\"", TH12, zone.Name, surfName));
    9148           0 :                 ShowContinueError(state, "..is very far out of bounds during warmup. This may be an indication of a malformed zone.");
    9149           0 :                 ShowContinueErrorTimeStamp(state, "");
    9150           0 :                 ShowFatalError(state, "Program terminates due to preceding condition.");
    9151             :             }
    9152             :         }
    9153             :     }
    9154           0 : }
    9155             : 
    9156    40464940 : void CalcOutsideSurfTemp(EnergyPlusData &state,
    9157             :                          int const SurfNum,      // Surface number DO loop counter
    9158             :                          int const ZoneNum,      // Zone number the current surface is attached to
    9159             :                          int const ConstrNum,    // Construction index for the current surface
    9160             :                          Real64 const HMovInsul, // "Convection" coefficient of movable insulation
    9161             :                          Real64 const TempExt,   // Exterior temperature boundary condition
    9162             :                          bool &ErrorFlag         // Error flag for movable insulation problem
    9163             : )
    9164             : {
    9165             : 
    9166             :     // SUBROUTINE INFORMATION:
    9167             :     //       AUTHOR         George Walton
    9168             :     //       DATE WRITTEN   December 1979
    9169             :     //       MODIFIED       Jun 1990 (RDT for new CTF arrays)
    9170             :     //                      Jul 2000 (RJL for Moisture algorithms)
    9171             :     //                      Sep 2000 (RKS for new radiant exchange algorithm)
    9172             :     //                      Dec 2000 (RKS for radiant system model addition)
    9173             :     //                      Aug 2010 (BG added radiant heat flow rate reporting)
    9174             :     //       RE-ENGINEERED  Mar 1998 (RKS)
    9175             : 
    9176             :     // PURPOSE OF THIS SUBROUTINE:
    9177             :     // This subroutine performs a heat balance on the outside face of each
    9178             :     // surface in the building.  NOTE that this also sets some coefficients
    9179             :     // that are needed for radiant system modeling.  Thus, it is extremely
    9180             :     // important that if someone makes changes to the heat balance equations
    9181             :     // at a later date that they must also make changes to the coefficient
    9182             :     // setting portion of this subroutine as well.
    9183             : 
    9184             :     // METHODOLOGY EMPLOYED:
    9185             :     // Various boundary conditions are set and additional parameters are set-
    9186             :     // up.  Then, the proper heat balance equation is selected based on the
    9187             :     // presence of movable insulation, thermal mass of the surface construction,
    9188             :     // and convection model being used.
    9189             : 
    9190             :     // REFERENCES:
    9191             :     // (I)BLAST legacy routine HBOUT
    9192             :     // 1989 ASHRAE Handbook of Fundamentals (Figure 1 on p. 22.4, convection correlations)
    9193             : 
    9194             :     // Using/Aliasing
    9195             :     using namespace DataEnvironment;
    9196             :     using namespace DataHeatBalance;
    9197             :     using namespace DataHeatBalSurface;
    9198             :     using namespace DataSurfaces;
    9199             :     using namespace Psychrometrics;
    9200             : 
    9201             :     // Determine whether or not movable insulation is present
    9202    40464940 :     bool MovInsulPresent = (HMovInsul > 0.0); // .TRUE. if movable insulation is currently present for surface
    9203             :     bool QuickConductionSurf;                 // .TRUE. if the cross CTF term is relatively large
    9204             :     Real64 F1;                                // Intermediate calculation variable
    9205             :     Real64 F2;                                // Intermediate calculation variable
    9206             :     // Determine whether this surface is a "slow conductive" or "quick conductive"
    9207             :     // surface.  Designates are inherited from BLAST.  Basically, a "quick" surface
    9208             :     // requires the inside heat balance to be accounted for in the heat balance
    9209             :     // while a "slow" surface can used the last time step's value for inside
    9210             :     // surface temperature.
    9211    40464940 :     auto &Surface(state.dataSurface->Surface);
    9212    40464940 :     auto const &construct(state.dataConstruction->Construct(ConstrNum));
    9213    40464940 :     if (construct.CTFCross(0) > 0.01) {
    9214     4868920 :         QuickConductionSurf = true;
    9215     4868920 :         F1 = construct.CTFCross(0) / (construct.CTFInside(0) + state.dataHeatBalSurf->SurfHConvInt(SurfNum));
    9216             :     } else {
    9217    35596020 :         QuickConductionSurf = false;
    9218             :     }
    9219             : 
    9220    40464940 :     Real64 TSky = state.dataEnvrn->SkyTemp;
    9221    40464940 :     Real64 TGround = state.dataEnvrn->OutDryBulbTemp;
    9222             : 
    9223    40464940 :     if (state.dataSurface->Surface(SurfNum).SurfHasSurroundingSurfProperty) {
    9224        5412 :         int SrdSurfsNum = state.dataSurface->Surface(SurfNum).SurfSurroundingSurfacesNum;
    9225        5412 :         if (state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).SkyTempSchNum != 0) {
    9226           0 :             TSky = GetCurrentScheduleValue(state, state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).SkyTempSchNum);
    9227             :         }
    9228        5412 :         if (state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).GroundTempSchNum != 0) {
    9229           0 :             TGround = GetCurrentScheduleValue(state, state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).GroundTempSchNum);
    9230             :         }
    9231             :     }
    9232    40464940 :     if (state.dataSurface->Surface(SurfNum).UseSurfPropertyGndSurfTemp) {
    9233        8118 :         TGround = state.dataSurface->GroundSurfsProperty(state.dataSurface->Surface(SurfNum).SurfPropertyGndSurfIndex).SurfsTempAvg;
    9234             :     }
    9235             : 
    9236             :     // Now, calculate the outside surface temperature using the proper heat balance equation.
    9237             :     // Each case has been separated out into its own IF-THEN block for clarity.  Additional
    9238             :     // cases can simply be added anywhere in the following section.  This is the last step
    9239             :     // in the main loop.  Once the proper heat balance is done, the simulation goes on to
    9240             :     // the next SurfNum.
    9241             : 
    9242             :     // Outside heat balance case: Tubular daylighting device
    9243    40464940 :     Real64 &TH11(state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum));
    9244    40464940 :     if (Surface(SurfNum).Class == SurfaceClass::TDD_Dome) {
    9245             : 
    9246             :         // Lookup up the TDD:DIFFUSER object
    9247        4050 :         int PipeNum = state.dataSurface->SurfWinTDDPipeNum(SurfNum);
    9248        4050 :         int SurfNum2 = state.dataDaylightingDevicesData->TDDPipe(PipeNum).Diffuser;
    9249        4050 :         int ZoneNum2 = Surface(SurfNum2).Zone;
    9250        4050 :         Real64 Ueff = 1.0 / state.dataDaylightingDevicesData->TDDPipe(PipeNum).Reff; // 1 / effective R value between TDD:DOME and TDD:DIFFUSER
    9251        4050 :         F1 = Ueff / (Ueff + state.dataHeatBalSurf->SurfHConvInt(SurfNum2));
    9252             : 
    9253             :         // Similar to opaque surface but inside conditions of TDD:DIFFUSER are used, and no embedded sources/sinks.
    9254             :         // Absorbed shortwave radiation is treated similar to a regular window, but only 1 glass layer is allowed.
    9255             :         //   SurfOpaqQRadSWOutAbs(SurfNum) does not apply for TDD:DOME, must use SurfWinQRadSWwinAbs(SurfNum,1)/2.0 instead.
    9256             :         //+Construct(ConstrNum)%CTFSourceOut(0)     &   TDDs cannot be radiant systems
    9257             :         // *SurfQsrcHist(1,SurfNum)                     &
    9258             :         //+Construct(ConstrNum)%CTFSourceIn(0) &   TDDs cannot be radiant systems
    9259             :         // *SurfQsrcHist(1,SurfNum)                &
    9260       12150 :         TH11 = (state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum, 1) / 2.0 + state.dataHeatBalSurf->SurfQRadLWOutSrdSurfs(SurfNum) +
    9261        8100 :                 (state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum)) * TempExt +
    9262       12150 :                 state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(SurfNum) + state.dataHeatBalSurf->SurfHSkyExt(SurfNum) * TSky +
    9263        8100 :                 state.dataHeatBalSurf->SurfHGrdExt(SurfNum) * TGround +
    9264       12150 :                 F1 * (state.dataHeatBal->SurfWinQRadSWwinAbs(SurfNum2, 1) / 2.0 + state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum2) +
    9265        8100 :                       state.dataHeatBalSurf->SurfHConvInt(SurfNum2) * state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum2).MAT +
    9266        8100 :                       state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(SurfNum2))) /
    9267        8100 :                (Ueff + state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum) +
    9268       12150 :                 state.dataHeatBalSurf->SurfHSkyExt(SurfNum) + state.dataHeatBalSurf->SurfHGrdExt(SurfNum) -
    9269        4050 :                 F1 * Ueff); // Instead of SurfOpaqQRadSWOutAbs(SurfNum) | ODB used to approx ground surface temp | Use TDD:DIFFUSER surface | Use
    9270             :                             // TDD:DIFFUSER surface | Use TDD:DIFFUSER surface and zone | Use TDD:DIFFUSER surface
    9271             : 
    9272             :         // Outside heat balance case: No movable insulation, slow conduction
    9273    40460890 :     } else if ((!MovInsulPresent) && (!QuickConductionSurf)) {
    9274             :         // Add LWR from surrounding surfaces
    9275    35587923 :         if (Surface(SurfNum).OSCMPtr == 0) {
    9276    35551374 :             if (construct.SourceSinkPresent) {
    9277      249435 :                 TH11 = (-state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(SurfNum) +
    9278      166290 :                         state.dataHeatBalSurf->SurfQRadLWOutSrdSurfs(SurfNum) +
    9279      166290 :                         (state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum)) * TempExt +
    9280      249435 :                         state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(SurfNum) + state.dataHeatBalSurf->SurfHSkyExt(SurfNum) * TSky +
    9281      249435 :                         state.dataHeatBalSurf->SurfHGrdExt(SurfNum) * TGround + construct.CTFCross(0) * state.dataHeatBalSurf->SurfTempIn(SurfNum) +
    9282      166290 :                         construct.CTFSourceOut(0) * state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1)) /
    9283      166290 :                        (construct.CTFOutside(0) + state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum) +
    9284      166290 :                         state.dataHeatBalSurf->SurfHSkyExt(SurfNum) +
    9285       83145 :                         state.dataHeatBalSurf->SurfHGrdExt(SurfNum)); // ODB used to approx ground surface temp
    9286             :             } else {
    9287   106404687 :                 TH11 = (-state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(SurfNum) +
    9288    70936458 :                         state.dataHeatBalSurf->SurfQRadLWOutSrdSurfs(SurfNum) +
    9289    70936458 :                         (state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum)) * TempExt +
    9290   106404687 :                         state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(SurfNum) + state.dataHeatBalSurf->SurfHSkyExt(SurfNum) * TSky +
    9291   106404687 :                         state.dataHeatBalSurf->SurfHGrdExt(SurfNum) * TGround + construct.CTFCross(0) * state.dataHeatBalSurf->SurfTempIn(SurfNum)) /
    9292    70936458 :                        (construct.CTFOutside(0) + state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum) +
    9293    70936458 :                         state.dataHeatBalSurf->SurfHSkyExt(SurfNum) +
    9294    35468229 :                         state.dataHeatBalSurf->SurfHGrdExt(SurfNum)); // ODB used to approx ground surface temp
    9295             :             }
    9296             :             // Outside Heat Balance case: Other Side Conditions Model
    9297             :         } else { //( Surface(SurfNum)%OSCMPtr > 0 ) THEN
    9298             :             // local copies of variables for clarity in radiation terms
    9299             :             // TODO: - int OSCMPtr; // "Pointer" to OSCM data structure (other side conditions from a model)
    9300       36549 :             Real64 RadTemp = state.dataSurface->OSCM(Surface(SurfNum).OSCMPtr)
    9301       36549 :                                  .TRad; // local value for Effective radiation temperature for OtherSideConditions model
    9302       36549 :             Real64 HRad = state.dataSurface->OSCM(Surface(SurfNum).OSCMPtr).HRad; // local value for effective (linearized) radiation coefficient
    9303             : 
    9304             :             // patterned after "No movable insulation, slow conduction," but with new radiation terms and no sun,
    9305       36549 :             if (construct.SourceSinkPresent) {
    9306           0 :                 TH11 = (-state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) + state.dataHeatBalSurf->SurfHcExt(SurfNum) * TempExt +
    9307           0 :                         state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(SurfNum) + HRad * RadTemp +
    9308           0 :                         construct.CTFCross(0) * state.dataHeatBalSurf->SurfTempIn(SurfNum) +
    9309           0 :                         construct.CTFSourceOut(0) * state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1)) /
    9310           0 :                        (construct.CTFOutside(0) + state.dataHeatBalSurf->SurfHcExt(SurfNum) + HRad);
    9311             :             } else {
    9312      109647 :                 TH11 = (-state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) + state.dataHeatBalSurf->SurfHcExt(SurfNum) * TempExt +
    9313      109647 :                         state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(SurfNum) + HRad * RadTemp +
    9314       73098 :                         construct.CTFCross(0) * state.dataHeatBalSurf->SurfTempIn(SurfNum)) /
    9315       36549 :                        (construct.CTFOutside(0) + state.dataHeatBalSurf->SurfHcExt(SurfNum) + HRad);
    9316             :             }
    9317    35587923 :         }
    9318             :         // Outside heat balance case: No movable insulation, quick conduction
    9319     4872967 :     } else if ((!MovInsulPresent) && (QuickConductionSurf)) {
    9320     4868920 :         if (Surface(SurfNum).OSCMPtr == 0) {
    9321     4799200 :             if (construct.SourceSinkPresent) {
    9322       73539 :                 TH11 = (-state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(SurfNum) +
    9323       49026 :                         state.dataHeatBalSurf->SurfQRadLWOutSrdSurfs(SurfNum) +
    9324       49026 :                         (state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum)) * TempExt +
    9325       73539 :                         state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(SurfNum) + state.dataHeatBalSurf->SurfHSkyExt(SurfNum) * TSky +
    9326       49026 :                         state.dataHeatBalSurf->SurfHGrdExt(SurfNum) * TGround +
    9327       49026 :                         construct.CTFSourceOut(0) * state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1) +
    9328       73539 :                         F1 * (state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) +
    9329       49026 :                               state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum) +
    9330       49026 :                               state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT +
    9331       49026 :                               state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(SurfNum))) /
    9332       49026 :                        (construct.CTFOutside(0) + state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum) +
    9333       73539 :                         state.dataHeatBalSurf->SurfHSkyExt(SurfNum) + state.dataHeatBalSurf->SurfHGrdExt(SurfNum) -
    9334       24513 :                         F1 * construct.CTFCross(0)); // ODB used to approx ground surface temp | MAT use here is problem for room air models
    9335             :             } else {
    9336    14324061 :                 TH11 = (-state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(SurfNum) +
    9337     9549374 :                         state.dataHeatBalSurf->SurfQRadLWOutSrdSurfs(SurfNum) +
    9338     9549374 :                         (state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum)) * TempExt +
    9339    14324061 :                         state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(SurfNum) + state.dataHeatBalSurf->SurfHSkyExt(SurfNum) * TSky +
    9340     9549374 :                         state.dataHeatBalSurf->SurfHGrdExt(SurfNum) * TGround +
    9341    14324061 :                         F1 * (state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) +
    9342     9549374 :                               state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum) +
    9343     9549374 :                               state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT +
    9344     9549374 :                               state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(SurfNum))) /
    9345     9549374 :                        (construct.CTFOutside(0) + state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum) +
    9346    14324061 :                         state.dataHeatBalSurf->SurfHSkyExt(SurfNum) + state.dataHeatBalSurf->SurfHGrdExt(SurfNum) -
    9347     4774687 :                         F1 * construct.CTFCross(0)); // ODB used to approx ground surface temp | MAT use here is problem for room air models
    9348             :             }
    9349             :             // Outside Heat Balance case: Other Side Conditions Model
    9350             :         } else { //( Surface(SurfNum)%OSCMPtr > 0 ) THEN
    9351             :             // local copies of variables for clarity in radiation terms
    9352       69720 :             Real64 RadTemp = state.dataSurface->OSCM(Surface(SurfNum).OSCMPtr).TRad;
    9353       69720 :             Real64 HRad = state.dataSurface->OSCM(Surface(SurfNum).OSCMPtr).HRad;
    9354             :             // patterned after "No movable insulation, quick conduction," but with new radiation terms and no sun,
    9355       69720 :             if (construct.SourceSinkPresent) {
    9356           0 :                 TH11 = (-state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) + state.dataHeatBalSurf->SurfHcExt(SurfNum) * TempExt +
    9357           0 :                         state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(SurfNum) + HRad * RadTemp +
    9358           0 :                         construct.CTFSourceOut(0) * state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1) +
    9359           0 :                         F1 * (state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) +
    9360           0 :                               state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum) +
    9361           0 :                               construct.CTFSourceIn(0) * state.dataHeatBalSurf->SurfQsrcHist(SurfNum, 1) +
    9362           0 :                               state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT +
    9363           0 :                               state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(SurfNum))) /
    9364           0 :                        (construct.CTFOutside(0) + state.dataHeatBalSurf->SurfHcExt(SurfNum) + HRad -
    9365           0 :                         F1 * construct.CTFCross(0)); // MAT use here is problem for room air models
    9366             :             } else {
    9367      209160 :                 TH11 = (-state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) + state.dataHeatBalSurf->SurfHcExt(SurfNum) * TempExt +
    9368      209160 :                         state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(SurfNum) + HRad * RadTemp +
    9369      209160 :                         F1 * (state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) +
    9370      139440 :                               state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum) +
    9371      139440 :                               state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT +
    9372      139440 :                               state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(SurfNum))) /
    9373      139440 :                        (construct.CTFOutside(0) + state.dataHeatBalSurf->SurfHcExt(SurfNum) + HRad -
    9374       69720 :                         F1 * construct.CTFCross(0)); // MAT use here is problem for room air models
    9375             :             }
    9376     4868920 :         }
    9377             :         // Outside heat balance case: Movable insulation, slow conduction
    9378        4047 :     } else if ((MovInsulPresent) && (!QuickConductionSurf)) {
    9379             : 
    9380       12141 :         F2 = HMovInsul / (HMovInsul + state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum) +
    9381        8094 :                           state.dataHeatBalSurf->SurfHSkyExt(SurfNum) + state.dataHeatBalSurf->SurfHGrdExt(SurfNum));
    9382             : 
    9383       12141 :         TH11 = (-state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(SurfNum) +
    9384       12141 :                 state.dataHeatBalSurf->SurfQRadLWOutSrdSurfs(SurfNum) + construct.CTFCross(0) * state.dataHeatBalSurf->SurfTempIn(SurfNum) +
    9385       12141 :                 F2 * (state.dataHeatBalSurf->SurfQRadSWOutMvIns(SurfNum) +
    9386        8094 :                       (state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum)) * TempExt +
    9387       12141 :                       state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(SurfNum) + state.dataHeatBalSurf->SurfHSkyExt(SurfNum) * TSky +
    9388        8094 :                       state.dataHeatBalSurf->SurfHGrdExt(SurfNum) * TGround)) /
    9389        4047 :                (construct.CTFOutside(0) + HMovInsul - F2 * HMovInsul); // ODB used to approx ground surface temp
    9390             : 
    9391             :         // Outside heat balance case: Movable insulation, quick conduction
    9392           0 :     } else if ((MovInsulPresent) && (QuickConductionSurf)) {
    9393             : 
    9394           0 :         F2 = HMovInsul / (HMovInsul + state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum) +
    9395           0 :                           state.dataHeatBalSurf->SurfHSkyExt(SurfNum) + state.dataHeatBalSurf->SurfHGrdExt(SurfNum));
    9396             : 
    9397           0 :         TH11 = (-state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(SurfNum) +
    9398           0 :                 state.dataHeatBalSurf->SurfQRadLWOutSrdSurfs(SurfNum) +
    9399           0 :                 F1 * (state.dataHeatBalSurf->SurfCTFConstInPart(SurfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWInAbs(SurfNum) +
    9400           0 :                       state.dataHeatBal->SurfQdotRadIntGainsInPerArea(SurfNum) +
    9401           0 :                       state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT +
    9402           0 :                       state.dataHeatBalSurf->SurfQdotRadNetLWInPerArea(SurfNum)) +
    9403           0 :                 F2 * (state.dataHeatBalSurf->SurfQRadSWOutMvIns(SurfNum) +
    9404           0 :                       (state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum)) * TempExt +
    9405           0 :                       state.dataHeatBalSurf->SurfQAdditionalHeatSourceOutside(SurfNum) + state.dataHeatBalSurf->SurfHSkyExt(SurfNum) * TSky +
    9406           0 :                       state.dataHeatBalSurf->SurfHGrdExt(SurfNum) * TGround)) /
    9407           0 :                (construct.CTFOutside(0) + HMovInsul - F2 * HMovInsul - F1 * construct.CTFCross(0)); // ODB used to approx ground surface temp
    9408             : 
    9409             :     } // ...end of outside heat balance cases IF-THEN block
    9410             : 
    9411             :     // multiply out linearized radiation coeffs for reporting
    9412    80929880 :     Real64 const HExtSurf_fac(-(state.dataHeatBalSurf->SurfHSkyExt(SurfNum) * (TH11 - TSky) +
    9413    80929880 :                                 state.dataHeatBalSurf->SurfHAirExt(SurfNum) * (TH11 - TempExt) +
    9414    80929880 :                                 state.dataHeatBalSurf->SurfHGrdExt(SurfNum) * (TH11 - TGround)));
    9415             :     Real64 QRadLWOutSrdSurfsRep;
    9416    40464940 :     QRadLWOutSrdSurfsRep = 0;
    9417             :     // Report LWR from surrounding surfaces for current exterior surf temp
    9418             :     // Current exterior surf temp would be used for the next step LWR calculation.
    9419    40464940 :     if (state.dataSurface->Surface(SurfNum).SurfHasSurroundingSurfProperty) {
    9420        5412 :         int SrdSurfsNum = state.dataSurface->Surface(SurfNum).SurfSurroundingSurfacesNum;
    9421       18942 :         for (int SrdSurfNum = 1; SrdSurfNum <= state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).TotSurroundingSurface; SrdSurfNum++) {
    9422       13530 :             Real64 SrdSurfViewFac = state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).SurroundingSurfs(SrdSurfNum).ViewFactor;
    9423             :             Real64 SrdSurfTempAbs =
    9424       13530 :                 GetCurrentScheduleValue(state, state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).SurroundingSurfs(SrdSurfNum).TempSchNum) +
    9425       13530 :                 DataGlobalConstants::KelvinConv;
    9426       27060 :             QRadLWOutSrdSurfsRep += DataGlobalConstants::StefanBoltzmann *
    9427       27060 :                                     state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(1)).AbsorpThermal *
    9428       13530 :                                     SrdSurfViewFac * (pow_4(SrdSurfTempAbs) - pow_4(TH11 + DataGlobalConstants::KelvinConv));
    9429             :         }
    9430             :     }
    9431    40464940 :     state.dataHeatBalSurf->SurfQdotRadOutRepPerArea(SurfNum) = HExtSurf_fac + QRadLWOutSrdSurfsRep;
    9432             : 
    9433             :     // Set the radiant system heat balance coefficients if this surface is also a radiant system
    9434    40464940 :     if (construct.SourceSinkPresent) {
    9435             : 
    9436      107658 :         if (MovInsulPresent) {
    9437             :             // Note: if movable insulation is ever added back in correctly, the heat balance equations above must be fixed
    9438           0 :             ShowSevereError(state, "Exterior movable insulation is not valid with embedded sources/sinks");
    9439           0 :             ShowContinueError(state, "Construction " + construct.Name + " contains an internal source or sink but also uses");
    9440           0 :             ShowContinueError(state,
    9441           0 :                               "exterior movable insulation " +
    9442           0 :                                   state.dataMaterial->Material(state.dataSurface->SurfMaterialMovInsulExt(SurfNum)).Name +
    9443             :                                   " for a surface with that construction.");
    9444           0 :             ShowContinueError(state,
    9445             :                               "This is not currently allowed because the heat balance equations do not currently accommodate this combination.");
    9446           0 :             ErrorFlag = true;
    9447           0 :             return;
    9448             : 
    9449             :         } else {
    9450      215316 :             Real64 const RadSysDiv(1.0 / (construct.CTFOutside(0) + state.dataHeatBalSurf->SurfHcExt(SurfNum) +
    9451      322974 :                                           state.dataHeatBalSurf->SurfHAirExt(SurfNum) + state.dataHeatBalSurf->SurfHSkyExt(SurfNum) +
    9452      215316 :                                           state.dataHeatBalSurf->SurfHGrdExt(SurfNum)));
    9453             : 
    9454      107658 :             state.dataHeatBalFanSys->RadSysToHBConstCoef(SurfNum) =
    9455      215316 :                 (-state.dataHeatBalSurf->SurfCTFConstOutPart(SurfNum) + state.dataHeatBalSurf->SurfOpaqQRadSWOutAbs(SurfNum) +
    9456      215316 :                  state.dataHeatBalSurf->SurfQRadLWOutSrdSurfs(SurfNum) +
    9457      215316 :                  (state.dataHeatBalSurf->SurfHcExt(SurfNum) + state.dataHeatBalSurf->SurfHAirExt(SurfNum)) * TempExt +
    9458      215316 :                  state.dataHeatBalSurf->SurfHSkyExt(SurfNum) * TSky + state.dataHeatBalSurf->SurfHGrdExt(SurfNum) * TGround) *
    9459             :                 RadSysDiv; // ODB used to approx ground surface temp
    9460             : 
    9461      107658 :             state.dataHeatBalFanSys->RadSysToHBTinCoef(SurfNum) = construct.CTFCross(0) * RadSysDiv;
    9462             : 
    9463      107658 :             state.dataHeatBalFanSys->RadSysToHBQsrcCoef(SurfNum) = construct.CTFSourceOut(0) * RadSysDiv;
    9464             :         }
    9465             :     }
    9466             : }
    9467             : 
    9468        8124 : void CalcExteriorVentedCavity(EnergyPlusData &state, int const SurfNum) // index of surface
    9469             : {
    9470             : 
    9471             :     // SUBROUTINE INFORMATION:
    9472             :     //       AUTHOR         B Griffith
    9473             :     //       DATE WRITTEN   January 2005
    9474             :     //       MODIFIED       na
    9475             :     //       RE-ENGINEERED  na
    9476             : 
    9477             :     // PURPOSE OF THIS SUBROUTINE:
    9478             :     // manages calculating the temperatures of baffle and air cavity for
    9479             :     // multi-skin configuration.
    9480             : 
    9481             :     // METHODOLOGY EMPLOYED:
    9482             :     // derived from CalcPassiveTranspiredCollector
    9483             : 
    9484             :     // Using/Aliasing
    9485             :     using ConvectionCoefficients::InitExteriorConvectionCoeff;
    9486             :     using Psychrometrics::PsyCpAirFnW;
    9487             :     using Psychrometrics::PsyRhoAirFnPbTdbW;
    9488             :     using Psychrometrics::PsyWFnTdbTwbPb;
    9489             : 
    9490             :     // local working variables
    9491             :     Real64 AspRat; // Aspect Ratio of gap
    9492             :     Real64 TmpTscoll;
    9493             :     Real64 TmpTaPlen;
    9494             :     Real64 RhoAir;
    9495             :     Real64 holeArea;
    9496             :     Real64 HrPlen;
    9497             :     Real64 HcPlen;
    9498             :     Real64 Isc;
    9499             :     Real64 MdotVent;
    9500             :     Real64 VdotWind;
    9501             :     Real64 VdotThermal;
    9502             :     int CavNum; // do loop counter
    9503             :     int iter;   // do loop counter
    9504             :     int thisOSCM;
    9505             :     Real64 TempExt;
    9506             :     Real64 OutHumRatExt;
    9507             : 
    9508        8124 :     CavNum = state.dataSurface->SurfExtCavNum(SurfNum);
    9509             : 
    9510        8124 :     TempExt = state.dataSurface->SurfOutDryBulbTemp(SurfNum);
    9511             : 
    9512       24372 :     OutHumRatExt = PsyWFnTdbTwbPb(
    9513       24372 :         state, state.dataSurface->SurfOutDryBulbTemp(SurfNum), state.dataSurface->SurfOutWetBulbTemp(SurfNum), state.dataEnvrn->OutBaroPress);
    9514             : 
    9515        8124 :     RhoAir = PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, TempExt, OutHumRatExt);
    9516             : 
    9517        8124 :     holeArea = state.dataSurface->ExtVentedCavity(CavNum).ActualArea * state.dataSurface->ExtVentedCavity(CavNum).Porosity;
    9518             : 
    9519        8124 :     AspRat = state.dataSurface->ExtVentedCavity(CavNum).HdeltaNPL * 2.0 / state.dataSurface->ExtVentedCavity(CavNum).PlenGapThick;
    9520        8124 :     TmpTscoll = state.dataSurface->ExtVentedCavity(CavNum).TbaffleLast;
    9521        8124 :     TmpTaPlen = state.dataSurface->ExtVentedCavity(CavNum).TairLast;
    9522             : 
    9523             :     // all the work is done in this routine located in GeneralRoutines.cc
    9524             : 
    9525       32496 :     for (iter = 1; iter <= 3; ++iter) { // this is a sequential solution approach.
    9526             : 
    9527      268092 :         CalcPassiveExteriorBaffleGap(state,
    9528       24372 :                                      state.dataSurface->ExtVentedCavity(CavNum).SurfPtrs,
    9529             :                                      holeArea,
    9530       24372 :                                      state.dataSurface->ExtVentedCavity(CavNum).Cv,
    9531       24372 :                                      state.dataSurface->ExtVentedCavity(CavNum).Cd,
    9532       24372 :                                      state.dataSurface->ExtVentedCavity(CavNum).HdeltaNPL,
    9533       24372 :                                      state.dataSurface->ExtVentedCavity(CavNum).SolAbsorp,
    9534       24372 :                                      state.dataSurface->ExtVentedCavity(CavNum).LWEmitt,
    9535       24372 :                                      state.dataSurface->ExtVentedCavity(CavNum).Tilt,
    9536             :                                      AspRat,
    9537       24372 :                                      state.dataSurface->ExtVentedCavity(CavNum).PlenGapThick,
    9538       24372 :                                      state.dataSurface->ExtVentedCavity(CavNum).BaffleRoughness,
    9539       24372 :                                      state.dataSurface->ExtVentedCavity(CavNum).QdotSource,
    9540             :                                      TmpTscoll,
    9541             :                                      TmpTaPlen,
    9542             :                                      HcPlen,
    9543             :                                      HrPlen,
    9544             :                                      Isc,
    9545             :                                      MdotVent,
    9546             :                                      VdotWind,
    9547             :                                      VdotThermal);
    9548             : 
    9549             :     } // sequential solution
    9550             :     // now fill results into derived types
    9551        8124 :     state.dataSurface->ExtVentedCavity(CavNum).Isc = Isc;
    9552        8124 :     state.dataSurface->ExtVentedCavity(CavNum).TAirCav = TmpTaPlen;
    9553        8124 :     state.dataSurface->ExtVentedCavity(CavNum).Tbaffle = TmpTscoll;
    9554        8124 :     state.dataSurface->ExtVentedCavity(CavNum).HrPlen = HrPlen;
    9555        8124 :     state.dataSurface->ExtVentedCavity(CavNum).HcPlen = HcPlen;
    9556        8124 :     state.dataSurface->ExtVentedCavity(CavNum).PassiveACH =
    9557       16248 :         (MdotVent / RhoAir) *
    9558       16248 :         (1.0 / (state.dataSurface->ExtVentedCavity(CavNum).ProjArea * state.dataSurface->ExtVentedCavity(CavNum).PlenGapThick)) *
    9559             :         DataGlobalConstants::SecInHour;
    9560        8124 :     state.dataSurface->ExtVentedCavity(CavNum).PassiveMdotVent = MdotVent;
    9561        8124 :     state.dataSurface->ExtVentedCavity(CavNum).PassiveMdotWind = VdotWind * RhoAir;
    9562        8124 :     state.dataSurface->ExtVentedCavity(CavNum).PassiveMdotTherm = VdotThermal * RhoAir;
    9563             : 
    9564             :     // now do some updates
    9565        8124 :     state.dataSurface->ExtVentedCavity(CavNum).TairLast = state.dataSurface->ExtVentedCavity(CavNum).TAirCav;
    9566        8124 :     state.dataSurface->ExtVentedCavity(CavNum).TbaffleLast = state.dataSurface->ExtVentedCavity(CavNum).Tbaffle;
    9567             : 
    9568             :     // update the OtherSideConditionsModel coefficients.
    9569        8124 :     thisOSCM = state.dataSurface->ExtVentedCavity(CavNum).OSCMPtr;
    9570             : 
    9571        8124 :     state.dataSurface->OSCM(thisOSCM).TConv = state.dataSurface->ExtVentedCavity(CavNum).TAirCav;
    9572        8124 :     state.dataSurface->OSCM(thisOSCM).HConv = state.dataSurface->ExtVentedCavity(CavNum).HcPlen;
    9573        8124 :     state.dataSurface->OSCM(thisOSCM).TRad = state.dataSurface->ExtVentedCavity(CavNum).Tbaffle;
    9574        8124 :     state.dataSurface->OSCM(thisOSCM).HRad = state.dataSurface->ExtVentedCavity(CavNum).HrPlen;
    9575        8124 : }
    9576             : 
    9577      783283 : void GatherComponentLoadsSurfAbsFact(EnergyPlusData &state)
    9578             : {
    9579             :     // SUBROUTINE INFORMATION:
    9580             :     //       AUTHOR         Jason Glazer
    9581             :     //       DATE WRITTEN   September 2012
    9582             : 
    9583             :     // PURPOSE OF THIS SUBROUTINE:
    9584             :     //   Gather values during sizing used for surface absorption factors
    9585             : 
    9586             :     // METHODOLOGY EMPLOYED:
    9587             :     //   Save sequence of values for report during sizing.
    9588             : 
    9589      783283 :     auto &Surface(state.dataSurface->Surface);
    9590             : 
    9591      783283 :     if (state.dataGlobal->CompLoadReportIsReq && !state.dataGlobal->isPulseZoneSizing) {
    9592       31050 :         int TimeStepInDay = (state.dataGlobal->HourOfDay - 1) * state.dataGlobal->NumOfTimeStepInHour + state.dataGlobal->TimeStep;
    9593      213300 :         for (int enclosureNum = 1; enclosureNum <= state.dataViewFactor->NumOfRadiantEnclosures; ++enclosureNum) {
    9594      182250 :             state.dataOutRptTab->TMULTseq(state.dataSize->CurOverallSimDay, TimeStepInDay, enclosureNum) =
    9595      182250 :                 state.dataViewFactor->EnclRadInfo(enclosureNum).radThermAbsMult;
    9596             :         }
    9597     1603800 :         for (int jSurf = 1; jSurf <= state.dataSurface->TotSurfaces; ++jSurf) {
    9598     1572750 :             if (!Surface(jSurf).HeatTransSurf || Surface(jSurf).Zone == 0) continue; // Skip non-heat transfer surfaces
    9599     1429650 :             if (Surface(jSurf).Class == SurfaceClass::TDD_Dome) continue;            // Skip tubular daylighting device domes
    9600     1429650 :             state.dataOutRptTab->ITABSFseq(state.dataSize->CurOverallSimDay, TimeStepInDay, jSurf) = state.dataHeatBalSurf->SurfAbsThermalInt(jSurf);
    9601             :         }
    9602             :     }
    9603      783283 : }
    9604             : 
    9605    52039635 : Real64 GetSurfIncidentSolarMultiplier(EnergyPlusData &state, int SurfNum)
    9606             : {
    9607    52039635 :     if (state.dataSurface->Surface(SurfNum).hasIncSolMultiplier) {
    9608        2408 :         if (state.dataSurface->SurfIncSolMultiplier(SurfNum).SchedPtr > 0) {
    9609        2408 :             return GetCurrentScheduleValue(state, state.dataSurface->SurfIncSolMultiplier(SurfNum).SchedPtr) *
    9610        2408 :                    state.dataSurface->SurfIncSolMultiplier(SurfNum).Scaler;
    9611             :         } else {
    9612           0 :             return state.dataSurface->SurfIncSolMultiplier(SurfNum).Scaler;
    9613             :         }
    9614             :     } else {
    9615    52037227 :         return 1.0;
    9616             :     }
    9617             : }
    9618             : 
    9619         771 : void InitSurfacePropertyViewFactors(EnergyPlusData &state)
    9620             : {
    9621             : 
    9622             :     // purpuse:
    9623             :     //   Initializes sky and ground surfaces view factors of exterior surfaces
    9624             :     //   used by SurfaceProperty:LocalEnvironment
    9625             :     //   view factors are constant hence should be set only once
    9626             : 
    9627         771 :     if (!state.dataGlobal->AnyLocalEnvironmentsInModel) {
    9628         767 :         return;
    9629             :     }
    9630           4 :     if (!state.dataHeatBalSurfMgr->InitSurfaceHeatBalancefirstTime) {
    9631           0 :         return;
    9632             :     }
    9633             : 
    9634         414 :     for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    9635         410 :         auto &Surface = state.dataSurface->Surface(SurfNum);
    9636         410 :         if (Surface.SurfHasSurroundingSurfProperty || Surface.IsSurfPropertyGndSurfacesDefined) {
    9637             : 
    9638          18 :             int GndSurfsNum = 0;
    9639          18 :             int SrdSurfsNum = 0;
    9640          18 :             Real64 SrdSurfsViewFactor = 0.0;
    9641          18 :             Real64 SurfsSkyViewFactor = 0.0;
    9642          18 :             Real64 GroundSurfsViewFactor = 0.0;
    9643          18 :             bool IsSkyViewFactorSet = false;
    9644          18 :             bool IsGroundViewFactorSet = false;
    9645          18 :             bool SetGroundViewFactorObject = false;
    9646          18 :             if (Surface.SurfHasSurroundingSurfProperty) {
    9647           6 :                 SrdSurfsNum = Surface.SurfSurroundingSurfacesNum;
    9648           6 :                 auto &SrdSurfsProperty = state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum);
    9649           6 :                 SurfsSkyViewFactor = SrdSurfsProperty.SkyViewFactor;
    9650           6 :                 IsSkyViewFactorSet = SrdSurfsProperty.IsSkyViewFactorSet;
    9651           6 :                 if (SurfsSkyViewFactor > 0.0) {
    9652           4 :                     SrdSurfsViewFactor += SurfsSkyViewFactor;
    9653             :                 }
    9654           6 :                 if (!Surface.IsSurfPropertyGndSurfacesDefined) {
    9655           5 :                     SrdSurfsViewFactor += SrdSurfsProperty.GroundViewFactor;
    9656           5 :                     IsGroundViewFactorSet = SrdSurfsProperty.IsGroundViewFactorSet;
    9657           5 :                     GroundSurfsViewFactor = SrdSurfsProperty.GroundViewFactor;
    9658             :                 }
    9659          20 :                 for (int SrdSurfNum = 1; SrdSurfNum <= SrdSurfsProperty.TotSurroundingSurface; SrdSurfNum++) {
    9660          14 :                     SrdSurfsViewFactor += SrdSurfsProperty.SurroundingSurfs(SrdSurfNum).ViewFactor;
    9661             :                 }
    9662             :             }
    9663          18 :             if (Surface.IsSurfPropertyGndSurfacesDefined) {
    9664          13 :                 GndSurfsNum = Surface.SurfPropertyGndSurfIndex;
    9665          13 :                 IsGroundViewFactorSet = state.dataSurface->GroundSurfsProperty(GndSurfsNum).IsGroundViewFactorSet;
    9666          13 :                 GroundSurfsViewFactor = state.dataSurface->GroundSurfsProperty(GndSurfsNum).SurfsViewFactorSum;
    9667          13 :                 SrdSurfsViewFactor += GroundSurfsViewFactor;
    9668             :             }
    9669             : 
    9670             :             // Check if the sum of all defined view factors > 1.0
    9671          18 :             if (SrdSurfsViewFactor > 1.0) {
    9672           0 :                 ShowSevereError(state, "Illegal surrounding surfaces view factors for " + Surface.Name + ".");
    9673           0 :                 ShowContinueError(state, " The sum of sky, ground, and all surrounding surfaces view factors should be less than or equal to 1.0.");
    9674             :             }
    9675          18 :             if (IsSkyViewFactorSet && IsGroundViewFactorSet) {
    9676             :                 // If both surface sky and ground view factor defined, overwrite with the defined value
    9677           4 :                 Surface.ViewFactorSkyIR = SurfsSkyViewFactor;
    9678           4 :                 Surface.ViewFactorGroundIR = GroundSurfsViewFactor;
    9679          14 :             } else if (IsSkyViewFactorSet && !IsGroundViewFactorSet) {
    9680             :                 // If only sky view factor defined, ground view factor = 1 - all other defined view factors.
    9681           2 :                 Surface.ViewFactorSkyIR = SurfsSkyViewFactor;
    9682           2 :                 Surface.ViewFactorGroundIR = 1 - SrdSurfsViewFactor;
    9683           4 :                 if (GndSurfsNum > 0) {
    9684           0 :                     SetGroundViewFactorObject = true;
    9685           0 :                     state.dataSurface->GroundSurfsProperty(GndSurfsNum).IsGroundViewFactorSet = true;
    9686             :                 } else {
    9687           2 :                     state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).GroundViewFactor = Surface.ViewFactorGroundIR;
    9688             :                 }
    9689          12 :             } else if (!IsSkyViewFactorSet && IsGroundViewFactorSet) {
    9690             :                 // If only ground view factor defined, sky view factor = 1 - all other defined view factors.
    9691          12 :                 Surface.ViewFactorGroundIR = GroundSurfsViewFactor;
    9692          12 :                 Surface.ViewFactorSkyIR = 1 - SrdSurfsViewFactor;
    9693          24 :                 if (SrdSurfsNum > 0) {
    9694           0 :                     state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).IsSkyViewFactorSet = true;
    9695           0 :                     state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).SkyViewFactor = Surface.ViewFactorSkyIR;
    9696             :                 }
    9697             :             } else {
    9698             :                 // If neither ground nor sky view factor specified, continue to use the original proportion.
    9699           0 :                 Surface.ViewFactorSkyIR *= 1 - SrdSurfsViewFactor;
    9700           0 :                 Surface.ViewFactorGroundIR *= 1 - SrdSurfsViewFactor;
    9701           0 :                 if (SrdSurfsNum > 0) {
    9702           0 :                     state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).IsSkyViewFactorSet = true;
    9703           0 :                     state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).SkyViewFactor = Surface.ViewFactorSkyIR;
    9704           0 :                     if (GndSurfsNum == 0) {
    9705           0 :                         state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).GroundViewFactor = Surface.ViewFactorGroundIR;
    9706           0 :                         state.dataSurface->SurroundingSurfsProperty(SrdSurfsNum).IsGroundViewFactorSet = true;
    9707             :                     }
    9708             :                 }
    9709           0 :                 if (GndSurfsNum > 0) {
    9710           0 :                     SetGroundViewFactorObject = true;
    9711           0 :                     state.dataSurface->GroundSurfsProperty(GndSurfsNum).IsGroundViewFactorSet = true;
    9712             :                 }
    9713             :             }
    9714          18 :             if (SetGroundViewFactorObject) {
    9715           0 :                 ReSetGroundSurfacesViewFactor(state, SurfNum);
    9716             :             }
    9717             :         }
    9718             :     }
    9719             : }
    9720             : 
    9721     3482238 : void GetGroundSurfacesTemperatureAverage(EnergyPlusData &state)
    9722             : {
    9723             :     //  returns ground surfaces average temperature (deg C)
    9724             :     //  ground surfaces viewed by a building exterior surface
    9725             :     //  ground surfaces temperature weighed using view factors
    9726             : 
    9727             :     // local vars
    9728             :     Real64 GndSurfaceTemp;
    9729             :     Real64 GndSurfViewFactor;
    9730             :     Real64 GndSurfaceTempSum;
    9731             : 
    9732     3482238 :     if (!state.dataGlobal->AnyLocalEnvironmentsInModel) {
    9733     3474802 :         return;
    9734             :     }
    9735             : 
    9736      620862 :     for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    9737      613426 :         if (!state.dataSurface->Surface(SurfNum).IsSurfPropertyGndSurfacesDefined) continue;
    9738       17589 :         auto &GndSurfsProperty = state.dataSurface->GroundSurfsProperty(state.dataSurface->Surface(SurfNum).SurfPropertyGndSurfIndex);
    9739       17589 :         if (GndSurfsProperty.SurfsViewFactorSum == 0.0) {
    9740           0 :             state.dataSurface->Surface(SurfNum).UseSurfPropertyGndSurfTemp = false;
    9741           0 :             continue;
    9742             :         }
    9743       17589 :         GndSurfaceTemp = 0.0;
    9744       17589 :         GndSurfViewFactor = 0.0;
    9745       17589 :         GndSurfaceTempSum = 0.0;
    9746       59532 :         for (int gSurfNum = 1; gSurfNum <= GndSurfsProperty.NumGndSurfs; gSurfNum++) {
    9747       41943 :             GndSurfViewFactor = GndSurfsProperty.GndSurfs(gSurfNum).ViewFactor;
    9748       41943 :             if (GndSurfViewFactor == 0.0) continue;
    9749       41943 :             if (GndSurfsProperty.GndSurfs(gSurfNum).TempSchPtr == 0) continue;
    9750       40590 :             GndSurfaceTemp = ScheduleManager::GetCurrentScheduleValue(state, GndSurfsProperty.GndSurfs(gSurfNum).TempSchPtr);
    9751       40590 :             GndSurfaceTempSum += GndSurfViewFactor * pow_4(GndSurfaceTemp + DataGlobalConstants::KelvinConv);
    9752             :         }
    9753       18942 :         if (GndSurfaceTempSum == 0.0) {
    9754        1353 :             GndSurfsProperty.SurfsTempAvg = 0.0;
    9755        1353 :             state.dataSurface->Surface(SurfNum).UseSurfPropertyGndSurfTemp = false;
    9756        1353 :             continue;
    9757             :         }
    9758       16236 :         GndSurfsProperty.SurfsTempAvg = root_4(GndSurfaceTempSum / GndSurfsProperty.SurfsViewFactorSum) - DataGlobalConstants::KelvinConv;
    9759             :     }
    9760             : }
    9761             : 
    9762     2568509 : void GetGroundSurfacesReflectanceAverage(EnergyPlusData &state)
    9763             : {
    9764             :     //  returns ground surfaces average reflectance (dimenssionless)
    9765             :     //  ground reflectance viewed by a building exterior surface
    9766             :     //  ground surfaces reflectance weighed using view factors
    9767             : 
    9768             :     // local vars
    9769             :     Real64 GndSurfRefl;
    9770             :     Real64 GndSurfsReflSum;
    9771             : 
    9772     2568509 :     if (!state.dataGlobal->AnyLocalEnvironmentsInModel) {
    9773     2561073 :         return;
    9774             :     }
    9775      620862 :     for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) {
    9776             : 
    9777      613426 :         if (!state.dataSurface->Surface(SurfNum).IsSurfPropertyGndSurfacesDefined) continue;
    9778       17589 :         auto &GndSurfsProperty = state.dataSurface->GroundSurfsProperty(state.dataSurface->Surface(SurfNum).SurfPropertyGndSurfIndex);
    9779       17589 :         if (GndSurfsProperty.SurfsViewFactorSum == 0.0) {
    9780           0 :             state.dataSurface->Surface(SurfNum).UseSurfPropertyGndSurfRefl = false;
    9781           0 :             continue;
    9782             :         }
    9783       17589 :         GndSurfRefl = 0.0;
    9784       17589 :         GndSurfsReflSum = 0.0;
    9785       59532 :         for (int gSurfNum = 1; gSurfNum <= GndSurfsProperty.NumGndSurfs; gSurfNum++) {
    9786       41943 :             if (GndSurfsProperty.GndSurfs(gSurfNum).ReflSchPtr == 0) continue;
    9787       40590 :             GndSurfRefl = ScheduleManager::GetCurrentScheduleValue(state, GndSurfsProperty.GndSurfs(gSurfNum).ReflSchPtr);
    9788       40590 :             GndSurfsReflSum += GndSurfsProperty.GndSurfs(gSurfNum).ViewFactor * GndSurfRefl;
    9789             :         }
    9790       18942 :         if (GndSurfsReflSum == 0.0) {
    9791        1353 :             GndSurfsProperty.SurfsReflAvg = 0.0;
    9792        1353 :             state.dataSurface->Surface(SurfNum).UseSurfPropertyGndSurfRefl = false;
    9793        1353 :             continue;
    9794             :         }
    9795       16236 :         GndSurfsProperty.SurfsReflAvg = GndSurfsReflSum / GndSurfsProperty.SurfsViewFactorSum;
    9796             :     }
    9797             : }
    9798             : 
    9799           0 : void ReSetGroundSurfacesViewFactor(EnergyPlusData &state, int const SurfNum)
    9800             : {
    9801             :     //  resets ground veiew factors based on view factors identity
    9802             :     //  the ground view factor value is set to the first element
    9803             :     //  when the ground view factor input field is blank
    9804             : 
    9805           0 :     if (!state.dataSurface->Surface(SurfNum).IsSurfPropertyGndSurfacesDefined) return;
    9806           0 :     auto &GndSurfsProperty = state.dataSurface->GroundSurfsProperty(state.dataSurface->Surface(SurfNum).SurfPropertyGndSurfIndex);
    9807           0 :     GndSurfsProperty.SurfsViewFactorSum = state.dataSurface->Surface(SurfNum).ViewFactorGroundIR;
    9808             : 
    9809           0 :     if (GndSurfsProperty.SurfsViewFactorSum == 0.0) {
    9810           0 :         state.dataSurface->Surface(SurfNum).UseSurfPropertyGndSurfRefl = false;
    9811           0 :         state.dataSurface->Surface(SurfNum).UseSurfPropertyGndSurfTemp = false;
    9812           0 :         return;
    9813             :     }
    9814           0 :     GndSurfsProperty.GndSurfs(1).ViewFactor = GndSurfsProperty.SurfsViewFactorSum;
    9815             : }
    9816             : 
    9817        2313 : } // namespace EnergyPlus::HeatBalanceSurfaceManager

Generated by: LCOV version 1.13