From 3051a113afa9fd780952cc982ca41153476b1046 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Tue, 26 Sep 2023 14:47:50 -0500 Subject: [PATCH 01/26] MRT IDD updates plus some space-related cleanup --- idd/Energy+.idd.in | 240 ++++++++++++++++++++++----------------------- 1 file changed, 118 insertions(+), 122 deletions(-) diff --git a/idd/Energy+.idd.in b/idd/Energy+.idd.in index fc22dce1b2a..47bb48206f5 100644 --- a/idd/Energy+.idd.in +++ b/idd/Energy+.idd.in @@ -21362,10 +21362,10 @@ People, A7 , \field Mean Radiant Temperature Calculation Type \note optional (only required for thermal comfort runs) \type choice - \key ZoneAveraged + \key EnclosureAveraged \key SurfaceWeighted \key AngleFactor - \default ZoneAveraged + \default EnclosureAveraged A8 , \field Surface Name/Angle Factor List Name \type object-list \object-list AllHeatTranAngFacNames @@ -21486,708 +21486,704 @@ ComfortViewFactorAngles, \memo Used to specify radiant view factors for thermal comfort calculations. \memo Note that the following angle factor fractions must sum up to 1.0 \extensible:2 - repeat last two fields, remembering to remove ; from "inner" fields. - \memo The number of surfaces can be expanded beyond 100, if necessary, by adding more - \memo groups to the end of the list. + \memo All surfaces must be in the same enclosure. A1 , \field Name \type alpha \reference AllHeatTranAngFacNames - A2 , \field Zone Name - \type object-list - \object-list ZoneNames - A3 , \field Surface 1 Name + A2 , \field Surface 1 Name \type object-list \object-list AllHeatTranSurfNames N1 , \field Angle Factor 1 \type real \minimum 0.0 \maximum 1.0 - A4 , \field Surface 2 Name + A3 , \field Surface 2 Name \type object-list \object-list AllHeatTranSurfNames N2 , \field Angle Factor 2 \type real \minimum 0.0 \maximum 1.0 - A5 , \field Surface 3 Name + A4 , \field Surface 3 Name \type object-list \object-list AllHeatTranSurfNames N3 , \field Angle Factor 3 \type real \minimum 0.0 \maximum 1.0 - A6 , \field Surface 4 Name + A5 , \field Surface 4 Name \type object-list \object-list AllHeatTranSurfNames N4 , \field Angle Factor 4 \type real \minimum 0.0 \maximum 1.0 - A7 , \field Surface 5 Name + A6 , \field Surface 5 Name \type object-list \object-list AllHeatTranSurfNames N5 , \field Angle Factor 5 \type real \minimum 0.0 \maximum 1.0 - A8 , \field Surface 6 Name + A7 , \field Surface 6 Name \type object-list \object-list AllHeatTranSurfNames N6 , \field Angle Factor 6 \type real \minimum 0.0 \maximum 1.0 - A9 , \field Surface 7 Name + A8 , \field Surface 7 Name \type object-list \object-list AllHeatTranSurfNames N7 , \field Angle Factor 7 \type real \minimum 0.0 \maximum 1.0 - A10, \field Surface 8 Name + A9 , \field Surface 8 Name \type object-list \object-list AllHeatTranSurfNames N8 , \field Angle Factor 8 \type real \minimum 0.0 \maximum 1.0 - A11, \field Surface 9 Name + A10, \field Surface 9 Name \type object-list \object-list AllHeatTranSurfNames N9 , \field Angle Factor 9 \type real \minimum 0.0 \maximum 1.0 - A12, \field Surface 10 Name + A11, \field Surface 10 Name \type object-list \object-list AllHeatTranSurfNames N10, \field Angle Factor 10 \type real \minimum 0.0 \maximum 1.0 - A13, \field Surface 11 Name + A12, \field Surface 11 Name \type object-list \object-list AllHeatTranSurfNames N11, \field Angle Factor 11 \type real \minimum 0.0 \maximum 1.0 - A14, \field Surface 12 Name + A13, \field Surface 12 Name \type object-list \object-list AllHeatTranSurfNames N12, \field Angle Factor 12 \type real \minimum 0.0 \maximum 1.0 - A15, \field Surface 13 Name + A14, \field Surface 13 Name \type object-list \object-list AllHeatTranSurfNames N13, \field Angle Factor 13 \type real \minimum 0.0 \maximum 1.0 - A16, \field Surface 14 Name + A15, \field Surface 14 Name \type object-list \object-list AllHeatTranSurfNames N14, \field Angle Factor 14 \type real \minimum 0.0 \maximum 1.0 - A17, \field Surface 15 Name + A16, \field Surface 15 Name \type object-list \object-list AllHeatTranSurfNames N15, \field Angle Factor 15 \type real \minimum 0.0 \maximum 1.0 - A18, \field Surface 16 Name + A17, \field Surface 16 Name \type object-list \object-list AllHeatTranSurfNames N16, \field Angle Factor 16 \type real \minimum 0.0 \maximum 1.0 - A19, \field Surface 17 Name + A18, \field Surface 17 Name \type object-list \object-list AllHeatTranSurfNames N17, \field Angle Factor 17 \type real \minimum 0.0 \maximum 1.0 - A20, \field Surface 18 Name + A19, \field Surface 18 Name \type object-list \object-list AllHeatTranSurfNames N18, \field Angle Factor 18 \type real \minimum 0.0 \maximum 1.0 - A21, \field Surface 19 Name + A20, \field Surface 19 Name \type object-list \object-list AllHeatTranSurfNames N19, \field Angle Factor 19 \type real \minimum 0.0 \maximum 1.0 - A22, \field Surface 20 Name + A21, \field Surface 20 Name \type object-list \object-list AllHeatTranSurfNames N20, \field Angle Factor 20 \type real \minimum 0.0 \maximum 1.0 - A23, \field Surface 21 Name + A22, \field Surface 21 Name \type object-list \object-list AllHeatTranSurfNames N21, \field Angle Factor 21 \type real \minimum 0.0 \maximum 1.0 - A24, \field Surface 22 Name + A23, \field Surface 22 Name \type object-list \object-list AllHeatTranSurfNames N22, \field Angle Factor 22 \type real \minimum 0.0 \maximum 1.0 - A25, \field Surface 23 Name + A24, \field Surface 23 Name \type object-list \object-list AllHeatTranSurfNames N23, \field Angle Factor 23 \type real \minimum 0.0 \maximum 1.0 - A26, \field Surface 24 Name + A25, \field Surface 24 Name \type object-list \object-list AllHeatTranSurfNames N24, \field Angle Factor 24 \type real \minimum 0.0 \maximum 1.0 - A27, \field Surface 25 Name + A26, \field Surface 25 Name \type object-list \object-list AllHeatTranSurfNames N25, \field Angle Factor 25 \type real \minimum 0.0 \maximum 1.0 - A28, \field Surface 26 Name + A27, \field Surface 26 Name \type object-list \object-list AllHeatTranSurfNames N26, \field Angle Factor 26 \type real \minimum 0.0 \maximum 1.0 - A29, \field Surface 27 Name + A28, \field Surface 27 Name \type object-list \object-list AllHeatTranSurfNames N27, \field Angle Factor 27 \type real \minimum 0.0 \maximum 1.0 - A30, \field Surface 28 Name + A29, \field Surface 28 Name \type object-list \object-list AllHeatTranSurfNames N28, \field Angle Factor 28 \type real \minimum 0.0 \maximum 1.0 - A31, \field Surface 29 Name + A30, \field Surface 29 Name \type object-list \object-list AllHeatTranSurfNames N29, \field Angle Factor 29 \type real \minimum 0.0 \maximum 1.0 - A32, \field Surface 30 Name + A31, \field Surface 30 Name \type object-list \object-list AllHeatTranSurfNames N30, \field Angle Factor 30 \type real \minimum 0.0 \maximum 1.0 - A33, \field Surface 31 Name + A32, \field Surface 31 Name \type object-list \object-list AllHeatTranSurfNames N31, \field Angle Factor 31 \type real \minimum 0.0 \maximum 1.0 - A34, \field Surface 32 Name + A33, \field Surface 32 Name \type object-list \object-list AllHeatTranSurfNames N32, \field Angle Factor 32 \type real \minimum 0.0 \maximum 1.0 - A35, \field Surface 33 Name + A34, \field Surface 33 Name \type object-list \object-list AllHeatTranSurfNames N33, \field Angle Factor 33 \type real \minimum 0.0 \maximum 1.0 - A36, \field Surface 34 Name + A35, \field Surface 34 Name \type object-list \object-list AllHeatTranSurfNames N34, \field Angle Factor 34 \type real \minimum 0.0 \maximum 1.0 - A37, \field Surface 35 Name + A36, \field Surface 35 Name \type object-list \object-list AllHeatTranSurfNames N35, \field Angle Factor 35 \type real \minimum 0.0 \maximum 1.0 - A38, \field Surface 36 Name + A37, \field Surface 36 Name \type object-list \object-list AllHeatTranSurfNames N36, \field Angle Factor 36 \type real \minimum 0.0 \maximum 1.0 - A39, \field Surface 37 Name + A38, \field Surface 37 Name \type object-list \object-list AllHeatTranSurfNames N37, \field Angle Factor 37 \type real \minimum 0.0 \maximum 1.0 - A40, \field Surface 38 Name + A39, \field Surface 38 Name \type object-list \object-list AllHeatTranSurfNames N38, \field Angle Factor 38 \type real \minimum 0.0 \maximum 1.0 - A41, \field Surface 39 Name + A40, \field Surface 39 Name \type object-list \object-list AllHeatTranSurfNames N39, \field Angle Factor 39 \type real \minimum 0.0 \maximum 1.0 - A42, \field Surface 40 Name + A41, \field Surface 40 Name \type object-list \object-list AllHeatTranSurfNames N40, \field Angle Factor 40 \type real \minimum 0.0 \maximum 1.0 - A43, \field Surface 41 Name + A42, \field Surface 41 Name \type object-list \object-list AllHeatTranSurfNames N41, \field Angle Factor 41 \type real \minimum 0.0 \maximum 1.0 - A44, \field Surface 42 Name + A43, \field Surface 42 Name \type object-list \object-list AllHeatTranSurfNames N42, \field Angle Factor 42 \type real \minimum 0.0 \maximum 1.0 - A45, \field Surface 43 Name + A44, \field Surface 43 Name \type object-list \object-list AllHeatTranSurfNames N43, \field Angle Factor 43 \type real \minimum 0.0 \maximum 1.0 - A46, \field Surface 44 Name + A45, \field Surface 44 Name \type object-list \object-list AllHeatTranSurfNames N44, \field Angle Factor 44 \type real \minimum 0.0 \maximum 1.0 - A47, \field Surface 45 Name + A46, \field Surface 45 Name \type object-list \object-list AllHeatTranSurfNames N45, \field Angle Factor 45 \type real \minimum 0.0 \maximum 1.0 - A48, \field Surface 46 Name + A47, \field Surface 46 Name \type object-list \object-list AllHeatTranSurfNames N46, \field Angle Factor 46 \type real \minimum 0.0 \maximum 1.0 - A49, \field Surface 47 Name + A48, \field Surface 47 Name \type object-list \object-list AllHeatTranSurfNames N47, \field Angle Factor 47 \type real \minimum 0.0 \maximum 1.0 - A50, \field Surface 48 Name + A49, \field Surface 48 Name \type object-list \object-list AllHeatTranSurfNames N48, \field Angle Factor 48 \type real \minimum 0.0 \maximum 1.0 - A51, \field Surface 49 Name + A50, \field Surface 49 Name \type object-list \object-list AllHeatTranSurfNames N49, \field Angle Factor 49 \type real \minimum 0.0 \maximum 1.0 - A52, \field Surface 50 Name + A51, \field Surface 50 Name \type object-list \object-list AllHeatTranSurfNames N50, \field Angle Factor 50 \type real \minimum 0.0 \maximum 1.0 - A53, \field Surface 51 Name + A52, \field Surface 51 Name \type object-list \object-list AllHeatTranSurfNames N51, \field Angle Factor 51 \type real \minimum 0.0 \maximum 1.0 - A54, \field Surface 52 Name + A53, \field Surface 52 Name \type object-list \object-list AllHeatTranSurfNames N52, \field Angle Factor 52 \type real \minimum 0.0 \maximum 1.0 - A55, \field Surface 53 Name + A54, \field Surface 53 Name \type object-list \object-list AllHeatTranSurfNames N53, \field Angle Factor 53 \type real \minimum 0.0 \maximum 1.0 - A56, \field Surface 54 Name + A55, \field Surface 54 Name \type object-list \object-list AllHeatTranSurfNames N54, \field Angle Factor 54 \type real \minimum 0.0 \maximum 1.0 - A57, \field Surface 55 Name + A56, \field Surface 55 Name \type object-list \object-list AllHeatTranSurfNames N55, \field Angle Factor 55 \type real \minimum 0.0 \maximum 1.0 - A58, \field Surface 56 Name + A57, \field Surface 56 Name \type object-list \object-list AllHeatTranSurfNames N56, \field Angle Factor 56 \type real \minimum 0.0 \maximum 1.0 - A59, \field Surface 57 Name + A58, \field Surface 57 Name \type object-list \object-list AllHeatTranSurfNames N57, \field Angle Factor 57 \type real \minimum 0.0 \maximum 1.0 - A60, \field Surface 58 Name + A59, \field Surface 58 Name \type object-list \object-list AllHeatTranSurfNames N58, \field Angle Factor 58 \type real \minimum 0.0 \maximum 1.0 - A61, \field Surface 59 Name + A60, \field Surface 59 Name \type object-list \object-list AllHeatTranSurfNames N59, \field Angle Factor 59 \type real \minimum 0.0 \maximum 1.0 - A62, \field Surface 60 Name + A61, \field Surface 60 Name \type object-list \object-list AllHeatTranSurfNames N60, \field Angle Factor 60 \type real \minimum 0.0 \maximum 1.0 - A63, \field Surface 61 Name + A62, \field Surface 61 Name \type object-list \object-list AllHeatTranSurfNames N61, \field Angle Factor 61 \type real \minimum 0.0 \maximum 1.0 - A64, \field Surface 62 Name + A63, \field Surface 62 Name \type object-list \object-list AllHeatTranSurfNames N62, \field Angle Factor 62 \type real \minimum 0.0 \maximum 1.0 - A65, \field Surface 63 Name + A64, \field Surface 63 Name \type object-list \object-list AllHeatTranSurfNames N63, \field Angle Factor 63 \type real \minimum 0.0 \maximum 1.0 - A66, \field Surface 64 Name + A65, \field Surface 64 Name \type object-list \object-list AllHeatTranSurfNames N64, \field Angle Factor 64 \type real \minimum 0.0 \maximum 1.0 - A67, \field Surface 65 Name + A66, \field Surface 65 Name \type object-list \object-list AllHeatTranSurfNames N65, \field Angle Factor 65 \type real \minimum 0.0 \maximum 1.0 - A68, \field Surface 66 Name + A67, \field Surface 66 Name \type object-list \object-list AllHeatTranSurfNames N66, \field Angle Factor 66 \type real \minimum 0.0 \maximum 1.0 - A69, \field Surface 67 Name + A68, \field Surface 67 Name \type object-list \object-list AllHeatTranSurfNames N67, \field Angle Factor 67 \type real \minimum 0.0 \maximum 1.0 - A70, \field Surface 68 Name + A69, \field Surface 68 Name \type object-list \object-list AllHeatTranSurfNames N68, \field Angle Factor 68 \type real \minimum 0.0 \maximum 1.0 - A71, \field Surface 69 Name + A70, \field Surface 69 Name \type object-list \object-list AllHeatTranSurfNames N69, \field Angle Factor 69 \type real \minimum 0.0 \maximum 1.0 - A72, \field Surface 70 Name + A71, \field Surface 70 Name \type object-list \object-list AllHeatTranSurfNames N70, \field Angle Factor 70 \type real \minimum 0.0 \maximum 1.0 - A73, \field Surface 71 Name + A72, \field Surface 71 Name \type object-list \object-list AllHeatTranSurfNames N71, \field Angle Factor 71 \type real \minimum 0.0 \maximum 1.0 - A74, \field Surface 72 Name + A73, \field Surface 72 Name \type object-list \object-list AllHeatTranSurfNames N72, \field Angle Factor 72 \type real \minimum 0.0 \maximum 1.0 - A75, \field Surface 73 Name + A74, \field Surface 73 Name \type object-list \object-list AllHeatTranSurfNames N73, \field Angle Factor 73 \type real \minimum 0.0 \maximum 1.0 - A76, \field Surface 74 Name + A75, \field Surface 74 Name \type object-list \object-list AllHeatTranSurfNames N74, \field Angle Factor 74 \type real \minimum 0.0 \maximum 1.0 - A77, \field Surface 75 Name + A76, \field Surface 75 Name \type object-list \object-list AllHeatTranSurfNames N75, \field Angle Factor 75 \type real \minimum 0.0 \maximum 1.0 - A78, \field Surface 76 Name + A77, \field Surface 76 Name \type object-list \object-list AllHeatTranSurfNames N76, \field Angle Factor 76 \type real \minimum 0.0 \maximum 1.0 - A79, \field Surface 77 Name + A78, \field Surface 77 Name \type object-list \object-list AllHeatTranSurfNames N77, \field Angle Factor 77 \type real \minimum 0.0 \maximum 1.0 - A80, \field Surface 78 Name + A79, \field Surface 78 Name \type object-list \object-list AllHeatTranSurfNames N78, \field Angle Factor 78 \type real \minimum 0.0 \maximum 1.0 - A81, \field Surface 79 Name + A80, \field Surface 79 Name \type object-list \object-list AllHeatTranSurfNames N79, \field Angle Factor 79 \type real \minimum 0.0 \maximum 1.0 - A82, \field Surface 80 Name + A81, \field Surface 80 Name \type object-list \object-list AllHeatTranSurfNames N80, \field Angle Factor 80 \type real \minimum 0.0 \maximum 1.0 - A83, \field Surface 81 Name + A82, \field Surface 81 Name \type object-list \object-list AllHeatTranSurfNames N81, \field Angle Factor 81 \type real \minimum 0.0 \maximum 1.0 - A84, \field Surface 82 Name + A83, \field Surface 82 Name \type object-list \object-list AllHeatTranSurfNames N82, \field Angle Factor 82 \type real \minimum 0.0 \maximum 1.0 - A85, \field Surface 83 Name + A84, \field Surface 83 Name \type object-list \object-list AllHeatTranSurfNames N83, \field Angle Factor 83 \type real \minimum 0.0 \maximum 1.0 - A86, \field Surface 84 Name + A85, \field Surface 84 Name \type object-list \object-list AllHeatTranSurfNames N84, \field Angle Factor 84 \type real \minimum 0.0 \maximum 1.0 - A87, \field Surface 85 Name + A86, \field Surface 85 Name \type object-list \object-list AllHeatTranSurfNames N85, \field Angle Factor 85 \type real \minimum 0.0 \maximum 1.0 - A88, \field Surface 86 Name + A87, \field Surface 86 Name \type object-list \object-list AllHeatTranSurfNames N86, \field Angle Factor 86 \type real \minimum 0.0 \maximum 1.0 - A89, \field Surface 87 Name + A88, \field Surface 87 Name \type object-list \object-list AllHeatTranSurfNames N87, \field Angle Factor 87 \type real \minimum 0.0 \maximum 1.0 - A90, \field Surface 88 Name + A89, \field Surface 88 Name \type object-list \object-list AllHeatTranSurfNames N88, \field Angle Factor 88 \type real \minimum 0.0 \maximum 1.0 - A91, \field Surface 89 Name + A90, \field Surface 89 Name \type object-list \object-list AllHeatTranSurfNames N89, \field Angle Factor 89 \type real \minimum 0.0 \maximum 1.0 - A92, \field Surface 90 Name + A91, \field Surface 90 Name \type object-list \object-list AllHeatTranSurfNames N90, \field Angle Factor 90 \type real \minimum 0.0 \maximum 1.0 - A93, \field Surface 91 Name + A92, \field Surface 91 Name \type object-list \object-list AllHeatTranSurfNames N91, \field Angle Factor 91 \type real \minimum 0.0 \maximum 1.0 - A94, \field Surface 92 Name + A93, \field Surface 92 Name \type object-list \object-list AllHeatTranSurfNames N92, \field Angle Factor 92 \type real \minimum 0.0 \maximum 1.0 - A95, \field Surface 93 Name + A94, \field Surface 93 Name \type object-list \object-list AllHeatTranSurfNames N93, \field Angle Factor 93 \type real \minimum 0.0 \maximum 1.0 - A96, \field Surface 94 Name + A95, \field Surface 94 Name \type object-list \object-list AllHeatTranSurfNames N94, \field Angle Factor 94 \type real \minimum 0.0 \maximum 1.0 - A97, \field Surface 95 Name + A96, \field Surface 95 Name \type object-list \object-list AllHeatTranSurfNames N95, \field Angle Factor 95 \type real \minimum 0.0 \maximum 1.0 - A98, \field Surface 96 Name + A97, \field Surface 96 Name \type object-list \object-list AllHeatTranSurfNames N96, \field Angle Factor 96 \type real \minimum 0.0 \maximum 1.0 - A99, \field Surface 97 Name + A98, \field Surface 97 Name \type object-list \object-list AllHeatTranSurfNames N97, \field Angle Factor 97 \type real \minimum 0.0 \maximum 1.0 - A100, \field Surface 98 Name + A99, \field Surface 98 Name \type object-list \object-list AllHeatTranSurfNames N98, \field Angle Factor 98 \type real \minimum 0.0 \maximum 1.0 - A101, \field Surface 99 Name + A100, \field Surface 99 Name \type object-list \object-list AllHeatTranSurfNames N99, \field Angle Factor 99 \type real \minimum 0.0 \maximum 1.0 - A102, \field Surface 100 Name + A101, \field Surface 100 Name \type object-list \object-list AllHeatTranSurfNames N100; \field Angle Factor 100 @@ -22219,7 +22215,7 @@ Lights, \note The entered calculation method is used to create the maximum amount of lights \note for this set of attributes \note Choices: LightingLevel => Lighting Level -- simply enter watts of lights - \note Watts/Area => Watts per Zone Floor Area -- enter the number to apply. Value * Floor Area = Lights + \note Watts/Area => Watts per Floor Area -- enter the number to apply. Value * Floor Area = Lights \note Watts/Person => Watts per Person -- enter the number to apply. Value * Occupants = Lights \type choice \key LightingLevel @@ -22231,7 +22227,7 @@ Lights, \type real \minimum 0 \ip-units W - N2 , \field Watts per Zone Floor Area + N2 , \field Watts per Floor Area \type real \minimum 0 \units W/m2 @@ -22322,7 +22318,7 @@ ElectricEquipment, \note The entered calculation method is used to create the maximum amount of electric equipment \note for this set of attributes \note Choices: EquipmentLevel => Equipment Level -- simply enter watts of equipment - \note Watts/Area => Watts per Zone Floor Area -- enter the number to apply. Value * Floor Area = Equipment Level + \note Watts/Area => Watts per Floor Area -- enter the number to apply. Value * Floor Area = Equipment Level \note Watts/Person => Watts per Person -- enter the number to apply. Value * Occupants = Equipment Level \type choice \key EquipmentLevel @@ -22334,7 +22330,7 @@ ElectricEquipment, \type real \minimum 0 \ip-units W - N2 , \field Watts per Zone Floor Area + N2 , \field Watts per Floor Area \type real \minimum 0 \units W/m2 @@ -22388,7 +22384,7 @@ GasEquipment, \note The entered calculation method is used to create the maximum amount of gas equipment \note for this set of attributes \note Choices: EquipmentLevel => Design Level -- simply enter power input of equipment - \note Watts/Area or Power/Area => Power per Zone Floor Area -- enter the number to apply. Value * Floor Area = Equipment Level + \note Watts/Area or Power/Area => Power per Floor Area -- enter the number to apply. Value * Floor Area = Equipment Level \note Watts/Person or Power/Person => Power per Person -- enter the number to apply. Value * Occupants = Equipment Level \type choice \key EquipmentLevel @@ -22402,7 +22398,7 @@ GasEquipment, \type real \minimum 0 \ip-units Btu/h - N2 , \field Power per Zone Floor Area + N2 , \field Power per Floor Area \type real \minimum 0 \units W/m2 @@ -22468,7 +22464,7 @@ HotWaterEquipment, \note The entered calculation method is used to create the maximum amount of hot water equipment \note for this set of attributes \note Choices: EquipmentLevel => Design Level -- simply enter power input of equipment - \note Watts/Area or Power/Area => Power per Zone Floor Area -- enter the number to apply. Value * Floor Area = Equipment Level + \note Watts/Area or Power/Area => Power per Floor Area -- enter the number to apply. Value * Floor Area = Equipment Level \note Watts/Person or Power/Person => Power per Person -- enter the number to apply. Value * Occupants = Equipment Level \type choice \key EquipmentLevel @@ -22482,7 +22478,7 @@ HotWaterEquipment, \type real \minimum 0 \ip-units Btu/h - N2 , \field Power per Zone Floor Area + N2 , \field Power per Floor Area \type real \minimum 0 \units W/m2 @@ -22536,7 +22532,7 @@ SteamEquipment, \note The entered calculation method is used to create the maximum amount of steam equipment \note for this set of attributes \note Choices: EquipmentLevel => Design Level -- simply enter power input of equipment - \note Watts/Area or Power/Area => Power per Zone Floor Area -- enter the number to apply. Value * Floor Area = Equipment Level + \note Watts/Area or Power/Area => Power per Floor Area -- enter the number to apply. Value * Floor Area = Equipment Level \note Watts/Person or Power/Person => Power per Person -- enter the number to apply. Value * Occupants = Equipment Level \type choice \key EquipmentLevel @@ -22550,7 +22546,7 @@ SteamEquipment, \type real \minimum 0 \ip-units Btu/h - N2 , \field Power per Zone Floor Area + N2 , \field Power per Floor Area \type real \minimum 0 \units W/m2 @@ -22622,7 +22618,7 @@ OtherEquipment, \note to set a loss, use a negative value in the following fields. \note for this set of attributes \note Choices: EquipmentLevel => Design Level -- simply enter power input of equipment - \note Watts/Area or Power/Area => Power per Zone Floor Area -- enter the number to apply. Value * Floor Area = Equipment Level + \note Watts/Area or Power/Area => Power per Floor Area -- enter the number to apply. Value * Floor Area = Equipment Level \note Watts/Person or Power/Person => Power per Person -- enter the number to apply. Value * Occupants = Equipment Level \type choice \key EquipmentLevel @@ -22635,7 +22631,7 @@ OtherEquipment, \units W \type real \ip-units Btu/h - N2 , \field Power per Zone Floor Area + N2 , \field Power per Floor Area \type real \units W/m2 \ip-units Btu/h-ft2 @@ -22706,7 +22702,7 @@ ElectricEquipment:ITE:AirCooled, A4 , \field Design Power Input Calculation Method \note The entered calculation method is used to specify the design power input \note Watts/Unit => Watts per Unit -- Design Power = Watts per Unit * Number of Units - \note Watts/Area => Watts per Zone Floor Area -- Design Power = Watts per Zone Floor Area * Floor Area + \note Watts/Area => Watts per Floor Area -- Design Power = Watts per Floor Area * Floor Area \type choice \key Watts/Unit \key Watts/Area @@ -22720,7 +22716,7 @@ ElectricEquipment:ITE:AirCooled, \type real \minimum 0 \default 1 - N3 , \field Watts per Zone Floor Area + N3 , \field Watts per Floor Area \type real \minimum 0 \units W/m2 @@ -26676,7 +26672,7 @@ AirflowNetwork:Distribution:Linkage, AirflowNetwork:Distribution:DuctViewFactors, \extensible:2 - repeat last two fields, remembering to remove ; from "inner" fields. \memo This object is used to allow user-defined view factors to be used for duct-surface radiation - \memo calculations. + \memo calculations. All surfaces must be in the same enclosure. A1, \field Linkage Name \required-field \type object-list From 334f26463c576fecfe946cad9ffafb33dfd5a412 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Tue, 26 Sep 2023 14:48:28 -0500 Subject: [PATCH 02/26] MRT I/O ref updates plus some space-related cleanup --- ...oup-internal-gains-people-lights-other.tex | 97 +++++++++---------- 1 file changed, 47 insertions(+), 50 deletions(-) diff --git a/doc/input-output-reference/src/overview/group-internal-gains-people-lights-other.tex b/doc/input-output-reference/src/overview/group-internal-gains-people-lights-other.tex index d721779c79a..e5a4528aff9 100644 --- a/doc/input-output-reference/src/overview/group-internal-gains-people-lights-other.tex +++ b/doc/input-output-reference/src/overview/group-internal-gains-people-lights-other.tex @@ -94,7 +94,7 @@ \subsubsection{Inputs}\label{inputs-025} \item[People] With this choice, the method used will be a straight insertion of the number of occupants (people).~ (The Number of People field should be filled.) -\item[People/Area] With this choice, the method used will be a factor per floor area of the zone. (The People per Zone Floor Area field should be filled). +\item[People/Area] With this choice, the method used will be a factor per floor area of the zone or space. (The People per Zone Floor Area field should be filled). \item[Area/Person] With this choice, the method used will be a factor of floor area per person. (The Zone Floor Area per Person field should be filled). @@ -104,13 +104,13 @@ \subsubsection{Inputs}\label{inputs-025} This field is used to represent the maximum number of people in a zone that is then multiplied by a schedule fraction (see schedule field). In EnergyPlus, this is slightly more flexible in that the number of people could be a ``diversity factor'' applied to a schedule of real numbers. Note that while the schedule value can vary from hour to hour, the number of people field is constant for all simulation environments. -\paragraph{Field: People per Zone Floor Area}\label{field-people-per-zone-floor-area} +\paragraph{Field: People per Floor Area}\label{field-people-per-zone-floor-area} -This factor (person/m\(^{2}\)) is used, along with the Zone Floor Area to determine the maximum number of people as described in the Number of People field. The choice from the method field should be ``people/area''. +This factor (person/m\(^{2}\)) is used, along with the Zone or Space Floor Area to determine the maximum number of people as described in the Number of People field. The choice from the method field should be ``people/area''. -\paragraph{Field: Zone Floor Area per Person}\label{field-zone-floor-area-per-person} +\paragraph{Field: Floor Area per Person}\label{field-zone-floor-area-per-person} -This factor (m\(^{2}\)/person) is used, along with the Zone Floor Area to determine the maximum number of people as described in the Number of People field. The choice from the method field should be ``area/person''. +This factor (m\(^{2}\)/person) is used, along with the Zone or Space Floor Area to determine the maximum number of people as described in the Number of People field. The choice from the method field should be ``area/person''. \paragraph{Field: Fraction Radiant}\label{field-fraction-radiant} @@ -204,13 +204,13 @@ \subsubsection{Inputs}\label{inputs-025} \paragraph{Field: Mean Radiant Temperature Calculation Type}\label{field-mean-radiant-temperature-calculation-type} -This field specifies the type of Mean Radiant Temperature (MRT) calculation the user wishes to use for the thermal comfort model. At the present time, there are three options for MRT calculation type: zone averaged, surface weighted, and a list of angle factors. The default calculation is ``ZoneAveraged'' and is used if field is left blank. In the zone averaged MRT calculation, the MRT used for the thermal comfort calculations is for an ``average'' point in the zone. MRT is calculated based on an area-emissivity weighted average of all of the surfaces in the zone. In cases where the emissivity of all of the surfaces are sufficiently small (near zero), the mean radiant temperature will be set to the mean air temperature of the space to avoid divide by zero errors. The other MRT calculation type is ``SurfaceWeighted''. The goal of this calculation type is to estimate a person in the space close to a particular surface without having to define exact view factors for all of the surfaces and the location of the person in the space. The MRT used in the thermal comfort calculations when the ``surface weighted'' calculation type is selected is actually the average of the temperature of the surface to which the person is closest (defined by the next field ``Surface Name'') and the zone averaged MRT (defined above). The surface temperature alone is not used because in theory the maximum view factor from a person to any flat surface is roughly 0.5. In the ``surfaceweighted'' calculation, the surface in question actually gets slightly more weighting than 50\% since the surface selected is still a part of the zone average MRT calculation. Again, this simplification was made to avoid the specification of view factors and the exact location of the person. +This field specifies the type of Mean Radiant Temperature (MRT) calculation the user wishes to use for the thermal comfort model. At the present time, there are three options for MRT calculation type: enclosure averaged, surface weighted, and a list of angle factors. The default calculation is ``EnclosureAveraged'' and is used if field is left blank. In the enclosure averaged MRT calculation, the MRT used for the thermal comfort calculations is for an ``average'' point in the zone. MRT is calculated based on an area-emissivity weighted average of all of the surfaces in the same radiant enclosure (one or more \hyperref[space]{Spaces}). In cases where the emissivity of all of the surfaces are sufficiently small (near zero), the mean radiant temperature will be set to the mean air temperature of the space to avoid divide by zero errors. The other MRT calculation type is ``SurfaceWeighted''. The goal of this calculation type is to estimate a person in the space close to a particular surface without having to define exact view factors for all of the surfaces and the location of the person in the space. The MRT used in the thermal comfort calculations when the ``surface weighted'' calculation type is selected is actually the average of the temperature of the surface to which the person is closest (defined by the next field ``Surface Name'') and the enclosure averaged MRT (defined above). The surface temperature alone is not used because in theory the maximum view factor from a person to any flat surface is roughly 0.5. In the ``surfaceweighted'' calculation, the surface in question actually gets slightly more weighting than 50\% since the surface selected is still a part of the zone average MRT calculation. Again, this simplification was made to avoid the specification of view factors and the exact location of the person. -A third option is to use ``AngleFactor''. This option allows for more explicit positioning of the person within the space by defining the angle factors from the person to the various surfaces in the zone. This option requires the user to list the surfaces that the person can see from a radiation standpoint and also define the angle (or view) factor for each surface. The \hyperref[comfortviewfactorangles]{ComfortViewFactorAngles} object (see next object description) is intended to give the user this opportunity. +A third option is to use ``AngleFactor''. This option allows for more explicit positioning of the person within the space by defining the angle factors from the person to the various surfaces in the enclosure. This option requires the user to list the surfaces that the person can see from a radiation standpoint and also define the angle (or view) factor for each surface. The \hyperref[comfortviewfactorangles]{ComfortViewFactorAngles} object (see next object description) is intended to give the user this opportunity. \paragraph{Field: Surface Name/Angle Factor List Name}\label{field-surface-nameangle-factor-list-name} -This field is only valid when the user selects ``SurfaceWeighted'' or ``AngleFactor'' for the MRT calculation type (see the previous input field description). In the case of ``SurfaceWeighted'', the field is the name of a surface within the zone the people are residing. This surface will be used in the MRT calculation as defined above to come up with a more representative MRT for a person near a particular surface. The MRT used for thermal comfort calculations using the ``SurfaceWeighted'' MRT calculation method is the average of the temperature of the surface specified in this field and the ``zone averaged'' MRT (see the Mean Radiant Temperature calculation type field above). In the case of ``AngleFactor'', the field is the name of a \hyperref[comfortviewfactorangles]{ComfortViewFactorAngles} input object defined elsewhere. This field is required when the previous field is set to ``SurfaceWeighted'' or ``AngleFactor'' and is set to run one of the following thermal comfort models: Fanger, Pierce, KSU, CoolingEffectASH55 or AnkleDraftASH55. +This field is only valid when the user selects ``SurfaceWeighted'' or ``AngleFactor'' for the MRT calculation type (see the previous input field description). In the case of ``SurfaceWeighted'', the field is the name of a surface within the enclosure the people are residing. This surface will be used in the MRT calculation as defined above to come up with a more representative MRT for a person near a particular surface. The MRT used for thermal comfort calculations using the ``SurfaceWeighted'' MRT calculation method is the average of the temperature of the surface specified in this field and the ``zone averaged'' MRT (see the Mean Radiant Temperature calculation type field above). In the case of ``AngleFactor'', the field is the name of a \hyperref[comfortviewfactorangles]{ComfortViewFactorAngles} input object defined elsewhere. This field is required when the previous field is set to ``SurfaceWeighted'' or ``AngleFactor'' and is set to run one of the following thermal comfort models: Fanger, Pierce, KSU, CoolingEffectASH55 or AnkleDraftASH55. \paragraph{Field: Work Efficiency Schedule Name}\label{field-work-efficiency-schedule-name} @@ -314,7 +314,7 @@ \subsubsection{Inputs}\label{inputs-025} ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -367,8 +367,8 @@ \subsubsection{Inputs}\label{inputs-025} OCCUPY-1, !- Number of People Schedule Name People/Area, !- Number of People Calculation Method , !- Number of People - .11, !- People per Zone Floor Area {person/m2} - , !- Zone Floor Area per Person {m2/person} + .11, !- People per Floor Area {person/m2} + , !- Floor Area per Person {m2/person} 0.3, !- Fraction Radiant , !- Sensible Heat Fraction ActSchd, !- Activity Level Schedule Name @@ -813,9 +813,9 @@ \subsection{Simplified ASHRAE 55 Warnings}\label{simplified-ashrae-55-warnings} \subsection{ComfortViewFactorAngles}\label{comfortviewfactorangles} -When requesting EnergyPlus to do a thermal comfort calculation, the program user has three options for defining how the mean radiant temperature will be calculated. The user may select ``zoneaveraged'' which results in a mean radiant temperature that is characteristic of an ``average'' location near the center of the zone. The user may also elect to place the person near a particular surface by selecting ``surfaceweighted'' in the \hyperref[people]{People} statement. This takes the average of the enclosure mean radiant temperature and the temperature of the surface that the person is near and uses this value as the mean radiant temperature when calculating thermal comfort. +When requesting EnergyPlus to do a thermal comfort calculation, the program user has three options for defining how the mean radiant temperature will be calculated. The user may select ``EnclosureAveraged'' which results in a mean radiant temperature that is characteristic of an ``average'' location near the center of the enclosure (one or more \hyperref[space]{Spaces}). The user may also elect to place the person near a particular surface by selecting ``SurfaceWeighted'' in the \hyperref[people]{People} statement. This takes the average of the enclosure mean radiant temperature and the temperature of the surface that the person is near and uses this value as the mean radiant temperature when calculating thermal comfort. -The third option is for the user to more explicitly position the person within the space by defining the angle factors from the person to the various surfaces in the same radiant enclosure. This option requires the user to list the surfaces that the person can see from a radiation standpoint and also define the angle (or view) factor for each surface. The AngleFactorList input line is intended to give the user this opportunity. +The third option is for the user to more explicitly position the person within the space by defining the angle factors from the person to the various surfaces in the same radiant enclosure. This option requires the user to list the surfaces that the person can see from a radiation standpoint and also define the angle (or view) factor for each surface. \subsubsection{Inputs}\label{inputs-1-023} @@ -823,13 +823,9 @@ \subsubsection{Inputs}\label{inputs-1-023} This field is an unique user assigned name for the list of surfaces that can be seen radiantly by the person for whom thermal comfort is to be evaluated. Any reference to this list by a \hyperref[people]{People} statement will use this name. -\paragraph{Field: Zone Name}\label{field-zone-name-007} - -Zone name is ignored. - \paragraph{Field: Surface \textless{}\#\textgreater{} Name}\label{field-surface-name-002} -This field is the name of a surface in the radiant enclosure seen by the person. All surfaces listed should be in the same radiant enclosure. This should also be the same radiant enclosure as the People instance which references this ComfortViewFactorAngles object. If not, a warning will be issued, but the simulation will proceed with the specified surfaces. +This field is the name of a surface in the radiant enclosure seen by the person. All surfaces listed should be in the same radiant enclosure (one or more \hyperref[space]{Spaces}). This should also be the same radiant enclosure as the People instance which references this ComfortViewFactorAngles object. If not, a warning will be issued, but the simulation will proceed with the specified surfaces. \paragraph{Field: Angle Factor \textless{}\#\textgreater{}}\label{field-angle-factor} @@ -842,7 +838,6 @@ \subsubsection{Inputs}\label{inputs-1-023} \begin{lstlisting} ComfortViewFactorAngles, South Zone Angle Factors, !- name of angle factor list - , !- Zone Name Zn001:Flr001, !- Surface name 1 0.75, !- Angle factor for surface 1 Zn001:Wall001, !- Surface name 2 @@ -879,7 +874,7 @@ \subsubsection{Inputs}\label{inputs-2-021} \item[LightingLevel] With this choice, the method used will be a straight insertion of the lighting level (Watts) for the Zone.~ (The Lighting Level field should be filled.) -\item[Watts/Area] With this choice, the method used will be a factor per floor area of the zone. (The Watts per Zone Floor Area field should be filled). +\item[Watts/Area] With this choice, the method used will be a factor per floor area of the zone or space. (The Watts per Floor Area field should be filled). \item[Watts/Person] With this choice, the method used will be a factor of lighting level (watts) per person. (The Watts per person field should be filled). @@ -889,9 +884,9 @@ \subsubsection{Inputs}\label{inputs-2-021} This is typically the maximum electrical power input (in Watts) to lighting in a zone, including ballasts, if present. This value is multiplied by a schedule fraction (see previous field) to get the lighting power in a particular timestep. In EnergyPlus, this is slightly more flexible in that the lighting design level could be a ``diversity factor'' applied to a schedule of real numbers. -\paragraph{Field: Watts per Zone Floor Area}\label{field-watts-per-zone-floor-area} +\paragraph{Field: Watts per Floor Area}\label{field-watts-per-zone-floor-area} -This factor (watts/m\(^{2}\)) is used, along with the Zone Floor Area to determine the maximum lighting level as described in the Lighting Level field. The choice from the method field should be ``watts/area''. +This factor (watts/m\(^{2}\)) is used, along with the Zone or Space Floor Area to determine the maximum lighting level as described in the Lighting Level field. The choice from the method field should be ``watts/area''. \paragraph{Field: Watts per Person}\label{field-watts-per-person} @@ -1029,6 +1024,8 @@ \subsubsection{Inputs}\label{inputs-2-021} Office Lighting, !- SCHEDULE Name LightingLevel, !- Design Level calculation method 1039.706, !- Lighting Level {W} + , !- Watts per Floor Area {W/m2} + , !- Watts per Person {W/person} 0.0000000E+00, !- Return Air Fraction 0.4000000, !- Fraction Radiant 0.2000000, !- Fraction Visible @@ -1249,7 +1246,7 @@ \subsubsection{Inputs}\label{inputs-3-019} \paragraph{Field: Design Level Calculation Method}\label{field-design-level-calculation-method-1} -This field is a key/choice field that tells which of the next three fields are filled and is descriptive of the method for calculating the nominal electric equipment level in the Zone. The key/choices are: +This field is a key/choice field that tells which of the next three fields are filled and is descriptive of the method for calculating the nominal electric equipment level in the Zone or Space. The key/choices are: \begin{itemize} \tightlist @@ -1265,7 +1262,7 @@ \subsubsection{Inputs}\label{inputs-3-019} Watts/Area \end{itemize} -With this choice, the method used will be a factor per floor area of the zone. (The Watts per Zone Floor Area field should be filled). +With this choice, the method used will be a factor per floor area of the zone or space. (The Watts per Floor Area field should be filled). \begin{itemize} \tightlist @@ -1279,9 +1276,9 @@ \subsubsection{Inputs}\label{inputs-3-019} This field (in Watts) is typically used to represent the maximum electrical input to equipment in a zone that is then multiplied by a schedule fraction (see previous field). In EnergyPlus, this is slightly more flexible in that the electric equipment design level could be a ``diversity factor'' applied to a schedule of real numbers. Note that while the schedule value can vary from hour to hour, the design level field is constant for all simulation environments. -\paragraph{Field: Watts per Zone Floor Area}\label{field-watts-per-zone-floor-area-1} +\paragraph{Field: Watts per Floor Area}\label{field-watts-per-zone-floor-area-1} -This factor (watts/m\(^{2}\)) is used, along with the Zone Area to determine the maximum equipment level as described in the Design Level field. The choice from the method field should be ``Watts/Area''. +This factor (watts/m\(^{2}\)) is used, along with the Zone or Space Floor Area to determine the maximum equipment level as described in the Design Level field. The choice from the method field should be ``Watts/Area''. \paragraph{Field: Watts per Person}\label{field-watts-per-person-1} @@ -1385,7 +1382,7 @@ \subsubsection{Inputs}\label{inputs-4-017} Watts/Area or Power/Area \end{itemize} -With this choice, the method used will be a factor per floor area of the zone. (The Power per Zone Floor Area field should be filled). +With this choice, the method used will be a factor per floor area of the zone or space. (The Power per Floor Area field should be filled). \begin{itemize} \tightlist @@ -1399,9 +1396,9 @@ \subsubsection{Inputs}\label{inputs-4-017} This field (in Watts) is typically used to represent the maximum energy input to gas equipment in a zone that is then multiplied by a schedule fraction (see previous field). In EnergyPlus, this is slightly more flexible in that the gas equipment design level could be a ``diversity factor'' applied to a schedule of real numbers. Note that while the schedule value can vary from hour to hour, the design level field is constant for all simulation environments. -\paragraph{Field: Power per Zone Floor Area}\label{field-power-per-zone-floor-area} +\paragraph{Field: Power per Floor Area}\label{field-power-per-zone-floor-area} -This factor (watts/m\(^{2}\)) is used, along with the Zone Area to determine the maximum equipment level as described in the Design Level field. The choice from the method field should be ``\textbf{Watts/Area}'' or ``\textbf{Power/Area}''. +This factor (watts/m\(^{2}\)) is used, along with the Zone or Space Area to determine the maximum equipment level as described in the Design Level field. The choice from the method field should be ``\textbf{Watts/Area}'' or ``\textbf{Power/Area}''. \paragraph{Field: Power per Person}\label{field-power-per-person} @@ -1446,7 +1443,7 @@ \subsubsection{Inputs}\label{inputs-4-017} Gas Eq Sch, !-Schedule Name EquipmentLevel, !- Design Level Calculation Method 29287.51, !- Design Level {W} - , !- Power per Zone Floor Area {W/m2} + , !- Power per Floor Area {W/m2} , !- Power per Person {W/Person} 0, !- Fraction Latent 0.3, !- Fraction Radiant @@ -1466,7 +1463,7 @@ \subsubsection{Inputs}\label{inputs-4-017} Gas Eq Sch, !- Schedule Name Watts/Area, !- Design Level Calculation Method , !- Design Level {W} - 197, !- Power per Zone Floor Area {W/m2} + 197, !- Power per Floor Area {W/m2} , !- Power per Person {W/Person} 0.0000000E+00, !- Fraction Latent 0.3000000, !- Fraction Radiant @@ -1509,7 +1506,7 @@ \subsubsection{Inputs}\label{inputs-5-015} Watts/Area or Power/Area \end{itemize} -With this choice, the method used will be a factor per floor area of the zone. (The Power per Zone Floor Area field should be filled). +With this choice, the method used will be a factor per floor area of the zone or space. (The Power per Floor Area field should be filled). \begin{itemize} \tightlist @@ -1523,9 +1520,9 @@ \subsubsection{Inputs}\label{inputs-5-015} This field (in Watts) is typically used to represent the maximum energy input to hot water equipment in a zone that is then multiplied by a schedule fraction (see previous field). In EnergyPlus, this is slightly more flexible in that the hot water equipment design level could be a ``diversity factor'' applied to a schedule of real numbers. Note that while the schedule value can vary from hour to hour, the design level field is constant for all simulation environments. -\paragraph{Field: Power per Zone Floor Area}\label{field-power-per-zone-floor-area-1} +\paragraph{Field: Power per Floor Area}\label{field-power-per-zone-floor-area-1} -This factor (watts/m\(^{2}\)) is used, along with the Zone Area to determine the maximum equipment level as described in the Design Level field. The choice from the method field should be ``\textbf{Watts/Area}'' or ``\textbf{Power/Area}''. +This factor (watts/m\(^{2}\)) is used, along with the Zone or Space Area to determine the maximum equipment level as described in the Design Level field. The choice from the method field should be ``\textbf{Watts/Area}'' or ``\textbf{Power/Area}''. \paragraph{Field: Power per Person}\label{field-power-per-person-1} @@ -1566,7 +1563,7 @@ \subsubsection{Inputs}\label{inputs-5-015} EQUIP-1, !- SCHEDULE Name EquipmentLevel, !- Design Level calculation method 300, !- Design Level {W} - , !- Power per Zone Floor Area {watts/m2} + , !- Power per Floor Area {watts/m2} , !- Power per Person {watts/person} 0.2, !- Fraction Latent 0.1, !- Fraction Radiant @@ -1585,7 +1582,7 @@ \subsubsection{Inputs}\label{inputs-5-015} HotWater Eq Sch, !- Schedule Name Watts/Area, !- Design Level Calculation Method , !- Design Level {W} - 50, !- Power per Zone Floor Area {W/m2} + 50, !- Power per Floor Area {W/m2} , !- Power per Person {W/Person} 0.0000000E+00, !- Fraction Latent 0.3000000, !- Fraction Radiant @@ -1628,7 +1625,7 @@ \subsubsection{Inputs}\label{inputs-6-012} Watts/Area or Power/Area \end{itemize} -With this choice, the method used will be a factor per floor area of the zone. (The Power per Zone Floor Area field should be filled). +With this choice, the method used will be a factor per floor area of the zone. (The Power per Floor Area field should be filled). \begin{itemize} \tightlist @@ -1642,9 +1639,9 @@ \subsubsection{Inputs}\label{inputs-6-012} This field (in Watts) is typically used to represent the maximum energy input to steam equipment in a zone that is then multiplied by a schedule fraction (see previous field). In EnergyPlus, this is slightly more flexible in that the steam equipment design level could be a ``diversity factor'' applied to a schedule of real numbers. Note that while the schedule value can vary from hour to hour, the design level field is constant for all simulation environments. -\paragraph{Field: Power per Zone Floor Area}\label{field-power-per-zone-floor-area-2} +\paragraph{Field: Power per Floor Area}\label{field-power-per-zone-floor-area-2} -This factor (watts/m\(^{2}\)) is used, along with the Zone Area to determine the maximum equipment level as described in the Design Level field. The choice from the method field should be ``\textbf{Watts/Area}'' or ``\textbf{Power/Area}''. +This factor (watts/m\(^{2}\)) is used, along with the Zone or Space Area to determine the maximum equipment level as described in the Design Level field. The choice from the method field should be ``\textbf{Watts/Area}'' or ``\textbf{Power/Area}''. \paragraph{Field: Power per Person}\label{field-power-per-person-2} @@ -1686,7 +1683,7 @@ \subsubsection{Inputs}\label{inputs-6-012} EQUIP-1, !- SCHEDULE Name EquipmentLevel, !- Design Level calculation method 1050, !- Design Level {W} - , !- Power per Zone Floor Area {watts/m2} + , !- Power per Floor Area {watts/m2} , !- Power per Person {watts/person} 0.5, !- Fraction Latent 0.3, !- Fraction Radiant @@ -1726,7 +1723,7 @@ \subsubsection{Inputs}\label{inputs-8-010} EquipmentLevel \end{itemize} -With this choice, the method used will be a straight insertion of the other equipment level (Watts) for the Zone.~ (The Design Level field should be filled.) +With this choice, the method used will be a straight insertion of the other equipment level (Watts) for the Zone. (The Design Level field should be filled.) \begin{itemize} \tightlist @@ -1734,7 +1731,7 @@ \subsubsection{Inputs}\label{inputs-8-010} Watts/Area or Power/Area \end{itemize} -With this choice, the method used will be a factor per floor area of the zone. (The Power per Zone Floor Area field should be filled). +With this choice, the method used will be a factor per floor area of the zone. (The Power per Floor Area field should be filled). \begin{itemize} \tightlist @@ -1748,9 +1745,9 @@ \subsubsection{Inputs}\label{inputs-8-010} This field (in Watts) is typically used to represent the maximum energy input to other equipment in a zone that is then multiplied by a schedule fraction (see previous field). In EnergyPlus, this is slightly more flexible in that the other equipment design level could be a ``diversity factor'' applied to a schedule of real numbers. This value can be negative to denote a loss if the None fuel type is selected, otherwise this must be positive. Note that while the schedule value can vary from hour to hour, the design level field is constant for all simulation environments. -\paragraph{Field: Power per Zone Floor Area}\label{field-power-per-zone-floor-area-3} +\paragraph{Field: Power per Floor Area}\label{field-power-per-zone-floor-area-3} -This factor (watts/m\(^{2}\)) is used, along with the Zone Area to determine the maximum equipment level as described in the Design Level field. This value can be negative to denote a loss if the None fuel type is selected, otherwise this must be positive. The choice from the method field should be ``\textbf{Watts/Area}'' or ``\textbf{Power/Area}''. +This factor (watts/m\(^{2}\)) is used, along with the Zone or Space Area to determine the maximum equipment level as described in the Design Level field. This value can be negative to denote a loss if the None fuel type is selected, otherwise this must be positive. The choice from the method field should be ``\textbf{Watts/Area}'' or ``\textbf{Power/Area}''. \paragraph{Field: Power per Person}\label{field-power-per-person-3} @@ -1797,7 +1794,7 @@ \subsubsection{Inputs}\label{inputs-8-010} ALWAYSON, !- SCHEDULE Name EquipmentLevel, !- Design Level calculation method 6766., !- Design Level {W} - , !- Power per Zone Floor Area {watts/m2} + , !- Power per Floor Area {watts/m2} , !- Power per Person {watts/person} 0, !- Fraction Latent 0.3, !- Fraction Radiant @@ -2383,7 +2380,7 @@ \subsubsection{Inputs}\label{inputs-9-009} \begin{description} \item[Watts/Unit:] With this choice, the design power input will be the product of Design Level per Unit and Number of Units. (Both of these fields should be filled.) This is the default. - \item[Watts/Area:] With this choice, the design power input will be a factor per floor area of the zone. (The Watts per Zone Floor Area field should be filled). + \item[Watts/Area:] With this choice, the design power input will be a factor per floor area of the zone. (The Watts per Floor Area field should be filled). \end{description} \paragraph{Field: Watts per Unit}\label{field-watts-per-unit} @@ -2394,7 +2391,7 @@ \subsubsection{Inputs}\label{inputs-9-009} This field is multiplied times the Design Level per Unit to determine the design electrical power input to this ITE object when fully loaded and the entering air temperature is at the specified design value. This field is used if the choice from the method field is ``EquipmentLevel''. The default is 1. -\paragraph{Field: Watts per Zone Floor Area}\label{field-watts-per-zone-floor-area-2} +\paragraph{Field: Watts per Floor Area}\label{field-watts-per-zone-floor-area-2} This factor (Watts/m2) is used, along with the Zone Area to determine the design electrical power input as described in the Design Level field above. This field is used if the choice from the method field is ``Watts/Area''. @@ -2542,11 +2539,11 @@ \subsubsection{Inputs}\label{inputs-9-009} ElectricEquipment:ITE:AirCooled, Data Center Servers, !- Name Main Zone, !- Zone or Space Name - FlowFromSystem, !- Air Flow Calculation Method + FlowFromSystem, !- Air Flow Calculation Method Watts/Unit, !- Design Power Input Calculation Method 500, !- Watts per Unit {W} 200, !- Number of Units - , !- Watts per Zone Floor Area {W/m2} + , !- Watts per Floor Area {W/m2} Data Center Operation Schedule, !- Design Power Input Schedule Name Data Center CPU Loading Schedule, !- CPU Loading Schedule Name Model 5250 Power fLoadTemp, !- CPU Power Input Function of Loading and Air Temperature Curve Name @@ -2580,7 +2577,7 @@ \subsubsection{Inputs}\label{inputs-9-009} Watts/Area, !- Design Power Input Calculation Method , !- Watts per Unit {W} , !- Number of Units - 430.556416668389, !- Watts per Zone Floor Area {W/m2} + 430.556416668389, !- Watts per Floor Area {W/m2} Data Center Operation Schedule, !- Design Power Input Schedule Name DataCenter Equipment_SCH, !- CPU Loading Schedule Name Data Center Servers Power fLoadTemp, !- CPU Power Input Function of Loading and Air Temperature Curve Name From cc355f95331373fcc68b39adacd38c69628b386f Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Tue, 26 Sep 2023 14:50:12 -0500 Subject: [PATCH 03/26] Cleanup CalcSurfaceWeightedMRT and CalcRadTemp --- src/EnergyPlus/ThermalComfort.cc | 37 +++++++++++++------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/src/EnergyPlus/ThermalComfort.cc b/src/EnergyPlus/ThermalComfort.cc index cdce19a7213..617222ae0a4 100644 --- a/src/EnergyPlus/ThermalComfort.cc +++ b/src/EnergyPlus/ThermalComfort.cc @@ -2129,24 +2129,28 @@ namespace ThermalComfort { } // Now weight the MRT + auto &thisSurfaceTemp = state.dataHeatBalSurf->SurfInsideTempHist(1)(SurfNum); if (thisSurface.enclAESum > 0.01) { CalcSurfaceWeightedMRT = sumAET / thisSurface.enclAESum; // if averaged with surface--half comes from the surface used for weighting (SurfNum) and the rest from the calculated MRT that excludes // this surface if (AverageWithSurface) { - CalcSurfaceWeightedMRT = 0.5 * (state.dataHeatBalSurf->SurfInsideTempHist(1)(SurfNum) + CalcSurfaceWeightedMRT); + CalcSurfaceWeightedMRT = 0.5 * (thisSurfaceTemp + CalcSurfaceWeightedMRT); } } else { if (state.dataThermalComforts->FirstTimeError) { - int ZoneNum = thisSurface.Zone; - ShowWarningError( - state, - format("Zone areas*inside surface emissivities are summing to zero, for Zone=\"{}\"", state.dataHeatBal->Zone(ZoneNum).Name)); - ShowContinueError(state, "As a result, MAT will be used for MRT when calculating a surface weighted MRT for this zone."); + int spaceNum = thisSurface.spaceNum; + ShowWarningError(state, + format("CalcSurfaceWeightedMRT: Areas*Inside surface emissivities are summing to zero for Enclosure=\"{}\"", + thisRadEnclosure.Name)); + ShowContinueError(state, + format("As a result, the MAT for Space={} will be used for MRT when calculating the surface weighted MRT.", + state.dataHeatBal->space(spaceNum).Name)); + ShowContinueError(state, format("for Surface={}", thisSurface.Name)); state.dataThermalComforts->FirstTimeError = false; - CalcSurfaceWeightedMRT = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT; + CalcSurfaceWeightedMRT = state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).MAT; if (AverageWithSurface) { - CalcSurfaceWeightedMRT = 0.5 * (state.dataHeatBalSurf->SurfInsideTempHist(1)(SurfNum) + CalcSurfaceWeightedMRT); + CalcSurfaceWeightedMRT = 0.5 * (thisSurfaceTemp + CalcSurfaceWeightedMRT); } } } @@ -2219,26 +2223,15 @@ namespace ThermalComfort { // within a space. Future additions might include the effect of direct // solar energy on occupants. - // Return value - Real64 CalcRadTemp; - - // Locals - Real64 SurfaceTemp; - - // FUNCTION PARAMETER DEFINITIONS: - Real64 constexpr AreaEff(1.8); // Effective area of a "standard" person in meters squared - Real64 constexpr StefanBoltzmannConst(5.6697e-8); // Stefan-Boltzmann constant in W/(m2*K4) - - // FUNCTION LOCAL VARIABLE DECLARATIONS: - Real64 ZoneRadTemp; + Real64 CalcRadTemp = 0.0; + Real64 constexpr AreaEff = 1.8; // Effective area of a "standard" person in meters squared + Real64 constexpr StefanBoltzmannConst = 5.6697e-8; // Stefan-Boltzmann constant in W/(m2*K4) switch (state.dataHeatBal->People(PeopleListNum).MRTCalcType) { case DataHeatBalance::CalcMRT::ZoneAveraged: { state.dataThermalComforts->RadTemp = state.dataHeatBal->ZoneMRT(state.dataThermalComforts->ZoneNum); } break; case DataHeatBalance::CalcMRT::SurfaceWeighted: { - ZoneRadTemp = state.dataHeatBal->ZoneMRT(state.dataThermalComforts->ZoneNum); - SurfaceTemp = state.dataHeatBalSurf->SurfInsideTempHist(1)(state.dataHeatBal->People(PeopleListNum).SurfacePtr); state.dataThermalComforts->RadTemp = CalcSurfaceWeightedMRT(state, state.dataHeatBal->People(PeopleListNum).SurfacePtr); } break; case DataHeatBalance::CalcMRT::AngleFactor: { From 4e073b128f0f7ecd12cd0fac3b31c3dc296aabc3 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Tue, 26 Sep 2023 15:19:34 -0500 Subject: [PATCH 04/26] EnclosureAveraged and delete ZoneName --- src/EnergyPlus/DataHeatBalance.hh | 2 +- .../HeatBalanceAirManager.cc | 4769 +++++++ .../HeatBalanceManager.cc | 10278 ++++++++++++++++ .../SimulationManager.cc | 2770 +++++ .../ZoneTempPredictorCorrector.cc | 7506 +++++++++++ src/EnergyPlus/InternalHeatGains.cc | 12 +- src/EnergyPlus/MixedAir.cc.bak | 5578 +++++++++ src/EnergyPlus/MixedAir.hh.bak | 600 + src/EnergyPlus/ThermalComfort.cc | 11 +- src/EnergyPlus/ThermalComfort.hh | 1 - .../ZoneTempPredictorCorrector.cc.bak | 7500 +++++++++++ tst/EnergyPlus/unit/AirLoopHVACDOAS.unit.cc | 20 +- .../unit/AirflowNetworkComponents.unit.cc | 2 +- .../unit/AirflowNetworkHVAC.unit.cc | 16 +- tst/EnergyPlus/unit/ChillerAbsorption.unit.cc | 2 +- tst/EnergyPlus/unit/DataHeatBalance.unit.cc | 2 +- tst/EnergyPlus/unit/HVACFourPipeBeam.unit.cc | 6 +- .../unit/HeatBalanceKivaManager.unit.cc | 2 +- .../unit/HeatBalanceSurfaceManager.unit.cc | 2 +- tst/EnergyPlus/unit/InternalHeatGains.unit.cc | 4 +- .../unit/OASystemHWPreheatCoil.unit.cc | 4 +- .../unit/OutputReportTabular.unit.cc | 4 +- tst/EnergyPlus/unit/ThermalComfort.unit.cc | 22 +- tst/EnergyPlus/unit/UnitHeater.unit.cc | 2 +- 24 files changed, 39064 insertions(+), 51 deletions(-) create mode 100644 src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceAirManager.cc create mode 100644 src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceManager.cc create mode 100644 src/EnergyPlus/ForceSpaceHeatBalance/SimulationManager.cc create mode 100644 src/EnergyPlus/ForceSpaceHeatBalance/ZoneTempPredictorCorrector.cc create mode 100644 src/EnergyPlus/MixedAir.cc.bak create mode 100644 src/EnergyPlus/MixedAir.hh.bak create mode 100644 src/EnergyPlus/ZoneTempPredictorCorrector.cc.bak diff --git a/src/EnergyPlus/DataHeatBalance.hh b/src/EnergyPlus/DataHeatBalance.hh index 7b4c53b1b70..07d251d2ea5 100644 --- a/src/EnergyPlus/DataHeatBalance.hh +++ b/src/EnergyPlus/DataHeatBalance.hh @@ -115,7 +115,7 @@ namespace DataHeatBalance { enum class CalcMRT { Invalid = -1, - ZoneAveraged, + EnclosureAveraged, SurfaceWeighted, AngleFactor, Num diff --git a/src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceAirManager.cc b/src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceAirManager.cc new file mode 100644 index 00000000000..25c517b5314 --- /dev/null +++ b/src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceAirManager.cc @@ -0,0 +1,4769 @@ +// EnergyPlus, Copyright (c) 1996-2022, The Board of Trustees of the University of Illinois, +// The Regents of the University of California, through Lawrence Berkeley National Laboratory +// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge +// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other +// contributors. All rights reserved. +// +// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the +// U.S. Government consequently retains certain rights. As such, the U.S. Government has been +// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, +// worldwide license in the Software to reproduce, distribute copies to the public, prepare +// derivative works, and perform publicly and display publicly, and to permit others to do so. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted +// provided that the following conditions are met: +// +// (1) Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// (2) Redistributions in binary form must reproduce the above copyright notice, this list of +// conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, +// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific prior +// written permission. +// +// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form +// without changes from the version obtained under this License, or (ii) Licensee makes a +// reference solely to the software portion of its product, Licensee must refer to the +// software as "EnergyPlus version X" software, where "X" is the version number Licensee +// obtained under this License and may not use a different name for the software. Except as +// specifically required in this Section (4), Licensee shall not use in a company name, a +// product name, in advertising, publicity, or other promotional activities any name, trade +// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly +// similar designation, without the U.S. Department of Energy's prior written consent. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +// C++ Headers +#include + +// ObjexxFCL Headers +#include +#include +#include +#include + +// EnergyPlus Headers +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace EnergyPlus::HeatBalanceAirManager { +// Module containing the air heat balance simulation routines +// calculation (initialization) routines + +// MODULE INFORMATION: +// AUTHOR Richard J. Liesen +// DATE WRITTEN February 1998 +// MODIFIED May-July 2000 Joe Huang for Comis Link +// RE-ENGINEERED na + +// PURPOSE OF THIS MODULE: +// To encapsulate the data and algorithms required to +// manage the air simluation heat balance on the building. + +// METHODOLOGY EMPLOYED: + +// REFERENCES: +// The heat balance method is outlined in the "Tarp Alogorithms Manual" +// The methods are also summarized in many BSO Theses and papers. + +// OTHER NOTES: +// This module was created from IBLAST subroutines + +// USE STATEMENTS: +using namespace DataEnvironment; +using namespace DataHeatBalance; +using namespace DataSurfaces; + +// Use statements for access to subroutines in other modules +using Psychrometrics::PsyCpAirFnW; +using Psychrometrics::PsyHFnTdbW; +using Psychrometrics::PsyRhoAirFnPbTdbW; +using Psychrometrics::PsyTdbFnHW; + +enum class AirflowSpec +{ + Invalid = -1, + Flow, + FlowPerZone, + FlowPerArea, + FlowPerPerson, + AirChanges, + Num +}; +constexpr std::array(AirflowSpec::Num)> airflowNamesUC = { + "FLOW", "FLOW/ZONE", "FLOW/AREA", "FLOW/PERSON", "AIRCHANGES/HOUR"}; + +enum class AirflowSpecAlt +{ + Invalid = -1, + Flow, + FlowPerZone, + FlowPerArea, + FlowPerExteriorArea, + FlowPerExteriorWallArea, + AirChanges, + Num +}; +constexpr std::array(AirflowSpecAlt::Num)> airflowAltNamesUC = { + "FLOW", "FLOW/ZONE", "FLOW/AREA", "FLOW/EXTERIORAREA", "FLOW/EXTERIORWALLAREA", "AIRCHANGES/HOUR"}; + +constexpr std::array(VentilationType::Num)> ventilationTypeNamesUC = {"NATURAL", "INTAKE", "EXHAUST", "BALANCED"}; + +constexpr std::array(DataRoomAirModel::RoomAirModel::Num)> roomAirModelNamesUC = { + "USERDEFINED", + "MIXING", + "ONENODEDISPLACEMENTVENTILATION", + "THREENODEDISPLACEMENTVENTILATION", + "CROSSVENTILATION", + "UNDERFLOORAIRDISTRIBUTIONINTERIOR", + "UNDERFLOORAIRDISTRIBUTIONEXTERIOR", + "AIRFLOWNETWORK"}; + +constexpr std::array(DataRoomAirModel::CouplingScheme::Num)> couplingSchemeNamesUC = {"DIRECT", "INDIRECT"}; + +void ManageAirHeatBalance(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Richard Liesen + // DATE WRITTEN February 1998 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine manages the heat air balance method of calculating + // building thermal loads. It is called from the HeatBalanceManager + // at the time step level. This driver manages the calls to all of + // the other drivers and simulation algorithms. + + // Obtains and Allocates heat balance related parameters from input file + if (state.dataHeatBalAirMgr->ManageAirHeatBalanceGetInputFlag) { + GetAirHeatBalanceInput(state); + state.dataHeatBalAirMgr->ManageAirHeatBalanceGetInputFlag = false; + } + + InitAirHeatBalance(state); // Initialize all heat balance related parameters + + // Solve the zone heat balance 'Detailed' solution + // Call the air surface heat balances + CalcHeatBalanceAir(state); + + ReportZoneMeanAirTemp(state); +} + +void GetAirHeatBalanceInput(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Richard Liesen + // DATE WRITTEN February 1998 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine is the main routine to call other input routines + + // METHODOLOGY EMPLOYED: + // Uses the status flags to trigger events. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + bool ErrorsFound(false); + + GetAirFlowFlag(state, ErrorsFound); + + SetZoneMassConservationFlag(state); + + // get input parameters for modeling of room air flow + GetRoomAirModelParameters(state, ErrorsFound); + + if (ErrorsFound) { + ShowFatalError(state, "GetAirHeatBalanceInput: Errors found in getting Air inputs"); + } +} + +void GetAirFlowFlag(EnergyPlusData &state, bool &ErrorsFound) // Set to true if errors found +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Garrett Westmacott + // DATE WRITTEN February 2000 + // MODIFIED Oct 2003, FCW: Change "Infiltration-Air Change Rate" from Sum to State + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine calls the routine to get simple air flow input data. + + // METHODOLOGY EMPLOYED: + // Modelled after 'Modual Example' in Guide for Module Developers + + // Using/Aliasing + using ScheduleManager::GetScheduleIndex; + + state.dataHeatBal->AirFlowFlag = true; // UseSimpleAirFlow; + + GetSimpleAirModelInputs(state, ErrorsFound); + if (state.dataHeatBal->TotInfiltration + state.dataHeatBal->TotVentilation + state.dataHeatBal->TotMixing + state.dataHeatBal->TotCrossMixing + + state.dataHeatBal->TotRefDoorMixing > + 0) { + static constexpr std::string_view Format_720("! , Simple\n AirFlow Model, {}\n"); + print(state.files.eio, Format_720, "Simple"); + } +} + +void SetZoneMassConservationFlag(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION : + // AUTHOR Bereket Nigusse, FSEC + // DATE WRITTEN February 2014 + // MODIFIED + + // PURPOSE OF THIS SUBROUTINE : + // This subroutine sets the zone mass conservation flag to true. + + if (state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance && + state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment != DataHeatBalance::AdjustmentType::NoAdjustReturnAndMixing) { + for (int Loop = 1; Loop <= state.dataHeatBal->TotMixing; ++Loop) { + state.dataHeatBalFanSys->ZoneMassBalanceFlag(state.dataHeatBal->Mixing(Loop).ZonePtr) = true; + state.dataHeatBalFanSys->ZoneMassBalanceFlag(state.dataHeatBal->Mixing(Loop).FromZone) = true; + } + } +} + +void GetSimpleAirModelInputs(EnergyPlusData &state, bool &ErrorsFound) // IF errors found in input +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN July 2000 + // MODIFIED Oct 2003,FCW: change "Infiltration-Air Change Rate" from Sum to State + // MODIFIED Jan 2008,LG: Allow multiple infiltration and ventilation objects per zone + // May 2009, BG: added calls to setup for possible EMS override + // August 2011, TKS: added refrigeration door mixing + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine gets the input for the "simple" air flow model. + + // Using/Aliasing + using General::CheckCreatedZoneItemName; + using ScheduleManager::CheckScheduleValueMinMax; + using ScheduleManager::GetScheduleIndex; + using ScheduleManager::GetScheduleMinValue; + using ScheduleManager::GetScheduleName; + using ScheduleManager::GetScheduleValuesForDay; + using SystemAvailabilityManager::GetHybridVentilationControlStatus; + + // SUBROUTINE PARAMETER DEFINITIONS: + Real64 constexpr VentilTempLimit(100.0); // degrees Celsius + Real64 constexpr MixingTempLimit(100.0); // degrees Celsius + Real64 constexpr VentilWSLimit(40.0); // m/s + static constexpr std::string_view RoutineName("GetSimpleAirModelInputs: "); // include trailing blank space + // Refrigeration Door Mixing Protection types, factors used to moderate mixing flow. + Real64 constexpr RefDoorNone(0.0); + Real64 constexpr RefDoorAirCurtain(0.5); + Real64 constexpr RefDoorStripCurtain(0.9); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int NumAlpha; // Number of Alphas for each GetobjectItem call + int NumNumber; // Number of Numbers for each GetobjectItem call + int maxAlpha; // max of Alphas for allocation + int maxNumber; // max of Numbers for allocation + int NumArgs; + int IOStat; + Array1D_string cAlphaFieldNames; + Array1D_string cNumericFieldNames; + Array1D_bool lNumericFieldBlanks; + Array1D_bool lAlphaFieldBlanks; + Array1D_string cAlphaArgs; + Array1D rNumericArgs; + std::string cCurrentModuleObject; + + Array1D_bool RepVarSet; + bool IsNotOK; + + std::string StringOut; + std::string NameThisObject; + bool ControlFlag; + Array1D TotInfilVentFlow; + Array1D TotMixingFlow; + Array1D ZoneMixingNum; + int ConnectTest; + int ConnectionNumber; + int NumbNum; + int AlphaNum; + int Zone1Num; + int Zone2Num; + int ZoneNumA; + int ZoneNumB; + + // Formats + static constexpr std::string_view Format_720(" {} Airflow Stats Nominal, {},{},{},{:.2R},{:.1R},"); + static constexpr std::string_view Format_721( + "! <{} Airflow Stats Nominal>,Name,Schedule Name,Zone Name, Zone Floor Area {{m2}}, # Zone Occupants,{}\n"); + static constexpr std::string_view Format_722(" {}, {}\n"); + + RepVarSet.dimension(state.dataGlobal->NumOfZones, true); + + // Following used for reporting + state.dataHeatBal->ZnAirRpt.allocate(state.dataGlobal->NumOfZones); + //if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { + state.dataHeatBal->spaceAirRpt.allocate(state.dataGlobal->NumOfZones); + //} + + for (int Loop = 1; Loop <= state.dataGlobal->NumOfZones; ++Loop) { + std::string_view name = state.dataHeatBal->Zone(Loop).Name; + auto &thisZnAirRpt = state.dataHeatBal->ZnAirRpt(Loop); + thisZnAirRpt.setUpOutputVars(state, DataStringGlobals::zonePrefix, name); + //if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { + for (int spaceNum : state.dataHeatBal->Zone(Loop).spaceIndexes) { + state.dataHeatBal->spaceAirRpt(spaceNum).setUpOutputVars( + state, DataStringGlobals::spacePrefix, state.dataHeatBal->space(spaceNum).Name); + } + //} + + // CurrentModuleObject='Zone' + if (state.dataGlobal->DisplayAdvancedReportVariables) { + SetupOutputVariable(state, + "Zone Phase Change Material Melting Enthalpy", + OutputProcessor::Unit::J_kg, + thisZnAirRpt.SumEnthalpyM, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + name); + SetupOutputVariable(state, + "Zone Phase Change Material Freezing Enthalpy", + OutputProcessor::Unit::J_kg, + thisZnAirRpt.SumEnthalpyH, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + name); + } + + SetupOutputVariable(state, + "Zone Exfiltration Heat Transfer Rate", + OutputProcessor::Unit::W, + thisZnAirRpt.ExfilTotalLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + name); + SetupOutputVariable(state, + "Zone Exfiltration Sensible Heat Transfer Rate", + OutputProcessor::Unit::W, + thisZnAirRpt.ExfilSensiLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + name); + SetupOutputVariable(state, + "Zone Exfiltration Latent Heat Transfer Rate", + OutputProcessor::Unit::W, + thisZnAirRpt.ExfilLatentLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + name); + SetupOutputVariable(state, + "Zone Exhaust Air Heat Transfer Rate", + OutputProcessor::Unit::W, + thisZnAirRpt.ExhTotalLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + name); + SetupOutputVariable(state, + "Zone Exhaust Air Sensible Heat Transfer Rate", + OutputProcessor::Unit::W, + thisZnAirRpt.ExhSensiLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + name); + SetupOutputVariable(state, + "Zone Exhaust Air Latent Heat Transfer Rate", + OutputProcessor::Unit::W, + thisZnAirRpt.ExhLatentLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + name); + } + + SetupOutputVariable(state, + "Site Total Zone Exfiltration Heat Loss", + OutputProcessor::Unit::J, + state.dataHeatBal->ZoneTotalExfiltrationHeatLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + "Environment"); + SetupOutputVariable(state, + "Site Total Zone Exhaust Air Heat Loss", + OutputProcessor::Unit::J, + state.dataHeatBal->ZoneTotalExhaustHeatLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + "Environment"); + + cCurrentModuleObject = "ZoneAirBalance:OutdoorAir"; + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); + maxAlpha = NumAlpha; + maxNumber = NumNumber; + cCurrentModuleObject = "ZoneInfiltration:EffectiveLeakageArea"; + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); + maxAlpha = max(NumAlpha, maxAlpha); + maxNumber = max(NumNumber, maxNumber); + cCurrentModuleObject = "ZoneInfiltration:FlowCoefficient"; + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); + maxAlpha = max(NumAlpha, maxAlpha); + maxNumber = max(NumNumber, maxNumber); + cCurrentModuleObject = "ZoneInfiltration:DesignFlowRate"; + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); + maxAlpha = max(NumAlpha, maxAlpha); + maxNumber = max(NumNumber, maxNumber); + cCurrentModuleObject = "ZoneVentilation:DesignFlowRate"; + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); + maxAlpha = max(NumAlpha, maxAlpha); + maxNumber = max(NumNumber, maxNumber); + cCurrentModuleObject = "ZoneVentilation:WindandStackOpenArea"; + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); + maxAlpha = max(NumAlpha, maxAlpha); + maxNumber = max(NumNumber, maxNumber); + cCurrentModuleObject = "ZoneMixing"; + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); + maxAlpha = max(NumAlpha, maxAlpha); + maxNumber = max(NumNumber, maxNumber); + cCurrentModuleObject = "ZoneCrossMixing"; + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); + maxAlpha = max(NumAlpha, maxAlpha); + maxNumber = max(NumNumber, maxNumber); + cCurrentModuleObject = "ZoneRefrigerationDoorMixing"; + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); + maxAlpha = max(NumAlpha, maxAlpha); + maxNumber = max(NumNumber, maxNumber); + + cAlphaArgs.allocate(maxAlpha); + cAlphaFieldNames.allocate(maxAlpha); + cNumericFieldNames.allocate(maxNumber); + rNumericArgs.dimension(maxNumber, 0.0); + lAlphaFieldBlanks.dimension(maxAlpha, true); + lNumericFieldBlanks.dimension(maxNumber, true); + + cCurrentModuleObject = "ZoneAirBalance:OutdoorAir"; + state.dataHeatBal->TotZoneAirBalance = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + state.dataHeatBal->ZoneAirBalance.allocate(state.dataHeatBal->TotZoneAirBalance); + + for (int Loop = 1; Loop <= state.dataHeatBal->TotZoneAirBalance; ++Loop) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Loop, + cAlphaArgs, + NumAlpha, + rNumericArgs, + NumNumber, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + IsNotOK = false; + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + state.dataHeatBal->ZoneAirBalance(Loop).Name = cAlphaArgs(1); + state.dataHeatBal->ZoneAirBalance(Loop).ZoneName = cAlphaArgs(2); + state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr = UtilityRoutines::FindItemInList(cAlphaArgs(2), state.dataHeatBal->Zone); + if (state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr == 0) { + ShowSevereError(state, + format(R"({}{}="{}", invalid (not found) {}="{}".)", + RoutineName, + cCurrentModuleObject, + cAlphaArgs(1), + cAlphaFieldNames(2), + cAlphaArgs(2))); + ErrorsFound = true; + } else { + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).zoneOABalanceIndex = Loop; + } + GlobalNames::IntraObjUniquenessCheck( + state, cAlphaArgs(2), cCurrentModuleObject, cAlphaFieldNames(2), state.dataHeatBalAirMgr->UniqueZoneNames, IsNotOK); + if (IsNotOK) { + ShowSevereError(state, + format(R"({}{}="{}", a duplicated object {}="{}" is found.)", + RoutineName, + cCurrentModuleObject, + cAlphaArgs(1), + cAlphaFieldNames(2), + cAlphaArgs(2))); + ShowContinueError(state, "A zone can only have one " + cCurrentModuleObject + " object."); + ErrorsFound = true; + } + + { + state.dataHeatBal->ZoneAirBalance(Loop).BalanceMethod = static_cast( + getEnumerationValue(DataHeatBalance::AirBalanceTypeNamesUC, + UtilityRoutines::MakeUPPERCase(cAlphaArgs(3)))); // Air balance method type character input-->convert to enum + if (state.dataHeatBal->ZoneAirBalance(Loop).BalanceMethod == AirBalance::Invalid) { + state.dataHeatBal->ZoneAirBalance(Loop).BalanceMethod = AirBalance::None; + ShowWarningError(state, + format("{}{} = {} not valid choice for {}={}", + RoutineName, + cAlphaFieldNames(3), + cAlphaArgs(3), + cCurrentModuleObject, + cAlphaArgs(1))); + ShowContinueError(state, "The default choice \"NONE\" is assigned"); + } + } + + state.dataHeatBal->ZoneAirBalance(Loop).InducedAirRate = rNumericArgs(1); + if (rNumericArgs(1) < 0.0) { + ShowSevereError(state, + format("{}{}=\"{}\", invalid Induced Outdoor Air Due to Duct Leakage Unbalance specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + cAlphaArgs(1), + rNumericArgs(1))); + ErrorsFound = true; + } + + state.dataHeatBal->ZoneAirBalance(Loop).InducedAirSchedPtr = GetScheduleIndex(state, cAlphaArgs(4)); + if (state.dataHeatBal->ZoneAirBalance(Loop).InducedAirSchedPtr == 0) { + if (lAlphaFieldBlanks(4)) { + ShowSevereError( + state, + format("{}{}=\"{}\",{} is required but field is blank.", RoutineName, cCurrentModuleObject, cAlphaArgs(1), cAlphaFieldNames(4))); + } else { + ShowSevereError(state, + format(R"({}{}="{}", invalid (not found) {}="{}".)", + RoutineName, + cCurrentModuleObject, + cAlphaArgs(1), + cAlphaFieldNames(4), + cAlphaArgs(4))); + } + ErrorsFound = true; + } + if (!CheckScheduleValueMinMax(state, state.dataHeatBal->ZoneAirBalance(Loop).InducedAirSchedPtr, ">=", 0.0, "<=", 1.0)) { + ShowSevereError(state, + format("{} = {}: Error found in {} = {}", + cCurrentModuleObject, + state.dataHeatBal->ZoneAirBalance(Loop).Name, + cAlphaFieldNames(4), + cAlphaArgs(4))); + ShowContinueError(state, "Schedule values must be (>=0., <=1.)"); + ErrorsFound = true; + } + + // Check whether this zone is also controleld by hybrid ventilation object with ventilation control option or not + ControlFlag = GetHybridVentilationControlStatus(state, state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr); + if (ControlFlag && state.dataHeatBal->ZoneAirBalance(Loop).BalanceMethod == AirBalance::Quadrature) { + state.dataHeatBal->ZoneAirBalance(Loop).BalanceMethod = AirBalance::None; + ShowWarningError( + state, + format("{} = {}: This Zone ({}) is controlled by AvailabilityManager:HybridVentilation with Simple Airflow Control Type option.", + cCurrentModuleObject, + state.dataHeatBal->ZoneAirBalance(Loop).Name, + cAlphaArgs(2))); + ShowContinueError(state, + "Air balance method type QUADRATURE and Simple Airflow Control Type cannot co-exist. The NONE method is assigned"); + } + + if (state.dataHeatBal->ZoneAirBalance(Loop).BalanceMethod == AirBalance::Quadrature) { + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).zoneOAQuadratureSum = true; + SetupOutputVariable(state, + "Zone Combined Outdoor Air Sensible Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceHeatLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Combined Outdoor Air Sensible Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceHeatGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Combined Outdoor Air Latent Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceLatentLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Combined Outdoor Air Latent Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceLatentGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Combined Outdoor Air Total Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceTotalLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Combined Outdoor Air Total Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceTotalGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Combined Outdoor Air Current Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceVdotCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Combined Outdoor Air Standard Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceVdotStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Combined Outdoor Air Current Density Volume", + OutputProcessor::Unit::m3, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceVolumeCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Combined Outdoor Air Standard Density Volume", + OutputProcessor::Unit::m3, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceVolumeStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Combined Outdoor Air Mass", + OutputProcessor::Unit::kg, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceMass, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Combined Outdoor Air Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceMdot, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Combined Outdoor Air Changes per Hour", + OutputProcessor::Unit::ach, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceAirChangeRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Combined Outdoor Air Fan Electricity Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceFanElec, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name, + _, + "Electricity", + "Fans", + "Ventilation (simple)", + "Building", + state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); + } + } + + // Set up and process ZoneInfiltration:* inputs + + cCurrentModuleObject = "ZoneInfiltration:DesignFlowRate"; + int numDesignFlowInfiltrationObjects = 0; + int totDesignFlowInfiltration = 0; // Total ZoneInfiltration:DesignFlowRate instances after expansion to spaces + EPVector infiltrationDesignFlowRateObjects; + InternalHeatGains::setupIHGZonesAndSpaces( + state, cCurrentModuleObject, infiltrationDesignFlowRateObjects, numDesignFlowInfiltrationObjects, totDesignFlowInfiltration, ErrorsFound); + + cCurrentModuleObject = "ZoneInfiltration:EffectiveLeakageArea"; + int numLeakageAreaInfiltrationObjects = 0; + int totLeakageAreaInfiltration = 0; // Total ZoneInfiltration:EffectiveLeakageArea instances after expansion to spaces + EPVector infiltrationLeakageAreaObjects; + bool const zoneListNotAllowed = true; + InternalHeatGains::setupIHGZonesAndSpaces(state, + cCurrentModuleObject, + infiltrationLeakageAreaObjects, + numLeakageAreaInfiltrationObjects, + totLeakageAreaInfiltration, + ErrorsFound, + zoneListNotAllowed); + + cCurrentModuleObject = "ZoneInfiltration:FlowCoefficient"; + int numFlowCoefficientInfiltrationObjects = 0; + int totFlowCoefficientInfiltration = 0; // Total ZoneInfiltration:FlowCoefficient instances after expansion to spaces + EPVector infiltrationFlowCoefficientObjects; + InternalHeatGains::setupIHGZonesAndSpaces(state, + cCurrentModuleObject, + infiltrationFlowCoefficientObjects, + numFlowCoefficientInfiltrationObjects, + totFlowCoefficientInfiltration, + ErrorsFound, + zoneListNotAllowed); + + state.dataHeatBal->TotInfiltration = totDesignFlowInfiltration + totLeakageAreaInfiltration + totFlowCoefficientInfiltration; + state.dataHeatBal->Infiltration.allocate(state.dataHeatBal->TotInfiltration); + state.dataHeatBalAirMgr->UniqueInfiltrationNames.reserve(static_cast(state.dataHeatBal->TotInfiltration)); + + int infiltrationNum = 0; + if (totDesignFlowInfiltration > 0) { + cCurrentModuleObject = "ZoneInfiltration:DesignFlowRate"; + for (int infilInputNum = 1; infilInputNum <= numDesignFlowInfiltrationObjects; ++infilInputNum) { + + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + infilInputNum, + cAlphaArgs, + NumAlpha, + rNumericArgs, + NumNumber, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + + // Create one Infiltration instance for every space associated with this input object + auto &thisInfiltrationInput = infiltrationDesignFlowRateObjects(infilInputNum); + for (int Item1 = 1; Item1 <= thisInfiltrationInput.numOfSpaces; ++Item1) { + ++infiltrationNum; + auto &thisInfiltration = state.dataHeatBal->Infiltration(infiltrationNum); + thisInfiltration.Name = thisInfiltrationInput.names(Item1); + thisInfiltration.spaceIndex = thisInfiltrationInput.spaceNums(Item1); + auto &thisSpace = state.dataHeatBal->space(thisInfiltration.spaceIndex); + thisInfiltration.ZonePtr = thisSpace.zoneNum; + auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); + + thisInfiltration.ModelType = DataHeatBalance::InfiltrationModelType::DesignFlowRate; + if (lAlphaFieldBlanks(3)) { + thisInfiltration.SchedPtr = DataGlobalConstants::ScheduleAlwaysOn; + } else { + thisInfiltration.SchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); + if (thisInfiltration.SchedPtr == 0) { + if (Item1 == 1) { // avoid repeated error messages from the same input object + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); + ErrorsFound = true; + } + } + } + + // Set space flow fractions + // Infiltration equipment design level calculation method. + AirflowSpecAlt flow = + static_cast(getEnumerationValue(airflowAltNamesUC, cAlphaArgs(4))); // NOLINT(modernize-use-auto) + switch (flow) { + case AirflowSpecAlt::Flow: + case AirflowSpecAlt::FlowPerZone: + if (lNumericFieldBlanks(1)) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Infiltration will result.", + RoutineName, + cCurrentModuleObject, + thisInfiltration.Name, + cAlphaFieldNames(4), + cNumericFieldNames(1))); + } else { + Real64 spaceFrac = 1.0; + if (!thisInfiltrationInput.spaceListActive && (thisInfiltrationInput.numOfSpaces > 1)) { + Real64 const zoneVolume = thisZone.Volume; + if (zoneVolume > 0.0) { + spaceFrac = thisSpace.Volume / zoneVolume; + } else { + ShowSevereError(state, std::string(RoutineName) + "Zone volume is zero when allocating Infiltration to Spaces."); + ShowContinueError( + state, + format("Occurs for {}=\"{}\" in Zone=\"{}\".", cCurrentModuleObject, thisInfiltrationInput.Name, thisZone.Name)); + ErrorsFound = true; + } + } + + thisInfiltration.DesignLevel = rNumericArgs(1) * spaceFrac; + } + break; + + case AirflowSpecAlt::FlowPerArea: + if (thisInfiltration.ZonePtr != 0) { + if (rNumericArgs(2) >= 0.0) { + thisInfiltration.DesignLevel = rNumericArgs(2) * thisSpace.floorArea; + if (thisInfiltration.ZonePtr > 0) { + if (thisSpace.floorArea <= 0.0) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but Space Floor Area = 0. 0 Infiltration will result.", + RoutineName, + cCurrentModuleObject, + thisInfiltration.Name, + cAlphaFieldNames(4), + cNumericFieldNames(2))); + } + } + } else { + ShowSevereError(state, + format("{}{}=\"{}\", invalid flow/area specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + thisInfiltration.Name, + rNumericArgs(2))); + ErrorsFound = true; + } + } + if (lNumericFieldBlanks(2)) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Infiltration will result.", + RoutineName, + cCurrentModuleObject, + thisInfiltration.Name, + cAlphaFieldNames(4), + cNumericFieldNames(2))); + } + break; + + case AirflowSpecAlt::FlowPerExteriorArea: + if (thisInfiltration.ZonePtr != 0) { + if (rNumericArgs(3) >= 0.0) { + thisInfiltration.DesignLevel = rNumericArgs(3) * thisSpace.ExteriorTotalSurfArea; + if (thisSpace.ExteriorTotalSurfArea <= 0.0) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but Exterior Surface Area = 0. 0 Infiltration will result.", + RoutineName, + cCurrentModuleObject, + thisInfiltration.Name, + cAlphaFieldNames(4), + cNumericFieldNames(3))); + } + } else { + ShowSevereError(state, + format("{}{} = \"{}\", invalid flow/exteriorarea specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + thisInfiltration.Name, + rNumericArgs(3))); + ErrorsFound = true; + } + } + if (lNumericFieldBlanks(3)) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Infiltration will result.", + RoutineName, + cCurrentModuleObject, + thisInfiltration.Name, + cAlphaFieldNames(4), + cNumericFieldNames(3))); + } + break; + + case AirflowSpecAlt::FlowPerExteriorWallArea: + if (thisInfiltration.ZonePtr != 0) { + if (rNumericArgs(3) >= 0.0) { + thisInfiltration.DesignLevel = rNumericArgs(3) * thisSpace.ExtGrossWallArea; + if (thisSpace.ExtGrossWallArea <= 0.0) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but Exterior Wall Area = 0. 0 Infiltration will result.", + RoutineName, + cCurrentModuleObject, + thisInfiltration.Name, + cAlphaFieldNames(4), + cNumericFieldNames(3))); + } + } else { + ShowSevereError(state, + format("{}{} = \"{}\", invalid flow/exteriorwallarea specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + thisInfiltration.Name, + rNumericArgs(3))); + ErrorsFound = true; + } + } + if (lNumericFieldBlanks(3)) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Infiltration will result.", + RoutineName, + cCurrentModuleObject, + thisInfiltration.Name, + cAlphaFieldNames(4), + cNumericFieldNames(3))); + } + break; + + case AirflowSpecAlt::AirChanges: + if (thisInfiltration.spaceIndex != 0) { + if (rNumericArgs(4) >= 0.0) { + thisInfiltration.DesignLevel = rNumericArgs(4) * thisSpace.Volume / DataGlobalConstants::SecInHour; + if (thisSpace.Volume <= 0.0) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but Space Volume = 0. 0 Infiltration will result.", + RoutineName, + cCurrentModuleObject, + thisInfiltration.Name, + cAlphaFieldNames(4), + cNumericFieldNames(4))); + } + } else { + ShowSevereError(state, + format("{}In {} = \"{}\", invalid ACH (air changes per hour) specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + thisInfiltration.Name, + rNumericArgs(4))); + ErrorsFound = true; + } + } + if (lNumericFieldBlanks(4)) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Infiltration will result.", + RoutineName, + cCurrentModuleObject, + thisInfiltrationInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(4))); + } + break; + + default: + if (Item1 == 1) { + ShowSevereError( + state, + format("{}{}=\"{}\", invalid calculation method={}", RoutineName, cCurrentModuleObject, cAlphaArgs(1), cAlphaArgs(4))); + ErrorsFound = true; + } + } + + thisInfiltration.ConstantTermCoef = !lNumericFieldBlanks(5) ? rNumericArgs(5) : 1.0; + thisInfiltration.TemperatureTermCoef = !lNumericFieldBlanks(6) ? rNumericArgs(6) : 0.0; + thisInfiltration.VelocityTermCoef = !lNumericFieldBlanks(7) ? rNumericArgs(7) : 0.0; + thisInfiltration.VelocitySQTermCoef = !lNumericFieldBlanks(8) ? rNumericArgs(8) : 0.0; + + if (thisInfiltration.ConstantTermCoef == 0.0 && thisInfiltration.TemperatureTermCoef == 0.0 && + thisInfiltration.VelocityTermCoef == 0.0 && thisInfiltration.VelocitySQTermCoef == 0.0) { + if (Item1 == 1) { + ShowWarningError( + state, + format( + R"({}{}="{}", in {}="{}".)", RoutineName, cCurrentModuleObject, cAlphaArgs(1), cAlphaFieldNames(2), cAlphaArgs(2))); + ShowContinueError(state, "Infiltration Coefficients are all zero. No Infiltration will be reported."); + } + } + } + } + } + + if (totLeakageAreaInfiltration > 0) { + cCurrentModuleObject = "ZoneInfiltration:EffectiveLeakageArea"; + for (int infilInputNum = 1; infilInputNum <= numLeakageAreaInfiltrationObjects; ++infilInputNum) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + infilInputNum, + cAlphaArgs, + NumAlpha, + rNumericArgs, + NumNumber, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + // Create one Infiltration instance for every space associated with this input object + auto &thisInfiltrationInput = infiltrationLeakageAreaObjects(infilInputNum); + for (int Item1 = 1; Item1 <= thisInfiltrationInput.numOfSpaces; ++Item1) { + ++infiltrationNum; + auto &thisInfiltration = state.dataHeatBal->Infiltration(infiltrationNum); + thisInfiltration.Name = thisInfiltrationInput.names(Item1); + thisInfiltration.spaceIndex = thisInfiltrationInput.spaceNums(Item1); + auto &thisSpace = state.dataHeatBal->space(thisInfiltration.spaceIndex); + thisInfiltration.ZonePtr = thisSpace.zoneNum; + auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); + + thisInfiltration.ModelType = DataHeatBalance::InfiltrationModelType::ShermanGrimsrud; + + if (lAlphaFieldBlanks(3)) { + thisInfiltration.SchedPtr = DataGlobalConstants::ScheduleAlwaysOn; + } else { + thisInfiltration.SchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); + if (thisInfiltration.SchedPtr == 0) { + ShowSevereError(state, + format(R"({}{}="{}", invalid (not found) {}="{}".)", + RoutineName, + cCurrentModuleObject, + cAlphaArgs(1), + cAlphaFieldNames(3), + cAlphaArgs(3))); + ErrorsFound = true; + } + } + thisInfiltration.BasicStackCoefficient = rNumericArgs(2); + thisInfiltration.BasicWindCoefficient = rNumericArgs(3); + + if (lNumericFieldBlanks(1)) { + ShowWarningError(state, + format("{}{}=\"{}\", field {} is blank. 0 Infiltration will result.", + RoutineName, + cCurrentModuleObject, + thisInfiltrationInput.Name, + cNumericFieldNames(1))); + } else { + Real64 spaceFrac = 1.0; + if (!thisInfiltrationInput.spaceListActive && (thisInfiltrationInput.numOfSpaces > 1)) { + Real64 const zoneExteriorTotalSurfArea = thisZone.ExteriorTotalSurfArea; + if (zoneExteriorTotalSurfArea > 0.0) { + spaceFrac = thisSpace.ExteriorTotalSurfArea / zoneExteriorTotalSurfArea; + } else { + ShowSevereError(state, + std::string(RoutineName) + "Zone exterior surface area is zero when allocating Infiltration to Spaces."); + ShowContinueError( + state, + format("Occurs for {}=\"{}\" in Zone=\"{}\".", cCurrentModuleObject, thisInfiltrationInput.Name, thisZone.Name)); + ErrorsFound = true; + } + } + + thisInfiltration.LeakageArea = rNumericArgs(1) * spaceFrac; + } + // check if space has exterior surfaces + if (thisInfiltration.spaceIndex > 0) { + if (thisSpace.ExteriorTotalSurfArea <= 0.0) { + ShowWarningError(state, + format(R"({}{}="{}", Space="{}" does not have surfaces exposed to outdoors.)", + RoutineName, + cCurrentModuleObject, + thisInfiltrationInput.Name, + thisSpace.Name)); + ShowContinueError(state, "Infiltration model is appropriate for exterior spaces not interior spaces, simulation continues."); + } + } + } + } + } + + if (totFlowCoefficientInfiltration > 0) { + cCurrentModuleObject = "ZoneInfiltration:FlowCoefficient"; + for (int infilInputNum = 1; infilInputNum <= numFlowCoefficientInfiltrationObjects; ++infilInputNum) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + infilInputNum, + cAlphaArgs, + NumAlpha, + rNumericArgs, + NumNumber, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + // Create one Infiltration instance for every space associated with this input object + auto &thisInfiltrationInput = infiltrationFlowCoefficientObjects(infilInputNum); + for (int Item1 = 1; Item1 <= thisInfiltrationInput.numOfSpaces; ++Item1) { + ++infiltrationNum; + auto &thisInfiltration = state.dataHeatBal->Infiltration(infiltrationNum); + thisInfiltration.Name = thisInfiltrationInput.names(Item1); + thisInfiltration.spaceIndex = thisInfiltrationInput.spaceNums(Item1); + auto &thisSpace = state.dataHeatBal->space(thisInfiltration.spaceIndex); + thisInfiltration.ZonePtr = thisSpace.zoneNum; + auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); + + thisInfiltration.ModelType = DataHeatBalance::InfiltrationModelType::AIM2; + + if (lAlphaFieldBlanks(3)) { + thisInfiltration.SchedPtr = DataGlobalConstants::ScheduleAlwaysOn; + } else { + thisInfiltration.SchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); + if (thisInfiltration.SchedPtr == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); + ErrorsFound = true; + } + } + thisInfiltration.AIM2StackCoefficient = rNumericArgs(2); + thisInfiltration.PressureExponent = rNumericArgs(3); + thisInfiltration.AIM2WindCoefficient = rNumericArgs(4); + thisInfiltration.ShelterFactor = rNumericArgs(5); + + if (lNumericFieldBlanks(1)) { + ShowWarningError(state, + format("{}{}=\"{}\", field {} is blank. 0 Infiltration will result.", + RoutineName, + cCurrentModuleObject, + thisInfiltrationInput.Name, + cNumericFieldNames(1))); + } else { + Real64 spaceFrac = 1.0; + if (!thisInfiltrationInput.spaceListActive && (thisInfiltrationInput.numOfSpaces > 1)) { + Real64 const zoneExteriorTotalSurfArea = thisZone.ExteriorTotalSurfArea; + if (zoneExteriorTotalSurfArea > 0.0) { + spaceFrac = thisSpace.ExteriorTotalSurfArea / zoneExteriorTotalSurfArea; + } else { + ShowSevereError(state, + std::string(RoutineName) + "Zone exterior surface area is zero when allocating Infiltration to Spaces."); + ShowContinueError( + state, + format("Occurs for {}=\"{}\" in Zone=\"{}\".", cCurrentModuleObject, thisInfiltrationInput.Name, thisZone.Name)); + ErrorsFound = true; + } + } + + thisInfiltration.FlowCoefficient = rNumericArgs(1) * spaceFrac; + // check if space has exterior surfaces + if (thisInfiltration.spaceIndex > 0) { + if (thisSpace.ExteriorTotalSurfArea <= 0.0) { + ShowWarningError(state, + format(R"({}{}="{}", Space="{}" does not have surfaces exposed to outdoors.)", + RoutineName, + cCurrentModuleObject, + thisInfiltrationInput.Name, + thisSpace.Name)); + ShowContinueError(state, + "Infiltration model is appropriate for exterior spaces not interior spaces, simulation continues."); + } + } + } + } + } + } + + // setup zone-level infiltration reports + for (int Loop = 1; Loop <= state.dataHeatBal->TotInfiltration; ++Loop) { + if (state.dataHeatBal->Infiltration(Loop).ZonePtr > 0 && + !state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).zoneOAQuadratureSum) { + // Object report variables + SetupOutputVariable(state, + "Infiltration Sensible Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->Infiltration(Loop).InfilHeatLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Infiltration(Loop).Name); + SetupOutputVariable(state, + "Infiltration Sensible Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->Infiltration(Loop).InfilHeatGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Infiltration(Loop).Name); + SetupOutputVariable(state, + "Infiltration Latent Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->Infiltration(Loop).InfilLatentLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Infiltration(Loop).Name); + SetupOutputVariable(state, + "Infiltration Latent Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->Infiltration(Loop).InfilLatentGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Infiltration(Loop).Name); + SetupOutputVariable(state, + "Infiltration Total Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->Infiltration(Loop).InfilTotalLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Infiltration(Loop).Name); + SetupOutputVariable(state, + "Infiltration Total Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->Infiltration(Loop).InfilTotalGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Infiltration(Loop).Name); + SetupOutputVariable(state, + "Infiltration Current Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->Infiltration(Loop).InfilVdotCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Infiltration(Loop).Name); + SetupOutputVariable(state, + "Infiltration Standard Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->Infiltration(Loop).InfilVdotStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Infiltration(Loop).Name); + SetupOutputVariable(state, + "Infiltration Current Density Volume", + OutputProcessor::Unit::m3, + state.dataHeatBal->Infiltration(Loop).InfilVolumeCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Infiltration(Loop).Name); + SetupOutputVariable(state, + "Infiltration Standard Density Volume", + OutputProcessor::Unit::m3, + state.dataHeatBal->Infiltration(Loop).InfilVolumeStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Infiltration(Loop).Name); + SetupOutputVariable(state, + "Infiltration Mass", + OutputProcessor::Unit::kg, + state.dataHeatBal->Infiltration(Loop).InfilMass, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Infiltration(Loop).Name); + SetupOutputVariable(state, + "Infiltration Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->Infiltration(Loop).InfilMdot, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Infiltration(Loop).Name); + SetupOutputVariable(state, + "Infiltration Air Change Rate", + OutputProcessor::Unit::ach, + state.dataHeatBal->Infiltration(Loop).InfilAirChangeRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Infiltration(Loop).Name); + + if (RepVarSet(state.dataHeatBal->Infiltration(Loop).ZonePtr)) { + RepVarSet(state.dataHeatBal->Infiltration(Loop).ZonePtr) = false; + SetupOutputVariable(state, + "Zone Infiltration Sensible Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilHeatLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Infiltration Sensible Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilHeatGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Infiltration Latent Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilLatentLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Infiltration Latent Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilLatentGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Infiltration Total Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilTotalLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Infiltration Total Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilTotalGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Infiltration Current Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilVdotCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Infiltration Standard Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilVdotStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Infiltration Current Density Volume", + OutputProcessor::Unit::m3, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilVolumeCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Infiltration Standard Density Volume", + OutputProcessor::Unit::m3, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilVolumeStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Infiltration Mass", + OutputProcessor::Unit::kg, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilMass, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Infiltration Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilMdot, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); + SetupOutputVariable(state, + "Zone Infiltration Air Change Rate", + OutputProcessor::Unit::ach, + state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilAirChangeRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); + } + } + + if (state.dataGlobal->AnyEnergyManagementSystemInModel) { + SetupEMSActuator(state, + "Zone Infiltration", + state.dataHeatBal->Infiltration(Loop).Name, + "Air Exchange Flow Rate", + "[m3/s]", + state.dataHeatBal->Infiltration(Loop).EMSOverrideOn, + state.dataHeatBal->Infiltration(Loop).EMSAirFlowRateValue); + } + } + + // Set up and process ZoneVentilation:* inputs + + RepVarSet = true; + + cCurrentModuleObject = "ZoneVentilation:DesignFlowRate"; + int numDesignFlowVentilationObjects = 0; + int totDesignFlowVentilation = 0; // Total ZoneVentilation:DesignFlowRate instances after expansion to spaces + EPVector ventilationDesignFlowRateObjects; + InternalHeatGains::setupIHGZonesAndSpaces( + state, cCurrentModuleObject, ventilationDesignFlowRateObjects, numDesignFlowVentilationObjects, totDesignFlowVentilation, ErrorsFound); + + cCurrentModuleObject = "ZoneVentilation:WindandStackOpenArea"; + int numWindStackVentilationObjects = 0; + int totWindStackVentilation = 0; // Total ZoneVentilation:WindandStackOpenArea instances after expansion to spaces + EPVector ventilationWindStackObjects; + InternalHeatGains::setupIHGZonesAndSpaces(state, + cCurrentModuleObject, + ventilationWindStackObjects, + numWindStackVentilationObjects, + totWindStackVentilation, + ErrorsFound, + zoneListNotAllowed); + + state.dataHeatBal->TotVentilation = totDesignFlowVentilation + totWindStackVentilation; + state.dataHeatBal->Ventilation.allocate(state.dataHeatBal->TotVentilation); + + int ventilationNum = 0; + if (numDesignFlowVentilationObjects > 0) { + cCurrentModuleObject = "ZoneVentilation:DesignFlowRate"; + for (int ventInputNum = 1; ventInputNum <= numDesignFlowVentilationObjects; ++ventInputNum) { + + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + ventInputNum, + cAlphaArgs, + NumAlpha, + rNumericArgs, + NumNumber, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + + auto &thisVentilationInput = ventilationDesignFlowRateObjects(ventInputNum); + for (int Item1 = 1; Item1 <= thisVentilationInput.numOfSpaces; ++Item1) { + ++ventilationNum; + auto &thisVentilation = state.dataHeatBal->Ventilation(ventilationNum); + thisVentilation.Name = thisVentilationInput.names(Item1); + thisVentilation.spaceIndex = thisVentilationInput.spaceNums(Item1); + auto &thisSpace = state.dataHeatBal->space(thisVentilation.spaceIndex); + thisVentilation.ZonePtr = thisSpace.zoneNum; + auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); + + thisVentilation.ModelType = DataHeatBalance::VentilationModelType::DesignFlowRate; + if (lAlphaFieldBlanks(3)) { + thisVentilation.SchedPtr = DataGlobalConstants::ScheduleAlwaysOn; + } else { + thisVentilation.SchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); + if (thisVentilation.SchedPtr == 0) { + if (Item1 == 1) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); + } + ErrorsFound = true; + } + } + + // Ventilation equipment design level calculation method + AirflowSpec flow = static_cast(getEnumerationValue(airflowNamesUC, cAlphaArgs(4))); // NOLINT(modernize-use-auto) + switch (flow) { + case AirflowSpec::Flow: + case AirflowSpec::FlowPerZone: + thisVentilation.DesignLevel = rNumericArgs(1); + if (lNumericFieldBlanks(1)) { + ShowWarningError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + + cAlphaFieldNames(4) + " specifies " + cNumericFieldNames(1) + + ", but that field is blank. 0 Ventilation will result."); + } + break; + + case AirflowSpec::FlowPerArea: + if (thisVentilation.spaceIndex != 0) { + if (rNumericArgs(2) >= 0.0) { + thisVentilation.DesignLevel = rNumericArgs(2) * thisSpace.floorArea; + if (thisSpace.floorArea <= 0.0) { + ShowWarningError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + + cAlphaFieldNames(4) + " specifies " + cNumericFieldNames(2) + + ", but Space Floor Area = 0. 0 Ventilation will result."); + } + } else { + ShowSevereError(state, + format("{}{}=\"{}\", invalid flow/area specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + thisVentilation.Name, + rNumericArgs(2))); + ErrorsFound = true; + } + } + if (lNumericFieldBlanks(2)) { + ShowWarningError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + + cAlphaFieldNames(4) + " specifies " + cNumericFieldNames(2) + + ", but that field is blank. 0 Ventilation will result."); + } + break; + + case AirflowSpec::FlowPerPerson: + if (thisVentilation.spaceIndex != 0) { + if (rNumericArgs(3) >= 0.0) { + thisVentilation.DesignLevel = rNumericArgs(3) * thisSpace.totOccupants; + if (thisSpace.totOccupants <= 0.0) { + ShowWarningError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + + cAlphaFieldNames(4) + " specifies " + cNumericFieldNames(3) + + ", but Zone Total Occupants = 0. 0 Ventilation will result."); + } + } else { + ShowSevereError(state, + format("{}{}=\"{}\", invalid flow/person specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + thisVentilation.Name, + rNumericArgs(3))); + ErrorsFound = true; + } + } + if (lNumericFieldBlanks(3)) { + ShowWarningError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + + cAlphaFieldNames(4) + "specifies " + cNumericFieldNames(3) + + ", but that field is blank. 0 Ventilation will result."); + } + break; + + case AirflowSpec::AirChanges: + if (thisVentilation.spaceIndex != 0) { + if (rNumericArgs(4) >= 0.0) { + thisVentilation.DesignLevel = rNumericArgs(4) * thisSpace.Volume / DataGlobalConstants::SecInHour; + if (thisSpace.Volume <= 0.0) { + ShowWarningError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + + cAlphaFieldNames(4) + " specifies " + cNumericFieldNames(4) + + ", but Space Volume = 0. 0 Ventilation will result."); + } + } else { + ShowSevereError(state, + format("{}{}=\"{}\", invalid ACH (air changes per hour) specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + thisVentilation.Name, + rNumericArgs(5))); + ErrorsFound = true; + } + } + if (lNumericFieldBlanks(4)) { + ShowWarningError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + + cAlphaFieldNames(4) + " specifies " + cNumericFieldNames(4) + + ", but that field is blank. 0 Ventilation will result."); + } + break; + + default: + if (Item1 == 1) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + + "\", invalid calculation method=" + cAlphaArgs(4)); + ErrorsFound = true; + } + } + + if (cAlphaArgs(5).empty()) { + thisVentilation.FanType = DataHeatBalance::VentilationType::Natural; + } else { + thisVentilation.FanType = static_cast(getEnumerationValue(ventilationTypeNamesUC, cAlphaArgs(5))); + if (thisVentilation.FanType == VentilationType::Invalid) { + ShowSevereError(state, + format(R"({}{}="{}". invalid {}="{}".)", + RoutineName, + cCurrentModuleObject, + thisVentilation.Name, + cAlphaFieldNames(5), + cAlphaArgs(5))); + ErrorsFound = true; + } + } + + thisVentilation.FanPressure = rNumericArgs(5); + if (thisVentilation.FanPressure < 0.0) { + if (Item1 == 1) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + + cNumericFieldNames(5) + " must be >=0"); + ErrorsFound = true; + } + } + + thisVentilation.FanEfficiency = rNumericArgs(6); + if ((thisVentilation.FanEfficiency <= 0.0) || (thisVentilation.FanEfficiency > 1.0)) { + if (Item1 == 1) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\"," + + cNumericFieldNames(6) + " must be in range >0 and <= 1"); + ErrorsFound = true; + } + } + + // Override any user input for cases where natural ventilation is being used + if (thisVentilation.FanType == DataHeatBalance::VentilationType::Natural) { + thisVentilation.FanPressure = 0.0; + thisVentilation.FanEfficiency = 1.0; + } + + thisVentilation.ConstantTermCoef = !lNumericFieldBlanks(7) ? rNumericArgs(7) : 1.0; + thisVentilation.TemperatureTermCoef = !lNumericFieldBlanks(8) ? rNumericArgs(8) : 0.0; + thisVentilation.VelocityTermCoef = !lNumericFieldBlanks(9) ? rNumericArgs(9) : 0.0; + thisVentilation.VelocitySQTermCoef = !lNumericFieldBlanks(10) ? rNumericArgs(10) : 0.0; + + if (thisVentilation.ConstantTermCoef == 0.0 && thisVentilation.TemperatureTermCoef == 0.0 && + thisVentilation.VelocityTermCoef == 0.0 && thisVentilation.VelocitySQTermCoef == 0.0) { + if (Item1 == 1) { + ShowWarningError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", in " + cAlphaFieldNames(2) + + "=\"" + cAlphaArgs(2) + "\"."); + ShowContinueError(state, "Ventilation Coefficients are all zero. No Ventilation will be reported."); + } + } + + if (!lNumericFieldBlanks(11)) { + thisVentilation.MinIndoorTemperature = rNumericArgs(11); + } else { + thisVentilation.MinIndoorTemperature = -VentilTempLimit; + } + // Ventilation(Loop)%MinIndoorTemperature = rNumericArgs(11) + if ((thisVentilation.MinIndoorTemperature < -VentilTempLimit) || (thisVentilation.MinIndoorTemperature > VentilTempLimit)) { + if (Item1 == 1) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" must have " + + cNumericFieldNames(11) + " between -100C and 100C."); + ShowContinueError(state, format("...value entered=[{:.2R}].", rNumericArgs(11))); + ErrorsFound = true; + } + } + + thisVentilation.MinIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(6)); + if (thisVentilation.MinIndoorTempSchedPtr > 0) { + if (Item1 == 1) { + if (!lNumericFieldBlanks(11)) + ShowWarningError(state, + std::string{RoutineName} + + "The Minimum Indoor Temperature value and schedule are provided. The scheduled temperature will " + "be used in the " + + cCurrentModuleObject + " object = " + cAlphaArgs(1)); + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisVentilation.MinIndoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + + " must have a minimum indoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(6)); + ErrorsFound = true; + } + } + } + if (thisVentilation.MinIndoorTempSchedPtr == 0 && lNumericFieldBlanks(11) && (!lAlphaFieldBlanks(6))) { + if (Item1 == 1) { + ShowWarningError( + state, + format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", + RoutineName, + cNumericFieldNames(11), + -VentilTempLimit)); + ShowContinueError(state, + "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + } + // Check Minimum indoor temperature value and schedule fields + if (!lNumericFieldBlanks(11) && (!cAlphaArgs(6).empty() && thisVentilation.MinIndoorTempSchedPtr == 0)) { + if (Item1 == 1) { + ShowWarningError(state, + format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", + RoutineName, + cAlphaFieldNames(6), + cAlphaArgs(6), + rNumericArgs(11))); + ShowContinueError(state, + "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + } + + thisVentilation.MaxIndoorTemperature = !lNumericFieldBlanks(12) ? rNumericArgs(12) : VentilTempLimit; + if ((thisVentilation.MaxIndoorTemperature < -VentilTempLimit) || (thisVentilation.MaxIndoorTemperature > VentilTempLimit)) { + if (Item1 == 1) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + + " must have a maximum indoor temperature between -100C and 100C"); + ErrorsFound = true; + } + } + + thisVentilation.MaxIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(7)); + if (thisVentilation.MaxIndoorTempSchedPtr > 0) { + if (Item1 == 1) { + if (!lNumericFieldBlanks(12)) + ShowWarningError(state, + std::string{RoutineName} + + "The Maximum Indoor Temperature value and schedule are provided. The scheduled temperature will " + "be used in the " + + cCurrentModuleObject + " object = " + cAlphaArgs(1)); + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisVentilation.MaxIndoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { + ShowSevereError( + state, + cCurrentModuleObject + " = " + cAlphaArgs(1) + + " must have a maximum indoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(7)); + ErrorsFound = true; + } + } + } + if (thisVentilation.MaxIndoorTempSchedPtr == 0 && lNumericFieldBlanks(12) && (!lAlphaFieldBlanks(7))) { + if (Item1 == 1) { + ShowWarningError( + state, + format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", + RoutineName, + cNumericFieldNames(12), + VentilTempLimit)); + ShowContinueError(state, + "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + } + // Check Maximum indoor temperature value and schedule fields + if (!lNumericFieldBlanks(12) && ((!lAlphaFieldBlanks(7)) && thisVentilation.MaxIndoorTempSchedPtr == 0)) { + if (Item1 == 1) { + ShowWarningError(state, + format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", + RoutineName, + cAlphaFieldNames(7), + cAlphaArgs(7), + rNumericArgs(12))); + ShowContinueError(state, + "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + } + + thisVentilation.DelTemperature = !lNumericFieldBlanks(13) ? rNumericArgs(13) : -VentilTempLimit; + // Ventilation(Loop)%DelTemperature = rNumericArgs(13) ! 3/12/03 Negative del temp now allowed COP + + thisVentilation.DeltaTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(8)); + if (thisVentilation.DeltaTempSchedPtr > 0) { + if (Item1 == 1) { + if (!lNumericFieldBlanks(13)) + ShowWarningError( + state, + std::string{RoutineName} + + "The Delta Temperature value and schedule are provided. The scheduled temperature will be used in the " + + cCurrentModuleObject + " object = " + cAlphaArgs(1)); + // Check min value in the schedule to ensure both values are within the range + if (GetScheduleMinValue(state, thisVentilation.DeltaTempSchedPtr) < -VentilTempLimit) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + + " must have a delta temperature equal to or above -100C defined in the schedule = " + cAlphaArgs(8)); + ErrorsFound = true; + } + } + } + if (thisVentilation.DeltaTempSchedPtr == 0 && lNumericFieldBlanks(13) && (!lAlphaFieldBlanks(8))) { + if (Item1 == 1) { + ShowWarningError( + state, + format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", + RoutineName, + cNumericFieldNames(13), + VentilTempLimit)); + ShowContinueError(state, + "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + } + + if (!lNumericFieldBlanks(13) && ((!lAlphaFieldBlanks(8)) && thisVentilation.DeltaTempSchedPtr == 0)) { + if (Item1 == 1) { + ShowWarningError(state, + format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", + RoutineName, + cAlphaFieldNames(8), + cAlphaArgs(8), + rNumericArgs(13))); + ShowContinueError(state, + "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + } + + thisVentilation.MinOutdoorTemperature = !lNumericFieldBlanks(14) ? rNumericArgs(14) : -VentilTempLimit; + if ((thisVentilation.MinOutdoorTemperature < -VentilTempLimit) || (thisVentilation.MinOutdoorTemperature > VentilTempLimit)) { + if (Item1 == 1) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + " must have " + + cNumericFieldNames(14) + " between -100C and 100C"); + ErrorsFound = true; + } + } + + thisVentilation.MinOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(9)); + if (Item1 == 1) { + if (thisVentilation.MinOutdoorTempSchedPtr > 0) { + if (!lNumericFieldBlanks(14)) + ShowWarningError(state, + std::string{RoutineName} + + "The Minimum Outdoor Temperature value and schedule are provided. The scheduled temperature will be " + "used in the " + + cCurrentModuleObject + " object = " + cAlphaArgs(1)); + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisVentilation.MinOutdoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + + " must have a minimum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(9)); + ErrorsFound = true; + } + } + if (thisVentilation.MinOutdoorTempSchedPtr == 0 && lNumericFieldBlanks(14) && (!lAlphaFieldBlanks(9))) { + ShowWarningError(state, + format("{}Minimum Outdoor Temperature: the value field is blank and schedule field is invalid. The " + "default value will be used ({:.1R}) ", + RoutineName, + -VentilTempLimit)); + ShowContinueError(state, + "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + // Check Minimum outdoor temperature value and schedule fields + if (!lNumericFieldBlanks(14) && ((!lAlphaFieldBlanks(9)) && thisVentilation.MinOutdoorTempSchedPtr == 0)) { + ShowWarningError(state, + format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", + RoutineName, + cAlphaFieldNames(9), + cAlphaArgs(9), + rNumericArgs(14))); + ShowContinueError(state, + "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + } + + thisVentilation.MaxOutdoorTemperature = !lNumericFieldBlanks(15) ? rNumericArgs(15) : VentilTempLimit; + if (Item1 == 1) { + if ((thisVentilation.MaxOutdoorTemperature < -VentilTempLimit) || (thisVentilation.MaxOutdoorTemperature > VentilTempLimit)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + " must have a " + + cNumericFieldNames(15) + " between -100C and 100C"); + ErrorsFound = true; + } + } + + thisVentilation.MaxOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(10)); + if (Item1 == 1) { + if (thisVentilation.MaxOutdoorTempSchedPtr > 0) { + if (!lNumericFieldBlanks(15)) + ShowWarningError(state, + std::string{RoutineName} + + "The Maximum Outdoor Temperature value and schedule are provided. The scheduled temperature will be " + "used in the " + + cCurrentModuleObject + " object = " + cAlphaArgs(1)); + if (!CheckScheduleValueMinMax(state, thisVentilation.MaxOutdoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + + " must have a maximum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(10)); + ErrorsFound = true; + } + } + if (thisVentilation.MaxOutdoorTempSchedPtr == 0 && lNumericFieldBlanks(15) && (!lAlphaFieldBlanks(10))) { + ShowWarningError( + state, + format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", + RoutineName, + cNumericFieldNames(15), + VentilTempLimit)); + ShowContinueError(state, + "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + // Check Maximum outdoor temperature value and schedule fields + if (!lNumericFieldBlanks(15) && ((!lAlphaFieldBlanks(10)) && thisVentilation.MaxOutdoorTempSchedPtr == 0)) { + ShowWarningError(state, + format("{}{} = {}is invalid. The constant value will be used at {:.1R} degrees C ", + RoutineName, + cAlphaFieldNames(10), + cAlphaArgs(10), + rNumericArgs(15))); + ShowContinueError(state, + "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + } + + thisVentilation.MaxWindSpeed = !lNumericFieldBlanks(16) ? rNumericArgs(16) : VentilWSLimit; + if (Item1 == 1) { + if ((thisVentilation.MaxWindSpeed < -VentilWSLimit) || (thisVentilation.MaxWindSpeed > VentilWSLimit)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + + " must have a maximum wind speed between -40 m/s and 40 m/s"); + ErrorsFound = true; + } + } + + // Report variables should be added for individual VENTILATION objects, in addition to zone totals below + + if (thisVentilation.ZonePtr > 0) { + if (RepVarSet(thisVentilation.ZonePtr) && !thisZone.zoneOAQuadratureSum) { + RepVarSet(thisVentilation.ZonePtr) = false; + SetupOutputVariable(state, + "Zone Ventilation Sensible Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilHeatLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Sensible Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilHeatGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Latent Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilLatentLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Latent Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilLatentGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Total Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilTotalLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Total Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilTotalGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Current Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVdotCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Standard Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVdotStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Current Density Volume", + OutputProcessor::Unit::m3, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVolumeCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Standard Density Volume", + OutputProcessor::Unit::m3, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVolumeStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Mass", + OutputProcessor::Unit::kg, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilMass, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilMdot, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Air Change Rate", + OutputProcessor::Unit::ach, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilAirChangeRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Fan Electricity Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilFanElec, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name, + _, + "Electricity", + "Fans", + "Ventilation (simple)", + "Building", + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Air Inlet Temperature", + OutputProcessor::Unit::C, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilAirTemp, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + } + } + + if (state.dataGlobal->AnyEnergyManagementSystemInModel) { + SetupEMSActuator(state, + "Zone Ventilation", + thisVentilation.Name, + "Air Exchange Flow Rate", + "[m3/s]", + thisVentilation.EMSSimpleVentOn, + thisVentilation.EMSimpleVentFlowRate); + } + } + } + } + + if (numWindStackVentilationObjects > 0) { + cCurrentModuleObject = "ZoneVentilation:WindandStackOpenArea"; + for (int ventInputNum = 1; ventInputNum <= numWindStackVentilationObjects; ++ventInputNum) { + + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + ventInputNum, + cAlphaArgs, + NumAlpha, + rNumericArgs, + NumNumber, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + + auto &thisVentilationInput = ventilationWindStackObjects(ventInputNum); + for (int Item1 = 1; Item1 <= thisVentilationInput.numOfSpaces; ++Item1) { + ++ventilationNum; + auto &thisVentilation = state.dataHeatBal->Ventilation(ventilationNum); + thisVentilation.Name = thisVentilationInput.names(Item1); + thisVentilation.spaceIndex = thisVentilationInput.spaceNums(Item1); + auto &thisSpace = state.dataHeatBal->space(thisVentilation.spaceIndex); + thisVentilation.ZonePtr = thisSpace.zoneNum; + auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); + + thisVentilation.ModelType = DataHeatBalance::VentilationModelType::WindAndStack; + + thisVentilation.OpenArea = rNumericArgs(1); + if (thisVentilation.OpenArea < 0.0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cNumericFieldNames(1) + + " must be positive."); + ErrorsFound = true; + } + + if (lAlphaFieldBlanks(3)) { + thisVentilation.OpenAreaSchedPtr = DataGlobalConstants::ScheduleAlwaysOn; + } else { + thisVentilation.OpenAreaSchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); + if (thisVentilation.OpenAreaSchedPtr == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); + ErrorsFound = true; + } + } + + thisVentilation.OpenEff = rNumericArgs(2); + if (thisVentilation.OpenEff != DataGlobalConstants::AutoCalculate && + (thisVentilation.OpenEff < 0.0 || thisVentilation.OpenEff > 1.0)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cNumericFieldNames(2) + + " must be between 0 and 1."); + ErrorsFound = true; + } + + thisVentilation.EffAngle = rNumericArgs(3); + if (thisVentilation.EffAngle < 0.0 || thisVentilation.EffAngle >= 360.0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cNumericFieldNames(3) + + " must be between 0 and 360."); + ErrorsFound = true; + } + + thisVentilation.DH = rNumericArgs(4); + if (thisVentilation.DH < 0.0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cNumericFieldNames(4) + + " must be positive."); + ErrorsFound = true; + } + + thisVentilation.DiscCoef = rNumericArgs(5); + if (thisVentilation.DiscCoef != DataGlobalConstants::AutoCalculate && + (thisVentilation.DiscCoef < 0.0 || thisVentilation.DiscCoef > 1.0)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cNumericFieldNames(5) + + " must be between 0 and 1."); + ErrorsFound = true; + } + + if (!lNumericFieldBlanks(6)) { + thisVentilation.MinIndoorTemperature = rNumericArgs(6); + } else { + thisVentilation.MinIndoorTemperature = -VentilTempLimit; + } + if ((thisVentilation.MinIndoorTemperature < -VentilTempLimit) || (thisVentilation.MinIndoorTemperature > VentilTempLimit)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + " must have " + + cNumericFieldNames(6) + " between -100C and 100C"); + ErrorsFound = true; + } + + thisVentilation.MinIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(4)); + if (thisVentilation.MinIndoorTempSchedPtr > 0) { + if (!lNumericFieldBlanks(6)) + ShowWarningError( + state, + std::string{RoutineName} + + "The Minimum Indoor Temperature value and schedule are provided. The scheduled temperature will be used in the " + + cCurrentModuleObject + " object = " + cAlphaArgs(1)); + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisVentilation.MinIndoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + + " must have a minimum indoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(4)); + ErrorsFound = true; + } + } + if (thisVentilation.MinIndoorTempSchedPtr == 0 && lNumericFieldBlanks(6) && (!lAlphaFieldBlanks(4))) { + ShowWarningError(state, + format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", + RoutineName, + cNumericFieldNames(6), + -VentilTempLimit)); + ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + // Check Minimum indoor temperature value and schedule fields + if (!lNumericFieldBlanks(6) && (!cAlphaArgs(4).empty() && thisVentilation.MinIndoorTempSchedPtr == 0)) { + ShowWarningError(state, + format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", + RoutineName, + cAlphaFieldNames(4), + cAlphaArgs(4), + rNumericArgs(11))); + ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + + if (!lNumericFieldBlanks(7)) { + thisVentilation.MaxIndoorTemperature = rNumericArgs(7); + } else { + thisVentilation.MaxIndoorTemperature = VentilTempLimit; + } + if ((thisVentilation.MaxIndoorTemperature < -VentilTempLimit) || (thisVentilation.MaxIndoorTemperature > VentilTempLimit)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + + "\" must have a maximum indoor temperature between -100C and 100C"); + ErrorsFound = true; + } + + thisVentilation.MaxIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(5)); + if (thisVentilation.MaxIndoorTempSchedPtr > 0) { + if (!lNumericFieldBlanks(7)) + ShowWarningError( + state, + std::string{RoutineName} + + "The Maximum Indoor Temperature value and schedule are provided. The scheduled temperature will be used in the " + + cCurrentModuleObject + " object = " + cAlphaArgs(1)); + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisVentilation.MaxIndoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { + ShowSevereError( + state, + cCurrentModuleObject + " = " + cAlphaArgs(1) + + " must have a maximum indoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(5)); + ErrorsFound = true; + } + } + if (thisVentilation.MaxIndoorTempSchedPtr == 0 && lNumericFieldBlanks(7) && (!lAlphaFieldBlanks(5))) { + ShowWarningError(state, + format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", + RoutineName, + cNumericFieldNames(7), + VentilTempLimit)); + ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + // Check Maximum indoor temperature value and schedule fields + if (!lNumericFieldBlanks(7) && ((!lAlphaFieldBlanks(5)) && thisVentilation.MaxIndoorTempSchedPtr == 0)) { + ShowWarningError(state, + format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", + RoutineName, + cAlphaFieldNames(7), + cAlphaArgs(5), + rNumericArgs(7))); + ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + + if (!lNumericFieldBlanks(8)) { + thisVentilation.DelTemperature = rNumericArgs(8); + } else { + thisVentilation.DelTemperature = -VentilTempLimit; + } + + thisVentilation.DeltaTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(6)); + if (thisVentilation.DeltaTempSchedPtr > 0) { + if (!lNumericFieldBlanks(8)) + ShowWarningError(state, + std::string{RoutineName} + + "The Delta Temperature value and schedule are provided. The scheduled temperature will be used in the " + + cCurrentModuleObject + " object = " + cAlphaArgs(1)); + // Check min value in the schedule to ensure both values are within the range + if (GetScheduleMinValue(state, thisVentilation.DeltaTempSchedPtr) < -VentilTempLimit) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + + " must have a delta temperature equal to or above -100C defined in the schedule = " + cAlphaArgs(8)); + ErrorsFound = true; + } + } + if (thisVentilation.DeltaTempSchedPtr == 0 && lNumericFieldBlanks(8) && (!lAlphaFieldBlanks(6))) { + ShowWarningError(state, + format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", + RoutineName, + cNumericFieldNames(8), + VentilTempLimit)); + ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + if (!lNumericFieldBlanks(8) && ((!lAlphaFieldBlanks(6)) && thisVentilation.DeltaTempSchedPtr == 0)) { + ShowWarningError(state, + format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", + RoutineName, + cAlphaFieldNames(6), + cAlphaArgs(6), + rNumericArgs(8))); + ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + + thisVentilation.MinOutdoorTemperature = !lNumericFieldBlanks(9) ? rNumericArgs(9) : -VentilTempLimit; + if ((thisVentilation.MinOutdoorTemperature < -VentilTempLimit) || (thisVentilation.MinOutdoorTemperature > VentilTempLimit)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + " must have " + + cNumericFieldNames(9) + " between -100C and 100C"); + ErrorsFound = true; + } + + thisVentilation.MinOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(7)); + if (thisVentilation.MinOutdoorTempSchedPtr > 0) { + if (!lNumericFieldBlanks(9)) + ShowWarningError(state, + std::string{RoutineName} + + "The Minimum Outdoor Temperature value and schedule are provided. The scheduled temperature will be " + "used in the " + + cCurrentModuleObject + " object = " + cAlphaArgs(1)); + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisVentilation.MinOutdoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + + " must have a minimum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(7)); + ErrorsFound = true; + } + } + if (thisVentilation.MinOutdoorTempSchedPtr == 0 && lNumericFieldBlanks(9) && (!lAlphaFieldBlanks(7))) { + ShowWarningError( + state, + format("{}Minimum Outdoor Temperature: the value field is blank and schedule field is invalid. The default value " + "will be used ({:.1R}) ", + RoutineName, + -VentilTempLimit)); + ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + // Check Minimum outdoor temperature value and schedule fields + if (!lNumericFieldBlanks(9) && ((!lAlphaFieldBlanks(7)) && thisVentilation.MinOutdoorTempSchedPtr == 0)) { + ShowWarningError(state, + format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", + RoutineName, + cAlphaFieldNames(7), + cAlphaArgs(7), + rNumericArgs(14))); + ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + + thisVentilation.MaxOutdoorTemperature = !lNumericFieldBlanks(10) ? rNumericArgs(10) : VentilTempLimit; + if ((thisVentilation.MaxOutdoorTemperature < -VentilTempLimit) || (thisVentilation.MaxOutdoorTemperature > VentilTempLimit)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + " must have a " + + cNumericFieldNames(10) + " between -100C and 100C"); + ErrorsFound = true; + } + + thisVentilation.MaxOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(8)); + if (thisVentilation.MaxOutdoorTempSchedPtr > 0) { + if (!lNumericFieldBlanks(10)) + ShowWarningError(state, + std::string{RoutineName} + + "The Maximum Outdoor Temperature value and schedule are provided. The scheduled temperature will be " + "used in the " + + cCurrentModuleObject + " object = " + cAlphaArgs(1)); + if (!CheckScheduleValueMinMax(state, thisVentilation.MaxOutdoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + + " must have a maximum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(8)); + ErrorsFound = true; + } + } + if (thisVentilation.MaxOutdoorTempSchedPtr == 0 && lNumericFieldBlanks(10) && (!lAlphaFieldBlanks(8))) { + ShowWarningError(state, + format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", + RoutineName, + cNumericFieldNames(10), + VentilTempLimit)); + ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + // Check Maximum outdoor temperature value and schedule fields + if (!lNumericFieldBlanks(10) && ((!lAlphaFieldBlanks(8)) && thisVentilation.MaxOutdoorTempSchedPtr == 0)) { + ShowWarningError(state, + format("{}{} = {}is invalid. The constant value will be used at {:.1R} degrees C ", + RoutineName, + cAlphaFieldNames(8), + cAlphaArgs(8), + rNumericArgs(10))); + ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + + thisVentilation.MaxWindSpeed = !lNumericFieldBlanks(11) ? rNumericArgs(11) : VentilWSLimit; + if ((thisVentilation.MaxWindSpeed < -VentilWSLimit) || (thisVentilation.MaxWindSpeed > VentilWSLimit)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + + " must have a maximum wind speed between 0 m/s and 40 m/s"); + ErrorsFound = true; + } + + // Report variables should be added for individual VENTILATION objects, in addition to zone totals below + + if (thisVentilation.ZonePtr > 0) { + if (RepVarSet(thisVentilation.ZonePtr) && !thisZone.zoneOAQuadratureSum) { + RepVarSet(thisVentilation.ZonePtr) = false; + SetupOutputVariable(state, + "Zone Ventilation Sensible Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilHeatLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Sensible Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilHeatGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Latent Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilLatentLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Latent Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilLatentGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Total Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilTotalLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Total Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilTotalGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Current Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVdotCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Standard Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVdotStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Current Density Volume", + OutputProcessor::Unit::m3, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVolumeCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Standard Density Volume", + OutputProcessor::Unit::m3, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVolumeStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Mass", + OutputProcessor::Unit::kg, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilMass, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilMdot, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Air Change Rate", + OutputProcessor::Unit::ach, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilAirChangeRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Fan Electricity Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilFanElec, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + thisZone.Name, + _, + "Electricity", + "Fans", + "Ventilation (simple)", + "Building", + thisZone.Name); + SetupOutputVariable(state, + "Zone Ventilation Air Inlet Temperature", + OutputProcessor::Unit::C, + state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilAirTemp, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + } + } + + if (state.dataGlobal->AnyEnergyManagementSystemInModel) { + SetupEMSActuator(state, + "Zone Ventilation", + thisVentilation.Name, + "Air Exchange Flow Rate", + "[m3/s]", + thisVentilation.EMSSimpleVentOn, + thisVentilation.EMSimpleVentFlowRate); + } + } + } + } + + // Set up and process ZoneMixing and ZoneCrossMixing inputs + + RepVarSet = true; + + cCurrentModuleObject = "ZoneMixing"; + int numZoneMixingInputObjects = 0; + EPVector zoneMixingInputObjects; + InternalHeatGains::setupIHGZonesAndSpaces(state, + cCurrentModuleObject, + zoneMixingInputObjects, + numZoneMixingInputObjects, + state.dataHeatBal->TotMixing, + ErrorsFound, + zoneListNotAllowed); + + if (state.dataHeatBal->TotMixing > 0) { + cCurrentModuleObject = "ZoneMixing"; + state.dataHeatBal->Mixing.allocate(state.dataHeatBal->TotMixing); + int mixingNum = 0; + for (int mixingInputNum = 1; mixingInputNum <= numZoneMixingInputObjects; ++mixingInputNum) { + + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + mixingInputNum, + cAlphaArgs, + NumAlpha, + rNumericArgs, + NumNumber, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + + // Create one Mixing instance for every space associated with this input object + auto const &thisMixingInput = zoneMixingInputObjects(mixingInputNum); + for (int Item1 = 1; Item1 <= thisMixingInput.numOfSpaces; ++Item1) { + ++mixingNum; + auto &thisMixing = state.dataHeatBal->Mixing(mixingNum); + thisMixing.Name = thisMixingInput.names(Item1); + thisMixing.spaceIndex = thisMixingInput.spaceNums(Item1); + auto const &thisSpace = state.dataHeatBal->space(thisMixing.spaceIndex); + thisMixing.ZonePtr = thisSpace.zoneNum; + auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); + + if (lAlphaFieldBlanks(3)) { + thisMixing.SchedPtr = DataGlobalConstants::ScheduleAlwaysOn; + } else { + thisMixing.SchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); + if (thisMixing.SchedPtr == 0) { + ShowWarningError(state, + format("{}{}=\"{}\", invalid (not found) {}=\"{}\"", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(3), + cAlphaArgs(3))); + ErrorsFound = true; + } + } + + // Mixing equipment design level calculation method + AirflowSpec flow = static_cast(getEnumerationValue(airflowNamesUC, cAlphaArgs(4))); // NOLINT(modernize-use-auto) + switch (flow) { + case AirflowSpec::Flow: + case AirflowSpec::FlowPerZone: + thisMixing.DesignLevel = rNumericArgs(1); + if (lNumericFieldBlanks(1)) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(1))); + } else { + Real64 spaceFrac = 1.0; + if (!thisMixingInput.spaceListActive && (thisMixingInput.numOfSpaces > 1)) { + Real64 const zoneVolume = thisZone.Volume; + if (zoneVolume > 0.0) { + spaceFrac = thisSpace.Volume / zoneVolume; + } else { + ShowSevereError(state, std::string(RoutineName) + "Zone volume is zero when allocating Mixing to Spaces."); + ShowContinueError( + state, format("Occurs for {}=\"{}\" in Zone=\"{}\".", cCurrentModuleObject, thisMixingInput.Name, thisZone.Name)); + ErrorsFound = true; + } + } + + thisMixing.DesignLevel = rNumericArgs(1) * spaceFrac; + } + break; + + case AirflowSpec::FlowPerArea: + if (thisMixing.spaceIndex != 0) { + if (rNumericArgs(2) >= 0.0) { + thisMixing.DesignLevel = rNumericArgs(2) * thisSpace.floorArea; + if (thisMixing.spaceIndex > 0) { + if (thisZone.FloorArea <= 0.0) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but Space Floor Area = 0. 0 Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(2))); + } + } + } else { + ShowSevereError(state, + format("{}{}=\"{}\", invalid flow/area specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + rNumericArgs(2))); + ErrorsFound = true; + } + } + if (lNumericFieldBlanks(2)) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(2))); + } + break; + + case AirflowSpec::FlowPerPerson: + if (thisMixing.spaceIndex != 0) { + if (rNumericArgs(3) >= 0.0) { + thisMixing.DesignLevel = rNumericArgs(3) * thisSpace.totOccupants; + if (thisSpace.totOccupants <= 0.0) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but Space Total Occupants = 0. 0 Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(3))); + } + } else { + ShowSevereError(state, + format("{}{}=\"{}\", invalid flow/person specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + rNumericArgs(3))); + ErrorsFound = true; + } + } + if (lNumericFieldBlanks(3)) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(3))); + } + break; + + case AirflowSpec::AirChanges: + if (thisMixing.spaceIndex != 0) { + if (rNumericArgs(4) >= 0.0) { + thisMixing.DesignLevel = rNumericArgs(4) * thisSpace.Volume / DataGlobalConstants::SecInHour; + if (thisSpace.Volume <= 0.0) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but Space Volume = 0. 0 Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(4))); + } + } else { + ShowSevereError(state, + format("{}{}=\"{}\", invalid ACH (air changes per hour) specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + rNumericArgs(4))); + ErrorsFound = true; + } + } + if (lNumericFieldBlanks(4)) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(4))); + } + break; + + default: + ShowSevereError( + state, format("{}{}=\"{}\", invalid calculation method={}", RoutineName, cCurrentModuleObject, cAlphaArgs(1), cAlphaArgs(4))); + ErrorsFound = true; + } + + thisMixing.fromSpaceIndex = UtilityRoutines::FindItemInList(cAlphaArgs(5), state.dataHeatBal->space); + if (thisMixing.fromSpaceIndex == 0) { + thisMixing.FromZone = UtilityRoutines::FindItemInList(cAlphaArgs(5), state.dataHeatBal->Zone); + } else { + thisMixing.FromZone = state.dataHeatBal->space(thisMixing.fromSpaceIndex).zoneNum; + } + if ((thisMixing.FromZone == 0) && (thisMixing.fromSpaceIndex == 0)) { + ShowSevereError(state, + std::string{RoutineName} + cAlphaFieldNames(5) + " not found=" + cAlphaArgs(5) + " for " + cCurrentModuleObject + + '=' + cAlphaArgs(1)); + ErrorsFound = true; + } + thisMixing.DeltaTemperature = rNumericArgs(5); + + if (NumAlpha > 5) { + thisMixing.DeltaTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(6)); + if (thisMixing.DeltaTempSchedPtr > 0) { + if (!lNumericFieldBlanks(5)) + ShowWarningError( + state, + std::string{RoutineName} + + "The Delta Temperature value and schedule are provided. The scheduled temperature will be used in the " + + cCurrentModuleObject + " object = " + cAlphaArgs(1)); + if (GetScheduleMinValue(state, thisMixing.DeltaTempSchedPtr) < -MixingTempLimit) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + + " must have a delta temperature equal to or above -100C defined in the schedule = " + cAlphaArgs(6)); + ErrorsFound = true; + } + } + } + if (thisMixing.DeltaTempSchedPtr == 0 && lNumericFieldBlanks(5) && (!lAlphaFieldBlanks(6))) { + ShowWarningError(state, + format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", + RoutineName, + cNumericFieldNames(5), + rNumericArgs(5))); + ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + if (!lNumericFieldBlanks(5) && ((!lAlphaFieldBlanks(6)) && thisMixing.DeltaTempSchedPtr == 0)) { + ShowWarningError(state, + format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", + RoutineName, + cAlphaFieldNames(6), + cAlphaArgs(6), + rNumericArgs(5))); + ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + + if (NumAlpha > 6) { + thisMixing.MinIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(7)); + if (thisMixing.MinIndoorTempSchedPtr == 0) { + if ((!lAlphaFieldBlanks(7))) { + ShowSevereError(state, + std::string{RoutineName} + cAlphaFieldNames(7) + " not found=" + cAlphaArgs(7) + " for " + + cCurrentModuleObject + '=' + cAlphaArgs(1)); + ErrorsFound = true; + } + } + if (thisMixing.MinIndoorTempSchedPtr > 0) { + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisMixing.MinIndoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + + " must have a minimum zone temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(7)); + ErrorsFound = true; + } + } + } + + if (NumAlpha > 7) { + thisMixing.MaxIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(8)); + if (thisMixing.MaxIndoorTempSchedPtr == 0) { + if ((!lAlphaFieldBlanks(8))) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cAlphaFieldNames(8) + + " not found=\"" + cAlphaArgs(8) + "\"."); + ErrorsFound = true; + } + } + if (thisMixing.MaxIndoorTempSchedPtr > 0) { + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisMixing.MaxIndoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + + "\" must have a maximum zone temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(8)); + ErrorsFound = true; + } + } + } + + if (NumAlpha > 8) { + thisMixing.MinSourceTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(9)); + if (thisMixing.MinSourceTempSchedPtr == 0) { + if ((!lAlphaFieldBlanks(9))) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cAlphaFieldNames(9) + + " not found=\"" + cAlphaArgs(9) + "\"."); + ErrorsFound = true; + } + } + if (thisMixing.MinSourceTempSchedPtr > 0) { + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisMixing.MinSourceTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + + "\" must have a minimum source temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(9)); + ErrorsFound = true; + } + } + } + + if (NumAlpha > 9) { + thisMixing.MaxSourceTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(10)); + if (thisMixing.MaxSourceTempSchedPtr == 0) { + if ((!lAlphaFieldBlanks(10))) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cAlphaFieldNames(10) + + " not found=\"" + cAlphaArgs(10) + "\"."); + ErrorsFound = true; + } + } + if (thisMixing.MaxSourceTempSchedPtr > 0) { + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisMixing.MaxSourceTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " statement =\"" + cAlphaArgs(1) + + "\" must have a maximum source temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(10)); + ErrorsFound = true; + } + } + } + + if (NumAlpha > 10) { + thisMixing.MinOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(11)); + if (thisMixing.MinOutdoorTempSchedPtr == 0) { + if ((!lAlphaFieldBlanks(11))) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cAlphaFieldNames(11) + + " not found=\"" + cAlphaArgs(11) + "\"."); + ErrorsFound = true; + } + } + if (thisMixing.MinOutdoorTempSchedPtr > 0) { + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisMixing.MinOutdoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " =\"" + cAlphaArgs(1) + + "\" must have a minimum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(11)); + ErrorsFound = true; + } + } + } + + if (NumAlpha > 11) { + thisMixing.MaxOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(12)); + if (thisMixing.MaxOutdoorTempSchedPtr == 0) { + if ((!lAlphaFieldBlanks(12))) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cAlphaFieldNames(12) + + " not found=\"" + cAlphaArgs(12) + "\"."); + ErrorsFound = true; + } + } + if (thisMixing.MaxOutdoorTempSchedPtr > 0) { + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisMixing.MaxOutdoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " =\"" + cAlphaArgs(1) + + "\" must have a maximum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(12)); + ErrorsFound = true; + } + } + } + + if (thisMixing.ZonePtr > 0) { + if (RepVarSet(thisMixing.ZonePtr)) { + RepVarSet(thisMixing.ZonePtr) = false; + SetupOutputVariable(state, + "Zone Mixing Volume", + OutputProcessor::Unit::m3, + state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixVolume, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); + SetupOutputVariable(state, + "Zone Mixing Current Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixVdotCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); + SetupOutputVariable(state, + "Zone Mixing Standard Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixVdotStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); + SetupOutputVariable(state, + "Zone Mixing Mass", + OutputProcessor::Unit::kg, + state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixMass, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); + SetupOutputVariable(state, + "Zone Mixing Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixMdot, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); + SetupOutputVariable(state, + "Zone Mixing Sensible Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixHeatLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); + SetupOutputVariable(state, + "Zone Mixing Sensible Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixHeatGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); + SetupOutputVariable(state, + "Zone Mixing Latent Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixLatentLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); + SetupOutputVariable(state, + "Zone Mixing Latent Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixLatentGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); + SetupOutputVariable(state, + "Zone Mixing Total Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixTotalLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); + SetupOutputVariable(state, + "Zone Mixing Total Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixTotalGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); + } + } + if (state.dataGlobal->AnyEnergyManagementSystemInModel) { + SetupEMSActuator(state, + "ZoneMixing", + thisMixing.Name, + "Air Exchange Flow Rate", + "[m3/s]", + thisMixing.EMSSimpleMixingOn, + thisMixing.EMSimpleMixingFlowRate); + } + } + } + } + + // allocate MassConservation + state.dataHeatBal->MassConservation.allocate(state.dataGlobal->NumOfZones); + + // added by BAN, 02/14 + if (state.dataHeatBal->TotMixing > 0) { + ZoneMixingNum.allocate(state.dataHeatBal->TotMixing); + // get source zones mixing objects index + for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + int SourceCount = 0; + for (int Loop = 1; Loop <= state.dataHeatBal->TotMixing; ++Loop) { + if (ZoneNum == state.dataHeatBal->Mixing(Loop).FromZone) { + SourceCount += 1; + ZoneMixingNum(SourceCount) = Loop; + } + } + // save mixing objects index for zones which serve as a source zone + state.dataHeatBal->MassConservation(ZoneNum).NumSourceZonesMixingObject = SourceCount; + if (SourceCount > 0) { + state.dataHeatBal->MassConservation(ZoneNum).ZoneMixingSourcesPtr.allocate(SourceCount); + for (int Loop = 1; Loop <= SourceCount; ++Loop) { + state.dataHeatBal->MassConservation(ZoneNum).ZoneMixingSourcesPtr(Loop) = ZoneMixingNum(Loop); + } + } + } + + // check zones which are used only as a source zones + for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + for (int Loop = 1; Loop <= state.dataHeatBal->TotMixing; ++Loop) { + if (ZoneNum != state.dataHeatBal->Mixing(Loop).FromZone) continue; + state.dataHeatBal->MassConservation(ZoneNum).IsOnlySourceZone = true; + for (int Loop1 = 1; Loop1 <= state.dataHeatBal->TotMixing; ++Loop1) { + if (ZoneNum == state.dataHeatBal->Mixing(Loop1).ZonePtr) { + state.dataHeatBal->MassConservation(ZoneNum).IsOnlySourceZone = false; + break; + } + } + } + } + // get receiving zones mixing objects index + ZoneMixingNum = 0; + for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + int ReceivingCount = 0; + for (int Loop = 1; Loop <= state.dataHeatBal->TotMixing; ++Loop) { + if (ZoneNum == state.dataHeatBal->Mixing(Loop).ZonePtr) { + ReceivingCount += 1; + ZoneMixingNum(ReceivingCount) = Loop; + } + } + // save mixing objects index for zones which serve as a receiving zone + state.dataHeatBal->MassConservation(ZoneNum).NumReceivingZonesMixingObject = ReceivingCount; + if (ReceivingCount > 0) { + state.dataHeatBal->MassConservation(ZoneNum).ZoneMixingReceivingPtr.allocate(ReceivingCount); + state.dataHeatBal->MassConservation(ZoneNum).ZoneMixingReceivingFr.allocate(ReceivingCount); + for (int Loop = 1; Loop <= ReceivingCount; ++Loop) { + state.dataHeatBal->MassConservation(ZoneNum).ZoneMixingReceivingPtr(Loop) = ZoneMixingNum(Loop); + } + } + // flag zones used as both source and receiving zone + if (state.dataHeatBal->MassConservation(ZoneNum).NumSourceZonesMixingObject > 0 && + state.dataHeatBal->MassConservation(ZoneNum).NumReceivingZonesMixingObject > 0) { + state.dataHeatBal->MassConservation(ZoneNum).IsSourceAndReceivingZone = true; + } + } + if (allocated(ZoneMixingNum)) ZoneMixingNum.deallocate(); + } + + // zone mass conservation calculation order starts with receiving zones + // and then proceeds to source zones + int Loop2 = 0; + for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + if (!state.dataHeatBal->MassConservation(ZoneNum).IsOnlySourceZone && + !state.dataHeatBal->MassConservation(ZoneNum).IsSourceAndReceivingZone) { + Loop2 += 1; + state.dataHeatBalFanSys->ZoneReOrder(Loop2) = ZoneNum; + } + } + for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + if (state.dataHeatBal->MassConservation(ZoneNum).IsSourceAndReceivingZone) { + Loop2 += 1; + state.dataHeatBalFanSys->ZoneReOrder(Loop2) = ZoneNum; + } + } + for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + if (state.dataHeatBal->MassConservation(ZoneNum).IsOnlySourceZone) { + Loop2 += 1; + state.dataHeatBalFanSys->ZoneReOrder(Loop2) = ZoneNum; + } + } + + cCurrentModuleObject = "ZoneCrossMixing"; + int numZoneCrossMixingInputObjects = 0; + int totZoneCrossMixing = 0; // Total ZoneCrossMixing instances after expansion to spaces + EPVector zoneCrossMixingInputObjects; + InternalHeatGains::setupIHGZonesAndSpaces(state, + cCurrentModuleObject, + zoneCrossMixingInputObjects, + numZoneCrossMixingInputObjects, + totZoneCrossMixing, + ErrorsFound, + zoneListNotAllowed); + state.dataHeatBal->TotCrossMixing = totZoneCrossMixing + state.dataHeatBal->airBoundaryMixing.size(); + + if (state.dataHeatBal->TotCrossMixing > 0) { + cCurrentModuleObject = "ZoneCrossMixing"; + state.dataHeatBal->CrossMixing.allocate(state.dataHeatBal->TotCrossMixing); + + int mixingNum = 0; + for (int mixingInputNum = 1; mixingInputNum <= numZoneCrossMixingInputObjects; ++mixingInputNum) { + + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + mixingInputNum, + cAlphaArgs, + NumAlpha, + rNumericArgs, + NumNumber, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + // Create one Mixing instance for every space associated with this input object + auto const &thisMixingInput = zoneCrossMixingInputObjects(mixingInputNum); + for (int Item1 = 1; Item1 <= thisMixingInput.numOfSpaces; ++Item1) { + ++mixingNum; + auto &thisMixing = state.dataHeatBal->CrossMixing(mixingNum); + thisMixing.Name = thisMixingInput.names(Item1); + thisMixing.spaceIndex = thisMixingInput.spaceNums(Item1); + auto const &thisSpace = state.dataHeatBal->space(thisMixing.spaceIndex); + thisMixing.ZonePtr = thisSpace.zoneNum; + auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); + + if (lAlphaFieldBlanks(3)) { + thisMixing.SchedPtr = DataGlobalConstants::ScheduleAlwaysOn; + } else { + thisMixing.SchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); + if (thisMixing.SchedPtr == 0) { + ShowWarningError(state, + format("{}{}=\"{}\", invalid (not found) {}=\"{}\"", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(3), + cAlphaArgs(3))); + ErrorsFound = true; + } + } + + // Mixing equipment design level calculation method. + AirflowSpec flow = static_cast(getEnumerationValue(airflowNamesUC, cAlphaArgs(4))); // NOLINT(modernize-use-auto) + switch (flow) { + case AirflowSpec::Flow: + case AirflowSpec::FlowPerZone: + thisMixing.DesignLevel = rNumericArgs(1); + if (lNumericFieldBlanks(1)) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Cross Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(1))); + } else { + Real64 spaceFrac = 1.0; + if (!thisMixingInput.spaceListActive && (thisMixingInput.numOfSpaces > 1)) { + Real64 const zoneVolume = thisZone.Volume; + if (zoneVolume > 0.0) { + spaceFrac = thisSpace.Volume / zoneVolume; + } else { + ShowSevereError(state, std::string(RoutineName) + "Zone volume is zero when allocating Cross Mixing to Spaces."); + ShowContinueError( + state, format("Occurs for {}=\"{}\" in Zone=\"{}\".", cCurrentModuleObject, thisMixingInput.Name, thisZone.Name)); + ErrorsFound = true; + } + } + + thisMixing.DesignLevel = rNumericArgs(1) * spaceFrac; + } + break; + + case AirflowSpec::FlowPerArea: + if (thisMixing.spaceIndex != 0) { + if (rNumericArgs(2) >= 0.0) { + thisMixing.DesignLevel = rNumericArgs(2) * thisSpace.floorArea; + if (thisMixing.spaceIndex > 0) { + if (thisZone.FloorArea <= 0.0) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but Space Floor Area = 0. 0 Cross Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(2))); + } + } + } else { + ShowSevereError(state, + format("{}{}=\"{}\", invalid flow/area specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + rNumericArgs(2))); + ErrorsFound = true; + } + } + if (lNumericFieldBlanks(2)) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Cross Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(2))); + } + break; + + case AirflowSpec::FlowPerPerson: + if (thisMixing.spaceIndex != 0) { + if (rNumericArgs(3) >= 0.0) { + thisMixing.DesignLevel = rNumericArgs(3) * thisSpace.totOccupants; + if (thisSpace.totOccupants <= 0.0) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but Space Total Occupants = 0. 0 Cross Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(3))); + } + } else { + ShowSevereError(state, + format("{}{}=\"{}\", invalid flow/person specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + rNumericArgs(3))); + ErrorsFound = true; + } + } + if (lNumericFieldBlanks(3)) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Cross Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(3))); + } + break; + + case AirflowSpec::AirChanges: + if (thisMixing.spaceIndex != 0) { + if (rNumericArgs(4) >= 0.0) { + thisMixing.DesignLevel = rNumericArgs(4) * thisSpace.Volume / DataGlobalConstants::SecInHour; + if (thisSpace.Volume <= 0.0) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but Space Volume = 0. 0 Cross Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(4))); + } + } else { + ShowSevereError(state, + format("{}{}=\"{}\", invalid ACH (air changes per hour) specification [<0.0]={:.3R}", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + rNumericArgs(4))); + ErrorsFound = true; + } + } + if (lNumericFieldBlanks(4)) { + ShowWarningError(state, + format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Cross Mixing will result.", + RoutineName, + cCurrentModuleObject, + thisMixingInput.Name, + cAlphaFieldNames(4), + cNumericFieldNames(4))); + } + break; + + default: + ShowSevereError( + state, format("{}{}=\"{}\", invalid calculation method={}", RoutineName, cCurrentModuleObject, cAlphaArgs(1), cAlphaArgs(4))); + ErrorsFound = true; + } + + thisMixing.fromSpaceIndex = UtilityRoutines::FindItemInList(cAlphaArgs(5), state.dataHeatBal->space); + if (thisMixing.fromSpaceIndex == 0) { + thisMixing.FromZone = UtilityRoutines::FindItemInList(cAlphaArgs(5), state.dataHeatBal->Zone); + } else { + thisMixing.FromZone = state.dataHeatBal->space(thisMixing.fromSpaceIndex).zoneNum; + } + if ((thisMixing.FromZone == 0) && (thisMixing.fromSpaceIndex == 0)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + "\"."); + ErrorsFound = true; + } + thisMixing.DeltaTemperature = rNumericArgs(5); + + if (NumAlpha > 5) { + thisMixing.DeltaTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(6)); + if (thisMixing.DeltaTempSchedPtr > 0) { + if (!lNumericFieldBlanks(5)) + ShowWarningError( + state, + std::string{RoutineName} + + "The Delta Temperature value and schedule are provided. The scheduled temperature will be used in the " + + cCurrentModuleObject + " object = " + cAlphaArgs(1)); + if (GetScheduleMinValue(state, thisMixing.DeltaTempSchedPtr) < 0.0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + + " must have a delta temperature equal to or above 0 C defined in the schedule = " + cAlphaArgs(6)); + ErrorsFound = true; + } + } + } + if (thisMixing.DeltaTempSchedPtr == 0 && lNumericFieldBlanks(5) && (!lAlphaFieldBlanks(6))) { + ShowWarningError(state, + format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", + RoutineName, + cNumericFieldNames(5), + rNumericArgs(5))); + ShowContinueError(state, "in " + cCurrentModuleObject + " = " + cAlphaArgs(1) + " and the simulation continues..."); + } + if (!lNumericFieldBlanks(5) && ((!lAlphaFieldBlanks(6)) && thisMixing.DeltaTempSchedPtr == 0)) { + ShowWarningError(state, + format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", + RoutineName, + cAlphaFieldNames(6), + cAlphaArgs(6), + rNumericArgs(5))); + ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); + } + + if (NumAlpha > 6) { + thisMixing.MinIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(7)); + if (thisMixing.MinIndoorTempSchedPtr == 0) { + if ((!lAlphaFieldBlanks(7))) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(7) + + " not found=" + cAlphaArgs(7) + "\"."); + ErrorsFound = true; + } + } + if (thisMixing.MinIndoorTempSchedPtr > 0) { + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisMixing.MinIndoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + + " must have a minimum zone temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(7)); + ErrorsFound = true; + } + } + } + + if (NumAlpha > 7) { + thisMixing.MaxIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(8)); + if (thisMixing.MaxIndoorTempSchedPtr == 0) { + if ((!lAlphaFieldBlanks(8))) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(8) + + " not found=\"" + cAlphaArgs(8) + "\"."); + ErrorsFound = true; + } + } + if (thisMixing.MaxIndoorTempSchedPtr > 0) { + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisMixing.MaxIndoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + + " must have a maximum zone temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(8)); + ErrorsFound = true; + } + } + } + + if (NumAlpha > 8) { + thisMixing.MinSourceTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(9)); + if (thisMixing.MinSourceTempSchedPtr == 0) { + if ((!lAlphaFieldBlanks(9))) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(9) + + " not found=\"" + cAlphaArgs(9) + "\"."); + ErrorsFound = true; + } + } + if (thisMixing.MinSourceTempSchedPtr > 0) { + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisMixing.MinSourceTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + + " must have a minimum source temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(9)); + ErrorsFound = true; + } + } + } + + if (NumAlpha > 9) { + thisMixing.MaxSourceTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(10)); + if (thisMixing.MaxSourceTempSchedPtr == 0) { + if ((!lAlphaFieldBlanks(10))) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(10) + + " not found=\"" + cAlphaArgs(9) + "\"."); + ErrorsFound = true; + } + } + if (thisMixing.MaxSourceTempSchedPtr > 0) { + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisMixing.MaxSourceTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + + " must have a maximum source temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(10)); + ErrorsFound = true; + } + } + } + + if (NumAlpha > 10) { + thisMixing.MinOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(11)); + if (thisMixing.MinOutdoorTempSchedPtr == 0) { + if ((!lAlphaFieldBlanks(11))) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(11) + + " not found=\"" + cAlphaArgs(9) + "\"."); + ErrorsFound = true; + } + } + if (thisMixing.MinOutdoorTempSchedPtr > 0) { + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisMixing.MinOutdoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + + " must have a minimum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(11)); + ErrorsFound = true; + } + } + } + + if (NumAlpha > 11) { + thisMixing.MaxOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(12)); + if (thisMixing.MaxOutdoorTempSchedPtr == 0) { + if ((!lAlphaFieldBlanks(12))) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(12) + + " not found=\"" + cAlphaArgs(9) + "\"."); + ErrorsFound = true; + } + } + if (thisMixing.MaxOutdoorTempSchedPtr > 0) { + // Check min and max values in the schedule to ensure both values are within the range + if (!CheckScheduleValueMinMax(state, thisMixing.MaxOutdoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { + ShowSevereError( + state, + std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + + " must have a maximum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(12)); + ErrorsFound = true; + } + } + } + } + } + // Create CrossMixing objects from air boundary info + for (auto const &thisAirBoundaryMixing : state.dataHeatBal->airBoundaryMixing) { + ++mixingNum; + // Create CrossMixing object from air boundary info + int space1 = thisAirBoundaryMixing.space1; + int space2 = thisAirBoundaryMixing.space2; + int zone1 = state.dataHeatBal->space(space1).zoneNum; + int zone2 = state.dataHeatBal->space(space1).zoneNum; + auto &thisCrossMizing = state.dataHeatBal->CrossMixing(mixingNum); + thisCrossMizing.Name = fmt::format("Air Boundary Mixing Zones {} and {}", zone1, zone2); + thisCrossMizing.spaceIndex = space1; + thisCrossMizing.ZonePtr = zone1; + thisCrossMizing.SchedPtr = thisAirBoundaryMixing.scheduleIndex; + thisCrossMizing.DesignLevel = thisAirBoundaryMixing.mixingVolumeFlowRate; + thisCrossMizing.FromZone = zone2; + thisCrossMizing.fromSpaceIndex = space2; + } + assert(mixingNum == state.dataHeatBal->TotCrossMixing); + for (int mixingRepNum = 1; mixingRepNum <= state.dataHeatBal->TotMixing; ++mixingRepNum) { + int zoneNum = state.dataHeatBal->CrossMixing(mixingRepNum).ZonePtr; + if (zoneNum > 0) { + std::string const &zoneName = state.dataHeatBal->Zone(zoneNum).Name; + auto &thisZnAirRpt = state.dataHeatBal->ZnAirRpt(zoneNum); + if (RepVarSet(zoneNum)) { + RepVarSet(zoneNum) = false; + SetupOutputVariable(state, + "Zone Mixing Volume", + OutputProcessor::Unit::m3, + thisZnAirRpt.MixVolume, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zoneName); + SetupOutputVariable(state, + "Zone Mixing Current Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + thisZnAirRpt.MixVdotCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + zoneName); + SetupOutputVariable(state, + "Zone Mixing Standard Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + thisZnAirRpt.MixVdotStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + zoneName); + SetupOutputVariable(state, + "Zone Mixing Mass", + OutputProcessor::Unit::kg, + thisZnAirRpt.MixMass, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zoneName); + SetupOutputVariable(state, + "Zone Mixing Mass Flow Rate", + OutputProcessor::Unit::kg_s, + thisZnAirRpt.MixMdot, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + zoneName); + SetupOutputVariable(state, + "Zone Mixing Sensible Heat Loss Energy", + OutputProcessor::Unit::J, + thisZnAirRpt.MixHeatLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zoneName); + SetupOutputVariable(state, + "Zone Mixing Sensible Heat Gain Energy", + OutputProcessor::Unit::J, + thisZnAirRpt.MixHeatGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zoneName); + SetupOutputVariable(state, + "Zone Mixing Latent Heat Loss Energy", + OutputProcessor::Unit::J, + thisZnAirRpt.MixLatentLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zoneName); + SetupOutputVariable(state, + "Zone Mixing Latent Heat Gain Energy", + OutputProcessor::Unit::J, + thisZnAirRpt.MixLatentGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zoneName); + SetupOutputVariable(state, + "Zone Mixing Total Heat Loss Energy", + OutputProcessor::Unit::J, + thisZnAirRpt.MixTotalLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zoneName); + SetupOutputVariable(state, + "Zone Mixing Total Heat Gain Energy", + OutputProcessor::Unit::J, + thisZnAirRpt.MixTotalGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zoneName); + } + } + int fromZoneNum = state.dataHeatBal->CrossMixing(mixingRepNum).FromZone; + if (fromZoneNum > 0) { + if (RepVarSet(fromZoneNum)) { + RepVarSet(fromZoneNum) = false; + std::string const &fromZoneName = state.dataHeatBal->Zone(fromZoneNum).Name; + auto &thisZnAirRpt = state.dataHeatBal->ZnAirRpt(fromZoneNum); + SetupOutputVariable(state, + "Zone Mixing Volume", + OutputProcessor::Unit::m3, + thisZnAirRpt.MixVolume, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + fromZoneName); + SetupOutputVariable(state, + "Zone Mixing Current Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + thisZnAirRpt.MixVdotCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + fromZoneName); + SetupOutputVariable(state, + "Zone Mixing Standard Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + thisZnAirRpt.MixVdotStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + fromZoneName); + SetupOutputVariable(state, + "Zone Mixing Mass", + OutputProcessor::Unit::kg, + thisZnAirRpt.MixMass, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + fromZoneName); + SetupOutputVariable(state, + "Zone Mixing Mass Flow Rate", + OutputProcessor::Unit::kg_s, + thisZnAirRpt.MixMdot, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + fromZoneName); + SetupOutputVariable(state, + "Zone Mixing Sensible Heat Loss Energy", + OutputProcessor::Unit::J, + thisZnAirRpt.MixHeatLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + fromZoneName); + SetupOutputVariable(state, + "Zone Mixing Sensible Heat Gain Energy", + OutputProcessor::Unit::J, + thisZnAirRpt.MixHeatGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + fromZoneName); + SetupOutputVariable(state, + "Zone Mixing Latent Heat Loss Energy", + OutputProcessor::Unit::J, + thisZnAirRpt.MixLatentLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + fromZoneName); + SetupOutputVariable(state, + "Zone Mixing Latent Heat Gain Energy", + OutputProcessor::Unit::J, + thisZnAirRpt.MixLatentGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + fromZoneName); + SetupOutputVariable(state, + "Zone Mixing Total Heat Loss Energy", + OutputProcessor::Unit::J, + thisZnAirRpt.MixTotalLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + fromZoneName); + SetupOutputVariable(state, + "Zone Mixing Total Heat Gain Energy", + OutputProcessor::Unit::J, + thisZnAirRpt.MixTotalGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + fromZoneName); + } + } + + if (state.dataGlobal->AnyEnergyManagementSystemInModel) { + SetupEMSActuator(state, + "ZoneCrossMixing", + state.dataHeatBal->CrossMixing(mixingRepNum).Name, + "Air Exchange Flow Rate", + "[m3/s]", + state.dataHeatBal->CrossMixing(mixingRepNum).EMSSimpleMixingOn, + state.dataHeatBal->CrossMixing(mixingRepNum).EMSimpleMixingFlowRate); + } + } + } + + cCurrentModuleObject = "ZoneRefrigerationDoorMixing"; + state.dataHeatBal->TotRefDoorMixing = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + if (state.dataHeatBal->TotRefDoorMixing > 0) { + state.dataHeatBal->RefDoorMixing.allocate(state.dataGlobal->NumOfZones); + for (auto &e : state.dataHeatBal->RefDoorMixing) + e.NumRefDoorConnections = 0; + + for (int Loop = 1; Loop <= state.dataHeatBal->TotRefDoorMixing; ++Loop) { + + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Loop, + cAlphaArgs, + NumAlpha, + rNumericArgs, + NumNumber, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + + NameThisObject = cAlphaArgs(1); + + AlphaNum = 2; + Zone1Num = UtilityRoutines::FindItemInList(cAlphaArgs(AlphaNum), state.dataHeatBal->Zone); + if (Zone1Num == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + + cAlphaFieldNames(AlphaNum) + "=\"" + cAlphaArgs(AlphaNum) + "\"."); + ErrorsFound = true; + } + + ++AlphaNum; // 3 + Zone2Num = UtilityRoutines::FindItemInList(cAlphaArgs(AlphaNum), state.dataHeatBal->Zone); + if (Zone2Num == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + + cAlphaFieldNames(AlphaNum) + "=\"" + cAlphaArgs(AlphaNum) + "\"."); + ErrorsFound = true; + } + if (Zone1Num == Zone2Num) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + + "\", The same zone name has been entered for both sides of a refrigerated door " + cAlphaFieldNames(AlphaNum) + + "=\"" + cAlphaArgs(AlphaNum) + "\"."); + ErrorsFound = true; + } else if (Zone1Num < Zone2Num) { // zone 1 will come first in soln loop, id zone 2 as mate zone + ZoneNumA = Zone1Num; + ZoneNumB = Zone2Num; + } else if (Zone2Num < Zone1Num) { // zone 2 will come first in soln loop, id zone 1 as mate zone + ZoneNumA = Zone2Num; + ZoneNumB = Zone1Num; + } + + if (!allocated(state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr)) { + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorMixingObjectName.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumA).Protection.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumA).MateZonePtr.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorMixingOn.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorFlowRate.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumA).VolRefDoorFlowRate.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorMixingObjectName = ""; + state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr = 0; + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight = 0.0; + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea = 0.0; + state.dataHeatBal->RefDoorMixing(ZoneNumA).Protection = RefDoorNone; + state.dataHeatBal->RefDoorMixing(ZoneNumA).MateZonePtr = 0; + state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorMixingOn = false; + state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorFlowRate = 0.0; + state.dataHeatBal->RefDoorMixing(ZoneNumA).VolRefDoorFlowRate = 0.0; + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName = ""; + } // First refrigeration mixing in this zone + + if (!allocated(state.dataHeatBal->RefDoorMixing(ZoneNumB).OpenSchedPtr)) { + state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorMixingObjectName.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumB).OpenSchedPtr.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorHeight.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorArea.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumB).Protection.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumB).MateZonePtr.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumB).EMSRefDoorMixingOn.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumB).EMSRefDoorFlowRate.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumB).VolRefDoorFlowRate.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorProtTypeName.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorMixingObjectName = ""; + state.dataHeatBal->RefDoorMixing(ZoneNumB).OpenSchedPtr = 0; + state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorHeight = 0.0; + state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorArea = 0.0; + state.dataHeatBal->RefDoorMixing(ZoneNumB).Protection = RefDoorNone; + state.dataHeatBal->RefDoorMixing(ZoneNumB).MateZonePtr = 0; + state.dataHeatBal->RefDoorMixing(ZoneNumB).EMSRefDoorMixingOn = false; + state.dataHeatBal->RefDoorMixing(ZoneNumB).EMSRefDoorFlowRate = 0.0; + state.dataHeatBal->RefDoorMixing(ZoneNumB).VolRefDoorFlowRate = 0.0; + state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorProtTypeName = ""; + } // First refrigeration mixing in this zone + + ConnectionNumber = state.dataHeatBal->RefDoorMixing(ZoneNumA).NumRefDoorConnections + 1; + state.dataHeatBal->RefDoorMixing(ZoneNumA).NumRefDoorConnections = ConnectionNumber; + state.dataHeatBal->RefDoorMixing(ZoneNumA).ZonePtr = ZoneNumA; + state.dataHeatBal->RefDoorMixing(ZoneNumA).MateZonePtr(ConnectionNumber) = ZoneNumB; + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorMixingObjectName(ConnectionNumber) = NameThisObject; + // need to make sure same pair of zones is only entered once. + if (state.dataHeatBal->RefDoorMixing(ZoneNumA).RefDoorMixFlag && state.dataHeatBal->RefDoorMixing(ZoneNumB).RefDoorMixFlag) { + if (state.dataHeatBal->RefDoorMixing(ZoneNumA).NumRefDoorConnections > 1) { + for (ConnectTest = 1; ConnectTest <= (ConnectionNumber - 1); ++ConnectTest) { + if (state.dataHeatBal->RefDoorMixing(ZoneNumA).MateZonePtr(ConnectTest) != + state.dataHeatBal->RefDoorMixing(ZoneNumA).MateZonePtr(ConnectionNumber)) + continue; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", and " + + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorMixingObjectName(ConnectTest)); + ShowContinueError(state, + " Share same pair of zones: \"" + state.dataHeatBal->Zone(ZoneNumA).Name + "\" and \"" + + state.dataHeatBal->Zone(ZoneNumB).Name + + "\". Only one RefrigerationDoorMixing object is allowed for any unique pair of zones."); + ErrorsFound = true; + } // ConnectTest + } // NumRefDoorconnections > 1 + } else { // Both zones need to be flagged with ref doors + state.dataHeatBal->RefDoorMixing(ZoneNumA).RefDoorMixFlag = true; + state.dataHeatBal->RefDoorMixing(ZoneNumB).RefDoorMixFlag = true; + } // Both zones already flagged with ref doors + + ++AlphaNum; // 4 + if (lAlphaFieldBlanks(AlphaNum)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(AlphaNum) + + " is required but field is blank."); + ErrorsFound = true; + } else { //(lAlphaFieldBlanks(AlphaNum)) THEN + state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr(ConnectionNumber) = GetScheduleIndex(state, cAlphaArgs(AlphaNum)); + if (state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr(ConnectionNumber) == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + + cAlphaFieldNames(AlphaNum) + "=\"" + cAlphaArgs(AlphaNum) + "\"."); + ErrorsFound = true; + } else { // OpenSchedPtr(ConnectionNumber) ne 0) + if (!CheckScheduleValueMinMax( + state, state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr(ConnectionNumber), ">=", 0.0, "<=", 1.0)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(AlphaNum) + + "=\"" + cAlphaArgs(AlphaNum) + "\" has schedule values < 0 or > 1."); + ErrorsFound = true; + } // check door opening schedule values between 0 and 1 + } // OpenSchedPtr(ConnectionNumber) == 0) + } //(lAlphaFieldBlanks(AlphaNum)) THEN + + NumbNum = 1; + if (lAlphaFieldBlanks(NumbNum)) { + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight(ConnectionNumber) = 3.0; // default height of 3 meters + ShowWarningError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + cNumericFieldNames(NumbNum) + + " is blank and the default value of 3.0 will be used."); + } else { + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight(ConnectionNumber) = rNumericArgs(NumbNum); + if ((state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight(ConnectionNumber) < 0) || + (state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight(ConnectionNumber) > 50.0)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + + " must have a door height between 0 and 50 meters. "); + ErrorsFound = true; + } + } + + ++NumbNum; // 2 + if (lAlphaFieldBlanks(NumbNum)) { + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea(ConnectionNumber) = 9.0; // default area of 9 m2 + ShowWarningError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + cNumericFieldNames(NumbNum) + + " is blank and the default value of 9 m2 will be used."); + } else { + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea(ConnectionNumber) = rNumericArgs(NumbNum); + if ((state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea(ConnectionNumber) < 0) || + (state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea(ConnectionNumber) > 400.0)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + + " must have a door height between 0 and 400 square meters. "); + ErrorsFound = true; + } + } + + ++AlphaNum; // 5 + // Door protection type. + if (lAlphaFieldBlanks(AlphaNum)) { + state.dataHeatBal->RefDoorMixing(ZoneNumA).Protection(ConnectionNumber) = RefDoorNone; // Default + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName(ConnectionNumber) = "None"; // Default + ShowWarningError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" " + cAlphaFieldNames(AlphaNum) + + " is blank. Default of no door protection will be used"); + } else { + if (cAlphaArgs(AlphaNum) == "NONE") { + state.dataHeatBal->RefDoorMixing(ZoneNumA).Protection(ConnectionNumber) = RefDoorNone; + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName(ConnectionNumber) = "None"; + } else if (cAlphaArgs(AlphaNum) == "AIRCURTAIN") { + state.dataHeatBal->RefDoorMixing(ZoneNumA).Protection(ConnectionNumber) = RefDoorAirCurtain; + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName(ConnectionNumber) = "AirCurtain"; + } else if (cAlphaArgs(AlphaNum) == "STRIPCURTAIN") { + state.dataHeatBal->RefDoorMixing(ZoneNumA).Protection(ConnectionNumber) = RefDoorStripCurtain; + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName(ConnectionNumber) = "StripCurtain"; + } else { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + + "\", invalid calculation method=" + cAlphaArgs(AlphaNum) + " with alphanum of 5: " + cAlphaArgs(5)); + ErrorsFound = true; + } // =none, etc. + } // Blank + + if (ZoneNumA > 0) { + if (RepVarSet(ZoneNumA)) { + RepVarSet(ZoneNumA) = false; + SetupOutputVariable(state, + "Zone Mixing Volume", + OutputProcessor::Unit::m3, + state.dataHeatBal->ZnAirRpt(ZoneNumA).MixVolume, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumA).Name); + SetupOutputVariable(state, + "Zone Mixing Current Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(ZoneNumA).MixVdotCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneNumA).Name); + SetupOutputVariable(state, + "Zone Mixing Standard Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(ZoneNumA).MixVdotStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneNumA).Name); + SetupOutputVariable(state, + "Zone Mixing Mass", + OutputProcessor::Unit::kg, + state.dataHeatBal->ZnAirRpt(ZoneNumA).MixMass, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumA).Name); + SetupOutputVariable(state, + "Zone Mixing Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->ZnAirRpt(ZoneNumA).MixMdot, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneNumA).Name); + SetupOutputVariable(state, + "Zone Mixing Sensible Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(ZoneNumA).MixHeatLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumA).Name); + SetupOutputVariable(state, + "Zone Mixing Sensible Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(ZoneNumA).MixHeatGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumA).Name); + SetupOutputVariable(state, + "Zone Mixing Latent Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(ZoneNumA).MixLatentLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumA).Name); + SetupOutputVariable(state, + "Zone Mixing Latent Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(ZoneNumA).MixLatentGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumA).Name); + SetupOutputVariable(state, + "Zone Mixing Total Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(ZoneNumA).MixTotalLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumA).Name); + SetupOutputVariable(state, + "Zone Mixing Total Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(ZoneNumA).MixTotalGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumA).Name); + } + } + if (state.dataGlobal->AnyEnergyManagementSystemInModel) { + SetupEMSActuator(state, + "ZoneRefDoorMixing", + state.dataHeatBal->RefDoorMixing(ZoneNumA).Name, + "Air Exchange Flow Rate", + "[m3/s]", + state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorMixingOn(ConnectionNumber), + state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorFlowRate(ConnectionNumber)); + } + + if (ZoneNumB > 0) { + if (RepVarSet(ZoneNumB)) { + RepVarSet(ZoneNumB) = false; + SetupOutputVariable(state, + "Zone Mixing Volume", + OutputProcessor::Unit::m3, + state.dataHeatBal->ZnAirRpt(ZoneNumB).MixVolume, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumB).Name); + SetupOutputVariable(state, + "Zone Mixing Current Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(ZoneNumB).MixVdotCurDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneNumB).Name); + SetupOutputVariable(state, + "Zone Mixing Standard Density Volume Flow Rate", + OutputProcessor::Unit::m3_s, + state.dataHeatBal->ZnAirRpt(ZoneNumB).MixVdotStdDensity, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneNumB).Name); + SetupOutputVariable(state, + "Zone Mixing Mass", + OutputProcessor::Unit::kg, + state.dataHeatBal->ZnAirRpt(ZoneNumB).MixMass, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumB).Name); + SetupOutputVariable(state, + "Zone Mixing Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->ZnAirRpt(ZoneNumB).MixMdot, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneNumB).Name); + SetupOutputVariable(state, + "Zone Mixing Sensible Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(ZoneNumB).MixHeatLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumB).Name); + SetupOutputVariable(state, + "Zone Mixing Sensible Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(ZoneNumB).MixHeatGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumB).Name); + SetupOutputVariable(state, + "Zone Mixing Latent Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(ZoneNumB).MixLatentLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumB).Name); + SetupOutputVariable(state, + "Zone Mixing Latent Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(ZoneNumB).MixLatentGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumB).Name); + SetupOutputVariable(state, + "Zone Mixing Total Heat Loss Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(ZoneNumB).MixTotalLoss, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumB).Name); + SetupOutputVariable(state, + "Zone Mixing Total Heat Gain Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZnAirRpt(ZoneNumB).MixTotalGain, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->Zone(ZoneNumB).Name); + } + } + if (state.dataGlobal->AnyEnergyManagementSystemInModel) { + SetupEMSActuator(state, + "ZoneRefDoorMixing", + state.dataHeatBal->RefDoorMixing(ZoneNumB).Name, + "Air Exchange Flow Rate", + "[m3/s]", + state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorMixingOn(ConnectionNumber), + state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorFlowRate(ConnectionNumber)); + } + + } // DO Loop=1,TotRefDoorMixing + } // TotRefDoorMixing > 0) + + RepVarSet.deallocate(); + cAlphaArgs.deallocate(); + cAlphaFieldNames.deallocate(); + cNumericFieldNames.deallocate(); + rNumericArgs.deallocate(); + lAlphaFieldBlanks.deallocate(); + lNumericFieldBlanks.deallocate(); + + TotInfilVentFlow.dimension(state.dataGlobal->NumOfZones, 0.0); + + auto divide_and_print_if_greater_than_zero = [&](const Real64 denominator, const Real64 numerator) { + if (denominator > 0.0) { + print(state.files.eio, "{:.3R},", numerator / denominator); + } else { + print(state.files.eio, "N/A,"); + } + }; + + for (int Loop = 1; Loop <= state.dataHeatBal->TotInfiltration; ++Loop) { + if (Loop == 1) + print(state.files.eio, + Format_721, + "ZoneInfiltration", + "Design Volume Flow Rate {m3/s},Volume Flow Rate/Floor Area {m3/s-m2},Volume Flow Rate/Exterior Surface Area {m3/s-m2},ACH - " + "Air Changes per Hour,Equation A - Constant Term Coefficient {},Equation B - Temperature Term Coefficient {1/C},Equation C - " + "Velocity Term Coefficient {s/m}, Equation D - Velocity Squared Term Coefficient {s2/m2}"); + + int ZoneNum = state.dataHeatBal->Infiltration(Loop).ZonePtr; + if (ZoneNum == 0) { + print(state.files.eio, Format_722, "Infiltration-Illegal Zone specified", state.dataHeatBal->Infiltration(Loop).Name); + continue; + } + TotInfilVentFlow(ZoneNum) += state.dataHeatBal->Infiltration(Loop).DesignLevel; + print(state.files.eio, + Format_720, + "ZoneInfiltration", + state.dataHeatBal->Infiltration(Loop).Name, + GetScheduleName(state, state.dataHeatBal->Infiltration(Loop).SchedPtr), + state.dataHeatBal->Zone(ZoneNum).Name, + state.dataHeatBal->Zone(ZoneNum).FloorArea, + state.dataHeatBal->Zone(ZoneNum).TotOccupants); + print(state.files.eio, "{:.3R},", state.dataHeatBal->Infiltration(Loop).DesignLevel); + + divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).FloorArea, state.dataHeatBal->Infiltration(Loop).DesignLevel); + divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).ExteriorTotalSurfArea, + state.dataHeatBal->Infiltration(Loop).DesignLevel); + divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).Volume, + state.dataHeatBal->Infiltration(Loop).DesignLevel * DataGlobalConstants::SecInHour); + + print(state.files.eio, "{:.3R},", state.dataHeatBal->Infiltration(Loop).ConstantTermCoef); + print(state.files.eio, "{:.3R},", state.dataHeatBal->Infiltration(Loop).TemperatureTermCoef); + print(state.files.eio, "{:.3R},", state.dataHeatBal->Infiltration(Loop).VelocityTermCoef); + print(state.files.eio, "{:.3R}\n", state.dataHeatBal->Infiltration(Loop).VelocitySQTermCoef); + } + + if (state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance) { + for (int Loop = 1; Loop <= state.dataHeatBal->TotInfiltration; ++Loop) { + int ZoneNum = state.dataHeatBal->Infiltration(Loop).ZonePtr; + state.dataHeatBal->MassConservation(ZoneNum).InfiltrationPtr = Loop; + } + } + + for (int Loop = 1; Loop <= state.dataHeatBal->TotVentilation; ++Loop) { + if (Loop == 1) { + print(state.files.eio, + Format_721, + "ZoneVentilation", + "Design Volume Flow Rate {m3/s},Volume Flow Rate/Floor Area {m3/s-m2},Volume Flow Rate/person Area {m3/s-person},ACH - Air " + "Changes per Hour,Fan Type {Exhaust;Intake;Natural},Fan Pressure Rise {Pa},Fan Efficiency {},Equation A - Constant Term " + "Coefficient {},Equation B - Temperature Term Coefficient {1/C},Equation C - Velocity Term Coefficient {s/m}, Equation D - " + "Velocity Squared Term Coefficient {s2/m2},Minimum Indoor Temperature{C}/Schedule,Maximum Indoor " + "Temperature{C}/Schedule,Delta Temperature{C}/Schedule,Minimum Outdoor Temperature{C}/Schedule,Maximum Outdoor " + "Temperature{C}/Schedule,Maximum WindSpeed{m/s}"); + } + + int ZoneNum = state.dataHeatBal->Ventilation(Loop).ZonePtr; + if (ZoneNum == 0) { + print(state.files.eio, Format_722, "Ventilation-Illegal Zone specified", state.dataHeatBal->Ventilation(Loop).Name); + continue; + } + TotInfilVentFlow(ZoneNum) += state.dataHeatBal->Ventilation(Loop).DesignLevel; + print(state.files.eio, + Format_720, + "ZoneVentilation", + state.dataHeatBal->Ventilation(Loop).Name, + GetScheduleName(state, state.dataHeatBal->Ventilation(Loop).SchedPtr), + state.dataHeatBal->Zone(ZoneNum).Name, + state.dataHeatBal->Zone(ZoneNum).FloorArea, + state.dataHeatBal->Zone(ZoneNum).TotOccupants); + + print(state.files.eio, "{:.3R},", state.dataHeatBal->Ventilation(Loop).DesignLevel); + + divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).FloorArea, state.dataHeatBal->Ventilation(Loop).DesignLevel); + divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).TotOccupants, state.dataHeatBal->Ventilation(Loop).DesignLevel); + divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).Volume, + state.dataHeatBal->Ventilation(Loop).DesignLevel * DataGlobalConstants::SecInHour); + + if (state.dataHeatBal->Ventilation(Loop).FanType == DataHeatBalance::VentilationType::Exhaust) { + print(state.files.eio, "Exhaust,"); + } else if (state.dataHeatBal->Ventilation(Loop).FanType == DataHeatBalance::VentilationType::Intake) { + print(state.files.eio, "Intake,"); + } else if (state.dataHeatBal->Ventilation(Loop).FanType == DataHeatBalance::VentilationType::Natural) { + print(state.files.eio, "Natural,"); + } else if (state.dataHeatBal->Ventilation(Loop).FanType == DataHeatBalance::VentilationType::Balanced) { + print(state.files.eio, "Balanced,"); + } else { + print(state.files.eio, "UNKNOWN,"); + } + print(state.files.eio, "{:.3R},", state.dataHeatBal->Ventilation(Loop).FanPressure); + print(state.files.eio, "{:.1R},", state.dataHeatBal->Ventilation(Loop).FanEfficiency); + print(state.files.eio, "{:.3R},", state.dataHeatBal->Ventilation(Loop).ConstantTermCoef); + print(state.files.eio, "{:.3R},", state.dataHeatBal->Ventilation(Loop).TemperatureTermCoef); + print(state.files.eio, "{:.3R},", state.dataHeatBal->Ventilation(Loop).VelocityTermCoef); + print(state.files.eio, "{:.3R},", state.dataHeatBal->Ventilation(Loop).VelocitySQTermCoef); + + // TODO Should this also be prefixed with "Schedule: " like the following ones are? + if (state.dataHeatBal->Ventilation(Loop).MinIndoorTempSchedPtr > 0) { + print(state.files.eio, "{},", GetScheduleName(state, state.dataHeatBal->Ventilation(Loop).MinIndoorTempSchedPtr)); + } else { + print(state.files.eio, "{:.2R},", state.dataHeatBal->Ventilation(Loop).MinIndoorTemperature); + } + + const auto print_temperature = [&](const int ptr, const Real64 value) { + if (ptr > 0) { + print(state.files.eio, "Schedule: {},", GetScheduleName(state, ptr)); + } else { + print(state.files.eio, "{:.2R},", value); + } + }; + + print_temperature(state.dataHeatBal->Ventilation(Loop).MaxIndoorTempSchedPtr, state.dataHeatBal->Ventilation(Loop).MaxIndoorTemperature); + print_temperature(state.dataHeatBal->Ventilation(Loop).DeltaTempSchedPtr, state.dataHeatBal->Ventilation(Loop).DelTemperature); + print_temperature(state.dataHeatBal->Ventilation(Loop).MinOutdoorTempSchedPtr, state.dataHeatBal->Ventilation(Loop).MinOutdoorTemperature); + print_temperature(state.dataHeatBal->Ventilation(Loop).MaxOutdoorTempSchedPtr, state.dataHeatBal->Ventilation(Loop).MaxOutdoorTemperature); + + print(state.files.eio, "{:.2R}\n", state.dataHeatBal->Ventilation(Loop).MaxWindSpeed); + } + + TotMixingFlow.dimension(state.dataGlobal->NumOfZones, 0.0); + for (int Loop = 1; Loop <= state.dataHeatBal->TotMixing; ++Loop) { + if (Loop == 1) + print(state.files.eio, + Format_721, + "Mixing", + "Design Volume Flow Rate {m3/s},Volume Flow Rate/Floor Area {m3/s-m2},Volume Flow Rate/person Area {m3/s-person},ACH - Air " + "Changes per Hour,From/Source Zone,Delta Temperature {C}"); + + int ZoneNum = state.dataHeatBal->Mixing(Loop).ZonePtr; + if (ZoneNum == 0) { + print(state.files.eio, Format_722, "Mixing-Illegal Zone specified", state.dataHeatBal->Mixing(Loop).Name); + continue; + } + TotMixingFlow(ZoneNum) += state.dataHeatBal->Mixing(Loop).DesignLevel; + print(state.files.eio, + Format_720, + "Mixing", + state.dataHeatBal->Mixing(Loop).Name, + GetScheduleName(state, state.dataHeatBal->Mixing(Loop).SchedPtr), + state.dataHeatBal->Zone(ZoneNum).Name, + state.dataHeatBal->Zone(ZoneNum).FloorArea, + state.dataHeatBal->Zone(ZoneNum).TotOccupants); + print(state.files.eio, "{:.3R},", state.dataHeatBal->Mixing(Loop).DesignLevel); + divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).FloorArea, state.dataHeatBal->Mixing(Loop).DesignLevel); + divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).TotOccupants, state.dataHeatBal->Mixing(Loop).DesignLevel); + divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).Volume, + state.dataHeatBal->Mixing(Loop).DesignLevel * DataGlobalConstants::SecInHour); + + print(state.files.eio, "{},", state.dataHeatBal->Zone(state.dataHeatBal->Mixing(Loop).FromZone).Name); + print(state.files.eio, "{:.2R}\n", state.dataHeatBal->Mixing(Loop).DeltaTemperature); + } + + for (int Loop = 1; Loop <= state.dataHeatBal->TotCrossMixing; ++Loop) { + if (Loop == 1) { + print(state.files.eio, + Format_721, + "CrossMixing", + "Design Volume Flow Rate {m3/s},Volume Flow Rate/Floor Area {m3/s-m2},Volume Flow Rate/person Area {m3/s-person},ACH - Air " + "Changes per Hour,From/Source Zone,Delta Temperature {C}"); + } + + int ZoneNum = state.dataHeatBal->CrossMixing(Loop).ZonePtr; + if (ZoneNum == 0) { + print(state.files.eio, Format_722, "CrossMixing-Illegal Zone specified", state.dataHeatBal->CrossMixing(Loop).Name); + continue; + } + TotMixingFlow(ZoneNum) += state.dataHeatBal->CrossMixing(Loop).DesignLevel; + print(state.files.eio, + Format_720, + "CrossMixing", + state.dataHeatBal->CrossMixing(Loop).Name, + GetScheduleName(state, state.dataHeatBal->CrossMixing(Loop).SchedPtr), + state.dataHeatBal->Zone(ZoneNum).Name, + state.dataHeatBal->Zone(ZoneNum).FloorArea, + state.dataHeatBal->Zone(ZoneNum).TotOccupants); + + print(state.files.eio, "{:.3R},", state.dataHeatBal->CrossMixing(Loop).DesignLevel); + + divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).FloorArea, state.dataHeatBal->CrossMixing(Loop).DesignLevel); + divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).TotOccupants, state.dataHeatBal->CrossMixing(Loop).DesignLevel); + divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).Volume, + state.dataHeatBal->CrossMixing(Loop).DesignLevel * DataGlobalConstants::SecInHour); + + print(state.files.eio, "{},", state.dataHeatBal->Zone(state.dataHeatBal->CrossMixing(Loop).FromZone).Name); + print(state.files.eio, "{:.2R}\n", state.dataHeatBal->CrossMixing(Loop).DeltaTemperature); + } + + if (state.dataHeatBal->TotRefDoorMixing > 0) { + static constexpr std::string_view Format_724("! <{} Airflow Stats Nominal>, {}\n"); + print(state.files.eio, + Format_724, + "RefrigerationDoorMixing ", + "Name, Zone 1 Name,Zone 2 Name,Door Opening Schedule Name,Door Height {m},Door Area {m2},Door Protection Type"); + for (ZoneNumA = 1; ZoneNumA <= (state.dataGlobal->NumOfZones - 1); ++ZoneNumA) { + if (!state.dataHeatBal->RefDoorMixing(ZoneNumA).RefDoorMixFlag) continue; + for (ConnectionNumber = 1; ConnectionNumber <= state.dataHeatBal->RefDoorMixing(ZoneNumA).NumRefDoorConnections; ++ConnectionNumber) { + ZoneNumB = state.dataHeatBal->RefDoorMixing(ZoneNumA).MateZonePtr(ConnectionNumber); + // TotMixingFlow(ZoneNum)=TotMixingFlow(ZoneNum)+RefDoorMixing(Loop)%!DesignLevel + static constexpr std::string_view Format_723(" {} Airflow Stats Nominal, {},{},{},{},{:.3R},{:.3R},{}\n"); + print(state.files.eio, + Format_723, + "RefrigerationDoorMixing", + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorMixingObjectName(ConnectionNumber), + state.dataHeatBal->Zone(ZoneNumA).Name, + state.dataHeatBal->Zone(ZoneNumB).Name, + GetScheduleName(state, state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr(ConnectionNumber)), + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight(ConnectionNumber), + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea(ConnectionNumber), + state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName(ConnectionNumber)); + } // ConnectionNumber + } // ZoneNumA + } //(TotRefDoorMixing .GT. 0) + + for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + state.dataHeatBal->Zone(ZoneNum).NominalInfilVent = TotInfilVentFlow(ZoneNum); + state.dataHeatBal->Zone(ZoneNum).NominalMixing = TotMixingFlow(ZoneNum); + } + + if (state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance) { + // Check for infiltration in zone which are only a mixing source zone + for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + if ((state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment != DataHeatBalance::AdjustmentType::NoAdjustReturnAndMixing && + state.dataHeatBal->MassConservation(ZoneNum).IsOnlySourceZone) && + (state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment != DataHeatBalance::InfiltrationFlow::No)) { + if (state.dataHeatBal->MassConservation(ZoneNum).InfiltrationPtr == 0) { + ShowSevereError( + state, std::string{RoutineName} + ": Infiltration object is not defined for zone = " + state.dataHeatBal->Zone(ZoneNum).Name); + ShowContinueError(state, "Zone air mass flow balance requires infiltration object for source zones of mixing objects"); + } + } + } + // Set up zone air mass balance output variables + for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + SetupOutputVariable(state, + "Zone Air Mass Balance Supply Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->MassConservation(ZoneNum).InMassFlowRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneNum).Name); + SetupOutputVariable(state, + "Zone Air Mass Balance Exhaust Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->MassConservation(ZoneNum).ExhMassFlowRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneNum).Name); + SetupOutputVariable(state, + "Zone Air Mass Balance Return Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->MassConservation(ZoneNum).RetMassFlowRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneNum).Name); + if ((state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment != DataHeatBalance::AdjustmentType::NoAdjustReturnAndMixing) && + ((state.dataHeatBal->MassConservation(ZoneNum).NumSourceZonesMixingObject + + state.dataHeatBal->MassConservation(ZoneNum).NumReceivingZonesMixingObject) > 0)) { + SetupOutputVariable(state, + "Zone Air Mass Balance Mixing Receiving Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->MassConservation(ZoneNum).MixingMassFlowRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneNum).Name); + SetupOutputVariable(state, + "Zone Air Mass Balance Mixing Source Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->MassConservation(ZoneNum).MixingSourceMassFlowRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneNum).Name); + } + if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment != DataHeatBalance::InfiltrationFlow::No) { + if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationForZones == DataHeatBalance::InfiltrationZoneType::AllZones || + (state.dataHeatBal->MassConservation(ZoneNum).NumSourceZonesMixingObject > 0)) { + if (state.dataHeatBal->MassConservation(ZoneNum).InfiltrationPtr > 0) { + SetupOutputVariable(state, + "Zone Air Mass Balance Infiltration Mass Flow Rate", + OutputProcessor::Unit::kg_s, + state.dataHeatBal->MassConservation(ZoneNum).InfiltrationMassFlowRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneNum).Name); + SetupOutputVariable(state, + "Zone Air Mass Balance Infiltration Status", + OutputProcessor::Unit::None, + state.dataHeatBal->MassConservation(ZoneNum).IncludeInfilToZoneMassBal, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneNum).Name); + } + } + } + } + } + + TotInfilVentFlow.deallocate(); + TotMixingFlow.deallocate(); + // ' Area per Occupant {m2/person}, Occupant per Area {person/m2}, Interior Lighting {W/m2}, ', & + // 'Electric Load {W/m2}, Gas Load {W/m2}, Other Load {W/m2}, Hot Water Eq {W/m2}, Outdoor Controlled Baseboard Heat') +} + +void GetRoomAirModelParameters(EnergyPlusData &state, bool &errFlag) // True if errors found during this input routine +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Brent Griffith + // DATE WRITTEN August 2001 + // MODIFIED na + // RE-ENGINEERED April 2003, Weixiu Kong + // December 2003, CC + + // PURPOSE OF THIS SUBROUTINE: + // Get room air model parameters for all zones at once + + // Using/Aliasing + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int NumAlphas; // States which alpha value to read from a + // "Number" line + int NumNumbers; // Number of numbers encountered + int Status; // Notes if there was an error in processing the input + int AirModelNum; + int NumOfAirModels; + int ZoneNum; + bool ErrorsFound; + bool IsNotOK; + + // Initialize default values for air model parameters + state.dataRoomAirMod->AirModel.allocate(state.dataGlobal->NumOfZones); + + ErrorsFound = false; + auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; + + cCurrentModuleObject = "RoomAirModelType"; + NumOfAirModels = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + if (NumOfAirModels > state.dataGlobal->NumOfZones) { + ShowSevereError(state, "Too many " + cCurrentModuleObject + ". Cannot exceed the number of Zones."); + ErrorsFound = true; + } + if (NumOfAirModels > 0) { + state.dataRoomAirMod->IsZoneDV.dimension(state.dataGlobal->NumOfZones, false); + state.dataRoomAirMod->IsZoneCV.dimension(state.dataGlobal->NumOfZones, false); + state.dataRoomAirMod->IsZoneUI.dimension(state.dataGlobal->NumOfZones, false); + } + + for (AirModelNum = 1; AirModelNum <= NumOfAirModels; ++AirModelNum) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + AirModelNum, + state.dataIPShortCut->cAlphaArgs, + NumAlphas, + state.dataIPShortCut->rNumericArgs, + NumNumbers, + Status, + _, + _, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + ZoneNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataHeatBal->Zone); + if (ZoneNum != 0) { + if (!state.dataRoomAirMod->AirModel(ZoneNum).AirModelName.empty()) { + ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(2) + " = " + state.dataIPShortCut->cAlphaArgs(2)); + ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1)); + ShowContinueError(state, "Duplicate zone name, only one type of roomair model is allowed per zone"); + ShowContinueError(state, + "Zone " + state.dataIPShortCut->cAlphaArgs(2) + " was already assigned a roomair model by " + cCurrentModuleObject + + " = " + state.dataRoomAirMod->AirModel(ZoneNum).AirModelName); + ShowContinueError(state, + format("Air Model Type for zone already set to {}", + DataRoomAirModel::ChAirModel[static_cast(state.dataRoomAirMod->AirModel(ZoneNum).AirModelType)])); + ShowContinueError(state, "Trying to overwrite with model type = " + state.dataIPShortCut->cAlphaArgs(3)); + ErrorsFound = true; + } + state.dataRoomAirMod->AirModel(ZoneNum).AirModelName = state.dataIPShortCut->cAlphaArgs(1); + state.dataRoomAirMod->AirModel(ZoneNum).ZoneName = state.dataIPShortCut->cAlphaArgs(2); + + state.dataRoomAirMod->AirModel(ZoneNum).AirModelType = + static_cast(getEnumerationValue(roomAirModelNamesUC, state.dataIPShortCut->cAlphaArgs(3))); + switch (state.dataRoomAirMod->AirModel(ZoneNum).AirModelType) { + case DataRoomAirModel::RoomAirModel::Mixing: + // nothing to do here actually + break; + + case DataRoomAirModel::RoomAirModel::Mundt: + state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; + state.dataRoomAirMod->MundtModelUsed = true; + IsNotOK = false; + ValidateComponent(state, + "RoomAirSettings:OneNodeDisplacementVentilation", + "zone_name", + state.dataIPShortCut->cAlphaArgs(2), + IsNotOK, + "GetRoomAirModelParameters"); + if (IsNotOK) { + ShowContinueError(state, "In " + cCurrentModuleObject + '=' + state.dataIPShortCut->cAlphaArgs(1) + '.'); + ErrorsFound = true; + } + break; + + case DataRoomAirModel::RoomAirModel::UCSDDV: + state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; + state.dataRoomAirMod->UCSDModelUsed = true; + IsNotOK = false; + ValidateComponent(state, + "RoomAirSettings:ThreeNodeDisplacementVentilation", + "zone_name", + state.dataIPShortCut->cAlphaArgs(2), + IsNotOK, + "GetRoomAirModelParameters"); + if (IsNotOK) { + ShowContinueError(state, "In " + cCurrentModuleObject + '=' + state.dataIPShortCut->cAlphaArgs(1) + '.'); + ErrorsFound = true; + } + break; + + case DataRoomAirModel::RoomAirModel::UCSDCV: + state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; + state.dataRoomAirMod->UCSDModelUsed = true; + IsNotOK = false; + ValidateComponent(state, + "RoomAirSettings:CrossVentilation", + "zone_name", + state.dataIPShortCut->cAlphaArgs(2), + IsNotOK, + "GetRoomAirModelParameters"); + if (IsNotOK) { + ShowContinueError(state, "In " + cCurrentModuleObject + '=' + state.dataIPShortCut->cAlphaArgs(1) + '.'); + ErrorsFound = true; + } + break; + + case DataRoomAirModel::RoomAirModel::UCSDUFI: + state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; + state.dataRoomAirMod->UCSDModelUsed = true; + ValidateComponent(state, + "RoomAirSettings:UnderFloorAirDistributionInterior", + "zone_name", + state.dataIPShortCut->cAlphaArgs(2), + IsNotOK, + "GetRoomAirModelParameters"); + if (IsNotOK) { + ShowContinueError(state, "In " + cCurrentModuleObject + '=' + state.dataIPShortCut->cAlphaArgs(1) + '.'); + ErrorsFound = true; + } + break; + + case DataRoomAirModel::RoomAirModel::UCSDUFE: + state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; + state.dataRoomAirMod->UCSDModelUsed = true; + ValidateComponent(state, + "RoomAirSettings:UnderFloorAirDistributionExterior", + "zone_name", + state.dataIPShortCut->cAlphaArgs(2), + IsNotOK, + "GetRoomAirModelParameters"); + if (IsNotOK) { + ShowContinueError(state, "In " + cCurrentModuleObject + '=' + state.dataIPShortCut->cAlphaArgs(1) + '.'); + ErrorsFound = true; + } + break; + + case DataRoomAirModel::RoomAirModel::UserDefined: + state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; + state.dataRoomAirMod->UserDefinedUsed = true; + break; + + case DataRoomAirModel::RoomAirModel::AirflowNetwork: + state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; + if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "AirflowNetwork:SimulationControl") == 0) { + ShowSevereError(state, + "In " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1) + ": " + + state.dataIPShortCut->cAlphaFieldNames(3) + " = AIRFLOWNETWORK."); + ShowContinueError(state, + "This model requires AirflowNetwork:* objects to form a complete network, including " + "AirflowNetwork:Intrazone:Node and AirflowNetwork:Intrazone:Linkage."); + ShowContinueError(state, "AirflowNetwork:SimulationControl not found."); + ErrorsFound = true; + } + break; + + default: + ShowWarningError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(3) + " = " + state.dataIPShortCut->cAlphaArgs(3)); + ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1)); + ShowContinueError(state, "The mixing air model will be used for Zone =" + state.dataIPShortCut->cAlphaArgs(2)); + state.dataRoomAirMod->AirModel(ZoneNum).AirModelType = DataRoomAirModel::RoomAirModel::Mixing; + } + + state.dataRoomAirMod->AirModel(ZoneNum).TempCoupleScheme = + static_cast(getEnumerationValue(couplingSchemeNamesUC, state.dataIPShortCut->cAlphaArgs(4))); + if (state.dataRoomAirMod->AirModel(ZoneNum).TempCoupleScheme == DataRoomAirModel::CouplingScheme::Invalid) { + ShowWarningError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(4) + " = " + state.dataIPShortCut->cAlphaArgs(4)); + ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1)); + ShowContinueError(state, "The direct coupling scheme will be used for Zone =" + state.dataIPShortCut->cAlphaArgs(2)); + state.dataRoomAirMod->AirModel(ZoneNum).TempCoupleScheme = DataRoomAirModel::CouplingScheme::Direct; + } + + } else { // Zone Not Found + ShowSevereError(state, cCurrentModuleObject + ", Zone not found=" + state.dataIPShortCut->cAlphaArgs(2)); + ShowContinueError(state, "occurs in " + cCurrentModuleObject + '=' + state.dataIPShortCut->cAlphaArgs(1)); + ErrorsFound = true; + } + } // AirModel_Param_Loop + + for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + // this used to be an if (NumOfAirModels == 0) block, but both the IF and the ELSE had the same content, these two lines: + state.dataRoomAirMod->AirModel(ZoneNum).AirModelName = "MIXING AIR MODEL FOR " + state.dataHeatBal->Zone(ZoneNum).Name; + state.dataRoomAirMod->AirModel(ZoneNum).ZoneName = state.dataHeatBal->Zone(ZoneNum).Name; + // set global flag for non-mixing model + if (state.dataRoomAirMod->AirModel(ZoneNum).AirModelType != DataRoomAirModel::RoomAirModel::Mixing) { + state.dataRoomAirMod->anyNonMixingRoomAirModel = true; + } + } + + // Write RoomAir Model details onto EIO file + static constexpr std::string_view RoomAirHeader("! , Zone Name, Mixing/Mundt/UCSDDV/UCSDCV/UCSDUFI/UCSDUFE/User Defined\n"); + print(state.files.eio, RoomAirHeader); + for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + { + static constexpr std::string_view RoomAirZoneFmt("RoomAir Model,{},{}\n"); + + switch (state.dataRoomAirMod->AirModel(ZoneNum).AirModelType) { + case DataRoomAirModel::RoomAirModel::Mixing: { + print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "Mixing/Well-Stirred"); + } break; + case DataRoomAirModel::RoomAirModel::Mundt: { + print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "OneNodeDisplacementVentilation"); + } break; + case DataRoomAirModel::RoomAirModel::UCSDDV: { + print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "ThreeNodeDisplacementVentilation"); + } break; + case DataRoomAirModel::RoomAirModel::UCSDCV: { + print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "CrossVentilation"); + } break; + case DataRoomAirModel::RoomAirModel::UCSDUFI: { + print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "UnderFloorAirDistributionInterior"); + } break; + case DataRoomAirModel::RoomAirModel::UCSDUFE: { + print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "UnderFloorAirDistributionExterior"); + } break; + case DataRoomAirModel::RoomAirModel::UserDefined: { + print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "UserDefined"); + } break; + case DataRoomAirModel::RoomAirModel::AirflowNetwork: { + print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "AirflowNetwork"); + } break; + default: + break; + } + } + } + + if (ErrorsFound) { + ShowSevereError(state, "Errors found in processing input for " + cCurrentModuleObject); + errFlag = true; + } +} + +void InitAirHeatBalance(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Richard J. Liesen + // DATE WRITTEN February 1998 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine is for initializations within the + // air heat balance. + + // Do the Begin Day initializations + if (state.dataGlobal->BeginDayFlag) { + } + + // Do the following initializations (every time step): + InitSimpleMixingConvectiveHeatGains(state); +} + +void InitSimpleMixingConvectiveHeatGains(EnergyPlusData &state) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Richard Liesen + // DATE WRITTEN February 1998 + // MODIFIED March 2003, FCW: allow individual window/door venting control + // DATE MODIFIED April 2000 + // May 2009, Brent Griffith added EMS override to mixing and cross mixing flows + // renamed routine and did some cleanup + // August 2011, Therese Stovall added refrigeration door mixing flows + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine sets up the mixing and cross mixing flows + + using ScheduleManager::GetCurrentScheduleValue; + using ScheduleManager::GetScheduleIndex; + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int Loop; // local loop index + int NZ; // local index for zone number + int J; // local index for second zone in refrig door pair + + int ZoneNum; // zone counter + Real64 ZoneMixingFlowSum; // sum of zone mixing flows for a zone + int NumOfMixingObjects; // number of mixing objects for a receiving zone + + // Select type of airflow calculation + if (state.dataHeatBal->AirFlowFlag) { // Simplified airflow calculation + // Process the scheduled Mixing for air heat balance + for (Loop = 1; Loop <= state.dataHeatBal->TotMixing; ++Loop) { + NZ = state.dataHeatBal->Mixing(Loop).ZonePtr; + state.dataHeatBal->Mixing(Loop).DesiredAirFlowRate = + state.dataHeatBal->Mixing(Loop).DesignLevel * GetCurrentScheduleValue(state, state.dataHeatBal->Mixing(Loop).SchedPtr); + if (state.dataHeatBal->Mixing(Loop).EMSSimpleMixingOn) + state.dataHeatBal->Mixing(Loop).DesiredAirFlowRate = state.dataHeatBal->Mixing(Loop).EMSimpleMixingFlowRate; + state.dataHeatBal->Mixing(Loop).DesiredAirFlowRateSaved = state.dataHeatBal->Mixing(Loop).DesiredAirFlowRate; + } + + // if zone air mass flow balance enforced calculate the fraction of + // contribution of each mixing object to a zone mixed flow rate, BAN Feb 2014 + if (state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance) { + for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + ZoneMixingFlowSum = 0.0; + NumOfMixingObjects = state.dataHeatBal->MassConservation(ZoneNum).NumReceivingZonesMixingObject; + for (Loop = 1; Loop <= NumOfMixingObjects; ++Loop) { + ZoneMixingFlowSum = ZoneMixingFlowSum + state.dataHeatBal->Mixing(Loop).DesignLevel; + } + if (ZoneMixingFlowSum > 0.0) { + for (Loop = 1; Loop <= NumOfMixingObjects; ++Loop) { + state.dataHeatBal->MassConservation(ZoneNum).ZoneMixingReceivingFr(Loop) = + state.dataHeatBal->Mixing(Loop).DesignLevel / ZoneMixingFlowSum; + } + } + } + } + + // Process the scheduled CrossMixing for air heat balance + for (Loop = 1; Loop <= state.dataHeatBal->TotCrossMixing; ++Loop) { + NZ = state.dataHeatBal->CrossMixing(Loop).ZonePtr; + state.dataHeatBal->CrossMixing(Loop).DesiredAirFlowRate = + state.dataHeatBal->CrossMixing(Loop).DesignLevel * GetCurrentScheduleValue(state, state.dataHeatBal->CrossMixing(Loop).SchedPtr); + if (state.dataHeatBal->CrossMixing(Loop).EMSSimpleMixingOn) + state.dataHeatBal->CrossMixing(Loop).DesiredAirFlowRate = state.dataHeatBal->CrossMixing(Loop).EMSimpleMixingFlowRate; + } + + // Note - do each Pair a Single time, so must do increment reports for both zones + // Can't have a pair that has ZoneA zone number = NumOfZones because organized + // in input with lowest zone # first no matter how input in idf + + // Process the scheduled Refrigeration Door mixing for air heat balance + if (state.dataHeatBal->TotRefDoorMixing > 0) { + for (NZ = 1; NZ <= (state.dataGlobal->NumOfZones - 1); + ++NZ) { // Can't have %ZonePtr==NumOfZones because lesser zone # of pair placed in ZonePtr in input + if (!state.dataHeatBal->RefDoorMixing(NZ).RefDoorMixFlag) continue; + if (state.dataHeatBal->RefDoorMixing(NZ).ZonePtr == NZ) { + for (J = 1; J <= state.dataHeatBal->RefDoorMixing(NZ).NumRefDoorConnections; ++J) { + state.dataHeatBal->RefDoorMixing(NZ).VolRefDoorFlowRate(J) = 0.0; + if (state.dataHeatBal->RefDoorMixing(NZ).EMSRefDoorMixingOn(J)) + state.dataHeatBal->RefDoorMixing(NZ).VolRefDoorFlowRate(J) = state.dataHeatBal->RefDoorMixing(NZ).EMSRefDoorFlowRate(J); + } + } + } + } // TotRefDoorMixing + + // Infiltration and ventilation calculations have been moved to a subroutine of CalcAirFlowSimple in HVAC Manager + } +} + +void CalcHeatBalanceAir(EnergyPlusData &state) +{ + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine calculates the air component of the heat balance. + + if (state.dataGlobal->externalHVACManager) { + if (!state.dataGlobal->externalHVACManagerInitialized) { + initializeForExternalHVACManager(state); + } + state.dataGlobal->externalHVACManager(&state); + } else { + HVACManager::ManageHVAC(state); + } +} + +// END Algorithm Section of the Module + +void initializeForExternalHVACManager(EnergyPlusData &state) +{ + // this function will ultimately provide a nice series of calls that initialize all the hvac stuff needed + // to allow an external hvac manager to play nice with E+ + EnergyPlus::ZoneTempPredictorCorrector::InitZoneAirSetPoints(state); + if (!state.dataZoneEquip->ZoneEquipInputsFilled) { + EnergyPlus::DataZoneEquipment::GetZoneEquipmentData(state); + state.dataZoneEquip->ZoneEquipInputsFilled = true; + } +} + +void ReportZoneMeanAirTemp(EnergyPlusData &state) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN July 2000 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine updates the report variables for the AirHeatBalance. + + // Using/Aliasing + using Psychrometrics::PsyTdpFnWPb; + using ScheduleManager::GetCurrentScheduleValue; + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int ZoneLoop; // Counter for the # of zones (nz) + int TempControlledZoneID; // index for zone in TempConrolled Zone structure + Real64 thisMRTFraction; // temp working value for radiative fraction/weight + + for (ZoneLoop = 1; ZoneLoop <= state.dataGlobal->NumOfZones; ++ZoneLoop) { + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneLoop); + // The mean air temperature is actually ZTAV which is the average + // temperature of the air temperatures at the system time step for the + // entire zone time step. + state.dataHeatBal->ZnAirRpt(ZoneLoop).MeanAirTemp = thisZoneHB.ZTAV; + state.dataHeatBal->ZnAirRpt(ZoneLoop).MeanAirHumRat = thisZoneHB.ZoneAirHumRatAvg; + state.dataHeatBal->ZnAirRpt(ZoneLoop).OperativeTemp = 0.5 * (thisZoneHB.ZTAV + state.dataHeatBal->ZoneMRT(ZoneLoop)); + state.dataHeatBal->ZnAirRpt(ZoneLoop).MeanAirDewPointTemp = + PsyTdpFnWPb(state, state.dataHeatBal->ZnAirRpt(ZoneLoop).MeanAirHumRat, state.dataEnvrn->OutBaroPress); + + // if operative temperature control is being used, then radiative fraction/weighting + // might be defined by user to be something different than 0.5, even scheduled over simulation period + if (state.dataZoneCtrls->AnyOpTempControl) { // dig further... + // find TempControlledZoneID from ZoneLoop index + TempControlledZoneID = state.dataHeatBal->Zone(ZoneLoop).TempControlledZoneIndex; + if (state.dataHeatBal->Zone(ZoneLoop).IsControlled) { + if ((state.dataZoneCtrls->TempControlledZone(TempControlledZoneID).OperativeTempControl)) { + // is operative temp radiative fraction scheduled or fixed? + if (state.dataZoneCtrls->TempControlledZone(TempControlledZoneID).OpTempCntrlModeScheduled) { + thisMRTFraction = GetCurrentScheduleValue( + state, state.dataZoneCtrls->TempControlledZone(TempControlledZoneID).OpTempRadiativeFractionSched); + } else { + thisMRTFraction = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID).FixedRadiativeFraction; + } + state.dataHeatBal->ZnAirRpt(ZoneLoop).ThermOperativeTemp = + (1.0 - thisMRTFraction) * thisZoneHB.ZTAV + thisMRTFraction * state.dataHeatBal->ZoneMRT(ZoneLoop); + } + } + } + } +} + +} // namespace EnergyPlus::HeatBalanceAirManager diff --git a/src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceManager.cc b/src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceManager.cc new file mode 100644 index 00000000000..65bf5c190c4 --- /dev/null +++ b/src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceManager.cc @@ -0,0 +1,10278 @@ +// EnergyPlus, Copyright (c) 1996-2022, The Board of Trustees of the University of Illinois, +// The Regents of the University of California, through Lawrence Berkeley National Laboratory +// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge +// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other +// contributors. All rights reserved. +// +// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the +// U.S. Government consequently retains certain rights. As such, the U.S. Government has been +// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, +// worldwide license in the Software to reproduce, distribute copies to the public, prepare +// derivative works, and perform publicly and display publicly, and to permit others to do so. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted +// provided that the following conditions are met: +// +// (1) Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// (2) Redistributions in binary form must reproduce the above copyright notice, this list of +// conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, +// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific prior +// written permission. +// +// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form +// without changes from the version obtained under this License, or (ii) Licensee makes a +// reference solely to the software portion of its product, Licensee must refer to the +// software as "EnergyPlus version X" software, where "X" is the version number Licensee +// obtained under this License and may not use a different name for the software. Except as +// specifically required in this Section (4), Licensee shall not use in a company name, a +// product name, in advertising, publicity, or other promotional activities any name, trade +// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly +// similar designation, without the U.S. Department of Energy's prior written consent. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +// C++ Headers +#include +#include +#include + +// ObjexxFCL Headers +#include +#include +#include +#include +#include + +// EnergyPlus Headers +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace EnergyPlus { + +namespace HeatBalanceManager { + + // Module containing the heat balance simulation routines + // calculation (initialization) routines + + // MODULE INFORMATION: + // AUTHOR Richard J. Liesen + // DATE WRITTEN February 1998 + // MODIFIED November 1998, FW + // MODIFIED April 1999, LKL + // MODIFIED Dec 2006 DJS of PSU for ecoroof + // Added Dec 2008 TH for thermochromic windows: + // new subroutine CreateTCConstructions called by GetHeatBalanceInput + // RE-ENGINEERED na + + // PURPOSE OF THIS MODULE: + // To encapsulate the data and algorithms required to + // manage the heat balance simulation on the building. + + // METHODOLOGY EMPLOYED: + + // REFERENCES: + // The heat balance method is outlined in the "Tarp Algorithms Manual" + // The methods are also summarized in many BSO Theses and papers. + + // OTHER NOTES: + // This module was created from IBLAST subroutines + + // USE STATEMENTS: + // Use statements for data only modules + // Using/Aliasing + using namespace DataComplexFenestration; + using namespace DataEnvironment; + using namespace DataHeatBalance; + using namespace DataHeatBalSurface; + using namespace DataRoomAirModel; + using DataSurfaces::FrameDividerProperties; + using ScheduleManager::GetCurrentScheduleValue; + using ScheduleManager::GetScheduleIndex; + using WindowComplexManager::CalculateBasisLength; + using WindowManager::W5LsqFit; + + Array1D_string const PassFail(2, {"Fail", "Pass"}); + + void ManageHeatBalance(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Rick Strand + // DATE WRITTEN January 1997 + // MODIFIED February 1998 Richard Liesen + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine manages the heat balance method of calculating + // building thermal loads. It is called from the SimulationManager + // at the time step level. This driver manages the calls to all of + // the other modules, drivers, and simulation algorithms. + + // METHODOLOGY EMPLOYED: + // The order of this routine was taken from HeatBalanceModule with routine + // and Data Structuring + + // REFERENCES: + // Legacy code from (I)BLAST, subroutine SIMZGD. + + // Using/Aliasing + using namespace HeatBalanceSurfaceManager; + using EMSManager::ManageEMS; + using EMSManager::UpdateEMSTrendVariables; + + // Locals + // SUBROUTINE ARGUMENT DEFINITIONS: + // na + + // SUBROUTINE PARAMETER DEFINITIONS: + // na + + // INTERFACE BLOCK SPECIFICATIONS: + // na + + // DERIVED TYPE DEFINITIONS: + // na + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + + // Get the heat balance input at the beginning of the simulation only + if (state.dataHeatBalMgr->ManageHeatBalanceGetInputFlag) { + GetHeatBalanceInput(state); // Obtains heat balance related parameters from input file + // if (state.dataGlobal->DoingSizing) state.dataHeatBal->doSpaceHeatBalance = state.dataHeatBal->doSpaceHeatBalanceSizing; + state.dataHeatBal->doSpaceHeatBalance = true; + HeatBalanceIntRadExchange::InitSolarViewFactors(state); + + // Surface octree setup + // The surface octree holds live references to surfaces so it must be updated + // if in the future surfaces are altered after this point + if (state.dataSurface->TotSurfaces >= DaylightingManager::octreeCrossover) { // Octree can be active + if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Daylighting:Controls") > 0) { // Daylighting is active + state.dataHeatBalMgr->surfaceOctree.init(state.dataSurface->Surface); // Set up surface octree + } + } + + for (auto &surface : state.dataSurface->Surface) + surface.set_computed_geometry(); // Set up extra surface geometry info for PierceSurface + + state.dataHeatBalMgr->ManageHeatBalanceGetInputFlag = false; + } + + bool anyRan; + + ManageEMS(state, + EMSManager::EMSCallFrom::BeginZoneTimestepBeforeInitHeatBalance, + anyRan, + ObjexxFCL::Optional_int_const()); // EMS calling point + + // These Inits will still have to be looked at as the routines are re-engineered further + + InitHeatBalance(state); // Initialize all heat balance related parameters + ManageEMS( + state, EMSManager::EMSCallFrom::BeginZoneTimestepAfterInitHeatBalance, anyRan, ObjexxFCL::Optional_int_const()); // EMS calling point + + // Solve the zone heat balance by first calling the Surface Heat Balance Manager + // and then the Air Heat Balance Manager is called by the Surface Heat Balance + // Manager. The order of execution is still important and the zone cannot + // go through any record keeping before the HVAC system has run because there + // may be a radiant system in the building which will require iteration between + // the HVAC system (called from the Air Heat Balance) and the zone (simulated + // in the Surface Heat Balance Manager). In the future, this may be improved. + ManageSurfaceHeatBalance(state); + ManageEMS(state, EMSManager::EMSCallFrom::EndZoneTimestepBeforeZoneReporting, anyRan, ObjexxFCL::Optional_int_const()); // EMS calling point + RecKeepHeatBalance(state); // Do any heat balance related record keeping + + // This call has been moved to the FanSystemModule and does effect the output file + // You do get a shift in the Air Handling System Summary for the building electric loads + // IF ((.NOT.WarmupFlag).AND.(DayOfSim.GT.0)) CALL RCKEEP ! Do fan system accounting (to be moved later) + + ReportHeatBalance(state); // Manage heat balance reporting until the new reporting is in place + + ManageEMS(state, EMSManager::EMSCallFrom::EndZoneTimestepAfterZoneReporting, anyRan, ObjexxFCL::Optional_int_const()); // EMS calling point + + UpdateEMSTrendVariables(state); + EnergyPlus::PluginManagement::PluginManager::updatePluginValues(state); + + if (state.dataGlobal->WarmupFlag && state.dataGlobal->EndDayFlag) { + + CheckWarmupConvergence(state); + if (!state.dataGlobal->WarmupFlag) { + state.dataGlobal->DayOfSim = 0; // Reset DayOfSim if Warmup converged + state.dataGlobal->DayOfSimChr = "0"; + + ManageEMS(state, EMSManager::EMSCallFrom::BeginNewEnvironmentAfterWarmUp, anyRan, ObjexxFCL::Optional_int_const()); // calling point + } + } + + if (!state.dataGlobal->WarmupFlag && state.dataGlobal->EndDayFlag && state.dataGlobal->DayOfSim == 1 && !state.dataGlobal->DoingSizing) { + ReportWarmupConvergence(state); + } + } + + // Get Input Section of the Module + //****************************************************************************** + + void GetHeatBalanceInput(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Rick Strand + // DATE WRITTEN September 1997 + // MODIFIED February 1998 Richard Liesen + // November 1998 FW + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine is the main driver for initializations within the + // heat balance. + + // METHODOLOGY EMPLOYED: + // na + + // REFERENCES: + // na + + // Using/Aliasing + using InternalHeatGains::ManageInternalHeatGains; + + // Locals + // SUBROUTINE ARGUMENT DEFINITIONS: + // na + + // SUBROUTINE PARAMETER DEFINITIONS: + // na + + // INTERFACE BLOCK SPECIFICATIONS: + // na + + // DERIVED TYPE DEFINITIONS: + // na + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + bool ErrorsFound(false); // If errors detected in input + bool ValidSimulationWithNoZones; + + GetProjectControlData(state, ErrorsFound); + + GetSiteAtmosphereData(state, ErrorsFound); + + GetWindowGlassSpectralData(state, ErrorsFound); + + GetMaterialData(state, ErrorsFound); // Read materials from input file/transfer from legacy data structure + + GetFrameAndDividerData(state, ErrorsFound); + + GetConstructData(state, ErrorsFound); // Read constructs from input file/transfer from legacy data structure + + GetBuildingData(state, ErrorsFound); // Read building data from input file + + GetIncidentSolarMultiplier(state, ErrorsFound); + + // Added SV 6/26/2013 to load scheduled surface gains + GetScheduledSurfaceGains(state, ErrorsFound); + + if (state.dataSurface->UseRepresentativeSurfaceCalculations) { + print(state.files.eio, "{}\n", "! ,Surface Name,Representative Surface Name"); + for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) { + auto &RepSurfNum = state.dataSurface->Surface(SurfNum).RepresentativeCalcSurfNum; + if (SurfNum != RepSurfNum) { + print(state.files.eio, + " Representative Surface Assignment,{},{}\n", + state.dataSurface->Surface(SurfNum).Name, + state.dataSurface->Surface(RepSurfNum).Name); + } + } + } + + // Added TH 1/9/2009 to create thermochromic window constructions + CreateTCConstructions(state, ErrorsFound); + + if (state.dataSurface->TotSurfaces > 0 && state.dataGlobal->NumOfZones == 0) { + ValidSimulationWithNoZones = CheckValidSimulationObjects(state); + if (!ValidSimulationWithNoZones) { + ShowSevereError(state, "GetHeatBalanceInput: There are surfaces in input but no zones found. Invalid simulation."); + ErrorsFound = true; + } + } + + CheckUsedConstructions(state, ErrorsFound); + + if (ErrorsFound) { + ShowFatalError(state, "Errors found in Building Input, Program Stopped"); + } + + // following is done to "get internal heat gains" input so that lights are gotten before + // daylighting input + ManageInternalHeatGains(state, true); + + // following is done so that people are gotten before for thermal comfort calculations + // Setup Kiva instances + if (state.dataHeatBal->AnyKiva) { + state.dataSurfaceGeometry->kivaManager.setupKivaInstances(state); + } + } + + void CheckUsedConstructions(EnergyPlusData &state, bool &ErrorsFound) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN August 2011 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // Counts or details unused constructions. + + // Using/Aliasing + + // SUBROUTINE PARAMETER DEFINITIONS: + int constexpr NumConstrObjects(6); + Array1D_string const ConstrObjects(NumConstrObjects, + {"Pipe:Indoor", + "Pipe:Outdoor", + "Pipe:Underground", + "GroundHeatExchanger:Surface", + "DaylightingDevice:Tubular", + "EnergyManagementSystem:ConstructionIndexVariable"}); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int Unused; + int Loop; + int NumObjects; + int NumAlphas; + int NumNumbers; + int Status; + int CNum; + int ONum; + bool InErrFlag; // Preserve (no current use) the input status of ErrorsFound + + InErrFlag = ErrorsFound; + + // Needs to account for Pipe:HeatTransfer/indoor, etc constructions. + for (ONum = 1; ONum <= NumConstrObjects; ++ONum) { + NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, ConstrObjects(ONum)); + for (Loop = 1; Loop <= NumObjects; ++Loop) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + ConstrObjects(ONum), + Loop, + state.dataIPShortCut->cAlphaArgs, + NumAlphas, + state.dataIPShortCut->rNumericArgs, + NumNumbers, + Status); + if (ONum == 5) { + CNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(4), state.dataConstruction->Construct); + } else { + CNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataConstruction->Construct); + } + if (CNum == 0) continue; + state.dataConstruction->Construct(CNum).IsUsed = true; + if (ONum == 4 || ONum == 6) { + // GroundHeatExchanger:Surface or EnergyManagementSystem:ConstructionIndexVariable + // Include all EMS constructions since they can potentially be used by a CTF surface + if (!state.dataConstruction->Construct(CNum).TypeIsWindow) { + state.dataConstruction->Construct(CNum).IsUsedCTF = true; + } + } + } + } + Unused = state.dataHeatBal->TotConstructs - std::count_if(state.dataConstruction->Construct.begin(), + state.dataConstruction->Construct.end(), + [](Construction::ConstructionProps const &e) { return e.IsUsed; }); + if (Unused > 0) { + if (!state.dataGlobal->DisplayExtraWarnings) { + ShowWarningError(state, format("CheckUsedConstructions: There are {} nominally unused constructions in input.", Unused)); + ShowContinueError(state, "For explicit details on each unused construction, use Output:Diagnostics,DisplayExtraWarnings;"); + } else { + ShowWarningError(state, format("CheckUsedConstructions: There are {} nominally unused constructions in input.", Unused)); + ShowContinueError(state, "Each Unused construction is shown."); + for (Loop = 1; Loop <= state.dataHeatBal->TotConstructs; ++Loop) { + if (state.dataConstruction->Construct(Loop).IsUsed) continue; + ShowMessage(state, "Construction=" + state.dataConstruction->Construct(Loop).Name); + } + } + } + } + + bool CheckValidSimulationObjects(EnergyPlusData &state) + { + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN July 2008 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS FUNCTION: + // If an input file presents with surfaces but no zones, there are certain objects + // that must be present for the simulation to be valid. This check was necessitated by + // an input file that was entirely detached shading surfaces but no zones (and nothing else). + // Other objects include Solar Collectors, PV arrays. + + // METHODOLOGY EMPLOYED: + // Check for specific objects that must be present for such a simulation to be valid. + + // Return value + bool ValidSimulation; // True is other objects appear to make this a valid simulation. + + ValidSimulation = false; + if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SolarCollector:FlatPlate:Water") > 0) { + ValidSimulation = true; + } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:Photovoltaic") > 0) { + ValidSimulation = true; + } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:InternalCombustionEngine") > 0) { + ValidSimulation = true; + } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:CombustionTurbine") > 0) { + ValidSimulation = true; + } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:FuelCell") > 0) { + ValidSimulation = true; + } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:MicroCHP") > 0) { + ValidSimulation = true; + } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:MicroTurbine") > 0) { + ValidSimulation = true; + } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:WindTurbine") > 0) { + ValidSimulation = true; + } + + return ValidSimulation; + } + + void SetPreConstructionInputParameters(EnergyPlusData &state) + { + // SUBROUTINE INFORMATION: + // AUTHOR Edwin Lee + // DATE WRITTEN October 2014 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine sets parameters that need to be established before any heat balance inputs are read + + int NumAlpha; + int NumNumber; + int IOStat; + + // Get all the construction objects to determine the max layers and use this as the value for DataHeatBalance::MaxSolidWinLayers + // The variable MaxSolidWinLayers is initialized to zero to immediately catch any issues with timing of this routine + + // start by setting this to 5; it will satisfy the regular window constructions (Construction) and the Window5 files + // (Construction:WindowDataFile) + state.dataHeatBal->MaxSolidWinLayers = 7; + + // Construction:ComplexFenestrationState have a limit of 10 layers, so set it up to 10 if they are present + if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:ComplexFenestrationState") > 0) { + state.dataHeatBal->MaxSolidWinLayers = max(state.dataHeatBal->MaxSolidWinLayers, 10); + } + + // then process the rest of the relevant constructions + std::string constructName("Construction:WindowEquivalentLayer"); + int numConstructions(state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, constructName)); + for (int constructionNum = 1; constructionNum <= numConstructions; ++constructionNum) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + constructName, + constructionNum, + state.dataIPShortCut->cAlphaArgs, + NumAlpha, + state.dataIPShortCut->rNumericArgs, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + int numLayersInThisConstruct(NumAlpha - 1); + state.dataHeatBal->MaxSolidWinLayers = max(state.dataHeatBal->MaxSolidWinLayers, numLayersInThisConstruct); + } + + // construction types being ignored as they are opaque: Construction:CfactorUndergroundWall, Construction:FfactorGroundFloor, + } + + void GetProjectControlData(EnergyPlusData &state, bool &ErrorsFound) // Set to true if errors detected during getting data + { + + // SUBROUTINE INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN October 2004 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine gets the project control data before the rest of the building data (such as + // materials) is obtained. + + // METHODOLOGY EMPLOYED: + // na + + // REFERENCES: + // This routine gets the following objects: + // BUILDING + // INSIDE CONVECTION ALGORITHM + // OUTSIDE CONVECTION ALGORITHM + // SOLUTION ALGORITHM + // ASHRAE Handbook of Fundamentals, Chap 16, for the setting of Site Atmospheric defaults based + // on terrain. + // ZoneAirHeatBalanceAlgorithm, Added by L. Gu, 12/09 + // ZoneAirContaminantBalance, Added by L. Gu, 06/10 + + // Using/Aliasing + auto &HVACSystemRootFinding = state.dataRootFinder->HVACSystemRootFinding; + + // Locals + // SUBROUTINE ARGUMENT DEFINITIONS: + + // SUBROUTINE PARAMETER DEFINITIONS: + constexpr const char *RoutineName("GetProjectControlData: "); + + // INTERFACE BLOCK SPECIFICATIONS: + // na + + // DERIVED TYPE DEFINITIONS: + // na + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Array1D_string AlphaName(4); + Array1D BuildingNumbers(5); + int NumAlpha; + int NumNumber; + int IOStat; + int NumObjects; + std::string::size_type TMP; + + // Assign the values to the building data + + state.dataHeatBalMgr->CurrentModuleObject = "Building"; + NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + + if (NumObjects > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + 1, + AlphaName, + NumAlpha, + BuildingNumbers, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + // Building Name (remove certain characters) + state.dataHeatBal->BuildingName = AlphaName(1); + TMP = index(state.dataHeatBal->BuildingName, char(1)); + while (TMP != std::string::npos) { + state.dataHeatBal->BuildingName[TMP] = ','; + TMP = index(state.dataHeatBal->BuildingName, char(1)); + } + TMP = index(state.dataHeatBal->BuildingName, char(2)); + while (TMP != std::string::npos) { + state.dataHeatBal->BuildingName[TMP] = '!'; + TMP = index(state.dataHeatBal->BuildingName, char(2)); + } + TMP = index(state.dataHeatBal->BuildingName, char(3)); + while (TMP != std::string::npos) { + state.dataHeatBal->BuildingName[TMP] = '\\'; + TMP = index(state.dataHeatBal->BuildingName, char(3)); + } + // Building Azimuth (no validation) + state.dataHeatBal->BuildingAzimuth = mod(BuildingNumbers(1), 360.0); + // Terrain + if (AlphaName(2) == "COUNTRY" || AlphaName(2) == "1") { + state.dataEnvrn->SiteWindExp = 0.14; + state.dataEnvrn->SiteWindBLHeight = 270.0; + AlphaName(2) = "Country"; + } else if (AlphaName(2) == "SUBURBS" || AlphaName(2) == "2" || AlphaName(2) == "SUBURB") { + state.dataEnvrn->SiteWindExp = 0.22; + state.dataEnvrn->SiteWindBLHeight = 370.0; + AlphaName(2) = "Suburbs"; + } else if (AlphaName(2) == "CITY" || AlphaName(2) == "3") { + state.dataEnvrn->SiteWindExp = 0.33; + state.dataEnvrn->SiteWindBLHeight = 460.0; + AlphaName(2) = "City"; + } else if (AlphaName(2) == "OCEAN") { + state.dataEnvrn->SiteWindExp = 0.10; + state.dataEnvrn->SiteWindBLHeight = 210.0; + AlphaName(2) = "Ocean"; + } else if (AlphaName(2) == "URBAN") { + state.dataEnvrn->SiteWindExp = 0.22; + state.dataEnvrn->SiteWindBLHeight = 370.0; + AlphaName(2) = "Urban"; + } else { + ShowSevereError(state, + std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + ": " + + state.dataIPShortCut->cAlphaFieldNames(2) + " invalid=" + AlphaName(2)); + state.dataEnvrn->SiteWindExp = 0.14; + state.dataEnvrn->SiteWindBLHeight = 270.0; + AlphaName(2) = AlphaName(2) + "-invalid"; + ErrorsFound = true; + } + // Loads Convergence Tolerance Value + state.dataHeatBal->LoadsConvergTol = BuildingNumbers(2); + if (state.dataHeatBal->LoadsConvergTol <= 0.0) { + ShowSevereError(state, + format("{}{}: {} value invalid, [{:.3R}]", + RoutineName, + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cNumericFieldNames(2), + state.dataHeatBal->LoadsConvergTol)); + ErrorsFound = true; + } + // Temperature Convergence Tolerance Value + state.dataHeatBal->TempConvergTol = BuildingNumbers(3); + if (state.dataHeatBal->TempConvergTol <= 0.0) { + ShowSevereError(state, + format("{}{}: {} value invalid, [{:.3R}]", + RoutineName, + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cNumericFieldNames(3), + state.dataHeatBal->TempConvergTol)); + ErrorsFound = true; + } + // Solar Distribution + if (has_prefix(AlphaName(3), "MIN") || AlphaName(3) == "-1" || state.dataSysVars->lMinimalShadowing) { + state.dataHeatBal->SolarDistribution = DataHeatBalance::Shadowing::Minimal; + AlphaName(3) = "MinimalShadowing"; + state.dataSurface->CalcSolRefl = false; + } else if (AlphaName(3) == "FULLEXTERIOR" || AlphaName(3) == "0") { + state.dataHeatBal->SolarDistribution = DataHeatBalance::Shadowing::FullExterior; + AlphaName(3) = "FullExterior"; + state.dataSurface->CalcSolRefl = false; + } else if (AlphaName(3) == "FULLINTERIORANDEXTERIOR" || AlphaName(3) == "1") { + state.dataHeatBal->SolarDistribution = DataHeatBalance::Shadowing::FullInteriorExterior; + AlphaName(3) = "FullInteriorAndExterior"; + state.dataSurface->CalcSolRefl = false; + } else if (AlphaName(3) == "FULLEXTERIORWITHREFLECTIONS") { + state.dataHeatBal->SolarDistribution = DataHeatBalance::Shadowing::FullExterior; + AlphaName(3) = "FullExteriorWithReflectionsFromExteriorSurfaces"; + state.dataSurface->CalcSolRefl = true; + } else if (AlphaName(3) == "FULLINTERIORANDEXTERIORWITHREFLECTIONS") { + state.dataHeatBal->SolarDistribution = DataHeatBalance::Shadowing::FullInteriorExterior; + AlphaName(3) = "FullInteriorAndExteriorWithReflectionsFromExteriorSurfaces"; + state.dataSurface->CalcSolRefl = true; + } else { + ShowSevereError(state, + std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + ": " + + state.dataIPShortCut->cAlphaFieldNames(3) + " invalid=" + AlphaName(3)); + ErrorsFound = true; + AlphaName(3) = AlphaName(3) + "-invalid"; + } + // Maximum Number of Warmup Days + if (!state.dataIPShortCut->lNumericFieldBlanks(4)) { + state.dataHeatBal->MaxNumberOfWarmupDays = BuildingNumbers(4); + if (state.dataHeatBal->MaxNumberOfWarmupDays <= 0) { + ShowSevereError(state, + format("{}{}: {} invalid, [{}], {} will be used", + RoutineName, + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cNumericFieldNames(4), + state.dataHeatBal->MaxNumberOfWarmupDays, + DefaultMaxNumberOfWarmupDays)); + state.dataHeatBal->MaxNumberOfWarmupDays = DefaultMaxNumberOfWarmupDays; + } + } else { + state.dataHeatBal->MaxNumberOfWarmupDays = DefaultMaxNumberOfWarmupDays; + } + // Minimum Number of Warmup Days + if (!state.dataIPShortCut->lNumericFieldBlanks(5)) { + state.dataHeatBal->MinNumberOfWarmupDays = BuildingNumbers(5); + if (state.dataHeatBal->MinNumberOfWarmupDays <= 0) { + ShowWarningError(state, + format("{}{}: {} invalid, [{}], {} will be used", + RoutineName, + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cNumericFieldNames(5), + state.dataHeatBal->MinNumberOfWarmupDays, + DefaultMinNumberOfWarmupDays)); + state.dataHeatBal->MinNumberOfWarmupDays = DefaultMinNumberOfWarmupDays; + } + } else { + state.dataHeatBal->MinNumberOfWarmupDays = DefaultMinNumberOfWarmupDays; + } + if (state.dataHeatBal->MinNumberOfWarmupDays > state.dataHeatBal->MaxNumberOfWarmupDays) { + ShowWarningError(state, + format("{}{}: {} [{}] is greater than {} [{}], {} will be used.", + RoutineName, + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cNumericFieldNames(5), + state.dataHeatBal->MinNumberOfWarmupDays, + state.dataIPShortCut->cNumericFieldNames(4), + state.dataHeatBal->MaxNumberOfWarmupDays, + state.dataHeatBal->MinNumberOfWarmupDays)); + state.dataHeatBal->MaxNumberOfWarmupDays = state.dataHeatBal->MinNumberOfWarmupDays; + } + + } else { + ShowSevereError(state, format("{} A {} Object must be entered.", RoutineName, state.dataHeatBalMgr->CurrentModuleObject)); + ErrorsFound = true; + state.dataHeatBal->BuildingName = "NOT ENTERED"; + AlphaName(2) = "NOT ENTERED"; + AlphaName(3) = "NOT ENTERED"; + state.dataHeatBal->MaxNumberOfWarmupDays = DefaultMaxNumberOfWarmupDays; + state.dataHeatBal->MinNumberOfWarmupDays = DefaultMinNumberOfWarmupDays; + } + + constexpr const char *Format_720(" Building Information,{},{:.3R},{},{:.5R},{:.5R},{},{},{}\n"); + constexpr const char *Format_721("! , Building Name,North Axis {{deg}},Terrain, Loads Convergence Tolerance " + "Value,Temperature Convergence Tolerance Value, Solar Distribution,Maximum Number of Warmup Days,Minimum " + "Number of Warmup Days\n"); + // Write Building Information to the initialization output file + print(state.files.eio, Format_721); + print(state.files.eio, + Format_720, + state.dataHeatBal->BuildingName, + state.dataHeatBal->BuildingAzimuth, + AlphaName(2), + state.dataHeatBal->LoadsConvergTol, + state.dataHeatBal->TempConvergTol, + AlphaName(3), + state.dataHeatBal->MaxNumberOfWarmupDays, + state.dataHeatBal->MinNumberOfWarmupDays); + // Above should be validated... + + state.dataHeatBalMgr->CurrentModuleObject = "SurfaceConvectionAlgorithm:Inside"; + NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + if (NumObjects > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + 1, + AlphaName, + NumAlpha, + BuildingNumbers, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + + { + auto const SELECT_CASE_var(AlphaName(1)); + + if (SELECT_CASE_var == "SIMPLE") { + state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_ASHRAESimple; + AlphaName(1) = "Simple"; + + } else if ((SELECT_CASE_var == "TARP")) { + state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_ASHRAETARP; + AlphaName(1) = "TARP"; + + } else if (SELECT_CASE_var == "CEILINGDIFFUSER") { + state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_CeilingDiffuser; + AlphaName(1) = "CeilingDiffuser"; + + } else if (SELECT_CASE_var == "TROMBEWALL") { + state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_TrombeWall; + ShowSevereError(state, + "GetInsideConvectionAlgorithm: TrombeWall has been used as a global definition. This is a zone oriented value. " + "Will be illegal in the future."); + AlphaName(1) = "TrombeWall"; + + } else if (SELECT_CASE_var == "ADAPTIVECONVECTIONALGORITHM") { + state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_AdaptiveConvectionAlgorithm; + AlphaName(1) = "AdaptiveConvectionAlgorithm"; + + } else if (SELECT_CASE_var == "ASTMC1340") { + state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_ASTMC1340; + AlphaName(1) = "ASTMC1340"; + + } else { + ShowWarningError(state, + "GetInsideConvectionAlgorithm: Invalid value for " + state.dataHeatBalMgr->CurrentModuleObject + + ", defaulting to TARP, invalid value=" + AlphaName(1)); + state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_ASHRAETARP; + AlphaName(1) = "TARP"; + } + } + } else { + // default value, if not specified + state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_ASHRAETARP; + AlphaName(1) = "TARP"; + } + constexpr const char *Format_722("! , Algorithm {{Simple | TARP | CeilingDiffuser | " + "AdaptiveConvectionAlgorithm}}\nInside Convection Algorithm,{}\n"); + print(state.files.eio, Format_722, AlphaName(1)); + + // Get only the first (if more were input) + state.dataHeatBalMgr->CurrentModuleObject = "SurfaceConvectionAlgorithm:Outside"; + NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + if (NumObjects > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + "SurfaceConvectionAlgorithm:Outside", + 1, + AlphaName, + NumAlpha, + BuildingNumbers, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + { + auto const SELECT_CASE_var(AlphaName(1)); + + if ((SELECT_CASE_var == "SIMPLECOMBINED")) { + state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_ASHRAESimple; + AlphaName(1) = "SimpleCombined"; + + } else if ((SELECT_CASE_var == "TARP")) { + state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_ASHRAETARP; + AlphaName(1) = "TARP"; + + } else if (SELECT_CASE_var == "MOWITT") { + state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_MoWiTTHcOutside; + AlphaName(1) = "MoWitt"; + + } else if ((SELECT_CASE_var == "DOE-2")) { + state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_DOE2HcOutside; + AlphaName(1) = "DOE-2"; + + } else if (SELECT_CASE_var == "ADAPTIVECONVECTIONALGORITHM") { + state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_AdaptiveConvectionAlgorithm; + AlphaName(1) = "AdaptiveConvectionAlgorithm"; + + } else { + ShowWarningError(state, + "GetOutsideConvectionAlgorithm: Invalid value for " + state.dataHeatBalMgr->CurrentModuleObject + + ", defaulting to DOE-2, invalid value=" + AlphaName(1)); + state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_DOE2HcOutside; + AlphaName(1) = "DOE-2"; + } + } + } else { + // default value, if not specified + state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_DOE2HcOutside; + AlphaName(1) = "DOE-2"; + } + + constexpr const char *Format_723("! , Algorithm {{SimpleCombined | TARP | MoWitt | DOE-2 | " + "AdaptiveConvectionAlgorithm}}\nOutside Convection Algorithm,{}\n"); + print(state.files.eio, Format_723, AlphaName(1)); + + state.dataHeatBalMgr->CurrentModuleObject = "HeatBalanceAlgorithm"; + NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + if (NumObjects > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + 1, + AlphaName, + NumAlpha, + BuildingNumbers, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + { + auto const SELECT_CASE_var(AlphaName(1)); + // The default is CTF + if (SELECT_CASE_var == "CONDUCTIONTRANSFERFUNCTION") { + state.dataHeatBal->OverallHeatTransferSolutionAlgo = DataSurfaces::HeatTransferModel::CTF; + state.dataHeatBal->AnyCTF = true; + + } else if (SELECT_CASE_var == "MOISTUREPENETRATIONDEPTHCONDUCTIONTRANSFERFUNCTION") { + state.dataHeatBal->OverallHeatTransferSolutionAlgo = DataSurfaces::HeatTransferModel::EMPD; + state.dataHeatBal->AnyEMPD = true; + state.dataHeatBal->AllCTF = false; + } else if (SELECT_CASE_var == "CONDUCTIONFINITEDIFFERENCE") { + state.dataHeatBal->OverallHeatTransferSolutionAlgo = DataSurfaces::HeatTransferModel::CondFD; + state.dataHeatBal->AnyCondFD = true; + state.dataHeatBal->AllCTF = false; + if (state.dataGlobal->NumOfTimeStepInHour < 20) { + ShowSevereError( + state, + format("GetSolutionAlgorithm: {} {} is Conduction Finite Difference but Number of TimeSteps in Hour < 20, Value is {}.", + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + state.dataGlobal->NumOfTimeStepInHour)); + ShowContinueError(state, + "...Suggested minimum number of time steps in hour for Conduction Finite Difference solutions is 20. " + "Errors or inaccurate calculations may occur."); + } + + } else if (SELECT_CASE_var == "COMBINEDHEATANDMOISTUREFINITEELEMENT") { + state.dataHeatBal->OverallHeatTransferSolutionAlgo = DataSurfaces::HeatTransferModel::HAMT; + state.dataHeatBal->AnyHAMT = true; + state.dataHeatBal->AllCTF = false; + if (state.dataGlobal->NumOfTimeStepInHour < 20) { + ShowSevereError(state, + format("GetSolutionAlgorithm: {} {} is Combined Heat and Moisture Finite Element but Number of TimeSteps in " + "Hour < 20, Value is {}.", + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + state.dataGlobal->NumOfTimeStepInHour)); + ShowContinueError(state, + "...Suggested minimum number of time steps in hour for Combined Heat and Moisture Finite Element solutions " + "is 20. Errors or inaccurate calculations may occur."); + ShowContinueError(state, + "...If the simulation crashes, look at material properties (esp porosity), use timestep=60, or less layers " + "in your constructions."); + } + + } else { + state.dataHeatBal->OverallHeatTransferSolutionAlgo = DataSurfaces::HeatTransferModel::CTF; + state.dataHeatBal->AnyCTF = true; + } + } + + if (NumNumber > 0) { + state.dataHeatBalSurf->MaxSurfaceTempLimit = BuildingNumbers(1); + state.dataHeatBalSurf->MaxSurfaceTempLimitBeforeFatal = state.dataHeatBalSurf->MaxSurfaceTempLimit * 2.5; + if (state.dataHeatBalSurf->MaxSurfaceTempLimit < MinSurfaceTempLimit) { + } else if (state.dataHeatBalSurf->MaxSurfaceTempLimit < 0.0) { + state.dataHeatBalSurf->MaxSurfaceTempLimit = DefaultSurfaceTempLimit; + state.dataHeatBalSurf->MaxSurfaceTempLimitBeforeFatal = state.dataHeatBalSurf->MaxSurfaceTempLimit * 2.5; + } + } + + if (!state.dataIPShortCut->lNumericFieldBlanks(2)) { + state.dataHeatBal->LowHConvLimit = BuildingNumbers(2); + } + if (!state.dataIPShortCut->lNumericFieldBlanks(3)) { + state.dataHeatBal->HighHConvLimit = BuildingNumbers(3); + } + + } else { + state.dataHeatBal->OverallHeatTransferSolutionAlgo = DataSurfaces::HeatTransferModel::CTF; + state.dataHeatBal->AnyCTF = true; + state.dataHeatBalSurf->MaxSurfaceTempLimit = DefaultSurfaceTempLimit; + state.dataHeatBalSurf->MaxSurfaceTempLimitBeforeFatal = state.dataHeatBalSurf->MaxSurfaceTempLimit * 2.5; + } + + // algorithm input checks now deferred until surface properties are read in, + // moved to SurfaceGeometry.cc routine GetSurfaceHeatTransferAlgorithmOverrides + + constexpr const char *Format_724("! , Value {{Anisotropic}}\nSky Radiance Distribution,Anisotropic\n"); + print(state.files.eio, Format_724); + + state.dataHeatBalMgr->CurrentModuleObject = "Compliance:Building"; + NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + + if (NumObjects > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + 1, + AlphaName, + NumAlpha, + BuildingNumbers, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + // Building Rotation for Appendix G + state.dataHeatBal->BuildingRotationAppendixG = mod(BuildingNumbers(1), 360.0); + } + + // A new object is added by L. Gu, 12/09 + state.dataHeatBalMgr->CurrentModuleObject = "ZoneAirHeatBalanceAlgorithm"; + NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + if (NumObjects > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + 1, + AlphaName, + NumAlpha, + BuildingNumbers, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (NumAlpha > 0) { + { + auto const SELECT_CASE_var(AlphaName(1)); + if (SELECT_CASE_var == "THIRDORDERBACKWARDDIFFERENCE") { + state.dataHeatBal->ZoneAirSolutionAlgo = DataHeatBalance::SolutionAlgo::ThirdOrder; + AlphaName(1) = "ThirdOrderBackwardDifference"; + } else if (SELECT_CASE_var == "ANALYTICALSOLUTION") { + state.dataHeatBal->ZoneAirSolutionAlgo = DataHeatBalance::SolutionAlgo::AnalyticalSolution; + AlphaName(1) = "AnalyticalSolution"; + } else if (SELECT_CASE_var == "EULERMETHOD") { + state.dataHeatBal->ZoneAirSolutionAlgo = DataHeatBalance::SolutionAlgo::EulerMethod; + AlphaName(1) = "EulerMethod"; + } else { + state.dataHeatBal->ZoneAirSolutionAlgo = DataHeatBalance::SolutionAlgo::ThirdOrder; + AlphaName(1) = "ThirdOrderBackwardDifference"; + ShowWarningError(state, + state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + + state.dataIPShortCut->cAlphaFieldNames(1) + ". The default choice is assigned = " + AlphaName(1)); + ShowContinueError(state, "Valid choices are: ThirdOrderBackwardDifference, AnalyticalSolution, or EulerMethod."); + } + } + } + if (!state.dataIPShortCut->lAlphaFieldBlanks(2)) { + state.dataHeatBal->doSpaceHeatBalanceSizing = static_cast(getYesNoValue(AlphaName(2))); + } + if (!state.dataIPShortCut->lAlphaFieldBlanks(3)) { + state.dataHeatBal->doSpaceHeatBalanceSimulation = static_cast(getYesNoValue(AlphaName(3))); + } + } else { + state.dataHeatBal->ZoneAirSolutionAlgo = DataHeatBalance::SolutionAlgo::ThirdOrder; + AlphaName(1) = "ThirdOrderBackwardDifference"; + } + if (state.dataHeatBal->OverrideZoneAirSolutionAlgo) { + state.dataHeatBal->ZoneAirSolutionAlgo = DataHeatBalance::SolutionAlgo::EulerMethod; + AlphaName(1) = "EulerMethod"; + } + + // Write Solution Algorithm to the initialization output file for User Verification + constexpr const char *Format_726("! , Algorithm {{ThirdOrderBackwardDifference | AnalyticalSolution | " + "EulerMethod}}, Space Heat Balance Sizing, Space Heat Balance Simulation\n"); + print(state.files.eio, Format_726); + constexpr const char *Format_727(" Zone Air Solution Algorithm, {}, {}, {}\n"); + print(state.files.eio, + Format_727, + AlphaName(1), + state.dataHeatBal->doSpaceHeatBalanceSizing ? "Yes" : "No", + state.dataHeatBal->doSpaceHeatBalanceSimulation ? "Yes" : "No"); + + // A new object is added by L. Gu, 06/10 + state.dataHeatBalMgr->CurrentModuleObject = "ZoneAirContaminantBalance"; + NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + if (NumObjects > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + 1, + AlphaName, + NumAlpha, + BuildingNumbers, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (NumAlpha > 0) { + { + auto const SELECT_CASE_var(AlphaName(1)); + if (SELECT_CASE_var == "YES") { + state.dataContaminantBalance->Contaminant.CO2Simulation = true; + state.dataContaminantBalance->Contaminant.SimulateContaminants = true; + } else if (SELECT_CASE_var == "NO") { + state.dataContaminantBalance->Contaminant.CO2Simulation = false; + } else { + state.dataContaminantBalance->Contaminant.CO2Simulation = false; + AlphaName(1) = "NO"; + ShowWarningError(state, + state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + + state.dataIPShortCut->cAlphaFieldNames(1) + ". The default choice is assigned = NO"); + } + } + } + if (NumAlpha == 1 && state.dataContaminantBalance->Contaminant.CO2Simulation) { + if (state.dataContaminantBalance->Contaminant.CO2Simulation) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + ", " + state.dataIPShortCut->cAlphaFieldNames(2) + + " is required and not given."); + ErrorsFound = true; + } + } else if (NumAlpha > 1 && state.dataContaminantBalance->Contaminant.CO2Simulation) { + state.dataContaminantBalance->Contaminant.CO2OutdoorSchedPtr = GetScheduleIndex(state, AlphaName(2)); + if (state.dataContaminantBalance->Contaminant.CO2OutdoorSchedPtr == 0) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + ", " + state.dataIPShortCut->cAlphaFieldNames(2) + + " not found: " + AlphaName(2)); + ErrorsFound = true; + } + } + if (NumAlpha > 2) { + { + auto const SELECT_CASE_var(AlphaName(3)); + if (SELECT_CASE_var == "YES") { + state.dataContaminantBalance->Contaminant.GenericContamSimulation = true; + if (!state.dataContaminantBalance->Contaminant.CO2Simulation) + state.dataContaminantBalance->Contaminant.SimulateContaminants = true; + } else if (SELECT_CASE_var == "NO") { + state.dataContaminantBalance->Contaminant.GenericContamSimulation = false; + } else { + state.dataContaminantBalance->Contaminant.GenericContamSimulation = false; + AlphaName(3) = "NO"; + ShowWarningError(state, + state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + + state.dataIPShortCut->cAlphaFieldNames(3) + ". The default choice is assigned = NO"); + } + } + if (NumAlpha == 3 && state.dataContaminantBalance->Contaminant.GenericContamSimulation) { + if (state.dataContaminantBalance->Contaminant.GenericContamSimulation) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + ", " + state.dataIPShortCut->cAlphaFieldNames(4) + + " is required and not given."); + ErrorsFound = true; + } + } else if (NumAlpha > 3 && state.dataContaminantBalance->Contaminant.GenericContamSimulation) { + state.dataContaminantBalance->Contaminant.GenericContamOutdoorSchedPtr = GetScheduleIndex(state, AlphaName(4)); + if (state.dataContaminantBalance->Contaminant.GenericContamOutdoorSchedPtr == 0) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + ", " + state.dataIPShortCut->cAlphaFieldNames(4) + + " not found: " + AlphaName(4)); + ErrorsFound = true; + } + } + } + } else { + state.dataContaminantBalance->Contaminant.SimulateContaminants = false; + state.dataContaminantBalance->Contaminant.CO2Simulation = false; + state.dataContaminantBalance->Contaminant.GenericContamSimulation = false; + AlphaName(1) = "NO"; + AlphaName(3) = "NO"; + } + + WindowManager::initWindowModel(state); + + constexpr const char *Format_728("! , Simulation {{Yes/No}}, Carbon Dioxide Concentration\n"); + print(state.files.eio, Format_728); + constexpr const char *Format_730(" Zone Air Carbon Dioxide Balance Simulation, {},{}\n"); + if (state.dataContaminantBalance->Contaminant.SimulateContaminants && state.dataContaminantBalance->Contaminant.CO2Simulation) { + print(state.files.eio, Format_730, "Yes", AlphaName(1)); + } else { + print(state.files.eio, Format_730, "No", "N/A"); + } + + constexpr const char *Format_729( + "! , Simulation {{Yes/No}}, Generic Contaminant Concentration\n"); + constexpr const char *Format_731(" Zone Air Generic Contaminant Balance Simulation, {},{}\n"); + print(state.files.eio, Format_729); + if (state.dataContaminantBalance->Contaminant.SimulateContaminants && state.dataContaminantBalance->Contaminant.GenericContamSimulation) { + print(state.files.eio, Format_731, "Yes", AlphaName(3)); + } else { + print(state.files.eio, Format_731, "No", "N/A"); + } + + // A new object is added by B. Nigusse, 02/14 + state.dataHeatBalMgr->CurrentModuleObject = "ZoneAirMassFlowConservation"; + NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance = false; + + if (NumObjects > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + 1, + AlphaName, + NumAlpha, + BuildingNumbers, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (NumAlpha > 0) { + { + int FlowTypeNum = getEnumerationValue(AdjustmentTypeNamesUC, UtilityRoutines::MakeUPPERCase(AlphaName(1))); + state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment = static_cast(FlowTypeNum); + AlphaName(1) = AdjustmentTypeNamesCC[FlowTypeNum]; + if (BITF_TEST_ANY(BITF(state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment), + BITF(AdjustmentType::AdjustMixingOnly) | BITF(AdjustmentType::AdjustReturnOnly) | + BITF(AdjustmentType::AdjustMixingThenReturn) | BITF(AdjustmentType::AdjustReturnThenMixing))) { + state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance = true; + } + if (state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment == AdjustmentType::Invalid) { + state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment = AdjustmentType::NoAdjustReturnAndMixing; + AlphaName(1) = "None"; + ShowWarningError(state, + state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + + state.dataIPShortCut->cAlphaFieldNames(1) + ". The default choice is assigned = None"); + } + } + if (state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment != DataHeatBalance::AdjustmentType::NoAdjustReturnAndMixing) + state.dataHeatBal->ZoneAirMassFlow.AdjustZoneMixingFlow = true; + } + if (NumAlpha > 1) { + { + int FlowTypeNum = getEnumerationValue(InfiltrationFlowTypeNamesUC, UtilityRoutines::MakeUPPERCase(AlphaName(2))); + state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment = static_cast(FlowTypeNum); + AlphaName(2) = InfiltrationFlowTypeNamesCC[FlowTypeNum]; + if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::InfiltrationFlow::Add || + state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::InfiltrationFlow::Adjust) { + state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance = true; + if (!state.dataContaminantBalance->Contaminant.CO2Simulation) + state.dataContaminantBalance->Contaminant.SimulateContaminants = true; + } else if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::InfiltrationFlow::Invalid) { + state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment = DataHeatBalance::InfiltrationFlow::Add; + state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance = true; + AlphaName(2) = "AddInfiltrationFlow"; + ShowWarningError(state, + state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + + state.dataIPShortCut->cAlphaFieldNames(2) + ". The default choice is assigned = AddInfiltrationFlow"); + } + } + } else { + state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment = DataHeatBalance::InfiltrationFlow::Add; + state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance = true; + AlphaName(2) = "AddInfiltrationFlow"; + } + if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::InfiltrationFlow::No) { + AlphaName(3) = "N/A"; + } else { + if (NumAlpha > 2) { + { + int FlowTypeNum = getEnumerationValue(InfiltrationZoneTypeNamesUC, UtilityRoutines::MakeUPPERCase(AlphaName(3))); + state.dataHeatBal->ZoneAirMassFlow.InfiltrationForZones = static_cast(FlowTypeNum); + AlphaName(3) = InfiltrationZoneTypeNamesCC[FlowTypeNum]; + if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationForZones == DataHeatBalance::InfiltrationZoneType::Invalid) { + state.dataHeatBal->ZoneAirMassFlow.InfiltrationForZones = DataHeatBalance::InfiltrationZoneType::MixingSourceZonesOnly; + AlphaName(3) = "MixingSourceZonesOnly"; + ShowWarningError(state, + state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + + state.dataIPShortCut->cAlphaFieldNames(3) + + ". The default choice is assigned = MixingSourceZonesOnly"); + } + } + } else { + state.dataHeatBal->ZoneAirMassFlow.InfiltrationForZones = DataHeatBalance::InfiltrationZoneType::MixingSourceZonesOnly; + AlphaName(3) = "MixingSourceZonesOnly"; + } + } + } else { + state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance = false; + } + if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment != DataHeatBalance::InfiltrationFlow::No) + state.dataHeatBal->ZoneAirMassFlow.AdjustZoneInfiltrationFlow = true; + + constexpr const char *Format_732( + "! , Enforce Mass Balance, Adjust Zone Mixing and Return {{AdjustMixingOnly | AdjustReturnOnly | " + "AdjustMixingThenReturn | AdjustReturnThenMixing | None}}, Adjust Zone Infiltration " + "{{AddInfiltration | AdjustInfiltration | None}}, Infiltration Zones {{MixingSourceZonesOnly | AllZones}}\n"); + constexpr const char *Format_733(" Zone Air Mass Flow Balance Simulation, {},{},{},{}\n"); + + print(state.files.eio, Format_732); + if (state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance) { + print(state.files.eio, Format_733, "Yes", AlphaName(1), AlphaName(2), AlphaName(3)); + } else { + print(state.files.eio, Format_733, "No", "N/A", "N/A", "N/A"); + } + + // A new object is added by L. Gu, 4/17 + state.dataHeatBalMgr->CurrentModuleObject = "HVACSystemRootFindingAlgorithm"; + NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + if (NumObjects > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + 1, + AlphaName, + NumAlpha, + BuildingNumbers, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (NumAlpha > 0) { + HVACSystemRootFinding.Algorithm = AlphaName(1); + { + auto const SELECT_CASE_var(AlphaName(1)); + if ((SELECT_CASE_var == "REGULAFALSI")) { + HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::RegulaFalsi; + } else if (SELECT_CASE_var == "BISECTION") { + HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::Bisection; + } else if (SELECT_CASE_var == "BISECTIONTHENREGULAFALSI") { + HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::BisectionThenRegulaFalsi; + } else if (SELECT_CASE_var == "REGULAFALSITHENBISECTION") { + HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::RegulaFalsiThenBisection; + } else if (SELECT_CASE_var == "ALTERNATION") { + HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::Alternation; + } else { + HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::RegulaFalsi; + ShowWarningError(state, + state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + + state.dataIPShortCut->cAlphaFieldNames(1) + ". The default choice is assigned = " + AlphaName(1)); + ShowContinueError( + state, "Valid choices are: RegulaFalsi, Bisection, BisectionThenRegulaFalsi, RegulaFalsiThenBisection, or Alternation."); + } + } + } + if (NumNumber > 0) { + HVACSystemRootFinding.NumOfIter = BuildingNumbers(1); + } + } else { + HVACSystemRootFinding.Algorithm = "RegulaFalsi"; + HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::RegulaFalsi; + } + + // Write Solution Algorithm to the initialization output file for User Verification + constexpr const char *Format_734( + "! , Value {{RegulaFalsi | Bisection | BisectionThenRegulaFalsi | RegulaFalsiThenBisection}}\n"); + constexpr const char *Format_735(" HVACSystemRootFindingAlgorithm, {}\n"); + print(state.files.eio, Format_734); + print(state.files.eio, Format_735, HVACSystemRootFinding.Algorithm); + } + + void GetSiteAtmosphereData(EnergyPlusData &state, bool &ErrorsFound) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Peter Graham Ellis + // DATE WRITTEN January 2006 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // Reads the input data for the SITE ATMOSPHERIC VARIATION object. + + // Using/Aliasing + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int NumObjects; + int NumAlphas; // Number of elements in the alpha array + int NumNums; // Number of elements in the numeric array + int IOStat; // IO Status when calling get input subroutine + Array1D_string AlphArray(1); // Character string data + Array1D NumArray(3); // Numeric data + + // Formats + constexpr const char *Format_720("Environment:Site Atmospheric Variation,{:.3R},{:.3R},{:.6R}\n"); + + state.dataHeatBalMgr->CurrentModuleObject = "Site:HeightVariation"; + NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + + if (NumObjects == 1) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + 1, + AlphArray, + NumAlphas, + NumArray, + NumNums, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + + if (NumNums > 0) state.dataEnvrn->SiteWindExp = NumArray(1); + if (NumNums > 1) state.dataEnvrn->SiteWindBLHeight = NumArray(2); + if (NumNums > 2) state.dataEnvrn->SiteTempGradient = NumArray(3); + + } else if (NumObjects > 1) { + ShowSevereError(state, "Too many " + state.dataHeatBalMgr->CurrentModuleObject + " objects, only 1 allowed."); + ErrorsFound = true; + } else { // None entered + // IDD defaults would have this: + // Building object defaults use Terrain to set SiteWindExp and SiteWindBLHeight but would + // be overridden by a Site Atmospheric Variation Object. + // SiteWindExp = 0.22 + // SiteWindBLHeight = 370.0 + state.dataEnvrn->SiteTempGradient = 0.0065; + } + + // Write to the initialization output file + print(state.files.eio, + "! ,Wind Speed Profile Exponent {{}},Wind Speed Profile Boundary " + "Layer Thickness {{m}},Air Temperature Gradient Coefficient {{K/m}}\n"); + + print(state.files.eio, Format_720, state.dataEnvrn->SiteWindExp, state.dataEnvrn->SiteWindBLHeight, state.dataEnvrn->SiteTempGradient); + } + + void GetMaterialData(EnergyPlusData &state, bool &ErrorsFound) // set to true if errors found in input + { + + // SUBROUTINE INFORMATION: + // AUTHOR Richard Liesen + // DATE WRITTEN September 1997 + // MODIFIED April 1999; L.Lawrie + // Sept 1999, FCW, Window5 modifications + // Mar 2001, FCW, WindowShade mods + // Sep 2001, FCW, add Material:WindowGasMixture + // Oct 2001, FCW, add Material:WindowBlind + // Dec 2003, FCW, add glass solar/visible transmittance dirt factor + // Feb 2009, TH, added WindowMaterial:GlazingGroup:Thermochromic + + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // The purpose of this subroutine is to serve as a transfer agent + // between the input file and the material derived type. The new input + // file is working, and this file reads the material data directly + // from the input file and transfer that information to the new data + // structure. Data read in this routine is stored in a + // derived type (Material) defined in the DataHeatBalance module. + + // In April 1999, a new set of material definitions replaced the one "all-purpose" + // material definition. There are now 10 flavors of materials. Definitions from + // the IDD appear below before their counterpart "gets". + + using Curve::GetCurveIndex; + using Curve::GetCurveMinMaxValues; + + using General::ScanForReports; + + // if this has a size, then input has already been gotten + if (state.dataHeatBalMgr->UniqueMaterialNames.size()) { + return; + } + + int IOStat; // IO Status when calling get input subroutine + Array1D_string MaterialNames(7); // Number of Material Alpha names defined + int MaterNum; // Counter to keep track of the material number + int MaterialNumAlpha; // Number of material alpha names being passed + int MaterialNumProp; // Number of material properties being passed + Array1D MaterialProps(27); // Temporary array to transfer material properties + int RegMat; // Regular Materials -- full property definition + int RegRMat; // Regular Materials -- R only property definition + int AirMat; // Air space materials in opaque constructions + int IRTMat; // Infrared Transmitting Materials -- R only property definition + + int EcoRoofMat; // Materials for ecoRoof + int NumGas; // Index for loop over gap gases in a mixture + int NumGases; // Number of gasses in a mixture + int GasType; // Gas type index: 1=air, 2=argon, 3=krypton, 4=xenon + int Loop; + int ICoeff; // Gas property coefficient index + std::string TypeOfGas; // Type of window gas fill (Air, Argon, Krypton, & + // Xenon, or Custom + Real64 MinSlatAngGeom; // Minimum and maximum slat angle allowed by slat geometry (deg) + Real64 MaxSlatAngGeom; + Real64 ReflectivitySol; // Glass reflectivity, solar + Real64 ReflectivityVis; // Glass reflectivity, visible + Real64 TransmittivitySol; // Glass transmittivity, solar + Real64 TransmittivityVis; // Glass transmittivity, visible + Real64 DenomRGas; // Denominator for WindowGas calculations of NominalR + Real64 Openness; // insect screen openness fraction = (1-d/s)^2 + Real64 minAngValue; // minimum value of angle + Real64 maxAngValue; // maximum value of angle + Real64 minLamValue; // minimum value of wavelength + Real64 maxLamValue; // maximum value of wavelength + + // Added TH 1/9/2009 to read the thermochromic glazings + int iTC(0); + int iMat(0); + + // Added TH 7/27/2009 for constructions defined with F or C factor method + int TotFfactorConstructs; // Number of slabs-on-grade or underground floor constructions defined with F factors + int TotCfactorConstructs; // Number of underground wall constructions defined with C factors + + static constexpr std::string_view RoutineName("GetMaterialData: "); + + RegMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Material"); + RegRMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Material:NoMass"); + IRTMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Material:InfraredTransparent"); + AirMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Material:AirGap"); + state.dataHeatBal->W5GlsMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Glazing"); + state.dataHeatBal->W5GlsMatAlt = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Glazing:RefractionExtinctionMethod"); + state.dataHeatBal->W5GasMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Gas"); + state.dataHeatBal->W5GasMatMixture = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:GasMixture"); + state.dataHeatBal->TotShades = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Shade"); + state.dataHeatBal->TotComplexShades = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:ComplexShade"); + state.dataHeatBal->TotComplexGaps = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Gap"); + state.dataHeatBal->TotScreens = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Screen"); + state.dataHeatBal->TotBlinds = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Blind"); + EcoRoofMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Material:RoofVegetation"); + state.dataHeatBal->TotSimpleWindow = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:SimpleGlazingSystem"); + + state.dataHeatBal->W5GlsMatEQL = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Glazing:EquivalentLayer"); + state.dataHeatBal->TotShadesEQL = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Shade:EquivalentLayer"); + state.dataHeatBal->TotDrapesEQL = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Drape:EquivalentLayer"); + state.dataHeatBal->TotBlindsEQL = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Blind:EquivalentLayer"); + state.dataHeatBal->TotScreensEQL = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Screen:EquivalentLayer"); + state.dataHeatBal->W5GapMatEQL = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Gap:EquivalentLayer"); + + state.dataHeatBal->TotMaterials = + RegMat + RegRMat + AirMat + state.dataHeatBal->W5GlsMat + state.dataHeatBal->W5GlsMatAlt + state.dataHeatBal->W5GasMat + + state.dataHeatBal->W5GasMatMixture + state.dataHeatBal->TotShades + state.dataHeatBal->TotScreens + state.dataHeatBal->TotBlinds + + EcoRoofMat + IRTMat + state.dataHeatBal->TotSimpleWindow + state.dataHeatBal->TotComplexShades + state.dataHeatBal->TotComplexGaps + + state.dataHeatBal->W5GlsMatEQL + state.dataHeatBal->TotShadesEQL + state.dataHeatBal->TotDrapesEQL + state.dataHeatBal->TotBlindsEQL + + state.dataHeatBal->TotScreensEQL + state.dataHeatBal->W5GapMatEQL; + + TotFfactorConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:FfactorGroundFloor"); + TotCfactorConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:CfactorUndergroundWall"); + + if (TotFfactorConstructs > 0) { + state.dataHeatBal->NoFfactorConstructionsUsed = false; + } + + if (TotCfactorConstructs > 0) { + state.dataHeatBal->NoCfactorConstructionsUsed = false; + } + + if (TotFfactorConstructs + TotCfactorConstructs >= 1) { + // Add a new fictitious insulation layer and a thermal mass layer for each F or C factor defined construction + state.dataHeatBal->TotMaterials += 1 + TotFfactorConstructs + TotCfactorConstructs; + } + + state.dataMaterial->Material.allocate(state.dataHeatBal->TotMaterials); // Allocate the array Size to the number of materials + state.dataHeatBalMgr->UniqueMaterialNames.reserve(static_cast(state.dataHeatBal->TotMaterials)); + + state.dataHeatBal->NominalR.dimension(state.dataHeatBal->TotMaterials, 0.0); + + MaterNum = 0; + + // Regular Materials + auto &ip = state.dataInputProcessing->inputProcessor; + + state.dataHeatBalMgr->CurrentModuleObject = "Material"; + auto const instances = ip->epJSON.find(state.dataHeatBalMgr->CurrentModuleObject); + if (instances != ip->epJSON.end()) { + auto const &objectSchemaProps = ip->getObjectSchemaProps(state, state.dataHeatBalMgr->CurrentModuleObject); + + int counter = 0; + auto &instancesValue = instances.value(); + for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { + auto const &objectFields = instance.value(); + auto const &thisObjectName = UtilityRoutines::MakeUPPERCase(instance.key()); + ip->markObjectAsUsed(state.dataHeatBalMgr->CurrentModuleObject, instance.key()); + std::string materialName = thisObjectName; + + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + materialName, + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + continue; + } + // For incoming idf, maintain object order + ++counter; + MaterNum = ip->getIDFObjNum(state, state.dataHeatBalMgr->CurrentModuleObject, counter); + + // Load the material derived type from the input data. + auto &thisMaterial = state.dataMaterial->Material(MaterNum); + thisMaterial.Group = DataHeatBalance::MaterialGroup::RegularMaterial; + thisMaterial.Name = materialName; + + std::string roughness = ip->getAlphaFieldValue(objectFields, objectSchemaProps, "roughness"); + ValidateMaterialRoughness(state, MaterNum, roughness, ErrorsFound); + + thisMaterial.Thickness = ip->getRealFieldValue(objectFields, objectSchemaProps, "thickness"); + thisMaterial.Conductivity = ip->getRealFieldValue(objectFields, objectSchemaProps, "conductivity"); + thisMaterial.Density = ip->getRealFieldValue(objectFields, objectSchemaProps, "density"); + thisMaterial.SpecHeat = ip->getRealFieldValue(objectFields, objectSchemaProps, "specific_heat"); + thisMaterial.AbsorpThermal = ip->getRealFieldValue(objectFields, objectSchemaProps, "thermal_absorptance"); + thisMaterial.AbsorpThermalInput = thisMaterial.AbsorpThermal; + thisMaterial.AbsorpSolar = ip->getRealFieldValue(objectFields, objectSchemaProps, "solar_absorptance"); + thisMaterial.AbsorpSolarInput = thisMaterial.AbsorpSolar; + thisMaterial.AbsorpVisible = ip->getRealFieldValue(objectFields, objectSchemaProps, "visible_absorptance"); + thisMaterial.AbsorpVisibleInput = thisMaterial.AbsorpVisible; + + if (thisMaterial.Conductivity > 0.0) { + state.dataHeatBal->NominalR(MaterNum) = thisMaterial.Thickness / thisMaterial.Conductivity; + thisMaterial.Resistance = state.dataHeatBal->NominalR(MaterNum); + } else { + ShowSevereError(state, "Positive thermal conductivity required for material " + thisMaterial.Name); + ErrorsFound = true; + } + } + MaterNum = counter; // This works here, because this is the first material type processed + } + // Add the 6" heavy concrete for constructions defined with F or C factor method + if (TotFfactorConstructs + TotCfactorConstructs >= 1) { + ++MaterNum; + + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::RegularMaterial; + state.dataMaterial->Material(MaterNum).Name = "~FC_Concrete"; + state.dataMaterial->Material(MaterNum).Thickness = 0.15; // m, 0.15m = 6 inches + state.dataMaterial->Material(MaterNum).Conductivity = 1.95; // W/mK + state.dataMaterial->Material(MaterNum).Density = 2240.0; // kg/m3 + state.dataMaterial->Material(MaterNum).SpecHeat = 900.0; // J/kgK + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; + state.dataMaterial->Material(MaterNum).AbsorpSolar = 0.7; + state.dataMaterial->Material(MaterNum).AbsorpThermal = 0.9; + state.dataMaterial->Material(MaterNum).AbsorpVisible = 0.7; + state.dataHeatBal->NominalR(MaterNum) = + state.dataMaterial->Material(MaterNum).Thickness / state.dataMaterial->Material(MaterNum).Conductivity; + state.dataMaterial->Material(MaterNum).Resistance = state.dataHeatBal->NominalR(MaterNum); + + ++RegMat; + } + + state.dataHeatBalMgr->CurrentModuleObject = "Material:NoMass"; + for (Loop = 1; Loop <= RegRMat; ++Loop) { + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + // Load the material derived type from the input data. + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::RegularMaterial; + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + + ValidateMaterialRoughness(state, MaterNum, MaterialNames(2), ErrorsFound); + + state.dataMaterial->Material(MaterNum).Resistance = MaterialProps(1); + state.dataMaterial->Material(MaterNum).ROnly = true; + if (MaterialNumProp >= 2) { + state.dataMaterial->Material(MaterNum).AbsorpThermal = MaterialProps(2); + state.dataMaterial->Material(MaterNum).AbsorpThermalInput = MaterialProps(2); + } else { + state.dataMaterial->Material(MaterNum).AbsorpThermal = 0.9; + state.dataMaterial->Material(MaterNum).AbsorpThermalInput = 0.9; + } + if (MaterialNumProp >= 3) { + state.dataMaterial->Material(MaterNum).AbsorpSolar = MaterialProps(3); + state.dataMaterial->Material(MaterNum).AbsorpSolarInput = MaterialProps(3); + } else { + state.dataMaterial->Material(MaterNum).AbsorpSolar = 0.7; + state.dataMaterial->Material(MaterNum).AbsorpSolarInput = 0.7; + } + if (MaterialNumProp >= 4) { + state.dataMaterial->Material(MaterNum).AbsorpVisible = MaterialProps(4); + state.dataMaterial->Material(MaterNum).AbsorpVisibleInput = MaterialProps(4); + } else { + state.dataMaterial->Material(MaterNum).AbsorpVisible = 0.7; + state.dataMaterial->Material(MaterNum).AbsorpVisibleInput = 0.7; + } + + state.dataHeatBal->NominalR(MaterNum) = state.dataMaterial->Material(MaterNum).Resistance; + } + + // Add a fictitious insulation layer for each construction defined with F or C factor method + if (TotFfactorConstructs + TotCfactorConstructs >= 1) { + for (Loop = 1; Loop <= TotFfactorConstructs + TotCfactorConstructs; ++Loop) { + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::RegularMaterial; + state.dataMaterial->Material(MaterNum).Name = format("~FC_Insulation_{}", Loop); + state.dataMaterial->Material(MaterNum).ROnly = true; + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; + state.dataMaterial->Material(MaterNum).AbsorpSolar = 0.0; + state.dataMaterial->Material(MaterNum).AbsorpThermal = 0.0; + state.dataMaterial->Material(MaterNum).AbsorpVisible = 0.0; + } + RegRMat += TotFfactorConstructs + TotCfactorConstructs; + } + + // Air Materials (for air spaces in opaque constructions) + state.dataHeatBalMgr->CurrentModuleObject = "Material:AirGap"; + for (Loop = 1; Loop <= AirMat; ++Loop) { + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + // Load the material derived type from the input data. + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::Air; + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; + + state.dataMaterial->Material(MaterNum).Resistance = MaterialProps(1); + state.dataMaterial->Material(MaterNum).ROnly = true; + + state.dataHeatBal->NominalR(MaterNum) = state.dataMaterial->Material(MaterNum).Resistance; + } + + state.dataHeatBalMgr->CurrentModuleObject = "Material:InfraredTransparent"; + for (Loop = 1; Loop <= IRTMat; ++Loop) { + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::IRTMaterial; + + // Load the material derived type from the input data. + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + + // Load data for other properties that need defaults + state.dataMaterial->Material(MaterNum).ROnly = true; + state.dataMaterial->Material(MaterNum).Resistance = 0.01; + state.dataMaterial->Material(MaterNum).AbsorpThermal = 0.9999; + state.dataMaterial->Material(MaterNum).AbsorpThermalInput = 0.9999; + state.dataMaterial->Material(MaterNum).AbsorpSolar = 1.0; + state.dataMaterial->Material(MaterNum).AbsorpSolarInput = 1.0; + state.dataMaterial->Material(MaterNum).AbsorpVisible = 1.0; + state.dataMaterial->Material(MaterNum).AbsorpVisibleInput = 1.0; + + state.dataHeatBal->NominalR(MaterNum) = state.dataMaterial->Material(MaterNum).Resistance; + } + + // Glass materials, regular input: transmittance and front/back reflectance + + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Glazing"; + for (Loop = 1; Loop <= state.dataHeatBal->W5GlsMat; ++Loop) { + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGlass; + + // Load the material derived type from the input data. + + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VerySmooth; + state.dataMaterial->Material(MaterNum).ROnly = true; + state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(1); + if (!UtilityRoutines::SameString(MaterialNames(2), "SpectralAndAngle")) { + state.dataMaterial->Material(MaterNum).Trans = MaterialProps(2); + state.dataMaterial->Material(MaterNum).ReflectSolBeamFront = MaterialProps(3); + state.dataMaterial->Material(MaterNum).ReflectSolBeamBack = MaterialProps(4); + state.dataMaterial->Material(MaterNum).TransVis = MaterialProps(5); + state.dataMaterial->Material(MaterNum).ReflectVisBeamFront = MaterialProps(6); + state.dataMaterial->Material(MaterNum).ReflectVisBeamBack = MaterialProps(7); + state.dataMaterial->Material(MaterNum).TransThermal = MaterialProps(8); + } + state.dataMaterial->Material(MaterNum).AbsorpThermalFront = MaterialProps(9); + state.dataMaterial->Material(MaterNum).AbsorpThermalBack = MaterialProps(10); + state.dataMaterial->Material(MaterNum).Conductivity = MaterialProps(11); + state.dataMaterial->Material(MaterNum).GlassTransDirtFactor = MaterialProps(12); + state.dataMaterial->Material(MaterNum).YoungModulus = MaterialProps(13); + state.dataMaterial->Material(MaterNum).PoissonsRatio = MaterialProps(14); + if (MaterialProps(12) == 0.0) state.dataMaterial->Material(MaterNum).GlassTransDirtFactor = 1.0; + state.dataMaterial->Material(MaterNum).AbsorpThermal = state.dataMaterial->Material(MaterNum).AbsorpThermalBack; + + if (state.dataMaterial->Material(MaterNum).Conductivity > 0.0) { + state.dataHeatBal->NominalR(MaterNum) = + state.dataMaterial->Material(MaterNum).Thickness / state.dataMaterial->Material(MaterNum).Conductivity; + state.dataMaterial->Material(MaterNum).Resistance = state.dataHeatBal->NominalR(MaterNum); + } else { + ErrorsFound = true; + ShowSevereError(state, + "Window glass material " + state.dataMaterial->Material(MaterNum).Name + + " has Conductivity = 0.0, must be >0.0, default = .9"); + } + + state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = 0; + if (state.dataHeatBal->TotSpectralData > 0 && !state.dataIPShortCut->lAlphaFieldBlanks(3)) { + state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = + UtilityRoutines::FindItemInList(MaterialNames(3), state.dataHeatBal->SpectralData); + } + if (UtilityRoutines::SameString(MaterialNames(2), "SpectralAverage")) state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = 0; + // No need for spectral data for BSDF either + if (UtilityRoutines::SameString(MaterialNames(2), "BSDF")) state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = 0; + if (UtilityRoutines::SameString(MaterialNames(2), "SpectralAndAngle")) + state.dataMaterial->Material(MaterNum).GlassSpectralAndAngle = true; + + if (state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr == 0 && UtilityRoutines::SameString(MaterialNames(2), "Spectral")) { + ErrorsFound = true; + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataMaterial->Material(MaterNum).Name + "\" has " + + state.dataIPShortCut->cAlphaFieldNames(2) + + " = Spectral but has no matching MaterialProperty:GlazingSpectralData set"); + if (state.dataIPShortCut->lAlphaFieldBlanks(3)) { + ShowContinueError(state, "..." + state.dataIPShortCut->cAlphaFieldNames(3) + " is blank."); + } else { + ShowContinueError(state, + "..." + state.dataIPShortCut->cAlphaFieldNames(3) + "=\"" + MaterialNames(3) + + "\" not found as item in MaterialProperty:GlazingSpectralData objects."); + } + } + + if (!UtilityRoutines::SameString(MaterialNames(2), "SpectralAverage") && !UtilityRoutines::SameString(MaterialNames(2), "Spectral") && + !UtilityRoutines::SameString(MaterialNames(2), "BSDF") && !UtilityRoutines::SameString(MaterialNames(2), "SpectralAndAngle")) { + ErrorsFound = true; + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataMaterial->Material(MaterNum).Name + + "\", invalid specification."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(2) + + " must be SpectralAverage, Spectral, BSDF or SpectralAndAngle, value=" + MaterialNames(2)); + } + + // TH 8/24/2011, allow glazing properties MaterialProps(2 to 10) to equal 0 or 1: 0.0 =< Prop <= 1.0 + // Fixed CR 8413 - modeling spandrel panels as glazing systems + if (UtilityRoutines::SameString(MaterialNames(2), "SpectralAverage")) { + + if (MaterialProps(2) + MaterialProps(3) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError( + state, state.dataIPShortCut->cNumericFieldNames(2) + " + " + state.dataIPShortCut->cNumericFieldNames(3) + " not <= 1.0"); + } + + if (MaterialProps(2) + MaterialProps(4) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError( + state, state.dataIPShortCut->cNumericFieldNames(2) + " + " + state.dataIPShortCut->cNumericFieldNames(4) + " not <= 1.0"); + } + + if (MaterialProps(5) + MaterialProps(6) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError( + state, state.dataIPShortCut->cNumericFieldNames(5) + " + " + state.dataIPShortCut->cNumericFieldNames(6) + " not <= 1.0"); + } + + if (MaterialProps(5) + MaterialProps(7) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError( + state, state.dataIPShortCut->cNumericFieldNames(5) + " + " + state.dataIPShortCut->cNumericFieldNames(7) + " not <= 1.0"); + } + + if (MaterialProps(8) + MaterialProps(9) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError( + state, state.dataIPShortCut->cNumericFieldNames(8) + " + " + state.dataIPShortCut->cNumericFieldNames(9) + " not <= 1.0"); + } + + if (MaterialProps(8) + MaterialProps(10) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError( + state, state.dataIPShortCut->cNumericFieldNames(8) + " + " + state.dataIPShortCut->cNumericFieldNames(10) + " not <= 1.0"); + } + + if (MaterialProps(2) < 0.0) { + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(2) + " not >= 0.0"); + ErrorsFound = true; + } + + if (MaterialProps(2) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(2) + " not <= 1.0"); + } + + if (MaterialProps(3) < 0.0 || MaterialProps(3) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(3) + " not >= 0.0 and <= 1.0"); + } + + if (MaterialProps(4) < 0.0 || MaterialProps(4) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(4) + " not >= 0.0 and <= 1.0"); + } + + if (MaterialProps(5) < 0.0) { + ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", minimal value."); + ShowWarningError(state, state.dataIPShortCut->cNumericFieldNames(5) + " not >= 0.0"); + } + + if (MaterialProps(5) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(5) + " not <= 1.0"); + } + + if (MaterialProps(6) < 0.0 || MaterialProps(6) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(6) + " not >= 0.0 and <= 1.0"); + } + + if (MaterialProps(7) < 0.0 || MaterialProps(7) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(7) + " not >= 0.0 and <= 1.0"); + } + } + + if (MaterialProps(8) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(8) + " not <= 1.0"); + } + + if (MaterialProps(9) <= 0.0 || MaterialProps(9) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(9) + " not > 0.0 and < 1.0"); + } + + if (MaterialProps(10) <= 0.0 || MaterialProps(10) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(10) + " not > 0.0 and < 1.0"); + } + + if (MaterialProps(11) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(11) + " not > 0.0"); + } + + if (MaterialProps(13) < 0.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(13) + " not > 0.0"); + } + + if (MaterialProps(14) < 0.0 || MaterialProps(14) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(14) + " not > 0.0 and < 1.0"); + } + + if (MaterialNames(4) == "") { + state.dataMaterial->Material(MaterNum).SolarDiffusing = false; + } else if (MaterialNames(4) == "YES") { + state.dataMaterial->Material(MaterNum).SolarDiffusing = true; + } else if (MaterialNames(4) == "NO") { + state.dataMaterial->Material(MaterNum).SolarDiffusing = false; + } else { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(4) + " must be Yes or No, entered value=" + MaterialNames(4)); + } + // Get SpectralAndAngle table names + if (state.dataMaterial->Material(MaterNum).GlassSpectralAndAngle) { + if (state.dataIPShortCut->lAlphaFieldBlanks(5)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", blank field."); + ShowContinueError(state, " Table name must be entered when the key SpectralAndAngle is selected as Optical Data Type."); + } else { + state.dataMaterial->Material(MaterNum).GlassSpecAngTransDataPtr = Curve::GetCurveIndex(state, MaterialNames(5)); + if (state.dataMaterial->Material(MaterNum).GlassSpecAngTransDataPtr == 0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Invalid name."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(5) + + " requires a valid table object name, entered input=" + MaterialNames(5)); + } else { + ErrorsFound |= Curve::CheckCurveDims(state, + state.dataMaterial->Material(MaterNum).GlassSpecAngTransDataPtr, // Curve index + {2}, // Valid dimensions + RoutineName, // Routine name + state.dataHeatBalMgr->CurrentModuleObject, // Object Type + state.dataMaterial->Material(MaterNum).Name, // Object Name + state.dataIPShortCut->cAlphaFieldNames(5)); // Field Name + + GetCurveMinMaxValues(state, + state.dataMaterial->Material(MaterNum).GlassSpecAngTransDataPtr, + minAngValue, + maxAngValue, + minLamValue, + maxLamValue); + if (minAngValue > 1.0e-6) { + ErrorsFound = true; + ShowSevereError(state, + format("{}=\"{}\", Invalid minimum value of angle = {:.2R}.", + state.dataHeatBalMgr->CurrentModuleObject, + MaterialNames(1), + minAngValue)); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(5) + + " requires the minumum value = 0.0 in the entered table name=" + MaterialNames(5)); + } + if (std::abs(maxAngValue - 90.0) > 1.0e-6) { + ErrorsFound = true; + ShowSevereError(state, + format("{}=\"{}\", Invalid maximum value of angle = {:.2R}.", + state.dataHeatBalMgr->CurrentModuleObject, + MaterialNames(1), + maxAngValue)); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(5) + + " requires the maximum value = 90.0 in the entered table name=" + MaterialNames(5)); + } + if (minLamValue < 0.1) { + ErrorsFound = true; + ShowSevereError(state, + format("{}=\"{}\", Invalid minimum value of wavelength = {:.2R}.", + state.dataHeatBalMgr->CurrentModuleObject, + MaterialNames(1), + minLamValue)); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(5) + + " requires the minumum value = 0.1 micron in the entered table name=" + MaterialNames(5)); + } + if (maxLamValue > 4.0) { + ErrorsFound = true; + ShowSevereError(state, + format("{}=\"{}\", Invalid maximum value of wavelength = {:.2R}.", + state.dataHeatBalMgr->CurrentModuleObject, + MaterialNames(1), + maxLamValue)); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(5) + + " requires the maximum value = 4.0 microns in the entered table name=" + MaterialNames(5)); + } + } + } + if (state.dataIPShortCut->lAlphaFieldBlanks(6)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", blank field."); + ShowContinueError(state, " Table name must be entered when the key SpectralAndAngle is selected as Optical Data Type."); + } else { + state.dataMaterial->Material(MaterNum).GlassSpecAngFRefleDataPtr = Curve::GetCurveIndex(state, MaterialNames(6)); + if (state.dataMaterial->Material(MaterNum).GlassSpecAngFRefleDataPtr == 0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Invalid name."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(6) + + " requires a valid table object name, entered input=" + MaterialNames(6)); + } else { + ErrorsFound |= Curve::CheckCurveDims(state, + state.dataMaterial->Material(MaterNum).GlassSpecAngFRefleDataPtr, // Curve index + {2}, // Valid dimensions + RoutineName, // Routine name + state.dataHeatBalMgr->CurrentModuleObject, // Object Type + state.dataMaterial->Material(MaterNum).Name, // Object Name + state.dataIPShortCut->cAlphaFieldNames(6)); // Field Name + + GetCurveMinMaxValues(state, + state.dataMaterial->Material(MaterNum).GlassSpecAngFRefleDataPtr, + minAngValue, + maxAngValue, + minLamValue, + maxLamValue); + if (minAngValue > 1.0e-6) { + ErrorsFound = true; + ShowSevereError(state, + format("{}=\"{}\", Invalid minimum value of angle = {:.2R}.", + state.dataHeatBalMgr->CurrentModuleObject, + MaterialNames(1), + minAngValue)); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(5) + + " requires the minumum value = 0.0 in the entered table name=" + MaterialNames(5)); + } + if (std::abs(maxAngValue - 90.0) > 1.0e-6) { + ErrorsFound = true; + ShowSevereError(state, + format("{}=\"{}\", Invalid maximum value of angle = {:.2R}.", + state.dataHeatBalMgr->CurrentModuleObject, + MaterialNames(1), + maxAngValue)); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(5) + + " requires the maximum value = 90.0 in the entered table name=" + MaterialNames(5)); + } + if (minLamValue < 0.1) { + ErrorsFound = true; + ShowSevereError(state, + format("{}=\"{}\", Invalid minimum value of wavelength = {:.2R}.", + state.dataHeatBalMgr->CurrentModuleObject, + MaterialNames(1), + minLamValue)); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(5) + + " requires the minumum value = 0.1 micron in the entered table name=" + MaterialNames(5)); + } + if (maxLamValue > 4.0) { + ErrorsFound = true; + ShowSevereError(state, + format("{}=\"{}\", Invalid maximum value of wavelength = {:.2R}.", + state.dataHeatBalMgr->CurrentModuleObject, + MaterialNames(1), + maxLamValue)); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(5) + + " requires the maximum value = 4.0 microns in the entered table name=" + MaterialNames(5)); + } + } + } + if (state.dataIPShortCut->lAlphaFieldBlanks(7)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", blank field."); + ShowContinueError(state, " Table name must be entered when the key SpectralAndAngle is selected as Optical Data Type."); + } else { + state.dataMaterial->Material(MaterNum).GlassSpecAngBRefleDataPtr = Curve::GetCurveIndex(state, MaterialNames(7)); + if (state.dataMaterial->Material(MaterNum).GlassSpecAngBRefleDataPtr == 0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Invalid name."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(7) + + " requires a valid table object name, entered input=" + MaterialNames(7)); + } else { + ErrorsFound |= Curve::CheckCurveDims(state, + state.dataMaterial->Material(MaterNum).GlassSpecAngBRefleDataPtr, // Curve index + {2}, // Valid dimensions + RoutineName, // Routine name + state.dataHeatBalMgr->CurrentModuleObject, // Object Type + state.dataMaterial->Material(MaterNum).Name, // Object Name + state.dataIPShortCut->cAlphaFieldNames(7)); // Field Name + + GetCurveMinMaxValues(state, + state.dataMaterial->Material(MaterNum).GlassSpecAngBRefleDataPtr, + minAngValue, + maxAngValue, + minLamValue, + maxLamValue); + if (minAngValue > 1.0e-6) { + ErrorsFound = true; + ShowSevereError(state, + format("{}=\"{}\", Invalid minimum value of angle = {:.2R}.", + state.dataHeatBalMgr->CurrentModuleObject, + MaterialNames(1), + minAngValue)); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(5) + + " requires the minumum value = 0.0 in the entered table name=" + MaterialNames(5)); + } + if (std::abs(maxAngValue - 90.0) > 1.0e-6) { + ErrorsFound = true; + ShowSevereError(state, + format("{}=\"{}\", Invalid maximum value of angle = {:.2R}.", + state.dataHeatBalMgr->CurrentModuleObject, + MaterialNames(1), + maxAngValue)); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(5) + + " requires the maximum value = 90.0 in the entered table name=" + MaterialNames(5)); + } + if (minLamValue < 0.1) { + ErrorsFound = true; + ShowSevereError(state, + format("{}=\"{}\", Invalid minimum value of wavelength = {:.2R}.", + state.dataHeatBalMgr->CurrentModuleObject, + MaterialNames(1), + minLamValue)); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(5) + + " requires the minumum value = 0.1 micron in the entered table name=" + MaterialNames(5)); + } + if (maxLamValue > 4.0) { + ErrorsFound = true; + ShowSevereError(state, + format("{}=\"{}\", Invalid maximum value of wavelength = {:.2R}.", + state.dataHeatBalMgr->CurrentModuleObject, + MaterialNames(1), + maxLamValue)); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(5) + + " requires the maximum value = 4.0 microns in the entered table name=" + MaterialNames(5)); + } + } + } + } + } + + // Glass materials, alternative input: index of refraction and extinction coefficient + + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Glazing:RefractionExtinctionMethod"; + for (Loop = 1; Loop <= state.dataHeatBal->W5GlsMatAlt; ++Loop) { + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGlass; + + // Load the material derived type from the input data. + + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VerySmooth; + state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(1); + state.dataMaterial->Material(MaterNum).ROnly = true; + + // Calculate solar and visible transmittance and reflectance at normal incidence from thickness, + // index of refraction and extinction coefficient. With the alternative input the front and back + // properties are assumed to be the same. + + ReflectivitySol = pow_2((MaterialProps(2) - 1.0) / (MaterialProps(2) + 1.0)); + ReflectivityVis = pow_2((MaterialProps(4) - 1.0) / (MaterialProps(4) + 1.0)); + TransmittivitySol = std::exp(-MaterialProps(3) * MaterialProps(1)); + TransmittivityVis = std::exp(-MaterialProps(5) * MaterialProps(1)); + state.dataMaterial->Material(MaterNum).Trans = + TransmittivitySol * pow_2(1.0 - ReflectivitySol) / (1.0 - pow_2(ReflectivitySol * TransmittivitySol)); + state.dataMaterial->Material(MaterNum).ReflectSolBeamFront = + ReflectivitySol * + (1.0 + pow_2(1.0 - ReflectivitySol) * pow_2(TransmittivitySol) / (1.0 - pow_2(ReflectivitySol * TransmittivitySol))); + state.dataMaterial->Material(MaterNum).ReflectSolBeamBack = state.dataMaterial->Material(MaterNum).ReflectSolBeamFront; + state.dataMaterial->Material(MaterNum).TransVis = + TransmittivityVis * pow_2(1.0 - ReflectivityVis) / (1.0 - pow_2(ReflectivityVis * TransmittivityVis)); + + state.dataMaterial->Material(MaterNum).ReflectVisBeamFront = + ReflectivityVis * + (1.0 + pow_2(1.0 - ReflectivityVis) * pow_2(TransmittivityVis) / (1.0 - pow_2(ReflectivityVis * TransmittivityVis))); + state.dataMaterial->Material(MaterNum).ReflectVisBeamBack = state.dataMaterial->Material(MaterNum).ReflectSolBeamFront; + state.dataMaterial->Material(MaterNum).TransThermal = MaterialProps(6); + state.dataMaterial->Material(MaterNum).AbsorpThermalFront = MaterialProps(7); + state.dataMaterial->Material(MaterNum).AbsorpThermalBack = MaterialProps(7); + state.dataMaterial->Material(MaterNum).Conductivity = MaterialProps(8); + state.dataMaterial->Material(MaterNum).GlassTransDirtFactor = MaterialProps(9); + if (MaterialProps(9) == 0.0) state.dataMaterial->Material(MaterNum).GlassTransDirtFactor = 1.0; + state.dataMaterial->Material(MaterNum).AbsorpThermal = state.dataMaterial->Material(MaterNum).AbsorpThermalBack; + + if (state.dataMaterial->Material(MaterNum).Conductivity > 0.0) { + state.dataHeatBal->NominalR(MaterNum) = + state.dataMaterial->Material(MaterNum).Thickness / state.dataMaterial->Material(MaterNum).Conductivity; + state.dataMaterial->Material(MaterNum).Resistance = state.dataHeatBal->NominalR(MaterNum); + } + + state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = 0; + + if (MaterialProps(6) + MaterialProps(7) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(6) + " + " + state.dataIPShortCut->cNumericFieldNames(7) + " not < 1.0"); + } + + if (MaterialNames(2) == "") { + state.dataMaterial->Material(MaterNum).SolarDiffusing = false; + } else if (MaterialNames(2) == "YES") { + state.dataMaterial->Material(MaterNum).SolarDiffusing = true; + } else if (MaterialNames(2) == "NO") { + state.dataMaterial->Material(MaterNum).SolarDiffusing = false; + } else { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(2) + " must be Yes or No, entered value=" + MaterialNames(4)); + } + } + + // Glass materials, equivalent layer (ASHWAT) method + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Glazing:EquivalentLayer"; + for (Loop = 1; Loop <= state.dataHeatBal->W5GlsMatEQL; ++Loop) { + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::GlassEquivalentLayer; + + // Load the material derived type from the input data. + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VerySmooth; + state.dataMaterial->Material(MaterNum).ROnly = true; + + state.dataMaterial->Material(MaterNum).TausFrontBeamBeam = MaterialProps(1); + state.dataMaterial->Material(MaterNum).TausBackBeamBeam = MaterialProps(2); + state.dataMaterial->Material(MaterNum).ReflFrontBeamBeam = MaterialProps(3); + state.dataMaterial->Material(MaterNum).ReflBackBeamBeam = MaterialProps(4); + state.dataMaterial->Material(MaterNum).TausFrontBeamBeamVis = MaterialProps(5); + state.dataMaterial->Material(MaterNum).TausBackBeamBeamVis = MaterialProps(6); + state.dataMaterial->Material(MaterNum).ReflFrontBeamBeamVis = MaterialProps(7); + state.dataMaterial->Material(MaterNum).ReflBackBeamBeamVis = MaterialProps(8); + state.dataMaterial->Material(MaterNum).TausFrontBeamDiff = MaterialProps(9); + state.dataMaterial->Material(MaterNum).TausBackBeamDiff = MaterialProps(10); + state.dataMaterial->Material(MaterNum).ReflFrontBeamDiff = MaterialProps(11); + state.dataMaterial->Material(MaterNum).ReflBackBeamDiff = MaterialProps(12); + state.dataMaterial->Material(MaterNum).TausFrontBeamDiffVis = MaterialProps(13); + state.dataMaterial->Material(MaterNum).TausBackBeamDiffVis = MaterialProps(14); + state.dataMaterial->Material(MaterNum).ReflFrontBeamDiffVis = MaterialProps(15); + state.dataMaterial->Material(MaterNum).ReflBackBeamDiffVis = MaterialProps(16); + state.dataMaterial->Material(MaterNum).TausDiffDiff = MaterialProps(17); + state.dataMaterial->Material(MaterNum).ReflFrontDiffDiff = MaterialProps(18); + state.dataMaterial->Material(MaterNum).ReflBackDiffDiff = MaterialProps(19); + state.dataMaterial->Material(MaterNum).TausDiffDiffVis = MaterialProps(20); + state.dataMaterial->Material(MaterNum).ReflFrontDiffDiffVis = MaterialProps(21); + state.dataMaterial->Material(MaterNum).ReflBackDiffDiffVis = MaterialProps(22); + state.dataMaterial->Material(MaterNum).TausThermal = MaterialProps(23); + state.dataMaterial->Material(MaterNum).EmissThermalFront = MaterialProps(24); + state.dataMaterial->Material(MaterNum).EmissThermalBack = MaterialProps(25); + state.dataMaterial->Material(MaterNum).Resistance = MaterialProps(26); + if (state.dataMaterial->Material(MaterNum).Resistance <= 0.0) + state.dataMaterial->Material(MaterNum).Resistance = 0.158; // equivalent to single pane of 1/4" inch standard glass + // Assumes thermal emissivity is the same as thermal absorptance + state.dataMaterial->Material(MaterNum).AbsorpThermalFront = state.dataMaterial->Material(MaterNum).EmissThermalFront; + state.dataMaterial->Material(MaterNum).AbsorpThermalBack = state.dataMaterial->Material(MaterNum).EmissThermalBack; + state.dataMaterial->Material(MaterNum).TransThermal = state.dataMaterial->Material(MaterNum).TausThermal; + + if (UtilityRoutines::SameString(MaterialNames(2), "SpectralAverage")) state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = 0; + + // IF(dataMaterial.Material(MaterNum)%GlassSpectralDataPtr == 0 .AND. UtilityRoutines::SameString(MaterialNames(2),'Spectral')) THEN + // ErrorsFound = .TRUE. + // CALL ShowSevereError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//'="'//Trim(dataMaterial.Material(MaterNum)%Name)// & + // '" has '//TRIM(cAlphaFieldNames(2))//' = Spectral but has no matching MaterialProperty:GlazingSpectralData set') + // if (state.dataIPShortCut->lAlphaFieldBlanks(3)) THEN + // CALL ShowContinueError(state, '...'//TRIM(cAlphaFieldNames(3))//' is blank.') + // ELSE + // CALL ShowContinueError(state, '...'//TRIM(cAlphaFieldNames(3))//'="'//TRIM(MaterialNames(3))// & + // '" not found as item in MaterialProperty:GlazingSpectralData objects.') + // END IF + // END IF + + if (!UtilityRoutines::SameString(MaterialNames(2), "SpectralAverage")) { + ErrorsFound = true; + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataMaterial->Material(MaterNum).Name + + "\", invalid specification."); + ShowContinueError(state, state.dataIPShortCut->cAlphaFieldNames(2) + " must be SpectralAverage, value=" + MaterialNames(2)); + } + + } // W5GlsMatEQL loop + + // Window gas materials (for gaps with a single gas) + + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Gas"; + for (Loop = 1; Loop <= state.dataHeatBal->W5GasMat; ++Loop) { + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGas; + state.dataMaterial->Material(MaterNum).GasType(1) = -1; + state.dataMaterial->Material(MaterNum).NumberOfGasesInMixture = 1; + state.dataMaterial->Material(MaterNum).GasFract(1) = 1.0; + + // Load the material derived type from the input data. + + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + state.dataMaterial->Material(MaterNum).NumberOfGasesInMixture = 1; + TypeOfGas = MaterialNames(2); + if (TypeOfGas == "AIR") state.dataMaterial->Material(MaterNum).GasType(1) = 1; + if (TypeOfGas == "ARGON") state.dataMaterial->Material(MaterNum).GasType(1) = 2; + if (TypeOfGas == "KRYPTON") state.dataMaterial->Material(MaterNum).GasType(1) = 3; + if (TypeOfGas == "XENON") state.dataMaterial->Material(MaterNum).GasType(1) = 4; + if (TypeOfGas == "CUSTOM") state.dataMaterial->Material(MaterNum).GasType(1) = 0; + + if (state.dataMaterial->Material(MaterNum).GasType(1) == -1) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(2) + " entered value=\"" + TypeOfGas + + "\" should be Air, Argon, Krypton, Xenon or Custom."); + } + + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; + + state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(1); + state.dataMaterial->Material(MaterNum).ROnly = true; + + GasType = state.dataMaterial->Material(MaterNum).GasType(1); + if (GasType >= 1 && GasType <= 4) { + state.dataMaterial->Material(MaterNum).GasWght(1) = GasWght[GasType - 1]; + state.dataMaterial->Material(MaterNum).GasSpecHeatRatio(1) = GasSpecificHeatRatio[GasType - 1]; + for (ICoeff = 1; ICoeff <= 3; ++ICoeff) { + state.dataMaterial->Material(MaterNum).GasCon(ICoeff, 1) = GasCoeffsCon[ICoeff - 1][GasType - 1]; + state.dataMaterial->Material(MaterNum).GasVis(ICoeff, 1) = GasCoeffsVis[ICoeff - 1][GasType - 1]; + state.dataMaterial->Material(MaterNum).GasCp(ICoeff, 1) = GasCoeffsCp[ICoeff - 1][GasType - 1]; + } + } + + // Custom gas + + if (GasType == 0) { + for (ICoeff = 1; ICoeff <= 3; ++ICoeff) { + state.dataMaterial->Material(MaterNum).GasCon(ICoeff, 1) = MaterialProps(1 + ICoeff); + state.dataMaterial->Material(MaterNum).GasVis(ICoeff, 1) = MaterialProps(4 + ICoeff); + state.dataMaterial->Material(MaterNum).GasCp(ICoeff, 1) = MaterialProps(7 + ICoeff); + } + state.dataMaterial->Material(MaterNum).GasWght(1) = MaterialProps(11); + state.dataMaterial->Material(MaterNum).GasSpecHeatRatio(1) = MaterialProps(12); + + // Check for errors in custom gas properties + // IF(dataMaterial.Material(MaterNum)%GasCon(1,1) <= 0.0) THEN + // ErrorsFound = .TRUE. + // CALL ShowSevereError(state, 'Conductivity Coefficient A for custom window gas='& + // //TRIM(MaterialNames(1))//' should be > 0.') + // END IF + + if (state.dataMaterial->Material(MaterNum).GasVis(1, 1) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(3 + ICoeff) + " not > 0.0"); + } + if (state.dataMaterial->Material(MaterNum).GasCp(1, 1) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(5 + ICoeff) + " not > 0.0"); + } + if (state.dataMaterial->Material(MaterNum).GasWght(1) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(8) + " not > 0.0"); + } + } + + // Nominal resistance of gap at room temperature + if (!ErrorsFound) { + DenomRGas = (state.dataMaterial->Material(MaterNum).GasCon(1, 1) + state.dataMaterial->Material(MaterNum).GasCon(2, 1) * 300.0 + + state.dataMaterial->Material(MaterNum).GasCon(3, 1) * 90000.0); + if (DenomRGas > 0.0) { + state.dataHeatBal->NominalR(MaterNum) = state.dataMaterial->Material(MaterNum).Thickness / DenomRGas; + } else { + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError( + state, format("Nominal resistance of gap at room temperature calculated at a negative Conductivity=[{:.3R}].", DenomRGas)); + ErrorsFound = true; + } + } + } + + // Window gap materials (for gaps with a single gas for EquivalentLayer) + + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Gap:EquivalentLayer"; + for (Loop = 1; Loop <= state.dataHeatBal->W5GapMatEQL; ++Loop) { + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::GapEquivalentLayer; + state.dataMaterial->Material(MaterNum).GasType(1) = -1; + state.dataMaterial->Material(MaterNum).NumberOfGasesInMixture = 1; + state.dataMaterial->Material(MaterNum).GasFract(1) = 1.0; + + // Load the material derived type from the input data. + + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + state.dataMaterial->Material(MaterNum).NumberOfGasesInMixture = 1; + TypeOfGas = MaterialNames(2); + state.dataMaterial->Material(MaterNum).GasName = TypeOfGas; + if (TypeOfGas == "AIR") state.dataMaterial->Material(MaterNum).GasType(1) = 1; + if (TypeOfGas == "ARGON") state.dataMaterial->Material(MaterNum).GasType(1) = 2; + if (TypeOfGas == "KRYPTON") state.dataMaterial->Material(MaterNum).GasType(1) = 3; + if (TypeOfGas == "XENON") state.dataMaterial->Material(MaterNum).GasType(1) = 4; + if (TypeOfGas == "CUSTOM") state.dataMaterial->Material(MaterNum).GasType(1) = 0; + + if (state.dataMaterial->Material(MaterNum).GasType(1) == -1) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError( + state, state.dataIPShortCut->cAlphaFieldNames(2) + " entered value=\"" + TypeOfGas + "\" should be Air, Argon, Krypton, Xenon"); + } + + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; + + state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(1); + state.dataMaterial->Material(MaterNum).ROnly = true; + + GasType = state.dataMaterial->Material(MaterNum).GasType(1); + if (GasType >= 1 && GasType <= 4) { + state.dataMaterial->Material(MaterNum).GasWght(1) = GasWght[GasType - 1]; + state.dataMaterial->Material(MaterNum).GasSpecHeatRatio(1) = GasSpecificHeatRatio[GasType - 1]; + for (ICoeff = 1; ICoeff <= 3; ++ICoeff) { + state.dataMaterial->Material(MaterNum).GasCon(ICoeff, 1) = GasCoeffsCon[ICoeff - 1][GasType - 1]; + state.dataMaterial->Material(MaterNum).GasVis(ICoeff, 1) = GasCoeffsVis[ICoeff - 1][GasType - 1]; + state.dataMaterial->Material(MaterNum).GasCp(ICoeff, 1) = GasCoeffsCp[ICoeff - 1][GasType - 1]; + } + } + + if (!state.dataIPShortCut->lAlphaFieldBlanks(2)) { + // Get gap vent type + if (UtilityRoutines::SameString(MaterialNames(3), "Sealed")) { + state.dataMaterial->Material(MaterNum).GapVentType = 1; + } else if (UtilityRoutines::SameString(MaterialNames(3), "VentedIndoor")) { + state.dataMaterial->Material(MaterNum).GapVentType = 2; + } else if (UtilityRoutines::SameString(MaterialNames(3), "VentedOutdoor")) { + state.dataMaterial->Material(MaterNum).GapVentType = 3; + } else { + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal gap vent type."); + ShowContinueError(state, + "Gap vent type allowed are Sealed, VentedIndoor, or VentedOutdoor." + + state.dataIPShortCut->cAlphaFieldNames(3) + " entered =" + MaterialNames(3)); + state.dataMaterial->Material(MaterNum).GapVentType = 1; + // ErrorsFound=.TRUE. + } + } + + if (GasType == 0) { + for (ICoeff = 1; ICoeff <= 3; ++ICoeff) { + state.dataMaterial->Material(MaterNum).GasCon(ICoeff, 1) = MaterialProps(1 + ICoeff); + state.dataMaterial->Material(MaterNum).GasVis(ICoeff, 1) = MaterialProps(4 + ICoeff); + state.dataMaterial->Material(MaterNum).GasCp(ICoeff, 1) = MaterialProps(7 + ICoeff); + } + state.dataMaterial->Material(MaterNum).GasWght(1) = MaterialProps(11); + state.dataMaterial->Material(MaterNum).GasSpecHeatRatio(1) = MaterialProps(12); + + if (state.dataMaterial->Material(MaterNum).GasVis(1, 1) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(5) + " not > 0.0"); + } + if (state.dataMaterial->Material(MaterNum).GasCp(1, 1) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(8) + " not > 0.0"); + } + if (state.dataMaterial->Material(MaterNum).GasWght(1) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(11) + " not > 0.0"); + } + } + + // Nominal resistance of gap at room temperature + if (!ErrorsFound) { + DenomRGas = (state.dataMaterial->Material(MaterNum).GasCon(1, 1) + state.dataMaterial->Material(MaterNum).GasCon(2, 1) * 300.0 + + state.dataMaterial->Material(MaterNum).GasCon(3, 1) * 90000.0); + if (DenomRGas > 0.0) { + state.dataHeatBal->NominalR(MaterNum) = state.dataMaterial->Material(MaterNum).Thickness / DenomRGas; + } else { + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError( + state, format("Nominal resistance of gap at room temperature calculated at a negative Conductivity=[{:.3R}].", DenomRGas)); + ErrorsFound = true; + } + } + } + + // Window gas mixtures (for gaps with two or more gases) + + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:GasMixture"; + for (Loop = 1; Loop <= state.dataHeatBal->W5GasMatMixture; ++Loop) { + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + state.dataIPShortCut->cAlphaArgs, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + state.dataIPShortCut->cAlphaArgs(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGasMixture; + state.dataMaterial->Material(MaterNum).GasType = -1; + + // Load the material derived type from the input data. + + state.dataMaterial->Material(MaterNum).Name = state.dataIPShortCut->cAlphaArgs(1); + NumGases = MaterialProps(2); + state.dataMaterial->Material(MaterNum).NumberOfGasesInMixture = NumGases; + for (NumGas = 1; NumGas <= NumGases; ++NumGas) { + TypeOfGas = state.dataIPShortCut->cAlphaArgs(1 + NumGas); + if (TypeOfGas == "AIR") state.dataMaterial->Material(MaterNum).GasType(NumGas) = 1; + if (TypeOfGas == "ARGON") state.dataMaterial->Material(MaterNum).GasType(NumGas) = 2; + if (TypeOfGas == "KRYPTON") state.dataMaterial->Material(MaterNum).GasType(NumGas) = 3; + if (TypeOfGas == "XENON") state.dataMaterial->Material(MaterNum).GasType(NumGas) = 4; + if (state.dataMaterial->Material(MaterNum).GasType(NumGas) == -1) { + ErrorsFound = true; + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + "\", Illegal value."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(2 + NumGas) + " entered value=\"" + TypeOfGas + + "\" should be Air, Argon, Krypton, or Xenon."); + } + } + + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; // Unused + + state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(1); + if (state.dataMaterial->Material(MaterNum).Thickness <= 0.0) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(1) + " must be greater than 0."); + } + state.dataMaterial->Material(MaterNum).ROnly = true; + + for (NumGas = 1; NumGas <= NumGases; ++NumGas) { + GasType = state.dataMaterial->Material(MaterNum).GasType(NumGas); + if (GasType >= 1 && GasType <= 4) { + state.dataMaterial->Material(MaterNum).GasWght(NumGas) = GasWght[GasType - 1]; + state.dataMaterial->Material(MaterNum).GasSpecHeatRatio(NumGas) = GasSpecificHeatRatio[GasType - 1]; + state.dataMaterial->Material(MaterNum).GasFract(NumGas) = MaterialProps(2 + NumGas); + for (ICoeff = 1; ICoeff <= 3; ++ICoeff) { + state.dataMaterial->Material(MaterNum).GasCon(ICoeff, NumGas) = GasCoeffsCon[ICoeff - 1][GasType - 1]; + state.dataMaterial->Material(MaterNum).GasVis(ICoeff, NumGas) = GasCoeffsVis[ICoeff - 1][GasType - 1]; + state.dataMaterial->Material(MaterNum).GasCp(ICoeff, NumGas) = GasCoeffsCp[ICoeff - 1][GasType - 1]; + } + } + } + + // Nominal resistance of gap at room temperature (based on first gas in mixture) + state.dataHeatBal->NominalR(MaterNum) = + state.dataMaterial->Material(MaterNum).Thickness / + (state.dataMaterial->Material(MaterNum).GasCon(1, 1) + state.dataMaterial->Material(MaterNum).GasCon(2, 1) * 300.0 + + state.dataMaterial->Material(MaterNum).GasCon(3, 1) * 90000.0); + } + + // Window Shade Materials + + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Shade"; + for (Loop = 1; Loop <= state.dataHeatBal->TotShades; ++Loop) { + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::Shade; + + // Load the material derived type from the input data. + + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; + state.dataMaterial->Material(MaterNum).Trans = MaterialProps(1); + state.dataMaterial->Material(MaterNum).ReflectShade = MaterialProps(2); + state.dataMaterial->Material(MaterNum).TransVis = MaterialProps(3); + state.dataMaterial->Material(MaterNum).ReflectShadeVis = MaterialProps(4); + state.dataMaterial->Material(MaterNum).AbsorpThermal = MaterialProps(5); + state.dataMaterial->Material(MaterNum).AbsorpThermalInput = MaterialProps(5); + state.dataMaterial->Material(MaterNum).TransThermal = MaterialProps(6); + state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(7); + state.dataMaterial->Material(MaterNum).Conductivity = MaterialProps(8); + state.dataMaterial->Material(MaterNum).AbsorpSolar = + max(0.0, 1.0 - state.dataMaterial->Material(MaterNum).Trans - state.dataMaterial->Material(MaterNum).ReflectShade); + state.dataMaterial->Material(MaterNum).AbsorpSolarInput = state.dataMaterial->Material(MaterNum).AbsorpSolar; + state.dataMaterial->Material(MaterNum).WinShadeToGlassDist = MaterialProps(9); + state.dataMaterial->Material(MaterNum).WinShadeTopOpeningMult = MaterialProps(10); + state.dataMaterial->Material(MaterNum).WinShadeBottomOpeningMult = MaterialProps(11); + state.dataMaterial->Material(MaterNum).WinShadeLeftOpeningMult = MaterialProps(12); + state.dataMaterial->Material(MaterNum).WinShadeRightOpeningMult = MaterialProps(13); + state.dataMaterial->Material(MaterNum).WinShadeAirFlowPermeability = MaterialProps(14); + state.dataMaterial->Material(MaterNum).ROnly = true; + + if (state.dataMaterial->Material(MaterNum).Conductivity > 0.0) { + state.dataHeatBal->NominalR(MaterNum) = + state.dataMaterial->Material(MaterNum).Thickness / state.dataMaterial->Material(MaterNum).Conductivity; + } else { + state.dataHeatBal->NominalR(MaterNum) = 1.0; + } + + if (MaterialProps(1) + MaterialProps(2) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(1) + " + " + state.dataIPShortCut->cNumericFieldNames(2) + " not < 1.0"); + } + + if (MaterialProps(3) + MaterialProps(4) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(3) + " + " + state.dataIPShortCut->cNumericFieldNames(4) + " not < 1.0"); + } + + if (MaterialProps(5) + MaterialProps(6) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(5) + " + " + state.dataIPShortCut->cNumericFieldNames(6) + " not < 1.0"); + } + } + + // Window Shade Materials + + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Shade:EquivalentLayer"; + for (Loop = 1; Loop <= state.dataHeatBal->TotShadesEQL; ++Loop) { + + MaterialProps = 0; + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::ShadeEquivalentLayer; + + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; + state.dataMaterial->Material(MaterNum).ROnly = true; + + // Front side and back side have the same beam-Beam Transmittance + state.dataMaterial->Material(MaterNum).TausFrontBeamBeam = MaterialProps(1); + state.dataMaterial->Material(MaterNum).TausBackBeamBeam = MaterialProps(1); + state.dataMaterial->Material(MaterNum).TausFrontBeamDiff = MaterialProps(2); + state.dataMaterial->Material(MaterNum).TausBackBeamDiff = MaterialProps(3); + state.dataMaterial->Material(MaterNum).ReflFrontBeamDiff = MaterialProps(4); + state.dataMaterial->Material(MaterNum).ReflBackBeamDiff = MaterialProps(5); + state.dataMaterial->Material(MaterNum).TausFrontBeamBeamVis = MaterialProps(6); + state.dataMaterial->Material(MaterNum).TausFrontBeamDiffVis = MaterialProps(7); + state.dataMaterial->Material(MaterNum).ReflFrontBeamDiffVis = MaterialProps(8); + state.dataMaterial->Material(MaterNum).TausThermal = MaterialProps(9); + state.dataMaterial->Material(MaterNum).EmissThermalFront = MaterialProps(10); + state.dataMaterial->Material(MaterNum).EmissThermalBack = MaterialProps(11); + // Assumes thermal emissivity is the same as thermal absorptance + state.dataMaterial->Material(MaterNum).AbsorpThermalFront = state.dataMaterial->Material(MaterNum).EmissThermalFront; + state.dataMaterial->Material(MaterNum).AbsorpThermalBack = state.dataMaterial->Material(MaterNum).EmissThermalBack; + state.dataMaterial->Material(MaterNum).TransThermal = state.dataMaterial->Material(MaterNum).TausThermal; + + if (MaterialProps(1) + MaterialProps(2) + MaterialProps(4) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(1) + " + " + state.dataIPShortCut->cNumericFieldNames(2) + " + " + + state.dataIPShortCut->cNumericFieldNames(4) + "not < 1.0"); + } + if (MaterialProps(1) + MaterialProps(3) + MaterialProps(5) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(1) + " + " + state.dataIPShortCut->cNumericFieldNames(3) + " + " + + state.dataIPShortCut->cNumericFieldNames(5) + "not < 1.0"); + } + if (MaterialProps(6) + MaterialProps(7) + MaterialProps(8) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(6) + " + " + state.dataIPShortCut->cNumericFieldNames(7) + " + " + + state.dataIPShortCut->cNumericFieldNames(8) + "not < 1.0"); + } + if (MaterialProps(9) + MaterialProps(10) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(9) + " + " + state.dataIPShortCut->cNumericFieldNames(10) + " not < 1.0"); + } + if (MaterialProps(9) + MaterialProps(11) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(9) + " + " + state.dataIPShortCut->cNumericFieldNames(11) + " not < 1.0"); + } + + } // TotShadesEQL loop + + // Window drape materials + + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Drape:EquivalentLayer"; + for (Loop = 1; Loop <= state.dataHeatBal->TotDrapesEQL; ++Loop) { + + MaterialProps = 0; + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::DrapeEquivalentLayer; + + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; + state.dataMaterial->Material(MaterNum).ROnly = true; + + // Front side and back side have the same properties + state.dataMaterial->Material(MaterNum).TausFrontBeamBeam = MaterialProps(1); + state.dataMaterial->Material(MaterNum).TausBackBeamBeam = MaterialProps(1); + + state.dataMaterial->Material(MaterNum).TausFrontBeamDiff = MaterialProps(2); + state.dataMaterial->Material(MaterNum).TausBackBeamDiff = MaterialProps(3); + + state.dataMaterial->Material(MaterNum).ReflFrontBeamDiff = MaterialProps(4); + state.dataMaterial->Material(MaterNum).ReflBackBeamDiff = MaterialProps(5); + state.dataMaterial->Material(MaterNum).TausFrontBeamBeamVis = MaterialProps(6); + state.dataMaterial->Material(MaterNum).TausFrontBeamDiffVis = MaterialProps(7); + state.dataMaterial->Material(MaterNum).ReflFrontBeamDiffVis = MaterialProps(8); + state.dataMaterial->Material(MaterNum).TausThermal = MaterialProps(9); + state.dataMaterial->Material(MaterNum).EmissThermalFront = MaterialProps(10); + state.dataMaterial->Material(MaterNum).EmissThermalBack = MaterialProps(11); + // Assumes thermal emissivity is the same as thermal absorptance + state.dataMaterial->Material(MaterNum).AbsorpThermalFront = state.dataMaterial->Material(MaterNum).EmissThermalFront; + state.dataMaterial->Material(MaterNum).AbsorpThermalBack = state.dataMaterial->Material(MaterNum).EmissThermalBack; + state.dataMaterial->Material(MaterNum).TransThermal = state.dataMaterial->Material(MaterNum).TausThermal; + + if (!state.dataIPShortCut->lNumericFieldBlanks(12) && !state.dataIPShortCut->lNumericFieldBlanks(13)) { + if (MaterialProps(12) != 0.0 && MaterialProps(13) != 0.0) { + state.dataMaterial->Material(MaterNum).PleatedDrapeWidth = MaterialProps(12); + state.dataMaterial->Material(MaterNum).PleatedDrapeLength = MaterialProps(13); + state.dataMaterial->Material(MaterNum).ISPleatedDrape = true; + } + } else { + state.dataMaterial->Material(MaterNum).ISPleatedDrape = false; + } + if (MaterialProps(1) + MaterialProps(2) + MaterialProps(4) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(1) + " + " + state.dataIPShortCut->cNumericFieldNames(2) + " + " + + state.dataIPShortCut->cNumericFieldNames(4) + "not < 1.0"); + } + if (MaterialProps(6) + MaterialProps(7) + MaterialProps(8) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(4) + " + " + state.dataIPShortCut->cNumericFieldNames(5) + " + " + + state.dataIPShortCut->cNumericFieldNames(6) + "not < 1.0"); + } + if (MaterialProps(9) + MaterialProps(10) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(9) + " + " + state.dataIPShortCut->cNumericFieldNames(10) + " not < 1.0"); + } + + } // TotDrapesEQL loop + + // Window Screen Materials + + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Screen"; + for (Loop = 1; Loop <= state.dataHeatBal->TotScreens; ++Loop) { + + // Call GetObjectItem routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::Screen; + + // Load the material derived type from the input data. + + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + state.dataMaterial->Material(MaterNum).ReflectanceModeling = MaterialNames(2); + if (!(UtilityRoutines::SameString(MaterialNames(2), "DoNotModel") || UtilityRoutines::SameString(MaterialNames(2), "ModelAsDirectBeam") || + UtilityRoutines::SameString(MaterialNames(2), "ModelAsDiffuse"))) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(2) + "=\"" + MaterialNames(2) + + "\", must be one of DoNotModel, ModelAsDirectBeam or ModelAsDiffuse."); + } + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; + state.dataMaterial->Material(MaterNum).ReflectShade = MaterialProps(1); + if (state.dataMaterial->Material(MaterNum).ReflectShade < 0.0 || state.dataMaterial->Material(MaterNum).ReflectShade > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(1) + " must be >= 0 and <= 1"); + } + state.dataMaterial->Material(MaterNum).ReflectShadeVis = MaterialProps(2); + if (state.dataMaterial->Material(MaterNum).ReflectShadeVis < 0.0 || state.dataMaterial->Material(MaterNum).ReflectShadeVis > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(2) + " must be >= 0 and <= 1 for material " + + state.dataMaterial->Material(MaterNum).Name + '.'); + } + state.dataMaterial->Material(MaterNum).AbsorpThermal = MaterialProps(3); + state.dataMaterial->Material(MaterNum).AbsorpThermalInput = MaterialProps(3); + if (state.dataMaterial->Material(MaterNum).AbsorpThermal < 0.0 || state.dataMaterial->Material(MaterNum).AbsorpThermal > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(3) + " must be >= 0 and <= 1"); + } + state.dataMaterial->Material(MaterNum).Conductivity = MaterialProps(4); + state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(6); // thickness = diameter + + if (MaterialProps(5) > 0.0) { + // SurfaceScreens(ScNum)%ScreenDiameterToSpacingRatio = MaterialProps(6)/MaterialProps(5) or + // 1-SQRT(dataMaterial.Material(MaterNum)%Trans + if (MaterialProps(6) / MaterialProps(5) >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError( + state, state.dataIPShortCut->cNumericFieldNames(6) + " must be less than " + state.dataIPShortCut->cNumericFieldNames(5)); + } else { + // Calculate direct normal transmittance (open area fraction) + state.dataMaterial->Material(MaterNum).Trans = pow_2(1.0 - MaterialProps(6) / MaterialProps(5)); + } + } else { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(5) + " must be > 0."); + MaterialProps(5) = 0.000000001; + } + + if (MaterialProps(6) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(6) + " must be > 0."); + } + + // Modify reflectance to account for the open area in the screen assembly + state.dataMaterial->Material(MaterNum).ReflectShade *= (1.0 - state.dataMaterial->Material(MaterNum).Trans); + state.dataMaterial->Material(MaterNum).ReflectShadeVis *= (1.0 - state.dataMaterial->Material(MaterNum).Trans); + + state.dataMaterial->Material(MaterNum).WinShadeToGlassDist = MaterialProps(7); + if (state.dataMaterial->Material(MaterNum).WinShadeToGlassDist < 0.001 || + state.dataMaterial->Material(MaterNum).WinShadeToGlassDist > 1.0) { + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError( + state, state.dataIPShortCut->cNumericFieldNames(7) + " must be greater than or equal to 0.001 and less than or equal to 1."); + } + + state.dataMaterial->Material(MaterNum).WinShadeTopOpeningMult = MaterialProps(8); + if (state.dataMaterial->Material(MaterNum).WinShadeTopOpeningMult < 0.0 || + state.dataMaterial->Material(MaterNum).WinShadeTopOpeningMult > 1.0) { + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(8) + " must be greater than or equal to 0 and less than or equal to 1."); + } + + state.dataMaterial->Material(MaterNum).WinShadeBottomOpeningMult = MaterialProps(9); + if (state.dataMaterial->Material(MaterNum).WinShadeBottomOpeningMult < 0.0 || + state.dataMaterial->Material(MaterNum).WinShadeBottomOpeningMult > 1.0) { + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(9) + " must be greater than or equal to 0 and less than or equal to 1."); + } + + state.dataMaterial->Material(MaterNum).WinShadeLeftOpeningMult = MaterialProps(10); + if (state.dataMaterial->Material(MaterNum).WinShadeLeftOpeningMult < 0.0 || + state.dataMaterial->Material(MaterNum).WinShadeLeftOpeningMult > 1.0) { + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(10) + " must be greater than or equal to 0 and less than or equal to 1."); + } + + state.dataMaterial->Material(MaterNum).WinShadeRightOpeningMult = MaterialProps(11); + if (state.dataMaterial->Material(MaterNum).WinShadeRightOpeningMult < 0.0 || + state.dataMaterial->Material(MaterNum).WinShadeRightOpeningMult > 1.0) { + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(11) + " must be greater than or equal to 0 and less than or equal to 1."); + } + + state.dataMaterial->Material(MaterNum).ScreenMapResolution = MaterialProps(12); + if (state.dataMaterial->Material(MaterNum).ScreenMapResolution < 0 || state.dataMaterial->Material(MaterNum).ScreenMapResolution > 5 || + state.dataMaterial->Material(MaterNum).ScreenMapResolution == 4) { + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(12) + " must be 0, 1, 2, 3, or 5."); + ErrorsFound = true; + } + + // Default air flow permeability to open area fraction + state.dataMaterial->Material(MaterNum).WinShadeAirFlowPermeability = state.dataMaterial->Material(MaterNum).Trans; + state.dataMaterial->Material(MaterNum).TransThermal = state.dataMaterial->Material(MaterNum).Trans; + state.dataMaterial->Material(MaterNum).TransVis = state.dataMaterial->Material(MaterNum).Trans; + + state.dataMaterial->Material(MaterNum).ROnly = true; + + // Calculate absorptance accounting for the open area in the screen assembly (used only in CreateShadedWindowConstruction) + state.dataMaterial->Material(MaterNum).AbsorpSolar = + max(0.0, 1.0 - state.dataMaterial->Material(MaterNum).Trans - state.dataMaterial->Material(MaterNum).ReflectShade); + state.dataMaterial->Material(MaterNum).AbsorpSolarInput = state.dataMaterial->Material(MaterNum).AbsorpSolar; + state.dataMaterial->Material(MaterNum).AbsorpVisible = + max(0.0, 1.0 - state.dataMaterial->Material(MaterNum).TransVis - state.dataMaterial->Material(MaterNum).ReflectShadeVis); + state.dataMaterial->Material(MaterNum).AbsorpVisibleInput = state.dataMaterial->Material(MaterNum).AbsorpVisible; + state.dataMaterial->Material(MaterNum).AbsorpThermal *= (1.0 - state.dataMaterial->Material(MaterNum).Trans); + state.dataMaterial->Material(MaterNum).AbsorpThermalInput = state.dataMaterial->Material(MaterNum).AbsorpThermal; + + if (state.dataMaterial->Material(MaterNum).Conductivity > 0.0) { + state.dataHeatBal->NominalR(MaterNum) = (1.0 - state.dataMaterial->Material(MaterNum).Trans) * + state.dataMaterial->Material(MaterNum).Thickness / + state.dataMaterial->Material(MaterNum).Conductivity; + } else { + state.dataHeatBal->NominalR(MaterNum) = 1.0; + ShowWarningError( + state, + "Conductivity for material=\"" + state.dataMaterial->Material(MaterNum).Name + + "\" must be greater than 0 for calculating Nominal R-value, Nominal R is defaulted to 1 and the simulation continues."); + } + + if (state.dataMaterial->Material(MaterNum).Trans + state.dataMaterial->Material(MaterNum).ReflectShade >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, "Calculated solar transmittance + solar reflectance not < 1.0"); + ShowContinueError(state, "See Engineering Reference for calculation procedure for solar transmittance."); + } + + if (state.dataMaterial->Material(MaterNum).TransVis + state.dataMaterial->Material(MaterNum).ReflectShadeVis >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, "Calculated visible transmittance + visible reflectance not < 1.0"); + ShowContinueError(state, "See Engineering Reference for calculation procedure for visible solar transmittance."); + } + + if (state.dataMaterial->Material(MaterNum).TransThermal + state.dataMaterial->Material(MaterNum).AbsorpThermal >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowSevereError(state, "Thermal hemispherical emissivity plus open area fraction (1-diameter/spacing)**2 not < 1.0"); + } + } + + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Screen:EquivalentLayer"; + for (Loop = 1; Loop <= state.dataHeatBal->TotScreensEQL; ++Loop) { + + MaterialProps = 0; + + // Call GetObjectItem routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::ScreenEquivalentLayer; + + // Load the material derived type from the input data. + // WindowMaterial:Screen:EquivalentLayer, + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; + state.dataMaterial->Material(MaterNum).ROnly = true; + state.dataMaterial->Material(MaterNum).TausFrontBeamBeam = MaterialProps(1); + state.dataMaterial->Material(MaterNum).TausBackBeamBeam = MaterialProps(1); + state.dataMaterial->Material(MaterNum).TausFrontBeamDiff = MaterialProps(2); + state.dataMaterial->Material(MaterNum).TausBackBeamDiff = MaterialProps(2); + state.dataMaterial->Material(MaterNum).ReflFrontBeamDiff = MaterialProps(3); + state.dataMaterial->Material(MaterNum).ReflBackBeamDiff = MaterialProps(3); + state.dataMaterial->Material(MaterNum).TausFrontBeamBeamVis = MaterialProps(4); + state.dataMaterial->Material(MaterNum).TausFrontBeamDiffVis = MaterialProps(5); + state.dataMaterial->Material(MaterNum).ReflFrontDiffDiffVis = MaterialProps(6); + state.dataMaterial->Material(MaterNum).TausThermal = MaterialProps(7); + state.dataMaterial->Material(MaterNum).EmissThermalFront = MaterialProps(8); + state.dataMaterial->Material(MaterNum).EmissThermalBack = MaterialProps(8); + + // Assumes thermal emissivity is the same as thermal absorptance + state.dataMaterial->Material(MaterNum).AbsorpThermalFront = state.dataMaterial->Material(MaterNum).EmissThermalFront; + state.dataMaterial->Material(MaterNum).AbsorpThermalBack = state.dataMaterial->Material(MaterNum).EmissThermalBack; + state.dataMaterial->Material(MaterNum).TransThermal = state.dataMaterial->Material(MaterNum).TausThermal; + + if (MaterialProps(3) < 0.0 || MaterialProps(3) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(3) + " must be >= 0 and <= 1"); + } + + if (MaterialProps(6) < 0.0 || MaterialProps(6) > 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(6) + " must be >= 0 and <= 1 for material " + + state.dataMaterial->Material(MaterNum).Name + '.'); + } + + if (!state.dataIPShortCut->lNumericFieldBlanks(9)) { + if (MaterialProps(9) > 0.00001) { + state.dataMaterial->Material(MaterNum).ScreenWireSpacing = MaterialProps(9); // screen wire spacing + } else { + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(9) + " must be > 0."); + ShowContinueError(state, "...Setting screen wire spacing to a default value of 0.025m and simulation continues."); + state.dataMaterial->Material(MaterNum).ScreenWireSpacing = 0.025; + } + } + + if (!state.dataIPShortCut->lNumericFieldBlanks(10)) { + if (MaterialProps(10) > 0.00001 && MaterialProps(10) < state.dataMaterial->Material(MaterNum).ScreenWireSpacing) { + state.dataMaterial->Material(MaterNum).ScreenWireDiameter = MaterialProps(10); // screen wire spacing + } else { + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(10) + " must be > 0."); + ShowContinueError(state, "...Setting screen wire diameter to a default value of 0.005m and simulation continues."); + state.dataMaterial->Material(MaterNum).ScreenWireDiameter = 0.005; + } + } + + if (state.dataMaterial->Material(MaterNum).ScreenWireSpacing > 0.0) { + if (state.dataMaterial->Material(MaterNum).ScreenWireDiameter / state.dataMaterial->Material(MaterNum).ScreenWireSpacing >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError( + state, state.dataIPShortCut->cNumericFieldNames(10) + " must be less than " + state.dataIPShortCut->cNumericFieldNames(9)); + } else { + // Calculate direct normal transmittance (open area fraction) + Openness = pow_2(1.0 - state.dataMaterial->Material(MaterNum).ScreenWireDiameter / + state.dataMaterial->Material(MaterNum).ScreenWireSpacing); + if ((state.dataMaterial->Material(MaterNum).TausFrontBeamBeam - Openness) / Openness > 0.01) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", screen openness specified."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(1) + " is > 1.0% of the value calculated from input fields:"); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(9) + " and " + (state.dataIPShortCut->cNumericFieldNames(10))); + ShowContinueError(state, " using the formula (1-diameter/spacing)**2"); + ShowContinueError(state, " ...the screen diameter is recalculated from the material openness specified "); + ShowContinueError(state, " ...and wire spacing using the formula = wire spacing * (1.0 - SQRT(Opennes))"); + state.dataMaterial->Material(MaterNum).ScreenWireDiameter = + state.dataMaterial->Material(MaterNum).ScreenWireSpacing * + (1.0 - std::sqrt(state.dataMaterial->Material(MaterNum).TausFrontBeamBeam)); + ShowContinueError(state, + format(" ...Recalculated {}={:.4R} m", + state.dataIPShortCut->cNumericFieldNames(10), + state.dataMaterial->Material(MaterNum).ScreenWireDiameter)); + } + } + } + + if (state.dataMaterial->Material(MaterNum).TausFrontBeamBeam + state.dataMaterial->Material(MaterNum).ReflFrontBeamDiff >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, "Calculated solar transmittance + solar reflectance not < 1.0"); + ShowContinueError(state, "See Engineering Reference for calculation procedure for solar transmittance."); + } + + if (state.dataMaterial->Material(MaterNum).TausFrontBeamBeamVis + state.dataMaterial->Material(MaterNum).ReflFrontDiffDiffVis >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, "Calculated visible transmittance + visible reflectance not < 1.0"); + ShowContinueError(state, "See Engineering Reference for calculation procedure for visible solar transmittance."); + } + if (state.dataMaterial->Material(MaterNum).TransThermal + state.dataMaterial->Material(MaterNum).AbsorpThermal >= 1.0) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowSevereError(state, "Thermal hemispherical emissivity plus open area fraction (1-diameter/spacing)**2 not < 1.0"); + } + + } // TotScreensEQL loop + + // Window Blind Materials + if ((state.dataHeatBal->TotBlindsEQL == 0) && (state.dataHeatBal->TotBlinds == 0)) { + state.dataSurface->actualMaxSlatAngs = 1; // first slot is used for shades + } + + if (state.dataHeatBal->TotBlinds > 0) { + state.dataHeatBal->Blind.allocate(state.dataHeatBal->TotBlinds); // Allocate the array Size to the number of blinds + } + + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Blind"; + for (Loop = 1; Loop <= state.dataHeatBal->TotBlinds; ++Loop) { + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowBlind; + + // Load the material derived type from the input data. + + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + state.dataHeatBal->Blind(Loop).Name = MaterialNames(1); + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::Rough; + state.dataMaterial->Material(MaterNum).BlindDataPtr = Loop; + state.dataMaterial->Material(MaterNum).ROnly = true; + + state.dataHeatBal->Blind(Loop).MaterialNumber = MaterNum; + if (UtilityRoutines::SameString(MaterialNames(2), "Horizontal")) { + state.dataHeatBal->Blind(Loop).SlatOrientation = DataWindowEquivalentLayer::Orientation::Horizontal; + } else if (UtilityRoutines::SameString(MaterialNames(2), "Vertical")) { + state.dataHeatBal->Blind(Loop).SlatOrientation = DataWindowEquivalentLayer::Orientation::Vertical; + } + state.dataHeatBal->Blind(Loop).SlatWidth = MaterialProps(1); + state.dataHeatBal->Blind(Loop).SlatSeparation = MaterialProps(2); + state.dataHeatBal->Blind(Loop).SlatThickness = MaterialProps(3); + state.dataHeatBal->Blind(Loop).SlatAngle = MaterialProps(4); + state.dataHeatBal->Blind(Loop).SlatConductivity = MaterialProps(5); + state.dataHeatBal->Blind(Loop).SlatTransSolBeamDiff = MaterialProps(6); + state.dataHeatBal->Blind(Loop).SlatFrontReflSolBeamDiff = MaterialProps(7); + state.dataHeatBal->Blind(Loop).SlatBackReflSolBeamDiff = MaterialProps(8); + state.dataHeatBal->Blind(Loop).SlatTransSolDiffDiff = MaterialProps(9); + state.dataHeatBal->Blind(Loop).SlatFrontReflSolDiffDiff = MaterialProps(10); + state.dataHeatBal->Blind(Loop).SlatBackReflSolDiffDiff = MaterialProps(11); + state.dataHeatBal->Blind(Loop).SlatTransVisBeamDiff = MaterialProps(12); + state.dataHeatBal->Blind(Loop).SlatFrontReflVisBeamDiff = MaterialProps(13); + state.dataHeatBal->Blind(Loop).SlatBackReflVisBeamDiff = MaterialProps(14); + state.dataHeatBal->Blind(Loop).SlatTransVisDiffDiff = MaterialProps(15); + state.dataHeatBal->Blind(Loop).SlatFrontReflVisDiffDiff = MaterialProps(16); + state.dataHeatBal->Blind(Loop).SlatBackReflVisDiffDiff = MaterialProps(17); + state.dataHeatBal->Blind(Loop).SlatTransIR = MaterialProps(18); + state.dataHeatBal->Blind(Loop).SlatFrontEmissIR = MaterialProps(19); + state.dataHeatBal->Blind(Loop).SlatBackEmissIR = MaterialProps(20); + state.dataHeatBal->Blind(Loop).BlindToGlassDist = MaterialProps(21); + state.dataHeatBal->Blind(Loop).BlindTopOpeningMult = MaterialProps(22); + state.dataHeatBal->Blind(Loop).BlindBottomOpeningMult = MaterialProps(23); + state.dataHeatBal->Blind(Loop).BlindLeftOpeningMult = MaterialProps(24); + state.dataHeatBal->Blind(Loop).BlindRightOpeningMult = MaterialProps(25); + state.dataHeatBal->Blind(Loop).MinSlatAngle = MaterialProps(26); + state.dataHeatBal->Blind(Loop).MaxSlatAngle = MaterialProps(27); + + // TH 2/11/2010. For CR 8010 + // By default all blinds have fixed slat angle, new blinds with variable slat angle are created if + // they are used with window shading controls that adjust slat angles like ScheduledSlatAngle or BlockBeamSolar + state.dataHeatBal->Blind(Loop).SlatAngleType = DataWindowEquivalentLayer::AngleType::Fixed; + + if (state.dataHeatBal->Blind(Loop).SlatWidth < state.dataHeatBal->Blind(Loop).SlatSeparation) { + ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Slat Angles/Widths"); + ShowContinueError(state, + format("{} [{:.2R}] is less than {} [{:.2R}].", + state.dataIPShortCut->cNumericFieldNames(1), + state.dataHeatBal->Blind(Loop).SlatWidth, + state.dataIPShortCut->cNumericFieldNames(2), + state.dataHeatBal->Blind(Loop).SlatSeparation)); + ShowContinueError(state, "This will allow direct beam to be transmitted when Slat angle = 0."); + } + + if (!UtilityRoutines::SameString(MaterialNames(2), "Horizontal") && !UtilityRoutines::SameString(MaterialNames(2), "Vertical")) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value"); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(2) + "=\"" + MaterialNames(2) + "\", must be Horizontal or Vertical."); + } + + if ((MaterialProps(6) + MaterialProps(7) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(6) + " + " + state.dataIPShortCut->cNumericFieldNames(7) + " not < 1.0"); + } + if ((MaterialProps(6) + MaterialProps(8) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(6) + " + " + state.dataIPShortCut->cNumericFieldNames(8) + " not < 1.0"); + } + + if ((MaterialProps(9) + MaterialProps(10) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(9) + " + " + state.dataIPShortCut->cNumericFieldNames(10) + " not < 1.0"); + } + if ((MaterialProps(9) + MaterialProps(11) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(9) + " + " + state.dataIPShortCut->cNumericFieldNames(11) + " not < 1.0"); + } + + if ((MaterialProps(12) + MaterialProps(13) >= 1.0) || (MaterialProps(12) + MaterialProps(14) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError( + state, state.dataIPShortCut->cNumericFieldNames(12) + " + " + state.dataIPShortCut->cNumericFieldNames(13) + " not < 1.0 OR"); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(12) + " + " + state.dataIPShortCut->cNumericFieldNames(14) + " not < 1.0"); + } + + if ((MaterialProps(12) + MaterialProps(13) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(12) + " + " + state.dataIPShortCut->cNumericFieldNames(13) + " not < 1.0"); + } + if ((MaterialProps(12) + MaterialProps(14) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(12) + " + " + state.dataIPShortCut->cNumericFieldNames(14) + " not < 1.0"); + } + + if ((MaterialProps(15) + MaterialProps(16) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(15) + " + " + state.dataIPShortCut->cNumericFieldNames(16) + " not < 1.0"); + } + if ((MaterialProps(15) + MaterialProps(17) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(15) + " + " + state.dataIPShortCut->cNumericFieldNames(17) + " not < 1.0"); + } + + // Require that beam and diffuse properties be the same + if (std::abs(MaterialProps(9) - MaterialProps(6)) > 1.e-5) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(6) + " must equal " + state.dataIPShortCut->cNumericFieldNames(9)); + } + + if (std::abs(MaterialProps(10) - MaterialProps(7)) > 1.e-5) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(7) + " must equal " + state.dataIPShortCut->cNumericFieldNames(10)); + } + + if (std::abs(MaterialProps(11) - MaterialProps(8)) > 1.e-5) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(8) + " must equal " + state.dataIPShortCut->cNumericFieldNames(11)); + } + + if (std::abs(MaterialProps(15) - MaterialProps(12)) > 1.e-5) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(12) + " must equal " + state.dataIPShortCut->cNumericFieldNames(15)); + } + + if (std::abs(MaterialProps(16) - MaterialProps(13)) > 1.e-5) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(13) + " must equal " + state.dataIPShortCut->cNumericFieldNames(16)); + } + + if (std::abs(MaterialProps(17) - MaterialProps(14)) > 1.e-5) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(14) + " must equal " + state.dataIPShortCut->cNumericFieldNames(17)); + } + + if ((MaterialProps(18) + MaterialProps(19) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(18) + " + " + state.dataIPShortCut->cNumericFieldNames(19) + " not < 1.0"); + } + if ((MaterialProps(18) + MaterialProps(20) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(18) + " + " + state.dataIPShortCut->cNumericFieldNames(20) + " not < 1.0"); + } + + if (state.dataHeatBal->Blind(Loop).BlindToGlassDist < 0.5 * state.dataHeatBal->Blind(Loop).SlatWidth) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError( + state, state.dataIPShortCut->cNumericFieldNames(21) + " is less than half of the " + state.dataIPShortCut->cNumericFieldNames(1)); + } + + // Minimum and maximum slat angles allowed by slat geometry + if (state.dataHeatBal->Blind(Loop).SlatWidth > state.dataHeatBal->Blind(Loop).SlatSeparation) { + MinSlatAngGeom = std::asin(state.dataHeatBal->Blind(Loop).SlatThickness / + (state.dataHeatBal->Blind(Loop).SlatThickness + state.dataHeatBal->Blind(Loop).SlatSeparation)) / + DataGlobalConstants::DegToRadians; + } else { + MinSlatAngGeom = 0.0; + } + MaxSlatAngGeom = 180.0 - MinSlatAngGeom; + + // Error if input slat angle not in range allowed by slat geometry + if ((state.dataHeatBal->Blind(Loop).SlatSeparation + state.dataHeatBal->Blind(Loop).SlatThickness) < + state.dataHeatBal->Blind(Loop).SlatWidth) { + if (state.dataHeatBal->Blind(Loop).SlatAngle < MinSlatAngGeom) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + format("{}=[{:.1R}], is less than smallest allowed by slat dimensions and spacing, [{:.1R}] deg.", + state.dataIPShortCut->cNumericFieldNames(4), + state.dataHeatBal->Blind(Loop).SlatAngle, + MinSlatAngGeom)); + } else if (state.dataHeatBal->Blind(Loop).SlatAngle > MaxSlatAngGeom) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + format("{}=[{:.1R}], is greater than largest allowed by slat dimensions and spacing, [{:.1R}] deg.", + state.dataIPShortCut->cNumericFieldNames(4), + state.dataHeatBal->Blind(Loop).SlatAngle, + MinSlatAngGeom)); + } + } + + // By default all Blinds are "fixed" slats. Only with Shading Control is one considered variable and this check + // is now done when that happens. 9.3.2009 LKL + + // IF(Blind(Loop)%SlatAngleType == VariableSlats) THEN + // ! Error if maximum slat angle less than minimum + // IF(Blind(Loop)%MaxSlatAngle < Blind(Loop)%MinSlatAngle) THEN + // ErrorsFound = .TRUE. + // CALL ShowSevereError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//'="'//TRIM(MaterialNames(1))//'", Illegal value + // combination.') CALL ShowContinueError(state, + // TRIM(cNumericFieldNames(26))//'=['//TRIM(RoundSigDigits(Blind(Loop)%MinSlatAngle,1))// & + // '], is greater than '//TRIM(cNumericFieldNames(27))//'=['// & + // TRIM(RoundSigDigits(Blind(Loop)%MaxSlatAngle,1))//'] deg.') + // END IF + // ! Error if input slat angle not in input min/max range + // IF(Blind(Loop)%MaxSlatAngle > Blind(Loop)%MinSlatAngle .AND. (Blind(Loop)%SlatAngle < Blind(Loop)%MinSlatAngle & + // .OR. Blind(Loop)%SlatAngle > Blind(Loop)%MaxSlatAngle)) THEN + // ErrorsFound = .TRUE. + // CALL ShowSevereError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//'="'//TRIM(MaterialNames(1))//'", Illegal value + // combination.') CALL ShowContinueError(state, TRIM(cNumericFieldNames(4))//'=['//TRIM(RoundSigDigits(Blind(Loop)%SlatAngle,1))// + // & + // '] is outside of the input min/max range, min=['//TRIM(RoundSigDigits(Blind(Loop)%MinSlatAngle,1))// & + // '], max=['//TRIM(RoundSigDigits(Blind(Loop)%MaxSlatAngle,1))//'] deg.') + // END IF + // ! Error if input minimum slat angle is less than that allowed by slat geometry + // IF(Blind(Loop)%MinSlatAngle < MinSlatAngGeom) THEN + // CALL ShowSevereError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//'="'//TRIM(MaterialNames(1))//'", Illegal value + // combination.') CALL ShowContinueError(state, + // TRIM(cNumericFieldNames(26))//'=['//TRIM(RoundSigDigits(Blind(Loop)%MinSlatAngle,1))// & + // '] is less than the smallest allowed by slat dimensions and spacing, min=['// & + // TRIM(RoundSigDigits(MinSlatAngGeom,1))//'] deg.') + // CALL ShowContinueError(state, 'Minimum Slat Angle will be set to '//TRIM(RoundSigDigits(MinSlatAngGeom,1))//' deg.') + // Blind(Loop)%MinSlatAngle = MinSlatAngGeom + // END IF + // ! Error if input maximum slat angle is greater than that allowed by slat geometry + // IF(Blind(Loop)%MaxSlatAngle > MaxSlatAngGeom) THEN + // CALL ShowWarningError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//'="'//TRIM(MaterialNames(1))//'", Illegal value + // combination.') CALL ShowContinueError(state, + // TRIM(cNumericFieldNames(27))//'=['//TRIM(RoundSigDigits(Blind(Loop)%MaxSlatAngle,1))// & + // '] is greater than the largest allowed by slat dimensions and spacing, ['// & + // TRIM(RoundSigDigits(MaxSlatAngGeom,1))//'] deg.') + // CALL ShowContinueError(state, 'Maximum Slat Angle will be set to '//TRIM(RoundSigDigits(MaxSlatAngGeom,1))//' deg.') + // Blind(Loop)%MaxSlatAngle = MaxSlatAngGeom + // END IF + // END IF ! End of check if slat angle is variable + } + + // Window Blind Materials for EquivalentLayer Model + + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Blind:EquivalentLayer"; + for (Loop = 1; Loop <= state.dataHeatBal->TotBlindsEQL; ++Loop) { + + // Call Input Get routine to retrieve material data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::BlindEquivalentLayer; + + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::Rough; + state.dataMaterial->Material(MaterNum).ROnly = true; + + if (UtilityRoutines::SameString(MaterialNames(2), "Horizontal")) { + state.dataMaterial->Material(MaterNum).SlatOrientation = DataWindowEquivalentLayer::Orientation::Horizontal; + } else if (UtilityRoutines::SameString(MaterialNames(2), "Vertical")) { + state.dataMaterial->Material(MaterNum).SlatOrientation = DataWindowEquivalentLayer::Orientation::Vertical; + } + state.dataMaterial->Material(MaterNum).SlatWidth = MaterialProps(1); + state.dataMaterial->Material(MaterNum).SlatSeparation = MaterialProps(2); + state.dataMaterial->Material(MaterNum).SlatCrown = MaterialProps(3); + state.dataMaterial->Material(MaterNum).SlatAngle = MaterialProps(4); + + state.dataMaterial->Material(MaterNum).TausFrontBeamDiff = MaterialProps(5); + state.dataMaterial->Material(MaterNum).TausBackBeamDiff = MaterialProps(6); + state.dataMaterial->Material(MaterNum).ReflFrontBeamDiff = MaterialProps(7); + state.dataMaterial->Material(MaterNum).ReflBackBeamDiff = MaterialProps(8); + + if (!state.dataIPShortCut->lNumericFieldBlanks(9) && !state.dataIPShortCut->lNumericFieldBlanks(10) && + !state.dataIPShortCut->lNumericFieldBlanks(11) && !state.dataIPShortCut->lNumericFieldBlanks(12)) { + state.dataMaterial->Material(MaterNum).TausFrontBeamDiffVis = MaterialProps(9); + state.dataMaterial->Material(MaterNum).TausBackBeamDiffVis = MaterialProps(10); + state.dataMaterial->Material(MaterNum).ReflFrontBeamDiffVis = MaterialProps(11); + state.dataMaterial->Material(MaterNum).ReflBackBeamDiffVis = MaterialProps(12); + } + if (!state.dataIPShortCut->lNumericFieldBlanks(13) && !state.dataIPShortCut->lNumericFieldBlanks(14) && + !state.dataIPShortCut->lNumericFieldBlanks(15)) { + state.dataMaterial->Material(MaterNum).TausDiffDiff = MaterialProps(13); + state.dataMaterial->Material(MaterNum).ReflFrontDiffDiff = MaterialProps(14); + state.dataMaterial->Material(MaterNum).ReflBackDiffDiff = MaterialProps(15); + } + if (!state.dataIPShortCut->lNumericFieldBlanks(16) && !state.dataIPShortCut->lNumericFieldBlanks(17) && + !state.dataIPShortCut->lNumericFieldBlanks(18)) { + state.dataMaterial->Material(MaterNum).TausDiffDiffVis = MaterialProps(13); + state.dataMaterial->Material(MaterNum).ReflFrontDiffDiffVis = MaterialProps(14); + state.dataMaterial->Material(MaterNum).ReflBackDiffDiffVis = MaterialProps(15); + } + if (!state.dataIPShortCut->lNumericFieldBlanks(19)) { + state.dataMaterial->Material(MaterNum).TausThermal = MaterialProps(19); + } + if (!state.dataIPShortCut->lNumericFieldBlanks(20)) { + state.dataMaterial->Material(MaterNum).EmissThermalFront = MaterialProps(20); + } + if (!state.dataIPShortCut->lNumericFieldBlanks(21)) { + state.dataMaterial->Material(MaterNum).EmissThermalBack = MaterialProps(21); + } + // Assumes thermal emissivity is the same as thermal absorptance + state.dataMaterial->Material(MaterNum).AbsorpThermalFront = state.dataMaterial->Material(MaterNum).EmissThermalFront; + state.dataMaterial->Material(MaterNum).AbsorpThermalBack = state.dataMaterial->Material(MaterNum).EmissThermalBack; + state.dataMaterial->Material(MaterNum).TransThermal = state.dataMaterial->Material(MaterNum).TausThermal; + + // By default all blinds have fixed slat angle, + // they are used with window shading controls that adjust slat angles like MaximizeSolar or BlockBeamSolar + if (!state.dataIPShortCut->lAlphaFieldBlanks(3)) { + if (UtilityRoutines::SameString(MaterialNames(3), "FixedSlatAngle")) { + state.dataMaterial->Material(MaterNum).SlatAngleType = state.dataWindowEquivalentLayer->lscNONE; + } else if (UtilityRoutines::SameString(MaterialNames(3), "MaximizeSolar")) { + state.dataMaterial->Material(MaterNum).SlatAngleType = state.dataWindowEquivalentLayer->lscVBPROF; + } else if (UtilityRoutines::SameString(MaterialNames(3), "BlockBeamSolar")) { + state.dataMaterial->Material(MaterNum).SlatAngleType = state.dataWindowEquivalentLayer->lscVBNOBM; + } else { + state.dataMaterial->Material(MaterNum).SlatAngleType = 0; + } + } else { + state.dataMaterial->Material(MaterNum).SlatAngleType = 0; + } + if (state.dataMaterial->Material(MaterNum).SlatWidth < state.dataMaterial->Material(MaterNum).SlatSeparation) { + ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Slat Seperation/Width"); + ShowContinueError(state, + format("{} [{:.2R}] is less than {} [{:.2R}].", + state.dataIPShortCut->cNumericFieldNames(1), + state.dataMaterial->Material(MaterNum).SlatWidth, + state.dataIPShortCut->cNumericFieldNames(2), + state.dataMaterial->Material(MaterNum).SlatSeparation)); + ShowContinueError(state, "This will allow direct beam to be transmitted when Slat angle = 0."); + } + if (state.dataMaterial->Material(MaterNum).SlatSeparation < 0.001) { + ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Slat Seperation"); + ShowContinueError(state, + format("{} [{:.2R}]. Slate spacing must be > 0.0", + state.dataIPShortCut->cNumericFieldNames(2), + state.dataMaterial->Material(MaterNum).SlatSeparation)); + ShowContinueError(state, "...Setting slate spacing to default value of 0.025 m and simulation continues."); + state.dataMaterial->Material(MaterNum).SlatSeparation = 0.025; + } + if (state.dataMaterial->Material(MaterNum).SlatWidth < 0.001 || + state.dataMaterial->Material(MaterNum).SlatWidth >= 2.0 * state.dataMaterial->Material(MaterNum).SlatSeparation) { + ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Slat Width"); + ShowContinueError(state, + format("{} [{:.2R}]. Slat width range is 0 < Width <= 2*Spacing", + state.dataIPShortCut->cNumericFieldNames(1), + state.dataMaterial->Material(MaterNum).SlatWidth)); + ShowContinueError(state, "...Setting slate width equal to slate spacing and simulation continues."); + state.dataMaterial->Material(MaterNum).SlatWidth = state.dataMaterial->Material(MaterNum).SlatSeparation; + } + if (state.dataMaterial->Material(MaterNum).SlatCrown < 0.0 || + state.dataMaterial->Material(MaterNum).SlatCrown >= 0.5 * state.dataMaterial->Material(MaterNum).SlatWidth) { + ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Slat Crown"); + ShowContinueError(state, + format("{} [{:.2R}]. Slat crwon range is 0 <= crown < 0.5*Width", + state.dataIPShortCut->cNumericFieldNames(3), + state.dataMaterial->Material(MaterNum).SlatCrown)); + ShowContinueError(state, "...Setting slate crown to 0.0 and simulation continues."); + state.dataMaterial->Material(MaterNum).SlatCrown = 0.0; + } + if (state.dataMaterial->Material(MaterNum).SlatAngle < -90.0 || state.dataMaterial->Material(MaterNum).SlatAngle > 90.0) { + ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Slat Angle"); + ShowContinueError(state, + format("{} [{:.2R}]. Slat angle range is -90.0 <= Angle < 90.0", + state.dataIPShortCut->cNumericFieldNames(4), + state.dataMaterial->Material(MaterNum).SlatAngle)); + ShowContinueError(state, "...Setting slate angle to 0.0 and simulation continues."); + state.dataMaterial->Material(MaterNum).SlatAngle = 0.0; + } + + if (!UtilityRoutines::SameString(MaterialNames(2), "Horizontal") && !UtilityRoutines::SameString(MaterialNames(2), "Vertical")) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value"); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(2) + "=\"" + MaterialNames(2) + "\", must be Horizontal or Vertical."); + } + + if ((MaterialProps(5) + MaterialProps(7) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(5) + " + " + state.dataIPShortCut->cNumericFieldNames(7) + " not < 1.0"); + } + if ((MaterialProps(6) + MaterialProps(8) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(6) + " + " + state.dataIPShortCut->cNumericFieldNames(8) + " not < 1.0"); + } + if ((MaterialProps(9) + MaterialProps(11) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(9) + " + " + state.dataIPShortCut->cNumericFieldNames(11) + " not < 1.0"); + } + if ((MaterialProps(10) + MaterialProps(12) >= 1.0)) { + ErrorsFound = true; + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(10) + " + " + state.dataIPShortCut->cNumericFieldNames(12) + " not < 1.0"); + } + + } // TotBlindsEQL loop + + // EcoRoof Materials + // PSU 2006 + state.dataHeatBalMgr->CurrentModuleObject = "Material:RoofVegetation"; + for (Loop = 1; Loop <= EcoRoofMat; ++Loop) { + // Call Input Get Routine to retrieve material data from ecoroof + + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + MaterialNames, + MaterialNumAlpha, + MaterialProps, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + MaterialNames(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + // this part is similar to the regular material + // Load the material derived type from the input data. + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::EcoRoof; + + // this part is new for Ecoroof properties, + // especially for the Plant Layer of the ecoroof + state.dataMaterial->Material(MaterNum).HeightOfPlants = MaterialProps(1); + state.dataMaterial->Material(MaterNum).LAI = MaterialProps(2); + state.dataMaterial->Material(MaterNum).Lreflectivity = MaterialProps(3); // Albedo + state.dataMaterial->Material(MaterNum).LEmissitivity = MaterialProps(4); + state.dataMaterial->Material(MaterNum).RStomata = MaterialProps(5); + + state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); + // need to treat the A2 with is just the name of the soil(it is + // not important) + ValidateMaterialRoughness(state, MaterNum, MaterialNames(3), ErrorsFound); + if (UtilityRoutines::SameString(MaterialNames(4), "Simple")) { + state.dataMaterial->Material(MaterNum).EcoRoofCalculationMethod = 1; + } else if (UtilityRoutines::SameString(MaterialNames(4), "Advanced") || state.dataIPShortCut->lAlphaFieldBlanks(4)) { + state.dataMaterial->Material(MaterNum).EcoRoofCalculationMethod = 2; + } else { + ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value"); + ShowContinueError(state, state.dataIPShortCut->cAlphaFieldNames(4) + "=\"" + MaterialNames(4) + "\"."); + ShowContinueError(state, "...Valid values are \"Simple\" or \"Advanced\"."); + ErrorsFound = true; + } + + state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(6); + state.dataMaterial->Material(MaterNum).Conductivity = MaterialProps(7); + state.dataMaterial->Material(MaterNum).Density = MaterialProps(8); + state.dataMaterial->Material(MaterNum).SpecHeat = MaterialProps(9); + state.dataMaterial->Material(MaterNum).AbsorpThermal = MaterialProps(10); // emissivity + state.dataMaterial->Material(MaterNum).AbsorpSolar = MaterialProps(11); // (1 - Albedo) + state.dataMaterial->Material(MaterNum).AbsorpVisible = MaterialProps(12); + state.dataMaterial->Material(MaterNum).Porosity = MaterialProps(13); + state.dataMaterial->Material(MaterNum).MinMoisture = MaterialProps(14); + state.dataMaterial->Material(MaterNum).InitMoisture = MaterialProps(15); + + if (state.dataMaterial->Material(MaterNum).Conductivity > 0.0) { + state.dataHeatBal->NominalR(MaterNum) = + state.dataMaterial->Material(MaterNum).Thickness / state.dataMaterial->Material(MaterNum).Conductivity; + state.dataMaterial->Material(MaterNum).Resistance = state.dataHeatBal->NominalR(MaterNum); + } else { + ShowSevereError( + state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + "\" is not defined correctly."); + ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(7) + " is <=0."); + ErrorsFound = true; + } + + if (state.dataMaterial->Material(MaterNum).InitMoisture > state.dataMaterial->Material(MaterNum).Porosity) { + ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); + ShowContinueError(state, + state.dataIPShortCut->cNumericFieldNames(15) + " is greater than " + state.dataIPShortCut->cNumericFieldNames(13) + + ". It must be less or equal."); + ShowContinueError( + state, format("{} = {:.3T}.", state.dataIPShortCut->cNumericFieldNames(13), state.dataMaterial->Material(MaterNum).Porosity)); + ShowContinueError( + state, format("{} = {:.3T}.", state.dataIPShortCut->cNumericFieldNames(15), state.dataMaterial->Material(MaterNum).InitMoisture)); + ShowContinueError(state, + format("{} is reset to the maximum (saturation) value = {:.3T}.", + state.dataIPShortCut->cNumericFieldNames(15), + state.dataMaterial->Material(MaterNum).Porosity)); + ShowContinueError(state, "Simulation continues."); + state.dataMaterial->Material(MaterNum).InitMoisture = state.dataMaterial->Material(MaterNum).Porosity; + } + } + + // Thermochromic glazing group + // get the number of WindowMaterial:GlazingGroup:Thermochromic objects in the idf file + state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:GlazingGroup:Thermochromic"; + state.dataHeatBal->TotTCGlazings = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + if (state.dataHeatBal->TotTCGlazings >= 1) { + // Read TC glazings + state.dataHeatBal->TCGlazings.allocate(state.dataHeatBal->TotTCGlazings); + + for (Loop = 1; Loop <= state.dataHeatBal->TotTCGlazings; ++Loop) { + // Get each TCGlazings from the input processor + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + state.dataIPShortCut->cAlphaArgs, + MaterialNumAlpha, + state.dataIPShortCut->rNumericArgs, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + + if (UtilityRoutines::IsNameEmpty( + state, state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) { + ShowContinueError(state, "...All Thermochromic Glazing names must be unique regardless of subtype."); + continue; + } + + if (MaterialNumProp + 1 != MaterialNumAlpha) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + "\" is not defined correctly."); + ShowContinueError(state, + "Check number of " + state.dataIPShortCut->cAlphaFieldNames(2) + " compared to number of " + + state.dataIPShortCut->cNumericFieldNames(1)); + ErrorsFound = true; + continue; + } + + // Allocate arrays + state.dataHeatBal->TCGlazings(Loop).SpecTemp.allocate(MaterialNumProp); + state.dataHeatBal->TCGlazings(Loop).LayerName.allocate(MaterialNumProp); + state.dataHeatBal->TCGlazings(Loop).LayerPoint.allocate(MaterialNumProp); + state.dataHeatBal->TCGlazings(Loop).SpecTemp = 0.0; + state.dataHeatBal->TCGlazings(Loop).LayerName = ""; + state.dataHeatBal->TCGlazings(Loop).LayerPoint = 0; + + state.dataHeatBal->TCGlazings(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); + state.dataHeatBal->TCGlazings(Loop).NumGlzMat = MaterialNumProp; + + for (iTC = 1; iTC <= MaterialNumProp; ++iTC) { + state.dataHeatBal->TCGlazings(Loop).SpecTemp(iTC) = state.dataIPShortCut->rNumericArgs(iTC); + state.dataHeatBal->TCGlazings(Loop).LayerName(iTC) = state.dataIPShortCut->cAlphaArgs(1 + iTC); + + // Find this glazing material in the material list + iMat = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(1 + iTC), state.dataMaterial->Material); + if (iMat != 0) { + // TC glazing + state.dataMaterial->Material(iMat).SpecTemp = state.dataIPShortCut->rNumericArgs(iTC); + state.dataMaterial->Material(iMat).TCParent = Loop; + state.dataHeatBal->TCGlazings(Loop).LayerPoint(iTC) = iMat; + + // test that named material is of the right type + if (state.dataMaterial->Material(iMat).Group != DataHeatBalance::MaterialGroup::WindowGlass) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + "\" is not defined correctly."); + ShowContinueError(state, "Material named: " + state.dataIPShortCut->cAlphaArgs(1 + iTC) + " is not a window glazing "); + ErrorsFound = true; + } + + } else { // thow error because not found + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + "\" is not defined correctly."); + ShowContinueError(state, "Material named: " + state.dataIPShortCut->cAlphaArgs(1 + iTC) + " was not found "); + ErrorsFound = true; + } + } + } + } + auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; + cCurrentModuleObject = "WindowMaterial:SimpleGlazingSystem"; + for (Loop = 1; Loop <= state.dataHeatBal->TotSimpleWindow; ++Loop) { + + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Loop, + state.dataIPShortCut->cAlphaArgs, + MaterialNumAlpha, + state.dataIPShortCut->rNumericArgs, + MaterialNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + state.dataIPShortCut->cAlphaArgs(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowSimpleGlazing; + state.dataMaterial->Material(MaterNum).Name = state.dataIPShortCut->cAlphaArgs(1); + state.dataMaterial->Material(MaterNum).SimpleWindowUfactor = state.dataIPShortCut->rNumericArgs(1); + state.dataMaterial->Material(MaterNum).SimpleWindowSHGC = state.dataIPShortCut->rNumericArgs(2); + if (!state.dataIPShortCut->lNumericFieldBlanks(3)) { + state.dataMaterial->Material(MaterNum).SimpleWindowVisTran = state.dataIPShortCut->rNumericArgs(3); + state.dataMaterial->Material(MaterNum).SimpleWindowVTinputByUser = true; + } + + SetupSimpleWindowGlazingSystem(state, MaterNum); + } + + // Simon: Place to load materials for complex fenestrations + if ((state.dataHeatBal->TotComplexShades > 0) || (state.dataHeatBal->TotComplexGaps > 0)) { + SetupComplexFenestrationMaterialInput(state, MaterNum, ErrorsFound); + if (ErrorsFound) { + ShowSevereError(state, "Errors found in processing complex fenestration material input"); + } + } + ScanForReports(state, "Constructions", state.dataHeatBalMgr->DoReport, "Materials"); + + if (state.dataHeatBalMgr->DoReport) { + + print(state.files.eio, + "! ,Material Name,ThermalResistance {{m2-K/w}},Roughness,Thickness {{m}},Conductivity " + "{{w/m-K}},Density {{kg/m3}},Specific Heat " + "{{J/kg-K}},Absorptance:Thermal,Absorptance:Solar,Absorptance:Visible\n"); + + print(state.files.eio, "! ,Material Name,ThermalResistance {{m2-K/w}}\n"); + + // Formats + constexpr const char *Format_701(" Material Details,{},{:.4R},{},{:.4R},{:.3R},{:.3R},{:.3R},{:.4R},{:.4R},{:.4R}\n"); + constexpr const char *Format_702(" Material:Air,{},{:.4R}\n"); + + for (MaterNum = 1; MaterNum <= state.dataHeatBal->TotMaterials; ++MaterNum) { + + switch (state.dataMaterial->Material(MaterNum).Group) { + case DataHeatBalance::MaterialGroup::Air: { + print( + state.files.eio, Format_702, state.dataMaterial->Material(MaterNum).Name, state.dataMaterial->Material(MaterNum).Resistance); + } break; + default: { + print(state.files.eio, + Format_701, + state.dataMaterial->Material(MaterNum).Name, + state.dataMaterial->Material(MaterNum).Resistance, + DisplayMaterialRoughness(state.dataMaterial->Material(MaterNum).Roughness), + state.dataMaterial->Material(MaterNum).Thickness, + state.dataMaterial->Material(MaterNum).Conductivity, + state.dataMaterial->Material(MaterNum).Density, + state.dataMaterial->Material(MaterNum).SpecHeat, + state.dataMaterial->Material(MaterNum).AbsorpThermal, + state.dataMaterial->Material(MaterNum).AbsorpSolar, + state.dataMaterial->Material(MaterNum).AbsorpVisible); + } break; + } + } + } + + // FORMATS. + + if (state.dataGlobal->AnyEnergyManagementSystemInModel) { // setup surface property EMS actuators + + for (MaterNum = 1; MaterNum <= state.dataHeatBal->TotMaterials; ++MaterNum) { + if (state.dataMaterial->Material(MaterNum).Group != DataHeatBalance::MaterialGroup::RegularMaterial) continue; + SetupEMSActuator(state, + "Material", + state.dataMaterial->Material(MaterNum).Name, + "Surface Property Solar Absorptance", + "[ ]", + state.dataMaterial->Material(MaterNum).AbsorpSolarEMSOverrideOn, + state.dataMaterial->Material(MaterNum).AbsorpSolarEMSOverride); + SetupEMSActuator(state, + "Material", + state.dataMaterial->Material(MaterNum).Name, + "Surface Property Thermal Absorptance", + "[ ]", + state.dataMaterial->Material(MaterNum).AbsorpThermalEMSOverrideOn, + state.dataMaterial->Material(MaterNum).AbsorpThermalEMSOverride); + SetupEMSActuator(state, + "Material", + state.dataMaterial->Material(MaterNum).Name, + "Surface Property Visible Absorptance", + "[ ]", + state.dataMaterial->Material(MaterNum).AbsorpVisibleEMSOverrideOn, + state.dataMaterial->Material(MaterNum).AbsorpVisibleEMSOverride); + } + } + + // try assigning phase change material properties for each material, won't do anything for non pcm surfaces + for (auto &m : state.dataMaterial->Material) { + m.phaseChange = HysteresisPhaseChange::HysteresisPhaseChange::factory(state, m.Name); + } + } + + void GetWindowGlassSpectralData(EnergyPlusData &state, bool &ErrorsFound) // set to true if errors found in input + { + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Winkelmann + // DATE WRITTEN May 2000 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // Gets spectral data (transmittance, front reflectance, and back + // reflectance at normal incidence vs. wavelength) for glass + + // METHODOLOGY EMPLOYED: + // na + + // REFERENCES: + // na + + // Using/Aliasing + + // Locals + // SUBROUTINE ARGUMENT DEFINITIONS: + + // SUBROUTINE PARAMETER DEFINITIONS: + constexpr const char *RoutineName("GetWindowGlassSpectralData: "); + + // INTERFACE BLOCK SPECIFICATIONS: + // na + + // DERIVED TYPE DEFINITIONS: + // na + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + + int IOStat; // IO Status when calling get input subroutine + Array1D_string SpecDataNames(1); // Spectral data alpha names + int SpecDataNumAlpha; // Number of spectral data alpha names being passed + int SpecDataNumProp; // Number of spectral data properties being passed + Array1D SpecDataProps; // Temporary array to transfer spectal data properties + int Loop; + int LamNum; // Wavelength number + int TotLam; // Total wavelengths + Real64 Lam; // Wavelength (microns) + Real64 Tau; // Transmittance, front reflectance, back reflectance + Real64 RhoF; + Real64 RhoB; + + state.dataHeatBalMgr->CurrentModuleObject = "MaterialProperty:GlazingSpectralData"; + state.dataHeatBal->TotSpectralData = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + state.dataHeatBal->SpectralData.allocate(state.dataHeatBal->TotSpectralData); + if (state.dataHeatBal->TotSpectralData > 0) SpecDataProps.allocate(Construction::MaxSpectralDataElements * 4); + + for (Loop = 1; Loop <= state.dataHeatBal->TotSpectralData; ++Loop) { + + // Call Input Get routine to retrieve spectral data + // Name is followed by up to 450 sets of normal-incidence measured values of + // [wavelength (microns), transmittance, front reflectance, back reflectance] for + // wavelengths covering the short-wave solar spectrum (from about 0.25 to 2.5 microns) + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + SpecDataNames, + SpecDataNumAlpha, + SpecDataProps, + SpecDataNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + + if (UtilityRoutines::IsNameEmpty(state, SpecDataNames(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) continue; + + // Load the spectral data derived type from the input data. + state.dataHeatBal->SpectralData(Loop).Name = SpecDataNames(1); + TotLam = SpecDataNumProp / 4; + if (mod(SpecDataNumProp, 4) != 0) { + ShowWarningError(state, + std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + "\" invalid set."); + ShowContinueError( + state, + format("... set not even multiple of 4 items (Wavelength,Trans,ReflFront,ReflBack), number of items in dataset = {}", + SpecDataNumProp)); + ShowContinueError(state, format("... remainder after div by 4 = {}, remainder items will be set to 0.0", mod(SpecDataNumProp, 4))); + SpecDataProps({SpecDataNumProp + 1, min(SpecDataNumProp + 4, Construction::MaxSpectralDataElements * 4)}) = 0.0; + } + if (TotLam > Construction::MaxSpectralDataElements) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + "\" invalid set."); + ShowContinueError( + state, + format("... More than max [{}] (Wavelength,Trans,ReflFront,ReflBack) entries in set.", Construction::MaxSpectralDataElements)); + continue; + } + state.dataHeatBal->SpectralData(Loop).NumOfWavelengths = TotLam; + + state.dataHeatBal->SpectralData(Loop).WaveLength.allocate(TotLam); // Wavelength (microns) + state.dataHeatBal->SpectralData(Loop).Trans.allocate(TotLam); // Transmittance at normal incidence + state.dataHeatBal->SpectralData(Loop).ReflFront.allocate(TotLam); // Front reflectance at normal incidence + state.dataHeatBal->SpectralData(Loop).ReflBack.allocate(TotLam); // Back reflectance at normal incidence + + for (LamNum = 1; LamNum <= TotLam; ++LamNum) { + state.dataHeatBal->SpectralData(Loop).WaveLength(LamNum) = SpecDataProps(4 * LamNum - 3); + state.dataHeatBal->SpectralData(Loop).Trans(LamNum) = SpecDataProps(4 * LamNum - 2); + // Following is needed since angular calculation in subr TransAndReflAtPhi + // fails for Trans = 0.0 + if (state.dataHeatBal->SpectralData(Loop).Trans(LamNum) < 0.001) state.dataHeatBal->SpectralData(Loop).Trans(LamNum) = 0.001; + state.dataHeatBal->SpectralData(Loop).ReflFront(LamNum) = SpecDataProps(4 * LamNum - 1); + state.dataHeatBal->SpectralData(Loop).ReflBack(LamNum) = SpecDataProps(4 * LamNum); + } + + // Check integrity of the spectral data + for (LamNum = 1; LamNum <= TotLam; ++LamNum) { + Lam = state.dataHeatBal->SpectralData(Loop).WaveLength(LamNum); + Tau = state.dataHeatBal->SpectralData(Loop).Trans(LamNum); + RhoF = state.dataHeatBal->SpectralData(Loop).ReflFront(LamNum); + RhoB = state.dataHeatBal->SpectralData(Loop).ReflBack(LamNum); + if (LamNum < TotLam) { + if (state.dataHeatBal->SpectralData(Loop).WaveLength(LamNum + 1) <= Lam) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + + "\" invalid set."); + ShowContinueError(state, + format("... Wavelengths not in increasing order. at wavelength#={}, value=[{:.4T}], next is [{:.4T}].", + LamNum, + Lam, + state.dataHeatBal->SpectralData(Loop).WaveLength(LamNum + 1))); + } + } + + if (Lam < 0.1 || Lam > 4.0) { + ErrorsFound = true; + ShowSevereError( + state, std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + "\" invalid value."); + ShowContinueError( + state, format("... A wavelength is not in the range 0.1 to 4.0 microns; at wavelength#={}, value=[{:.4T}].", LamNum, Lam)); + } + + // TH 2/15/2011. CR 8343 + // IGDB (International Glazing Database) does not meet the above strict restrictions. + // Relax rules to allow directly use of spectral data from IGDB + if (Tau > 1.01) { + ErrorsFound = true; + ShowSevereError( + state, std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + "\" invalid value."); + ShowContinueError(state, format("... A transmittance is > 1.0; at wavelength#={}, value=[{:.4T}].", LamNum, Tau)); + } + + if (RhoF < 0.0 || RhoF > 1.02 || RhoB < 0.0 || RhoB > 1.02) { + ErrorsFound = true; + ShowSevereError( + state, std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + "\" invalid value."); + ShowContinueError(state, format("... A reflectance is < 0.0 or > 1.0; at wavelength#={}, RhoF value=[{:.4T}].", LamNum, RhoF)); + ShowContinueError(state, format("... A reflectance is < 0.0 or > 1.0; at wavelength#={}, RhoB value=[{:.4T}].", LamNum, RhoB)); + } + + if ((Tau + RhoF) > 1.03 || (Tau + RhoB) > 1.03) { + ErrorsFound = true; + ShowSevereError( + state, std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + "\" invalid value."); + ShowContinueError(state, + "... Transmittance + reflectance) > 1.0 for an entry; at wavelength#=" + + format("{}, value(Tau+RhoF)=[{:.4T}], value(Tau+RhoB)=[{:.4T}].", LamNum, (Tau + RhoF), (Tau + RhoB))); + } + } + } + + if (state.dataHeatBal->TotSpectralData > 0) SpecDataProps.deallocate(); + } + + void ValidateMaterialRoughness(EnergyPlusData &state, + int const MaterNum, // Which Material number being validated. + std::string const &Roughness, // Roughness String + bool &ErrorsFound // If errors found + ) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Linda K. Lawrie + // DATE WRITTEN April 1999 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine compares the input Roughness value against the + // valid values and sets the correct value in the Material Data Structure. + + // METHODOLOGY EMPLOYED: + // Error message provided if not valid. + + // REFERENCES: + // na + + // USE STATEMENTS: + // na + + // Locals + // SUBROUTINE ARGUMENT DEFINITIONS: + + // SUBROUTINE PARAMETER DEFINITIONS: + // na + + // INTERFACE BLOCK SPECIFICATIONS: + // na + + // DERIVED TYPE DEFINITIONS: + // na + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + + // Select the correct Number for the associated ascii name for the roughness type + if (UtilityRoutines::SameString(Roughness, "VeryRough")) + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VeryRough; + if (UtilityRoutines::SameString(Roughness, "Rough")) state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::Rough; + if (UtilityRoutines::SameString(Roughness, "MediumRough")) + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; + if (UtilityRoutines::SameString(Roughness, "MediumSmooth")) + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumSmooth; + if (UtilityRoutines::SameString(Roughness, "Smooth")) + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::Smooth; + if (UtilityRoutines::SameString(Roughness, "VerySmooth")) + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VerySmooth; + + // Was it set? + if (state.dataMaterial->Material(MaterNum).Roughness == DataSurfaces::SurfaceRoughness::Invalid) { + ShowSevereError(state, "Material=" + state.dataMaterial->Material(MaterNum).Name + ",Illegal Roughness=" + Roughness); + ErrorsFound = true; + } + } + + void GetConstructData(EnergyPlusData &state, bool &ErrorsFound) // If errors found in input + { + + // SUBROUTINE INFORMATION: + // AUTHOR Richard Liesen + // DATE WRITTEN September 1997 + // MODIFIED January 2003, FCW: accommodate between-glass shading device + // July 2009, TH: added constructions defined with F and C factors + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This file reads the input through the input processor for Constructions. + // Data read in this routine is stored in a derived type (Construct) + // defined in the DataHeatBalance module. + // This subroutine only sets those parameters which must be obtained + // from the input file--all other portions of the Construct derived + // type are set during the initializations. + + // METHODOLOGY EMPLOYED: + // na + + // REFERENCES: + // na + + // Using/Aliasing + using namespace DataStringGlobals; + + // If UniqueConstructionNames size, then input has already been gotten + if (state.dataHeatBalMgr->UniqueConstructNames.size()) return; + + int ConstrNum; // Counter to keep track of the construction number + int Layer; // loop index for each of the construction layers + int ConstructNumAlpha; // Number of construction alpha names being passed + int DummyNumProp; // dummy variable for properties being passed + int IOStat; // IO Status when calling get input subroutine + Array1D_string ConstructAlphas({0, Construction::MaxLayersInConstruct}); // Construction Alpha names defined + Array1D DummyProps(5); // Temporary array to transfer construction properties + int Loop; + int TotRegConstructs; // Number of "regular" constructions (no embedded sources or sinks and + + int TotFfactorConstructs; // Number of slabs-on-grade or underground floor constructions defined with F factors + int TotCfactorConstructs; // Number of underground wall constructions defined with C factors + + // int TotSourceConstructs; // Number of constructions with embedded sources or sinks + int TotWindow5Constructs; // Number of constructions from Window5 data file + bool ConstructionFound; // True if input window construction name is found in the + // Window5 data file + bool EOFonW5File; // True if EOF encountered reading Window5 data file + DataHeatBalance::MaterialGroup MaterialLayerGroup; // window construction layer material group index + + int iMatGlass; // number of glass layers + Array1D_string WConstructNames; + + // Get the Total number of Constructions from the input + TotRegConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction"); + int totAirBoundaryConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:AirBoundary"); + + TotFfactorConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:FfactorGroundFloor"); + TotCfactorConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:CfactorUndergroundWall"); + + if (TotFfactorConstructs > 0) { + state.dataHeatBal->NoFfactorConstructionsUsed = false; + } + + if (TotCfactorConstructs > 0) { + state.dataHeatBal->NoCfactorConstructionsUsed = false; + } + + state.dataBSDFWindow->TotComplexFenStates = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:ComplexFenestrationState"); + TotWindow5Constructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:WindowDataFile"); + state.dataWindowEquivLayer->TotWinEquivLayerConstructs = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:WindowEquivalentLayer"); + + WConstructNames.allocate(TotWindow5Constructs); + + state.dataHeatBal->TotConstructs = TotRegConstructs + TotFfactorConstructs + TotCfactorConstructs + totAirBoundaryConstructs + + state.dataBSDFWindow->TotComplexFenStates + state.dataWindowEquivLayer->TotWinEquivLayerConstructs; + + state.dataHeatBal->NominalRforNominalUCalculation.dimension(state.dataHeatBal->TotConstructs, 0.0); + state.dataHeatBal->NominalU.dimension(state.dataHeatBal->TotConstructs, 0.0); + state.dataHeatBal->NominalUBeforeAdjusted.dimension(state.dataHeatBal->TotConstructs, 0.0); + state.dataHeatBal->CoeffAdjRatio.dimension(state.dataHeatBal->TotConstructs, 1.0); + + // Allocate the array to the number of constructions/initialize selected variables + state.dataConstruction->Construct.allocate(state.dataHeatBal->TotConstructs); + state.dataHeatBalMgr->UniqueConstructNames.reserve(state.dataHeatBal->TotConstructs); + // Note: If TotWindow5Constructs > 0, additional constructions are created in + // subr. SearchWindow5DataFile corresponding to those found on the data file. + for (auto &e : state.dataConstruction->Construct) { + // Initialize CTF and History terms + e.NumCTFTerms = 0; + e.NumHistories = 0; + + // Initialize some heat source/sink variables + e.SourceSinkPresent = false; // "default" is no source or sink present + e.SolutionDimensions = 1; // "default" is 1-D heat transfer + e.SourceAfterLayer = 0; // this has no meaning if a source/sink is not present + e.TempAfterLayer = 0; // this has no meaning if a source/sink is not present + e.ThicknessPerpend = 0.0; // this has no meaning if a source/sink is not present + + e.W5FrameDivider = 0; + e.FromWindow5DataFile = false; + + // these Construct arrays dimensioned based on MaxSolidWinLayers + e.setArraysBasedOnMaxSolidWinLayers(state); + } + + ConstrNum = 0; + + state.dataHeatBalMgr->CurrentModuleObject = "Construction"; + for (Loop = 1; Loop <= TotRegConstructs; ++Loop) { // Loop through all constructs in the input... + + // Get the object names for each construction from the input processor + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + ConstructAlphas, + ConstructNumAlpha, + DummyProps, + DummyNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueConstructNames, + ConstructAlphas(0), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + continue; + } + + // Glass layer counter + iMatGlass = 0; + + ++ConstrNum; + // Assign Construction name to the Derived Type using the zeroth position of the array + state.dataConstruction->Construct(ConstrNum).Name = ConstructAlphas(0); + + // Set the total number of layers for the construction + state.dataConstruction->Construct(ConstrNum).TotLayers = ConstructNumAlpha - 1; + + // Loop through all of the layers of the construct to match the material names. + // The loop index is the number minus 1 + for (Layer = 1; Layer <= ConstructNumAlpha - 1; ++Layer) { + + // Find the material in the list of materials + + state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) = + UtilityRoutines::FindItemInList(ConstructAlphas(Layer), state.dataMaterial->Material); + + // count number of glass layers + if (state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) > 0) { + if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)).Group == + DataHeatBalance::MaterialGroup::WindowGlass) + ++iMatGlass; + MaterialLayerGroup = state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)).Group; + if ((MaterialLayerGroup == DataHeatBalance::MaterialGroup::GlassEquivalentLayer) || + (MaterialLayerGroup == DataHeatBalance::MaterialGroup::ShadeEquivalentLayer) || + (MaterialLayerGroup == DataHeatBalance::MaterialGroup::DrapeEquivalentLayer) || + (MaterialLayerGroup == DataHeatBalance::MaterialGroup::BlindEquivalentLayer) || + (MaterialLayerGroup == DataHeatBalance::MaterialGroup::ScreenEquivalentLayer) || + (MaterialLayerGroup == DataHeatBalance::MaterialGroup::GapEquivalentLayer)) { + ShowSevereError(state, + "Invalid material layer type in window " + state.dataHeatBalMgr->CurrentModuleObject + " = " + + state.dataConstruction->Construct(ConstrNum).Name); + ShowSevereError(state, + "Equivalent Layer material type = " + ConstructAlphas(Layer) + + " is allowed only in Construction:WindowEquivalentLayer window object."); + ErrorsFound = true; + } + } + + if (state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) == 0) { + // This may be a TC GlazingGroup + state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) = + UtilityRoutines::FindItemInList(ConstructAlphas(Layer), state.dataHeatBal->TCGlazings); + + if (state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) > 0) { + // reset layer pointer to the first glazing in the TC GlazingGroup + state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) = + state.dataHeatBal->TCGlazings(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)).LayerPoint(1); + state.dataConstruction->Construct(ConstrNum).TCLayer = state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer); + if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)).Group == + DataHeatBalance::MaterialGroup::WindowGlass) + ++iMatGlass; + state.dataConstruction->Construct(ConstrNum).TCFlag = 1; + state.dataConstruction->Construct(ConstrNum).TCMasterConst = ConstrNum; + state.dataConstruction->Construct(ConstrNum).TCGlassID = iMatGlass; // the TC glass layer ID + state.dataConstruction->Construct(ConstrNum).TCLayerID = Layer; + state.dataConstruction->Construct(ConstrNum).TypeIsWindow = true; + } + } + + if (state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) == 0) { + ShowSevereError(state, + "Did not find matching material for " + state.dataHeatBalMgr->CurrentModuleObject + ' ' + + state.dataConstruction->Construct(ConstrNum).Name + ", missing material = " + ConstructAlphas(Layer)); + ErrorsFound = true; + } else { + state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) += + state.dataHeatBal->NominalR(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)); + if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)).Group == + DataHeatBalance::MaterialGroup::RegularMaterial && + !state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)).ROnly) { + state.dataHeatBal->NoRegularMaterialsUsed = false; + } + } + + } // ...end of the Layer DO loop + + } // ...end of Regular Construction DO loop + + TotRegConstructs = ConstrNum; + + // Added TH 7/2009 for underground walls and floors constructions + if (TotFfactorConstructs + TotCfactorConstructs >= 1) { + CreateFCfactorConstructions(state, ConstrNum, ErrorsFound); + if (ErrorsFound) { + ShowSevereError(state, "Errors found in creating the constructions defined with Ffactor or Cfactor method"); + } + TotRegConstructs += TotFfactorConstructs + TotCfactorConstructs; + } + + if (totAirBoundaryConstructs >= 1) { + CreateAirBoundaryConstructions(state, ConstrNum, ErrorsFound); + if (ErrorsFound) { + ShowSevereError(state, "Errors found in creating the constructions defined with Construction:AirBoundary."); + } + TotRegConstructs += totAirBoundaryConstructs; + } + + // Added BG 6/2010 for complex fenestration + if (state.dataBSDFWindow->TotComplexFenStates > 0) { + SetupComplexFenestrationStateInput(state, ConstrNum, ErrorsFound); + if (ErrorsFound) { + ShowSevereError(state, "Errors found in processing complex fenestration input"); + } + TotRegConstructs += state.dataBSDFWindow->TotComplexFenStates; + } + + state.dataHeatBalMgr->CurrentModuleObject = "ConstructionProperty:InternalHeatSource"; + + auto instances = state.dataInputProcessing->inputProcessor->epJSON.find(state.dataHeatBalMgr->CurrentModuleObject); + if (instances != state.dataInputProcessing->inputProcessor->epJSON.end()) { + state.dataHeatBal->AnyInternalHeatSourceInInput = true; + auto &instancesValue = instances.value(); + for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { + auto const &fields = instance.value(); + auto const &thisObjectName = UtilityRoutines::MakeUPPERCase(instance.key()); + + std::string construction_name{UtilityRoutines::MakeUPPERCase(fields.at("construction_name").get())}; + int source_after_layer_number{fields.at("thermal_source_present_after_layer_number")}; + int calculation_after_layer_number{fields.at("temperature_calculation_requested_after_layer_number")}; + int ctf_dimensions{fields.at("dimensions_for_the_ctf_calculation")}; + if ((ctf_dimensions < 1) || (ctf_dimensions > 2)) { + ShowWarningError(state, "ConstructionProperty:InternalHeatSource must be either 1- or 2-D. Reset to 1-D solution."); + ShowContinueError(state, "Construction=" + construction_name + " is affected."); + ctf_dimensions = 1; + } + Real64 tube_spacing{fields.at("tube_spacing")}; + Real64 calculation_position{fields.at("two_dimensional_temperature_calculation_position")}; + + // Find the construction + int construction_index = UtilityRoutines::FindItemInList(construction_name, state.dataConstruction->Construct); + + if (construction_index == 0) { + ShowSevereError(state, + "Did not find matching construction for " + state.dataHeatBalMgr->CurrentModuleObject + ' ' + thisObjectName + + ", missing construction = " + construction_name); + ErrorsFound = true; + continue; + } + + state.dataInputProcessing->inputProcessor->markObjectAsUsed(state.dataHeatBalMgr->CurrentModuleObject, instance.key()); + + auto &thisConstruct(state.dataConstruction->Construct(construction_index)); + + // May need some additional validation of the construction here + if (thisConstruct.SourceSinkPresent) { + // Emulate old behavior by disallowing two sources in a single material + ShowSevereError( + state, "Construction " + construction_name + " has more than one internal heat source referencing it, which is not allowed"); + ErrorsFound = true; + continue; + } + + thisConstruct.SourceSinkPresent = true; + thisConstruct.SourceAfterLayer = source_after_layer_number; + thisConstruct.TempAfterLayer = calculation_after_layer_number; + thisConstruct.SolutionDimensions = ctf_dimensions; + thisConstruct.ThicknessPerpend = thisConstruct.setThicknessPerpendicular(state, tube_spacing); + thisConstruct.userTemperatureLocationPerpendicular = + thisConstruct.setUserTemperatureLocationPerpendicular(state, calculation_position); + + // Set the total number of layers for the construction + if ((thisConstruct.SourceAfterLayer >= thisConstruct.TotLayers) || (thisConstruct.SourceAfterLayer <= 0)) { + ShowWarningError(state, "Construction " + thisConstruct.Name + " must have a source that is between two layers"); + ShowContinueError(state, "The source after layer parameter has been set to one less than the number of layers."); + thisConstruct.SourceAfterLayer = thisConstruct.TotLayers - 1; + } + if ((thisConstruct.TempAfterLayer >= thisConstruct.TotLayers) || (thisConstruct.TempAfterLayer <= 0)) { + ShowWarningError(state, "Construction " + thisConstruct.Name + " must have a temperature calculation that is between two layers"); + ShowContinueError(state, "The temperature calculation after layer parameter has been set to one less than the number of layers."); + thisConstruct.TempAfterLayer = thisConstruct.TotLayers - 1; + } + } + } + + state.dataHeatBal->TotConstructs = TotRegConstructs; + + if (state.dataHeatBal->TotConstructs > 0 && (state.dataHeatBal->NoRegularMaterialsUsed && state.dataHeatBal->NoCfactorConstructionsUsed && + state.dataHeatBal->NoFfactorConstructionsUsed)) { + ShowWarningError(state, "This building has no thermal mass which can cause an unstable solution."); + ShowContinueError(state, "Use Material object for all opaque material definitions except very light insulation layers."); + } + + ConstrNum = 0; + state.dataHeatBalMgr->CurrentModuleObject = "Construction:WindowEquivalentLayer"; + for (Loop = 1; Loop <= state.dataWindowEquivLayer->TotWinEquivLayerConstructs; + ++Loop) { // Loop through all constructs with Window EquivalentLayer ... + + // Get the object names for each construction from the input processor + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + ConstructAlphas, + ConstructNumAlpha, + DummyProps, + DummyNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueConstructNames, + ConstructAlphas(0), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + continue; + } + + ++ConstrNum; + // Assign Construction name to the Derived Type using the zeroth position of the array + state.dataConstruction->Construct(TotRegConstructs + ConstrNum).Name = ConstructAlphas(0); + + // Set the total number of layers for the construction + state.dataConstruction->Construct(TotRegConstructs + ConstrNum).TotLayers = ConstructNumAlpha - 1; + if (state.dataConstruction->Construct(TotRegConstructs + ConstrNum).TotLayers < 1) { + ShowSevereError(state, + "Construction " + state.dataConstruction->Construct(TotRegConstructs + ConstrNum).Name + + " must have at least a single layer"); + ErrorsFound = true; + } + + // Loop through all of the layers of the construct to match the material names. + // The loop index is the number minus 1 + for (Layer = 1; Layer <= ConstructNumAlpha - 1; ++Layer) { + + // Find the material in the list of materials + state.dataConstruction->Construct(TotRegConstructs + ConstrNum).LayerPoint(Layer) = + UtilityRoutines::FindItemInList(ConstructAlphas(Layer), state.dataMaterial->Material); + + if (state.dataConstruction->Construct(TotRegConstructs + ConstrNum).LayerPoint(Layer) == 0) { + ShowSevereError(state, + "Did not find matching material for " + state.dataHeatBalMgr->CurrentModuleObject + ' ' + + state.dataConstruction->Construct(ConstrNum).Name + ", missing material = " + ConstructAlphas(Layer)); + ErrorsFound = true; + } else { + MaterialLayerGroup = + state.dataMaterial->Material(state.dataConstruction->Construct(TotRegConstructs + ConstrNum).LayerPoint(Layer)).Group; + if (!((MaterialLayerGroup == DataHeatBalance::MaterialGroup::GlassEquivalentLayer) || + (MaterialLayerGroup == DataHeatBalance::MaterialGroup::ShadeEquivalentLayer) || + (MaterialLayerGroup == DataHeatBalance::MaterialGroup::DrapeEquivalentLayer) || + (MaterialLayerGroup == DataHeatBalance::MaterialGroup::BlindEquivalentLayer) || + (MaterialLayerGroup == DataHeatBalance::MaterialGroup::ScreenEquivalentLayer) || + (MaterialLayerGroup == DataHeatBalance::MaterialGroup::GapEquivalentLayer))) { + ShowSevereError(state, + "Invalid material layer type in window " + state.dataHeatBalMgr->CurrentModuleObject + " = " + + state.dataConstruction->Construct(TotRegConstructs + ConstrNum).Name); + ShowContinueError(state, + "...Window layer = " + ConstructAlphas(Layer) + + " is not allowed in Construction:WindowEquivalentLayer window object."); + ShowContinueError(state, "Only materials of type Material:*:EquivalentLayer are allowed"); + ErrorsFound = true; + } + + if (ConstructNumAlpha <= 2) { + + } else { + state.dataHeatBal->NominalRforNominalUCalculation(TotRegConstructs + ConstrNum) += + state.dataHeatBal->NominalR(state.dataConstruction->Construct(TotRegConstructs + ConstrNum).LayerPoint(Layer)); + } + } + + } // Layer loop + state.dataConstruction->Construct(TotRegConstructs + ConstrNum).EQLConsPtr = ConstrNum; + state.dataConstruction->Construct(TotRegConstructs + ConstrNum).WindowTypeEQL = true; + } // TotWinEquivLayerConstructs loop + + state.dataWindowEquivLayer->TotWinEquivLayerConstructs = ConstrNum; + TotRegConstructs += state.dataWindowEquivLayer->TotWinEquivLayerConstructs; + state.dataHeatBal->TotConstructs = TotRegConstructs; + //------------------------------------------------------------------------------- + ConstrNum = 0; + + state.dataHeatBalMgr->CurrentModuleObject = "Construction:WindowDataFile"; + for (Loop = 1; Loop <= TotWindow5Constructs; ++Loop) { // Loop through all Window5 constructions. These constructions come + // from the Window5 data file and can be referenced only by windows + + // Get the object names for each construction from the input processor + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + ConstructAlphas, + ConstructNumAlpha, + DummyProps, + DummyNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (UtilityRoutines::IsNameEmpty(state, ConstructAlphas(0), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) continue; + + ++ConstrNum; + WConstructNames(ConstrNum) = ConstructAlphas(0); + + // Obtain the data + if (DummyNumProp != 0) { + ShowSevereError(state, "Construction From Window5 Data File: there should be no numerical inputs for " + ConstructAlphas(0)); + ErrorsFound = true; + continue; + } + + // See if this construction is in the W5DataFile produced by the WINDOW 5 program; + // if so, ConstructionFound will be set to true and the Material objects + // associated with the construction will be created in subr. SearchWindow5DataFile. + // (If the matching construction on the Window5 data file has two glazing systems, a + // second construction and its associated materials will be created in subr. + // SearchWindow5DataFile and TotConstructs WILL BE INCREMENTED BY 1 in that routine. + // A FrameAndDivider object will also be created if window on data file has a + // frame or divider.) + + fs::path window5DataFilePath; + if (ConstructAlphas(1) == "") { + window5DataFilePath = state.dataStrGlobals->CurrentWorkingFolder / "Window5DataFile.dat"; + } else { + window5DataFilePath = ConstructAlphas(1); + } + DisplayString(state, "Searching Window5 data file for Construction=" + ConstructAlphas(0)); + + SearchWindow5DataFile(state, window5DataFilePath, ConstructAlphas(0), ConstructionFound, EOFonW5File, ErrorsFound); + + if (EOFonW5File || !ConstructionFound) { + DisplayString(state, "--Construction not found"); + ErrorsFound = true; + ShowSevereError(state, "No match on WINDOW5 data file for Construction=" + ConstructAlphas(0) + ", or error in data file."); + ShowContinueError(state, "...Looking on file=" + window5DataFilePath.string()); // TODO: call getAbsolutePath maybe? + continue; + } + + } // ...end of Window5 Constructions DO loop + + WConstructNames.deallocate(); + + // set some (default) properties of the Construction Derived Type + for (ConstrNum = 1; ConstrNum <= state.dataHeatBal->TotConstructs; ++ConstrNum) { + + // For air boundaries, skip TypeIsAirBoundary + if (state.dataConstruction->Construct(ConstrNum).TypeIsAirBoundary) continue; + if (state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) != 0.0) { + state.dataHeatBal->NominalU(ConstrNum) = 1.0 / state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum); + } else { + if (!state.dataConstruction->Construct(ConstrNum).WindowTypeEQL) { + ShowSevereError(state, "Nominal U is zero, for construction=" + state.dataConstruction->Construct(ConstrNum).Name); + ErrorsFound = true; + } + } + + CheckAndSetConstructionProperties(state, ConstrNum, ErrorsFound); + + } // End of ConstrNum DO loop + } + + void GetBuildingData(EnergyPlusData &state, bool &ErrorsFound) // If errors found in input + { + + // SUBROUTINE INFORMATION: + // AUTHOR Linda K. Lawrie + // DATE WRITTEN November 1997 + // MODIFIED October 1998, FW; May 1999 FW; Oct 2004 LKL + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This routine calls other routines to get the Zone, and Surface data + // from the input file. + + // METHODOLOGY EMPLOYED: + // The GetObjectItem routines are employed to retrieve the data. + + GetZoneData(state, ErrorsFound); // Read Zone data from input file + + SurfaceGeometry::SetupZoneGeometry(state, ErrorsFound); + } + + void GetZoneData(EnergyPlusData &state, bool &ErrorsFound) // If errors found in input + { + + // SUBROUTINE INFORMATION: + // AUTHOR Linda K. Lawrie + // DATE WRITTEN November 1997 + // MODIFIED PGE: Added ZONE LIST and ZONE GROUP objects, Nov 2003 + // RJH: Added init of DElight member of ZoneDaylight object, Jan 2004 + // JG: Added Part of Total Floor Area field March 2006 + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine gets the zone data for each zone in the input file. + + // METHODOLOGY EMPLOYED: + // The GetObjectItem routines are employed to retrieve the data. + + // REFERENCES: + // IDD Definition for Zone object + + // Using/Aliasing + // Locals + // SUBROUTINE ARGUMENT DEFINITIONS: + + // SUBROUTINE PARAMETER DEFINITIONS: + constexpr const char *RoutineName("GetZoneData: "); + // INTEGER, PARAMETER :: MaxZonesInList = 100 ! This is to allow DIMENSIONing below + + // INTERFACE BLOCK SPECIFICATIONS: + // na + + // DERIVED TYPE DEFINITIONS: + // na + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int NumAlphas; + int NumNumbers; + int IOStatus; + int ZoneLoop; + std::string::size_type TMP; + int Loop; + int ListNum; + int ZoneNum; + std::string ZoneName; + int GroupNum; + auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; + cCurrentModuleObject = "Zone"; + state.dataGlobal->NumOfZones = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + state.dataHeatBal->Zone.allocate(state.dataGlobal->NumOfZones); + state.dataDaylightingData->ZoneDaylight.allocate(state.dataGlobal->NumOfZones); + // always allocate as the data structure is needed in output variable Zone Heat Index, Zone Humidity Index + state.dataHeatBal->Resilience.allocate(state.dataGlobal->NumOfZones); + + ZoneLoop = 0; + + for (Loop = 1; Loop <= state.dataGlobal->NumOfZones; ++Loop) { + + state.dataIPShortCut->rNumericArgs = 0.0; // Zero out just in case + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Loop, + state.dataIPShortCut->cAlphaArgs, + NumAlphas, + state.dataIPShortCut->rNumericArgs, + NumNumbers, + IOStatus, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + TMP = index(state.dataIPShortCut->cAlphaArgs(1), char(1)); + while (TMP != std::string::npos) { + state.dataIPShortCut->cAlphaArgs(1)[TMP] = ','; + TMP = index(state.dataIPShortCut->cAlphaArgs(1), char(1)); + } + TMP = index(state.dataIPShortCut->cAlphaArgs(1), char(2)); + while (TMP != std::string::npos) { + state.dataIPShortCut->cAlphaArgs(1)[TMP] = '!'; + TMP = index(state.dataIPShortCut->cAlphaArgs(1), char(2)); + } + + if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) + continue; + + ++ZoneLoop; + ProcessZoneData(state, + cCurrentModuleObject, + ZoneLoop, + state.dataIPShortCut->cAlphaArgs, + NumAlphas, + state.dataIPShortCut->rNumericArgs, + NumNumbers, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames, + ErrorsFound); + + } // Loop + + for (Loop = 1; Loop <= state.dataGlobal->NumOfZones; ++Loop) { + // Check to see if "nominally" controlled -- Zone Name appears in Zone Equip Configuration + // relies on zone name being the "name" of the Zone Controlled Equip Configuration + if (state.dataInputProcessing->inputProcessor->getObjectItemNum( + state, "ZoneHVAC:EquipmentConnections", "zone_name", state.dataHeatBal->Zone(Loop).Name) > 0) { + state.dataHeatBal->Zone(Loop).isNominalControlled = true; + } else { + state.dataHeatBal->Zone(Loop).isNominalControlled = false; + } + } + + // Get ZONE LIST objects + cCurrentModuleObject = "ZoneList"; + state.dataHeatBal->NumOfZoneLists = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataHeatBal->NumOfZoneLists > 0) { + + state.dataHeatBal->ZoneList.allocate(state.dataHeatBal->NumOfZoneLists); + + for (ListNum = 1; ListNum <= state.dataHeatBal->NumOfZoneLists; ++ListNum) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + ListNum, + state.dataIPShortCut->cAlphaArgs, + NumAlphas, + state.dataIPShortCut->rNumericArgs, + NumNumbers, + IOStatus, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + + state.dataHeatBal->ZoneList(ListNum).Name = state.dataIPShortCut->cAlphaArgs(1); + if (UtilityRoutines::FindItemInList(state.dataHeatBal->ZoneList(ListNum).Name, state.dataHeatBal->Zone) > 0) { + ShowWarningError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + "\": is a duplicate of a zone name."); + ShowContinueError(state, "This could be a problem in places where either a Zone Name or a Zone List can be used."); + } + + // List of zones + state.dataHeatBal->ZoneList(ListNum).NumOfZones = NumAlphas - 1; + + if (state.dataHeatBal->ZoneList(ListNum).NumOfZones < 1) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + "\": No zones specified."); + ErrorsFound = true; + } else { + state.dataHeatBal->ZoneList(ListNum).Zone.allocate(state.dataHeatBal->ZoneList(ListNum).NumOfZones); + state.dataHeatBal->ZoneList(ListNum).Zone = 0; + + for (ZoneNum = 1; ZoneNum <= state.dataHeatBal->ZoneList(ListNum).NumOfZones; ++ZoneNum) { + ZoneName = state.dataIPShortCut->cAlphaArgs(ZoneNum + 1); + state.dataHeatBal->ZoneList(ListNum).MaxZoneNameLength = + max(state.dataHeatBal->ZoneList(ListNum).MaxZoneNameLength, len(ZoneName)); + state.dataHeatBal->ZoneList(ListNum).Zone(ZoneNum) = UtilityRoutines::FindItemInList(ZoneName, state.dataHeatBal->Zone); + if (state.dataHeatBal->ZoneList(ListNum).Zone(ZoneNum) == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + "\": " + state.dataIPShortCut->cAlphaFieldNames(ZoneNum + 1) + ' ' + ZoneName + " not found."); + ErrorsFound = true; + } + + // Check for duplicate zones + for (Loop = 1; Loop <= ZoneNum - 1; ++Loop) { + if (state.dataHeatBal->ZoneList(ListNum).Zone(ZoneNum) == state.dataHeatBal->ZoneList(ListNum).Zone(Loop)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + "\": " + state.dataIPShortCut->cAlphaFieldNames(ZoneNum + 1) + ' ' + ZoneName + + " appears more than once in list."); + ErrorsFound = true; + } + } // Loop + } // ZoneNum + } + + } // ListNum + } + + // Get ZONE GROUP objects + cCurrentModuleObject = "ZoneGroup"; + state.dataHeatBal->NumOfZoneGroups = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataHeatBal->NumOfZoneGroups > 0) { + state.dataHeatBal->ZoneGroup.allocate(state.dataHeatBal->NumOfZoneGroups); + + for (GroupNum = 1; GroupNum <= state.dataHeatBal->NumOfZoneGroups; ++GroupNum) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + GroupNum, + state.dataIPShortCut->cAlphaArgs, + NumAlphas, + state.dataIPShortCut->rNumericArgs, + NumNumbers, + IOStatus, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + + state.dataHeatBal->ZoneGroup(GroupNum).Name = state.dataIPShortCut->cAlphaArgs(1); + + // Multiplier - checked already by IDD rules + state.dataHeatBal->ZoneGroup(GroupNum).Multiplier = state.dataIPShortCut->rNumericArgs(1); + + // Zone list + ListNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataHeatBal->ZoneList); + state.dataHeatBal->ZoneGroup(GroupNum).ZoneList = ListNum; + + if (ListNum == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + "\": " + + state.dataIPShortCut->cAlphaFieldNames(2) + " named " + state.dataIPShortCut->cAlphaArgs(2) + " not found."); + ErrorsFound = true; + } else { + // Check to make sure list is not in use by another ZONE GROUP + for (Loop = 1; Loop <= GroupNum - 1; ++Loop) { + if (state.dataHeatBal->ZoneGroup(GroupNum).ZoneList == state.dataHeatBal->ZoneGroup(Loop).ZoneList) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + "\": " + state.dataIPShortCut->cAlphaFieldNames(2) + " already used by " + cCurrentModuleObject + + " named " + state.dataHeatBal->ZoneGroup(Loop).Name + '.'); + ErrorsFound = true; + } + } // Loop + + // Set group multiplier for each zone in the list + for (Loop = 1; Loop <= state.dataHeatBal->ZoneList(ListNum).NumOfZones; ++Loop) { + ZoneNum = state.dataHeatBal->ZoneList(ListNum).Zone(Loop); + + if (ZoneNum > 0) { + // Check to make sure group multiplier was not already set by another ZONE GROUP + if (state.dataHeatBal->Zone(ZoneNum).ListGroup == 0) { + state.dataHeatBal->Zone(ZoneNum).ListMultiplier = state.dataHeatBal->ZoneGroup(GroupNum).Multiplier; + state.dataHeatBal->Zone(ZoneNum).ListGroup = ListNum; + } else { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + "\": Zone " + state.dataHeatBal->Zone(ZoneNum).Name + + " in ZoneList already exists in ZoneList of another ZoneGroup."); + ShowContinueError( + state, "Previous ZoneList=" + state.dataHeatBal->ZoneList(state.dataHeatBal->Zone(ZoneNum).ListGroup).Name); + ErrorsFound = true; + } + } + } // Loop + } + + } // GroupNum + } + + GetZoneLocalEnvData(state, ErrorsFound); + + // allocate the array the holds the predefined report data + state.dataHeatBal->ZonePreDefRep.allocate(state.dataGlobal->NumOfZones); + + // Now get Space data after Zones are set up, because Space is optional, Zones are not + GetSpaceData(state, ErrorsFound); + } + + void GetIncidentSolarMultiplier(EnergyPlusData &state, bool &ErrorsFound) + { + auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; + cCurrentModuleObject = "SurfaceProperty:IncidentSolarMultiplier"; + + static constexpr std::string_view RoutineName("GetIncidentSolarMultiplier: "); + + state.dataSurface->TotSurfIncSolMultiplier = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataSurface->TotSurfIncSolMultiplier <= 0) return; + + if (!allocated(state.dataSurface->SurfIncSolMultiplier)) { + // could be extended to interior surfaces later + state.dataSurface->SurfIncSolMultiplier.allocate(state.dataSurface->TotSurfaces); + } + + int NumAlpha; + int NumNumeric; + int IOStat; + for (int Loop = 1; Loop <= state.dataSurface->TotSurfIncSolMultiplier; ++Loop) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Loop, + state.dataIPShortCut->cAlphaArgs, + NumAlpha, + state.dataIPShortCut->rNumericArgs, + NumNumeric, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound)) { + ShowContinueError( + state, + "...each SurfaceProperty:IncidentSolarMultiplier name must not duplicate other SurfaceProperty:IncidentSolarMultiplier name"); + continue; + } + + // Assign surface number + int SurfNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(1), state.dataSurface->Surface); + if (SurfNum == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(1) + " has been found."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(1) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(1) + + "\" no corresponding surface (ref BuildingSurface:Detailed) has been found in the input file."); + ErrorsFound = true; + continue; + } + auto &Surf = state.dataSurface->Surface(SurfNum); + if (Surf.Class != DataSurfaces::SurfaceClass::Window) { + ShowSevereError(state, "IncidentSolarMultiplier defined for non-window surfaces"); + ErrorsFound = true; + continue; + } + if (Surf.ExtBoundCond != DataSurfaces::ExternalEnvironment) { + ShowSevereError(state, "IncidentSolarMultiplier defined for interior surfaces"); + ErrorsFound = true; + continue; + } + int ConstrNum = Surf.Construction; + auto const &Constr = state.dataConstruction->Construct(ConstrNum); + int MaterNum = Constr.LayerPoint(Constr.TotLayers); + auto const &Mat = state.dataMaterial->Material(MaterNum); + bool withNoncompatibleShades = + (Mat.Group == DataHeatBalance::MaterialGroup::Shade || Mat.Group == DataHeatBalance::MaterialGroup::WindowBlind || + Mat.Group == DataHeatBalance::MaterialGroup::Screen || Mat.Group == DataHeatBalance::MaterialGroup::GlassEquivalentLayer || + Mat.Group == DataHeatBalance::MaterialGroup::GapEquivalentLayer || + Mat.Group == DataHeatBalance::MaterialGroup::ShadeEquivalentLayer || + Mat.Group == DataHeatBalance::MaterialGroup::DrapeEquivalentLayer || + Mat.Group == DataHeatBalance::MaterialGroup::ScreenEquivalentLayer || + Mat.Group == DataHeatBalance::MaterialGroup::BlindEquivalentLayer || Surf.HasShadeControl); + if (withNoncompatibleShades) { + ShowSevereError(state, "Non-compatible shades defined alongside SurfaceProperty:IncidentSolarMultiplier for the same window"); + ErrorsFound = true; + continue; + } + int ScheduleIdx = GetScheduleIndex(state, state.dataIPShortCut->cAlphaArgs(2)); + // Schedule not found but schedule field is not empty, user had the wrong schedule name + if (ScheduleIdx == 0 && !(state.dataIPShortCut->cAlphaArgs(2).empty())) { + ShowSevereError(state, "Invalid Incident Solar Multiplier Schedule Name in SurfaceProperty:IncidentSolarMultiplier"); + continue; + } + Surf.hasIncSolMultiplier = true; + auto &SurfIncSolMult = state.dataSurface->SurfIncSolMultiplier(SurfNum); + SurfIncSolMult.Name = state.dataIPShortCut->cAlphaArgs(1); + SurfIncSolMult.SurfaceIdx = SurfNum; + SurfIncSolMult.Scaler = state.dataIPShortCut->rNumericArgs(1); + SurfIncSolMult.SchedPtr = ScheduleIdx; + } + } + + void GetZoneLocalEnvData(EnergyPlusData &state, bool &ErrorsFound) // Error flag indicator (true if errors found) + { + // SUBROUTINE INFORMATION: + // AUTHOR X LUO + // DATE WRITTEN July 2017 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // load input data for Outdoor Air Node for zones + + // Using/Aliasing + using DataLoopNode::ObjectIsParent; + using NodeInputManager::GetOnlySingleNode; + using OutAirNodeManager::CheckOutAirNodeNumber; + + // SUBROUTINE PARAMETER DEFINITIONS: + constexpr const char *RoutineName("GetZoneLocalEnvData: "); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int NumAlpha; + int NumNumeric; + + int Loop; + int ZoneLoop; + int ZoneNum; // DO loop counter for zones + int TotZoneEnv; + int IOStat; + int NodeNum; + + //----------------------------------------------------------------------- + // ZoneProperty:LocalEnvironment + //----------------------------------------------------------------------- + auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; + cCurrentModuleObject = "ZoneProperty:LocalEnvironment"; + TotZoneEnv = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (TotZoneEnv > 0) { + // Check if IDD definition is correct + state.dataGlobal->AnyLocalEnvironmentsInModel = true; + + if (!allocated(state.dataHeatBal->ZoneLocalEnvironment)) { + state.dataHeatBal->ZoneLocalEnvironment.allocate(TotZoneEnv); + } + + for (Loop = 1; Loop <= TotZoneEnv; ++Loop) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Loop, + state.dataIPShortCut->cAlphaArgs, + NumAlpha, + state.dataIPShortCut->rNumericArgs, + NumNumeric, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + + state.dataHeatBal->ZoneLocalEnvironment(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); + + // Assign zone number + ZoneNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataHeatBal->Zone); + if (ZoneNum == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(2) + " has been found."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(2) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(2) + + "\" no corresponding zone has been found in the input file."); + ErrorsFound = true; + } else { + state.dataHeatBal->ZoneLocalEnvironment(Loop).ZonePtr = ZoneNum; + } + + // Assign outdoor air node number; + NodeNum = GetOnlySingleNode(state, + state.dataIPShortCut->cAlphaArgs(3), + ErrorsFound, + DataLoopNode::ConnectionObjectType::ZonePropertyLocalEnvironment, + state.dataIPShortCut->cAlphaArgs(1), + DataLoopNode::NodeFluidType::Air, + DataLoopNode::ConnectionType::Inlet, + NodeInputManager::CompFluidStream::Primary, + ObjectIsParent); + if (NodeNum == 0 && CheckOutAirNodeNumber(state, NodeNum)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(3) + " has been found."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(3) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(3) + + "\" no corresponding schedule has been found in the input file."); + ErrorsFound = true; + } else { + state.dataHeatBal->ZoneLocalEnvironment(Loop).OutdoorAirNodePtr = NodeNum; + } + } + } + // Link zone properties to zone object + for (ZoneLoop = 1; ZoneLoop <= state.dataGlobal->NumOfZones; ++ZoneLoop) { + for (Loop = 1; Loop <= TotZoneEnv; ++Loop) { + if (state.dataHeatBal->ZoneLocalEnvironment(Loop).ZonePtr == ZoneLoop) { + if (state.dataHeatBal->ZoneLocalEnvironment(Loop).OutdoorAirNodePtr != 0) { + state.dataHeatBal->Zone(ZoneLoop).LinkedOutAirNode = state.dataHeatBal->ZoneLocalEnvironment(Loop).OutdoorAirNodePtr; + } + } + } + } + } + + void ProcessZoneData(EnergyPlusData &state, + std::string const &cCurrentModuleObject, + int const ZoneLoop, + Array1D_string const &cAlphaArgs, + int &NumAlphas, + Array1D const &rNumericArgs, + int &NumNumbers, + [[maybe_unused]] Array1D_bool const &lNumericFieldBlanks, // Unused + Array1D_bool const &lAlphaFieldBlanks, + Array1D_string const &cAlphaFieldNames, + [[maybe_unused]] Array1D_string const &cNumericFieldNames, // Unused + bool &ErrorsFound // If errors found in input + ) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Linda K. Lawrie + // DATE WRITTEN November 1997 + // MODIFIED PGE: Added ZONE LIST and ZONE GROUP objects, Nov 2003 + // RJH: Added init of DElight member of ZoneDaylight object, Jan 2004 + // JG: Added Part of Total Floor Area field March 2006 + // RE-ENGINEERED MJW: Split out processing zone input to facilitate unit testing, Nov 2014 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine gets the zone data for each zone in the input file. + + constexpr const char *RoutineName("ProcessZoneData: "); + + state.dataHeatBal->Zone(ZoneLoop).Name = cAlphaArgs(1); + if (NumNumbers >= 1) state.dataHeatBal->Zone(ZoneLoop).RelNorth = rNumericArgs(1); + if (NumNumbers >= 2) state.dataHeatBal->Zone(ZoneLoop).OriginX = rNumericArgs(2); + if (NumNumbers >= 3) state.dataHeatBal->Zone(ZoneLoop).OriginY = rNumericArgs(3); + if (NumNumbers >= 4) state.dataHeatBal->Zone(ZoneLoop).OriginZ = rNumericArgs(4); + if (NumNumbers >= 5) state.dataHeatBal->Zone(ZoneLoop).OfType = rNumericArgs(5); + state.dataHeatBal->Zone(ZoneLoop).OfType = StandardZone; + if (NumNumbers >= 6) state.dataHeatBal->Zone(ZoneLoop).Multiplier = rNumericArgs(6); + if (NumNumbers >= 7) state.dataHeatBal->Zone(ZoneLoop).CeilingHeight = rNumericArgs(7); + if (NumNumbers >= 8) state.dataHeatBal->Zone(ZoneLoop).Volume = rNumericArgs(8); + if (NumNumbers >= 9) state.dataHeatBal->Zone(ZoneLoop).UserEnteredFloorArea = rNumericArgs(9); + + if (NumAlphas > 1 && !state.dataIPShortCut->lAlphaFieldBlanks(2)) { + { + auto const SELECT_CASE_var(cAlphaArgs(2)); + + if (SELECT_CASE_var == "SIMPLE") { + state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = ConvectionConstants::HcInt_ASHRAESimple; + + } else if ((SELECT_CASE_var == "TARP")) { + state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = ConvectionConstants::HcInt_ASHRAETARP; + + } else if (SELECT_CASE_var == "CEILINGDIFFUSER") { + state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = ConvectionConstants::HcInt_CeilingDiffuser; + + } else if (SELECT_CASE_var == "TROMBEWALL") { + state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = ConvectionConstants::HcInt_TrombeWall; + + } else if (SELECT_CASE_var == "ADAPTIVECONVECTIONALGORITHM") { + state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = ConvectionConstants::HcInt_AdaptiveConvectionAlgorithm; + + } else if (SELECT_CASE_var == "ASTMC1340") { + state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = ConvectionConstants::HcInt_ASTMC1340; + + } else { + ShowSevereError(state, std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataHeatBal->Zone(ZoneLoop).Name + "\"."); + ShowContinueError(state, "Invalid value for " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\"."); + ErrorsFound = true; + } + } + } else { + // No zone specific algorithm specified, use default Inside Convection Algorithm + state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = state.dataHeatBal->DefaultInsideConvectionAlgo; + } + + if (NumAlphas > 2 && !state.dataIPShortCut->lAlphaFieldBlanks(3)) { + { + auto const SELECT_CASE_var(cAlphaArgs(3)); + + if ((SELECT_CASE_var == "SIMPLECOMBINED")) { + state.dataHeatBal->Zone(ZoneLoop).OutsideConvectionAlgo = ConvectionConstants::HcExt_ASHRAESimple; + + } else if ((SELECT_CASE_var == "TARP")) { + state.dataHeatBal->Zone(ZoneLoop).OutsideConvectionAlgo = ConvectionConstants::HcExt_ASHRAETARP; + + } else if (SELECT_CASE_var == "MOWITT") { + state.dataHeatBal->Zone(ZoneLoop).OutsideConvectionAlgo = ConvectionConstants::HcExt_MoWiTTHcOutside; + + } else if (SELECT_CASE_var == "DOE-2") { + state.dataHeatBal->Zone(ZoneLoop).OutsideConvectionAlgo = ConvectionConstants::HcExt_DOE2HcOutside; + + } else if (SELECT_CASE_var == "ADAPTIVECONVECTIONALGORITHM") { + state.dataHeatBal->Zone(ZoneLoop).OutsideConvectionAlgo = ConvectionConstants::HcExt_AdaptiveConvectionAlgorithm; + + } else { + ShowSevereError(state, std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataHeatBal->Zone(ZoneLoop).Name + "\"."); + ShowContinueError(state, "Invalid value for " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); + ErrorsFound = true; + } + } + } else { + // No zone specific algorithm specified, use default Outside Convection Algorithm + state.dataHeatBal->Zone(ZoneLoop).OutsideConvectionAlgo = state.dataHeatBal->DefaultOutsideConvectionAlgo; + } + + // Process the input field: Part of Total Floor Area + // The default value is YES and so only NO needs to be handled + if (NumAlphas > 3) { + if (UtilityRoutines::SameString("No", cAlphaArgs(4))) { + state.dataHeatBal->Zone(ZoneLoop).isPartOfTotalArea = false; + } else if (UtilityRoutines::SameString("Yes", cAlphaArgs(4)) || lAlphaFieldBlanks(4)) { + state.dataHeatBal->Zone(ZoneLoop).isPartOfTotalArea = true; + } else { + ShowSevereError(state, std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataHeatBal->Zone(ZoneLoop).Name + "\"."); + ShowContinueError(state, "Invalid value for " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + "\"."); + ErrorsFound = true; + } + } + + // Zone outdoor environmental variables, used for zone infiltration/ventilation + SetupOutputVariable(state, + "Zone Outdoor Air Drybulb Temperature", + OutputProcessor::Unit::C, + state.dataHeatBal->Zone(ZoneLoop).OutDryBulbTemp, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneLoop).Name); + SetupOutputVariable(state, + "Zone Outdoor Air Wetbulb Temperature", + OutputProcessor::Unit::C, + state.dataHeatBal->Zone(ZoneLoop).OutWetBulbTemp, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneLoop).Name); + SetupOutputVariable(state, + "Zone Outdoor Air Wind Speed", + OutputProcessor::Unit::m_s, + state.dataHeatBal->Zone(ZoneLoop).WindSpeed, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneLoop).Name); + SetupOutputVariable(state, + "Zone Outdoor Air Wind Direction", + OutputProcessor::Unit::deg, + state.dataHeatBal->Zone(ZoneLoop).WindDir, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->Zone(ZoneLoop).Name); + } + + void GetSpaceData(EnergyPlusData &state, bool &ErrorsFound) // If errors found in input + { + constexpr const char *RoutineName("GetSpaceData: "); + std::string cCurrentModuleObject = "Space"; + auto &ip = state.dataInputProcessing->inputProcessor; + auto const instances = ip->epJSON.find(cCurrentModuleObject); + if (instances != ip->epJSON.end()) { + auto const &objectSchemaProps = ip->getObjectSchemaProps(state, cCurrentModuleObject); + auto &instancesValue = instances.value(); + int numSpaces = instancesValue.size(); + int spaceNum = 0; + // Allow for one additional Space per zone if some surfaces do not have a Space assigned in input + state.dataHeatBal->space.allocate(size_t(numSpaces + state.dataGlobal->NumOfZones)); + // Allow for one additional "General" space type for auto-generated spaces + state.dataHeatBal->spaceTypes.allocate(size_t(numSpaces + 1)); + + for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { + ++spaceNum; + auto const &objectFields = instance.value(); + auto &thisSpace = state.dataHeatBal->space(spaceNum); + thisSpace.Name = UtilityRoutines::MakeUPPERCase(instance.key()); + ip->markObjectAsUsed(cCurrentModuleObject, instance.key()); + std::string zoneName = ip->getAlphaFieldValue(objectFields, objectSchemaProps, "zone_name"); + thisSpace.CeilingHeight = ip->getRealFieldValue(objectFields, objectSchemaProps, "ceiling_height"); + thisSpace.Volume = ip->getRealFieldValue(objectFields, objectSchemaProps, "volume"); + thisSpace.userEnteredFloorArea = ip->getRealFieldValue(objectFields, objectSchemaProps, "floor_area"); + int zoneNum = UtilityRoutines::FindItemInList(zoneName, state.dataHeatBal->Zone); + if (zoneNum > 0) { + thisSpace.zoneNum = zoneNum; + state.dataHeatBal->Zone(zoneNum).spaceIndexes.emplace_back(spaceNum); + ++state.dataHeatBal->Zone(zoneNum).numSpaces; + } else { + ShowSevereError(state, RoutineName + cCurrentModuleObject + "=" + thisSpace.Name); + ShowContinueError(state, "Zone Name =" + zoneName + "not found."); + ErrorsFound = true; + } + thisSpace.spaceType = ip->getAlphaFieldValue(objectFields, objectSchemaProps, "space_type"); + bool spaceTypeFound = false; + for (int spaceTypePtr = 1; spaceTypePtr <= state.dataGlobal->numSpaceTypes; ++spaceTypePtr) { + if (UtilityRoutines::SameString(thisSpace.spaceType, state.dataHeatBal->spaceTypes(spaceTypePtr))) { + thisSpace.spaceTypeNum = spaceTypePtr; + spaceTypeFound = true; + break; + } + } + if (!spaceTypeFound) { + ++state.dataGlobal->numSpaceTypes; + state.dataHeatBal->spaceTypes(state.dataGlobal->numSpaceTypes) = thisSpace.spaceType; + thisSpace.spaceTypeNum = state.dataGlobal->numSpaceTypes; + } + + auto extensibles = objectFields.find("tags"); + auto const &extensionSchemaProps = objectSchemaProps["tags"]["items"]["properties"]; + if (extensibles != objectFields.end()) { + auto extensiblesArray = extensibles.value(); + for (auto extensibleInstance : extensiblesArray) { + thisSpace.tags.emplace_back(ip->getAlphaFieldValue(extensibleInstance, extensionSchemaProps, "tag")); + } + } + } + state.dataGlobal->numSpaces = spaceNum; + } else { + // If no Spaces are defined, then allow for one Space per zone, and one spaceType + state.dataHeatBal->space.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBal->spaceTypes.allocate(1); + } + + cCurrentModuleObject = "SpaceList"; + auto const instances2 = ip->epJSON.find(cCurrentModuleObject); + if (instances2 != ip->epJSON.end()) { + auto const &objectSchemaProps = ip->getObjectSchemaProps(state, cCurrentModuleObject); + auto &instancesValue = instances2.value(); + int numSpaceLists = instancesValue.size(); + int spaceListNum = 0; + state.dataHeatBal->spaceList.allocate(numSpaceLists); + for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { + ++spaceListNum; + auto const &objectFields = instance.value(); + auto &thisSpaceList = state.dataHeatBal->spaceList(spaceListNum); + thisSpaceList.Name = UtilityRoutines::MakeUPPERCase(instance.key()); + ip->markObjectAsUsed(cCurrentModuleObject, instance.key()); + + if (UtilityRoutines::FindItemInList(thisSpaceList.Name, state.dataHeatBal->Zone) > 0) { + ShowSevereError(state, RoutineName + cCurrentModuleObject + "=\"" + thisSpaceList.Name + "\": is a duplicate of a zone name."); + ErrorsFound = true; + } + if (UtilityRoutines::FindItemInList(thisSpaceList.Name, state.dataHeatBal->space) > 0) { + ShowSevereError(state, RoutineName + cCurrentModuleObject + "=\"" + thisSpaceList.Name + "\": is a duplicate of a space name."); + ErrorsFound = true; + } + + // List of spaces + thisSpaceList.numListSpaces = 0; + auto extensibles = objectFields.find("spaces"); + auto const &extensionSchemaProps = objectSchemaProps["spaces"]["items"]["properties"]; + if (extensibles != objectFields.end()) { + auto extensiblesArray = extensibles.value(); + for (auto extensibleInstance : extensiblesArray) { + std::string thisSpaceName = ip->getAlphaFieldValue(extensibleInstance, extensionSchemaProps, "space_name"); + int thisSpaceNum = UtilityRoutines::FindItemInList(thisSpaceName, state.dataHeatBal->space); + if (thisSpaceNum > 0) { + thisSpaceList.spaces.emplace_back(thisSpaceNum); + ++thisSpaceList.numListSpaces; + } else { + ShowSevereError(state, RoutineName + cCurrentModuleObject + "=" + thisSpaceList.Name); + ShowContinueError(state, "Space Name=" + thisSpaceName + " not found."); + ErrorsFound = true; + } + thisSpaceList.maxSpaceNameLength = max(thisSpaceList.maxSpaceNameLength, len(thisSpaceName)); + // Check for duplicate spaces + for (int loop = 1; loop <= int(thisSpaceList.spaces.size()) - 1; ++loop) { + if (thisSpaceNum == thisSpaceList.spaces(loop)) { + ShowSevereError(state, + RoutineName + cCurrentModuleObject + "=\"" + thisSpaceList.Name + "\": Space Name " + thisSpaceName + + " appears more than once in list."); + ErrorsFound = true; + } + } + } + } + } + } + + // Make sure every zone has at least one space + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + auto &thisZone = state.dataHeatBal->Zone(zoneNum); + if (thisZone.spaceIndexes.empty()) { + ++state.dataGlobal->numSpaces; + state.dataHeatBal->space(state.dataGlobal->numSpaces).zoneNum = zoneNum; + state.dataHeatBal->space(state.dataGlobal->numSpaces).Name = thisZone.Name; + state.dataHeatBal->space(state.dataGlobal->numSpaces).spaceType = "GENERAL"; + state.dataHeatBal->space(state.dataGlobal->numSpaces).spaceTypeNum = GetGeneralSpaceTypeNum(state); + // Add to zone's list of spaces + thisZone.spaceIndexes.emplace_back(state.dataGlobal->numSpaces); + ++state.dataHeatBal->Zone(zoneNum).numSpaces; + } + } + } + + int GetGeneralSpaceTypeNum(EnergyPlusData &state) + { + // If "General" exists as a space type return the index + bool generalSpaceTypeExists = false; + int generalSpaceTypeNum = 0; + for (int spaceTypePtr = 1; spaceTypePtr <= state.dataGlobal->numSpaceTypes; ++spaceTypePtr) { + if (UtilityRoutines::SameString(state.dataHeatBal->spaceTypes(spaceTypePtr), "GENERAL")) { + generalSpaceTypeNum = spaceTypePtr; + generalSpaceTypeExists = true; + break; + } + } + // Add General space type if it doesn't exist yet + if (!generalSpaceTypeExists) { + ++state.dataGlobal->numSpaceTypes; + state.dataHeatBal->spaceTypes(state.dataGlobal->numSpaceTypes) = "GENERAL"; + generalSpaceTypeNum = state.dataGlobal->numSpaceTypes; + } + return generalSpaceTypeNum; + } + // End of Get Input subroutines for the HB Module + //****************************************************************************** + + // Beginning Initialization Section of the Module + //****************************************************************************** + + void InitHeatBalance(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Rick Strand + // DATE WRITTEN April 1997 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine is the main driver for initializations within the + // heat balance. + + // METHODOLOGY EMPLOYED: + // Uses the status flags to trigger initialization events. Some of the files + // have been moved to other heat balance managers. More of these initializations + // will have to continue to be re-structured. + + // REFERENCES: + // na + + // Using/Aliasing + using namespace WindowManager; + using namespace SolarShading; + using DaylightingDevices::InitDaylightingDevices; + using OutAirNodeManager::SetOutAirNodes; + using WindowEquivalentLayer::InitEquivalentLayerWindowCalculations; + + int StormWinNum; // Number of StormWindow object + + if (state.dataGlobal->BeginSimFlag) { + AllocateHeatBalArrays(state); // Allocate the Module Arrays + if (state.dataHeatBal->AnyCTF || state.dataHeatBal->AnyEMPD) { + DisplayString(state, "Initializing Response Factors"); + InitConductionTransferFunctions(state); // Initialize the response factors + } + HeatBalanceSurfaceManager::InitSurfacePropertyViewFactors(state); + DisplayString(state, "Initializing Window Optical Properties"); + InitEquivalentLayerWindowCalculations(state); // Initialize the EQL window optical properties + // InitGlassOpticalCalculations(); // Initialize the window optical properties + InitWindowOpticalCalculations(state); + InitDaylightingDevices(state); // Initialize any daylighting devices + DisplayString(state, "Initializing Solar Calculations"); + InitSolarCalculations(state); // Initialize the shadowing calculations + } + + if (state.dataGlobal->BeginEnvrnFlag) { + state.dataHeatBalMgr->MaxHeatLoadPrevDay = 0.0; + state.dataHeatBalMgr->MaxCoolLoadPrevDay = 0.0; + state.dataHeatBalMgr->MaxTempPrevDay = 0.0; + state.dataHeatBalMgr->MinTempPrevDay = 0.0; + state.dataHeatBalMgr->MaxHeatLoadZone = -9999.0; + state.dataHeatBalMgr->MaxCoolLoadZone = -9999.0; + state.dataHeatBalMgr->MaxTempZone = -9999.0; + state.dataHeatBalMgr->MinTempZone = 1000.0; + state.dataHeatBalMgr->TempZone = -9999.0; + state.dataHeatBalMgr->LoadZone = -9999.0; + state.dataHeatBalMgr->TempZonePrevDay = 1000.0; + state.dataHeatBalMgr->LoadZonePrevDay = -9999.0; + state.dataHeatBalMgr->TempZoneSecPrevDay = 1000.0; + state.dataHeatBalMgr->TempZoneSecPrevDay = -9999.0; + state.dataHeatBalMgr->WarmupTempDiff = 0.0; + state.dataHeatBalMgr->WarmupLoadDiff = 0.0; + state.dataHeatBalMgr->TempZoneRpt = 0.0; + state.dataHeatBalMgr->LoadZoneRpt = 0.0; + state.dataHeatBalMgr->MaxLoadZoneRpt = 0.0; + state.dataHeatBalMgr->CountWarmupDayPoints = 0; + + for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; SurfNum++) { + state.dataSurface->SurfaceWindow(SurfNum).ThetaFace = 296.15; + state.dataSurface->SurfWinEffInsSurfTemp(SurfNum) = 23.0; + } + } + + if (state.dataGlobal->AnyEnergyManagementSystemInModel) { + HeatBalanceSurfaceManager::InitEMSControlledConstructions(state); + HeatBalanceSurfaceManager::InitEMSControlledSurfaceProperties(state); + } + + // Init storm window pointers + if (state.dataSurface->TotStormWin > 0) { + if (state.dataGlobal->BeginDayFlag) { + SetStormWindowControl(state); + state.dataHeatBalMgr->ChangeSet = false; + } else if (!state.dataHeatBalMgr->ChangeSet) { + state.dataHeatBal->StormWinChangeThisDay = false; + for (StormWinNum = 1; StormWinNum <= state.dataSurface->TotStormWin; ++StormWinNum) { + int SurfNum = state.dataSurface->StormWindow(StormWinNum).BaseWindowNum; + state.dataSurface->SurfWinStormWinFlagPrevDay(SurfNum) = state.dataSurface->SurfWinStormWinFlag(SurfNum); + } + state.dataHeatBalMgr->ChangeSet = true; + } + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + auto &thisSpace = state.dataHeatBal->space(spaceNum); + int const firstSurfWin = thisSpace.WindowSurfaceFirst; + int const lastSurfWin = thisSpace.WindowSurfaceLast; + for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) { + if (state.dataSurface->SurfWinStormWinFlag(SurfNum) == 1 && + state.dataSurface->SurfWinWindowModelType(SurfNum) == DataSurfaces::WindowModel::Detailed) { + state.dataSurface->SurfActiveConstruction(SurfNum) = state.dataSurface->SurfWinStormWinConstr(SurfNum); + } else { + state.dataSurface->SurfActiveConstruction(SurfNum) = state.dataSurface->Surface(SurfNum).Construction; + } + } + } + } + } + + if (state.dataGlobal->BeginSimFlag && state.dataGlobal->DoWeathSim && state.dataSysVars->ReportExtShadingSunlitFrac) { + OpenShadingFile(state); + } + + if (state.dataGlobal->BeginDayFlag) { + if (!state.dataGlobal->WarmupFlag) { + if (state.dataGlobal->DayOfSim == 1) { + state.dataHeatBalMgr->MaxHeatLoadZone = -9999.0; + state.dataHeatBalMgr->MaxCoolLoadZone = -9999.0; + state.dataHeatBalMgr->MaxTempZone = -9999.0; + state.dataHeatBalMgr->MinTempZone = 1000.0; + } + } + if (!state.dataSysVars->DetailedSolarTimestepIntegration) { + PerformSolarCalculations(state); + } + } + + if (state.dataSysVars->DetailedSolarTimestepIntegration) { // always redo solar calcs + PerformSolarCalculations(state); + } + + if (state.dataGlobal->BeginDayFlag && !state.dataGlobal->WarmupFlag && + state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::RunPeriodWeather && state.dataSysVars->ReportExtShadingSunlitFrac) { + for (int iHour = 1; iHour <= 24; ++iHour) { // Do for all hours. + for (int TS = 1; TS <= state.dataGlobal->NumOfTimeStepInHour; ++TS) { + constexpr const char *ShdFracFmt1(" {:02}/{:02} {:02}:{:02},"); + if (TS == state.dataGlobal->NumOfTimeStepInHour) { + print(state.files.shade, ShdFracFmt1, state.dataEnvrn->Month, state.dataEnvrn->DayOfMonth, iHour, 0); + } else { + print(state.files.shade, + ShdFracFmt1, + state.dataEnvrn->Month, + state.dataEnvrn->DayOfMonth, + iHour - 1, + (60 / state.dataGlobal->NumOfTimeStepInHour) * TS); + } + for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) { + constexpr const char *ShdFracFmt2("{:10.8F},"); + print(state.files.shade, ShdFracFmt2, state.dataHeatBal->SurfSunlitFrac(iHour, TS, SurfNum)); + } + print(state.files.shade, "\n"); + } + } + } + + // Initialize zone outdoor environmental variables + // Bulk Initialization for Temperatures & WindSpeed + // using the zone, modify the zone Dry/Wet BulbTemps + SetZoneOutBulbTempAt(state); + CheckZoneOutBulbTempAt(state); + + // set zone level wind dir to global value + SetZoneWindSpeedAt(state); + SetZoneWindDirAt(state); + + // Set zone data to linked air node value if defined. + if (state.dataGlobal->AnyLocalEnvironmentsInModel) { + SetOutAirNodes(state); + for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + if (state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode > 0) { + if (state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirDryBulbSchedNum > 0) { + state.dataHeatBal->Zone(ZoneNum).OutDryBulbTemp = GetCurrentScheduleValue( + state, state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirDryBulbSchedNum); + } else { + state.dataHeatBal->Zone(ZoneNum).OutDryBulbTemp = + state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirDryBulb; + } + if (state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWetBulbSchedNum > 0) { + state.dataHeatBal->Zone(ZoneNum).OutWetBulbTemp = GetCurrentScheduleValue( + state, state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWetBulbSchedNum); + } else { + state.dataHeatBal->Zone(ZoneNum).OutWetBulbTemp = + state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWetBulb; + } + if (state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWindSpeedSchedNum > 0) { + state.dataHeatBal->Zone(ZoneNum).WindSpeed = GetCurrentScheduleValue( + state, state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWindSpeedSchedNum); + } else { + state.dataHeatBal->Zone(ZoneNum).WindSpeed = + state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWindSpeed; + } + if (state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWindDirSchedNum > 0) { + state.dataHeatBal->Zone(ZoneNum).WindDir = GetCurrentScheduleValue( + state, state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWindDirSchedNum); + } else { + state.dataHeatBal->Zone(ZoneNum).WindDir = + state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWindDir; + } + } + } + } + + // Overwriting surface and zone level environmental data with EMS override value + if (state.dataGlobal->AnyEnergyManagementSystemInModel) { + for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + if (state.dataHeatBal->Zone(ZoneNum).OutDryBulbTempEMSOverrideOn) { + state.dataHeatBal->Zone(ZoneNum).OutDryBulbTemp = state.dataHeatBal->Zone(ZoneNum).OutDryBulbTempEMSOverrideValue; + } + if (state.dataHeatBal->Zone(ZoneNum).OutWetBulbTempEMSOverrideOn) { + state.dataHeatBal->Zone(ZoneNum).OutWetBulbTemp = state.dataHeatBal->Zone(ZoneNum).OutWetBulbTempEMSOverrideValue; + } + if (state.dataHeatBal->Zone(ZoneNum).WindSpeedEMSOverrideOn) { + state.dataHeatBal->Zone(ZoneNum).WindSpeed = state.dataHeatBal->Zone(ZoneNum).WindSpeedEMSOverrideValue; + } + if (state.dataHeatBal->Zone(ZoneNum).WindDirEMSOverrideOn) { + state.dataHeatBal->Zone(ZoneNum).WindDir = state.dataHeatBal->Zone(ZoneNum).WindDirEMSOverrideValue; + } + } + } + + if (state.dataGlobal->BeginSimFlag) { + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + auto &thisSpace = state.dataHeatBal->space(spaceNum); + int const firstSurfWin = thisSpace.WindowSurfaceFirst; + int const lastSurfWin = thisSpace.WindowSurfaceLast; + for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) { + if (state.dataSurface->SurfWinWindowModelType(SurfNum) != DataSurfaces::WindowModel::BSDF && + state.dataSurface->SurfWinWindowModelType(SurfNum) != DataSurfaces::WindowModel::EQL) { + state.dataSurface->SurfWinWindowModelType(SurfNum) = DataSurfaces::WindowModel::Detailed; + } + } + } + } + } + } + + void AllocateZoneHeatBalArrays(EnergyPlusData &state) + { + // Allocate zone / encl hb arrays + + // TODO MJW: Punt for now, sometimes unit test will get here and need these to be allocated, but simulations need them sooner + if (!state.dataHeatBal->ZoneIntGain.allocated()) { + DataHeatBalance::AllocateIntGains(state); + } + state.dataHeatBal->ZoneMRT.allocate(state.dataGlobal->NumOfZones); + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + state.dataHeatBal->ZoneMRT(zoneNum) = 0.0; + } + state.dataZoneTempPredictorCorrector->zoneHeatBalance.allocate(state.dataGlobal->NumOfZones); + // Always allocate spaceHeatBalance, even if doSpaceHeatBalance is false, because it's used to gather some of the zone totals + state.dataZoneTempPredictorCorrector->spaceHeatBalance.allocate(state.dataGlobal->numSpaces); + + state.dataHeatBal->EnclSolQSDifSol.allocate(state.dataViewFactor->NumOfSolarEnclosures); + state.dataHeatBal->EnclSolQD.allocate(state.dataViewFactor->NumOfSolarEnclosures); + state.dataHeatBal->EnclSolQDforDaylight.allocate(state.dataViewFactor->NumOfSolarEnclosures); + state.dataHeatBal->EnclSolDB.allocate(state.dataViewFactor->NumOfSolarEnclosures); + state.dataHeatBal->EnclSolDBSSG.allocate(state.dataViewFactor->NumOfSolarEnclosures); + state.dataHeatBal->EnclSolDBIntWin.allocate(state.dataViewFactor->NumOfSolarEnclosures); + state.dataHeatBal->EnclSolQSWRad.allocate(state.dataViewFactor->NumOfSolarEnclosures); + state.dataHeatBal->EnclSolQSWRadLights.allocate(state.dataViewFactor->NumOfSolarEnclosures); + for (int enclosureNum = 1; enclosureNum <= state.dataViewFactor->NumOfSolarEnclosures; ++enclosureNum) { + state.dataHeatBal->EnclSolQSDifSol(enclosureNum) = 0.0; + state.dataHeatBal->EnclSolQD(enclosureNum) = 0.0; + state.dataHeatBal->EnclSolQDforDaylight(enclosureNum) = 0.0; + state.dataHeatBal->EnclSolQSWRad(enclosureNum) = 0.0; + state.dataHeatBal->EnclSolQSWRadLights(enclosureNum) = 0.0; + state.dataHeatBal->EnclSolDB(enclosureNum) = 0.0; + state.dataHeatBal->EnclSolDBSSG(enclosureNum) = 0.0; + state.dataHeatBal->EnclSolDBIntWin(enclosureNum) = 0.0; + } + } + void AllocateHeatBalArrays(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Richard Liesen + // DATE WRITTEN February 1998 + + // Use the total number of zones or surfaces to allocate variables to avoid a limit + AllocateZoneHeatBalArrays(state); + state.dataHeatBalFanSys->SumConvHTRadSys.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalFanSys->SumLatentHTRadSys.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalFanSys->SumConvPool.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalFanSys->SumLatentPool.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalFanSys->ZoneQdotRadHVACToPerson.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalFanSys->ZoneQHTRadSysToPerson.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalFanSys->ZoneQHWBaseboardToPerson.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalFanSys->ZoneQSteamBaseboardToPerson.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalFanSys->ZoneQElecBaseboardToPerson.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalFanSys->ZoneQCoolingPanelToPerson.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalFanSys->ZoneReOrder.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBalFanSys->ZoneMassBalanceFlag.dimension(state.dataGlobal->NumOfZones, false); + state.dataHeatBalFanSys->ZoneInfiltrationFlag.dimension(state.dataGlobal->NumOfZones, false); + state.dataHeatBalFanSys->ZoneReOrder = 0; + state.dataHeatBalFanSys->TempTstatAir.dimension(state.dataGlobal->NumOfZones, DataHeatBalance::ZoneInitialTemp); + if (state.dataContaminantBalance->Contaminant.CO2Simulation) { + state.dataContaminantBalance->OutdoorCO2 = GetCurrentScheduleValue(state, state.dataContaminantBalance->Contaminant.CO2OutdoorSchedPtr); + state.dataContaminantBalance->ZoneAirCO2.dimension(state.dataGlobal->NumOfZones, state.dataContaminantBalance->OutdoorCO2); + state.dataContaminantBalance->ZoneAirCO2Temp.dimension(state.dataGlobal->NumOfZones, state.dataContaminantBalance->OutdoorCO2); + state.dataContaminantBalance->ZoneAirCO2Avg.dimension(state.dataGlobal->NumOfZones, state.dataContaminantBalance->OutdoorCO2); + } + if (state.dataContaminantBalance->Contaminant.GenericContamSimulation) { + state.dataContaminantBalance->OutdoorGC = + GetCurrentScheduleValue(state, state.dataContaminantBalance->Contaminant.GenericContamOutdoorSchedPtr); + state.dataContaminantBalance->ZoneAirGC.dimension(state.dataGlobal->NumOfZones, state.dataContaminantBalance->OutdoorGC); + state.dataContaminantBalance->ZoneAirGCTemp.dimension(state.dataGlobal->NumOfZones, state.dataContaminantBalance->OutdoorGC); + state.dataContaminantBalance->ZoneAirGCAvg.dimension(state.dataGlobal->NumOfZones, state.dataContaminantBalance->OutdoorGC); + } + state.dataHeatBalMgr->MaxTempPrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalMgr->MinTempPrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalMgr->MaxHeatLoadPrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalMgr->MaxCoolLoadPrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalMgr->MaxHeatLoadZone.dimension(state.dataGlobal->NumOfZones, -9999.0); + state.dataHeatBalMgr->MaxCoolLoadZone.dimension(state.dataGlobal->NumOfZones, -9999.0); + state.dataHeatBalMgr->MaxTempZone.dimension(state.dataGlobal->NumOfZones, -9999.0); + state.dataHeatBalMgr->MinTempZone.dimension(state.dataGlobal->NumOfZones, 1000.0); + state.dataHeatBalMgr->TempZonePrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalMgr->LoadZonePrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalMgr->TempZoneSecPrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalMgr->LoadZoneSecPrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalMgr->WarmupTempDiff.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalMgr->WarmupLoadDiff.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalMgr->TempZone.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalMgr->LoadZone.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataHeatBalMgr->TempZoneRpt.dimension(state.dataGlobal->NumOfZones, state.dataGlobal->NumOfTimeStepInHour * 24, 0.0); + state.dataHeatBalMgr->LoadZoneRpt.dimension(state.dataGlobal->NumOfZones, state.dataGlobal->NumOfTimeStepInHour * 24, 0.0); + state.dataHeatBalMgr->MaxLoadZoneRpt.dimension(state.dataGlobal->NumOfZones, state.dataGlobal->NumOfTimeStepInHour * 24, 0.0); + state.dataHeatBalMgr->WarmupConvergenceValues.allocate(state.dataGlobal->NumOfZones); + state.dataHeatBalMgr->TempZoneRptStdDev.allocate(state.dataGlobal->NumOfTimeStepInHour * 24); + state.dataHeatBalMgr->LoadZoneRptStdDev.allocate(state.dataGlobal->NumOfTimeStepInHour * 24); + // MassConservation.allocate( NumOfZones ); + + state.dataHeatBalFanSys->CrossedColdThreshRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->CrossedHeatThreshRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->CrossedColdThreshRepPeriod = false; + state.dataHeatBalFanSys->CrossedHeatThreshRepPeriod = false; + if (state.dataWeatherManager->TotThermalReportPers > 0) { + state.dataHeatBalFanSys->ZoneHeatIndexHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->ZoneHeatIndexOccupiedHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->ZoneHeatIndexOccuHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->ZoneHumidexHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->ZoneHumidexOccupiedHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->ZoneHumidexOccuHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->ZoneColdHourOfSafetyBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->ZoneHeatHourOfSafetyBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->ZoneUnmetDegreeHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccuHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccupiedHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotThermalReportPers); + } + + if (state.dataWeatherManager->TotCO2ReportPers > 0) { + state.dataHeatBalFanSys->ZoneCO2LevelHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotCO2ReportPers); + state.dataHeatBalFanSys->ZoneCO2LevelOccuHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotCO2ReportPers); + state.dataHeatBalFanSys->ZoneCO2LevelOccupiedHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotCO2ReportPers); + } + if (state.dataWeatherManager->TotVisualReportPers > 0) { + state.dataHeatBalFanSys->ZoneLightingLevelHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotVisualReportPers); + state.dataHeatBalFanSys->ZoneLightingLevelOccuHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotVisualReportPers); + state.dataHeatBalFanSys->ZoneLightingLevelOccupiedHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, + state.dataWeatherManager->TotVisualReportPers); + } + + state.dataHeatBalFanSys->ZoneLowSETHoursRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->ZoneHighSETHoursRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->lowSETLongestHoursRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->highSETLongestHoursRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->lowSETLongestStartRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); + state.dataHeatBalFanSys->highSETLongestStartRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); + + state.dataHeatBalMgr->CountWarmupDayPoints = 0; + + for (int loop = 1; loop <= state.dataGlobal->NumOfZones; ++loop) { + // CurrentModuleObject='Zone' + SetupOutputVariable(state, + "Zone Mean Radiant Temperature", + OutputProcessor::Unit::C, + state.dataHeatBal->ZoneMRT(loop), + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::State, + state.dataHeatBal->Zone(loop).Name); + } + } + + // End Initialization Section of the Module + //****************************************************************************** + + // Beginning of Record Keeping subroutines for the HB Module + // ***************************************************************************** + + void RecKeepHeatBalance(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Rick Strand + // DATE WRITTEN April 1997 + // MODIFIED June 2011, Daeho Kang for individual zone maximums & convergence outputs + // July 2016, Rick Strand for movable insulation bug fix + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine is the main driver for record keeping within the + // heat balance. + + // Using/Aliasing + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int ZoneNum; + + // Record Maxs & Mins for individual zone + for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); + auto &thisZoneSysEnergyDemand = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneNum); + if (thisZoneHB.ZTAV > state.dataHeatBalMgr->MaxTempZone(ZoneNum)) { + state.dataHeatBalMgr->MaxTempZone(ZoneNum) = thisZoneHB.ZTAV; + } + if (thisZoneHB.ZTAV < state.dataHeatBalMgr->MinTempZone(ZoneNum)) { + state.dataHeatBalMgr->MinTempZone(ZoneNum) = thisZoneHB.ZTAV; + } + if (thisZoneSysEnergyDemand.ZoneSNLoadHeatRate > state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum)) { + state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum) = thisZoneSysEnergyDemand.ZoneSNLoadHeatRate; + } + if (thisZoneSysEnergyDemand.ZoneSNLoadCoolRate > state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum)) { + state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum) = thisZoneSysEnergyDemand.ZoneSNLoadCoolRate; + } + + // Record temperature and load for individual zone + state.dataHeatBalMgr->TempZoneSecPrevDay(ZoneNum) = state.dataHeatBalMgr->TempZonePrevDay(ZoneNum); + state.dataHeatBalMgr->LoadZoneSecPrevDay(ZoneNum) = state.dataHeatBalMgr->LoadZonePrevDay(ZoneNum); + state.dataHeatBalMgr->TempZonePrevDay(ZoneNum) = state.dataHeatBalMgr->TempZone(ZoneNum); + state.dataHeatBalMgr->LoadZonePrevDay(ZoneNum) = state.dataHeatBalMgr->LoadZone(ZoneNum); + state.dataHeatBalMgr->TempZone(ZoneNum) = thisZoneHB.ZTAV; + state.dataHeatBalMgr->LoadZone(ZoneNum) = + max(thisZoneSysEnergyDemand.ZoneSNLoadHeatRate, std::abs(thisZoneSysEnergyDemand.ZoneSNLoadCoolRate)); + + // Calculate differences in temperature and load for the last two warmup days + if (!state.dataGlobal->WarmupFlag && state.dataGlobal->DayOfSim == 1 && + (!state.dataGlobal->DoingSizing || state.dataGlobal->DoPureLoadCalc)) { + state.dataHeatBalMgr->WarmupTempDiff(ZoneNum) = + std::abs(state.dataHeatBalMgr->TempZoneSecPrevDay(ZoneNum) - state.dataHeatBalMgr->TempZonePrevDay(ZoneNum)); + state.dataHeatBalMgr->WarmupLoadDiff(ZoneNum) = + std::abs(state.dataHeatBalMgr->LoadZoneSecPrevDay(ZoneNum) - state.dataHeatBalMgr->LoadZonePrevDay(ZoneNum)); + if (ZoneNum == 1) ++state.dataHeatBalMgr->CountWarmupDayPoints; + state.dataHeatBalMgr->TempZoneRpt(ZoneNum, state.dataHeatBalMgr->CountWarmupDayPoints) = + state.dataHeatBalMgr->WarmupTempDiff(ZoneNum); + state.dataHeatBalMgr->LoadZoneRpt(ZoneNum, state.dataHeatBalMgr->CountWarmupDayPoints) = + state.dataHeatBalMgr->WarmupLoadDiff(ZoneNum); + state.dataHeatBalMgr->MaxLoadZoneRpt(ZoneNum, state.dataHeatBalMgr->CountWarmupDayPoints) = state.dataHeatBalMgr->LoadZone(ZoneNum); + + if (state.dataSysVars->ReportDetailedWarmupConvergence) { // only do this detailed thing when requested by user is on + // Write Warmup Convergence Information to the initialization output file + if (state.dataHeatBalMgr->FirstWarmupWrite) { + constexpr const char *Format_732{"! ,Zone Name,Time Step,Hour of Day,Warmup Temperature " + "Difference {{deltaC}},Warmup Load Difference {{W}}\n"}; + print(state.files.eio, Format_732); + state.dataHeatBalMgr->FirstWarmupWrite = false; + } + constexpr const char *Format_731{" Warmup Convergence Information, {},{},{},{:.10R},{:.10R}\n"}; + print(state.files.eio, + Format_731, + state.dataHeatBal->Zone(ZoneNum).Name, + state.dataGlobal->TimeStep, + state.dataGlobal->HourOfDay, + state.dataHeatBalMgr->WarmupTempDiff(ZoneNum), + state.dataHeatBalMgr->WarmupLoadDiff(ZoneNum)); + } + } + } + + // Update interior movable insulation flag--needed at the end of a zone time step so that the interior radiant + // exchange algorithm knows whether there has been a change in interior movable insulation or not. + if (state.dataSurface->AnyMovableInsulation) { + for (int surfNum : state.dataHeatBalSurf->SurfMovInsulIndexList) { + state.dataHeatBalSurf->SurfMovInsulIntPresentPrevTS(surfNum) = state.dataHeatBalSurf->SurfMovInsulIntPresent(surfNum); + } + } + + // For non-complex windows, update a report variable so this shows up in the output as something other than zero + UpdateWindowFaceTempsNonBSDFWin(state); + } + + void CheckWarmupConvergence(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Rick Strand + // DATE WRITTEN April 1997 + // MODIFIED June 2011, Daeho Kang for individual zone comparison + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine checks warmup convergence values. + + // METHODOLOGY EMPLOYED: + // na + + // REFERENCES: + // na + + // Using/Aliasing + + // Locals + // SUBROUTINE ARGUMENT DEFINITIONS: + // na + + // SUBROUTINE PARAMETER DEFINITIONS: + Real64 constexpr MinLoad(100.0); // Minimum loads for convergence check + // To avoid big percentage difference in low load situations + + // INTERFACE BLOCK SPECIFICATIONS: + // na + + // DERIVED TYPE DEFINITIONS: + // na + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int ZoneNum; + bool ConvergenceChecksFailed; + + // Convergence criteria for warmup days: + // Perform another warmup day unless both the % change in loads and + // absolute change in zone temp min & max are less than their criteria. + + ConvergenceChecksFailed = false; + + if (state.dataGlobal->NumOfZones <= 0) { // if there are no zones, immediate convergence + state.dataGlobal->WarmupFlag = false; + } else { + for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxTempValue = + std::abs(state.dataHeatBalMgr->MaxTempPrevDay(ZoneNum) - state.dataHeatBalMgr->MaxTempZone(ZoneNum)); + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMinTempValue = + std::abs(state.dataHeatBalMgr->MinTempPrevDay(ZoneNum) - state.dataHeatBalMgr->MinTempZone(ZoneNum)); + if (state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxTempValue <= state.dataHeatBal->TempConvergTol) { + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(1) = 2; + } else { + ConvergenceChecksFailed = true; + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(1) = 1; + } + + if (state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMinTempValue <= state.dataHeatBal->TempConvergTol) { + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(2) = 2; + } else { + ConvergenceChecksFailed = true; + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(2) = 1; + } + + if (state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum) > 1.0e-4) { // make sure load big enough to divide + state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum) = std::abs(max(state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum), MinLoad)); + state.dataHeatBalMgr->MaxHeatLoadPrevDay(ZoneNum) = std::abs(max(state.dataHeatBalMgr->MaxHeatLoadPrevDay(ZoneNum), MinLoad)); + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxHeatLoadValue = + std::abs((state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum) - state.dataHeatBalMgr->MaxHeatLoadPrevDay(ZoneNum)) / + state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum)); + if (state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxHeatLoadValue <= state.dataHeatBal->LoadsConvergTol) { + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(3) = 2; + } else { + ConvergenceChecksFailed = true; + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(3) = 1; + } + } else { + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(3) = 2; + } + + if (state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum) > 1.0e-4) { + state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum) = std::abs(max(state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum), MinLoad)); + state.dataHeatBalMgr->MaxCoolLoadPrevDay(ZoneNum) = std::abs(max(state.dataHeatBalMgr->MaxCoolLoadPrevDay(ZoneNum), MinLoad)); + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxCoolLoadValue = + std::abs((state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum) - state.dataHeatBalMgr->MaxCoolLoadPrevDay(ZoneNum)) / + state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum)); + if (state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxCoolLoadValue <= state.dataHeatBal->LoadsConvergTol) { + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(4) = 2; + } else { + ConvergenceChecksFailed = true; + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(4) = 1; + } + } else { + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(4) = 2; + } + + if (state.dataGlobal->DayOfSim >= state.dataHeatBal->MaxNumberOfWarmupDays && state.dataGlobal->WarmupFlag) { + // Check convergence for individual zone + if (sum(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag) != 8) { // pass=2 * 4 values for convergence + ShowSevereError(state, + format("CheckWarmupConvergence: Loads Initialization, Zone=\"{}\" did not converge after {} warmup days.", + state.dataHeatBal->Zone(ZoneNum).Name, + state.dataHeatBal->MaxNumberOfWarmupDays)); + if (!state.dataHeatBalMgr->WarmupConvergenceWarning && !state.dataGlobal->DoingSizing) { + ShowContinueError(state, "See Warmup Convergence Information in .eio file for details."); + state.dataHeatBalMgr->WarmupConvergenceWarning = true; + } else if (!state.dataHeatBalMgr->SizingWarmupConvergenceWarning && state.dataGlobal->DoingSizing) { + ShowContinueError(state, "Warmup Convergence failing during sizing."); + state.dataHeatBalMgr->SizingWarmupConvergenceWarning = true; + } + if (state.dataEnvrn->RunPeriodEnvironment) { + ShowContinueError(state, "...Environment(RunPeriod)=\"" + state.dataEnvrn->EnvironmentName + "\""); + } else { + ShowContinueError(state, "...Environment(SizingPeriod)=\"" + state.dataEnvrn->EnvironmentName + "\""); + } + + ShowContinueError(state, + format("..Max Temp Comparison = {:.2R} vs Temperature Convergence Tolerance={:.2R} - {} Convergence", + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxTempValue, + state.dataHeatBal->TempConvergTol, + PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(1)))); + ShowContinueError(state, + format("..Min Temp Comparison = {:.2R} vs Temperature Convergence Tolerance={:.2R} - {} Convergence", + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMinTempValue, + state.dataHeatBal->TempConvergTol, + PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(2)))); + ShowContinueError(state, + format("..Max Heat Load Comparison = {:.4R} vs Loads Convergence Tolerance={:.2R} - {} Convergence", + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxHeatLoadValue, + state.dataHeatBal->LoadsConvergTol, + PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(3)))); + ShowContinueError(state, + format("..Max Cool Load Comparison = {:.4R} vs Loads Convergence Tolerance={:.2R} - {} Convergence", + state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxCoolLoadValue, + state.dataHeatBal->LoadsConvergTol, + PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(4)))); + } + } + + // Transfer current daily max and min loads and temperatures to the + // variables containing the last day's values + state.dataHeatBalMgr->MaxHeatLoadPrevDay(ZoneNum) = state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum); + state.dataHeatBalMgr->MaxCoolLoadPrevDay(ZoneNum) = state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum); + state.dataHeatBalMgr->MaxTempPrevDay(ZoneNum) = state.dataHeatBalMgr->MaxTempZone(ZoneNum); + state.dataHeatBalMgr->MinTempPrevDay(ZoneNum) = state.dataHeatBalMgr->MinTempZone(ZoneNum); + + state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum) = -9999.0; + state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum) = -9999.0; + state.dataHeatBalMgr->MaxTempZone(ZoneNum) = -9999.0; + state.dataHeatBalMgr->MinTempZone(ZoneNum) = 1000.0; + } + + // Limit the number of warmup days, regardless of the number of zones + // in the building, to some arbitrary value based on common sense and + // experience with the (I)BLAST program. If too many warmup days were + // required, notify the program user. + + if ((state.dataGlobal->DayOfSim >= state.dataHeatBal->MaxNumberOfWarmupDays) && state.dataGlobal->WarmupFlag && ConvergenceChecksFailed) { + if (state.dataHeatBal->MaxNumberOfWarmupDays < DefaultMaxNumberOfWarmupDays) { + ShowSevereError(state, + format("CheckWarmupConvergence: User supplied maximum warmup days={} is insufficient.", + state.dataHeatBal->MaxNumberOfWarmupDays)); + ShowContinueError(state, format("Suggest setting maximum number of warmup days to at least {}.", DefaultMaxNumberOfWarmupDays)); + } + } + + // Set warmup flag to true depending on value of ConvergenceChecksFailed (true=fail) + // and minimum number of warmup days + if (!ConvergenceChecksFailed && state.dataGlobal->DayOfSim >= state.dataHeatBal->MinNumberOfWarmupDays) { + state.dataGlobal->WarmupFlag = false; + } else if (!ConvergenceChecksFailed && state.dataGlobal->DayOfSim < state.dataHeatBal->MinNumberOfWarmupDays) { + state.dataGlobal->WarmupFlag = true; + } + + // If max warmup days reached and still WarmupFlag, then go to non-warmup state. + // prior messages will have been displayed + if ((state.dataGlobal->DayOfSim >= state.dataHeatBal->MaxNumberOfWarmupDays) && state.dataGlobal->WarmupFlag) { + state.dataGlobal->WarmupFlag = false; + } + } + } + + void ReportWarmupConvergence(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN October 2011 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // na + + // METHODOLOGY EMPLOYED: + // na + + // REFERENCES: + // na + + // Using/Aliasing + + // Locals + // SUBROUTINE ARGUMENT DEFINITIONS: + // na + + // SUBROUTINE PARAMETER DEFINITIONS: + // na + + // INTERFACE BLOCK SPECIFICATIONS: + // na + + // DERIVED TYPE DEFINITIONS: + // na + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int ZoneNum; + Real64 AverageZoneTemp; + Real64 AverageZoneLoad; + Real64 StdDevZoneTemp; + Real64 StdDevZoneLoad; + std::string EnvHeader; + int Num; // loop control + + // Formats + constexpr const char *Format_730("! ,Zone Name,Environment Type/Name,Average Warmup Temperature Difference " + "{{deltaC}},Std Dev Warmup Temperature Difference {{deltaC}},Max Temperature Pass/Fail Convergence,Min " + "Temperature Pass/Fail Convergence,Average Warmup Load Difference {{W}},Std Dev Warmup Load Difference " + "{{W}},Heating Load Pass/Fail Convergence,Cooling Load Pass/Fail Convergence\n"); + + if (!state.dataGlobal->WarmupFlag) { // Report out average/std dev + // Write Warmup Convervence Information to the initialization output file + if (state.dataHeatBalMgr->ReportWarmupConvergenceFirstWarmupWrite && state.dataGlobal->NumOfZones > 0) { + print(state.files.eio, Format_730); + state.dataHeatBalMgr->ReportWarmupConvergenceFirstWarmupWrite = false; + } + + state.dataHeatBalMgr->TempZoneRptStdDev = 0.0; + state.dataHeatBalMgr->LoadZoneRptStdDev = 0.0; + + if (state.dataEnvrn->RunPeriodEnvironment) { + EnvHeader = "RunPeriod:"; + } else { + EnvHeader = "SizingPeriod:"; + } + + for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { + AverageZoneTemp = sum(state.dataHeatBalMgr->TempZoneRpt(ZoneNum, {1, state.dataHeatBalMgr->CountWarmupDayPoints})) / + double(state.dataHeatBalMgr->CountWarmupDayPoints); + for (Num = 1; Num <= state.dataHeatBalMgr->CountWarmupDayPoints; ++Num) { + if (state.dataHeatBalMgr->MaxLoadZoneRpt(ZoneNum, Num) > 1.e-4) { + state.dataHeatBalMgr->LoadZoneRpt(ZoneNum, Num) /= state.dataHeatBalMgr->MaxLoadZoneRpt(ZoneNum, Num); + } else { + state.dataHeatBalMgr->LoadZoneRpt(ZoneNum, Num) = 0.0; + } + } + AverageZoneLoad = sum(state.dataHeatBalMgr->LoadZoneRpt(ZoneNum, {1, state.dataHeatBalMgr->CountWarmupDayPoints})) / + double(state.dataHeatBalMgr->CountWarmupDayPoints); + StdDevZoneTemp = 0.0; + StdDevZoneLoad = 0.0; + for (Num = 1; Num <= state.dataHeatBalMgr->CountWarmupDayPoints; ++Num) { + state.dataHeatBalMgr->TempZoneRptStdDev(Num) = pow_2(state.dataHeatBalMgr->TempZoneRpt(ZoneNum, Num) - AverageZoneTemp); + state.dataHeatBalMgr->LoadZoneRptStdDev(Num) = pow_2(state.dataHeatBalMgr->LoadZoneRpt(ZoneNum, Num) - AverageZoneLoad); + } + StdDevZoneTemp = std::sqrt(sum(state.dataHeatBalMgr->TempZoneRptStdDev({1, state.dataHeatBalMgr->CountWarmupDayPoints})) / + double(state.dataHeatBalMgr->CountWarmupDayPoints)); + StdDevZoneLoad = std::sqrt(sum(state.dataHeatBalMgr->LoadZoneRptStdDev({1, state.dataHeatBalMgr->CountWarmupDayPoints})) / + double(state.dataHeatBalMgr->CountWarmupDayPoints)); + + constexpr const char *Format_731(" Warmup Convergence Information,{},{},{:.10R},{:.10R},{},{},{:.10R},{:.10R},{},{}\n"); + print(state.files.eio, + Format_731, + state.dataHeatBal->Zone(ZoneNum).Name, + EnvHeader + ' ' + state.dataEnvrn->EnvironmentName, + AverageZoneTemp, + StdDevZoneTemp, + PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(1)), + PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(2)), + AverageZoneLoad, + StdDevZoneLoad, + PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(3)), + PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(4))); + } + } + } + + void UpdateWindowFaceTempsNonBSDFWin(EnergyPlusData &state) + { + for (int SurfNum : state.dataSurface->AllHTWindowSurfaceList) { + auto &thisConstruction = state.dataConstruction->Construct(state.dataSurface->Surface(SurfNum).Construction); + if (thisConstruction.WindowTypeBSDF) continue; + state.dataHeatBal->SurfWinFenLaySurfTempFront(SurfNum, 1) = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum); + state.dataHeatBal->SurfWinFenLaySurfTempBack(SurfNum, thisConstruction.TotLayers) = state.dataHeatBalSurf->SurfInsideTempHist(1)(SurfNum); + } + } + + // End of Record Keeping subroutines for the HB Module + // ***************************************************************************** + + // Beginning of Reporting subroutines for the HB Module + // ***************************************************************************** + + void ReportHeatBalance(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Rick Strand + // DATE WRITTEN July 1997 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine is the main driver for reporting within the heat + // balance. + + // METHODOLOGY EMPLOYED: + // Uses the status flags to trigger record keeping events. + + // REFERENCES: + // na + + // Using/Aliasing + using EconomicTariff::UpdateUtilityBills; // added for computing annual utility costs + using NodeInputManager::CalcMoreNodeInfo; + using OutputReportTabular::UpdateTabularReports; + using ScheduleManager::ReportScheduleValues; + + ReportScheduleValues(state); + + if (!state.dataGlobal->WarmupFlag && state.dataGlobal->DoOutputReporting) { + if (!state.dataGlobal->DoingSizing) { + CalcMoreNodeInfo(state); + } + UpdateDataandReport(state, OutputProcessor::TimeStepType::Zone); + if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeDesignDay || + state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeRunPeriodDesign) { + if (state.dataHVACSizingSimMgr->hvacSizingSimulationManager) + state.dataHVACSizingSimMgr->hvacSizingSimulationManager->UpdateSizingLogsZoneStep(state); + } + + UpdateTabularReports(state, OutputProcessor::TimeStepType::Zone); + UpdateUtilityBills(state); + } else if (!state.dataGlobal->KickOffSimulation && state.dataGlobal->DoOutputReporting && state.dataSysVars->ReportDuringWarmup) { + if (state.dataGlobal->BeginDayFlag && !state.dataEnvrn->PrintEnvrnStampWarmupPrinted) { + state.dataEnvrn->PrintEnvrnStampWarmup = true; + state.dataEnvrn->PrintEnvrnStampWarmupPrinted = true; + } + if (!state.dataGlobal->BeginDayFlag) state.dataEnvrn->PrintEnvrnStampWarmupPrinted = false; + if (state.dataEnvrn->PrintEnvrnStampWarmup) { + if (state.dataReportFlag->PrintEndDataDictionary && state.dataGlobal->DoOutputReporting) { + constexpr const char *EndOfHeaderString("End of Data Dictionary"); // End of data dictionary marker + print(state.files.eso, "{}\n", EndOfHeaderString); + print(state.files.mtr, "{}\n", EndOfHeaderString); + state.dataReportFlag->PrintEndDataDictionary = false; + } + if (state.dataGlobal->DoOutputReporting) { + constexpr const char *EnvironmentStampFormatStr("{},{},{:7.2F},{:7.2F},{:7.2F},{:7.2F}\n"); // Format descriptor for environ stamp + print(state.files.eso, + EnvironmentStampFormatStr, + "1", + "Warmup {" + state.dataReportFlag->cWarmupDay + "} " + state.dataEnvrn->EnvironmentName, + state.dataEnvrn->Latitude, + state.dataEnvrn->Longitude, + state.dataEnvrn->TimeZoneNumber, + state.dataEnvrn->Elevation); + + print(state.files.mtr, + EnvironmentStampFormatStr, + "1", + "Warmup {" + state.dataReportFlag->cWarmupDay + "} " + state.dataEnvrn->EnvironmentName, + state.dataEnvrn->Latitude, + state.dataEnvrn->Longitude, + state.dataEnvrn->TimeZoneNumber, + state.dataEnvrn->Elevation); + state.dataEnvrn->PrintEnvrnStampWarmup = false; + } + } + if (!state.dataGlobal->DoingSizing) { + CalcMoreNodeInfo(state); + } + UpdateDataandReport(state, OutputProcessor::TimeStepType::Zone); + if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeDesignDay || + state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeRunPeriodDesign) { + if (state.dataHVACSizingSimMgr->hvacSizingSimulationManager) + state.dataHVACSizingSimMgr->hvacSizingSimulationManager->UpdateSizingLogsZoneStep(state); + } + + } else if (state.dataSysVars->UpdateDataDuringWarmupExternalInterface) { // added for FMI + UpdateDataandReport(state, OutputProcessor::TimeStepType::Zone); + if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeDesignDay || + state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeRunPeriodDesign) { + if (state.dataHVACSizingSimMgr->hvacSizingSimulationManager) + state.dataHVACSizingSimMgr->hvacSizingSimulationManager->UpdateSizingLogsZoneStep(state); + } + } + // There is no hourly reporting in the heat balance. + + // There is no daily reporting in the heat balance. + + // There is no simulation level record keeping in the heat balance. + } + + // End of Reporting subroutines for the HB Module + + void OpenShadingFile(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR X Luo + // DATE WRITTEN August 2017 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // Open and set up headers for a external shading fraction export file. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int SurfNum; + + state.files.shade.ensure_open(state, "OpenOutputFiles", state.files.outputControl.extshd); + print(state.files.shade, "Surface Name,"); + for (SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) { + print(state.files.shade, "{},", state.dataSurface->Surface(SurfNum).Name); + } + print(state.files.shade, "()\n"); + } + void GetFrameAndDividerData(EnergyPlusData &state, bool &ErrorsFound) // set to true if errors found in input + { + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Winkelmann + // DATE WRITTEN May 2000 + // MODIFIED April 2002 (FCW): get window reveal data + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // Gets input data for window frame and/or divider and/or window + // inside/outside reveal. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + + int IOStat; // IO Status when calling get input subroutine + Array1D_string FrameDividerAlphas(3); // Frame/Divider Alpha names + int FrameDividerNum; // Counter to keep track of the frame/divider number + int FrameDividerNumAlpha; // Number of frame/divider alpha names being passed + int FrameDividerNumProp; // Number of frame/divider properties being passed + Array1D FrameDividerProps(23); // Temporary array to transfer frame/divider properties + int Loop; + + constexpr std::array(DataSurfaces::NfrcProductOptions::Num)> NfrcProductNamesUC = { + "CASEMENTDOUBLE", "CASEMENTSINGLE", "DUALACTION", + "FIXED", "GARAGE", "GREENHOUSE", + "HINGEDESCAPE", "HORIZONTALSLIDER", "JAL", + "PIVOTED", "PROJECTINGSINGLE", "PROJECTINGDUAL", + "DOORSIDELITE", "SKYLIGHT", "SLIDINGPATIODOOR", + "CURTAINWALL", "SPANDRELPANEL", "SIDEHINGEDDOOR", + "DOORTRANSOM", "TROPICALAWNING", "TUBULARDAYLIGHTINGDEVICE", + "VERTICALSLIDER"}; + + constexpr std::array(DataSurfaces::FrameDividerType::Num)> FrameDividerTypeNamesUC = { + "DIVIDEDLITE", // 0 + "SUSPENDED" // 1 + }; + + state.dataHeatBalMgr->CurrentModuleObject = "WindowProperty:FrameAndDivider"; + state.dataHeatBal->TotFrameDivider = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + state.dataSurface->FrameDivider.allocate(state.dataHeatBal->TotFrameDivider); + if (state.dataHeatBal->TotFrameDivider == 0) return; + + FrameDividerNum = 0; + + for (Loop = 1; Loop <= state.dataHeatBal->TotFrameDivider; ++Loop) { + + // Call Input Get routine to retrieve frame/divider data + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + FrameDividerAlphas, + FrameDividerNumAlpha, + FrameDividerProps, + FrameDividerNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (UtilityRoutines::IsNameEmpty(state, FrameDividerAlphas(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) continue; + + // Load the frame/divider derived type from the input data. + ++FrameDividerNum; + auto &frameDivider = state.dataSurface->FrameDivider(FrameDividerNum); + frameDivider.Name = FrameDividerAlphas(1); + frameDivider.FrameWidth = FrameDividerProps(1); + frameDivider.FrameProjectionOut = FrameDividerProps(2); + frameDivider.FrameProjectionIn = FrameDividerProps(3); + if (frameDivider.FrameWidth == 0.0) { + frameDivider.FrameProjectionOut = 0.0; + frameDivider.FrameProjectionIn = 0.0; + } + frameDivider.FrameConductance = FrameDividerProps(4); + frameDivider.FrEdgeToCenterGlCondRatio = FrameDividerProps(5); + frameDivider.FrameSolAbsorp = FrameDividerProps(6); + frameDivider.FrameVisAbsorp = FrameDividerProps(7); + frameDivider.FrameEmis = FrameDividerProps(8); + + DataSurfaces::FrameDividerType currentDividerType = + DataSurfaces::FrameDividerType(getEnumerationValue(FrameDividerTypeNamesUC, FrameDividerAlphas(2))); + if (currentDividerType == DataSurfaces::FrameDividerType::Invalid) { + ShowWarningError(state, + fmt::format("{}={}, Invalid {}", + state.dataHeatBalMgr->CurrentModuleObject, + std::quoted(FrameDividerAlphas(1)), + state.dataIPShortCut->cAlphaFieldNames(2))); + ShowContinueError( + state, + fmt::format("Entered={}, must be DividedLite or Suspended. Will be set to DividedLite.", std::quoted(FrameDividerAlphas(2)))); + frameDivider.DividerType = DataSurfaces::FrameDividerType::DividedLite; + } else { + frameDivider.DividerType = currentDividerType; + } + + frameDivider.DividerWidth = FrameDividerProps(9); + frameDivider.HorDividers = FrameDividerProps(10); + frameDivider.VertDividers = FrameDividerProps(11); + frameDivider.DividerProjectionOut = FrameDividerProps(12); + frameDivider.DividerProjectionIn = FrameDividerProps(13); + if (frameDivider.DividerWidth == 0.0 || frameDivider.DividerType == DataSurfaces::FrameDividerType::Suspended) { + frameDivider.DividerProjectionOut = 0.0; + frameDivider.DividerProjectionIn = 0.0; + } + frameDivider.DividerConductance = FrameDividerProps(14); + frameDivider.DivEdgeToCenterGlCondRatio = FrameDividerProps(15); + frameDivider.DividerSolAbsorp = FrameDividerProps(16); + frameDivider.DividerVisAbsorp = FrameDividerProps(17); + frameDivider.DividerEmis = FrameDividerProps(18); + + // look up the NFRC Product Type for Assembly Calculations using the DataSurfaces::NfrcProductName + frameDivider.NfrcProductType = DataSurfaces::NfrcProductOptions(getEnumerationValue(NfrcProductNamesUC, FrameDividerAlphas(3))); + if (frameDivider.NfrcProductType == DataSurfaces::NfrcProductOptions::Invalid) { + frameDivider.NfrcProductType = DataSurfaces::NfrcProductOptions::CurtainWall; + } + + frameDivider.OutsideRevealSolAbs = FrameDividerProps(19); + frameDivider.InsideSillDepth = FrameDividerProps(20); + frameDivider.InsideSillSolAbs = FrameDividerProps(21); + frameDivider.InsideReveal = FrameDividerProps(22); + frameDivider.InsideRevealSolAbs = FrameDividerProps(23); + + if (frameDivider.DividerWidth > 0.0 && (frameDivider.HorDividers == 0 && frameDivider.VertDividers == 0)) { + ShowWarningError(state, + state.dataHeatBalMgr->CurrentModuleObject + ": In FrameAndDivider " + frameDivider.Name + ' ' + + state.dataIPShortCut->cNumericFieldNames(9) + " > 0 "); + ShowContinueError(state, + "...but " + state.dataIPShortCut->cNumericFieldNames(10) + " = 0 and " + + state.dataIPShortCut->cNumericFieldNames(11) + " = 0."); + ShowContinueError(state, "..." + state.dataIPShortCut->cNumericFieldNames(9) + " set to 0."); + frameDivider.DividerWidth = 0.0; + } + // Prevent InsideSillDepth < InsideReveal + if (frameDivider.InsideSillDepth < state.dataSurface->FrameDivider(FrameDividerNum).InsideReveal) { + ShowWarningError(state, + state.dataHeatBalMgr->CurrentModuleObject + ": In FrameAndDivider " + frameDivider.Name + ' ' + + state.dataIPShortCut->cNumericFieldNames(20) + " is less than " + state.dataIPShortCut->cNumericFieldNames(22) + + "; it will be set to " + state.dataIPShortCut->cNumericFieldNames(22) + '.'); + frameDivider.InsideSillDepth = state.dataSurface->FrameDivider(FrameDividerNum).InsideReveal; + } + + // ! Warn if InsideSillDepth OR InsideReveal > 0.2meters to warn of inaccuracies + // IF(FrameDivider(FrameDividerNum)%InsideSillDepth > 0.2d0) THEN + // CALL ShowWarningError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//': In FrameAndDivider + // '//TRIM(FrameDivider(FrameDividerNum)%Name)// & + // ' '//TRIM(cNumericFieldNames(20))//' is greater than 0.2 meters, which could cause inaccuracies in zone cooling energy.') + // END IF + // IF(FrameDivider(FrameDividerNum)%InsideReveal > 0.2d0) THEN + // CALL ShowWarningError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//': In FrameAndDivider + // '//TRIM(FrameDivider(FrameDividerNum)%Name)// & + // ' '//TRIM(cNumericFieldNames(22))//' is greater than 0.2 meters, which could cause inaccuracies in zone cooling energy.') + // END IF + } + } + + void SearchWindow5DataFile(EnergyPlusData &state, + fs::path const &DesiredFilePath, // File path that contains the Window5 constructions. + std::string const &DesiredConstructionName, // Name that will be searched for in the Window5 data file + bool &ConstructionFound, // True if DesiredConstructionName is in the Window5 data file + bool &EOFonFile, // True if EOF during file read + bool &ErrorsFound // True if there is a problem with the entry requested from the data file + ) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Winkelmann + // DATE WRITTEN August 2001 + // MODIFIED June 2002, FW: do all reallocation here for constructions found on + // data file; 1 new construction of entry has one glazing system; + // 2 new constructions if entry has two glazing systems. + // Nov 2002, FW: skip read of mullion data line if one glazing system; + // add error messages for bad data; increase length of input line + // from 132 to 200 to handle case where Window5 puts in extra blanks + // in gas data line. + // Feb 2007, LKL: Add more checks on Window5DataFile + // Jan 2008, LKL: Change Edge/Cond ratio check. + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // Searches the WINDOW5 data file for a window with the name "DesiredConstructionName," + // which is the name of an idf Construction input using CONSTRUCTION FROM WINDOW5 DATA FILE. + // (The WINDOW5 data file contains data for one or more complete windows -- + // glazing, frame, mullion, and divider. + // WINDOW5 writes the data file for export to EnergyPlus so that an annual energy + // analysis can be done on exactly the same window without having to re-input into + // EnergyPlus.) + + // If a match is found, a Construction is created and the Material objects associated with + // the Construction are created. If there is an associated frame or + // divider in the Window5 data file for this Construction, a FrameAndDivider object will + // also be created. + + // If the window on the data file has two glazing systems, a second Construction (and its + // associated materials) corresponding to the second glazing system is created. + + // Using/Aliasing + using namespace DataStringGlobals; + using DataSystemVariables::CheckForActualFilePath; + using General::POLYF; // POLYF ! Polynomial in cosine of angle of incidence + + // SUBROUTINE PARAMETER DEFINITIONS: + Array1D_string const NumName(5, {"1", "2", "3", "4", "5"}); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int FileLineCount; // counter for number of lines read (used in some error messages) + Array1D_string DataLine(100); // Array of data lines + std::string WindowNameInW5DataFile; + std::string W5Name; + Array1D_string GasName(3); // Gas name from data file + std::string LayerName; // Layer name from data file + std::string MullionOrientation; // Horizontal, vertical or none + int LineNum; + Array1D_int NGlass(2); // Number of glass layers in glazing system + Array2D_int NumGases(4, 2); // Number of gases in each gap of a glazing system + Array2D_int MaterNumSysGlass(5, 2); // Material numbers for glazing system / glass combinations + Array2D_int MaterNumSysGap(4, 2); // Material numbers for glazing system / gap combinations + int TotMaterialsPrev; // Number of materials before adding ones from W5DataFile + int TotFrameDividerPrev; // Number of FrameAndDivider objects before adding ones from W5DataFile + Array1D_int NGaps(2); // Number of gaps in window construction + int NGlSys; // Number of glazing systems (normally 1, but 2 for mullioned window + // with two different glazing systems + int loop; // DO loop counter + int ILine; // Line counter + int ConstrNum; // Construction number + int IGlass; // Glass layer counter + int IGap; // Gap counter + int IGas; // Gas counter + // INTEGER :: ICoeff ! Gas property coefficient counter + int IGlSys; // Glazing system counter + int MaterNum; // Material number + int MatNum; + int FrDivNum; // FrameDivider number + Array1D WinHeight(2); // Height, width for glazing system (m) + Array1D WinWidth(2); + Array1D UValCenter(2); // Center of glass U-value (W/m2-K) for glazing system + Array1D SCCenter(2); // Center of glass shading coefficient for glazing system + Array1D SHGCCenter(2); // Center of glass solar heat gain coefficient for glazing system + Array1D TVisCenter(2); // Center of glass visible transmittance for glazing system + Array1D Tsol(11); // Solar transmittance vs incidence angle; diffuse trans. + Array2D AbsSol(11, 5); // Solar absorptance vs inc. angle in each glass layer + Array1D Rfsol(11); // Front solar reflectance vs inc. angle + Array1D Rbsol(11); // Back solar reflectance vs inc. angle + Array1D Tvis(11); // Visible transmittance vs inc. angle + Array1D Rfvis(11); // Front visible reflectance vs inc. angle + Array1D Rbvis(11); // Back visible reflectance vs inc. angle + Array1D CosPhiIndepVar(10); // Cosine of incidence angle from 0 to 90 deg in 10 deg increments + int IPhi; // Incidence angle counter + Real64 Phi; // Incidence angle (deg) + Array1D CosPhi(10); // Cosine of incidence angle + Array1D tsolFit(10); // Fitted solar transmittance vs incidence angle + Array1D tvisFit(10); // Fitted visible transmittance vs incidence angle + Array1D rfsolFit(10); // Fitted solar front reflectance vs incidence angle + Array2D solabsFit(5, 10); // Fitted solar absorptance vs incidence angle for each glass layer + Array1D_string DividerType(2); // Divider type: DividedLite or Suspended + Real64 FrameWidth; + Real64 MullionWidth; + Real64 FrameProjectionOut; + Real64 FrameProjectionIn; + Real64 FrameConductance; + Real64 FrEdgeToCenterGlCondRatio; + Real64 FrameSolAbsorp; + Real64 FrameVisAbsorp; + Real64 FrameEmis; + Array1D_int HorDividers(2); // For divider: number horizontal for each glazing system + Array1D_int VertDividers(2); // For divider: number vertical for each glazing system + Array1D DividerWidth(2); + Array1D DividerProjectionOut(2); + Array1D DividerProjectionIn(2); + Array1D DividerConductance(2); + Array1D DivEdgeToCenterGlCondRatio(2); + Array1D DividerSolAbsorp(2); + Array1D DividerVisAbsorp(2); + Array1D DividerEmis(2); + std::string::size_type endcol; + + // Object Data + + // In the following four gas-related data sets, the first + // index is gas type (1=air, 2=Argon, 3=Krypton, 4=Xenon) + // and the second index gives a,b,c in the expression + // property value = a + bT(K) + cT(K)**2, where T is mean + // gap temperature in deg K. + + ConstructionFound = false; + // ErrorsFound = .FALSE. + EOFonFile = false; + std::string contextString = "HeatBalanceManager::SearchWindow5DataFile: "; + + state.files.TempFullFilePath.filePath = CheckForActualFilePath(state, DesiredFilePath, contextString); + + // INQUIRE(FILE=TRIM(DesiredFileName), EXIST=exists) + if (state.files.TempFullFilePath.filePath.empty()) { + ShowFatalError(state, "Program terminates due to these conditions."); + } + + auto W5DataFile = state.files.TempFullFilePath.open(state, "SearchWindow5DataFile"); + auto NextLine = W5DataFile.readLine(); + endcol = len(NextLine.data); + if (endcol > 0) { + if (int(NextLine.data[endcol - 1]) == DataSystemVariables::iUnicode_end) { + ShowSevereError(state, + "SearchWindow5DataFile: For \"" + DesiredConstructionName + "\" in " + DesiredFilePath.string() + + " fiile, appears to be a Unicode or binary file."); + ShowContinueError(state, "...This file cannot be read by this program. Please save as PC or Unix file and try again"); + ShowFatalError(state, "Program terminates due to previous condition."); + } + } + W5DataFile.rewind(); + FileLineCount = 0; + + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + if (!has_prefixi(NextLine.data, "WINDOW5")) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Data File=" + DesiredFilePath.string()); + ShowFatalError( + state, "Error reading Window5 Data File: first word of window entry is \"" + NextLine.data.substr(0, 7) + "\", should be Window5."); + } + + Label10:; + for (LineNum = 2; LineNum <= 5; ++LineNum) { + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + DataLine(LineNum) = NextLine.data; + ++FileLineCount; + } + + // Get window name and check for match + W5Name = std::string{DataLine(4).substr(19)}; + WindowNameInW5DataFile = UtilityRoutines::MakeUPPERCase(W5Name); + if (DesiredConstructionName != WindowNameInW5DataFile) { + // Doesn't match; read through file until next window entry is found + Label20:; + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + if (!has_prefixi(NextLine.data, "WINDOW5")) goto Label20; + // Beginning of next window entry found + goto Label10; + } else { + // Match found + ConstructionFound = true; + + // Create Material:WindowGlass, Material:WindowGas, Construction + // and WindowFrameAndDividerObjects for this window + + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + bool error = false; + NGlSys = static_cast(UtilityRoutines::ProcessNumber(NextLine.data.substr(19), error)); + if (NGlSys <= 0 || NGlSys > 2 || error) { + ShowFatalError( + state, + format("Construction={} from the Window5 data file cannot be used: it has {} glazing systems; only 1 or 2 are allowed.", + DesiredConstructionName, + NGlSys)); + } + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + + const auto succeeded = readList(NextLine.data.substr(19), + WinHeight(IGlSys), + WinWidth(IGlSys), + NGlass(IGlSys), + UValCenter(IGlSys), + SCCenter(IGlSys), + SHGCCenter(IGlSys), + TVisCenter(IGlSys)); + if (!succeeded) { + ShowSevereError( + state, + format("HeatBalanceManager: SearchWindow5DataFile: Error in Read of glazing system values. For glazing system={}", IGlSys)); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount, NextLine.data.substr(0, 100))); + ErrorsFound = true; + } + if (WinHeight(IGlSys) == 0.0 || WinWidth(IGlSys) == 0.0) { + ShowSevereError(state, + format("HeatBalanceManager: SearchWindow5DataFile: Construction={} from the Window5 data file cannot be used: it " + "has window height or width = 0 for glazing system {}", + DesiredConstructionName, + IGlSys)); + ErrorsFound = true; + } + if (NGlass(IGlSys) <= 0 || NGlass(IGlSys) > 4) { + ShowSevereError(state, + format("HeatBalanceManager: SearchWindow5DataFile: Construction={} from the Window5 data file cannot be used: it " + "has 0 or more than 4 glass layers in glazing system {}", + DesiredConstructionName, + IGlSys)); + ErrorsFound = true; + } + if (UValCenter(IGlSys) <= 0.0) { + ShowSevereError(state, + format("HeatBalanceManager: SearchWindow5DataFile: Construction={} from the Window5 data file cannot be used: it " + "has Center-of-Glass U-value <= 0 in glazing system {}", + DesiredConstructionName, + IGlSys)); + ErrorsFound = true; + } + if (SCCenter(IGlSys) <= 0.0) { + ShowWarningError( + state, + format("HeatBalanceManager: SearchWindow5DataFile: Construction={} from the Window5 data file has flawed data: it " + "has a Shading Coefficient <= 0 in glazing system {}", + DesiredConstructionName, + IGlSys)); + } + if (SHGCCenter(IGlSys) <= 0.0) { + ShowWarningError( + state, + format("HeatBalanceManager: SearchWindow5DataFile: Construction={} from the Window5 data file has flawed data: it " + "has a SHGC <= 0 in glazing system {}", + DesiredConstructionName, + IGlSys)); + } + WinHeight(IGlSys) *= 0.001; + WinWidth(IGlSys) *= 0.001; + } + for (LineNum = 1; LineNum <= 11; ++LineNum) { + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + DataLine(LineNum) = NextLine.data; + } + + // Mullion width and orientation + MullionWidth = 0.0; + MullionOrientation = "Vertical"; + if (NGlSys == 2) { + error = false; + MullionWidth = UtilityRoutines::ProcessNumber(DataLine(10).substr(19), error); + if (error) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Mullion Width."); + ShowContinueError(state, + format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 10, DataLine(10).substr(0, 100))); + ErrorsFound = true; + } + MullionWidth *= 0.001; + MullionOrientation = UtilityRoutines::ProcessNumber(DataLine(10).substr(88), error); + if (error) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Mullion Orientation."); + ShowContinueError(state, + format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 10, DataLine(10).substr(0, 100))); + ErrorsFound = true; + } + } + + // Frame data; if there are two glazing systems, the frame is assumed to be + // the same for both. + FrameWidth = 0.0; + FrameProjectionOut = 0.0; + FrameProjectionIn = 0.0; + FrameConductance = 0.0; + FrEdgeToCenterGlCondRatio = 0.0; + FrameSolAbsorp = 0.0; + FrameVisAbsorp = 0.0; + FrameEmis = 0.0; + const bool succeeded = readList(DataLine(11).substr(19), + FrameWidth, + FrameProjectionOut, + FrameProjectionIn, + FrameConductance, + FrEdgeToCenterGlCondRatio, + FrameSolAbsorp, + FrameVisAbsorp, + FrameEmis); + if (!succeeded) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of frame data values."); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 11, DataLine(11).substr(0, 100))); + ErrorsFound = true; + } + if (FrameWidth > 0.0) { + if (FrameConductance <= 0.0) { + ShowSevereError(state, + "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + + " from the Window5 data file cannot be used: it has Frame Conductance <= 0.0"); + ErrorsFound = true; + } + // Relax this check for Window5 data: 1/28/2008. + // IF(FrEdgeToCenterGlCondRatio < 1.0) THEN + // CALL ShowSevereError(state, 'HeatBalanceManager: SearchWindow5DataFile: Construction='//TRIM(DesiredConstructionName)// + // & ' from the Window5 data file cannot be used: it has Frame Edge-of-Glass Conduction Ratio < 1.0') + // ErrorsFound = .TRUE. + // END IF + if (FrameSolAbsorp < 0.0 || FrameSolAbsorp > 1.0) { + ShowSevereError(state, + "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + + " from the Window5 data file cannot be used: it has Frame Solar Absorptance < 0.0 or > 1.0"); + ErrorsFound = true; + } + if (FrameEmis <= 0.0 || FrameEmis >= 1.0) { + ShowSevereError(state, + "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + + " from the Window5 data file cannot be used: it has Frame Emissivity <= 0.0 or >= 1.0"); + ErrorsFound = true; + } + } + FrameWidth *= 0.001; + FrameProjectionOut *= 0.001; + FrameProjectionIn *= 0.001; + FileLineCount += 11; + + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + + // Divider data for each glazing system + for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + + const bool dividerReadSucceeded = readList(NextLine.data.substr(19), + DividerWidth(IGlSys), + DividerProjectionOut(IGlSys), + DividerProjectionIn(IGlSys), + DividerConductance(IGlSys), + DivEdgeToCenterGlCondRatio(IGlSys), + DividerSolAbsorp(IGlSys), + DividerVisAbsorp(IGlSys), + DividerEmis(IGlSys), + DividerType(IGlSys), + HorDividers(IGlSys), + VertDividers(IGlSys)); + if (!dividerReadSucceeded) { + ShowSevereError( + state, + format("HeatBalanceManager: SearchWindow5DataFile: Error in Read of divider data values. For Glazing System={}", IGlSys)); + ShowContinueError(state, + format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 11, NextLine.data.substr(0, 100))); + ErrorsFound = true; + } + uppercase(DividerType(IGlSys)); + if (DividerWidth(IGlSys) > 0.0) { + if (HorDividers(IGlSys) == 0 && VertDividers(IGlSys) == 0) { + ShowSevereError(state, + "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + + " from the Window5 data file cannot be used:"); + ShowContinueError( + state, format("glazing system {} has a divider but number of horizontal and vertical divider elements = 0", IGlSys)); + ErrorsFound = true; + } + if (DividerConductance(IGlSys) <= 0.0) { + ShowSevereError(state, + "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + + " from the Window5 data file cannot be used:"); + ShowContinueError(state, format("glazing system {} has Divider Conductance <= 0.0", IGlSys)); + ErrorsFound = true; + } + if (DivEdgeToCenterGlCondRatio(IGlSys) < 1.0) { + ShowSevereError(state, + "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + + " from the Window5 data file cannot be used:"); + ShowContinueError(state, format("glazing system {} has Divider Edge-Of-Glass Conduction Ratio < 1.0", IGlSys)); + ErrorsFound = true; + } + if (DividerSolAbsorp(IGlSys) < 0.0 || DividerSolAbsorp(IGlSys) > 1.0) { + ShowSevereError(state, + "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + + " from the Window5 data file cannot be used:"); + ShowContinueError(state, format("glazing system {} has Divider Solar Absorptance < 0.0 or > 1.0", IGlSys)); + ErrorsFound = true; + } + if (DividerEmis(IGlSys) <= 0.0 || DividerEmis(IGlSys) >= 1.0) { + ShowSevereError(state, + "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + + " from the Window5 data file cannot be used:"); + ShowContinueError(state, format("glazing system {} has Divider Emissivity <= 0.0 or >= 1.0", IGlSys)); + ErrorsFound = true; + } + if (DividerType(IGlSys) != "DIVIDEDLITE" && DividerType(IGlSys) != "SUSPENDED") { + ShowSevereError(state, + "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + + " from the Window5 data file cannot be used:"); + ShowContinueError( + state, + format("glazing system {} has Divider Type = {}; it should be DIVIDEDLITE or SUSPENDED.", IGlSys, DividerType(IGlSys))); + ErrorsFound = true; + } + } + DividerWidth(IGlSys) *= 0.001; + if (DividerType(IGlSys) == "DIVIDEDLITE") { + DividerProjectionOut(IGlSys) *= 0.001; + DividerProjectionIn(IGlSys) *= 0.001; + } else { + DividerProjectionOut(IGlSys) = 0.0; + DividerProjectionIn(IGlSys) = 0.0; + } + } + + if (ErrorsFound) + ShowFatalError(state, + "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + + " from the Window5 data file cannot be used because of above errors"); + + TotMaterialsPrev = state.dataHeatBal->TotMaterials; + for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { + NGaps(IGlSys) = NGlass(IGlSys) - 1; + state.dataHeatBal->TotMaterials += NGlass(IGlSys) + NGaps(IGlSys); + } + + // Create Material objects + + // reallocate Material type + + state.dataMaterial->Material.redimension(state.dataHeatBal->TotMaterials); + state.dataHeatBal->NominalR.redimension(state.dataHeatBal->TotMaterials, 0.0); + + // Initialize new materials + for (loop = TotMaterialsPrev + 1; loop <= state.dataHeatBal->TotMaterials; ++loop) { + state.dataMaterial->Material(loop).Name = ""; + state.dataMaterial->Material(loop).Group = DataHeatBalance::MaterialGroup::Invalid; + state.dataMaterial->Material(loop).Roughness = DataSurfaces::SurfaceRoughness::Invalid; + state.dataMaterial->Material(loop).Conductivity = 0.0; + state.dataMaterial->Material(loop).Density = 0.0; + state.dataMaterial->Material(loop).IsoMoistCap = 0.0; + state.dataMaterial->Material(loop).Porosity = 0.0; + state.dataMaterial->Material(loop).Resistance = 0.0; + state.dataMaterial->Material(loop).SpecHeat = 0.0; + state.dataMaterial->Material(loop).ThermGradCoef = 0.0; + state.dataMaterial->Material(loop).Thickness = 0.0; + state.dataMaterial->Material(loop).VaporDiffus = 0.0; + state.dataMaterial->Material(loop).AbsorpSolar = 0.0; + state.dataMaterial->Material(loop).AbsorpThermal = 0.0; + state.dataMaterial->Material(loop).AbsorpVisible = 0.0; + state.dataMaterial->Material(loop).ReflectShade = 0.0; + state.dataMaterial->Material(loop).Trans = 0.0; + state.dataMaterial->Material(loop).ReflectShadeVis = 0.0; + state.dataMaterial->Material(loop).TransVis = 0.0; + state.dataMaterial->Material(loop).GlassTransDirtFactor = 1.0; + state.dataMaterial->Material(loop).SolarDiffusing = false; + state.dataMaterial->Material(loop).AbsorpThermalBack = 0.0; + state.dataMaterial->Material(loop).AbsorpThermalFront = 0.0; + state.dataMaterial->Material(loop).ReflectSolBeamBack = 0.0; + state.dataMaterial->Material(loop).ReflectSolBeamFront = 0.0; + state.dataMaterial->Material(loop).ReflectSolDiffBack = 0.0; + state.dataMaterial->Material(loop).ReflectSolDiffFront = 0.0; + state.dataMaterial->Material(loop).ReflectVisBeamBack = 0.0; + state.dataMaterial->Material(loop).ReflectVisBeamFront = 0.0; + state.dataMaterial->Material(loop).ReflectVisDiffBack = 0.0; + state.dataMaterial->Material(loop).ReflectVisDiffFront = 0.0; + state.dataMaterial->Material(loop).TransSolBeam = 0.0; + state.dataMaterial->Material(loop).TransThermal = 0.0; + state.dataMaterial->Material(loop).TransVisBeam = 0.0; + state.dataMaterial->Material(loop).GlassSpectralDataPtr = 0; + state.dataMaterial->Material(loop).NumberOfGasesInMixture = 0; + state.dataMaterial->Material(loop).GasCon = 0.0; + state.dataMaterial->Material(loop).GasVis = 0.0; + state.dataMaterial->Material(loop).GasCp = 0.0; + state.dataMaterial->Material(loop).GasType = 0; + state.dataMaterial->Material(loop).GasWght = 0.0; + state.dataMaterial->Material(loop).GasSpecHeatRatio = 0.0; + state.dataMaterial->Material(loop).GasFract = 0.0; + state.dataMaterial->Material(loop).WinShadeToGlassDist = 0.0; + state.dataMaterial->Material(loop).WinShadeTopOpeningMult = 0.0; + state.dataMaterial->Material(loop).WinShadeBottomOpeningMult = 0.0; + state.dataMaterial->Material(loop).WinShadeLeftOpeningMult = 0.0; + state.dataMaterial->Material(loop).WinShadeRightOpeningMult = 0.0; + state.dataMaterial->Material(loop).WinShadeAirFlowPermeability = 0.0; + state.dataMaterial->Material(loop).BlindDataPtr = 0; + state.dataMaterial->Material(loop).EMPDmu = 0.0; + state.dataMaterial->Material(loop).MoistACoeff = 0.0; + state.dataMaterial->Material(loop).MoistBCoeff = 0.0; + state.dataMaterial->Material(loop).MoistCCoeff = 0.0; + state.dataMaterial->Material(loop).MoistDCoeff = 0.0; + state.dataMaterial->Material(loop).EMPDSurfaceDepth = 0.0; + state.dataMaterial->Material(loop).EMPDDeepDepth = 0.0; + state.dataMaterial->Material(loop).EMPDmuCoating = 0.0; + state.dataMaterial->Material(loop).EMPDCoatingThickness = 0.0; + } + + // Glass objects + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + MaterNum = TotMaterialsPrev; + for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { + for (IGlass = 1; IGlass <= NGlass(IGlSys); ++IGlass) { + ++MaterNum; + MaterNumSysGlass(IGlass, IGlSys) = MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGlass; + NextLine = W5DataFile.readLine(); + ++FileLineCount; + + readList(NextLine.data.substr(25), + state.dataMaterial->Material(MaterNum).Thickness, + state.dataMaterial->Material(MaterNum).Conductivity, + state.dataMaterial->Material(MaterNum).Trans, + state.dataMaterial->Material(MaterNum).ReflectSolBeamFront, + state.dataMaterial->Material(MaterNum).ReflectSolBeamBack, + state.dataMaterial->Material(MaterNum).TransVis, + state.dataMaterial->Material(MaterNum).ReflectVisBeamFront, + state.dataMaterial->Material(MaterNum).ReflectVisBeamBack, + state.dataMaterial->Material(MaterNum).TransThermal, + state.dataMaterial->Material(MaterNum).AbsorpThermalFront, + state.dataMaterial->Material(MaterNum).AbsorpThermalBack, + LayerName); + + state.dataMaterial->Material(MaterNum).Thickness *= 0.001; + if (state.dataMaterial->Material(MaterNum).Thickness <= 0.0) { + } + if (NGlSys == 1) { + state.dataMaterial->Material(MaterNum).Name = "W5:" + DesiredConstructionName + ":GLASS" + NumName(IGlass); + } else { + state.dataMaterial->Material(MaterNum).Name = + "W5:" + DesiredConstructionName + ':' + NumName(IGlSys) + ":GLASS" + NumName(IGlass); + } + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VerySmooth; + state.dataMaterial->Material(MaterNum).AbsorpThermal = state.dataMaterial->Material(MaterNum).AbsorpThermalBack; + if (state.dataMaterial->Material(MaterNum).Thickness <= 0.0) { + ShowSevereError(state, + "SearchWindow5DataFile: Material=\"" + state.dataMaterial->Material(MaterNum).Name + + "\" has thickness of 0.0. Will be set to thickness = .001 but inaccuracies may result."); + ShowContinueError(state, "Line being read=" + NextLine.data); + ShowContinueError(state, "Thickness field starts at column 26=" + NextLine.data.substr(25)); + state.dataMaterial->Material(MaterNum).Thickness = 0.001; + } + } + } + + // Gap objects + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { + for (IGap = 1; IGap <= NGaps(IGlSys); ++IGap) { + ++MaterNum; + MaterNumSysGap(IGap, IGlSys) = MaterNum; + NextLine = W5DataFile.readLine(); + ++FileLineCount; + readList(NextLine.data.substr(23), state.dataMaterial->Material(MaterNum).Thickness, NumGases(IGap, IGlSys)); + if (NGlSys == 1) { + state.dataMaterial->Material(MaterNum).Name = "W5:" + DesiredConstructionName + ":GAP" + NumName(IGap); + } else { + state.dataMaterial->Material(MaterNum).Name = + "W5:" + DesiredConstructionName + ':' + NumName(IGlSys) + ":GAP" + NumName(IGap); + } + state.dataMaterial->Material(MaterNum).Thickness *= 0.001; + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; // Unused + } + } + + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { + for (IGap = 1; IGap <= NGaps(IGlSys); ++IGap) { + MaterNum = MaterNumSysGap(IGap, IGlSys); + state.dataMaterial->Material(MaterNum).NumberOfGasesInMixture = NumGases(IGap, IGlSys); + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGas; + if (NumGases(IGap, IGlSys) > 1) state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGasMixture; + for (IGas = 1; IGas <= NumGases(IGap, IGlSys); ++IGas) { + NextLine = W5DataFile.readLine(); + ++FileLineCount; + readList(NextLine.data.substr(19), + GasName(IGas), + state.dataMaterial->Material(MaterNum).GasFract(IGas), + state.dataMaterial->Material(MaterNum).GasWght(IGas), + state.dataMaterial->Material(MaterNum).GasCon(_, IGas), + state.dataMaterial->Material(MaterNum).GasVis(_, IGas), + state.dataMaterial->Material(MaterNum).GasCp(_, IGas)); + // Nominal resistance of gap at room temperature (based on first gas in mixture) + state.dataHeatBal->NominalR(MaterNum) = + state.dataMaterial->Material(MaterNum).Thickness / + (state.dataMaterial->Material(MaterNum).GasCon(1, 1) + state.dataMaterial->Material(MaterNum).GasCon(2, 1) * 300.0 + + state.dataMaterial->Material(MaterNum).GasCon(3, 1) * 90000.0); + } + } + } + + // Construction objects + + // reallocate Construct types + state.dataHeatBal->TotConstructs += NGlSys; + state.dataConstruction->Construct.redimension(state.dataHeatBal->TotConstructs); + state.dataHeatBal->NominalRforNominalUCalculation.redimension(state.dataHeatBal->TotConstructs); + state.dataHeatBal->NominalU.redimension(state.dataHeatBal->TotConstructs); + state.dataHeatBal->NominalUBeforeAdjusted.redimension(state.dataHeatBal->TotConstructs); + state.dataHeatBal->CoeffAdjRatio.redimension(state.dataHeatBal->TotConstructs) = 1.0; + + // these Construct arrays dimensioned based on MaxSolidWinLayers + for (int i = (state.dataHeatBal->TotConstructs - NGlSys + 1); i <= state.dataHeatBal->TotConstructs; ++i) { + auto &e(state.dataConstruction->Construct(i)); + e.setArraysBasedOnMaxSolidWinLayers(state); + } + + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + + // Pre-calculate constants + for (IPhi = 1; IPhi <= 10; ++IPhi) { + CosPhiIndepVar(IPhi) = std::cos((IPhi - 1) * 10.0 * DataGlobalConstants::DegToRadians); + } + + // Pre-calculate constants + for (IPhi = 1; IPhi <= 10; ++IPhi) { + Phi = double(IPhi - 1) * 10.0; + CosPhi(IPhi) = std::cos(Phi * DataGlobalConstants::DegToRadians); + if (std::abs(CosPhi(IPhi)) < 0.0001) CosPhi(IPhi) = 0.0; + } + + for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { + ConstrNum = state.dataHeatBal->TotConstructs - NGlSys + IGlSys; + if (IGlSys == 1) { + state.dataConstruction->Construct(ConstrNum).Name = DesiredConstructionName; + } else { + state.dataConstruction->Construct(ConstrNum).Name = DesiredConstructionName + ":2"; + } + for (loop = 1; loop <= Construction::MaxLayersInConstruct; ++loop) { + state.dataConstruction->Construct(ConstrNum).LayerPoint(loop) = 0; + } + state.dataConstruction->Construct(ConstrNum).InsideAbsorpSolar = 0.0; + state.dataConstruction->Construct(ConstrNum).OutsideAbsorpSolar = 0.0; + state.dataConstruction->Construct(ConstrNum).DayltPropPtr = 0; + state.dataConstruction->Construct(ConstrNum).CTFCross = 0.0; + state.dataConstruction->Construct(ConstrNum).CTFFlux = 0.0; + state.dataConstruction->Construct(ConstrNum).CTFInside = 0.0; + state.dataConstruction->Construct(ConstrNum).CTFOutside = 0.0; + state.dataConstruction->Construct(ConstrNum).CTFSourceIn = 0.0; + state.dataConstruction->Construct(ConstrNum).CTFSourceOut = 0.0; + state.dataConstruction->Construct(ConstrNum).CTFTimeStep = 0.0; + state.dataConstruction->Construct(ConstrNum).CTFTSourceOut = 0.0; + state.dataConstruction->Construct(ConstrNum).CTFTSourceIn = 0.0; + state.dataConstruction->Construct(ConstrNum).CTFTSourceQ = 0.0; + state.dataConstruction->Construct(ConstrNum).CTFTUserOut = 0.0; + state.dataConstruction->Construct(ConstrNum).CTFTUserIn = 0.0; + state.dataConstruction->Construct(ConstrNum).CTFTUserSource = 0.0; + state.dataConstruction->Construct(ConstrNum).NumHistories = 0; + state.dataConstruction->Construct(ConstrNum).NumCTFTerms = 0; + state.dataConstruction->Construct(ConstrNum).UValue = 0.0; + state.dataConstruction->Construct(ConstrNum).SourceSinkPresent = false; + state.dataConstruction->Construct(ConstrNum).SolutionDimensions = 0; + state.dataConstruction->Construct(ConstrNum).SourceAfterLayer = 0; + state.dataConstruction->Construct(ConstrNum).TempAfterLayer = 0; + state.dataConstruction->Construct(ConstrNum).ThicknessPerpend = 0.0; + state.dataConstruction->Construct(ConstrNum).AbsDiff = 0.0; + state.dataConstruction->Construct(ConstrNum).AbsDiffBack = 0.0; + state.dataConstruction->Construct(ConstrNum).AbsDiffShade = 0.0; + state.dataConstruction->Construct(ConstrNum).AbsDiffBackShade = 0.0; + state.dataConstruction->Construct(ConstrNum).ShadeAbsorpThermal = 0.0; + state.dataConstruction->Construct(ConstrNum).AbsBeamShadeCoef = 0.0; + state.dataConstruction->Construct(ConstrNum).AbsDiffIn = 0.0; + state.dataConstruction->Construct(ConstrNum).AbsDiffOut = 0.0; + state.dataConstruction->Construct(ConstrNum).TransDiff = 0.0; + state.dataConstruction->Construct(ConstrNum).TransDiffVis = 0.0; + state.dataConstruction->Construct(ConstrNum).ReflectSolDiffBack = 0.0; + state.dataConstruction->Construct(ConstrNum).ReflectSolDiffFront = 0.0; + state.dataConstruction->Construct(ConstrNum).ReflectVisDiffBack = 0.0; + state.dataConstruction->Construct(ConstrNum).ReflectVisDiffFront = 0.0; + state.dataConstruction->Construct(ConstrNum).TransSolBeamCoef = 0.0; + state.dataConstruction->Construct(ConstrNum).TransVisBeamCoef = 0.0; + state.dataConstruction->Construct(ConstrNum).ReflSolBeamFrontCoef = 0.0; + state.dataConstruction->Construct(ConstrNum).ReflSolBeamBackCoef = 0.0; + state.dataConstruction->Construct(ConstrNum).W5FrameDivider = 0; + state.dataConstruction->Construct(ConstrNum).TotLayers = NGlass(IGlSys) + NGaps(IGlSys); + state.dataConstruction->Construct(ConstrNum).TotGlassLayers = NGlass(IGlSys); + state.dataConstruction->Construct(ConstrNum).TotSolidLayers = NGlass(IGlSys); + + for (int Layer = 1; Layer <= state.dataHeatBal->MaxSolidWinLayers; ++Layer) { + for (int index = 1; index <= DataSurfaces::MaxPolyCoeff; ++index) { + state.dataConstruction->Construct(ConstrNum).AbsBeamCoef(Layer)(index) = 0.0; + state.dataConstruction->Construct(ConstrNum).AbsBeamBackCoef(Layer)(index) = 0.0; + } + } + + for (IGlass = 1; IGlass <= NGlass(IGlSys); ++IGlass) { + state.dataConstruction->Construct(ConstrNum).LayerPoint(2 * IGlass - 1) = MaterNumSysGlass(IGlass, IGlSys); + if (IGlass < NGlass(IGlSys)) state.dataConstruction->Construct(ConstrNum).LayerPoint(2 * IGlass) = MaterNumSysGap(IGlass, IGlSys); + } + + state.dataConstruction->Construct(ConstrNum).OutsideRoughness = DataSurfaces::SurfaceRoughness::VerySmooth; + state.dataConstruction->Construct(ConstrNum).InsideAbsorpThermal = + state.dataMaterial->Material(TotMaterialsPrev + NGlass(IGlSys)).AbsorpThermalBack; + state.dataConstruction->Construct(ConstrNum).OutsideAbsorpThermal = + state.dataMaterial->Material(TotMaterialsPrev + 1).AbsorpThermalFront; + state.dataConstruction->Construct(ConstrNum).TypeIsWindow = true; + state.dataConstruction->Construct(ConstrNum).FromWindow5DataFile = true; + state.dataConstruction->Construct(ConstrNum).W5FileGlazingSysHeight = WinHeight(IGlSys); + state.dataConstruction->Construct(ConstrNum).W5FileGlazingSysWidth = WinWidth(IGlSys); + if (UtilityRoutines::SameString(MullionOrientation, "Vertical")) { + state.dataConstruction->Construct(ConstrNum).W5FileMullionOrientation = DataWindowEquivalentLayer::Orientation::Vertical; + } else if (UtilityRoutines::SameString(MullionOrientation, "Horizontal")) { + state.dataConstruction->Construct(ConstrNum).W5FileMullionOrientation = DataWindowEquivalentLayer::Orientation::Horizontal; + } else { + } + state.dataConstruction->Construct(ConstrNum).W5FileMullionWidth = MullionWidth; + + // Fill Construct with system transmission, reflection and absorption properties + + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + if (IGlSys == 1) { + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + } + NextLine = W5DataFile.readLine(); + if (NextLine.eof) goto Label1000; + ++FileLineCount; + if (!readItem(NextLine.data.substr(5), Tsol)) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of TSol values."); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount, NextLine.data.substr(0, 100))); + ErrorsFound = true; + } else if (any_lt(Tsol, 0.0) || any_gt(Tsol, 1.0)) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of TSol values. (out of range [0,1])"); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount, NextLine.data.substr(0, 100))); + ErrorsFound = true; + } + for (IGlass = 1; IGlass <= NGlass(IGlSys); ++IGlass) { + NextLine = W5DataFile.readLine(); + ++FileLineCount; + if (!readItem(NextLine.data.substr(5), AbsSol(_, IGlass))) { + ShowSevereError(state, + format("HeatBalanceManager: SearchWindow5DataFile: Error in Read of AbsSol values. For Glass={}", IGlass)); + ShowContinueError(state, + format("Line (~{}) in error (first 100 characters)={}", FileLineCount, NextLine.data.substr(0, 100))); + ErrorsFound = true; + } else if (any_lt(AbsSol(_, IGlass), 0.0) || any_gt(AbsSol(_, IGlass), 1.0)) { + ShowSevereError( + state, + format("HeatBalanceManager: SearchWindow5DataFile: Error in Read of AbsSol values. (out of range [0,1]) For Glass={}", + IGlass)); + ShowContinueError(state, + format("Line (~{}) in error (first 100 characters)={}", FileLineCount, NextLine.data.substr(0, 100))); + ErrorsFound = true; + } + } + for (ILine = 1; ILine <= 5; ++ILine) { + NextLine = W5DataFile.readLine(); + DataLine(ILine) = NextLine.data; + } + + if (!readItem(DataLine(1).substr(5), Rfsol)) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of RfSol values."); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 1, DataLine(1).substr(0, 100))); + ErrorsFound = true; + } else if (any_lt(Rfsol, 0.0) || any_gt(Rfsol, 1.0)) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of RfSol values. (out of range [0,1])"); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 1, DataLine(1).substr(0, 100))); + ErrorsFound = true; + } + + if (!readItem(DataLine(2).substr(5), Rbsol)) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of RbSol values."); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 2, DataLine(2).substr(0, 100))); + ErrorsFound = true; + } else if (any_lt(Rbsol, 0.0) || any_gt(Rbsol, 1.0)) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of RbSol values. (out of range [0,1])"); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 2, DataLine(2).substr(0, 100))); + ErrorsFound = true; + } + if (!readItem(DataLine(3).substr(5), Tvis)) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Tvis values."); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 3, DataLine(3).substr(0, 100))); + ErrorsFound = true; + } else if (any_lt(Tvis, 0.0) || any_gt(Tvis, 1.0)) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Tvis values. (out of range [0,1])"); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 3, DataLine(3).substr(0, 100))); + ErrorsFound = true; + } + if (!readItem(DataLine(4).substr(5), Rfvis)) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Rfvis values."); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 4, DataLine(4).substr(0, 100))); + ErrorsFound = true; + } else if (any_lt(Rfvis, 0.0) || any_gt(Rfvis, 1.0)) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Rfvis values. (out of range [0,1])"); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 4, DataLine(4).substr(0, 100))); + ErrorsFound = true; + } + if (!readItem(DataLine(5).substr(5), Rbvis)) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Rbvis values."); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 5, DataLine(5).substr(0, 100))); + ErrorsFound = true; + } else if (any_lt(Rbvis, 0.0) || any_gt(Rbvis, 1.0)) { + ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Rbvis values. (out of range [0,1])"); + ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 5, DataLine(5).substr(0, 100))); + ErrorsFound = true; + } + FileLineCount += 5; + + if (ErrorsFound) + ShowFatalError(state, + "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + + " from the Window5 data file cannot be used because of above errors"); + + // Hemis + state.dataConstruction->Construct(ConstrNum).TransDiff = Tsol(11); + state.dataConstruction->Construct(ConstrNum).TransDiffVis = Tvis(11); + state.dataConstruction->Construct(ConstrNum).ReflectSolDiffFront = Rfsol(11); + state.dataConstruction->Construct(ConstrNum).ReflectSolDiffBack = Rbsol(11); + state.dataConstruction->Construct(ConstrNum).ReflectVisDiffFront = Rfvis(11); + state.dataConstruction->Construct(ConstrNum).ReflectVisDiffBack = Rbvis(11); + + W5LsqFit(CosPhiIndepVar, Tsol, 6, 1, 10, state.dataConstruction->Construct(ConstrNum).TransSolBeamCoef); + W5LsqFit(CosPhiIndepVar, Tvis, 6, 1, 10, state.dataConstruction->Construct(ConstrNum).TransVisBeamCoef); + W5LsqFit(CosPhiIndepVar, Rfsol, 6, 1, 10, state.dataConstruction->Construct(ConstrNum).ReflSolBeamFrontCoef); + for (IGlass = 1; IGlass <= NGlass(IGlSys); ++IGlass) { + W5LsqFit(CosPhiIndepVar, AbsSol(_, IGlass), 6, 1, 10, state.dataConstruction->Construct(ConstrNum).AbsBeamCoef(IGlass)); + } + + // For comparing fitted vs. input distribution in incidence angle + for (IPhi = 1; IPhi <= 10; ++IPhi) { + tsolFit(IPhi) = POLYF(CosPhi(IPhi), state.dataConstruction->Construct(ConstrNum).TransSolBeamCoef); + tvisFit(IPhi) = POLYF(CosPhi(IPhi), state.dataConstruction->Construct(ConstrNum).TransVisBeamCoef); + rfsolFit(IPhi) = POLYF(CosPhi(IPhi), state.dataConstruction->Construct(ConstrNum).ReflSolBeamFrontCoef); + for (IGlass = 1; IGlass <= NGlass(IGlSys); ++IGlass) { + solabsFit(IGlass, IPhi) = POLYF(CosPhi(IPhi), state.dataConstruction->Construct(ConstrNum).AbsBeamCoef(IGlass)); + } + } + // end + + // NominalRforNominalUCalculation of this construction (actually the total resistance of all of its layers; gas layer + // conductivity here ignores convective effects in gap.) + state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) = 0.0; + for (loop = 1; loop <= NGlass(IGlSys) + NGaps(IGlSys); ++loop) { + MatNum = state.dataConstruction->Construct(ConstrNum).LayerPoint(loop); + if (state.dataMaterial->Material(MatNum).Group == DataHeatBalance::MaterialGroup::WindowGlass) { + state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) += + state.dataMaterial->Material(MatNum).Thickness / state.dataMaterial->Material(MatNum).Conductivity; + } else if (state.dataMaterial->Material(MatNum).Group == DataHeatBalance::MaterialGroup::WindowGas || + state.dataMaterial->Material(MatNum).Group == DataHeatBalance::MaterialGroup::WindowGasMixture) { + // If mixture, use conductivity of first gas in mixture + state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) += + state.dataMaterial->Material(MatNum).Thickness / + (state.dataMaterial->Material(MatNum).GasCon(1, 1) + state.dataMaterial->Material(MatNum).GasCon(2, 1) * 300.0 + + state.dataMaterial->Material(MatNum).GasCon(3, 1) * 90000.0); + } + } + + } // End of loop over glazing systems + + // WindowFrameAndDivider objects + + TotFrameDividerPrev = state.dataHeatBal->TotFrameDivider; + for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { + if (FrameWidth > 0.0 || DividerWidth(IGlSys) > 0.0) { + ++state.dataHeatBal->TotFrameDivider; + state.dataConstruction->Construct(state.dataHeatBal->TotConstructs - NGlSys + IGlSys).W5FrameDivider = + state.dataHeatBal->TotFrameDivider; + } + } + + if (state.dataHeatBal->TotFrameDivider > TotFrameDividerPrev) { + state.dataSurface->FrameDivider.redimension(state.dataHeatBal->TotFrameDivider); + } + + for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { + if (FrameWidth > 0.0 || DividerWidth(IGlSys) > 0.0) { + FrDivNum = state.dataConstruction->Construct(state.dataHeatBal->TotConstructs - NGlSys + IGlSys).W5FrameDivider; + state.dataSurface->FrameDivider(FrDivNum).FrameWidth = FrameWidth; + state.dataSurface->FrameDivider(FrDivNum).FrameProjectionOut = FrameProjectionOut; + state.dataSurface->FrameDivider(FrDivNum).FrameProjectionIn = FrameProjectionIn; + state.dataSurface->FrameDivider(FrDivNum).FrameConductance = FrameConductance; + state.dataSurface->FrameDivider(FrDivNum).FrEdgeToCenterGlCondRatio = FrEdgeToCenterGlCondRatio; + state.dataSurface->FrameDivider(FrDivNum).FrameSolAbsorp = FrameSolAbsorp; + state.dataSurface->FrameDivider(FrDivNum).FrameVisAbsorp = FrameVisAbsorp; + state.dataSurface->FrameDivider(FrDivNum).FrameEmis = FrameEmis; + state.dataSurface->FrameDivider(FrDivNum).FrameEdgeWidth = 0.06355; // 2.5 in + if (UtilityRoutines::SameString(MullionOrientation, "Vertical")) { + state.dataSurface->FrameDivider(FrDivNum).MullionOrientation = DataWindowEquivalentLayer::Orientation::Vertical; + } else if (UtilityRoutines::SameString(MullionOrientation, "Horizontal")) { + state.dataSurface->FrameDivider(FrDivNum).MullionOrientation = DataWindowEquivalentLayer::Orientation::Horizontal; + } + if (UtilityRoutines::SameString(DividerType(IGlSys), "DividedLite")) { + state.dataSurface->FrameDivider(FrDivNum).DividerType = DataSurfaces::FrameDividerType::DividedLite; + } else if (UtilityRoutines::SameString(DividerType(IGlSys), "Suspended")) { + state.dataSurface->FrameDivider(FrDivNum).DividerType = DataSurfaces::FrameDividerType::Suspended; + } + state.dataSurface->FrameDivider(FrDivNum).DividerWidth = DividerWidth(IGlSys); + state.dataSurface->FrameDivider(FrDivNum).HorDividers = HorDividers(IGlSys); + state.dataSurface->FrameDivider(FrDivNum).VertDividers = VertDividers(IGlSys); + state.dataSurface->FrameDivider(FrDivNum).DividerProjectionOut = DividerProjectionOut(IGlSys); + state.dataSurface->FrameDivider(FrDivNum).DividerProjectionIn = DividerProjectionIn(IGlSys); + state.dataSurface->FrameDivider(FrDivNum).DividerConductance = DividerConductance(IGlSys); + state.dataSurface->FrameDivider(FrDivNum).DivEdgeToCenterGlCondRatio = DivEdgeToCenterGlCondRatio(IGlSys); + state.dataSurface->FrameDivider(FrDivNum).DividerSolAbsorp = DividerSolAbsorp(IGlSys); + state.dataSurface->FrameDivider(FrDivNum).DividerVisAbsorp = DividerVisAbsorp(IGlSys); + state.dataSurface->FrameDivider(FrDivNum).DividerEmis = DividerEmis(IGlSys); + state.dataSurface->FrameDivider(FrDivNum).DividerEdgeWidth = 0.06355; // 2.5 in + if (NGlSys == 1) { + state.dataSurface->FrameDivider(FrDivNum).Name = "W5:" + DesiredConstructionName; + } else { + state.dataSurface->FrameDivider(FrDivNum).Name = "W5:" + DesiredConstructionName + ':' + NumName(IGlSys); + } + } + } + + if (FrameWidth > 0.0 && DividerWidth(1) > 0.0) { + DisplayString(state, "--Construction and associated frame and divider found"); + } else if (FrameWidth > 0.0) { + DisplayString(state, "--Construction and associated frame found"); + } else if (DividerWidth(1) > 0.0) { + DisplayString(state, "--Construction and associated divider found"); + } else { + DisplayString(state, "--Construction without frame or divider found"); + } + } + + return; + + Label1000:; + EOFonFile = true; + } + + void SetStormWindowControl(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Winkelmann + // DATE WRITTEN Jan 2004 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // Sets the storm window flag for each window, which is: + // -1: if storm window is not applicable (this will always be the value for interior + // windows since storm windows can only be applied to exterior windows + // 0: if the window has a storm window but it is off + // 1: if the window has a storm window and it is on + + // A "storm window" is a single layer of exterior glass separated from the main window by air gap. + // Whether the storm window is in place is determined by the following values, which + // which are specified in the Storm Window object for the window: + // -Month that Storm Window Is Put On + // -Day of Month that Storm Window Is Put On + // -Month that Storm Window Is Taken Off + // -Day of Month that Storm Window Is Taken Off + + // Using/Aliasing + using General::BetweenDates; + + int SurfNum; // Surface number + int StormWinNum; // Number of storm window object + int StormWinFlag; // Storm window flag; this routine sets the following values: + // 0: if the storm window is off this time step + // 1: if the storm window is on this time step + int DateOff; // Date Off for calculation + + state.dataHeatBal->StormWinChangeThisDay = false; + + for (StormWinNum = 1; StormWinNum <= state.dataSurface->TotStormWin; ++StormWinNum) { + SurfNum = state.dataSurface->StormWindow(StormWinNum).BaseWindowNum; + state.dataSurface->SurfWinStormWinFlagPrevDay(SurfNum) = state.dataSurface->SurfWinStormWinFlag(SurfNum); + DateOff = state.dataSurface->StormWindow(StormWinNum).DateOff - 1; + // Note: Dateon = Dateoff is not allowed and will have produced an error in getinput. + if (DateOff == 0) DateOff = 366; + if (BetweenDates(state.dataEnvrn->DayOfYear_Schedule, state.dataSurface->StormWindow(StormWinNum).DateOn, DateOff)) { + StormWinFlag = 1; + } else { + StormWinFlag = 0; + } + state.dataSurface->SurfWinStormWinFlag(SurfNum) = StormWinFlag; + if (state.dataGlobal->BeginSimFlag) state.dataSurface->SurfWinStormWinFlagPrevDay(SurfNum) = StormWinFlag; + if (state.dataSurface->SurfWinStormWinFlag(SurfNum) != state.dataSurface->SurfWinStormWinFlagPrevDay(SurfNum)) + state.dataHeatBal->StormWinChangeThisDay = true; + } + } + + void CreateFCfactorConstructions(EnergyPlusData &state, + int &ConstrNum, // Counter for Constructions + bool &ErrorsFound // If errors found in input + ) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Tianzhen Hong + // DATE WRITTEN July 2009 + // MODIFIED + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine goes through each construction defined with Ffactor or Cfactor method, + // and creates a construction (concrete + insulation) used in the heat transfer calculation. + // This subroutine only gets called once in the GetConstructionData subroutine + + // METHODOLOGY EMPLOYED: + // na + + // REFERENCES: + // na + + // Using/Aliasing + using namespace DataStringGlobals; + + // Locals + // SUBROUTINE ARGUMENT DEFINITIONS: + + // SUBROUTINE PARAMETER DEFINITIONS: + + // ASHRAE Handbook Fundamental 2005 + // Thermal resistance of the inside air film, m2.K/W. Average of 0.14 (heat flow up) and 0.11 (heat flow down) + Real64 constexpr Rfilm_in(0.125); + // Thermal resistance of the outside air film used in calculating the Ffactor, m2.K/W. 0.17/5.678 + Real64 constexpr Rfilm_out(0.03); + + // INTERFACE BLOCK SPECIFICATIONS: + // na + + // DERIVED TYPE DEFINITIONS: + // na + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int ConstructNumAlpha; // Number of construction alpha names being passed + int DummyNumProp; // dummy variable for properties being passed + int IOStat; // IO Status when calling get input subroutine + Array1D_string ConstructAlphas(1); // Construction Alpha names defined + Array1D DummyProps(4); // Temporary array to transfer construction properties + int Loop; + + int TotFfactorConstructs; // Number of slabs-on-grade or underground floor constructions defined with F factors + int TotCfactorConstructs; // Number of underground wall constructions defined with C factors + + Real64 Ffactor; // Ffactor in W/m-K, applies to deltaT of outside - indoor air temperature + Real64 Cfactor; // Cfactor in W/m2-K, does not include soil or air films + Real64 Area; // floor area in m2 + Real64 PerimeterExposed; // perimeter exposed in m + Real64 Height; // Height of the underground wall in m + + Real64 Reff; // Effective thermal resistance, m2.K/W + Real64 Rcon; // Concrete layer thermal resistance, m2.K/W + Real64 Rfic; // Thermal resistance of the fictitious material, m2.K/W + int MaterNum; // Material index + Real64 Rsoilequ; // Effective R-value of soil for underground walls + int iFCConcreteLayer; // Layer pointer to the materials array + + // First get the concrete layer + iFCConcreteLayer = UtilityRoutines::FindItemInList("~FC_Concrete", state.dataMaterial->Material); + Rcon = state.dataMaterial->Material(iFCConcreteLayer).Resistance; + + // Count number of constructions defined with Ffactor or Cfactor method + TotFfactorConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:FfactorGroundFloor"); + TotCfactorConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:CfactorUndergroundWall"); + + if (TotFfactorConstructs > 0) { + state.dataHeatBal->NoFfactorConstructionsUsed = false; + } + + if (TotCfactorConstructs > 0) { + state.dataHeatBal->NoCfactorConstructionsUsed = false; + } + + // First create ground floor constructions defined with F factor method if any + state.dataHeatBalMgr->CurrentModuleObject = "Construction:FfactorGroundFloor"; + + // Loop through all constructs defined with Ffactor method + for (Loop = 1; Loop <= TotFfactorConstructs; ++Loop) { + + // Get the object names for each construction from the input processor + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + ConstructAlphas, + ConstructNumAlpha, + DummyProps, + DummyNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueConstructNames, + ConstructAlphas(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + continue; + } + + ++ConstrNum; + + state.dataConstruction->Construct(ConstrNum).Name = ConstructAlphas(1); + state.dataConstruction->Construct(ConstrNum).TypeIsFfactorFloor = true; + + Ffactor = DummyProps(1); + Area = DummyProps(2); + PerimeterExposed = DummyProps(3); + + state.dataConstruction->Construct(ConstrNum).Area = Area; + state.dataConstruction->Construct(ConstrNum).PerimeterExposed = PerimeterExposed; + state.dataConstruction->Construct(ConstrNum).FFactor = Ffactor; + + if (Ffactor <= 0.0) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + ConstructAlphas(1) + "\" has " + + state.dataIPShortCut->cNumericFieldNames(1) + " <= 0.0, must be > 0.0."); + ShowContinueError(state, format("Entered value=[{:.2R}]", Ffactor)); + ErrorsFound = true; + } + + if (Area <= 0.0) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + ConstructAlphas(1) + "\" has " + + state.dataIPShortCut->cNumericFieldNames(2) + " <= 0.0, must be > 0.0."); + ShowContinueError(state, format("Entered value=[{:.2R}]", Area)); + ErrorsFound = true; + } + + if (PerimeterExposed < 0.0) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + ConstructAlphas(1) + "\" has " + + state.dataIPShortCut->cNumericFieldNames(3) + " <= 0.0, must be > 0.0."); + ShowContinueError(state, format("Entered value=[{:.2R}]", PerimeterExposed)); + ErrorsFound = true; + } + + // The construction has two layers which have been created in GetMaterialData + state.dataConstruction->Construct(ConstrNum).TotLayers = 2; + + // The concrete is the inside layer + state.dataConstruction->Construct(ConstrNum).LayerPoint(2) = iFCConcreteLayer; + + // The fictitious insulation is the outside layer + MaterNum = UtilityRoutines::FindItemInList(format("~FC_Insulation_{}", Loop), state.dataMaterial->Material); + state.dataConstruction->Construct(ConstrNum).LayerPoint(1) = MaterNum; + + // Calculate the thermal resistance of the fictitious insulation layer + // effective thermal resistance excludes inside and outside air films + if (PerimeterExposed > 0.0) { + Reff = Area / (PerimeterExposed * Ffactor) - Rfilm_in - Rfilm_out; + } else { // PerimeterExposed = 0 for underground floor, assume R-1000 (IP) + Reff = 177.0; + } + + Rfic = Reff - Rcon; + if (Rfic <= 0.0) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + ConstructAlphas(1) + + "\" has calculated R value <= 0.0, must be > 0.0."); + ShowContinueError(state, format("Calculated value=[{:.2R}] Check definition.", Rfic)); + ErrorsFound = true; + } + + state.dataMaterial->Material(MaterNum).Resistance = Rfic; + state.dataHeatBal->NominalR(MaterNum) = Rfic; + + // excluding thermal resistance of inside or outside air film + // 1/Reff gets reported as the "U-Factor no Film" in the summary report Envelope Summary | Opaque Exterior + state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) = Reff; + } + + // Then create underground wall constructions defined with C factor method if any + state.dataHeatBalMgr->CurrentModuleObject = "Construction:CfactorUndergroundWall"; + + for (Loop = 1; Loop <= TotCfactorConstructs; ++Loop) { // Loop through all constructs defined with Ffactor method + + // Get the object names for each construction from the input processor + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + Loop, + ConstructAlphas, + ConstructNumAlpha, + DummyProps, + DummyNumProp, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueConstructNames, + ConstructAlphas(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + continue; + } + + ++ConstrNum; + + state.dataConstruction->Construct(ConstrNum).Name = ConstructAlphas(1); + state.dataConstruction->Construct(ConstrNum).TypeIsCfactorWall = true; + + Cfactor = DummyProps(1); + Height = DummyProps(2); + + state.dataConstruction->Construct(ConstrNum).Height = Height; + state.dataConstruction->Construct(ConstrNum).CFactor = Cfactor; + + if (Cfactor <= 0.0) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + ' ' + ConstructAlphas(1) + " has " + + state.dataIPShortCut->cNumericFieldNames(1) + " <= 0.0, must be > 0.0."); + ShowContinueError(state, format("Entered value=[{:.2R}]", Cfactor)); + ErrorsFound = true; + } + + if (Height <= 0.0) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + ' ' + ConstructAlphas(1) + " has " + + state.dataIPShortCut->cNumericFieldNames(2) + " <= 0.0, must be > 0.0."); + ShowContinueError(state, format("Entered value=[{:.2R}]", Height)); + ErrorsFound = true; + } + + // The construction has two layers which have been created in GetMaterialData + state.dataConstruction->Construct(ConstrNum).TotLayers = 2; + + // The concrete is the inside layer + state.dataConstruction->Construct(ConstrNum).LayerPoint(2) = iFCConcreteLayer; + + // The fictitious insulation is the outside layer + MaterNum = UtilityRoutines::FindItemInList("~FC_Insulation_" + fmt::to_string(Loop + TotFfactorConstructs), state.dataMaterial->Material); + state.dataConstruction->Construct(ConstrNum).LayerPoint(1) = MaterNum; + + // CR 8886 Rsoil should be in SI unit. From ASHRAE 90.1-2010 SI + if (Height <= 0.25) { + Rsoilequ = 0.12; // m2K/W + } else if (Height >= 2.5) { + Rsoilequ = 0.92; + } else { // regression from ASHRAE 90.1-2010 SI TABLE C6.10.1 Effective R-Value of Soil, R2 = 0.9967 + Rsoilequ = 0.0607 + 0.3479 * Height; + } + + // effective thermal resistance excludes inside and outside air films + Reff = 1.0 / Cfactor + Rsoilequ; // Cfactor does not include air films + + Rfic = Reff - Rcon; + if (Rfic <= 0) { + ShowSevereError(state, + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + ConstructAlphas(1) + + "\" has calculated R value <= 0.0, must be > 0.0."); + ShowContinueError(state, format("Calculated value=[{:.2R}] Check definition.", Rfic)); + ErrorsFound = true; + } + + state.dataMaterial->Material(MaterNum).Resistance = Rfic; + state.dataHeatBal->NominalR(MaterNum) = Rfic; + + // Reff includes the wall itself and soil, but excluding thermal resistance of inside or outside air film + // 1/Reff gets reported as the "U-Factor no Film" in the summary report Envelope Summary | Opaque Exterior + state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) = Reff; + } + } + + void CreateAirBoundaryConstructions(EnergyPlusData &state, + int &constrNum, // Counter for Constructions + bool &errorsFound // If errors found in input + ) + { + auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; + cCurrentModuleObject = "Construction:AirBoundary"; + static constexpr std::string_view RoutineName = "CreateAirBoundaryConstructions"; + int numAirBoundaryConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + if (numAirBoundaryConstructs > 0) { + auto const instances = state.dataInputProcessing->inputProcessor->epJSON.find(cCurrentModuleObject); + if (instances == state.dataInputProcessing->inputProcessor->epJSON.end()) { + // Cannot imagine how you would have numAirBoundaryConstructs > 0 and yet the instances is empty + // this would indicate a major problem in the input processor, not a problem here + // I'll still catch this with errorsFound but I cannot make a unit test for it so excluding the line from coverage + ShowSevereError(state, // LCOV_EXCL_LINE + cCurrentModuleObject + ": Somehow getNumObjectsFound was > 0 but epJSON.find found 0"); // LCOV_EXCL_LINE + errorsFound = true; // LCOV_EXCL_LINE + } + auto &instancesValue = instances.value(); + for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { + auto const &fields = instance.value(); + auto thisObjectName = instance.key(); + state.dataInputProcessing->inputProcessor->markObjectAsUsed(cCurrentModuleObject, thisObjectName); + + if (GlobalNames::VerifyUniqueInterObjectName( + state, state.dataHeatBalMgr->UniqueConstructNames, thisObjectName, cCurrentModuleObject, "Name", errorsFound)) { + continue; + } + + ++constrNum; + auto &thisConstruct = state.dataConstruction->Construct(constrNum); + + thisConstruct.Name = UtilityRoutines::MakeUPPERCase(thisObjectName); + thisConstruct.TypeIsAirBoundary = true; + thisConstruct.IsUsedCTF = false; + + // Air Exchange Method + std::string airMethod = "None"; + if (fields.find("air_exchange_method") != fields.end()) { + airMethod = fields.at("air_exchange_method").get(); + } + if (UtilityRoutines::SameString(airMethod, "SimpleMixing")) { + thisConstruct.TypeIsAirBoundaryMixing = true; + if (fields.find("simple_mixing_air_changes_per_hour") != fields.end()) { + thisConstruct.AirBoundaryACH = fields.at("simple_mixing_air_changes_per_hour").get(); + } else { + if (!state.dataInputProcessing->inputProcessor->getDefaultValue( + state, cCurrentModuleObject, "simple_mixing_air_changes_per_hour", thisConstruct.AirBoundaryACH)) { + errorsFound = true; + } + } + if (fields.find("simple_mixing_schedule_name") != fields.end()) { + const std::string &schedName = fields.at("simple_mixing_schedule_name").get(); + thisConstruct.AirBoundaryMixingSched = ScheduleManager::GetScheduleIndex(state, UtilityRoutines::MakeUPPERCase(schedName)); + if (thisConstruct.AirBoundaryMixingSched == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisConstruct.Name + + "\", invalid (not found) " + "Simple Mixing Schedule Name" + "=\"" + schedName + "\"."); + errorsFound = true; + } + } else { + thisConstruct.AirBoundaryMixingSched = DataGlobalConstants::ScheduleAlwaysOn; + } + } + } + } + } + + void GetScheduledSurfaceGains(EnergyPlusData &state, bool &ErrorsFound) // If errors found in input + { + + // SUBROUTINE INFORMATION: + // AUTHOR Simon Vidanovic + // DATE WRITTEN June 2013 + // MODIFIED + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // Loads scheduled surface gains for solar incident on interior side of the surfaces and absorbed solar energy in + // window layers + + // Using/Aliasing + using ScheduleManager::GetScheduleIndex; + + // SUBROUTINE PARAMETER DEFINITIONS: + constexpr const char *RoutineName("GetScheduledSurfaceGains: "); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int NumArgs; + int NumAlpha; + int NumNumeric; + int Loop; + int IOStat; + int SurfNum; + int ConstrNum; + int ScheduleNum; + int i; + int NumOfScheduledLayers; + bool NumOfLayersMatch; + int iZone; + + //----------------------------------------------------------------------- + // SurfaceProperty:SolarIncidentInside + //----------------------------------------------------------------------- + auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; + cCurrentModuleObject = "SurfaceProperty:SolarIncidentInside"; + + // Check if IDD definition is correct + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumeric); + if (NumAlpha != 4) { + ShowSevereError( + state, + format("{}{}: Object Definition indicates not = 4 Alpha Objects, Number Indicated={}", RoutineName, cCurrentModuleObject, NumAlpha)); + ErrorsFound = true; + } + + state.dataSurface->TotSurfIncSolSSG = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + if (state.dataSurface->TotSurfIncSolSSG > 0) { + if (!allocated(state.dataSurface->SurfIncSolSSG)) { + state.dataSurface->SurfIncSolSSG.allocate(state.dataSurface->TotSurfIncSolSSG); + } + + for (Loop = 1; Loop <= state.dataSurface->TotSurfIncSolSSG; ++Loop) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Loop, + state.dataIPShortCut->cAlphaArgs, + NumAlpha, + state.dataIPShortCut->rNumericArgs, + NumNumeric, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound)) { + ShowContinueError( + state, "...each SurfaceProperty:SolarIncidentInside name must not duplicate other SurfaceProperty:SolarIncidentInside name"); + continue; + } + + state.dataSurface->SurfIncSolSSG(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); + + // Assign surface number + SurfNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataSurface->Surface); + if (SurfNum == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(2) + " has been found."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(2) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(2) + + "\" no corresponding surface (ref BuildingSurface:Detailed) has been found in the input file."); + ErrorsFound = true; + } else { + state.dataSurface->SurfIncSolSSG(Loop).SurfPtr = SurfNum; + if (state.dataSurface->UseRepresentativeSurfaceCalculations) { + int repSurfNum = state.dataSurface->Surface(SurfNum).RepresentativeCalcSurfNum; + if (repSurfNum != SurfNum) { + // Do not use representative surfaces + + // remove surface from representative constituent list + auto &vec = state.dataSurface->Surface(repSurfNum).ConstituentSurfaceNums; + vec.erase(std::remove(vec.begin(), vec.end(), SurfNum), vec.end()); + + // reset representative surface number + state.dataSurface->Surface(SurfNum).RepresentativeCalcSurfNum = SurfNum; + } + } + } + + // Assign construction number + ConstrNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(3), state.dataConstruction->Construct); + if (ConstrNum == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(3) + " has been found."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(3) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(3) + + "\" no corresponding construction (ref Construction) has been found in the input file."); + ErrorsFound = true; + } else { + state.dataSurface->SurfIncSolSSG(Loop).ConstrPtr = ConstrNum; + } + + // Assign schedule number + ScheduleNum = GetScheduleIndex(state, state.dataIPShortCut->cAlphaArgs(4)); + if (ScheduleNum == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(4) + " has been found."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(4) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(4) + + "\" no corresponding schedule has been found in the input file."); + ErrorsFound = true; + } else { + state.dataSurface->SurfIncSolSSG(Loop).SchedPtr = ScheduleNum; + } + } + } + + //----------------------------------------------------------------------- + // SurfaceProperty:SolarIncidentInside + //----------------------------------------------------------------------- + cCurrentModuleObject = "ComplexFenestrationProperty:SolarAbsorbedLayers"; + + state.dataSurface->TotFenLayAbsSSG = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + if (state.dataSurface->TotFenLayAbsSSG > 0) { + if (!allocated(state.dataSurface->FenLayAbsSSG)) { + state.dataSurface->FenLayAbsSSG.allocate(state.dataSurface->TotFenLayAbsSSG); + } + + for (Loop = 1; Loop <= state.dataSurface->TotFenLayAbsSSG; ++Loop) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Loop, + state.dataIPShortCut->cAlphaArgs, + NumAlpha, + state.dataIPShortCut->rNumericArgs, + NumNumeric, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound)) { + ShowContinueError(state, + "...each ComplexFenestrationProperty:SolarAbsorbedLayers name must not duplicate other " + "ComplexFenestrationProperty:SolarAbsorbedLayers name"); + continue; + } + + state.dataSurface->FenLayAbsSSG(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); + + // Assign surface number + SurfNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataSurface->Surface); + if (SurfNum == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(2) + " has been found."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(2) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(2) + + "\" no corresponding surface (ref BuildingSurface:Detailed) has been found in the input file."); + ErrorsFound = true; + } else { + state.dataSurface->FenLayAbsSSG(Loop).SurfPtr = SurfNum; + } + + // Assign construction number + ConstrNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(3), state.dataConstruction->Construct); + if (ConstrNum == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(3) + " has been found."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(3) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(3) + + "\" no corresponding construction (ref Construction) has been found in the input file."); + ErrorsFound = true; + } else { + state.dataSurface->FenLayAbsSSG(Loop).ConstrPtr = ConstrNum; + NumOfScheduledLayers = NumAlpha - 3; + NumOfLayersMatch = false; + // Check if number of layers in construction matches number of layers in schedule surface gains object + if (NumOfScheduledLayers == state.dataConstruction->Construct(ConstrNum).TotSolidLayers) { + NumOfLayersMatch = true; + } + + if (!NumOfLayersMatch) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Number of scheduled surface gains for each layer does not match number of layers in " + "referenced construction."); + ShowContinueError(state, + format("{} have {} schedule layers and {} have {} layers.", + state.dataIPShortCut->cAlphaArgs(1), + NumOfScheduledLayers, + state.dataIPShortCut->cAlphaArgs(3), + state.dataConstruction->Construct(ConstrNum).TotSolidLayers)); + ErrorsFound = true; + } + + if (!allocated(state.dataSurface->FenLayAbsSSG(Loop).SchedPtrs)) { + state.dataSurface->FenLayAbsSSG(Loop).SchedPtrs.allocate(NumOfScheduledLayers); + } + + state.dataSurface->FenLayAbsSSG(Loop).NumOfSched = NumOfScheduledLayers; + + for (i = 1; i <= NumOfScheduledLayers; ++i) { + ScheduleNum = GetScheduleIndex(state, state.dataIPShortCut->cAlphaArgs(i + 3)); + if (ScheduleNum == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(NumOfScheduledLayers + 3) + + " has been found."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(NumOfScheduledLayers + 3) + " entered value = \"" + + state.dataIPShortCut->cAlphaArgs(NumOfScheduledLayers + 3) + + "\" no corresponding schedule has been found in the input file."); + ErrorsFound = true; + } else { + state.dataSurface->FenLayAbsSSG(Loop).SchedPtrs(i) = ScheduleNum; + } + } + } + } + } + + // Check if scheduled surface gains are assigined to each surface in every zone. If not then warning message to user will be + // issued + if ((state.dataSurface->TotSurfIncSolSSG > 0) || (state.dataSurface->TotFenLayAbsSSG > 0)) { + for (iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) { + CheckScheduledSurfaceGains(state, iZone); + } + } + } + + void CheckScheduledSurfaceGains(EnergyPlusData &state, int const ZoneNum) // Zone number for which error check will be performed + { + + // SUBROUTINE INFORMATION: + // AUTHOR Simon Vidanovic + // DATE WRITTEN July 2013 + // MODIFIED + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // Check if all surfaces within zone are scheduled with surface gains. If not all surfaces within zone are scheduled, + // warning message will be issued and program will continue to execute. + + // METHODOLOGY EMPLOYED: + // na + + // REFERENCES: + // na + + // Using/Aliasing + using SolarShading::SurfaceScheduledSolarInc; + using SolarShading::WindowScheduledSolarAbs; + using namespace DataSurfaces; + + // Locals + // SUBROUTINE ARGUMENT DEFINITIONS: + + // SUBROUTINE PARAMETER DEFINITIONS: + // na + + // INTERFACE BLOCK SPECIFICATIONS: + // na + + // DERIVED TYPE DEFINITIONS: + // na + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int SchedPtr; // scheduled surface gains pointer + bool ZoneUnscheduled; // true if all surfaces in the zone are unscheduled + bool ZoneScheduled; // true if all surfaces in the zone are scheduled + + ZoneUnscheduled = false; + ZoneScheduled = false; + + bool firstZoneSurface = true; + for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) { + auto &thisSpace = state.dataHeatBal->space(spaceNum); + for (int iSurf = thisSpace.HTSurfaceFirst; iSurf <= thisSpace.HTSurfaceLast; ++iSurf) { + int iConst = state.dataSurface->Surface(iSurf).Construction; + if (state.dataSurface->Surface(iSurf).Class == SurfaceClass::Window) { + SchedPtr = WindowScheduledSolarAbs(state, iSurf, iConst); + } else { + SchedPtr = SurfaceScheduledSolarInc(state, iSurf, iConst); + } + if (firstZoneSurface) { + if (SchedPtr != 0) { + ZoneScheduled = true; + ZoneUnscheduled = false; + } else { + ZoneScheduled = false; + ZoneUnscheduled = true; + } + firstZoneSurface = false; + } else { + if (SchedPtr != 0) { + ZoneUnscheduled = false; + } else { + ZoneScheduled = false; + } + } + } + } + if ((!ZoneScheduled) && (!ZoneUnscheduled)) { + // zone is nor scheduled nor unscheduled + ShowWarningError(state, "Zone " + state.dataHeatBal->Zone(ZoneNum).Name + " does not have all surfaces scheduled with surface gains."); + ShowContinueError(state, + "If at least one surface in the zone is scheduled with surface gains, then all other surfaces within the same zone " + "should be scheduled as well."); + } + + if ((!ZoneScheduled) && (!ZoneUnscheduled)) { + for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) { + auto &thisSpace = state.dataHeatBal->space(spaceNum); + for (int iSurf = thisSpace.HTSurfaceFirst; iSurf <= thisSpace.HTSurfaceLast; ++iSurf) { + int iConst = state.dataSurface->Surface(iSurf).Construction; + if (state.dataSurface->Surface(iSurf).Class == SurfaceClass::Window) { + SchedPtr = WindowScheduledSolarAbs(state, iSurf, iConst); + } else { + SchedPtr = SurfaceScheduledSolarInc(state, iSurf, iConst); + } + + if (SchedPtr == 0) { + ShowContinueError(state, "Surface " + state.dataSurface->Surface(iSurf).Name + " does not have scheduled surface gains."); + } + } + } + } + } + + void CreateTCConstructions(EnergyPlusData &state, [[maybe_unused]] bool &ErrorsFound) // If errors found in input + { + + // SUBROUTINE INFORMATION: + // AUTHOR Tianzhen Hong + // DATE WRITTEN January 2009 + // MODIFIED + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine goes through each TC master construction and creates a complete series + // of the slave thermochromic constructions. + // This subroutine only gets called once in the GetHeatBalanceInput subroutine + // after materials, constructions and building geometry data are read. + + // METHODOLOGY EMPLOYED: + // na + + // REFERENCES: + // na + + // USE STATEMENTS: + + // Using/Aliasing + using namespace DataStringGlobals; + + // Locals + // SUBROUTINE ARGUMENT DEFINITIONS: + + // SUBROUTINE PARAMETER DEFINITIONS: + // na + + // INTERFACE BLOCK SPECIFICATIONS: + // na + + // DERIVED TYPE DEFINITIONS: + // na + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + + int Loop; + int iTC(0); + int iMat(0); + int NumNewConst(0); + int iTCG(0); + + NumNewConst = 0; + for (Loop = 1; Loop <= state.dataHeatBal->TotConstructs; ++Loop) { + if (state.dataConstruction->Construct(Loop).TCFlag == 1) { + iTCG = state.dataMaterial->Material(state.dataConstruction->Construct(Loop).TCLayer).TCParent; + if (iTCG == 0) continue; // hope this was caught already + iMat = state.dataHeatBal->TCGlazings(iTCG).NumGlzMat; + for (iTC = 1; iTC <= iMat; ++iTC) { + ++NumNewConst; + } + } + } + + if (NumNewConst == 0) return; // no need to go further + + // Increase Construct() and copy the extra constructions + state.dataConstruction->Construct.redimension(state.dataHeatBal->TotConstructs + NumNewConst); + state.dataHeatBal->NominalRforNominalUCalculation.redimension(state.dataHeatBal->TotConstructs + NumNewConst); + state.dataHeatBal->NominalU.redimension(state.dataHeatBal->TotConstructs + NumNewConst); + state.dataHeatBal->NominalUBeforeAdjusted.redimension(state.dataHeatBal->TotConstructs + NumNewConst); + state.dataHeatBal->CoeffAdjRatio.redimension(state.dataHeatBal->TotConstructs + NumNewConst) = 1.0; + + NumNewConst = state.dataHeatBal->TotConstructs; + for (Loop = 1; Loop <= state.dataHeatBal->TotConstructs; ++Loop) { + if (state.dataConstruction->Construct(Loop).TCFlag == 1) { + iTCG = state.dataMaterial->Material(state.dataConstruction->Construct(Loop).TCLayer).TCParent; + if (iTCG == 0) continue; // hope this was caught already + iMat = state.dataHeatBal->TCGlazings(iTCG).NumGlzMat; + for (iTC = 1; iTC <= iMat; ++iTC) { + ++NumNewConst; + state.dataConstruction->Construct(NumNewConst) = state.dataConstruction->Construct(Loop); // copy data + state.dataConstruction->Construct(NumNewConst).Name = + format("{}_TC_{:.0R}", state.dataConstruction->Construct(Loop).Name, state.dataHeatBal->TCGlazings(iTCG).SpecTemp(iTC)); + state.dataConstruction->Construct(NumNewConst).TCLayer = state.dataHeatBal->TCGlazings(iTCG).LayerPoint(iTC); + state.dataConstruction->Construct(NumNewConst).LayerPoint(state.dataConstruction->Construct(Loop).TCLayerID) = + state.dataConstruction->Construct(NumNewConst).TCLayer; + state.dataConstruction->Construct(NumNewConst).TCFlag = 1; + state.dataConstruction->Construct(NumNewConst).TCMasterConst = Loop; + state.dataConstruction->Construct(NumNewConst).TCLayerID = state.dataConstruction->Construct(Loop).TCLayerID; + state.dataConstruction->Construct(NumNewConst).TCGlassID = state.dataConstruction->Construct(Loop).TCGlassID; + state.dataConstruction->Construct(NumNewConst).TypeIsWindow = true; + } + } + } + state.dataHeatBal->TotConstructs = NumNewConst; + } + + void SetupSimpleWindowGlazingSystem(EnergyPlusData &state, int &MaterNum) + { + + // SUBROUTINE INFORMATION: + // AUTHOR B. Griffith + // DATE WRITTEN January 2009 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // Convert simple window performance indices into all the properties needed to + // describe a single, equivalent glass layer + + // METHODOLOGY EMPLOYED: + // The simple window indices are converted to a single materal layer using a "block model" + + // REFERENCES: + // draft paper by Arasteh, Kohler, and Griffith + + // USE STATEMENTS: + // na + + // Locals + // SUBROUTINE ARGUMENT DEFINITIONS: + + // SUBROUTINE PARAMETER DEFINITIONS: + // na + + // INTERFACE BLOCK SPECIFICATIONS: + // na + + // DERIVED TYPE DEFINITIONS: + // na + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Real64 Riw(0.0); // thermal resistance of interior film coefficient under winter conditions (m2-K/W) + Real64 Row(0.0); // theraml resistance of exterior film coefficient under winter conditions (m2-K/W) + Real64 Rlw(0.0); // thermal resistance of block model layer (m2-K/W) + Real64 Ris(0.0); // thermal resistance of interior film coefficient under summer conditions (m2-K/W) + Real64 Ros(0.0); // theraml resistance of exterior film coefficient under summer conditions (m2-K/W) + Real64 InflowFraction(0.0); // inward flowing fraction for SHGC, intermediate value non dimensional + Real64 SolarAbsorb(0.0); // solar aborptance + bool ErrorsFound(false); + Real64 TsolLowSide(0.0); // intermediate solar transmission for interpolating + Real64 TsolHiSide(0.0); // intermediate solar transmission for interpolating + Real64 DeltaSHGCandTsol(0.0); // intermediate difference + Real64 RLowSide(0.0); + Real64 RHiSide(0.0); + + // first fill out defaults + state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = 0; + state.dataMaterial->Material(MaterNum).SolarDiffusing = false; + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VerySmooth; + state.dataMaterial->Material(MaterNum).TransThermal = 0.0; + state.dataMaterial->Material(MaterNum).AbsorpThermalBack = 0.84; + state.dataMaterial->Material(MaterNum).AbsorpThermalFront = 0.84; + state.dataMaterial->Material(MaterNum).AbsorpThermal = state.dataMaterial->Material(MaterNum).AbsorpThermalBack; + + // step 1. Determine U-factor without film coefficients + // Simple window model has its own correlation for film coefficients (m2-K/W) under Winter conditions as function of U-factor + if (state.dataMaterial->Material(MaterNum).SimpleWindowUfactor < 5.85) { + Riw = 1.0 / (0.359073 * std::log(state.dataMaterial->Material(MaterNum).SimpleWindowUfactor) + 6.949915); + } else { + Riw = 1.0 / (1.788041 * state.dataMaterial->Material(MaterNum).SimpleWindowUfactor - 2.886625); + } + Row = 1.0 / (0.025342 * state.dataMaterial->Material(MaterNum).SimpleWindowUfactor + 29.163853); + + // determine 1/U without film coefficients + Rlw = (1.0 / state.dataMaterial->Material(MaterNum).SimpleWindowUfactor) - Riw - Row; + if (Rlw <= 0.0) { // U factor of film coefficients is better than user input. + Rlw = max(Rlw, 0.001); + ShowWarningError(state, + "WindowMaterial:SimpleGlazingSystem: " + state.dataMaterial->Material(MaterNum).Name + + " has U-factor higher than that provided by surface film resistances, Check value of U-factor"); + } + + // Step 2. determine layer thickness. + + if ((1.0 / Rlw) > 7.0) { + state.dataMaterial->Material(MaterNum).Thickness = 0.002; + } else { + state.dataMaterial->Material(MaterNum).Thickness = 0.05914 - (0.00714 / Rlw); + } + + // Step 3. determine effective conductivity + + state.dataMaterial->Material(MaterNum).Conductivity = state.dataMaterial->Material(MaterNum).Thickness / Rlw; + if (state.dataMaterial->Material(MaterNum).Conductivity > 0.0) { + state.dataHeatBal->NominalR(MaterNum) = Rlw; + state.dataMaterial->Material(MaterNum).Resistance = Rlw; + } else { + ErrorsFound = true; + ShowSevereError(state, + "WindowMaterial:SimpleGlazingSystem: " + state.dataMaterial->Material(MaterNum).Name + + " has Conductivity <= 0.0, must be >0.0, Check value of U-factor"); + } + + // step 4. determine solar transmission (revised to 10-1-2009 version from LBNL.) + + if (state.dataMaterial->Material(MaterNum).SimpleWindowUfactor > 4.5) { + + if (state.dataMaterial->Material(MaterNum).SimpleWindowSHGC < 0.7206) { + + state.dataMaterial->Material(MaterNum).Trans = 0.939998 * pow_2(state.dataMaterial->Material(MaterNum).SimpleWindowSHGC) + + 0.20332 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC; + } else { // >= 0.7206 + + state.dataMaterial->Material(MaterNum).Trans = 1.30415 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC - 0.30515; + } + + } else if (state.dataMaterial->Material(MaterNum).SimpleWindowUfactor < 3.4) { + + if (state.dataMaterial->Material(MaterNum).SimpleWindowSHGC <= 0.15) { + state.dataMaterial->Material(MaterNum).Trans = 0.41040 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC; + } else { // > 0.15 + state.dataMaterial->Material(MaterNum).Trans = 0.085775 * pow_2(state.dataMaterial->Material(MaterNum).SimpleWindowSHGC) + + 0.963954 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC - 0.084958; + } + } else { // interpolate. 3.4 <= Ufactor <= 4.5 + + if (state.dataMaterial->Material(MaterNum).SimpleWindowSHGC < 0.7206) { + TsolHiSide = 0.939998 * pow_2(state.dataMaterial->Material(MaterNum).SimpleWindowSHGC) + + 0.20332 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC; + } else { // >= 0.7206 + TsolHiSide = 1.30415 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC - 0.30515; + } + + if (state.dataMaterial->Material(MaterNum).SimpleWindowSHGC <= 0.15) { + TsolLowSide = 0.41040 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC; + } else { // > 0.15 + TsolLowSide = 0.085775 * pow_2(state.dataMaterial->Material(MaterNum).SimpleWindowSHGC) + + 0.963954 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC - 0.084958; + } + + state.dataMaterial->Material(MaterNum).Trans = + ((state.dataMaterial->Material(MaterNum).SimpleWindowUfactor - 3.4) / (4.5 - 3.4)) * (TsolHiSide - TsolLowSide) + TsolLowSide; + } + if (state.dataMaterial->Material(MaterNum).Trans < 0.0) state.dataMaterial->Material(MaterNum).Trans = 0.0; + + // step 5. determine solar reflectances + + DeltaSHGCandTsol = state.dataMaterial->Material(MaterNum).SimpleWindowSHGC - state.dataMaterial->Material(MaterNum).Trans; + + if (state.dataMaterial->Material(MaterNum).SimpleWindowUfactor > 4.5) { + + Ris = 1.0 / (29.436546 * pow_3(DeltaSHGCandTsol) - 21.943415 * pow_2(DeltaSHGCandTsol) + 9.945872 * DeltaSHGCandTsol + 7.426151); + Ros = 1.0 / (2.225824 * DeltaSHGCandTsol + 20.577080); + } else if (state.dataMaterial->Material(MaterNum).SimpleWindowUfactor < 3.4) { + + Ris = 1.0 / (199.8208128 * pow_3(DeltaSHGCandTsol) - 90.639733 * pow_2(DeltaSHGCandTsol) + 19.737055 * DeltaSHGCandTsol + 6.766575); + Ros = 1.0 / (5.763355 * DeltaSHGCandTsol + 20.541528); + } else { // interpolate. 3.4 <= Ufactor <= 4.5 + // inside first + RLowSide = 1.0 / (199.8208128 * pow_3(DeltaSHGCandTsol) - 90.639733 * pow_2(DeltaSHGCandTsol) + 19.737055 * DeltaSHGCandTsol + 6.766575); + RHiSide = 1.0 / (29.436546 * pow_3(DeltaSHGCandTsol) - 21.943415 * pow_2(DeltaSHGCandTsol) + 9.945872 * DeltaSHGCandTsol + 7.426151); + Ris = ((state.dataMaterial->Material(MaterNum).SimpleWindowUfactor - 3.4) / (4.5 - 3.4)) * (RLowSide - RHiSide) + RLowSide; + // then outside + RLowSide = 1.0 / (5.763355 * DeltaSHGCandTsol + 20.541528); + RHiSide = 1.0 / (2.225824 * DeltaSHGCandTsol + 20.577080); + Ros = ((state.dataMaterial->Material(MaterNum).SimpleWindowUfactor - 3.4) / (4.5 - 3.4)) * (RLowSide - RHiSide) + RLowSide; + } + + InflowFraction = (Ros + 0.5 * Rlw) / (Ros + Rlw + Ris); + + SolarAbsorb = (state.dataMaterial->Material(MaterNum).SimpleWindowSHGC - state.dataMaterial->Material(MaterNum).Trans) / InflowFraction; + state.dataMaterial->Material(MaterNum).ReflectSolBeamBack = 1.0 - state.dataMaterial->Material(MaterNum).Trans - SolarAbsorb; + state.dataMaterial->Material(MaterNum).ReflectSolBeamFront = state.dataMaterial->Material(MaterNum).ReflectSolBeamBack; + + // step 6. determine visible properties. + if (state.dataMaterial->Material(MaterNum).SimpleWindowVTinputByUser) { + state.dataMaterial->Material(MaterNum).TransVis = state.dataMaterial->Material(MaterNum).SimpleWindowVisTran; + state.dataMaterial->Material(MaterNum).ReflectVisBeamBack = -0.7409 * pow_3(state.dataMaterial->Material(MaterNum).TransVis) + + 1.6531 * pow_2(state.dataMaterial->Material(MaterNum).TransVis) - + 1.2299 * state.dataMaterial->Material(MaterNum).TransVis + 0.4545; + if (state.dataMaterial->Material(MaterNum).TransVis + state.dataMaterial->Material(MaterNum).ReflectVisBeamBack >= 1.0) { + state.dataMaterial->Material(MaterNum).ReflectVisBeamBack = 0.999 - state.dataMaterial->Material(MaterNum).TransVis; + } + + state.dataMaterial->Material(MaterNum).ReflectVisBeamFront = -0.0622 * pow_3(state.dataMaterial->Material(MaterNum).TransVis) + + 0.4277 * pow_2(state.dataMaterial->Material(MaterNum).TransVis) - + 0.4169 * state.dataMaterial->Material(MaterNum).TransVis + 0.2399; + if (state.dataMaterial->Material(MaterNum).TransVis + state.dataMaterial->Material(MaterNum).ReflectVisBeamFront >= 1.0) { + state.dataMaterial->Material(MaterNum).ReflectVisBeamFront = 0.999 - state.dataMaterial->Material(MaterNum).TransVis; + } + } else { + state.dataMaterial->Material(MaterNum).TransVis = state.dataMaterial->Material(MaterNum).Trans; + state.dataMaterial->Material(MaterNum).ReflectVisBeamBack = state.dataMaterial->Material(MaterNum).ReflectSolBeamBack; + state.dataMaterial->Material(MaterNum).ReflectVisBeamFront = state.dataMaterial->Material(MaterNum).ReflectSolBeamFront; + } + + // step 7. The dependence on incident angle is in subroutine TransAndReflAtPhi + + // step 8. Hemispherical terms are averaged using standard method + + if (ErrorsFound) { + ShowFatalError(state, "Program halted because of input problem(s) in WindowMaterial:SimpleGlazingSystem"); + } + } + + void SetupComplexFenestrationMaterialInput(EnergyPlusData &state, + int &MaterNum, // num of material items thus far + bool &ErrorsFound) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Simon Vidanovic + // DATE WRITTEN March 2012 + // MODIFIED May 2013 (Simon Vidanovic) + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // get input for complex fenestration materials + + // METHODOLOGY EMPLOYED: + // usual GetInput processing. + + // REFERENCES: + // na + + // Using/Aliasing + + // SUBROUTINE ARGUMENT DEFINITIONS: + + // Locals + // SUBROUTINE PARAMETER DEFINITIONS + constexpr const char *RoutineName("SetupComplexFenestrationMaterialInput: "); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Array1D_string MaterialNames(5); // Number of Material Alpha names defined + Array1D MaterialProps(27); // Temporary array to transfer material properties + int Loop; + int NumAlphas; // Number of Alphas for each GetObjectItem call + int NumNumbers; // Number of Numbers for each GetObjectItem call + int IOStatus; // Used in GetObjectItem + + // Reading WindowGap:SupportPillar + auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; + cCurrentModuleObject = "WindowGap:SupportPillar"; + state.dataHeatBal->W7SupportPillars = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + state.dataHeatBal->SupportPillar.allocate(state.dataHeatBal->W7SupportPillars); + for (Loop = 1; Loop <= state.dataHeatBal->W7SupportPillars; ++Loop) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Loop, + state.dataIPShortCut->cAlphaArgs, + NumAlphas, + state.dataIPShortCut->rNumericArgs, + NumNumbers, + IOStatus, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(1) + " has been found."); + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + state.dataHeatBal->SupportPillar(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); + state.dataHeatBal->SupportPillar(Loop).Spacing = state.dataIPShortCut->rNumericArgs(1); + state.dataHeatBal->SupportPillar(Loop).Radius = state.dataIPShortCut->rNumericArgs(2); + + if (state.dataIPShortCut->rNumericArgs(1) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(1) + " has been found."); + ShowContinueError(state, + format("{} must be > 0, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(1), + state.dataIPShortCut->rNumericArgs(1))); + } + + if (state.dataIPShortCut->rNumericArgs(2) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(2) + " has been found."); + ShowContinueError(state, + format("{} must be > 0, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(2), + state.dataIPShortCut->rNumericArgs(2))); + } + } + + // Reading WindowGap:DeflectionState + cCurrentModuleObject = "WindowGap:DeflectionState"; + state.dataHeatBal->W7DeflectionStates = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + state.dataHeatBal->DeflectionState.allocate(state.dataHeatBal->W7DeflectionStates); + for (Loop = 1; Loop <= state.dataHeatBal->W7DeflectionStates; ++Loop) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Loop, + state.dataIPShortCut->cAlphaArgs, + NumAlphas, + state.dataIPShortCut->rNumericArgs, + NumNumbers, + IOStatus, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(1) + " has been found."); + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + state.dataHeatBal->DeflectionState(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); + state.dataHeatBal->DeflectionState(Loop).DeflectedThickness = state.dataIPShortCut->rNumericArgs(1); + if (state.dataIPShortCut->rNumericArgs(1) < 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(1) + " has been found."); + ShowContinueError(state, + format("{} must be >= 0, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(1), + state.dataIPShortCut->rNumericArgs(1))); + } + } + + // Reading WindowMaterial:Gap + + cCurrentModuleObject = "WindowMaterial:Gap"; + state.dataHeatBal->W7MaterialGaps = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + // ALLOCATE(DeflectionState(W7DeflectionStates)) + for (Loop = 1; Loop <= state.dataHeatBal->W7MaterialGaps; ++Loop) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Loop, + state.dataIPShortCut->cAlphaArgs, + NumAlphas, + state.dataIPShortCut->rNumericArgs, + NumNumbers, + IOStatus, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueMaterialNames, + state.dataIPShortCut->cAlphaArgs(1), + state.dataHeatBalMgr->CurrentModuleObject, + state.dataIPShortCut->cAlphaFieldNames(1), + ErrorsFound)) { + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::ComplexWindowGap; + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::Rough; + state.dataMaterial->Material(MaterNum).ROnly = true; + + state.dataMaterial->Material(MaterNum).Name = state.dataIPShortCut->cAlphaArgs(1); + + state.dataMaterial->Material(MaterNum).Thickness = state.dataIPShortCut->rNumericArgs(1); + if (state.dataIPShortCut->rNumericArgs(1) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(1) + " has been found."); + ShowContinueError( + state, + format("{} must be > 0, entered {:.2R}", state.dataIPShortCut->cNumericFieldNames(1), state.dataIPShortCut->rNumericArgs(1))); + } + + state.dataMaterial->Material(MaterNum).Pressure = state.dataIPShortCut->rNumericArgs(2); + if (state.dataIPShortCut->rNumericArgs(2) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(2) + " has been found."); + ShowContinueError( + state, + format("{} must be > 0, entered {:.2R}", state.dataIPShortCut->cNumericFieldNames(2), state.dataIPShortCut->rNumericArgs(2))); + } + + if (!state.dataIPShortCut->lAlphaFieldBlanks(2)) { + state.dataMaterial->Material(MaterNum).GasPointer = + UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataMaterial->Material); + } else { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(1) + " has been found."); + ShowContinueError(state, cCurrentModuleObject + " does not have assigned WindowMaterial:Gas or WindowMaterial:GasMixutre."); + } + if (!state.dataIPShortCut->lAlphaFieldBlanks(3)) { + state.dataMaterial->Material(MaterNum).DeflectionStatePtr = + UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(3), state.dataHeatBal->DeflectionState); + } + if (!state.dataIPShortCut->lAlphaFieldBlanks(4)) { + state.dataMaterial->Material(MaterNum).SupportPillarPtr = + UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(4), state.dataHeatBal->SupportPillar); + } + } + + // Reading WindowMaterial:ComplexShade + cCurrentModuleObject = "WindowMaterial:ComplexShade"; + state.dataHeatBal->TotComplexShades = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataHeatBal->TotComplexShades > 0) { + state.dataHeatBal->ComplexShade.allocate(state.dataHeatBal->TotComplexShades); // Allocate the array Size to the number of complex shades + } + + for (Loop = 1; Loop <= state.dataHeatBal->TotComplexShades; ++Loop) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Loop, + state.dataIPShortCut->cAlphaArgs, + NumAlphas, + state.dataIPShortCut->rNumericArgs, + NumNumbers, + IOStatus, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(1) + " has been found."); + ShowContinueError(state, "...All Material names must be unique regardless of subtype."); + continue; + } + + ++MaterNum; + state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::ComplexWindowShade; + state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::Rough; + state.dataMaterial->Material(MaterNum).ROnly = true; + + // Assign pointer to ComplexShade + state.dataMaterial->Material(MaterNum).ComplexShadePtr = Loop; + + state.dataMaterial->Material(MaterNum).Name = state.dataIPShortCut->cAlphaArgs(1); + state.dataHeatBal->ComplexShade(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); + + { + auto const SELECT_CASE_var(state.dataIPShortCut->cAlphaArgs(2)); + + if (SELECT_CASE_var == "OTHERSHADINGTYPE") { + state.dataHeatBal->ComplexShade(Loop).LayerType = TARCOGParams::TARCOGLayerType::DIFFSHADE; + } else if (SELECT_CASE_var == "VENETIANHORIZONTAL") { + state.dataHeatBal->ComplexShade(Loop).LayerType = TARCOGParams::TARCOGLayerType::VENETBLIND_HORIZ; + } else if (SELECT_CASE_var == "VENETIANVERTICAL") { + state.dataHeatBal->ComplexShade(Loop).LayerType = TARCOGParams::TARCOGLayerType::VENETBLIND_VERT; + } else if (SELECT_CASE_var == "WOVEN") { + state.dataHeatBal->ComplexShade(Loop).LayerType = TARCOGParams::TARCOGLayerType::WOVSHADE; + } else if (SELECT_CASE_var == "PERFORATED") { + state.dataHeatBal->ComplexShade(Loop).LayerType = TARCOGParams::TARCOGLayerType::PERFORATED; + } else if (SELECT_CASE_var == "BSDF") { + state.dataHeatBal->ComplexShade(Loop).LayerType = TARCOGParams::TARCOGLayerType::BSDF; + } else { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(2) + " has been found."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(2) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(2) + + "\" should be OtherShadingType, Venetian, Woven, Perforated or BSDF."); + } + } + + state.dataHeatBal->ComplexShade(Loop).Thickness = state.dataIPShortCut->rNumericArgs(1); + state.dataMaterial->Material(MaterNum).Thickness = state.dataIPShortCut->rNumericArgs(1); + state.dataHeatBal->ComplexShade(Loop).Conductivity = state.dataIPShortCut->rNumericArgs(2); + state.dataMaterial->Material(MaterNum).Conductivity = state.dataIPShortCut->rNumericArgs(2); + state.dataHeatBal->ComplexShade(Loop).IRTransmittance = state.dataIPShortCut->rNumericArgs(3); + state.dataHeatBal->ComplexShade(Loop).FrontEmissivity = state.dataIPShortCut->rNumericArgs(4); + state.dataHeatBal->ComplexShade(Loop).BackEmissivity = state.dataIPShortCut->rNumericArgs(5); + + // Simon: in heat balance radiation exchange routines AbsorpThermal is used + // and program will crash if value is not assigned. Not sure if this is correct + // or some additional calculation is necessary. Simon TODO + state.dataMaterial->Material(MaterNum).AbsorpThermal = state.dataIPShortCut->rNumericArgs(5); + state.dataMaterial->Material(MaterNum).AbsorpThermalFront = state.dataIPShortCut->rNumericArgs(4); + state.dataMaterial->Material(MaterNum).AbsorpThermalBack = state.dataIPShortCut->rNumericArgs(5); + + state.dataHeatBal->ComplexShade(Loop).TopOpeningMultiplier = state.dataIPShortCut->rNumericArgs(6); + state.dataHeatBal->ComplexShade(Loop).BottomOpeningMultiplier = state.dataIPShortCut->rNumericArgs(7); + state.dataHeatBal->ComplexShade(Loop).LeftOpeningMultiplier = state.dataIPShortCut->rNumericArgs(8); + state.dataHeatBal->ComplexShade(Loop).RightOpeningMultiplier = state.dataIPShortCut->rNumericArgs(9); + state.dataHeatBal->ComplexShade(Loop).FrontOpeningMultiplier = state.dataIPShortCut->rNumericArgs(10); + + state.dataHeatBal->ComplexShade(Loop).SlatWidth = state.dataIPShortCut->rNumericArgs(11); + state.dataHeatBal->ComplexShade(Loop).SlatSpacing = state.dataIPShortCut->rNumericArgs(12); + state.dataHeatBal->ComplexShade(Loop).SlatThickness = state.dataIPShortCut->rNumericArgs(13); + state.dataHeatBal->ComplexShade(Loop).SlatAngle = state.dataIPShortCut->rNumericArgs(14); + state.dataHeatBal->ComplexShade(Loop).SlatConductivity = state.dataIPShortCut->rNumericArgs(15); + state.dataHeatBal->ComplexShade(Loop).SlatCurve = state.dataIPShortCut->rNumericArgs(16); + + // IF (dataMaterial.Material(MaterNum)%Conductivity > 0.0) THEN + // NominalR(MaterNum)=dataMaterial.Material(MaterNum)%Thickness/dataMaterial.Material(MaterNum)%Conductivity + // ELSE + // NominalR(MaterNum)=1.0 + // ENDIF + + if (state.dataIPShortCut->rNumericArgs(1) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(1) + " has been found."); + ShowContinueError(state, + format("{} must be > 0, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(1), + state.dataIPShortCut->rNumericArgs(1))); + } + + if (state.dataIPShortCut->rNumericArgs(2) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(2) + " has been found."); + ShowContinueError(state, + format("{} must be > 0, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(2), + state.dataIPShortCut->rNumericArgs(2))); + } + + if ((state.dataIPShortCut->rNumericArgs(3) < 0.0) || (state.dataIPShortCut->rNumericArgs(3) > 1.0)) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(3) + " has been found."); + ShowContinueError(state, + format("{} value must be >= 0 and <= 1, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(3), + state.dataIPShortCut->rNumericArgs(3))); + } + + if ((state.dataIPShortCut->rNumericArgs(4) <= 0.0) || (state.dataIPShortCut->rNumericArgs(4) > 1.0)) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(4) + " has been found."); + ShowContinueError(state, + format("{} value must be >= 0 and <= 1, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(4), + state.dataIPShortCut->rNumericArgs(4))); + } + + if ((state.dataIPShortCut->rNumericArgs(5) <= 0.0) || (state.dataIPShortCut->rNumericArgs(5) > 1.0)) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(5) + " has been found."); + ShowContinueError(state, + format("{} value must be >= 0 and <= 1, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(5), + state.dataIPShortCut->rNumericArgs(5))); + } + + if ((state.dataIPShortCut->rNumericArgs(6) < 0.0) || (state.dataIPShortCut->rNumericArgs(6) > 1.0)) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(6) + " has been found."); + ShowContinueError(state, + format("{} must be >= 0 or <= 1, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(6), + state.dataIPShortCut->rNumericArgs(6))); + } + + if ((state.dataIPShortCut->rNumericArgs(7) < 0.0) || (state.dataIPShortCut->rNumericArgs(7) > 1.0)) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(7) + " has been found."); + ShowContinueError(state, + format("{} must be >=0 or <=1, entered {:.2R}", + state.dataIPShortCut->cNumericFieldNames(7), + state.dataIPShortCut->rNumericArgs(7))); + } + + if ((state.dataIPShortCut->rNumericArgs(8) < 0.0) || (state.dataIPShortCut->rNumericArgs(8) > 1.0)) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(8) + " has been found."); + ShowContinueError(state, + format("{} must be >=0 or <=1, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(8), + state.dataIPShortCut->rNumericArgs(8))); + } + + if ((state.dataIPShortCut->rNumericArgs(9) < 0.0) || (state.dataIPShortCut->rNumericArgs(9) > 1.0)) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(9) + " has been found."); + ShowContinueError(state, + format("{} must be >=0 or <=1, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(9), + state.dataIPShortCut->rNumericArgs(9))); + } + + if ((state.dataIPShortCut->rNumericArgs(10) < 0.0) || (state.dataIPShortCut->rNumericArgs(10) > 1.0)) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(10) + " has been found."); + ShowContinueError(state, + format("{} must be >=0 or <=1, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(10), + state.dataIPShortCut->rNumericArgs(10))); + } + + if (BITF_TEST_ANY(BITF(state.dataHeatBal->ComplexShade(Loop).LayerType), + BITF(TARCOGParams::TARCOGLayerType::VENETBLIND_HORIZ) | BITF(TARCOGParams::TARCOGLayerType::VENETBLIND_HORIZ))) { + if (state.dataIPShortCut->rNumericArgs(11) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(11) + " has been found."); + ShowContinueError(state, + format("{} must be >0, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(11), + state.dataIPShortCut->rNumericArgs(11))); + } + + if (state.dataIPShortCut->rNumericArgs(12) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(12) + " has been found."); + ShowContinueError(state, + format("{} must be >0, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(12), + state.dataIPShortCut->rNumericArgs(12))); + } + + if (state.dataIPShortCut->rNumericArgs(13) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(13) + " has been found."); + ShowContinueError(state, + format("{} must be >0, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(13), + state.dataIPShortCut->rNumericArgs(13))); + } + + if ((state.dataIPShortCut->rNumericArgs(14) < -90.0) || (state.dataIPShortCut->rNumericArgs(14) > 90.0)) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(14) + " has been found."); + ShowContinueError(state, + format("{} must be >=-90 and <=90, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(14), + state.dataIPShortCut->rNumericArgs(14))); + } + + if (state.dataIPShortCut->rNumericArgs(15) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(15) + " has been found."); + ShowContinueError(state, + format("{} must be >0, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(15), + state.dataIPShortCut->rNumericArgs(15))); + } + + if ((state.dataIPShortCut->rNumericArgs(16) < 0.0) || + ((state.dataIPShortCut->rNumericArgs(16) > 0.0) && + (state.dataIPShortCut->rNumericArgs(16) < (state.dataIPShortCut->rNumericArgs(11) / 2)))) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(16) + " has been found."); + ShowContinueError(state, + format("{} must be =0 or greater than SlatWidth/2, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(16), + state.dataIPShortCut->rNumericArgs(16))); + } + } + + if (ErrorsFound) ShowFatalError(state, "Error in complex fenestration material input."); + } + } + + void SetupComplexFenestrationStateInput(EnergyPlusData &state, + int &ConstrNum, // num of construction items thus far + bool &ErrorsFound) + { + + // SUBROUTINE INFORMATION: + // AUTHOR B. Griffith + // DATE WRITTEN June 2010 + // MODIFIED January 2012 (Simon Vidanovic) + // MODIFIED May 2012 (Simon Vidanovic) + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // get input for complex fenestration construction + + // METHODOLOGY EMPLOYED: + // usual GetInput processing. Matrix input from MatrixDataManager + + // Using/Aliasing + using namespace MatrixDataManager; + using namespace DataBSDFWindow; + + // SUBROUTINE PARAMETER DEFINITIONS: + constexpr const char *RoutineName("SetupComlexFenestrationStateInput: "); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + // The following moved to DataBSDFWindow module: + // INTEGER :: TotComplexFenStates ! Number of complex fenestration construction definitions + int I; // do loop index + int Loop; // do loop counter + int NumAlphas; // Number of Alphas for each GetObjectItem call + int NumNumbers; // Number of Numbers for each GetObjectItem call + int TotalArgs; // Number of fields for each GetObjectItem call + int IOStatus; // Used in GetObjectItem + int iMatGlass; // number of glass layers + int NumRows; // temporary size of matrix + int NumCols; // temporary size of matrix + int NBasis; // temporary number of elements in basis + int Layer; // loop counter for material layers + int AlphaIndex; + int ThermalModelNum; // number of thermal model parameters object + int NumOfTotalLayers; // total number of layers in the construction + int NumOfOpticalLayers; // number of optical layers in the construction (excluding gasses and gas mixtures) + int currentOpticalLayer; // current optical layer number. This is important since optical structures should + // be loaded only with optical layers + + // When reading Construction:ComplexFenestrationState, there is a call of GetMatrix2D which also uses same + // variables from DataIPShortCuts. Since this can cause some errors in reading, it is important + // to declare local variables for reading Construction:ComplexFenestrationState object(s) + Array1D_string locAlphaFieldNames; + Array1D_string locNumericFieldNames; + Array1D_bool locNumericFieldBlanks; + Array1D_bool locAlphaFieldBlanks; + Array1D_string locAlphaArgs; + Array1D locNumericArgs; + std::string locCurrentModuleObject; + auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; + // Reading WindowThermalModel:Params + cCurrentModuleObject = "WindowThermalModel:Params"; + state.dataBSDFWindow->TotThermalModels = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + state.dataHeatBal->WindowThermalModel.allocate(state.dataBSDFWindow->TotThermalModels); + + for (Loop = 1; Loop <= state.dataBSDFWindow->TotThermalModels; ++Loop) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Loop, + state.dataIPShortCut->cAlphaArgs, + NumAlphas, + state.dataIPShortCut->rNumericArgs, + NumNumbers, + IOStatus, + state.dataIPShortCut->lNumericFieldBlanks, + _, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound)) continue; + + state.dataHeatBal->WindowThermalModel(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); + + state.dataHeatBal->WindowThermalModel(Loop).SDScalar = state.dataIPShortCut->rNumericArgs(1); + if ((state.dataIPShortCut->rNumericArgs(1) < 0.0) || (state.dataIPShortCut->rNumericArgs(1) > 1.0)) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(1) + " has been found."); + ShowContinueError(state, + format("{} should be >= 0.0 and <= 1.0, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(1), + state.dataIPShortCut->rNumericArgs(1))); + } + + { + auto const SELECT_CASE_var(state.dataIPShortCut->cAlphaArgs(2)); + if (SELECT_CASE_var == "ISO15099") { + state.dataHeatBal->WindowThermalModel(Loop).CalculationStandard = TARCOGGassesParams::Stdrd::ISO15099; + } else if (SELECT_CASE_var == "EN673DECLARED") { + state.dataHeatBal->WindowThermalModel(Loop).CalculationStandard = TARCOGGassesParams::Stdrd::EN673; + } else if (SELECT_CASE_var == "EN673DESIGN") { + state.dataHeatBal->WindowThermalModel(Loop).CalculationStandard = TARCOGGassesParams::Stdrd::EN673Design; + } else { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(2) + " has been found."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(2) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(2) + + "\" should be ISO15099, EN673Declared or EN673Design."); + } + } + + { + auto const SELECT_CASE_var(state.dataIPShortCut->cAlphaArgs(3)); + if (SELECT_CASE_var == "ISO15099") { + state.dataHeatBal->WindowThermalModel(Loop).ThermalModel = TARCOGParams::TARCOGThermalModel::ISO15099; + } else if (SELECT_CASE_var == "SCALEDCAVITYWIDTH") { + state.dataHeatBal->WindowThermalModel(Loop).ThermalModel = TARCOGParams::TARCOGThermalModel::SCW; + } else if (SELECT_CASE_var == "CONVECTIVESCALARMODEL_NOSDTHICKNESS") { + state.dataHeatBal->WindowThermalModel(Loop).ThermalModel = TARCOGParams::TARCOGThermalModel::CSM; + } else if (SELECT_CASE_var == "CONVECTIVESCALARMODEL_WITHSDTHICKNESS") { + state.dataHeatBal->WindowThermalModel(Loop).ThermalModel = TARCOGParams::TARCOGThermalModel::CSM_WithSDThickness; + } else { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(3) + " has been found."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(3) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(3) + + "\" should be ISO15099, ScaledCavityWidth, ConvectiveScalarModel_NoSDThickness or " + "ConvectiveScalarModel_WithSDThickness."); + } + } + + { + auto const SELECT_CASE_var(state.dataIPShortCut->cAlphaArgs(4)); + if (SELECT_CASE_var == "NODEFLECTION") { + state.dataHeatBal->WindowThermalModel(Loop).DeflectionModel = TARCOGParams::DeflectionCalculation::NONE; + } else if (SELECT_CASE_var == "TEMPERATUREANDPRESSUREINPUT") { + state.dataHeatBal->WindowThermalModel(Loop).DeflectionModel = TARCOGParams::DeflectionCalculation::TEMPERATURE; + } else if (SELECT_CASE_var == "MEASUREDDEFLECTION") { + state.dataHeatBal->WindowThermalModel(Loop).DeflectionModel = TARCOGParams::DeflectionCalculation::GAP_WIDTHS; + } else { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(4) + " has been found."); + ShowContinueError(state, + state.dataIPShortCut->cAlphaFieldNames(4) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(4) + + "\" should be NoDeflection, TemperatureAndPressureInput or MeasuredDeflection."); + } + } + + if (state.dataHeatBal->WindowThermalModel(Loop).DeflectionModel == TARCOGParams::DeflectionCalculation::TEMPERATURE) { + state.dataHeatBal->WindowThermalModel(Loop).VacuumPressureLimit = state.dataIPShortCut->rNumericArgs(2); + if (state.dataIPShortCut->rNumericArgs(2) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(2) + " has been found."); + ShowContinueError(state, + format("{} must be > 0, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(2), + state.dataIPShortCut->rNumericArgs(2))); + } + + state.dataHeatBal->WindowThermalModel(Loop).InitialTemperature = state.dataIPShortCut->rNumericArgs(3); + if (state.dataIPShortCut->rNumericArgs(3) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(3) + " has been found."); + ShowContinueError(state, + format("{} must be > 0, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(3), + state.dataIPShortCut->rNumericArgs(3))); + } + + state.dataHeatBal->WindowThermalModel(Loop).InitialPressure = state.dataIPShortCut->rNumericArgs(4); + if (state.dataIPShortCut->rNumericArgs(4) <= 0.0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + + ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(4) + " has been found."); + ShowContinueError(state, + format("{} must be > 0, entered value = {:.2R}", + state.dataIPShortCut->cNumericFieldNames(4), + state.dataIPShortCut->rNumericArgs(4))); + } + } + + } // DO Loop = 1, TotThermalModels + + // Reading Construction:ComplexFenestrationState + locCurrentModuleObject = "Construction:ComplexFenestrationState"; + state.dataBSDFWindow->TotComplexFenStates = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, locCurrentModuleObject); + + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, locCurrentModuleObject, TotalArgs, NumAlphas, NumNumbers); + if (!allocated(locAlphaFieldNames)) locAlphaFieldNames.allocate(NumAlphas); + if (!allocated(locNumericFieldNames)) locNumericFieldNames.allocate(NumNumbers); + if (!allocated(locNumericFieldBlanks)) locNumericFieldBlanks.allocate(NumNumbers); + if (!allocated(locAlphaFieldBlanks)) locAlphaFieldBlanks.allocate(NumAlphas); + if (!allocated(locAlphaArgs)) locAlphaArgs.allocate(NumAlphas); + if (!allocated(locNumericArgs)) locNumericArgs.allocate(NumNumbers); + + state.dataBSDFWindow->FirstBSDF = ConstrNum + 1; // Location of first BSDF construction input (They will be consecutive) + for (Loop = 1; Loop <= state.dataBSDFWindow->TotComplexFenStates; ++Loop) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + locCurrentModuleObject, + Loop, + locAlphaArgs, + NumAlphas, + locNumericArgs, + NumNumbers, + IOStatus, + locNumericFieldBlanks, + _, + locAlphaFieldNames, + locNumericFieldNames); + if (GlobalNames::VerifyUniqueInterObjectName(state, + state.dataHeatBalMgr->UniqueConstructNames, + locAlphaArgs(1), + state.dataHeatBalMgr->CurrentModuleObject, + locAlphaFieldNames(1), + ErrorsFound)) { + continue; + } + ++ConstrNum; + // Glass layer counter + iMatGlass = 0; + // Simon TODO: This is to be confirmed. If this is just initial value, then we might want to make better guess + state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) = 0.1; + // Simon TODO: If I do not put this, then it is considered that surface is NOT window + state.dataConstruction->Construct(ConstrNum).TransDiff = 0.1; // This is a place holder to flag + // the construction as a window until + // the correct value is entered in WindowComplexManager + + // Now override the deraults as appropriate + state.dataConstruction->Construct(ConstrNum).Name = locAlphaArgs(1); + + // ALLOCATE(Construct(ConstrNum)%BSDFInput) + + // Construct(ConstrNum)%BSDFInput%ThermalConstruction = ThConstNum + + { + auto const SELECT_CASE_var(locAlphaArgs(2)); // Basis Type Keyword + if (SELECT_CASE_var == "LBNLWINDOW") { + state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisType = DataBSDFWindow::Basis::WINDOW; + } else if (SELECT_CASE_var == "USERDEFINED") { + state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisType = DataBSDFWindow::Basis::Custom; + } else { + // throw error + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + locAlphaArgs(1) + ", object. Illegal value for " + + locAlphaFieldNames(2) + " has been found."); + ShowContinueError(state, + locAlphaFieldNames(2) + " entered value=\"" + locAlphaArgs(2) + "\" should be LBNLWindow or UserDefined."); + } + } + + { + auto const SELECT_CASE_var(locAlphaArgs(3)); // Basis Symmetry Keyword + if (SELECT_CASE_var == "AXISYMMETRIC") { + state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisSymmetryType = DataBSDFWindow::BasisSymmetry::Axisymmetric; + } else if (SELECT_CASE_var == "NONE") { + state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisSymmetryType = DataBSDFWindow::BasisSymmetry::None; + } else { + // throw error + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + locAlphaArgs(1) + ", object. Illegal value for " + + locAlphaFieldNames(3) + " has been found."); + ShowContinueError(state, locAlphaFieldNames(3) + " entered value = \"" + locAlphaArgs(3) + "\" should be Axisymmetric or None."); + } + } + + // Simon: Assign thermal model number + ThermalModelNum = UtilityRoutines::FindItemInList(locAlphaArgs(4), state.dataHeatBal->WindowThermalModel); + if (ThermalModelNum == 0) { + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + locAlphaArgs(1) + ", object. Illegal value for " + + locAlphaFieldNames(4) + " has been found."); + ShowContinueError(state, + locAlphaFieldNames(4) + " entered value = \"" + locAlphaArgs(4) + + "\" no corresponding thermal model (WindowThermalModel:Params) found in the input file."); + } else { + state.dataConstruction->Construct(ConstrNum).BSDFInput.ThermalModel = ThermalModelNum; + } + + // *************************************************************************************** + // Basis matrix + // *************************************************************************************** + state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMatIndex = MatrixIndex(state, locAlphaArgs(5)); + Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMatIndex, NumRows, NumCols); + state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMatNrows = NumRows; + state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMatNcols = NumCols; + + if (NumCols != 2 && NumCols != 1) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + locAlphaArgs(1) + ", object. Illegal value for " + + locAlphaFieldNames(5) + " has been found."); + ShowContinueError(state, + locAlphaFieldNames(5) + " entered value=\"" + locAlphaArgs(5) + + "\" invalid matrix dimensions. Basis matrix dimension can only be 2 x 1."); + } + state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMat.allocate(NumCols, NumRows); + Get2DMatrix(state, + state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMatIndex, + state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMat); + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisType == DataBSDFWindow::Basis::WINDOW) + CalculateBasisLength(state, + state.dataConstruction->Construct(ConstrNum).BSDFInput, + ConstrNum, + state.dataConstruction->Construct(ConstrNum).BSDFInput.NBasis); + + // determine number of layers and optical layers + NumOfTotalLayers = (NumAlphas - 9) / 3; + state.dataConstruction->Construct(ConstrNum).TotLayers = NumOfTotalLayers; + + NumOfOpticalLayers = NumOfTotalLayers / 2 + 1; + + state.dataConstruction->Construct(ConstrNum).BSDFInput.NumLayers = NumOfOpticalLayers; + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer.allocate(NumOfOpticalLayers); + + // check for incomplete field set + if (mod((NumAlphas - 9), 3) != 0) { + // throw warning if incomplete field set + ErrorsFound = true; + ShowSevereError( + state, std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + ", object. Incomplete field set found."); + ShowContinueError(state, locAlphaArgs(1) + " is missing some of the layers or/and gaps."); + } + + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisSymmetryType == DataBSDFWindow::BasisSymmetry::None) { + // Non-Symmetric basis + + NBasis = state.dataConstruction->Construct(ConstrNum).BSDFInput.NBasis; + + // ******************************************************************************* + // Solar front transmittance + // ******************************************************************************* + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex = MatrixIndex(state, locAlphaArgs(6)); + Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex, NumRows, NumCols); + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransNrows = NumRows; + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransNcols = NumCols; + + if (NumRows != NBasis) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Illegal matrix size has been found."); + ShowContinueError( + state, + "Solar front transmittance matrix \"" + locAlphaArgs(6) + + "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + + locAlphaArgs(5) + "\"."); + } + + if (NumRows != NumCols) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + "\", object. Invalid BSDF matrix dimensions."); + ShowContinueError(state, + "Solar front transmittance matrix \"" + locAlphaArgs(6) + "\" must have the same number of rows and columns."); + } + + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisType == DataBSDFWindow::Basis::Custom) { + state.dataConstruction->Construct(ConstrNum).BSDFInput.NBasis = NumRows; // For custom basis, no rows in transmittance + // matrix defines the basis length + } + + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTrans.allocate(NumCols, NumRows); + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex == 0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Referenced Matrix:TwoDimension is missing from the input file."); + ShowContinueError(state, + "Solar front transmittance Matrix:TwoDimension = \"" + locAlphaArgs(6) + "\" is missing from the input file."); + } else { + Get2DMatrix(state, + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex, + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTrans); + } + + // ******************************************************************************* + // Solar back reflectance + // ******************************************************************************* + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex = MatrixIndex(state, locAlphaArgs(7)); + Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex, NumRows, NumCols); + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflNrows = NumRows; + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflNcols = NumCols; + + if (NumRows != NBasis) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Illegal matrix size has been found."); + ShowContinueError( + state, + "Solar back reflectance matrix \"" + locAlphaArgs(7) + + "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + + locAlphaArgs(5) + "\"."); + } + + if (NumRows != NumCols) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + "\", object. Invalid BSDF matrix dimensions."); + ShowContinueError(state, + "Solar bakc reflectance matrix \"" + locAlphaArgs(7) + "\" must have the same number of rows and columns."); + } + + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkRefl.allocate(NumCols, NumRows); + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex == 0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Referenced Matrix:TwoDimension is missing from the input file."); + ShowContinueError(state, + "Solar back reflectance Matrix:TwoDimension = \"" + locAlphaArgs(7) + "\" is missing from the input file."); + } else { + Get2DMatrix(state, + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex, + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkRefl); + } + + // ******************************************************************************* + // Visible front transmittance + // ******************************************************************************* + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex = MatrixIndex(state, locAlphaArgs(8)); + Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex, NumRows, NumCols); + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransNrows = NumRows; + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransNcols = NumCols; + + if (NumRows != NBasis) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Illegal matrix size has been found."); + ShowContinueError( + state, + "Visible front transmittance matrix \"" + locAlphaArgs(8) + + "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + + locAlphaArgs(5) + "\"."); + } + + if (NumRows != NumCols) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + "\", object. Invalid BSDF matrix dimensions."); + ShowContinueError( + state, "Visible front transmittance matrix \"" + locAlphaArgs(8) + "\" must have the same number of rows and columns."); + } + + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTrans.allocate(NumCols, NumRows); + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex == 0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + cCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Referenced Matrix:TwoDimension is missing from the input file."); + ShowContinueError( + state, "Visible front transmittance Matrix:TwoDimension = \"" + locAlphaArgs(8) + "\" is missing from the input file."); + } else { + Get2DMatrix(state, + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex, + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTrans); + } + + // ******************************************************************************* + // Visible back reflectance + // ******************************************************************************* + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex = MatrixIndex(state, locAlphaArgs(9)); + Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex, NumRows, NumCols); + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflNrows = NumRows; + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflNcols = NumCols; + + if (NumRows != NBasis) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Illegal matrix size has been found."); + ShowContinueError( + state, + "Visible back reflectance matrix \"" + locAlphaArgs(9) + + "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + + locAlphaArgs(5) + "\"."); + } + + if (NumRows != NumCols) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + "\", object. Invalid BSDF matrix dimensions."); + ShowContinueError(state, "Visible back reflectance \"" + locAlphaArgs(9) + "\" must have the same number of rows and columns."); + } + + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkRefl.allocate(NumCols, NumRows); + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex == 0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Referenced Matrix:TwoDimension is missing from the input file."); + ShowContinueError(state, + "Visble back reflectance Matrix:TwoDimension = \"" + locAlphaArgs(9) + "\" is missing from the input file."); + } else { + Get2DMatrix(state, + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex, + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkRefl); + } + + // ALLOCATE(Construct(ConstrNum)%BSDFInput%Layer(NumOfOpticalLayers)) + for (Layer = 1; Layer <= state.dataConstruction->Construct(ConstrNum).TotLayers; ++Layer) { + AlphaIndex = 9 + (Layer * 3) - 2; + currentOpticalLayer = int(Layer / 2) + 1; + // Material info is contained in the thermal construct + state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) = + UtilityRoutines::FindItemInList(locAlphaArgs(AlphaIndex), state.dataMaterial->Material); + + // Simon: Load only if optical layer + if (mod(Layer, 2) != 0) { + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).MaterialIndex = + state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer); + + ++AlphaIndex; + // ******************************************************************************* + // Front absorptance matrix + // ******************************************************************************* + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex = + MatrixIndex(state, locAlphaArgs(AlphaIndex)); + Get2DMatrixDimensions( + state, state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex, NumRows, NumCols); + + if (NumRows != 1) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + + "\", object. Incorrect matrix dimension."); + ShowContinueError(state, + format("Front absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have only one row.", + locAlphaArgs(AlphaIndex), + currentOpticalLayer)); + } + + if (NumCols != NBasis) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + + "\", object. Incorrect matrix dimension."); + ShowContinueError(state, + format("Front absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have same number of columns " + "as it is defined by basis matrix.", + locAlphaArgs(AlphaIndex), + currentOpticalLayer)); + ShowContinueError( + state, + format("Matrix has {} number of columns, while basis definition specifies {} number of columns.", NumCols, NBasis)); + } + + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).AbsNcols = NumCols; + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbs.allocate(NumCols, NumRows); + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex == 0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Referenced Matrix:TwoDimension is missing from the input file."); + ShowContinueError(state, + format("Front absorbtance Matrix:TwoDimension = \"{}\" for layer {} is missing from the input file.", + locAlphaArgs(AlphaIndex), + currentOpticalLayer)); + } else { + Get2DMatrix(state, + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex, + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbs); + } + + ++AlphaIndex; + // ******************************************************************************* + // Back absorptance matrix + // ******************************************************************************* + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex = + MatrixIndex(state, locAlphaArgs(AlphaIndex)); + Get2DMatrixDimensions( + state, state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex, NumRows, NumCols); + + if (NumRows != 1) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + + "\", object. Incorrect matrix dimension."); + ShowContinueError(state, + format("Back absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have only one row.", + locAlphaArgs(AlphaIndex), + currentOpticalLayer)); + } + + if (NumCols != NBasis) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + + "\", object. Incorrect matrix dimension."); + ShowContinueError(state, + format("Back absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have same number of columns as " + "it is defined by basis matrix.", + locAlphaArgs(AlphaIndex), + currentOpticalLayer)); + ShowContinueError( + state, + format("Matrix has {} number of columns, while basis definition specifies {} number of columns.", NumCols, NBasis)); + } + + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbs.allocate(NumCols, NumRows); + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex == 0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Referenced Matrix:TwoDimension is missing from the input file."); + ShowContinueError(state, + format("Back absorbtance Matrix:TwoDimension = \"{}\" for layer {} is missing from the input file.", + locAlphaArgs(AlphaIndex), + currentOpticalLayer)); + } else { + Get2DMatrix(state, + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex, + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbs); + } + } // if (Mod(Layer, 2) <> 0) then + } + } else { + // Axisymmetric basis + NBasis = state.dataConstruction->Construct(ConstrNum).BSDFInput.NBasis; // Basis length has already been calculated + state.dataBSDFWindow->BSDFTempMtrx.allocate(NBasis, 1); + + // ******************************************************************************* + // Solar front transmittance + // ******************************************************************************* + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex = MatrixIndex(state, locAlphaArgs(6)); + Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex, NumRows, NumCols); + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransNrows = NBasis; + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransNcols = NBasis; + + if (NumRows != NBasis) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Illegal matrix size has been found."); + ShowContinueError( + state, + "Solar front transmittance matrix \"" + locAlphaArgs(6) + + "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + + locAlphaArgs(5) + "\"."); + } + + if (NumRows != NumCols) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + "\", object. Invalid BSDF matrix dimensions."); + ShowContinueError(state, + "Solar front transmittance matrix \"" + locAlphaArgs(6) + "\" must have the same number of rows and columns."); + } + + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTrans.allocate(NBasis, NBasis); + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex == 0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Referenced Matrix:TwoDimension is missing from the input file."); + ShowContinueError(state, + "Solar front transmittance Matrix:TwoDimension = \"" + locAlphaArgs(6) + "\" is missing from the input file."); + } else { + Get2DMatrix(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex, state.dataBSDFWindow->BSDFTempMtrx); + + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTrans = 0.0; + for (I = 1; I <= NBasis; ++I) { + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTrans(I, I) = state.dataBSDFWindow->BSDFTempMtrx(I, 1); + } + } + + // ******************************************************************************* + // Solar back reflectance + // ******************************************************************************* + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex = MatrixIndex(state, locAlphaArgs(7)); + Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex, NumRows, NumCols); + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflNrows = NBasis; + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflNcols = NBasis; + + if (NumRows != NBasis) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Illegal matrix size has been found."); + ShowContinueError( + state, + "Solar back reflectance matrix \"" + locAlphaArgs(7) + + "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + + locAlphaArgs(5) + "\"."); + } + + if (NumRows != NumCols) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + "\", object. Invalid BSDF matrix dimensions."); + ShowContinueError(state, + "Solar back reflectance matrix \"" + locAlphaArgs(7) + "\" must have the same number of rows and columns."); + } + + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkRefl.allocate(NBasis, NBasis); + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex == 0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Referenced Matrix:TwoDimension is missing from the input file."); + ShowContinueError(state, + "Solar back reflectance Matrix:TwoDimension = \"" + locAlphaArgs(7) + "\" is missing from the input file."); + } else { + Get2DMatrix(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex, state.dataBSDFWindow->BSDFTempMtrx); + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkRefl = 0.0; + for (I = 1; I <= NBasis; ++I) { + state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkRefl(I, I) = state.dataBSDFWindow->BSDFTempMtrx(I, 1); + } + } + + // ******************************************************************************* + // Visible front transmittance + // ******************************************************************************* + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex = MatrixIndex(state, locAlphaArgs(8)); + Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex, NumRows, NumCols); + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransNrows = NBasis; + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransNcols = NBasis; + + if (NumRows != NBasis) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Illegal matrix size has been found."); + ShowContinueError( + state, + "Visible front transmittance matrix \"" + locAlphaArgs(8) + + "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + + locAlphaArgs(5) + "\"."); + } + + if (NumRows != NumCols) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + "\", object. Invalid BSDF matrix dimensions."); + ShowContinueError( + state, "Visible front transmittance matrix \"" + locAlphaArgs(8) + "\" must have the same number of rows and columns."); + } + + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTrans.allocate(NBasis, NBasis); + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex == 0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Referenced Matrix:TwoDimension is missing from the input file."); + ShowContinueError( + state, "Visible front transmittance Matrix:TwoDimension = \"" + locAlphaArgs(8) + "\" is missing from the input file."); + } else { + Get2DMatrix(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex, state.dataBSDFWindow->BSDFTempMtrx); + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTrans = 0.0; + for (I = 1; I <= NBasis; ++I) { + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTrans(I, I) = state.dataBSDFWindow->BSDFTempMtrx(I, 1); + } + } + + // ******************************************************************************* + // Visible back reflectance + // ******************************************************************************* + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex = MatrixIndex(state, locAlphaArgs(9)); + Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex, NumRows, NumCols); + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflNrows = NBasis; + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflNcols = NBasis; + + if (NumRows != NBasis) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Illegal matrix size has been found."); + ShowContinueError( + state, + "Visible back reflectance matrix \"" + locAlphaArgs(9) + + "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + + locAlphaArgs(5) + "\"."); + } + + if (NumRows != NumCols) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + "\", object. Invalid BSDF matrix dimensions."); + ShowContinueError(state, + "Visible back reflectance matrix \"" + locAlphaArgs(9) + "\" must have the same number of rows and columns."); + } + + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkRefl.allocate(NBasis, NBasis); + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex == 0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Referenced Matrix:TwoDimension is missing from the input file."); + ShowContinueError(state, + "Visible back reflectance Matrix:TwoDimension = \"" + locAlphaArgs(9) + "\" is missing from the input file."); + } else { + Get2DMatrix(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex, state.dataBSDFWindow->BSDFTempMtrx); + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkRefl = 0.0; + for (I = 1; I <= NBasis; ++I) { + state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkRefl(I, I) = state.dataBSDFWindow->BSDFTempMtrx(I, 1); + } + } + + // determine number of layers + // Construct(ConstrNum)%TotLayers = (NumAlphas - 9)/3 + + // check for incomplete field set + // IF (Mod((NumAlphas - 9), 3) /= 0) Then + // throw warning if incomplete field set + // CALL ShowWarningError(state, 'Construction:ComplexFenestrationState: Axisymmetric properties have incomplete field & + // & set') + // ENDIF + + // ALLOCATE(Construct(ConstrNum)%BSDFInput%Layer(NumOfOpticalLayers)) + for (Layer = 1; Layer <= state.dataConstruction->Construct(ConstrNum).TotLayers; ++Layer) { + AlphaIndex = 9 + (Layer * 3) - 2; + currentOpticalLayer = int(Layer / 2) + 1; + + state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) = + UtilityRoutines::FindItemInList(locAlphaArgs(AlphaIndex), state.dataMaterial->Material); + + if (mod(Layer, 2) != 0) { + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).MaterialIndex = + state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer); + + // ******************************************************************************* + // Front absorptance matrix + // ******************************************************************************* + ++AlphaIndex; + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex = + MatrixIndex(state, locAlphaArgs(AlphaIndex)); + Get2DMatrixDimensions( + state, state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex, NumRows, NumCols); + + if (NumRows != 1) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + + "\", object. Incorrect matrix dimension."); + ShowContinueError(state, + format("Front absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have only one row.", + locAlphaArgs(AlphaIndex), + currentOpticalLayer)); + } + + if (NumCols != NBasis) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + + "\", object. Incorrect matrix dimension."); + ShowContinueError(state, + format("Front absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have same number of columns " + "as it is defined by basis matrix.", + locAlphaArgs(AlphaIndex), + currentOpticalLayer)); + ShowContinueError( + state, + format("Matrix has {} number of columns, while basis definition specifies {} number of columns.", NumCols, NBasis)); + } + + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).AbsNcols = NumCols; + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbs.allocate(NumCols, NumRows); + + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex == 0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Referenced Matrix:TwoDimension is missing from the input file."); + ShowContinueError(state, + format("Front absorbtance Matrix:TwoDimension = \"{}\" for layer {} is missing from the input file.", + locAlphaArgs(AlphaIndex), + currentOpticalLayer)); + } else { + Get2DMatrix(state, + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex, + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbs); + } + + // ******************************************************************************* + // Back absorptance matrix + // ******************************************************************************* + ++AlphaIndex; + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex = + MatrixIndex(state, locAlphaArgs(AlphaIndex)); + Get2DMatrixDimensions( + state, state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex, NumRows, NumCols); + + if (NumRows != 1) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + + "\", object. Incorrect matrix dimension."); + ShowContinueError(state, + format("Back absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have only one row.", + locAlphaArgs(AlphaIndex), + currentOpticalLayer)); + } + + if (NumCols != NBasis) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + + "\", object. Incorrect matrix dimension."); + ShowContinueError(state, + format("Back absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have same number of columns as " + "it is defined by basis matrix.", + locAlphaArgs(AlphaIndex), + currentOpticalLayer)); + ShowContinueError( + state, + format("Matrix has {} number of columns, while basis definition specifies {} number of columns.", NumCols, NBasis)); + } + + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbs.allocate(NumCols, NumRows); + + if (state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex == 0) { + ErrorsFound = true; + ShowSevereError(state, + std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + + ", object. Referenced Matrix:TwoDimension is missing from the input file."); + ShowContinueError(state, + format("Back absorbtance Matrix:TwoDimension = \"{}\" for layer {} is missing from the input file.", + locAlphaArgs(AlphaIndex), + currentOpticalLayer)); + } else { + Get2DMatrix(state, + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex, + state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbs); + } + } // if (Mod(Layer, 2) <> 0) then + } + + state.dataBSDFWindow->BSDFTempMtrx.deallocate(); + } + state.dataConstruction->Construct(ConstrNum).TypeIsWindow = true; + state.dataConstruction->Construct(ConstrNum).WindowTypeBSDF = true; + } + + // Do not forget to deallocate localy allocated variables + if (allocated(locAlphaFieldNames)) locAlphaFieldNames.deallocate(); + if (allocated(locNumericFieldNames)) locNumericFieldNames.deallocate(); + if (allocated(locNumericFieldBlanks)) locNumericFieldBlanks.deallocate(); + if (allocated(locAlphaFieldBlanks)) locAlphaFieldBlanks.deallocate(); + if (allocated(locAlphaArgs)) locAlphaArgs.deallocate(); + if (allocated(locNumericArgs)) locNumericArgs.deallocate(); + + if (ErrorsFound) ShowFatalError(state, "Error in complex fenestration input."); + } + + void InitConductionTransferFunctions(EnergyPlusData &state) + { + bool ErrorsFound(false); // Flag for input error condition + bool DoCTFErrorReport(false); + for (auto &construction : state.dataConstruction->Construct) { + construction.calculateTransferFunction(state, ErrorsFound, DoCTFErrorReport); + if (construction.NumHistories > 1) { + state.dataHeatBal->SimpleCTFOnly = false; + } + if (construction.NumCTFTerms > state.dataHeatBal->MaxCTFTerms) { + state.dataHeatBal->MaxCTFTerms = construction.NumCTFTerms; + } + } + if (state.dataHeatBal->AnyInternalHeatSourceInInput) { + state.dataHeatBal->SimpleCTFOnly = false; + } + + bool InitCTFDoReport; + General::ScanForReports(state, "Constructions", InitCTFDoReport, "Constructions"); + if (InitCTFDoReport || DoCTFErrorReport) { + print(state.files.eio, + "! ,Construction Name,Index,#Layers,#CTFs,Time Step {{hours}},ThermalConductance " + "{{w/m2-K}},OuterThermalAbsorptance,InnerThermalAbsorptance,OuterSolarAbsorptance,InnerSolarAbsorptance,Roughness\n"); + print(state.files.eio, + "! ,Material Name,Thickness {{m}},Conductivity {{w/m-K}},Density {{kg/m3}},Specific Heat " + "{{J/kg-K}},ThermalResistance {{m2-K/w}}\n"); + print(state.files.eio, "! ,Material Name,ThermalResistance {{m2-K/w}}\n"); + print(state.files.eio, "! ,Time,Outside,Cross,Inside,Flux (except final one)\n"); + + int cCounter = 0; // just used to keep construction index in output report + for (auto &construction : state.dataConstruction->Construct) { + cCounter++; + if (!construction.IsUsedCTF) continue; + construction.reportTransferFunction(state, cCounter); + } + } + + if (ErrorsFound) { + ShowFatalError(state, "Program terminated for reasons listed (InitConductionTransferFunctions)"); + } + } + +} // namespace HeatBalanceManager + +} // namespace EnergyPlus diff --git a/src/EnergyPlus/ForceSpaceHeatBalance/SimulationManager.cc b/src/EnergyPlus/ForceSpaceHeatBalance/SimulationManager.cc new file mode 100644 index 00000000000..65912d3f63e --- /dev/null +++ b/src/EnergyPlus/ForceSpaceHeatBalance/SimulationManager.cc @@ -0,0 +1,2770 @@ +// EnergyPlus, Copyright (c) 1996-2022, The Board of Trustees of the University of Illinois, +// The Regents of the University of California, through Lawrence Berkeley National Laboratory +// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge +// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other +// contributors. All rights reserved. +// +// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the +// U.S. Government consequently retains certain rights. As such, the U.S. Government has been +// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, +// worldwide license in the Software to reproduce, distribute copies to the public, prepare +// derivative works, and perform publicly and display publicly, and to permit others to do so. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted +// provided that the following conditions are met: +// +// (1) Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// (2) Redistributions in binary form must reproduce the above copyright notice, this list of +// conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, +// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific prior +// written permission. +// +// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form +// without changes from the version obtained under this License, or (ii) Licensee makes a +// reference solely to the software portion of its product, Licensee must refer to the +// software as "EnergyPlus version X" software, where "X" is the version number Licensee +// obtained under this License and may not use a different name for the software. Except as +// specifically required in this Section (4), Licensee shall not use in a company name, a +// product name, in advertising, publicity, or other promotional activities any name, trade +// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly +// similar designation, without the U.S. Department of Energy's prior written consent. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +// FMI-Related Headers +extern "C" { +#include +} + +// C++ Headers +#include +#include + +// ObjexxFCL Headers +#include +#include +#include +#include +#include + +// EnergyPlus Headers +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace EnergyPlus { +namespace SimulationManager { + + // MODULE INFORMATION: + // AUTHOR Rick Strand + // DATE WRITTEN January 1997 + + // PURPOSE OF THIS MODULE: + // This module contains the main driver routine which manages the major + // control loops of the EnergyPlus simulation. This module is also + // responsible for setting the global environment flags for these + // loops. + + // METHODOLOGY EMPLOYED: + // This module was constructed from the remnants of (I)BLAST routines + // SIMBLD (Simulate Building), SIMZG (Simulate Zone Group), and SIMZGD + // (Simulate Zone Group for a Day). + + // REFERENCES: + // (I)BLAST legacy code, internal Reverse Engineering documentation, + // and internal Evolutionary Engineering documentation. + + // Using/Aliasing + using namespace DataSizing; + using namespace DataSystemVariables; + using namespace HeatBalanceManager; + using namespace WeatherManager; + using namespace ExternalInterface; + + // MODULE PARAMETER DEFINITIONS: + + void ManageSimulation(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Rick Strand + // DATE WRITTEN January 1997 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine is the main driver of the simulation manager module. + // It contains the main environment-time loops for the building + // simulation. This includes the environment loop, a day loop, an + // hour loop, and a time step loop. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + bool ErrorsFound(false); + bool TerminalError(false); + bool oneTimeUnderwaterBoundaryCheck = true; + bool AnyUnderwaterBoundaries = false; + + state.files.outputControl.getInput(state); + state.dataResultsFramework->resultsFramework->setupOutputOptions(state); + + state.files.debug.ensure_open(state, "OpenOutputFiles", state.files.outputControl.dbg); + + // CreateSQLiteDatabase(); + state.dataSQLiteProcedures->sqlite = EnergyPlus::CreateSQLiteDatabase(state); + + if (state.dataSQLiteProcedures->sqlite) { + state.dataSQLiteProcedures->sqlite->sqliteBegin(); + state.dataSQLiteProcedures->sqlite->createSQLiteSimulationsRecord( + 1, state.dataStrGlobals->VerStringVar, state.dataStrGlobals->CurrentDateTime); + state.dataSQLiteProcedures->sqlite->sqliteCommit(); + } + + PostIPProcessing(state); + + state.dataGlobal->BeginSimFlag = true; + state.dataGlobal->DoOutputReporting = false; + state.dataReportFlag->DisplayPerfSimulationFlag = false; + state.dataReportFlag->DoWeatherInitReporting = false; + state.dataSimulationManager->RunPeriodsInInput = + (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "RunPeriod") > 0 || + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "RunPeriod:CustomRange") > 0 || state.dataSysVars->FullAnnualRun); + state.dataErrTracking->AskForConnectionsReport = false; // set to false until sizing is finished + + OpenOutputFiles(state); + GetProjectData(state); + Psychrometrics::InitializePsychRoutines(state); + CheckForMisMatchedEnvironmentSpecifications(state); + CheckForRequestedReporting(state); + OutputReportPredefined::SetPredefinedTables(state); + SetPreConstructionInputParameters(state); // establish array bounds for constructions early + + OutputProcessor::SetupTimePointers( + state, OutputProcessor::SOVTimeStepType::Zone, state.dataGlobal->TimeStepZone); // Set up Time pointer for HB/Zone Simulation + OutputProcessor::SetupTimePointers(state, OutputProcessor::SOVTimeStepType::HVAC, state.dataHVACGlobal->TimeStepSys); + + createFacilityElectricPowerServiceObject(state); + createCoilSelectionReportObj(state); + // read object information early in simulation + isInputObjectUsed(state); + + BranchInputManager::ManageBranchInput(state); // just gets input and returns. + + // Create a new plugin manager which starts up the Python interpreter + state.dataPluginManager->pluginManager = std::make_unique(state); + + state.dataGlobal->DoingSizing = true; + SizingManager::ManageSizing(state); + + bool SimsDone = false; + if (state.dataGlobal->DoDesDaySim || state.dataGlobal->DoWeathSim || state.dataGlobal->DoHVACSizingSimulation) { + state.dataGlobal->DoOutputReporting = true; + } + state.dataGlobal->DoingSizing = false; + // state.dataHeatBal->doSpaceHeatBalance = state.dataHeatBal->doSpaceHeatBalanceSimulation; + state.dataHeatBal->doSpaceHeatBalance = true; + + if ((state.dataGlobal->DoZoneSizing || state.dataGlobal->DoSystemSizing || state.dataGlobal->DoPlantSizing) && + !(state.dataGlobal->DoDesDaySim || (state.dataGlobal->DoWeathSim && state.dataSimulationManager->RunPeriodsInInput))) { + ShowWarningError(state, + "ManageSimulation: Input file has requested Sizing Calculations but no Simulations are requested (in SimulationControl " + "object). Succeeding warnings/errors may be confusing."); + } + bool Available = true; // an environment is available to process + + if (state.dataGlobal->DoPureLoadCalc) { + state.dataGlobal->DoOutputReporting = true; + Available = false; + state.dataOutRptTab->WriteTabularFiles = true; + } + + if (state.dataBranchInputManager->InvalidBranchDefinitions) { + ShowFatalError(state, "Preceding error(s) in Branch Input cause termination."); + } + + DisplayString(state, "Adjusting Air System Sizing"); + SizingManager::ManageSystemSizingAdjustments(state); + + DisplayString(state, "Adjusting Standard 62.1 Ventilation Sizing"); + SizingManager::ManageSystemVentilationAdjustments(state); + + DisplayString(state, "Initializing Simulation"); + state.dataGlobal->KickOffSimulation = true; + + ResetEnvironmentCounter(state); + SetupSimulation(state, ErrorsFound); + + FaultsManager::CheckAndReadFaults(state); + + Curve::InitCurveReporting(state); + + state.dataErrTracking->AskForConnectionsReport = true; // set to true now that input processing and sizing is done. + state.dataGlobal->KickOffSimulation = false; + state.dataGlobal->WarmupFlag = false; + state.dataReportFlag->DoWeatherInitReporting = true; + + // Note: All the inputs have been 'gotten' by the time we get here. + bool ErrFound = false; + if (state.dataGlobal->DoOutputReporting) { + DisplayString(state, "Reporting Surfaces"); + + ReportSurfaces(state); + + NodeInputManager::SetupNodeVarsForReporting(state); + state.dataGlobal->MetersHaveBeenInitialized = true; + PollutionModule::SetupPollutionMeterReporting(state); + SystemReports::AllocateAndSetUpVentReports(state); + if (state.dataPluginManager->pluginManager) { + EnergyPlus::PluginManagement::PluginManager::setupOutputVariables(state); + } + UpdateMeterReporting(state); + PollutionModule::CheckPollutionMeterReporting(state); + state.dataElectPwrSvcMgr->facilityElectricServiceObj->verifyCustomMetersElecPowerMgr(state); + PollutionModule::SetupPollutionCalculations(state); + DemandManager::InitDemandManagers(state); + BranchInputManager::TestBranchIntegrity(state, ErrFound); + if (ErrFound) TerminalError = true; + TestAirPathIntegrity(state, ErrFound); + if (ErrFound) TerminalError = true; + NodeInputManager::CheckMarkedNodes(state, ErrFound); + if (ErrFound) TerminalError = true; + BranchNodeConnections::CheckNodeConnections(state, ErrFound); + if (ErrFound) TerminalError = true; + BranchNodeConnections::TestCompSetInletOutletNodes(state, ErrFound); + if (ErrFound) TerminalError = true; + MixedAir::CheckControllerLists(state, ErrFound); + if (ErrFound) TerminalError = true; + + if (state.dataGlobal->DoDesDaySim || state.dataGlobal->DoWeathSim || state.dataGlobal->DoPureLoadCalc) { + ReportLoopConnections(state); + SystemReports::ReportAirLoopConnections(state); + ReportNodeConnections(state); + } + SystemReports::CreateEnergyReportStructure(state); + bool anyEMSRan; + // point to finish setup processing EMS, sensor ready now + EMSManager::ManageEMS(state, EMSManager::EMSCallFrom::SetupSimulation, anyEMSRan, ObjexxFCL::Optional_int_const()); + ProduceRDDMDD(state); + + if (TerminalError) { + ShowFatalError(state, "Previous Conditions cause program termination."); + } + } + + // up until this point, output vars, meters, actuators, etc., may not have been registered; they are now + state.dataPluginManager->fullyReady = true; + + if (state.dataSQLiteProcedures->sqlite) { + state.dataSQLiteProcedures->sqlite->sqliteBegin(); + state.dataSQLiteProcedures->sqlite->updateSQLiteSimulationRecord(1, state.dataGlobal->NumOfTimeStepInHour); + state.dataSQLiteProcedures->sqlite->sqliteCommit(); + } + + EconomicLifeCycleCost::GetInputForLifeCycleCost(state); // must be prior to WriteTabularReports -- do here before big simulation stuff. + + // check for variable latitude/location/etc + WeatherManager::ReadVariableLocationOrientation(state); + + // if user requested HVAC Sizing Simulation, call HVAC sizing simulation manager + if (state.dataGlobal->DoHVACSizingSimulation) { + ManageHVACSizingSimulation(state, ErrorsFound); + } + + if (!state.dataGlobal->DoPureLoadCalc) { + ShowMessage(state, "Beginning Simulation"); + DisplayString(state, "Beginning Primary Simulation"); + } + ResetEnvironmentCounter(state); + + int EnvCount = 0; + state.dataGlobal->WarmupFlag = true; + + while (Available) { + if (state.dataGlobal->stopSimulation) break; + + GetNextEnvironment(state, Available, ErrorsFound); + + if (!Available) break; + if (ErrorsFound) break; + if ((!state.dataGlobal->DoDesDaySim) && (state.dataGlobal->KindOfSim != DataGlobalConstants::KindOfSim::RunPeriodWeather)) continue; + if ((!state.dataGlobal->DoWeathSim) && (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::RunPeriodWeather)) continue; + if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeDesignDay) + continue; // don't run these here, only for sizing simulations + + if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeRunPeriodDesign) + continue; // don't run these here, only for sizing simulations + + ++EnvCount; + + if (state.dataSQLiteProcedures->sqlite) { + state.dataSQLiteProcedures->sqlite->sqliteBegin(); + state.dataSQLiteProcedures->sqlite->createSQLiteEnvironmentPeriodRecord( + state.dataEnvrn->CurEnvirNum, state.dataEnvrn->EnvironmentName, state.dataGlobal->KindOfSim); + state.dataSQLiteProcedures->sqlite->sqliteCommit(); + } + + state.dataErrTracking->ExitDuringSimulations = true; + SimsDone = true; + DisplayString(state, "Initializing New Environment Parameters"); + + state.dataGlobal->BeginEnvrnFlag = true; + state.dataGlobal->EndEnvrnFlag = false; + state.dataEnvrn->EndMonthFlag = false; + state.dataGlobal->WarmupFlag = true; + state.dataGlobal->DayOfSim = 0; + state.dataGlobal->DayOfSimChr = "0"; + state.dataReportFlag->NumOfWarmupDays = 0; + if (state.dataEnvrn->CurrentYearIsLeapYear) { + if (state.dataGlobal->NumOfDayInEnvrn <= 366) { + state.dataOutputProcessor->isFinalYear = true; + } + } else { + if (state.dataGlobal->NumOfDayInEnvrn <= 365) { + state.dataOutputProcessor->isFinalYear = true; + } + } + + HVACManager::ResetNodeData(state); // Reset here, because some zone calcs rely on node data (e.g. ZoneITEquip) + + bool anyEMSRan; + ManageEMS(state, EMSManager::EMSCallFrom::BeginNewEnvironment, anyEMSRan, ObjexxFCL::Optional_int_const()); // calling point + + while ((state.dataGlobal->DayOfSim < state.dataGlobal->NumOfDayInEnvrn) || (state.dataGlobal->WarmupFlag)) { // Begin day loop ... + if (state.dataGlobal->stopSimulation) break; + + if (state.dataSQLiteProcedures->sqlite) state.dataSQLiteProcedures->sqlite->sqliteBegin(); // setup for one transaction per day + + ++state.dataGlobal->DayOfSim; + state.dataGlobal->DayOfSimChr = fmt::to_string(state.dataGlobal->DayOfSim); + if (!state.dataGlobal->WarmupFlag) { + ++state.dataEnvrn->CurrentOverallSimDay; + DisplaySimDaysProgress(state, state.dataEnvrn->CurrentOverallSimDay, state.dataEnvrn->TotalOverallSimDays); + } else { + state.dataGlobal->DayOfSimChr = "0"; + } + state.dataGlobal->BeginDayFlag = true; + state.dataGlobal->EndDayFlag = false; + + if (state.dataGlobal->WarmupFlag) { + ++state.dataReportFlag->NumOfWarmupDays; + state.dataReportFlag->cWarmupDay = fmt::to_string(state.dataReportFlag->NumOfWarmupDays); + DisplayString(state, "Warming up {" + state.dataReportFlag->cWarmupDay + '}'); + } else if (state.dataGlobal->DayOfSim == 1) { + if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::RunPeriodWeather) { + DisplayString(state, "Starting Simulation at " + state.dataEnvrn->CurMnDyYr + " for " + state.dataEnvrn->EnvironmentName); + } else { + DisplayString(state, "Starting Simulation at " + state.dataEnvrn->CurMnDy + " for " + state.dataEnvrn->EnvironmentName); + } + static constexpr std::string_view Format_700("Environment:WarmupDays,{:3}\n"); + print(state.files.eio, Format_700, state.dataReportFlag->NumOfWarmupDays); + OutputProcessor::ResetAccumulationWhenWarmupComplete(state); + } else if (state.dataReportFlag->DisplayPerfSimulationFlag) { + if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::RunPeriodWeather) { + DisplayString(state, "Continuing Simulation at " + state.dataEnvrn->CurMnDyYr + " for " + state.dataEnvrn->EnvironmentName); + } else { + DisplayString(state, "Continuing Simulation at " + state.dataEnvrn->CurMnDy + " for " + state.dataEnvrn->EnvironmentName); + } + state.dataReportFlag->DisplayPerfSimulationFlag = false; + } + // for simulations that last longer than a week, identify when the last year of the simulation is started + if ((state.dataGlobal->DayOfSim > 365) && ((state.dataGlobal->NumOfDayInEnvrn - state.dataGlobal->DayOfSim) == 364) && + !state.dataGlobal->WarmupFlag) { + DisplayString(state, "Starting last year of environment at: " + state.dataGlobal->DayOfSimChr); + OutputReportTabular::ResetTabularReports(state); + } + + for (state.dataGlobal->HourOfDay = 1; state.dataGlobal->HourOfDay <= 24; ++state.dataGlobal->HourOfDay) { // Begin hour loop ... + if (state.dataGlobal->stopSimulation) break; + + state.dataGlobal->BeginHourFlag = true; + state.dataGlobal->EndHourFlag = false; + + for (state.dataGlobal->TimeStep = 1; state.dataGlobal->TimeStep <= state.dataGlobal->NumOfTimeStepInHour; + ++state.dataGlobal->TimeStep) { + if (state.dataGlobal->stopSimulation) break; + + if (state.dataGlobal->AnySlabsInModel || state.dataGlobal->AnyBasementsInModel) { + PlantPipingSystemsManager::SimulateGroundDomains(state, false); + } + + if (AnyUnderwaterBoundaries) { + WeatherManager::UpdateUnderwaterBoundaries(state); + } + + if (state.dataEnvrn->varyingLocationSchedIndexLat > 0 || state.dataEnvrn->varyingLocationSchedIndexLong > 0 || + state.dataEnvrn->varyingOrientationSchedIndex > 0) { + WeatherManager::UpdateLocationAndOrientation(state); + } + + state.dataGlobal->BeginTimeStepFlag = true; + ExternalInterfaceExchangeVariables(state); + + // Set the End__Flag variables to true if necessary. Note that + // each flag builds on the previous level. EndDayFlag cannot be + // .TRUE. unless EndHourFlag is also .TRUE., etc. Note that the + // EndEnvrnFlag and the EndSimFlag cannot be set during warmup. + // Note also that BeginTimeStepFlag, EndTimeStepFlag, and the + // SubTimeStepFlags can/will be set/reset in the HVAC Manager. + + if (state.dataGlobal->TimeStep == state.dataGlobal->NumOfTimeStepInHour) { + state.dataGlobal->EndHourFlag = true; + if (state.dataGlobal->HourOfDay == 24) { + state.dataGlobal->EndDayFlag = true; + if ((!state.dataGlobal->WarmupFlag) && (state.dataGlobal->DayOfSim == state.dataGlobal->NumOfDayInEnvrn)) { + state.dataGlobal->EndEnvrnFlag = true; + } + } + } + + ManageWeather(state); + + ExteriorEnergyUse::ManageExteriorEnergyUse(state); + + ManageHeatBalance(state); + + if (oneTimeUnderwaterBoundaryCheck) { + AnyUnderwaterBoundaries = WeatherManager::CheckIfAnyUnderwaterBoundaries(state); + oneTimeUnderwaterBoundaryCheck = false; + } + + state.dataGlobal->BeginHourFlag = false; + state.dataGlobal->BeginDayFlag = false; + state.dataGlobal->BeginEnvrnFlag = false; + state.dataGlobal->BeginSimFlag = false; + } // TimeStep loop + + state.dataGlobal->PreviousHour = state.dataGlobal->HourOfDay; + + } // ... End hour loop. + + if (state.dataSQLiteProcedures->sqlite) state.dataSQLiteProcedures->sqlite->sqliteCommit(); // one transaction per day + + } // ... End day loop. + + // Need one last call to send latest states to middleware + ExternalInterfaceExchangeVariables(state); + + } // ... End environment loop. + + state.dataGlobal->WarmupFlag = false; + + if (!SimsDone && state.dataGlobal->DoDesDaySim) { + if ((state.dataEnvrn->TotDesDays + state.dataEnvrn->TotRunDesPersDays) == 0) { // if sum is 0, then there was no sizing done. + ShowWarningError(state, + "ManageSimulation: SizingPeriod:* were requested in SimulationControl but no SizingPeriod:* objects in input."); + } + } + + if (!SimsDone && state.dataGlobal->DoWeathSim) { + if (!state.dataSimulationManager->RunPeriodsInInput) { // if no run period requested, and sims not done + ShowWarningError(state, "ManageSimulation: Weather Simulation was requested in SimulationControl but no RunPeriods in input."); + } + } + + PlantManager::CheckOngoingPlantWarnings(state); + + if (state.dataSQLiteProcedures->sqlite) state.dataSQLiteProcedures->sqlite->sqliteBegin(); // for final data to write + + CostEstimateManager::SimCostEstimate(state); + + EconomicTariff::ComputeTariff(state); // Compute the utility bills + + EMSManager::checkForUnusedActuatorsAtEnd(state); + EMSManager::checkSetpointNodesAtEnd(state); + + OutputProcessor::ReportForTabularReports(state); // For Energy Meters (could have other things that need to be pushed to after simulation) + + OutputReportTabular::OpenOutputTabularFile(state); + + OutputReportTabular::WriteTabularReports(state); // Create the tabular reports at completion of each + + EconomicTariff::WriteTabularTariffReports(state); + + EconomicLifeCycleCost::ComputeLifeCycleCostAndReport(state); // must be after WriteTabularReports and WriteTabularTariffReports + + OutputReportTabular::CloseOutputTabularFile(state); + + HVACControllers::DumpAirLoopStatistics(state); // Dump runtime statistics for air loop controller simulation to csv file + + CloseOutputFiles(state); + + // state.dataSQLiteProcedures->sqlite->createZoneExtendedOutput(); + CreateSQLiteZoneExtendedOutput(state); + + if (state.dataSQLiteProcedures->sqlite) { + DisplayString(state, "Writing final SQL reports"); + state.dataSQLiteProcedures->sqlite->sqliteCommit(); // final transactions + state.dataSQLiteProcedures->sqlite->initializeIndexes(); // do not create indexes (SQL) until all is done. + } + + if (ErrorsFound) { + ShowFatalError(state, "Error condition occurred. Previous Severe Errors cause termination."); + } + } + + void GetProjectData(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Linda K. Lawrie + // DATE WRITTEN November 1997 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine gets global project data from the input file. + + // METHODOLOGY EMPLOYED: + // Use GetObjectItem from the Input Processor + + // Using/Aliasing + using DataStringGlobals::MatchVersion; + using namespace DataSystemVariables; + auto &deviationFromSetPtThresholdClg = state.dataHVACGlobal->deviationFromSetPtThresholdClg; + auto &deviationFromSetPtThresholdHtg = state.dataHVACGlobal->deviationFromSetPtThresholdHtg; + + // SUBROUTINE PARAMETER DEFINITIONS: + static constexpr std::array Div60 = {1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60}; + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Array1D_string Alphas(10); + Array1D Number(4); + int NumAlpha; + int NumNumber; + int IOStat; + int NumDebugOut; + int MinInt; + int Num; + int Which; + bool ErrorsFound; + int NumRunControl; + std::string VersionID; + std::string CurrentModuleObject; + bool CondFDAlgo; + int Item; + + ErrorsFound = false; + + CurrentModuleObject = "Version"; + Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + if (Num == 1) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + 1, + Alphas, + NumAlpha, + Number, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + std::string::size_type const lenVer(len(MatchVersion)); + if ((lenVer > 0) && (MatchVersion[lenVer - 1] == '0')) { + Which = static_cast(index(Alphas(1).substr(0, lenVer - 2), MatchVersion.substr(0, lenVer - 2))); + } else { + Which = static_cast(index(Alphas(1), MatchVersion)); + } + if (Which != 0) { + ShowWarningError(state, CurrentModuleObject + ": in IDF=\"" + Alphas(1) + "\" not the same as expected=\"" + MatchVersion + "\""); + } + VersionID = Alphas(1); + } else if (Num == 0) { + ShowWarningError(state, CurrentModuleObject + ": missing in IDF, processing for EnergyPlus version=\"" + MatchVersion + "\""); + } else { + ShowSevereError(state, "Too many " + CurrentModuleObject + " Objects found."); + ErrorsFound = true; + } + + // Do Mini Gets on HB Algorithm and by-surface overrides + CurrentModuleObject = "HeatBalanceAlgorithm"; + Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + CondFDAlgo = false; + if (Num > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + 1, + Alphas, + NumAlpha, + Number, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + static constexpr std::array condFDTypes = { + "CONDUCTIONFINITEDIFFERENCE", "CONDFD", "CONDUCTIONFINITEDIFFERENCEDETAILED", "CONDUCTIONFINITEDIFFERENCESIMPLIFIED"}; + CondFDAlgo = std::find(condFDTypes.begin(), condFDTypes.end(), Alphas(1)) != condFDTypes.end(); + } + CurrentModuleObject = "SurfaceProperty:HeatTransferAlgorithm"; + Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + if (Num > 0) { + for (Item = 1; Item <= Num; ++Item) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + Item, + Alphas, + NumAlpha, + Number, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (Alphas(2) == "CONDUCTIONFINITEDIFFERENCE") CondFDAlgo = true; + } + } + CurrentModuleObject = "SurfaceProperty:HeatTransferAlgorithm:MultipleSurface"; + Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + if (Num > 0) { + for (Item = 1; Item <= Num; ++Item) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + 1, + Alphas, + NumAlpha, + Number, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (Alphas(3) == "CONDUCTIONFINITEDIFFERENCE") CondFDAlgo = true; + } + } + CurrentModuleObject = "SurfaceProperty:HeatTransferAlgorithm:SurfaceList"; + Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + if (Num > 0) { + for (Item = 1; Item <= Num; ++Item) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + 1, + state.dataIPShortCut->cAlphaArgs, + NumAlpha, + Number, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (state.dataIPShortCut->cAlphaArgs(2) == "CONDUCTIONFINITEDIFFERENCE") CondFDAlgo = true; + } + } + CurrentModuleObject = "SurfaceProperty:HeatTransferAlgorithm:Construction"; + Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + if (Num > 0) { + for (Item = 1; Item <= Num; ++Item) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + 1, + state.dataIPShortCut->cAlphaArgs, + NumAlpha, + Number, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (state.dataIPShortCut->cAlphaArgs(2) == "CONDUCTIONFINITEDIFFERENCE") CondFDAlgo = true; + } + } + + CurrentModuleObject = "Timestep"; + Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + if (Num == 1) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + 1, + Alphas, + NumAlpha, + Number, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + state.dataGlobal->NumOfTimeStepInHour = Number(1); + if (state.dataGlobal->NumOfTimeStepInHour <= 0 || state.dataGlobal->NumOfTimeStepInHour > 60) { + Alphas(1) = fmt::to_string(state.dataGlobal->NumOfTimeStepInHour); + ShowWarningError(state, CurrentModuleObject + ": Requested number (" + Alphas(1) + ") invalid, Defaulted to 4"); + state.dataGlobal->NumOfTimeStepInHour = 4; + } else if (mod(60, state.dataGlobal->NumOfTimeStepInHour) != 0) { + MinInt = 9999; + for (Num = 1; Num <= 12; ++Num) { + if (std::abs(state.dataGlobal->NumOfTimeStepInHour - Div60[Num - 1]) > MinInt) continue; + MinInt = state.dataGlobal->NumOfTimeStepInHour - Div60[Num - 1]; + Which = Num; + } + ShowWarningError(state, + format("{}: Requested number ({}) not evenly divisible into 60, defaulted to nearest ({}).", + CurrentModuleObject, + state.dataGlobal->NumOfTimeStepInHour, + Div60[Which - 1])); + state.dataGlobal->NumOfTimeStepInHour = Div60[Which - 1]; + } + if (CondFDAlgo && state.dataGlobal->NumOfTimeStepInHour < 20) { + ShowWarningError(state, + format("{}: Requested number ({}) cannot be used when Conduction Finite Difference algorithm is selected.", + CurrentModuleObject, + state.dataGlobal->NumOfTimeStepInHour)); + ShowContinueError(state, "..." + CurrentModuleObject + " is set to 20."); + state.dataGlobal->NumOfTimeStepInHour = 20; + } + if (state.dataGlobal->NumOfTimeStepInHour < 4 && state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Zone") > 0) { + ShowWarningError(state, + format("{}: Requested number ({}) is less than the suggested minimum of 4.", + CurrentModuleObject, + state.dataGlobal->NumOfTimeStepInHour)); + ShowContinueError(state, + "Please see entry for " + CurrentModuleObject + " in Input/Output Reference for discussion of considerations."); + } + } else if (Num == 0 && state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Zone") > 0 && !CondFDAlgo) { + ShowWarningError(state, "No " + CurrentModuleObject + " object found. Number of TimeSteps in Hour defaulted to 4."); + state.dataGlobal->NumOfTimeStepInHour = 4; + } else if (Num == 0 && !CondFDAlgo) { + state.dataGlobal->NumOfTimeStepInHour = 4; + } else if (Num == 0 && state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Zone") > 0 && CondFDAlgo) { + ShowWarningError(state, "No " + CurrentModuleObject + " object found. Number of TimeSteps in Hour defaulted to 20."); + ShowContinueError(state, "...Due to presence of Conduction Finite Difference Algorithm selection."); + state.dataGlobal->NumOfTimeStepInHour = 20; + } else if (Num == 0 && CondFDAlgo) { + state.dataGlobal->NumOfTimeStepInHour = 20; + } else { + ShowSevereError(state, "Too many " + CurrentModuleObject + " Objects found."); + ErrorsFound = true; + } + + state.dataGlobal->TimeStepZone = 1.0 / double(state.dataGlobal->NumOfTimeStepInHour); + state.dataGlobal->MinutesPerTimeStep = state.dataGlobal->TimeStepZone * 60; + state.dataGlobal->TimeStepZoneSec = state.dataGlobal->TimeStepZone * DataGlobalConstants::SecInHour; + + CurrentModuleObject = "ConvergenceLimits"; + Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + if (Num == 1) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + 1, + Alphas, + NumAlpha, + Number, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + MinInt = int(Number(1)); + if (MinInt > state.dataGlobal->MinutesPerTimeStep) { + MinInt = state.dataGlobal->MinutesPerTimeStep; + } + if (MinInt < 0 || MinInt > 60) { + ShowWarningError( + state, + format( + "{}: Requested {} ({}) invalid. Set to 1 minute.", CurrentModuleObject, state.dataIPShortCut->cNumericFieldNames(1), MinInt)); + state.dataConvergeParams->MinTimeStepSys = 1.0 / 60.0; + } else if (MinInt == 0) { // Set to TimeStepZone + state.dataConvergeParams->MinTimeStepSys = state.dataGlobal->TimeStepZone; + } else { + state.dataConvergeParams->MinTimeStepSys = double(MinInt) / 60.0; + } + state.dataConvergeParams->MaxIter = int(Number(2)); + if (state.dataConvergeParams->MaxIter <= 0) { + state.dataConvergeParams->MaxIter = 20; + } + if (!state.dataIPShortCut->lNumericFieldBlanks(3)) state.dataConvergeParams->MinPlantSubIterations = int(Number(3)); + if (!state.dataIPShortCut->lNumericFieldBlanks(4)) state.dataConvergeParams->MaxPlantSubIterations = int(Number(4)); + // trap bad values + if (state.dataConvergeParams->MinPlantSubIterations < 1) state.dataConvergeParams->MinPlantSubIterations = 1; + if (state.dataConvergeParams->MaxPlantSubIterations < 3) state.dataConvergeParams->MaxPlantSubIterations = 3; + if (state.dataConvergeParams->MinPlantSubIterations > state.dataConvergeParams->MaxPlantSubIterations) + state.dataConvergeParams->MaxPlantSubIterations = state.dataConvergeParams->MinPlantSubIterations + 1; + + } else if (Num == 0) { + state.dataConvergeParams->MinTimeStepSys = 1.0 / 60.0; + state.dataConvergeParams->MaxIter = 20; + state.dataConvergeParams->MinPlantSubIterations = 2; + state.dataConvergeParams->MaxPlantSubIterations = 8; + } else { + ShowSevereError(state, "Too many " + CurrentModuleObject + " Objects found."); + ErrorsFound = true; + } + + state.dataHVACGlobal->LimitNumSysSteps = int(state.dataGlobal->TimeStepZone / state.dataConvergeParams->MinTimeStepSys); + + state.dataReportFlag->DebugOutput = false; + state.dataReportFlag->EvenDuringWarmup = false; + CurrentModuleObject = "Output:DebuggingData"; + NumDebugOut = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + if (NumDebugOut > 1) { + ShowWarningError(state, CurrentModuleObject + ": More than 1 occurrence of this object found, only first will be used."); + } + if (NumDebugOut > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, CurrentModuleObject, 1, Alphas, NumAlpha, Number, NumNumber, IOStat); + if (NumAlpha >= 1) { + state.dataReportFlag->DebugOutput = UtilityRoutines::SameString(Alphas(1), "Yes"); + } + if (NumAlpha >= 2) { + state.dataReportFlag->EvenDuringWarmup = UtilityRoutines::SameString(Alphas(2), "Yes"); + } + } + + { + CurrentModuleObject = "Output:Diagnostics"; + Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + if (Num > 1) { + // Let it slide, but warn + // ErrorsFound = true; + ShowWarningError(state, CurrentModuleObject + ": More than 1 occurrence of this object found, only first will be used."); + } + auto const instances = state.dataInputProcessing->inputProcessor->epJSON.find(CurrentModuleObject); + + if (instances != state.dataInputProcessing->inputProcessor->epJSON.end()) { + auto &instancesValue = instances.value(); + for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { + auto const &fields = instance.value(); + auto const &thisObjectName = instance.key(); + state.dataInputProcessing->inputProcessor->markObjectAsUsed(CurrentModuleObject, thisObjectName); + + auto diagnosticsExtensibles = fields.find("diagnostics"); + if (diagnosticsExtensibles != fields.end()) { + auto diagnosticsExtensiblesArray = diagnosticsExtensibles.value(); + for (auto diagnosticsExtensible : diagnosticsExtensiblesArray) { + + // We want to avoid cryptic failures such as this one: "[json.exception.out_of_range.403] key 'key' not found" + // Which happens if you put an "empty" entry in the extensible portion + auto it = diagnosticsExtensible.find("key"); + if (it == diagnosticsExtensible.end()) { + ShowWarningError(state, CurrentModuleObject + ": empty key found, consider removing it to avoid this warning."); + continue; + } + std::string diagnosticName = it->get(); + + if (UtilityRoutines::SameString(diagnosticName, "DisplayExtraWarnings")) { + state.dataGlobal->DisplayExtraWarnings = true; + } else if (UtilityRoutines::SameString(diagnosticName, "DisplayAdvancedReportVariables")) { + state.dataGlobal->DisplayAdvancedReportVariables = true; + } else if (UtilityRoutines::SameString(diagnosticName, "DisplayAllWarnings")) { + state.dataGlobal->DisplayAllWarnings = true; + state.dataGlobal->DisplayExtraWarnings = true; + state.dataGlobal->DisplayUnusedObjects = true; + state.dataGlobal->DisplayUnusedSchedules = true; + } else if (UtilityRoutines::SameString(diagnosticName, "DisplayUnusedObjects")) { + state.dataGlobal->DisplayUnusedObjects = true; + } else if (UtilityRoutines::SameString(diagnosticName, "DisplayUnusedSchedules")) { + state.dataGlobal->DisplayUnusedSchedules = true; + } else if (UtilityRoutines::SameString(diagnosticName, "DisplayZoneAirHeatBalanceOffBalance")) { + state.dataGlobal->DisplayZoneAirHeatBalanceOffBalance = true; + } else if (UtilityRoutines::SameString(diagnosticName, "DoNotMirrorDetachedShading")) { + state.dataReportFlag->MakeMirroredDetachedShading = false; + } else if (UtilityRoutines::SameString(diagnosticName, "DoNotMirrorAttachedShading")) { + state.dataReportFlag->MakeMirroredAttachedShading = false; + } else if (UtilityRoutines::SameString(diagnosticName, "ReportDuringWarmup")) { + state.dataSysVars->ReportDuringWarmup = true; + } else if (UtilityRoutines::SameString(diagnosticName, "DisplayWeatherMissingDataWarnings")) { + state.dataEnvrn->DisplayWeatherMissingDataWarnings = true; + } else if (UtilityRoutines::SameString(diagnosticName, "IgnoreSolarRadiation")) { // TODO: Not a valid key choice + state.dataEnvrn->IgnoreSolarRadiation = true; + } else if (UtilityRoutines::SameString(diagnosticName, "IgnoreBeamRadiation")) { // TODO: Not a valid key choice + state.dataEnvrn->IgnoreBeamRadiation = true; + } else if (UtilityRoutines::SameString(diagnosticName, "IgnoreDiffuseRadiation")) { // TODO: Not a valid key choice + state.dataEnvrn->IgnoreDiffuseRadiation = true; + } else if (UtilityRoutines::SameString(diagnosticName, "DeveloperFlag")) { // TODO: Not a valid key choice + state.dataSysVars->DeveloperFlag = true; + } else if (UtilityRoutines::SameString(diagnosticName, "TimingFlag")) { // TODO: Not a valid key choice + state.dataSysVars->TimingFlag = true; + } else if (UtilityRoutines::SameString(diagnosticName, "ReportDetailedWarmupConvergence")) { + state.dataSysVars->ReportDetailedWarmupConvergence = true; + } else if (UtilityRoutines::SameString(diagnosticName, "ReportDuringHVACSizingSimulation")) { + state.dataSysVars->ReportDuringHVACSizingSimulation = true; + } else if (UtilityRoutines::SameString(diagnosticName, "CreateMinimalSurfaceVariables")) { // TODO: Not a valid key choice + continue; + // CreateMinimalSurfaceVariables=.TRUE. + } else if (UtilityRoutines::SameString(diagnosticName, "CreateNormalSurfaceVariables")) { // TODO: Not a valid key choice + continue; + // IF (CreateMinimalSurfaceVariables) THEN + // CALL ShowWarningError(state, 'GetProjectData: '//TRIM(CurrentModuleObject)//'=''// & + // TRIM(diagnosticName)//'', prior set=true for this condition reverts to false.') + // ENDIF + // CreateMinimalSurfaceVariables=.FALSE. + } else if (!diagnosticName.empty()) { + ShowWarningError(state, + "GetProjectData: " + CurrentModuleObject + "=\"" + diagnosticName + + "\", Invalid value for field, entered value ignored."); + } + } + } + + // Don't process the duplicate ones + break; + } + } + } + + CurrentModuleObject = "OutputControl:ReportingTolerances"; + Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + if (Num > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + 1, + Alphas, + NumAlpha, + Number, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (!state.dataIPShortCut->lNumericFieldBlanks(1)) { + deviationFromSetPtThresholdHtg = -Number(1); + } else { + deviationFromSetPtThresholdHtg = -0.2; + } + if (!state.dataIPShortCut->lNumericFieldBlanks(2)) { + deviationFromSetPtThresholdClg = Number(2); + } else { + deviationFromSetPtThresholdClg = 0.2; + } + } + + state.dataGlobal->DoZoneSizing = false; + state.dataGlobal->DoSystemSizing = false; + state.dataGlobal->DoPlantSizing = false; + state.dataGlobal->DoDesDaySim = true; + state.dataGlobal->DoWeathSim = true; + state.dataGlobal->DoHVACSizingSimulation = false; + state.dataGlobal->HVACSizingSimMaxIterations = 0; + CurrentModuleObject = "SimulationControl"; + NumRunControl = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + if (NumRunControl > 0) { + state.dataSimulationManager->RunControlInInput = true; + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + 1, + Alphas, + NumAlpha, + Number, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (Alphas(1) == "YES") state.dataGlobal->DoZoneSizing = true; + if (Alphas(2) == "YES") state.dataGlobal->DoSystemSizing = true; + if (Alphas(3) == "YES") state.dataGlobal->DoPlantSizing = true; + if (Alphas(4) == "NO") state.dataGlobal->DoDesDaySim = false; + if (Alphas(5) == "NO") state.dataGlobal->DoWeathSim = false; + if (NumAlpha > 5) { + if (Alphas(6) == "YES") state.dataGlobal->DoHVACSizingSimulation = true; + } + } + if (state.dataSysVars->DDOnly) { + state.dataGlobal->DoDesDaySim = true; + state.dataGlobal->DoWeathSim = false; + } + if (state.dataSysVars->FullAnnualRun) { + state.dataGlobal->DoDesDaySim = false; + state.dataGlobal->DoWeathSim = true; + } + + if ((!state.dataGlobal->DoDesDaySim && !state.dataGlobal->DoWeathSim && !state.dataGlobal->DoHVACSizingSimulation) && + (state.dataGlobal->DoZoneSizing || state.dataGlobal->DoSystemSizing)) { + state.dataGlobal->DoPureLoadCalc = true; + } + + CurrentModuleObject = "PerformancePrecisionTradeoffs"; + auto const instances = state.dataInputProcessing->inputProcessor->epJSON.find(CurrentModuleObject); + Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + if (Num > 1) { + ErrorsFound = true; + ShowFatalError(state, "GetProjectData: Only one (\"1\") " + CurrentModuleObject + " object per simulation is allowed."); + } + state.dataGlobal->createPerfLog = Num > 0; + std::string overrideModeValue = "Normal"; + if (instances != state.dataInputProcessing->inputProcessor->epJSON.end()) { + auto &instancesValue = instances.value(); + for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { + auto const &fields = instance.value(); + auto const &thisObjectName = instance.key(); + state.dataInputProcessing->inputProcessor->markObjectAsUsed(CurrentModuleObject, thisObjectName); + if (fields.find("use_coil_direct_solutions") != fields.end()) { + state.dataGlobal->DoCoilDirectSolutions = + UtilityRoutines::MakeUPPERCase(fields.at("use_coil_direct_solutions").get()) == "YES"; + } + if (fields.find("zone_radiant_exchange_algorithm") != fields.end()) { + state.dataHeatBalIntRadExchg->CarrollMethod = + UtilityRoutines::MakeUPPERCase(fields.at("zone_radiant_exchange_algorithm").get()) == "CARROLLMRT"; + } + if (fields.find("use_representative_surfaces_for_calculations") != fields.end()) { + state.dataSurface->UseRepresentativeSurfaceCalculations = + UtilityRoutines::MakeUPPERCase(fields.at("use_representative_surfaces_for_calculations").get()) == "YES"; + } + bool overrideTimestep(false); + bool overrideZoneAirHeatBalAlg(false); + bool overrideMinNumWarmupDays(false); + bool overrideBeginEnvResetSuppress(false); + bool overrideMaxZoneTempDiff(false); + bool overrideSystemTimestep(false); + bool overrideMaxAllowedDelTemp(false); + bool overridePsychTsatFnPb(false); + state.dataZoneTempPredictorCorrector->OscillationVariablesNeeded = true; + if (fields.find("override_mode") != fields.end()) { + overrideModeValue = UtilityRoutines::MakeUPPERCase(fields.at("override_mode").get()); + if (overrideModeValue == "NORMAL") { + // no overrides + } else if (overrideModeValue == "MODE01") { + // Zone Time step (TimeStep object) will be set to one timestep per hour + overrideTimestep = true; + } else if (overrideModeValue == "MODE02") { + // Mode01 plus ZoneAirHeatBalanceAlgorithm will be set to Euler + overrideTimestep = true; + overrideZoneAirHeatBalAlg = true; + } else if (overrideModeValue == "MODE03") { + // Mode02 plus Minimum Number of Warmup Days will be set to 1 + overrideTimestep = true; + overrideZoneAirHeatBalAlg = true; + overrideMinNumWarmupDays = true; + } else if (overrideModeValue == "MODE04") { + // Mode03 plus Begin Environment Reset Mode will be set to SuppressAllBeginEnvironmentResets + overrideTimestep = true; + overrideZoneAirHeatBalAlg = true; + overrideMinNumWarmupDays = true; + overrideBeginEnvResetSuppress = true; + } else if (overrideModeValue == "MODE05") { + // Mode04 plus Minimun System Timestep will be set to 1hr + overrideTimestep = true; + overrideZoneAirHeatBalAlg = true; + overrideMinNumWarmupDays = true; + overrideBeginEnvResetSuppress = true; + overrideSystemTimestep = true; + } else if (overrideModeValue == "MODE06") { + // Mode05 plus cubic spline interpolations in replacement of the original psychrometric function PsychTsatFnPb + overrideTimestep = true; + overrideZoneAirHeatBalAlg = true; + overrideMinNumWarmupDays = true; + overrideBeginEnvResetSuppress = true; + overrideSystemTimestep = true; + overridePsychTsatFnPb = true; + } else if (overrideModeValue == "MODE07") { + // Mode06 plus internal variable MaxZoneTempDiff will be set to 1.00 + overrideTimestep = true; + overrideZoneAirHeatBalAlg = true; + overrideMinNumWarmupDays = true; + overrideBeginEnvResetSuppress = true; + overrideSystemTimestep = true; + overrideMaxZoneTempDiff = true; + overridePsychTsatFnPb = true; + } else if (overrideModeValue == "MODE08") { + // Mode07 plus internal variable MaxAllowedDelTemp will be set to 0.1 + overrideTimestep = true; + overrideZoneAirHeatBalAlg = true; + overrideMinNumWarmupDays = true; + overrideBeginEnvResetSuppress = true; + overrideSystemTimestep = true; + overrideMaxZoneTempDiff = true; + overrideMaxAllowedDelTemp = true; + overridePsychTsatFnPb = true; + } else if (overrideModeValue == "ADVANCED") { + bool advancedModeUsed = false; + if (fields.find("maxzonetempdiff") != fields.end()) { // not required field, has default value + state.dataConvergeParams->MaxZoneTempDiff = fields.at("maxzonetempdiff").get(); + ShowWarningError(state, + format("PerformancePrecisionTradeoffs using the Advanced Override Mode, MaxZoneTempDiff set to: {:.4R}", + state.dataConvergeParams->MaxZoneTempDiff)); + advancedModeUsed = true; + } + if (fields.find("maxalloweddeltemp") != fields.end()) { // not required field, has default value + state.dataHeatBal->MaxAllowedDelTemp = fields.at("maxalloweddeltemp").get(); + ShowWarningError( + state, + format("PerformancePrecisionTradeoffs using the Advanced Override Mode, MaxAllowedDelTemp set to: {:.4R}", + state.dataHeatBal->MaxAllowedDelTemp)); + advancedModeUsed = true; + } + if (advancedModeUsed) { + ShowContinueError(state, + "...Care should be used when using the Advanced Override Mode. Results may be significantly different " + "than a simulation not using this mode."); + } else { + ShowWarningError( + state, "PerformancePrecisionTradeoffs using the Advanced Override Mode but no specific parameters have been set."); + } + } else { + ShowSevereError(state, "Invalid over ride mode specified in PerformancePrecisionTradeoffs object: " + overrideModeValue); + } + + if (overrideTimestep) { + ShowWarningError(state, "Due to PerformancePrecisionTradeoffs Override Mode, the Number of TimeSteps has been changed to 1."); + state.dataGlobal->NumOfTimeStepInHour = 1; + state.dataGlobal->TimeStepZone = 1.0 / double(state.dataGlobal->NumOfTimeStepInHour); + state.dataGlobal->MinutesPerTimeStep = state.dataGlobal->TimeStepZone * 60; + state.dataGlobal->TimeStepZoneSec = state.dataGlobal->TimeStepZone * DataGlobalConstants::SecInHour; + state.dataGlobal->OverrideTimestep = true; + } + if (overrideZoneAirHeatBalAlg) { + ShowWarningError( + state, + "Due to PerformancePrecisionTradeoffs Override Mode, the ZoneAirHeatBalanceAlgorithm has been changed to EulerMethod."); + state.dataHeatBal->OverrideZoneAirSolutionAlgo = true; + } + if (overrideMinNumWarmupDays) { + ShowWarningError( + state, "Due to PerformancePrecisionTradeoffs Override Mode, the Minimum Number of Warmup Days has been changed to 1."); + state.dataHeatBal->MinNumberOfWarmupDays = 1; + } + if (overrideBeginEnvResetSuppress) { + ShowWarningError(state, + "Due to PerformancePrecisionTradeoffs Override Mode, the Begin Environment Reset Mode has been changed to " + "SuppressAllBeginEnvironmentResets."); + state.dataEnvrn->forceBeginEnvResetSuppress = true; + } + if (overrideSystemTimestep) { + ShowWarningError( + state, "Due to PerformancePrecisionTradeoffs Override Mode, the minimum System TimeSteps has been changed to 1 hr."); + int MinTimeStepSysOverrideValue = 60.0; + if (MinTimeStepSysOverrideValue > state.dataGlobal->MinutesPerTimeStep) { + MinTimeStepSysOverrideValue = state.dataGlobal->MinutesPerTimeStep; + } + state.dataConvergeParams->MinTimeStepSys = MinTimeStepSysOverrideValue / 60.0; + state.dataHVACGlobal->LimitNumSysSteps = int(state.dataGlobal->TimeStepZone / state.dataConvergeParams->MinTimeStepSys); + } + if (overridePsychTsatFnPb) { + ShowWarningError(state, + "Due to PerformancePrecisionTradeoffs Override Mode, the saturated temperature will be calculated using " + "cubic spline interpolations in replacement of PsychTsatFnPb ."); + // Mode06 CSpline interpolation (64 Pa bin size + 20/16 bit) + state.dataPsychrometrics->useInterpolationPsychTsatFnPb = true; +#ifdef EP_cache_PsyTsatFnPb + state.dataPsychCache->tsatprecision_bits = 20; +#endif + } + if (overrideMaxZoneTempDiff) { + ShowWarningError( + state, "Due to PerformancePrecisionTradeoffs Override Mode, internal variable MaxZoneTempDiff will be set to 1.0 ."); + state.dataConvergeParams->MaxZoneTempDiff = 1.0; + } + if (overrideMaxAllowedDelTemp) { + ShowWarningError( + state, "Due to PerformancePrecisionTradeoffs Override Mode, internal variable MaxAllowedDelTemp will be set to 0.1 ."); + state.dataHeatBal->MaxAllowedDelTemp = 0.1; + } + } + } + } + if (ErrorsFound) { + ShowFatalError(state, "Errors found getting Project Input"); + } + + print(state.files.eio, "{}\n", "! , Version ID"); + static constexpr std::string_view Format_721(" Version, {}\n"); + print(state.files.eio, Format_721, VersionID); + + print(state.files.eio, "{}\n", "! , #TimeSteps, Minutes per TimeStep {minutes}"); + static constexpr std::string_view Format_731(" Timesteps per Hour, {:2}, {:2}\n"); + print(state.files.eio, Format_731, state.dataGlobal->NumOfTimeStepInHour, state.dataGlobal->MinutesPerTimeStep); + + print(state.files.eio, + "{}\n", + "! , Minimum System TimeStep {minutes}, Max HVAC Iterations, Minimum Plant " + "Iterations, Maximum Plant Iterations"); + MinInt = state.dataConvergeParams->MinTimeStepSys * 60.0; + static constexpr std::string_view Format_733(" System Convergence Limits, {}, {}, {}, {}\n"); + print(state.files.eio, + Format_733, + MinInt, + state.dataConvergeParams->MaxIter, + state.dataConvergeParams->MinPlantSubIterations, + state.dataConvergeParams->MaxPlantSubIterations); + + if (state.dataGlobal->DoZoneSizing) { + Alphas(1) = "Yes"; + } else { + Alphas(1) = "No"; + } + if (state.dataGlobal->DoSystemSizing) { + Alphas(2) = "Yes"; + } else { + Alphas(2) = "No"; + } + if (state.dataGlobal->DoPlantSizing) { + Alphas(3) = "Yes"; + } else { + Alphas(3) = "No"; + } + if (state.dataGlobal->DoDesDaySim) { + Alphas(4) = "Yes"; + } else { + Alphas(4) = "No"; + } + if (state.dataGlobal->DoWeathSim) { + Alphas(5) = "Yes"; + } else { + Alphas(5) = "No"; + } + if (state.dataGlobal->DoHVACSizingSimulation) { + Alphas(6) = "Yes"; + if (NumNumber >= 1) { + state.dataGlobal->HVACSizingSimMaxIterations = Number(1); + } + } else { + Alphas(6) = "No"; + } + + print(state.files.eio, + "{}\n", + "! , Do Zone Sizing, Do System Sizing, Do Plant Sizing, Do Design Days, Do Weather " + "Simulation, Do HVAC Sizing Simulation"); + print(state.files.eio, " Simulation Control"); + for (Num = 1; Num <= 6; ++Num) { + print(state.files.eio, ", {}", Alphas(Num)); + } + print(state.files.eio, "\n"); + + // Performance Precision Tradeoffs + if (state.dataGlobal->DoCoilDirectSolutions) { + Alphas(1) = "Yes"; + ShowWarningError(state, "PerformancePrecisionTradeoffs: Coil Direct Solution simulation is selected."); + } else { + Alphas(1) = "No"; + } + if (state.dataHeatBalIntRadExchg->CarrollMethod) { + Alphas(2) = "CarrollMRT"; + ShowWarningError(state, "PerformancePrecisionTradeoffs: Carroll MRT radiant exchange method is selected."); + } else { + Alphas(2) = "ScriptF"; + } + Alphas(3) = overrideModeValue; + Alphas(4) = fmt::to_string(state.dataGlobal->NumOfTimeStepInHour); + if (state.dataHeatBal->OverrideZoneAirSolutionAlgo) { + Alphas(5) = "Yes"; + } else { + Alphas(5) = "No"; + } + Alphas(6) = fmt::to_string(state.dataHeatBal->MinNumberOfWarmupDays); + if (state.dataEnvrn->forceBeginEnvResetSuppress) { + Alphas(7) = "Yes"; + } else { + Alphas(7) = "No"; + } + Alphas(8) = format("{:.1R}", state.dataConvergeParams->MinTimeStepSys * 60.0); + Alphas(9) = format("{:.3R}", state.dataConvergeParams->MaxZoneTempDiff); + Alphas(10) = format("{:.4R}", state.dataHeatBal->MaxAllowedDelTemp); + std::string pptHeader = "! , Use Coil Direct Simulation, " + "Zone Radiant Exchange Algorithm, Override Mode, Number of Timestep In Hour, " + "Force Euler Method, Minimum Number of Warmup Days, Force Suppress All Begin Environment Resets, " + "Minimum System Timestep, MaxZoneTempDiff, MaxAllowedDelTemp"; + print(state.files.eio, "{}\n", pptHeader); + print(state.files.eio, " Performance Precision Tradeoffs"); + for (Num = 1; Num <= 10; ++Num) { + print(state.files.eio, ", {}", Alphas(Num)); + } + print(state.files.eio, "\n"); + + print(state.files.eio, + "{}\n", + "! , Tolerance for Time Heating Setpoint Not Met, Tolerance for Zone Cooling Setpoint Not Met Time"); + // Formats + static constexpr std::string_view Format_751(" Output Reporting Tolerances, {:.3R}, {:.3R}, \n"); + + print(state.files.eio, Format_751, std::abs(deviationFromSetPtThresholdHtg), deviationFromSetPtThresholdClg); + + // IF (DisplayExtraWarnings) THEN + // Write(OutputFileInits,740) + // Write(OutputFileInits,741) (TRIM(Alphas(Num)),Num=1,5) + // 742 Format('! , Display Advanced Report Variables, Do Not Mirror Detached Shading') + // IF (DisplayAdvancedReportVariables) THEN + // NumOut1='Yes' + // ELSE + // NumOut2='No' + // ENDIF + // IF (.not. MakeMirroredDetachedShading) THEN + // NumOut1='Yes' + // ELSE + // NumOut2='No' + // ENDIF + // unused0909743 Format(' Display Extra Warnings',2(', ',A)) + // ENDIF + if (state.dataGlobal->createPerfLog) { + writeIntialPerfLogValues(state, overrideModeValue); + } + } + + void writeIntialPerfLogValues(EnergyPlusData &state, std::string const ¤tOverrideModeValue) + // write the input related portions of the .perflog + // J.Glazer February 2020 + { + UtilityRoutines::appendPerfLog(state, + "Program, Version, TimeStamp", + state.dataStrGlobals->VerStringVar); // this string already includes three portions and has commas + UtilityRoutines::appendPerfLog(state, "Use Coil Direct Solution", bool_to_string(state.dataGlobal->DoCoilDirectSolutions)); + if (state.dataHeatBalIntRadExchg->CarrollMethod) { + UtilityRoutines::appendPerfLog(state, "Zone Radiant Exchange Algorithm", "CarrollMRT"); + } else { + UtilityRoutines::appendPerfLog(state, "Zone Radiant Exchange Algorithm", "ScriptF"); + } + UtilityRoutines::appendPerfLog(state, "Override Mode", currentOverrideModeValue); + UtilityRoutines::appendPerfLog(state, "Number of Timesteps per Hour", fmt::to_string(state.dataGlobal->NumOfTimeStepInHour)); + UtilityRoutines::appendPerfLog(state, "Minimum Number of Warmup Days", fmt::to_string(state.dataHeatBal->MinNumberOfWarmupDays)); + UtilityRoutines::appendPerfLog(state, "SuppressAllBeginEnvironmentResets", bool_to_string(state.dataEnvrn->forceBeginEnvResetSuppress)); + UtilityRoutines::appendPerfLog(state, "Minimum System Timestep", format("{:.1R}", state.dataConvergeParams->MinTimeStepSys * 60.0)); + UtilityRoutines::appendPerfLog(state, "MaxZoneTempDiff", format("{:.2R}", state.dataConvergeParams->MaxZoneTempDiff)); + UtilityRoutines::appendPerfLog(state, "MaxAllowedDelTemp", format("{:.4R}", state.dataHeatBal->MaxAllowedDelTemp)); + } + + std::string bool_to_string(bool logical) + { + if (logical) { + return ("True"); + } else { + return ("False"); + } + } + + void CheckForMisMatchedEnvironmentSpecifications(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN August 2008 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // In response to CR 7518, this routine will check to see if a proper combination of SimulationControl, RunPeriod, + // SizingPeriod:*, etc are entered to proceed with a simulation. + + // METHODOLOGY EMPLOYED: + // For now (8/2008), the routine will query several objects in the input. And try to produce warnings or + // fatals as a result. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int NumZoneSizing; + int NumSystemSizing; + int NumPlantSizing; + int NumDesignDays; + int NumRunPeriodDesign; + int NumSizingDays; + bool WeatherFileAttached; + bool ErrorsFound; + + ErrorsFound = false; + NumZoneSizing = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Sizing:Zone"); + NumSystemSizing = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Sizing:System"); + NumPlantSizing = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Sizing:Plant"); + NumDesignDays = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SizingPeriod:DesignDay"); + NumRunPeriodDesign = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SizingPeriod:WeatherFileDays") + + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SizingPeriod:WeatherFileConditionType"); + NumSizingDays = NumDesignDays + NumRunPeriodDesign; + + WeatherFileAttached = FileSystem::fileExists(state.files.inputWeatherFilePath.filePath); + + if (state.dataSimulationManager->RunControlInInput) { + if (state.dataGlobal->DoZoneSizing) { + if (NumZoneSizing > 0 && NumSizingDays == 0) { + ErrorsFound = true; + ShowSevereError( + state, "CheckEnvironmentSpecifications: Sizing for Zones has been requested but there are no design environments specified."); + ShowContinueError(state, "...Add appropriate SizingPeriod:* objects for your simulation."); + } + if (NumZoneSizing > 0 && NumRunPeriodDesign > 0 && !WeatherFileAttached) { + ErrorsFound = true; + ShowSevereError(state, + "CheckEnvironmentSpecifications: Sizing for Zones has been requested; Design period from the weather file " + "requested; but no weather file specified."); + } + } + if (state.dataGlobal->DoSystemSizing) { + if (NumSystemSizing > 0 && NumSizingDays == 0) { + ErrorsFound = true; + ShowSevereError( + state, + "CheckEnvironmentSpecifications: Sizing for Systems has been requested but there are no design environments specified."); + ShowContinueError(state, "...Add appropriate SizingPeriod:* objects for your simulation."); + } + if (NumSystemSizing > 0 && NumRunPeriodDesign > 0 && !WeatherFileAttached) { + ErrorsFound = true; + ShowSevereError(state, + "CheckEnvironmentSpecifications: Sizing for Systems has been requested; Design period from the weather file " + "requested; but no weather file specified."); + } + } + if (state.dataGlobal->DoPlantSizing) { + if (NumPlantSizing > 0 && NumSizingDays == 0) { + ErrorsFound = true; + ShowSevereError(state, + "CheckEnvironmentSpecifications: Sizing for Equipment/Plants has been requested but there are no design " + "environments specified."); + ShowContinueError(state, "...Add appropriate SizingPeriod:* objects for your simulation."); + } + if (NumPlantSizing > 0 && NumRunPeriodDesign > 0 && !WeatherFileAttached) { + ErrorsFound = true; + ShowSevereError(state, + "CheckEnvironmentSpecifications: Sizing for Equipment/Plants has been requested; Design period from the weather " + "file requested; but no weather file specified."); + } + } + if (state.dataGlobal->DoDesDaySim && NumSizingDays == 0) { + ShowWarningError(state, + "CheckEnvironmentSpecifications: SimulationControl specified doing design day simulations, but no design " + "environments specified."); + ShowContinueError( + state, + "...No design environment results produced. For these results, add appropriate SizingPeriod:* objects for your simulation."); + } + if (state.dataGlobal->DoDesDaySim && NumRunPeriodDesign > 0 && !WeatherFileAttached) { + ErrorsFound = true; + ShowSevereError(state, + "CheckEnvironmentSpecifications: SimulationControl specified doing design day simulations; weather file design " + "environments specified; but no weather file specified."); + } + if (state.dataGlobal->DoWeathSim && !state.dataSimulationManager->RunPeriodsInInput) { + ShowWarningError(state, + "CheckEnvironmentSpecifications: SimulationControl specified doing weather simulations, but no run periods for " + "weather file specified. No annual results produced."); + } + if (state.dataGlobal->DoWeathSim && state.dataSimulationManager->RunPeriodsInInput && !WeatherFileAttached) { + ShowWarningError(state, + "CheckEnvironmentSpecifications: SimulationControl specified doing weather simulations; run periods for weather " + "file specified; but no weather file specified."); + } + } + + if (!state.dataGlobal->DoDesDaySim && !state.dataGlobal->DoWeathSim) { + // This amounts to checking: (!DoHVACSizingSimulation && !DoZoneSizing && !DoSystemSizing) + if (!state.dataGlobal->DoHVACSizingSimulation && !state.dataGlobal->DoPureLoadCalc) { + ShowSevereError(state, "All elements of SimulationControl are set to \"No\". No simulations can be done. Program terminates."); + ErrorsFound = true; + } else { + ShowWarningError(state, + "\"Run Simulation for Sizing Periods\" and \"Run Simulation for Weather File Run Periods\" are both set to \"No\". " + "No simulations will be performed, and most input will not be read."); + } + } + + if (ErrorsFound) { + ShowFatalError(state, "Program terminates due to preceding conditions."); + } + } + + void CheckForRequestedReporting(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN January 2009 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // EnergyPlus does not automatically produce any results files. Because of this, users may not request + // reports and may get confused when nothing is produced. This routine will provide a warning when + // results should be produced (either sizing periods or weather files are run) but no reports are + // requested. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + bool SimPeriods; + bool ReportingRequested; + + ReportingRequested = false; + SimPeriods = (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SizingPeriod:DesignDay") > 0 || + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SizingPeriod:WeatherFileDays") > 0 || + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SizingPeriod:WeatherFileConditionType") > 0 || + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "RunPeriod") > 0); + + if ((state.dataGlobal->DoDesDaySim || state.dataGlobal->DoWeathSim || state.dataGlobal->DoPureLoadCalc) && SimPeriods) { + ReportingRequested = (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Table:SummaryReports") > 0 || + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Table:TimeBins") > 0 || + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Table:Monthly") > 0 || + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Table:Annual") > 0 || + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Variable") > 0 || + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Meter") > 0 || + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Meter:MeterFileOnly") > 0 || + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Meter:Cumulative") > 0 || + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Meter:Cumulative:MeterFileOnly") > 0); + // Not testing for : Output:SQLite or Output:EnvironmentalImpactFactors + if (!ReportingRequested) { + ShowWarningError(state, "No reporting elements have been requested. No simulation results produced."); + ShowContinueError(state, + "...Review requirements such as \"Output:Table:SummaryReports\", \"Output:Table:Monthly\", \"Output:Variable\", " + "\"Output:Meter\" and others."); + } + } + } + + std::unique_ptr OpenStreamFile(EnergyPlusData &state, const fs::path &filePath, std::ios_base::openmode mode) + { + auto result = std::make_unique(filePath, mode); + if (!result->good()) { + ShowFatalError(state, "OpenOutputFiles: Could not open file " + filePath.string() + " for output (write)."); + } + return result; + } + + std::unique_ptr OpenFmtStreamFile(EnergyPlusData &state, const fs::path &filePath) + { + std::unique_ptr result = nullptr; +#ifdef _WIN32 + auto filePathStr = filePath.string(); + auto path = filePathStr.c_str(); +#else + auto path = filePath.c_str(); +#endif + try { + auto f = fmt::output_file(path, fmt::buffer_size = (2 << 17)); + result = std::make_unique(std::move(f)); + } catch (const std::system_error &error) { + ShowSevereError(state, error.what()); + ShowFatalError(state, "OpenOutputFiles: Could not open file " + filePath.string() + " for output (write)."); + } + return result; + } + + void OpenOutputFiles(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Rick Strand + // DATE WRITTEN June 1997 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine opens all of the input and output files needed for + // an EnergyPlus run. + + state.dataGlobal->StdOutputRecordCount = 0; + state.files.eso.ensure_open(state, "OpenOutputFiles", state.files.outputControl.eso); + print(state.files.eso, "Program Version,{}\n", state.dataStrGlobals->VerStringVar); + + // Open the Initialization Output File + state.files.eio.ensure_open(state, "OpenOutputFiles", state.files.outputControl.eio); + print(state.files.eio, "Program Version,{}\n", state.dataStrGlobals->VerStringVar); + + // Open the Meters Output File + state.files.mtr.ensure_open(state, "OpenOutputFiles", state.files.outputControl.mtr); + print(state.files.mtr, "Program Version,{}\n", state.dataStrGlobals->VerStringVar); + + // Open the Branch-Node Details Output File + state.files.bnd.ensure_open(state, "OpenOutputFiles", state.files.outputControl.bnd); + print(state.files.bnd, "Program Version,{}\n", state.dataStrGlobals->VerStringVar); + } + + void CloseOutputFiles(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Rick Strand + // DATE WRITTEN June 1997 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine closes all of the input and output files needed for + // an EnergyPlus run. It also prints the end of data marker for each + // output file. + + // METHODOLOGY EMPLOYED: + // na + + // REFERENCES: + // na + + // Using/Aliasing + using namespace DataOutputs; + using namespace DataRuntimeLanguage; + using namespace DataSystemVariables; + + // SUBROUTINE PARAMETER DEFINITIONS: + static constexpr std::string_view EndOfDataString("End of Data"); // Signifies the end of the data block in the output file + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + std::string cEnvSetThreads; + std::string cepEnvSetThreads; + std::string cIDFSetThreads; + + state.files.audit.ensure_open(state, "CloseOutputFiles", state.files.outputControl.audit); + constexpr static auto variable_fmt{" {}={:12}\n"}; + // Record some items on the audit file + print(state.files.audit, variable_fmt, "NumOfRVariable", state.dataOutputProcessor->NumOfRVariable_Setup); + print(state.files.audit, variable_fmt, "NumOfRVariable(Total)", state.dataOutputProcessor->NumTotalRVariable); + print(state.files.audit, variable_fmt, "NumOfRVariable(Actual)", state.dataOutputProcessor->NumOfRVariable); + print(state.files.audit, variable_fmt, "NumOfRVariable(Summed)", state.dataOutputProcessor->NumOfRVariable_Sum); + print(state.files.audit, variable_fmt, "NumOfRVariable(Meter)", state.dataOutputProcessor->NumOfRVariable_Meter); + print(state.files.audit, variable_fmt, "NumOfIVariable", state.dataOutputProcessor->NumOfIVariable_Setup); + print(state.files.audit, variable_fmt, "NumOfIVariable(Total)", state.dataOutputProcessor->NumTotalIVariable); + print(state.files.audit, variable_fmt, "NumOfIVariable(Actual)", state.dataOutputProcessor->NumOfIVariable); + print(state.files.audit, variable_fmt, "NumOfIVariable(Summed)", state.dataOutputProcessor->NumOfIVariable_Sum); + print(state.files.audit, variable_fmt, "MaxRVariable", state.dataOutputProcessor->MaxRVariable); + print(state.files.audit, variable_fmt, "MaxIVariable", state.dataOutputProcessor->MaxIVariable); + print(state.files.audit, variable_fmt, "NumEnergyMeters", state.dataOutputProcessor->NumEnergyMeters); + print(state.files.audit, variable_fmt, "NumVarMeterArrays", state.dataOutputProcessor->NumVarMeterArrays); + print(state.files.audit, variable_fmt, "maxUniqueKeyCount", state.dataOutRptTab->maxUniqueKeyCount); + print(state.files.audit, variable_fmt, "maxNumberOfFigures", state.dataSolarShading->maxNumberOfFigures); + print(state.files.audit, variable_fmt, "MAXHCArrayBounds", state.dataSolarShading->MAXHCArrayBounds); + print(state.files.audit, variable_fmt, "MaxVerticesPerSurface", state.dataSurface->MaxVerticesPerSurface); + print(state.files.audit, variable_fmt, "NumReportList", state.dataOutputProcessor->NumReportList); + print(state.files.audit, variable_fmt, "InstMeterCacheSize", state.dataOutputProcessor->InstMeterCacheSize); + if (state.dataSysVars->SutherlandHodgman) { + if (state.dataSysVars->SlaterBarsky) { + print(state.files.audit, " {}\n", "ClippingAlgorithm=SlaterBarskyandSutherlandHodgman"); + } else { + print(state.files.audit, " {}\n", "ClippingAlgorithm=SutherlandHodgman"); + } + } else { + print(state.files.audit, "{}\n", "ClippingAlgorithm=ConvexWeilerAtherton"); + } + print(state.files.audit, variable_fmt, "MonthlyFieldSetInputCount", state.dataOutRptTab->MonthlyFieldSetInputCount); + print(state.files.audit, variable_fmt, "NumConsideredOutputVariables", state.dataOutput->NumConsideredOutputVariables); + print(state.files.audit, variable_fmt, "MaxConsideredOutputVariables", state.dataOutput->MaxConsideredOutputVariables); + + print(state.files.audit, variable_fmt, "numActuatorsUsed", state.dataRuntimeLang->numActuatorsUsed); + print(state.files.audit, variable_fmt, "numEMSActuatorsAvailable", state.dataRuntimeLang->numEMSActuatorsAvailable); + print(state.files.audit, variable_fmt, "maxEMSActuatorsAvailable", state.dataRuntimeLang->maxEMSActuatorsAvailable); + print(state.files.audit, variable_fmt, "numInternalVariablesUsed", state.dataRuntimeLang->NumInternalVariablesUsed); + print(state.files.audit, variable_fmt, "numEMSInternalVarsAvailable", state.dataRuntimeLang->numEMSInternalVarsAvailable); + print(state.files.audit, variable_fmt, "maxEMSInternalVarsAvailable", state.dataRuntimeLang->maxEMSInternalVarsAvailable); + + print(state.files.audit, variable_fmt, "NumOfNodeConnections", state.dataBranchNodeConnections->NumOfNodeConnections); + print(state.files.audit, variable_fmt, "MaxNumOfNodeConnections", state.dataBranchNodeConnections->MaxNumOfNodeConnections); +#ifdef EP_Count_Calls + print(state.files.audit, variable_fmt, "NumShadow_Calls", state.dataTimingsData->NumShadow_Calls); + print(state.files.audit, variable_fmt, "NumShadowAtTS_Calls", state.dataTimingsData->NumShadowAtTS_Calls); + print(state.files.audit, variable_fmt, "NumClipPoly_Calls", state.dataTimingsData->NumClipPoly_Calls); + print(state.files.audit, variable_fmt, "NumInitSolar_Calls", state.dataTimingsData->NumInitSolar_Calls); + print(state.files.audit, variable_fmt, "NumAnisoSky_Calls", state.dataTimingsData->NumAnisoSky_Calls); + print(state.files.audit, variable_fmt, "NumDetPolyOverlap_Calls", state.dataTimingsData->NumDetPolyOverlap_Calls); + print(state.files.audit, variable_fmt, "NumCalcPerSolBeam_Calls", state.dataTimingsData->NumCalcPerSolBeam_Calls); + print(state.files.audit, variable_fmt, "NumDetShadowCombs_Calls", state.dataTimingsData->NumDetShadowCombs_Calls); + print(state.files.audit, variable_fmt, "NumIntSolarDist_Calls", state.dataTimingsData->NumIntSolarDist_Calls); + print(state.files.audit, variable_fmt, "NumIntRadExchange_Calls", state.dataTimingsData->NumIntRadExchange_Calls); + print(state.files.audit, variable_fmt, "NumIntRadExchangeZ_Calls", state.dataTimingsData->NumIntRadExchangeZ_Calls); + print(state.files.audit, variable_fmt, "NumIntRadExchangeMain_Calls", state.dataTimingsData->NumIntRadExchangeMain_Calls); + print(state.files.audit, variable_fmt, "NumIntRadExchangeOSurf_Calls", state.dataTimingsData->NumIntRadExchangeOSurf_Calls); + print(state.files.audit, variable_fmt, "NumIntRadExchangeISurf_Calls", state.dataTimingsData->NumIntRadExchangeISurf_Calls); + print(state.files.audit, variable_fmt, "NumMaxInsideSurfIterations", state.dataTimingsData->NumMaxInsideSurfIterations); + print(state.files.audit, variable_fmt, "NumCalcScriptF_Calls", state.dataTimingsData->NumCalcScriptF_Calls); +#endif + + print(state.files.eso, "{}\n", EndOfDataString); + if (state.dataGlobal->StdOutputRecordCount > 0) { + print(state.files.eso, variable_fmt, "Number of Records Written", state.dataGlobal->StdOutputRecordCount); + state.files.eso.close(); + } else { + state.files.eso.del(); + } + + if (state.dataHeatBal->AnyCondFD) { // echo out relaxation factor, it may have been changed by the program + print( + state.files.eio, "{}\n", "! , Starting Relaxation Factor, Final Relaxation Factor"); + print(state.files.eio, + "ConductionFiniteDifference Numerical Parameters, {:.3R}, {:.3R}\n", + state.dataHeatBal->CondFDRelaxFactorInput, + state.dataHeatBal->CondFDRelaxFactor); + } + // Report number of threads to eio file + static constexpr std::string_view ThreadingHeader( + "! , Threading Supported,Maximum Number of " + "Threads, Env Set Threads (OMP_NUM_THREADS), EP Env Set Threads (EP_OMP_NUM_THREADS), IDF Set " + "Threads, Number of Threads Used (Interior Radiant Exchange), Number Nominal Surfaces, Number " + "Parallel Sims"); + print(state.files.eio, "{}\n", ThreadingHeader); + static constexpr std::string_view ThreadReport("Program Control:Threads/Parallel Sims, {},{}, {}, {}, {}, {}, {}, {}\n"); + if (state.dataSysVars->Threading) { + if (state.dataSysVars->iEnvSetThreads == 0) { + cEnvSetThreads = "Not Set"; + } else { + cEnvSetThreads = fmt::to_string(state.dataSysVars->iEnvSetThreads); + } + if (state.dataSysVars->iepEnvSetThreads == 0) { + cepEnvSetThreads = "Not Set"; + } else { + cepEnvSetThreads = fmt::to_string(state.dataSysVars->iepEnvSetThreads); + } + if (state.dataSysVars->iIDFSetThreads == 0) { + cIDFSetThreads = "Not Set"; + } else { + cIDFSetThreads = fmt::to_string(state.dataSysVars->iIDFSetThreads); + } + if (state.dataSysVars->lnumActiveSims) { + print(state.files.eio, + ThreadReport, + "Yes", + state.dataSysVars->MaxNumberOfThreads, + cEnvSetThreads, + cepEnvSetThreads, + cIDFSetThreads, + state.dataSysVars->NumberIntRadThreads, + state.dataSysVars->iNominalTotSurfaces, + state.dataSysVars->inumActiveSims); + } else { + print(state.files.eio, + ThreadReport, + "Yes", + state.dataSysVars->MaxNumberOfThreads, + cEnvSetThreads, + cepEnvSetThreads, + cIDFSetThreads, + state.dataSysVars->NumberIntRadThreads, + state.dataSysVars->iNominalTotSurfaces, + "N/A"); + } + } else { // no threading + if (state.dataSysVars->lnumActiveSims) { + print(state.files.eio, + ThreadReport, + "No", + state.dataSysVars->MaxNumberOfThreads, + "N/A", + "N/A", + "N/A", + "N/A", + "N/A", + state.dataSysVars->inumActiveSims); + } else { + print(state.files.eio, ThreadReport, "No", state.dataSysVars->MaxNumberOfThreads, "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"); + } + } + + // Close the Initialization Output File + print(state.files.eio, "{}\n", EndOfDataString); + state.files.eio.close(); + + // Close the Meters Output File + print(state.files.mtr, "{}\n", EndOfDataString); + print(state.files.mtr, " Number of Records Written={:12}\n", state.dataGlobal->StdMeterRecordCount); + if (state.dataGlobal->StdMeterRecordCount > 0) { + state.files.mtr.close(); + } else { + state.files.mtr.del(); + } + + // Close the External Shading Output File + state.files.shade.close(); + } + + void SetupSimulation(EnergyPlusData &state, bool &ErrorsFound) + { + + // SUBROUTINE INFORMATION: + // AUTHOR B. Griffith/L. Lawrie + // DATE WRITTEN May 2008 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // execute a few time steps of a simulation to facilitate setting up model + // developed to resolve reverse DD problems caused be the differences + // that stem from setup and information gathering that occurs during the first pass. + + // METHODOLOGY EMPLOYED: + // Using global flag (kickoff simulation), only a few time steps are executed. + // global flag is used in other parts of simulation to terminate quickly. + + // Using/Aliasing + using CostEstimateManager::SimCostEstimate; + using ExteriorEnergyUse::ManageExteriorEnergyUse; + + bool Available = true; + + while (Available) { // do for each environment + + GetNextEnvironment(state, Available, ErrorsFound); + + if (!Available) break; + if (ErrorsFound) break; + + state.dataGlobal->BeginEnvrnFlag = true; + state.dataGlobal->EndEnvrnFlag = false; + state.dataEnvrn->EndMonthFlag = false; + state.dataGlobal->WarmupFlag = true; + state.dataGlobal->DayOfSim = 0; + + ++state.dataGlobal->DayOfSim; + state.dataGlobal->BeginDayFlag = true; + state.dataGlobal->EndDayFlag = false; + + state.dataGlobal->HourOfDay = 1; + + state.dataGlobal->BeginHourFlag = true; + state.dataGlobal->EndHourFlag = false; + + state.dataGlobal->TimeStep = 1; + + if (state.dataSysVars->DeveloperFlag) DisplayString(state, "Initializing Simulation - timestep 1:" + state.dataEnvrn->EnvironmentName); + + state.dataGlobal->BeginTimeStepFlag = true; + + ManageWeather(state); + + ManageExteriorEnergyUse(state); + + ManageHeatBalance(state); + + state.dataGlobal->BeginHourFlag = false; + state.dataGlobal->BeginDayFlag = false; + state.dataGlobal->BeginEnvrnFlag = false; + state.dataGlobal->BeginSimFlag = false; + + // ! do another timestep=1 + if (state.dataSysVars->DeveloperFlag) + DisplayString(state, "Initializing Simulation - 2nd timestep 1:" + state.dataEnvrn->EnvironmentName); + + ManageWeather(state); + + ManageExteriorEnergyUse(state); + + ManageHeatBalance(state); + + // do an end of day, end of environment time step + + state.dataGlobal->HourOfDay = 24; + state.dataGlobal->TimeStep = state.dataGlobal->NumOfTimeStepInHour; + state.dataGlobal->EndEnvrnFlag = true; + + if (state.dataSysVars->DeveloperFlag) + DisplayString(state, "Initializing Simulation - hour 24 timestep 1:" + state.dataEnvrn->EnvironmentName); + ManageWeather(state); + + ManageExteriorEnergyUse(state); + + ManageHeatBalance(state); + + } // ... End environment loop. + + if (state.dataGlobal->AnySlabsInModel || state.dataGlobal->AnyBasementsInModel) { + PlantPipingSystemsManager::SimulateGroundDomains(state, true); + } + + if (!ErrorsFound) SimCostEstimate(state); // basically will get and check input + if (ErrorsFound) ShowFatalError(state, "Previous conditions cause program termination."); + } + + void ReportNodeConnections(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN February 2004 + // MODIFIED na + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine 'reports' the NodeConnection data structure. It groups the + // report/dump by parent, non-parent objects. + + // Using/Aliasing + using namespace DataBranchNodeConnections; + + // Formats + static constexpr std::string_view Format_702("! <#{0} Node Connections>,\n"); + static constexpr std::string_view Format_703( + "! <{} Node Connection>,,,,,\n"); + + state.dataBranchNodeConnections->NonConnectedNodes.dimension(state.dataLoopNodes->NumOfNodes, true); + + int NumNonParents = 0; + for (int Loop = 1; Loop <= state.dataBranchNodeConnections->NumOfNodeConnections; ++Loop) { + if (state.dataBranchNodeConnections->NodeConnections(Loop).ObjectIsParent) continue; + ++NumNonParents; + } + const auto NumParents = state.dataBranchNodeConnections->NumOfNodeConnections - NumNonParents; + state.dataBranchNodeConnections->ParentNodeList.allocate(NumParents); + + // Do Parent Objects + print(state.files.bnd, "{}\n", "! ==============================================================="); + print(state.files.bnd, Format_702, "Parent"); + print(state.files.bnd, " #Parent Node Connections,{}\n", NumParents); + print(state.files.bnd, Format_703, "Parent"); + + for (int Loop = 1; Loop <= state.dataBranchNodeConnections->NumOfNodeConnections; ++Loop) { + if (!state.dataBranchNodeConnections->NodeConnections(Loop).ObjectIsParent) continue; + state.dataBranchNodeConnections->NonConnectedNodes(state.dataBranchNodeConnections->NodeConnections(Loop).NodeNumber) = false; + print(state.files.bnd, + " Parent Node Connection,{},{},{},{},{}\n", + state.dataBranchNodeConnections->NodeConnections(Loop).NodeName, + BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( + state.dataBranchNodeConnections->NodeConnections(Loop).ObjectType)], + state.dataBranchNodeConnections->NodeConnections(Loop).ObjectName, + DataLoopNode::ConnectionTypeNames[static_cast(state.dataBranchNodeConnections->NodeConnections(Loop).ConnectionType)], + state.dataBranchNodeConnections->NodeConnections(Loop).FluidStream); + // Build ParentNodeLists + if ((state.dataBranchNodeConnections->NodeConnections(Loop).ConnectionType == DataLoopNode::ConnectionType::Inlet) || + (state.dataBranchNodeConnections->NodeConnections(Loop).ConnectionType == DataLoopNode::ConnectionType::Outlet)) { + bool ParentComponentFound = false; + for (int Loop1 = 1; Loop1 <= state.dataBranchNodeConnections->NumOfActualParents; ++Loop1) { + if (state.dataBranchNodeConnections->ParentNodeList(Loop1).ComponentType != + state.dataBranchNodeConnections->NodeConnections(Loop).ObjectType || + state.dataBranchNodeConnections->ParentNodeList(Loop1).ComponentName != + state.dataBranchNodeConnections->NodeConnections(Loop).ObjectName) + continue; + ParentComponentFound = true; + + switch (state.dataBranchNodeConnections->NodeConnections(Loop).ConnectionType) { + case DataLoopNode::ConnectionType::Inlet: + state.dataBranchNodeConnections->ParentNodeList(Loop1).InletNodeName = + state.dataBranchNodeConnections->NodeConnections(Loop).NodeName; + break; + case DataLoopNode::ConnectionType::Outlet: + state.dataBranchNodeConnections->ParentNodeList(Loop1).OutletNodeName = + state.dataBranchNodeConnections->NodeConnections(Loop).NodeName; + default: + break; + } + } + if (!ParentComponentFound) { + ++state.dataBranchNodeConnections->NumOfActualParents; + state.dataBranchNodeConnections->ParentNodeList(state.dataBranchNodeConnections->NumOfActualParents).ComponentType = + state.dataBranchNodeConnections->NodeConnections(Loop).ObjectType; + state.dataBranchNodeConnections->ParentNodeList(state.dataBranchNodeConnections->NumOfActualParents).ComponentName = + state.dataBranchNodeConnections->NodeConnections(Loop).ObjectName; + + switch (state.dataBranchNodeConnections->NodeConnections(Loop).ConnectionType) { + case DataLoopNode::ConnectionType::Inlet: + state.dataBranchNodeConnections->ParentNodeList(state.dataBranchNodeConnections->NumOfActualParents).InletNodeName = + state.dataBranchNodeConnections->NodeConnections(Loop).NodeName; + break; + case DataLoopNode::ConnectionType::Outlet: + state.dataBranchNodeConnections->ParentNodeList(state.dataBranchNodeConnections->NumOfActualParents).OutletNodeName = + state.dataBranchNodeConnections->NodeConnections(Loop).NodeName; + break; + default: + break; + } + } + } + } + + // Do non-Parent Objects + print(state.files.bnd, "{}\n", "! ==============================================================="); + print(state.files.bnd, Format_702, "Non-Parent"); + print(state.files.bnd, " #Non-Parent Node Connections,{}\n", NumNonParents); + print(state.files.bnd, Format_703, "Non-Parent"); + + for (int Loop = 1; Loop <= state.dataBranchNodeConnections->NumOfNodeConnections; ++Loop) { + if (state.dataBranchNodeConnections->NodeConnections(Loop).ObjectIsParent) continue; + state.dataBranchNodeConnections->NonConnectedNodes(state.dataBranchNodeConnections->NodeConnections(Loop).NodeNumber) = false; + print(state.files.bnd, + " Non-Parent Node Connection,{},{},{},{},{}\n", + state.dataBranchNodeConnections->NodeConnections(Loop).NodeName, + BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( + state.dataBranchNodeConnections->NodeConnections(Loop).ObjectType)], + state.dataBranchNodeConnections->NodeConnections(Loop).ObjectName, + DataLoopNode::ConnectionTypeNames[static_cast(state.dataBranchNodeConnections->NodeConnections(Loop).ConnectionType)], + state.dataBranchNodeConnections->NodeConnections(Loop).FluidStream); + } + + int NumNonConnected = 0; + for (int Loop = 1; Loop <= state.dataLoopNodes->NumOfNodes; ++Loop) { + if (state.dataBranchNodeConnections->NonConnectedNodes(Loop)) ++NumNonConnected; + } + + if (NumNonConnected > 0) { + print(state.files.bnd, "{}\n", "! ==============================================================="); + static constexpr std::string_view Format_705("! <#NonConnected Nodes>,\n #NonConnected Nodes,{}\n"); + print(state.files.bnd, Format_705, NumNonConnected); + static constexpr std::string_view Format_706("! ,,"); + print(state.files.bnd, "{}\n", Format_706); + for (int Loop = 1; Loop <= state.dataLoopNodes->NumOfNodes; ++Loop) { + if (!state.dataBranchNodeConnections->NonConnectedNodes(Loop)) continue; + print(state.files.bnd, " NonConnected Node,{},{}\n", Loop, state.dataLoopNodes->NodeID(Loop)); + } + } + + state.dataBranchNodeConnections->NonConnectedNodes.deallocate(); + } + + void ReportLoopConnections(EnergyPlusData &state) + { + + // SUBROUTINE INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN December 2001 + // MODIFIED March 2003; added other reporting + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine reports on the node connections in various parts of the + // HVAC system: Component Sets, Air Loop, Plant and Condenser Loop, Supply and + // return air paths, controlled zones. + // This information should be useful in diagnosing node connection input errors. + + constexpr static auto errstring("**error**"); + + // Formats + static constexpr std::string_view Format_700("! <#Component Sets>,"); + static constexpr std::string_view Format_702("! ,,,,,,,,"); + static constexpr std::string_view Format_720("! <#Zone Equipment Lists>,"); + static constexpr std::string_view Format_722( + "! ,,,,"); + static constexpr std::string_view Format_723( + "! ,,,,,,"); + + // Report outside air node names on the Branch-Node Details file + print(state.files.bnd, "{}\n", "! ==============================================================="); + print(state.files.bnd, "{}\n", "! #Outdoor Air Nodes,"); + print(state.files.bnd, " #Outdoor Air Nodes,{}\n", state.dataOutAirNodeMgr->NumOutsideAirNodes); + if (state.dataOutAirNodeMgr->NumOutsideAirNodes > 0) { + print(state.files.bnd, "{}\n", "! ,,"); + } + for (int Count = 1; Count <= state.dataOutAirNodeMgr->NumOutsideAirNodes; ++Count) { + print(state.files.bnd, + " Outdoor Air Node,{},{}\n", + state.dataOutAirNodeMgr->OutsideAirNodeList(Count), + state.dataLoopNodes->NodeID(state.dataOutAirNodeMgr->OutsideAirNodeList(Count))); + } + // Component Sets + print(state.files.bnd, "{}\n", "! ==============================================================="); + print(state.files.bnd, "{}\n", Format_700); + print(state.files.bnd, " #Component Sets,{}\n", state.dataBranchNodeConnections->NumCompSets); + print(state.files.bnd, "{}\n", Format_702); + + for (int Count = 1; Count <= state.dataBranchNodeConnections->NumCompSets; ++Count) { + print(state.files.bnd, + " Component Set,{},{},{},{},{},{},{},{}\n", + Count, + BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( + state.dataBranchNodeConnections->CompSets(Count).ParentObjectType)], + state.dataBranchNodeConnections->CompSets(Count).ParentCName, + BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( + state.dataBranchNodeConnections->CompSets(Count).ComponentObjectType)], + state.dataBranchNodeConnections->CompSets(Count).CName, + state.dataBranchNodeConnections->CompSets(Count).InletNodeName, + state.dataBranchNodeConnections->CompSets(Count).OutletNodeName, + state.dataBranchNodeConnections->CompSets(Count).Description); + + std::string_view const CType = BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( + state.dataBranchNodeConnections->CompSets(Count).ComponentObjectType)]; + if (state.dataBranchNodeConnections->CompSets(Count).ParentObjectType == DataLoopNode::ConnectionObjectType::Undefined || + state.dataBranchNodeConnections->CompSets(Count).InletNodeName == "UNDEFINED" || + state.dataBranchNodeConnections->CompSets(Count).OutletNodeName == "UNDEFINED") { + if (state.dataErrTracking->AbortProcessing && state.dataSimulationManager->WarningOut) { + ShowWarningError(state, + "Node Connection errors shown during \"fatal error\" processing may be false because not all inputs may have " + "been retrieved."); + state.dataSimulationManager->WarningOut = false; + } + ShowWarningError(state, + format("Node Connection Error for object {}={}", CType, state.dataBranchNodeConnections->CompSets(Count).CName)); + ShowContinueError(state, + format(" {} not on any Branch or Parent Object", state.dataBranchNodeConnections->CompSets(Count).Description)); + ShowContinueError(state, format(" Inlet Node : {}", state.dataBranchNodeConnections->CompSets(Count).InletNodeName)); + ShowContinueError(state, format(" Outlet Node: {}", state.dataBranchNodeConnections->CompSets(Count).OutletNodeName)); + ++state.dataBranchNodeConnections->NumNodeConnectionErrors; + if (state.dataBranchNodeConnections->CompSets(Count).ComponentObjectType == + DataLoopNode::ConnectionObjectType::SolarCollectorUnglazedTranspired) { + ShowContinueError(state, "This report does not necessarily indicate a problem for a MultiSystem Transpired Collector"); + } + } + if (state.dataBranchNodeConnections->CompSets(Count).Description == "UNDEFINED") { + if (state.dataErrTracking->AbortProcessing && state.dataSimulationManager->WarningOut) { + ShowWarningError(state, + "Node Connection errors shown during \"fatal error\" processing may be false because not all inputs may have " + "been retrieved."); + state.dataSimulationManager->WarningOut = false; + } + ShowWarningError( + state, + format("Potential Node Connection Error for object {}, name={}", CType, state.dataBranchNodeConnections->CompSets(Count).CName)); + ShowContinueError(state, " Node Types are still UNDEFINED -- See Branch/Node Details file for further information"); + ShowContinueError(state, " Inlet Node : " + state.dataBranchNodeConnections->CompSets(Count).InletNodeName); + ShowContinueError(state, " Outlet Node: " + state.dataBranchNodeConnections->CompSets(Count).OutletNodeName); + ++state.dataBranchNodeConnections->NumNodeConnectionErrors; + } + } + + for (int Count = 1; Count <= state.dataBranchNodeConnections->NumCompSets; ++Count) { + for (int Count1 = Count + 1; Count1 <= state.dataBranchNodeConnections->NumCompSets; ++Count1) { + if (state.dataBranchNodeConnections->CompSets(Count).ComponentObjectType != + state.dataBranchNodeConnections->CompSets(Count1).ComponentObjectType) + continue; + if (state.dataBranchNodeConnections->CompSets(Count).CName != state.dataBranchNodeConnections->CompSets(Count1).CName) continue; + if (state.dataBranchNodeConnections->CompSets(Count).InletNodeName != state.dataBranchNodeConnections->CompSets(Count1).InletNodeName) + continue; + if (state.dataBranchNodeConnections->CompSets(Count).OutletNodeName != + state.dataBranchNodeConnections->CompSets(Count1).OutletNodeName) + continue; + if (state.dataErrTracking->AbortProcessing && state.dataSimulationManager->WarningOut) { + ShowWarningError(state, + "Node Connection errors shown during \"fatal error\" processing may be false because not all inputs may have " + "been retrieved."); + state.dataSimulationManager->WarningOut = false; + } + std::string_view const CType = BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( + state.dataBranchNodeConnections->CompSets(Count).ComponentObjectType)]; + std::string_view const ParentCType = BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( + state.dataBranchNodeConnections->CompSets(Count1).ParentObjectType)]; + std::string_view const ParentCType1 = BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( + state.dataBranchNodeConnections->CompSets(Count).ParentObjectType)]; + ShowWarningError(state, "Component plus inlet/outlet node pair used more than once:"); + ShowContinueError(state, format(" Component : {}={}", CType, state.dataBranchNodeConnections->CompSets(Count).CName)); + ShowContinueError(state, format(" Inlet Node : {}", state.dataBranchNodeConnections->CompSets(Count).InletNodeName)); + ShowContinueError(state, format(" Outlet Node: {}", state.dataBranchNodeConnections->CompSets(Count).OutletNodeName)); + ShowContinueError(state, format(" Used by : {}={}", ParentCType, state.dataBranchNodeConnections->CompSets(Count).ParentCName)); + ShowContinueError(state, format(" and by : {}={}", ParentCType1, state.dataBranchNodeConnections->CompSets(Count1).ParentCName)); + ++state.dataBranchNodeConnections->NumNodeConnectionErrors; + } + } + // Plant Loops + print(state.files.bnd, "{}\n", "! ==============================================================="); + print(state.files.bnd, "{}\n", "! <# Plant Loops>,"); + print(state.files.bnd, " #Plant Loops,{}\n", state.dataHVACGlobal->NumPlantLoops); + print(state.files.bnd, + "{}\n", + "! ,,,,,,"); + print( + state.files.bnd, "{}\n", "! ,,,,,"); + print(state.files.bnd, + "{}\n", + "! ,,,,,,,"); + print(state.files.bnd, + "{}\n", + "! ,,,,,,,"); + print(state.files.bnd, + "{}\n", + "! ,,,"); + print(state.files.bnd, + "{}\n", + "! ,,,"); + for (int Count = 1; Count <= state.dataHVACGlobal->NumPlantLoops; ++Count) { + for (DataPlant::LoopSideLocation LoopSideNum : DataPlant::LoopSideKeys) { + // Plant Supply Side Loop + // LoopSideLocation::Demand and LoopSideLocation::Supply is parametrized in DataPlant + std::string_view const LoopString = DataPlant::DemandSupplyNames[static_cast(LoopSideNum)]; + + print(state.files.bnd, + " Plant Loop,{},{},{},{},{},{}\n", + state.dataPlnt->PlantLoop(Count).Name, + LoopString, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).NodeNameIn, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).NodeNameOut, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).BranchList, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).ConnectList); + // Plant Supply Side Splitter + if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Exists) { + print(state.files.bnd, + " Plant Loop Connector,Splitter,{},{},{},{}\n", + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Name, + state.dataPlnt->PlantLoop(Count).Name, + LoopString, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.TotalOutletNodes); + for (int Count1 = 1; Count1 <= state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.TotalOutletNodes; ++Count1) { + print(state.files.bnd, + " Plant Loop Connector Branches,{},Splitter,{},", + Count1, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Name); + + if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumIn <= 0) { + print(state.files.bnd, "{},\n", errstring); + } else { + print(state.files.bnd, + "{},", + state.dataPlnt->PlantLoop(Count) + .LoopSide(LoopSideNum) + .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumIn) + .Name); + } + + if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumOut(Count1) <= 0) { + print(state.files.bnd, "{},{},{}\n", errstring, state.dataPlnt->PlantLoop(Count).Name, LoopString); + } else { + print(state.files.bnd, + "{},{},{}\n", + state.dataPlnt->PlantLoop(Count) + .LoopSide(LoopSideNum) + .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumOut(Count1)) + .Name, + state.dataPlnt->PlantLoop(Count).Name, + LoopString); + } + + print(state.files.bnd, + " Plant Loop Connector Nodes, {},Splitter,{},{},{},{},{}\n", + Count1, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Name, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.NodeNameIn, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.NodeNameOut(Count1), + state.dataPlnt->PlantLoop(Count).Name, + LoopString); + } + } + + // Plant Supply Side Mixer + if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Exists) { + print(state.files.bnd, + " Plant Loop Connector,Mixer,{},{},{},{}\n", + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Name, + state.dataPlnt->PlantLoop(Count).Name, + LoopString, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.TotalInletNodes); //',Supply,'// & + + for (int Count1 = 1; Count1 <= state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.TotalInletNodes; ++Count1) { + print(state.files.bnd, + " Plant Loop Connector Branches,{},Mixer,{},", + Count1, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Name); + if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumIn(Count1) <= 0) { + print(state.files.bnd, "{},", errstring); + } else { + print(state.files.bnd, + "{},", + state.dataPlnt->PlantLoop(Count) + .LoopSide(LoopSideNum) + .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumIn(Count1)) + .Name); + } + if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumOut <= 0) { + print(state.files.bnd, "{},{},Supply\n", errstring, state.dataPlnt->PlantLoop(Count).Name); + } else { + print(state.files.bnd, + "{},{},{}\n", + state.dataPlnt->PlantLoop(Count) + .LoopSide(LoopSideNum) + .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumOut) + .Name, + state.dataPlnt->PlantLoop(Count).Name, + LoopString); + } + print(state.files.bnd, + " Plant Loop Connector Nodes, {},Mixer,{},{},{},{},{}\n", + Count1, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Name, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.NodeNameIn(Count1), + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.NodeNameOut, + state.dataPlnt->PlantLoop(Count).Name, + LoopString); + } + } + } + print(state.files.bnd, + " Plant Loop Supply Connection,{},{},{}\n", + state.dataPlnt->PlantLoop(Count).Name, + state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Supply).NodeNameOut, + state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Demand).NodeNameIn); + print(state.files.bnd, + " Plant Loop Return Connection,{},{},{}\n", + state.dataPlnt->PlantLoop(Count).Name, + state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Demand).NodeNameOut, + state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Supply).NodeNameIn); + + } // Plant Demand Side Loop + + // Condenser Loops + print(state.files.bnd, "{}\n", "! ==============================================================="); + print(state.files.bnd, "{}\n", "! <# Condenser Loops>,"); + print(state.files.bnd, " #Condenser Loops,{}\n", state.dataHVACGlobal->NumCondLoops); + print(state.files.bnd, + "{}\n", + "! ,,,,,,"); + print(state.files.bnd, + "{}\n", + "! ,,,,,"); + print(state.files.bnd, + "{}\n", + "! ,,,,,,,"); + print(state.files.bnd, + "{}\n", + "! ,,,,,,,"); + print(state.files.bnd, + "{}\n", + "! ,,,"); + print(state.files.bnd, + "{}\n", + "! ,,,"); + + for (int Count = state.dataHVACGlobal->NumPlantLoops + 1; Count <= state.dataPlnt->TotNumLoops; ++Count) { + for (DataPlant::LoopSideLocation LoopSideNum : DataPlant::LoopSideKeys) { + // Plant Supply Side Loop + // LoopSideLocation::Demand and LoopSideLocation::Supply is parametrized in DataPlant + const auto LoopString = [&]() { + if (LoopSideNum == DataPlant::LoopSideLocation::Demand) { + return "Demand"; + } else if (LoopSideNum == DataPlant::LoopSideLocation::Supply) { + return "Supply"; + } else { + return ""; + } + }(); + + print(state.files.bnd, + " Plant Loop,{},{},{},{},{},{}\n", + state.dataPlnt->PlantLoop(Count).Name, + LoopString, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).NodeNameIn, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).NodeNameOut, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).BranchList, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).ConnectList); + // Plant Supply Side Splitter + if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Exists) { + print(state.files.bnd, + " Plant Loop Connector,Splitter,{},{},{},{}\n", + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Name, + state.dataPlnt->PlantLoop(Count).Name, + LoopString, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.TotalOutletNodes); + for (int Count1 = 1; Count1 <= state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.TotalOutletNodes; ++Count1) { + print(state.files.bnd, + " Plant Loop Connector Branches,{},Splitter,{},", + Count1, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Name); + + if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumIn <= 0) { + print(state.files.bnd, "{},", errstring); + } else { + print(state.files.bnd, + "{},", + state.dataPlnt->PlantLoop(Count) + .LoopSide(LoopSideNum) + .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumIn) + .Name); + } + if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumOut(Count1) <= 0) { + print(state.files.bnd, "{},{},{}\n", errstring, state.dataPlnt->PlantLoop(Count).Name, LoopString); + } else { + + print(state.files.bnd, + "{},{},{}\n", + state.dataPlnt->PlantLoop(Count) + .LoopSide(LoopSideNum) + .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumOut(Count1)) + .Name, + state.dataPlnt->PlantLoop(Count).Name, + LoopString); + } + + print(state.files.bnd, + " Plant Loop Connector Nodes, {},Splitter,{},{},{},{},{}\n", + Count1, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Name, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.NodeNameIn, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.NodeNameOut(Count1), + state.dataPlnt->PlantLoop(Count).Name, + LoopString); + } + } + + // Plant Supply Side Mixer + if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Exists) { + const auto totalInletNodes = state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.TotalInletNodes; + print(state.files.bnd, + " Plant Loop Connector,Mixer,{},{},{},{}\n", + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Name, + state.dataPlnt->PlantLoop(Count).Name, + LoopString, + totalInletNodes); //',Supply,'// & + + for (int Count1 = 1; Count1 <= totalInletNodes; ++Count1) { + print(state.files.bnd, + " Plant Loop Connector Branches,{},Mixer,{},", + Count1, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Name); + + if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumIn(Count1) <= 0) { + print(state.files.bnd, "{},", errstring); + } else { + print(state.files.bnd, + "{},", + state.dataPlnt->PlantLoop(Count) + .LoopSide(LoopSideNum) + .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumIn(Count1)) + .Name); + } + if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumOut <= 0) { + print(state.files.bnd, "{},{},{}\n", errstring, state.dataPlnt->PlantLoop(Count).Name, LoopString); + } else { + print(state.files.bnd, + "{},{},{}\n", + state.dataPlnt->PlantLoop(Count) + .LoopSide(LoopSideNum) + .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumOut) + .Name, + state.dataPlnt->PlantLoop(Count).Name, + LoopString); + } + print(state.files.bnd, + " Plant Loop Connector Nodes, {},Mixer,{},{},{},{},{}\n", + Count1, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Name, + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.NodeNameIn(Count1), + state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.NodeNameOut, + state.dataPlnt->PlantLoop(Count).Name, + LoopString); + } + } + } + print(state.files.bnd, + " Plant Loop Supply Connection,{},{},{}\n", + state.dataPlnt->PlantLoop(Count).Name, + state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Supply).NodeNameOut, + state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Demand).NodeNameIn); + print(state.files.bnd, + " Plant Loop Return Connection,{},{},{}\n", + state.dataPlnt->PlantLoop(Count).Name, + state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Demand).NodeNameOut, + state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Supply).NodeNameIn); + + } // Plant Demand Side Loop + + print(state.files.bnd, "{}\n", "! ==============================================================="); + int NumOfControlledZones = 0; + for (int Count = 1; Count <= state.dataGlobal->NumOfZones; ++Count) { + if (!allocated(state.dataZoneEquip->ZoneEquipConfig)) continue; + if (state.dataZoneEquip->ZoneEquipConfig(Count).IsControlled) ++NumOfControlledZones; + } + + if (NumOfControlledZones > 0) { + print(state.files.bnd, "{}\n", "! <# Controlled Zones>,"); + print(state.files.bnd, " #Controlled Zones,{}\n", NumOfControlledZones); + print(state.files.bnd, + "{}\n", + "! ,,,,,<# Inlet Nodes>,<# Exhaust " + "Nodes>,<# Return Nodes>"); + print(state.files.bnd, + "{}\n", + "! ,,,,,
"); + print(state.files.bnd, "{}\n", "! ,,,"); + + for (int Count = 1; Count <= state.dataGlobal->NumOfZones; ++Count) { + if (!state.dataZoneEquip->ZoneEquipConfig(Count).IsControlled) continue; + + print(state.files.bnd, + " Controlled Zone,{},{},{},{},{},{},{}\n", + state.dataZoneEquip->ZoneEquipConfig(Count).ZoneName, + state.dataZoneEquip->ZoneEquipConfig(Count).EquipListName, + state.dataZoneEquip->ZoneEquipConfig(Count).ControlListName, + state.dataLoopNodes->NodeID(state.dataZoneEquip->ZoneEquipConfig(Count).ZoneNode), + state.dataZoneEquip->ZoneEquipConfig(Count).NumInletNodes, + state.dataZoneEquip->ZoneEquipConfig(Count).NumExhaustNodes, + state.dataZoneEquip->ZoneEquipConfig(Count).NumReturnNodes); + for (int Count1 = 1; Count1 <= state.dataZoneEquip->ZoneEquipConfig(Count).NumInletNodes; ++Count1) { + auto ChrName = state.dataLoopNodes->NodeID(state.dataZoneEquip->ZoneEquipConfig(Count).AirDistUnitHeat(Count1).InNode); + if (ChrName == "Undefined") ChrName = "N/A"; + print(state.files.bnd, + " Controlled Zone Inlet,{},{},{},{},{}\n", + Count1, + state.dataZoneEquip->ZoneEquipConfig(Count).ZoneName, + state.dataLoopNodes->NodeID(state.dataZoneEquip->ZoneEquipConfig(Count).InletNode(Count1)), + state.dataLoopNodes->NodeID(state.dataZoneEquip->ZoneEquipConfig(Count).AirDistUnitCool(Count1).InNode), + ChrName); + } + for (int Count1 = 1; Count1 <= state.dataZoneEquip->ZoneEquipConfig(Count).NumExhaustNodes; ++Count1) { + print(state.files.bnd, + " Controlled Zone Exhaust,{},{},{}\n", + Count1, + state.dataZoneEquip->ZoneEquipConfig(Count).ZoneName, + state.dataLoopNodes->NodeID(state.dataZoneEquip->ZoneEquipConfig(Count).ExhaustNode(Count1))); + } + for (int Count1 = 1; Count1 <= state.dataZoneEquip->ZoneEquipConfig(Count).NumReturnNodes; ++Count1) { + print(state.files.bnd, + " Controlled Zone Return,{},{},{}\n", + Count1, + state.dataZoneEquip->ZoneEquipConfig(Count).ZoneName, + state.dataLoopNodes->NodeID(state.dataZoneEquip->ZoneEquipConfig(Count).ReturnNode(Count1))); + } + } + + // Report Zone Equipment Lists to BND File + print(state.files.bnd, "{}\n", "! ==============================================================="); + print(state.files.bnd, "{}\n", Format_720); + print(state.files.bnd, " #Zone Equipment Lists,{}\n", NumOfControlledZones); + print(state.files.bnd, "{}\n", Format_722); + print(state.files.bnd, "{}\n", Format_723); + + for (int Count = 1; Count <= state.dataGlobal->NumOfZones; ++Count) { + // Zone equipment list array parallels controlled zone equipment array, so + // same index finds corresponding data from both arrays + if (!state.dataZoneEquip->ZoneEquipConfig(Count).IsControlled) continue; + + print(state.files.bnd, + " Zone Equipment List,{},{},{},{}\n", + Count, + state.dataZoneEquip->ZoneEquipList(Count).Name, + state.dataZoneEquip->ZoneEquipConfig(Count).ZoneName, + state.dataZoneEquip->ZoneEquipList(Count).NumOfEquipTypes); + + for (int Count1 = 1; Count1 <= state.dataZoneEquip->ZoneEquipList(Count).NumOfEquipTypes; ++Count1) { + print(state.files.bnd, + " Zone Equipment Component,{},{},{},{},{},{}\n", + Count1, + state.dataZoneEquip->ZoneEquipList(Count).EquipType(Count1), + state.dataZoneEquip->ZoneEquipList(Count).EquipName(Count1), + state.dataZoneEquip->ZoneEquipConfig(Count).ZoneName, + state.dataZoneEquip->ZoneEquipList(Count).CoolingPriority(Count1), + state.dataZoneEquip->ZoneEquipList(Count).HeatingPriority(Count1)); + } + } + } + + // Report Dual Duct Dampers to BND File + DualDuct::ReportDualDuctConnections(state); + + if (state.dataBranchNodeConnections->NumNodeConnectionErrors == 0) { + ShowMessage(state, "No node connection errors were found."); + } else { + if (state.dataBranchNodeConnections->NumNodeConnectionErrors > 1) { + ShowMessage(state, format("There were {} node connection errors noted.", state.dataBranchNodeConnections->NumNodeConnectionErrors)); + } else { + ShowMessage(state, format("There was {} node connection error noted.", state.dataBranchNodeConnections->NumNodeConnectionErrors)); + } + } + + state.dataErrTracking->AskForConnectionsReport = false; + } + + void PostIPProcessing(EnergyPlusData &state) + { + // SUBROUTINE INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN August 2010 + + // PURPOSE OF THIS SUBROUTINE: + // This provides post processing (for errors, etc) directly after the InputProcessor + // finishes. Code originally in the Input Processor. + + // Using/Aliasing + // using SQLiteProcedures::CreateSQLiteDatabase; + using FluidProperties::FindGlycol; + + state.dataGlobal->DoingInputProcessing = false; + + state.dataInputProcessing->inputProcessor->preProcessorCheck( + state, state.dataSimulationManager->PreP_Fatal); // Check Preprocessor objects for warning, severe, etc errors. + + if (state.dataSimulationManager->PreP_Fatal) { + ShowFatalError(state, "Preprocessor condition(s) cause termination."); + } + + state.dataInputProcessing->inputProcessor->preScanReportingVariables(state); + } + + void isInputObjectUsed(EnergyPlusData &state) + { + // there is a need to know if certain object are used in the simulation + // this may not be the best place to do this but it's a start at early reading of input data + // this concept could grow to include reading all inputs prior to the start of the simulation so all data is available + // once inputs are processed, read in all getInputs. They will be read early and will not be read again so there is no duplication + + // for example, AirLoopHVAC:DOAS systems autosize on weather data, and WeatherManager processes that data + // there is no need to process that data if there are no DOAS used in the simulation + state.dataGlobal->AirLoopHVACDOASUsedInSim = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "AirLoopHVAC:DedicatedOutdoorAirSystem") > 0; + EMSManager::CheckIfAnyEMS(state); + PlantManager::CheckIfAnyPlant(state); + PlantPipingSystemsManager::CheckIfAnySlabs(state); + PlantPipingSystemsManager::CheckIfAnyBasements(state); + SetPointManager::CheckIfAnyIdealCondEntSetPoint(state); + } + +} // namespace SimulationManager + +// EXTERNAL SUBROUTINES: + +void Resimulate(EnergyPlusData &state, + bool &ResimExt, // Flag to resimulate the exterior energy use simulation + bool &ResimHB, // Flag to resimulate the heat balance simulation (including HVAC) + bool &ResimHVAC // Flag to resimulate the HVAC simulation +) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Peter Graham Ellis + // DATE WRITTEN August 2005 + // MODIFIED Sep 2011 LKL/BG - resimulate only zones needing it for Radiant systems + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine is called as necessary by the Demand Manager to resimulate some of the modules that have + // already been simulated for the current timestep. For example, if LIGHTS are demand limited, the lighting + // power is reduced which also impacts the zone internal heat gains and therefore requires that the entire + // zone heat balance must be resimulated. + + // METHODOLOGY EMPLOYED: + // If the zone heat balance must be resimulated, all the major subroutines are called sequentially in order + // to recalculate the impacts of demand limiting. This routine is called from ManageHVAC _before_ any variables + // are reported or histories are updated. This routine can be called multiple times without the overall + // simulation moving forward in time. + // If only HVAC components are demand limited, then the HVAC system is resimulated, not the entire heat balance. + // Similarly, if ony exterior lights and equipment are demand limited, it is only necessary to resimulate the + // exterior energy use, not the entire heat balance, nor the HVAC system. + // Below is the hierarchy of subroutine calls. The calls marked with an asterisk are resimulated here. + // ManageSimulation + // ManageWeather + // ManageDemand + // * ManageExteriorEnergyUse + // ManageHeatBalance + // * InitHeatBalance + // PerformSolarCalculations + // ManageSurfaceHeatBalance + // * InitSurfaceHeatBalance + // ManageInternalHeatGains + // * CalcHeatBalanceOutsideSurf + // * CalcHeatBalanceInsideSurf + // ManageAirHeatBalance + // *InitAirHeatBalance + // CalcHeatBalanceAir + // * CalcAirFlow + // * ManageRefrigeratedCaseRacks + // ManageHVAC + // * ManageZoneAirUpdates 'GET ZONE SETPOINTS' + // * ManageZoneAirUpdates 'PREDICT' + // * SimHVAC + // UpdateDataandReport + // ReportAirHeatBalance + // UpdateFinalSurfaceHeatBalance + // UpdateThermalHistories + // UpdateMoistureHistories + // ManageThermalComfort + // ReportSurfaceHeatBalance + // RecKeepHeatBalance + // ReportHeatBalance + + // Using/Aliasing + using ExteriorEnergyUse::ManageExteriorEnergyUse; + using HeatBalanceAirManager::InitAirHeatBalance; + using HeatBalanceSurfaceManager::InitSurfaceHeatBalance; + using HVACManager::SimHVAC; + using RefrigeratedCase::ManageRefrigeratedCaseRacks; + using ZoneContaminantPredictorCorrector::ManageZoneContaminanUpdates; + using ZoneTempPredictorCorrector::ManageZoneAirUpdates; + using namespace ZoneEquipmentManager; + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Real64 ZoneTempChange(0.0); // Dummy variable needed for calling ManageZoneAirUpdates + + if (ResimExt) { + ManageExteriorEnergyUse(state); + + ++state.dataDemandManager->DemandManagerExtIterations; + } + + if (ResimHB) { + // Surface simulation + InitSurfaceHeatBalance(state); + HeatBalanceSurfaceManager::CalcHeatBalanceOutsideSurf(state); + HeatBalanceSurfaceManager::CalcHeatBalanceInsideSurf(state); + + // Air simulation + InitAirHeatBalance(state); + ManageRefrigeratedCaseRacks(state); + + ++state.dataDemandManager->DemandManagerHBIterations; + ResimHVAC = true; // Make sure HVAC is resimulated too + } + + if (ResimHVAC) { + // HVAC simulation + ManageZoneAirUpdates(state, + DataHeatBalFanSys::PredictorCorrectorCtrl::GetZoneSetPoints, + ZoneTempChange, + false, + state.dataHVACGlobal->UseZoneTimeStepHistory, + 0.0); + if (state.dataContaminantBalance->Contaminant.SimulateContaminants) + ManageZoneContaminanUpdates( + state, DataHeatBalFanSys::PredictorCorrectorCtrl::GetZoneSetPoints, false, state.dataHVACGlobal->UseZoneTimeStepHistory, 0.0); + CalcAirFlowSimple( + state, 0, state.dataHeatBal->ZoneAirMassFlow.AdjustZoneMixingFlow, state.dataHeatBal->ZoneAirMassFlow.AdjustZoneInfiltrationFlow); + ManageZoneAirUpdates( + state, DataHeatBalFanSys::PredictorCorrectorCtrl::PredictStep, ZoneTempChange, false, state.dataHVACGlobal->UseZoneTimeStepHistory, 0.0); + if (state.dataContaminantBalance->Contaminant.SimulateContaminants) + ManageZoneContaminanUpdates( + state, DataHeatBalFanSys::PredictorCorrectorCtrl::PredictStep, false, state.dataHVACGlobal->UseZoneTimeStepHistory, 0.0); + SimHVAC(state); + + ++state.dataDemandManager->DemandManagerHVACIterations; + } +} + +} // namespace EnergyPlus diff --git a/src/EnergyPlus/ForceSpaceHeatBalance/ZoneTempPredictorCorrector.cc b/src/EnergyPlus/ForceSpaceHeatBalance/ZoneTempPredictorCorrector.cc new file mode 100644 index 00000000000..8cab95c97b8 --- /dev/null +++ b/src/EnergyPlus/ForceSpaceHeatBalance/ZoneTempPredictorCorrector.cc @@ -0,0 +1,7506 @@ +// EnergyPlus, Copyright (c) 1996-2022, The Board of Trustees of the University of Illinois, +// The Regents of the University of California, through Lawrence Berkeley National Laboratory +// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge +// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other +// contributors. All rights reserved. +// +// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the +// U.S. Government consequently retains certain rights. As such, the U.S. Government has been +// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, +// worldwide license in the Software to reproduce, distribute copies to the public, prepare +// derivative works, and perform publicly and display publicly, and to permit others to do so. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted +// provided that the following conditions are met: +// +// (1) Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// (2) Redistributions in binary form must reproduce the above copyright notice, this list of +// conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, +// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific prior +// written permission. +// +// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form +// without changes from the version obtained under this License, or (ii) Licensee makes a +// reference solely to the software portion of its product, Licensee must refer to the +// software as "EnergyPlus version X" software, where "X" is the version number Licensee +// obtained under this License and may not use a different name for the software. Except as +// specifically required in this Section (4), Licensee shall not use in a company name, a +// product name, in advertising, publicity, or other promotional activities any name, trade +// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly +// similar designation, without the U.S. Department of Energy's prior written consent. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +// C++ Headers +#include +#include + +// ObjexxFCL Headers +#include +#include + +// EnergyPlus Headers +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace EnergyPlus::ZoneTempPredictorCorrector { + +// MODULE INFORMATION: +// AUTHOR Russell D. Taylor +// DATE WRITTEN 1997 +// MODIFIED Aug 2001(FW): make SNLoadHeatRate public +// Nov 2010 BN(FSEC) added TemperatureAndHumidity Control +// RE-ENGINEERED July 2003 (Peter Graham Ellis) +// July 2006 (BG) added operative temp control +// February 2008 (BG) reworked zone air temp histories + +// PURPOSE OF THIS MODULE: +// This module contains routines to predict and correct zone temperatures. +// also includes zone thermostatic controlling +// Model the "Air Heat Balance" part of the the "Zone Heat Balance Method." + +// METHODOLOGY EMPLOYED: +// apply model equations for air heat balance solved for zone air temp. +// sum up values for the terms (e.g SUMHAT, SUMHA etc. ) +// "Predict" step is used to get zone loads for HVAC equipment +// "correct" step determines zone air temp with available HVAC + +enum class ZoneControlTypes +{ + Invalid = -1, + TStat = 1, + TCTStat = 2, + OTTStat = 3, + HStat = 4, + TandHStat = 5, + StagedDual = 6, + Num +}; + +enum class AdaptiveComfortModel +{ + Invalid = -1, + ADAP_NONE = 1, + ASH55_CENTRAL = 2, + ASH55_UPPER_90 = 3, + ASH55_UPPER_80 = 4, + CEN15251_CENTRAL = 5, + CEN15251_UPPER_I = 6, + CEN15251_UPPER_II = 7, + CEN15251_UPPER_III = 8, + Num +}; + +static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidControlTypes = { + "Uncontrolled", + "ThermostatSetpoint:SingleHeating", + "ThermostatSetpoint:SingleCooling", + "ThermostatSetpoint:SingleHeatingOrCooling", + "ThermostatSetpoint:DualSetpoint"}; + +static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidControlTypesUC = { + "UNCONTROLLED", + "THERMOSTATSETPOINT:SINGLEHEATING", + "THERMOSTATSETPOINT:SINGLECOOLING", + "THERMOSTATSETPOINT:SINGLEHEATINGORCOOLING", + "THERMOSTATSETPOINT:DUALSETPOINT"}; + +static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidComfortControlTypes = { + "Uncontrolled", + "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeating", + "ThermostatSetpoint:ThermalComfort:Fanger:SingleCooling", + "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeatingOrCooling", + "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint"}; + +static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidComfortControlTypesUC = { + "UNCONTROLLED", + "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:SINGLEHEATING", + "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:SINGLECOOLING", + "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:SINGLEHEATINGORCOOLING", + "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:DUALSETPOINT"}; + +Array1D_string const cZControlTypes(6, + {"ZoneControl:Thermostat", + "ZoneControl:Thermostat:ThermalComfort", + "ZoneControl:Thermostat:OperativeTemperature", + "ZoneControl:Humidistat", + "ZoneControl:Thermostat:TemperatureAndHumidity", + "ZoneControl:Thermostat:StagedDualSetpoint"}); + +Array1D_string const AdaptiveComfortModelTypes(8, + {"None", + "AdaptiveASH55CentralLine", + "AdaptiveASH5590PercentUpperLine", + "AdaptiveASH5580PercentUpperLine", + "AdaptiveCEN15251CentralLine", + "AdaptiveCEN15251CategoryIUpperLine", + "AdaptiveCEN15251CategoryIIUpperLine", + "AdaptiveCEN15251CategoryIIIUpperLine"}); + +// Functions +void ManageZoneAirUpdates(EnergyPlusData &state, + DataHeatBalFanSys::PredictorCorrectorCtrl const UpdateType, // Can be iGetZoneSetPoints, iPredictStep, iCorrectStep + Real64 &ZoneTempChange, // Temp change in zone air btw previous and current timestep + bool const ShortenTimeStepSys, + bool const UseZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step + Real64 const PriorTimeStep // the old value for timestep length is passed for possible use in interpolating +) +{ + + // SUBROUTINE INFORMATION + // AUTHOR Russ Taylor + // DATE WRITTEN September 1998 + // MODIFIED na + // RE-ENGINEERED Brent Griffith Feb. 2008, added arguments + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine predicts or corrects the zone air temperature + // depending on the simulation status and determines the correct + // temperature setpoint for each zone from the schedule manager. + + if (state.dataZoneCtrls->GetZoneAirStatsInputFlag) { + GetZoneAirSetPoints(state); + state.dataZoneCtrls->GetZoneAirStatsInputFlag = false; + } + + InitZoneAirSetPoints(state); + + switch (UpdateType) { + case DataHeatBalFanSys::PredictorCorrectorCtrl::GetZoneSetPoints: { + CalcZoneAirTempSetPoints(state); + } break; + case DataHeatBalFanSys::PredictorCorrectorCtrl::PredictStep: { + PredictSystemLoads(state, ShortenTimeStepSys, UseZoneTimeStepHistory, PriorTimeStep); + } break; + case DataHeatBalFanSys::PredictorCorrectorCtrl::CorrectStep: { + ZoneTempChange = correctZoneAirTemps(state, UseZoneTimeStepHistory); + } break; + case DataHeatBalFanSys::PredictorCorrectorCtrl::RevertZoneTimestepHistories: { + RevertZoneTimestepHistories(state); + } break; + case DataHeatBalFanSys::PredictorCorrectorCtrl::PushZoneTimestepHistories: { + PushZoneTimestepHistories(state); + } break; + case DataHeatBalFanSys::PredictorCorrectorCtrl::PushSystemTimestepHistories: { + PushSystemTimestepHistories(state); + } break; + default: + break; + } +} + +void GetZoneAirSetPoints(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Russell Taylor + // DATE WRITTEN September 1998 + // MODIFIED L.Gu, May 2006, B. Griffith June 2006 + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine gets the inputs related to thermostatic control. + + // METHODOLOGY EMPLOYED: + // Uses the status flags to trigger events. + + // Using/Aliasing + using General::CheckCreatedZoneItemName; + using General::FindNumberInList; + + using ScheduleManager::CheckScheduleValue; + using ScheduleManager::CheckScheduleValueMinMax; + using ScheduleManager::GetScheduleIndex; + using ScheduleManager::GetScheduleMaxValue; + using ScheduleManager::GetScheduleMinValue; + + // SUBROUTINE PARAMETER DEFINITIONS: + static constexpr std::string_view RoutineName("GetZoneAirSetpoints: "); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int TempControlledZoneNum; // The Splitter that you are currently loading input into + int NumAlphas; + int NumNums; + int ControlTypeNum; + int IOStat; + bool ErrorsFound(false); + bool errFlag; + int CTIndex; + int HumidControlledZoneNum; // The Humidity Controller that information is being loaded into + bool ValidScheduleControlType; + bool ValidRadFractSched; // check for if radiative fraction schedule has valid numbers + bool ValidZoneOvercoolRangeSched; // check for if Zone Overcool range schedule has valid numbers + int SchedMin; + int SchedMax; + int ActualZoneNum; + int SchedTypeIndex; + + int ComfortControlledZoneNum; // The Splitter that you are currently loading input into + int i; + int IZoneCount; + int found; + int NumStageControlledZones; // Number of staged controlled objects + int StageControlledZoneNum; // Index for staged controlled zones + + Array1D_int CTSchedMapToControlledZone; + Array1D_int CCmSchedMapToControlledZone; + int Item; + int Item1; + int ZLItem; + + struct NeededControlTypes + { + // Members 4= the four control types + uncontrolled + std::array(DataHVACGlobals::ThermostatType::Num)> MustHave = {false, false, false, false, false}; + std::array(DataHVACGlobals::ThermostatType::Num)> DidHave = {false, false, false, false, false}; + }; + + struct NeededComfortControlTypes + { + // Members 4= the four control types + uncontrolled + std::array(DataHVACGlobals::ThermostatType::Num)> MustHave = {false, false, false, false, false}; + std::array(DataHVACGlobals::ThermostatType::Num)> DidHave = {false, false, false, false, false}; + }; + + // Object Data + Array1D TStatControlTypes; + Array1D TComfortControlTypes; + + // Formats + static constexpr std::string_view Header( + "! , Sensible Heat Capacity Multiplier, Moisture Capacity Multiplier, Carbon " + "Dioxide Capacity Multiplier, Generic Contaminant Capacity Multiplier\n"); + static constexpr std::string_view Format_701("Zone Volume Capacitance Multiplier,{:8.3F} ,{:8.3F},{:8.3F},{:8.3F}\n"); + + auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; + auto &TStatObjects = state.dataZoneCtrls->TStatObjects; + auto &NumTStatStatements = state.dataZoneCtrls->NumTStatStatements; + auto &NumTempControlledZones = state.dataZoneCtrls->NumTempControlledZones; + auto &Zone = state.dataHeatBal->Zone; + auto &ZoneList = state.dataHeatBal->ZoneList; + auto &TempControlledZone = state.dataZoneCtrls->TempControlledZone; + auto &HumidityControlZone = state.dataZoneCtrls->HumidityControlZone; + auto &ComfortTStatObjects = state.dataZoneCtrls->ComfortTStatObjects; + auto &ComfortControlledZone = state.dataZoneCtrls->ComfortControlledZone; + auto &NumOfZones = state.dataGlobal->NumOfZones; + auto &StageControlledZone = state.dataZoneCtrls->StageControlledZone; + auto &SetPointSingleHeating = state.dataZoneTempPredictorCorrector->SetPointSingleHeating; + auto &SetPointSingleCooling = state.dataZoneTempPredictorCorrector->SetPointSingleCooling; + auto &cAlphaArgs = state.dataIPShortCut->cAlphaArgs; + auto &rNumericArgs = state.dataIPShortCut->rNumericArgs; + auto &lNumericFieldBlanks = state.dataIPShortCut->lNumericFieldBlanks; + auto &lAlphaFieldBlanks = state.dataIPShortCut->lAlphaFieldBlanks; + auto &cAlphaFieldNames = state.dataIPShortCut->cAlphaFieldNames; + auto &cNumericFieldNames = state.dataIPShortCut->cNumericFieldNames; + auto &inputProcessor = state.dataInputProcessing->inputProcessor; + auto &SetPointDualHeatCool = state.dataZoneTempPredictorCorrector->SetPointDualHeatCool; + + cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::TStat)); + NumTStatStatements = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + TStatObjects.allocate(NumTStatStatements); + + // Pre-scan for use of Zone lists in TStat statements (i.e. Global application of TStat) + NumTempControlledZones = 0; + for (Item = 1; Item <= NumTStatStatements; ++Item) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Item, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + + TStatObjects(Item).Name = cAlphaArgs(1); + Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + ZLItem = 0; + if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); + if (Item1 > 0) { + TStatObjects(Item).TempControlledZoneStartPtr = NumTempControlledZones + 1; + ++NumTempControlledZones; + TStatObjects(Item).NumOfZones = 1; + TStatObjects(Item).ZoneListActive = false; + TStatObjects(Item).ZoneOrZoneListPtr = Item1; + } else if (ZLItem > 0) { + TStatObjects(Item).TempControlledZoneStartPtr = NumTempControlledZones + 1; + NumTempControlledZones += ZoneList(ZLItem).NumOfZones; + TStatObjects(Item).NumOfZones = ZoneList(ZLItem).NumOfZones; + TStatObjects(Item).ZoneListActive = true; + TStatObjects(Item).ZoneOrZoneListPtr = ZLItem; + } else { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + } + + if (ErrorsFound) { + ShowSevereError(state, "GetZoneAirSetpoints: Errors with invalid names in " + cCurrentModuleObject + " objects."); + ShowContinueError(state, "...These will not be read in. Other errors may occur."); + NumTempControlledZones = 0; + } + + if (NumTempControlledZones > 0) { + TempControlledZone.allocate(NumTempControlledZones); + TStatControlTypes.allocate(NumTempControlledZones); // Number of set point types + CTSchedMapToControlledZone.dimension(NumTempControlledZones, 0); + + TempControlledZoneNum = 0; + state.dataZoneTempPredictorCorrector->NumOnOffCtrZone = 0; + for (Item = 1; Item <= NumTStatStatements; ++Item) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Item, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + for (Item1 = 1; Item1 <= TStatObjects(Item).NumOfZones; ++Item1) { + ++TempControlledZoneNum; + if (TStatObjects(Item).ZoneListActive) { + cAlphaArgs(2) = Zone(ZoneList(TStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name; + } + int ZoneAssigned = UtilityRoutines::FindItemInList( + cAlphaArgs(2), TempControlledZone, &DataZoneControls::ZoneTempControls::ZoneName, TempControlledZoneNum - 1); + if (ZoneAssigned == 0) { + TempControlledZone(TempControlledZoneNum).ZoneName = cAlphaArgs(2); + TempControlledZone(TempControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + if (TempControlledZone(TempControlledZoneNum).ActualZoneNum == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" not found."); + ErrorsFound = true; + } else { + Zone(TempControlledZone(TempControlledZoneNum).ActualZoneNum).TempControlledZoneIndex = TempControlledZoneNum; + } + } else { + TempControlledZone(TempControlledZoneNum).ZoneName = cAlphaArgs(2); // for continuity + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" zone previously assigned."); + ShowContinueError(state, "...Zone was previously assigned to Thermostat=\"" + TempControlledZone(ZoneAssigned).Name + "\"."); + ErrorsFound = true; + continue; + } + + if (!TStatObjects(Item).ZoneListActive) { + TempControlledZone(TempControlledZoneNum).Name = cAlphaArgs(1); + } else { + CheckCreatedZoneItemName(state, + RoutineName, + cCurrentModuleObject, + Zone(ZoneList(TStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name, + ZoneList(TStatObjects(Item).ZoneOrZoneListPtr).MaxZoneNameLength, + TStatObjects(Item).Name, + TempControlledZone, + TempControlledZoneNum - 1, + TempControlledZone(TempControlledZoneNum).Name, + errFlag); + if (errFlag) ErrorsFound = true; + } + + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName = cAlphaArgs(3); + TempControlledZone(TempControlledZoneNum).CTSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); + if (Item1 == 1) { // only show error on first of several if zone list + if (TempControlledZone(TempControlledZoneNum).CTSchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + + "\" not found."); + ErrorsFound = true; + } else { + // Check validity of control types. + ValidScheduleControlType = + CheckScheduleValueMinMax(state, TempControlledZone(TempControlledZoneNum).CTSchedIndex, ">=", 0.0, "<=", 4.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid range " + cAlphaFieldNames(2) + "=\"" + + cAlphaArgs(2) + "\""); + ShowContinueError(state, "..contains values outside of range [0,4]."); + ErrorsFound = true; + } + } + } + + if (lAlphaFieldBlanks(7)) { + NumAlphas = 5; + } else if (lAlphaFieldBlanks(9)) { + NumAlphas = 7; + } else if (lAlphaFieldBlanks(11)) { + NumAlphas = 9; + } + + TempControlledZone(TempControlledZoneNum).NumControlTypes = nint((NumAlphas - 3.0) / 2.0); + TempControlledZone(TempControlledZoneNum).ControlType.allocate(TempControlledZone(TempControlledZoneNum).NumControlTypes); + TempControlledZone(TempControlledZoneNum).ControlTypeName.allocate(TempControlledZone(TempControlledZoneNum).NumControlTypes); + TempControlledZone(TempControlledZoneNum).ControlTypeEnum.allocate(TempControlledZone(TempControlledZoneNum).NumControlTypes); + + for (ControlTypeNum = 1; ControlTypeNum <= TempControlledZone(TempControlledZoneNum).NumControlTypes; ++ControlTypeNum) { + + TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 3)); + TempControlledZone(TempControlledZoneNum).ControlTypeName(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum + 3)); + + if (!TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum).empty()) { + auto ctrlType = static_cast( + getEnumerationValue(ValidControlTypesUC, TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum))); + TempControlledZone(TempControlledZoneNum).ControlTypeEnum(ControlTypeNum) = ctrlType; + if (ctrlType == DataHVACGlobals::ThermostatType::Invalid) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + + cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 3)) + "=\"" + + cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 3)) + "\""); + ErrorsFound = true; + } + } else { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + + cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 3)) + "=\"\""); + ErrorsFound = true; + } + } + if (NumNums > 0) { + if (rNumericArgs(1) >= 0.0) { + TempControlledZone(TempControlledZoneNum).DeltaTCutSet = rNumericArgs(1); + if (rNumericArgs(1) > 0.0) state.dataZoneTempPredictorCorrector->NumOnOffCtrZone++; + } else { + ShowSevereError( + state, + format("{}=\"{} invalid {}=[{:.0T}].", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(1), rNumericArgs(1))); + ShowContinueError(state, "..Allowable values must be greater or equal to 0"); + ErrorsFound = true; + } + } + if (TempControlledZone(TempControlledZoneNum).DeltaTCutSet > 0.0) { + for (ControlTypeNum = 1; ControlTypeNum <= TempControlledZone(TempControlledZoneNum).NumControlTypes; ++ControlTypeNum) { + if (UtilityRoutines::SameString(TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum), + "ThermostatSetpoint:SingleHeatingOrCooling")) { + ShowWarningError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + + ": The choice of Temperature Difference Between Cutout And Setpoint will not be applied to " + "ThermostatSetpoint:SingleHeatingOrCooling."); + } + } + } + } + } // NumTStatStatements + } // Check on number of TempControlledZones + + cCurrentModuleObject = ValidControlTypesUC[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)]; + state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls > 0) + SetPointSingleHeating.allocate(state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &singleHtgSetpoint = SetPointSingleHeating(idx); + singleHtgSetpoint.Name = cAlphaArgs(1); + singleHtgSetpoint.TempSchedName = cAlphaArgs(2); + singleHtgSetpoint.TempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (singleHtgSetpoint.TempSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + + } // SingleTempHeatingControlNum + + cCurrentModuleObject = ValidControlTypesUC[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)]; + state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls > 0) + SetPointSingleCooling.allocate(state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &singleClgSetpoint = SetPointSingleCooling(idx); + singleClgSetpoint.Name = cAlphaArgs(1); + singleClgSetpoint.TempSchedName = cAlphaArgs(2); + singleClgSetpoint.TempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (singleClgSetpoint.TempSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + + } // SingleTempCoolingControlNum + + cCurrentModuleObject = ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)]; + state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls > 0) + state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool.allocate(state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + auto &singleHeatCoolSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool(idx); + singleHeatCoolSetpoint.Name = cAlphaArgs(1); + singleHeatCoolSetpoint.TempSchedName = cAlphaArgs(2); + singleHeatCoolSetpoint.TempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (singleHeatCoolSetpoint.TempSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + + } // SingleTempHeatCoolControlNum + + cCurrentModuleObject = ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)]; + state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls > 0) + SetPointDualHeatCool.allocate(state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &dualHeatCoolSetpoint = SetPointDualHeatCool(idx); + dualHeatCoolSetpoint.Name = cAlphaArgs(1); + dualHeatCoolSetpoint.HeatTempSetptSchedName = cAlphaArgs(2); + dualHeatCoolSetpoint.HeatTempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (dualHeatCoolSetpoint.HeatTempSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + dualHeatCoolSetpoint.CoolTempSetptSchedName = cAlphaArgs(3); + dualHeatCoolSetpoint.CoolTempSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); + if (dualHeatCoolSetpoint.CoolTempSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" not found."); + ErrorsFound = true; + } + + } // DualTempHeatCoolControlNum + + // Finish filling in Schedule pointing indexes + int setPointObjectArrayIndex; + for (TempControlledZoneNum = 1; TempControlledZoneNum <= NumTempControlledZones; ++TempControlledZoneNum) { + for (int ct = 1; ct <= state.dataZoneCtrls->TempControlledZone(TempControlledZoneNum).NumControlTypes; ct++) { + switch (state.dataZoneCtrls->TempControlledZone(TempControlledZoneNum).ControlTypeEnum(ct)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + setPointObjectArrayIndex = + UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), SetPointSingleHeating); + TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatSetPoint = + state.dataZoneTempPredictorCorrector->SetPointSingleHeating(setPointObjectArrayIndex).TempSchedIndex; + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + setPointObjectArrayIndex = + UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), SetPointSingleCooling); + TempControlledZone(TempControlledZoneNum).SchIndx_SingleCoolSetPoint = + state.dataZoneTempPredictorCorrector->SetPointSingleCooling(setPointObjectArrayIndex).TempSchedIndex; + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + setPointObjectArrayIndex = UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), + state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool); + TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatCoolSetPoint = + state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool(setPointObjectArrayIndex).TempSchedIndex; + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + setPointObjectArrayIndex = UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), + state.dataZoneTempPredictorCorrector->SetPointDualHeatCool); + TempControlledZone(TempControlledZoneNum).SchIndx_DualSetPointWDeadBandHeat = + state.dataZoneTempPredictorCorrector->SetPointDualHeatCool(setPointObjectArrayIndex).HeatTempSchedIndex; + TempControlledZone(TempControlledZoneNum).SchIndx_DualSetPointWDeadBandCool = + state.dataZoneTempPredictorCorrector->SetPointDualHeatCool(setPointObjectArrayIndex).CoolTempSchedIndex; + break; + default: + assert(false); + } + } + } + + // Now, Check the schedule values/indices for validity + + for (TempControlledZoneNum = 1; TempControlledZoneNum <= NumTempControlledZones; ++TempControlledZoneNum) { + + ActualZoneNum = TempControlledZone(TempControlledZoneNum).ActualZoneNum; + CTIndex = TempControlledZone(TempControlledZoneNum).CTSchedIndex; + if (CTIndex == 0) continue; // error will be caught elsewhere + SchedMin = GetScheduleMinValue(state, CTIndex); + SchedMax = GetScheduleMaxValue(state, CTIndex); + + if (SchedMin == 0 && SchedMax == 0) { + if (FindNumberInList(CTIndex, CTSchedMapToControlledZone, NumTempControlledZones) == 0) { + ShowSevereError(state, "Control Type Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, "..specifies control type 0 for all entries."); + ShowContinueError(state, "All zones using this Control Type Schedule have no heating or cooling available."); + } + CTSchedMapToControlledZone(TempControlledZoneNum) = CTIndex; + } + + for (ControlTypeNum = SchedMin; ControlTypeNum <= SchedMax; ++ControlTypeNum) { + + int TempIndex = 0; + switch (static_cast(ControlTypeNum)) { + case DataHVACGlobals::ThermostatType::Uncontrolled: + break; + case DataHVACGlobals::ThermostatType::SingleHeating: + TempIndex = TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatSetPoint; + if (TempIndex == 0) { + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeating))) { + ShowSevereError(state, "Control Type Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies control type 1 ({}) as the control type. Not valid for this zone.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + TempIndex = TempControlledZone(TempControlledZoneNum).SchIndx_SingleCoolSetPoint; + if (TempIndex == 0) { + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleCooling))) { + ShowSevereError(state, "Control Type Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies control type 2 ({}) as the control type. Not valid for this zone.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + TempIndex = TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatCoolSetPoint; + if (TempIndex == 0) { + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool))) { + ShowSevereError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies control type 3 ({}) as the control type. Not valid for this zone.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + TempIndex = TempControlledZone(TempControlledZoneNum) + .SchIndx_DualSetPointWDeadBandHeat; // using "Heat" as a sentinel that dualsetpoint is on this zone control object + if (TempIndex == 0) { + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand))) { + ShowSevereError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies control type 4 ({}) as the control type. Not valid for this zone.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + default: + ShowSevereError(state, + format("GetZoneAirSetpoints: Illegal control type for Zone={}, Found value={}, in Schedule={}", + Zone(ActualZoneNum).Name, + ControlTypeNum, + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName)); + ShowContinueError(state, "..valid range values are [0,4]."); + ErrorsFound = true; + } + } + } + + for (TempControlledZoneNum = 1; TempControlledZoneNum <= NumTempControlledZones; ++TempControlledZoneNum) { + + ActualZoneNum = TempControlledZone(TempControlledZoneNum).ActualZoneNum; + CTIndex = TempControlledZone(TempControlledZoneNum).CTSchedIndex; + if (CTIndex == 0) continue; // error caught elsewhere -- would just be confusing here + + for (ControlTypeNum = 1; ControlTypeNum <= 4; ++ControlTypeNum) { + if (TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum] && TStatControlTypes(TempControlledZoneNum).DidHave[ControlTypeNum]) + continue; + + switch (static_cast(ControlTypeNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 1 ({}) but does not.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 2 ({}) but does not.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 3 ({}) but does not.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 4 ({}) but does not.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + break; + default: + break; + } + } + } + + if (allocated(TStatControlTypes)) TStatControlTypes.deallocate(); + // This starts the Humidity Control Get Input section + cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::HStat)); + state.dataZoneCtrls->NumHumidityControlZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneCtrls->NumHumidityControlZones > 0) { + HumidityControlZone.allocate(state.dataZoneCtrls->NumHumidityControlZones); + state.dataZoneTempPredictorCorrector->HumidityControlZoneUniqueNames.reserve( + static_cast(state.dataZoneCtrls->NumHumidityControlZones)); + } + + for (HumidControlledZoneNum = 1; HumidControlledZoneNum <= state.dataZoneCtrls->NumHumidityControlZones; ++HumidControlledZoneNum) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + HumidControlledZoneNum, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + + HumidityControlZone(HumidControlledZoneNum).ControlName = cAlphaArgs(1); + GlobalNames::IntraObjUniquenessCheck(state, + cAlphaArgs(2), + cCurrentModuleObject, + cAlphaFieldNames(2), + state.dataZoneTempPredictorCorrector->HumidityControlZoneUniqueNames, + ErrorsFound); + + HumidityControlZone(HumidControlledZoneNum).ZoneName = cAlphaArgs(2); + HumidityControlZone(HumidControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItem(cAlphaArgs(2), Zone); + if (HumidityControlZone(HumidControlledZoneNum).ActualZoneNum == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } else { + state.dataHeatBal->Zone(HumidityControlZone(HumidControlledZoneNum).ActualZoneNum).humidityControlZoneIndex = HumidControlledZoneNum; + } + HumidityControlZone(HumidControlledZoneNum).HumidifyingSched = cAlphaArgs(3); + HumidityControlZone(HumidControlledZoneNum).HumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); + if (HumidityControlZone(HumidControlledZoneNum).HumidifyingSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" not found."); + ErrorsFound = true; + } + if (NumAlphas == 4) { + HumidityControlZone(HumidControlledZoneNum).DehumidifyingSched = cAlphaArgs(4); + HumidityControlZone(HumidControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(4)); + if (HumidityControlZone(HumidControlledZoneNum).DehumidifyingSchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + + "\" not found."); + ErrorsFound = true; + } + } else { + HumidityControlZone(HumidControlledZoneNum).DehumidifyingSched = cAlphaArgs(3); + HumidityControlZone(HumidControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); + } + + } // HumidControlledZoneNum + + // Start to read Thermal comfort control objects + cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::TCTStat)); + state.dataZoneCtrls->NumComfortTStatStatements = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + ComfortTStatObjects.allocate(state.dataZoneCtrls->NumComfortTStatStatements); + + // Pre-scan for use of Zone lists in TStat statements (i.e. Global application of TStat) + state.dataZoneCtrls->NumComfortControlledZones = 0; + errFlag = false; + for (Item = 1; Item <= state.dataZoneCtrls->NumComfortTStatStatements; ++Item) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Item, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + + Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + ZLItem = 0; + if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); + ComfortTStatObjects(Item).Name = cAlphaArgs(1); + if (Item1 > 0) { + ComfortTStatObjects(Item).ComfortControlledZoneStartPtr = state.dataZoneCtrls->NumComfortControlledZones + 1; + ++state.dataZoneCtrls->NumComfortControlledZones; + ComfortTStatObjects(Item).NumOfZones = 1; + ComfortTStatObjects(Item).ZoneListActive = false; + ComfortTStatObjects(Item).ZoneOrZoneListPtr = Item1; + } else if (ZLItem > 0) { + ComfortTStatObjects(Item).ComfortControlledZoneStartPtr = state.dataZoneCtrls->NumComfortControlledZones + 1; + state.dataZoneCtrls->NumComfortControlledZones += ZoneList(ZLItem).NumOfZones; + ComfortTStatObjects(Item).NumOfZones = ZoneList(ZLItem).NumOfZones; + ComfortTStatObjects(Item).ZoneListActive = true; + ComfortTStatObjects(Item).ZoneOrZoneListPtr = ZLItem; + } else { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + errFlag = true; + ErrorsFound = true; + } + } + + if (errFlag) { + ShowSevereError(state, "GetZoneAirSetpoints: Errors with invalid names in " + cCurrentModuleObject + " objects."); + ShowContinueError(state, "...These will not be read in. Other errors may occur."); + state.dataZoneCtrls->NumComfortControlledZones = 0; + } + + if (state.dataZoneCtrls->NumComfortControlledZones > 0) { + ComfortControlledZone.allocate(state.dataZoneCtrls->NumComfortControlledZones); + TComfortControlTypes.allocate(state.dataZoneCtrls->NumComfortControlledZones); // Number of set point types + CCmSchedMapToControlledZone.dimension(state.dataZoneCtrls->NumComfortControlledZones, 0); + + ComfortControlledZoneNum = 0; + for (Item = 1; Item <= state.dataZoneCtrls->NumComfortTStatStatements; ++Item) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Item, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + for (Item1 = 1; Item1 <= ComfortTStatObjects(Item).NumOfZones; ++Item1) { + ++ComfortControlledZoneNum; + if (ComfortTStatObjects(Item).ZoneListActive) { + cAlphaArgs(2) = state.dataHeatBal->Zone(ZoneList(ComfortTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name; + } + int ZoneAssigned = UtilityRoutines::FindItemInList( + cAlphaArgs(2), ComfortControlledZone, &DataZoneControls::ZoneComfortControls::ZoneName, ComfortControlledZoneNum - 1); + if (ZoneAssigned == 0) { + ComfortControlledZone(ComfortControlledZoneNum).ZoneName = cAlphaArgs(2); + ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" not found."); + ErrorsFound = true; + } + } else { + ComfortControlledZone(ComfortControlledZoneNum).ZoneName = cAlphaArgs(2); // for continuity + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" zone previously assigned."); + ShowContinueError(state, "...Zone was previously assigned to Thermostat=\"" + ComfortControlledZone(ZoneAssigned).Name + "\"."); + ErrorsFound = true; + continue; + } + + if (!ComfortTStatObjects(Item).ZoneListActive) { + ComfortControlledZone(ComfortControlledZoneNum).Name = cAlphaArgs(1); + } else { + ComfortControlledZone(ComfortControlledZoneNum).Name = + state.dataHeatBal->Zone(ZoneList(ComfortTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name + ' ' + + ComfortTStatObjects(Item).Name; + } + + // Read Fields A3 and A4 for averaging method + IZoneCount = 0; + for (i = 1; i <= state.dataHeatBal->TotPeople; ++i) { + if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == state.dataHeatBal->People(i).ZonePtr) { + ++IZoneCount; + } + } + // Could not find a people object for this particular zone + if (IZoneCount == 0 && ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum > 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " no PEOPLE in " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" - cannot use Comfort Control."); + ErrorsFound = true; + } + ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::NO; + if (IZoneCount > 1) { + ComfortControlledZone(ComfortControlledZoneNum).AverageMethodName = cAlphaArgs(3); + if (UtilityRoutines::SameString(cAlphaArgs(3), "SpecificObject")) { + ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::SPE; + } + if (UtilityRoutines::SameString(cAlphaArgs(3), "ObjectAverage")) { + ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::OBJ; + } + if (UtilityRoutines::SameString(cAlphaArgs(3), "PeopleAverage")) { + ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::PEO; + } + if (ComfortControlledZone(ComfortControlledZoneNum).AverageMethod == DataZoneControls::AverageMethod::NO) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); + ShowContinueError(state, "Allowed keys are SpecificObject, ObjectAverage, or PeopleAverage"); + ErrorsFound = true; + } + if (ComfortControlledZone(ComfortControlledZoneNum).AverageMethod == DataZoneControls::AverageMethod::SPE) { + ComfortControlledZone(ComfortControlledZoneNum).AverageObjectName = cAlphaArgs(4); + if (UtilityRoutines::FindItem(cAlphaArgs(4), state.dataHeatBal->People) == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + + "\"."); + ErrorsFound = true; + } else { + ComfortControlledZone(ComfortControlledZoneNum).SpecificObjectNum = + UtilityRoutines::FindItem(cAlphaArgs(4), state.dataHeatBal->People); + } + } + } else { + for (i = 1; i <= state.dataHeatBal->TotPeople; ++i) { + if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == state.dataHeatBal->People(i).ZonePtr) break; + } + ComfortControlledZone(ComfortControlledZoneNum).SpecificObjectNum = i; + } + // Check values used for thermal comfort calculation + for (i = 1; i <= state.dataHeatBal->TotPeople; ++i) { + if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == state.dataHeatBal->People(i).ZonePtr) { + // Check activity level + if (state.dataHeatBal->People(i).ActivityLevelPtr > 0) { + ValidScheduleControlType = + CheckScheduleValueMinMax(state, state.dataHeatBal->People(i).ActivityLevelPtr, ">=", 72.0, "<=", 909.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + "GetPeople Activity Level: Invalid activity level values entered for thermal comfort calculation"); + ShowContinueError(state, "Outside of range values [72,909], Reference object=" + state.dataHeatBal->People(i).Name); + ErrorsFound = true; + } + } else { + ShowSevereError(state, + "GetPeople Activity Level: Activity level schedule is not found=" + state.dataHeatBal->People(i).Name); + ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); + ErrorsFound = true; + } + // Check Work Efficiency + if (state.dataHeatBal->People(i).WorkEffPtr > 0) { + ValidScheduleControlType = CheckScheduleValueMinMax(state, state.dataHeatBal->People(i).WorkEffPtr, ">=", 0.0, "<=", 1.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + "GetPeople work efficiency: Invalid work efficiency values entered for thermal comfort calculation"); + ShowContinueError(state, "Outside of range values [0,1], Reference object=" + state.dataHeatBal->People(i).Name); + ErrorsFound = true; + } + } else { + ShowSevereError(state, + "GetPeople work efficiency: Work efficiency schedule is not found=" + state.dataHeatBal->People(i).Name); + ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); + ErrorsFound = true; + } + // Check Clothing Insulation + if (state.dataHeatBal->People(i).ClothingPtr > 0) { + ValidScheduleControlType = CheckScheduleValueMinMax(state, state.dataHeatBal->People(i).ClothingPtr, ">", 0.0, "<=", 2.0); + if (!ValidScheduleControlType) { + ShowSevereError( + state, + "GetPeople Clothing Insulation: Invalid Clothing Insulation values entered for thermal comfort calculation"); + ShowContinueError(state, "Outside of range values [0.0,2.0], Reference object=" + state.dataHeatBal->People(i).Name); + ErrorsFound = true; + } + } else { + ShowSevereError(state, + "GetPeople Clothing Insulation: Clothing Insulation schedule is not found=" + + state.dataHeatBal->People(i).Name); + ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); + ErrorsFound = true; + } + // Check Air velocity + if (state.dataHeatBal->People(i).AirVelocityPtr <= 0) { + ShowSevereError(state, "GetPeople Air Velocity: Air velocity schedule is not found=" + state.dataHeatBal->People(i).Name); + ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); + ErrorsFound = true; + } + } + } + + // Read Max and Min temperature setpoint + if (NumNums > 0) { + ComfortControlledZone(ComfortControlledZoneNum).TdbMinSetPoint = rNumericArgs(1); + if (rNumericArgs(1) > 50 || rNumericArgs(1) < 0) { + ShowSevereError( + state, + format("{}=\"{} invalid {}=[{:.0T}].", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(1), rNumericArgs(1))); + ShowContinueError(state, "..Allowable values must be between 0 C and 50 C"); + ErrorsFound = true; + } + } + if (NumNums > 1) { + ComfortControlledZone(ComfortControlledZoneNum).TdbMaxSetPoint = rNumericArgs(2); + if (rNumericArgs(2) > 50 || rNumericArgs(2) < 0) { + ShowSevereError( + state, + format("{}=\"{} invalid {}=[{:.0T}].", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(2), rNumericArgs(2))); + ShowContinueError(state, "..Allowable values must be between 0 C and 50 C"); + ErrorsFound = true; + } + } + // Ensure MaxTemp >= MinTemp + if (ComfortControlledZone(ComfortControlledZoneNum).TdbMinSetPoint > ComfortControlledZone(ComfortControlledZoneNum).TdbMaxSetPoint) { + ShowSevereError(state, cCurrentModuleObject + "=\"" + cAlphaArgs(1)); + ShowContinueError(state, ".." + cNumericFieldNames(1) + " > " + cNumericFieldNames(2)); + ShowContinueError(state, format("..[{:.0T}] > [{:.0T}].", rNumericArgs(1), rNumericArgs(2))); + ErrorsFound = true; + } + // If MaxTemp = MinTemp, no thermal comfort control + if (ComfortControlledZone(ComfortControlledZoneNum).TdbMinSetPoint == + ComfortControlledZone(ComfortControlledZoneNum).TdbMaxSetPoint) { + ShowSevereError(state, cCurrentModuleObject + "=\"" + cAlphaArgs(1)); + ShowContinueError(state, ".." + cNumericFieldNames(1) + " = " + cNumericFieldNames(2)); + ShowContinueError(state, "The zone will be controlled using this dry-bulb temperature setpoint."); + } + // read Thermal comfort type schedule name + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName = cAlphaArgs(5); + ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex = GetScheduleIndex(state, cAlphaArgs(5)); + if (ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + + "\" not found."); + ErrorsFound = true; + } else { + // Check validity of control types. + ValidScheduleControlType = + CheckScheduleValueMinMax(state, ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex, ">=", 0.0, "<=", 4.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid range " + cAlphaFieldNames(5) + "=\"" + + cAlphaArgs(5) + "\""); + ShowContinueError(state, "..contains values outside of range [0,4]."); + ErrorsFound = true; + } + } + ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes = nint((NumAlphas - 5.0) / 2.0); + ComfortControlledZone(ComfortControlledZoneNum).ControlType.allocate(ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + ComfortControlledZone(ComfortControlledZoneNum) + .ControlTypeName.allocate(ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + ComfortControlledZone(ComfortControlledZoneNum) + .ControlTypeSchIndx.allocate(ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + + for (ControlTypeNum = 1; ControlTypeNum <= ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes; ++ControlTypeNum) { + ComfortControlledZone(ComfortControlledZoneNum).ControlType(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 5)); + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum + 5)); + if (ComfortControlledZone(ComfortControlledZoneNum).ControlType(ControlTypeNum) != "") { + CTIndex = getEnumerationValue( + ValidComfortControlTypesUC, + UtilityRoutines::MakeUPPERCase(ComfortControlledZone(ComfortControlledZoneNum).ControlType(ControlTypeNum))); + if (CTIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + + cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 5)) + "=\"" + + cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 5)) + "\""); + ErrorsFound = true; + } + if (CTIndex > 4) { // For Fanger control only for the time being + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + + cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 5)) + "=\"" + + cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 5)) + "\""); + ShowContinueError(state, "..Fanger is the only valid model."); + ErrorsFound = true; + } + } else { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + + cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 5)) + "=\"\""); + ErrorsFound = true; + } + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ControlTypeNum) = 0; + } + } + } // NumComfortTStatStatements + } + // End of Thermal comfort control reading and checking + + cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)]; + state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls > 0) + state.dataZoneTempPredictorCorrector->SetPointSingleHeatingFanger.allocate( + state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &singleSetpointHtgFanger = state.dataZoneTempPredictorCorrector->SetPointSingleHeatingFanger(idx); + singleSetpointHtgFanger.Name = cAlphaArgs(1); + singleSetpointHtgFanger.PMVSchedName = cAlphaArgs(2); + singleSetpointHtgFanger.PMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (singleSetpointHtgFanger.PMVSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } else { + ValidScheduleControlType = CheckScheduleValueMinMax(state, singleSetpointHtgFanger.PMVSchedIndex, ">=", -3.0, "<=", 3.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + + cAlphaArgs(2) + "\" entered."); + ShowContinueError(state, "..Values outside of range [-3,+3]."); + ErrorsFound = true; + } + } + } // SingleFangerHeatingControlNum + + cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)]; + state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls > 0) { + state.dataZoneTempPredictorCorrector->SetPointSingleCoolingFanger.allocate( + state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls); + } + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &singleSetpointClgFanger = state.dataZoneTempPredictorCorrector->SetPointSingleCoolingFanger(idx); + singleSetpointClgFanger.Name = cAlphaArgs(1); + singleSetpointClgFanger.PMVSchedName = cAlphaArgs(2); + singleSetpointClgFanger.PMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (singleSetpointClgFanger.PMVSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } else { + ValidScheduleControlType = CheckScheduleValueMinMax(state, singleSetpointClgFanger.PMVSchedIndex, ">=", -3.0, "<=", 3.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + + cAlphaArgs(2) + "\" entered."); + ShowContinueError(state, "..Values outside of range [-3,+3]."); + ErrorsFound = true; + } + } + + } // SingleFangerCoolingControlNum + + cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)]; + state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls > 0) + state.dataZoneTempPredictorCorrector->SetPointSingleHeatCoolFanger.allocate( + state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &singleSetpointHeatCoolFanger = state.dataZoneTempPredictorCorrector->SetPointSingleHeatCoolFanger(idx); + singleSetpointHeatCoolFanger.Name = cAlphaArgs(1); + singleSetpointHeatCoolFanger.PMVSchedName = cAlphaArgs(2); + singleSetpointHeatCoolFanger.PMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (singleSetpointHeatCoolFanger.PMVSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } else { + ValidScheduleControlType = CheckScheduleValueMinMax(state, singleSetpointHeatCoolFanger.PMVSchedIndex, ">=", -3.0, "<=", 3.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + + cAlphaArgs(2) + "\" entered."); + ShowContinueError(state, "..Values outside of range [-3,+3]."); + ErrorsFound = true; + } + } + + } // SingleFangerHeatCoolControlNum + + cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)]; + state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls > 0) + state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger.allocate( + state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &dualSetpointHeatCoolFanger = state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(idx); + dualSetpointHeatCoolFanger.Name = cAlphaArgs(1); + dualSetpointHeatCoolFanger.HeatPMVSetptSchedName = cAlphaArgs(2); + dualSetpointHeatCoolFanger.HeatPMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (dualSetpointHeatCoolFanger.HeatPMVSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + dualSetpointHeatCoolFanger.CoolPMVSetptSchedName = cAlphaArgs(3); + dualSetpointHeatCoolFanger.CoolPMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); + if (dualSetpointHeatCoolFanger.CoolPMVSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" not found."); + ErrorsFound = true; + } else { + ValidScheduleControlType = CheckScheduleValueMinMax(state, dualSetpointHeatCoolFanger.HeatPMVSchedIndex, ">=", -3.0, "<=", 3.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + + cAlphaArgs(2) + "\" entered."); + ShowContinueError(state, "..Values outside of range [-3,+3]."); + ErrorsFound = true; + } + ValidScheduleControlType = CheckScheduleValueMinMax(state, dualSetpointHeatCoolFanger.CoolPMVSchedIndex, ">=", -3.0, "<=", 3.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(3) + "=\"" + + cAlphaArgs(3) + "\" entered."); + ShowContinueError(state, "..Values outside of range [-3,+3]."); + ErrorsFound = true; + } + } + + } // DualFangerHeatCoolControlNum + + // Finish filling in Schedule pointing indexes for Thermal Comfort Control + for (ComfortControlledZoneNum = 1; ComfortControlledZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++ComfortControlledZoneNum) { + + int ComfortIndex = UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)], + ComfortControlledZone(ComfortControlledZoneNum).ControlType, + ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeating = ComfortIndex; + if (ComfortIndex > 0) { + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = + UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), + state.dataZoneTempPredictorCorrector->SetPointSingleHeatingFanger); + TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)] = true; + } + + ComfortIndex = UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)], + ComfortControlledZone(ComfortControlledZoneNum).ControlType, + ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleCooling = ComfortIndex; + if (ComfortIndex > 0) { + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = + UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), + state.dataZoneTempPredictorCorrector->SetPointSingleCoolingFanger); + TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)] = true; + } + + ComfortIndex = UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)], + ComfortControlledZone(ComfortControlledZoneNum).ControlType, + ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeatCool = ComfortIndex; + if (ComfortIndex > 0) { + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = + UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), + state.dataZoneTempPredictorCorrector->SetPointSingleHeatCoolFanger); + TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)] = true; + } + + ComfortIndex = + UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)], + ComfortControlledZone(ComfortControlledZoneNum).ControlType, + ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + ComfortControlledZone(ComfortControlledZoneNum).SchIndx_DualSetPointWithDeadBand = ComfortIndex; + if (ComfortIndex > 0) { + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = + UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), + state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger); + TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)] = + true; + } + } + + // Now, Check the schedule values/indices for validity for Thermal Comfort Control + + for (ComfortControlledZoneNum = 1; ComfortControlledZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++ComfortControlledZoneNum) { + + ActualZoneNum = ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum; + CTIndex = ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex; + if (CTIndex == 0) continue; // error will be caught elsewhere + SchedMin = GetScheduleMinValue(state, CTIndex); + SchedMax = GetScheduleMaxValue(state, CTIndex); + + if (SchedMin == 0 && SchedMax == 0) { + if (FindNumberInList(CTIndex, CCmSchedMapToControlledZone, state.dataZoneCtrls->NumComfortControlledZones) == 0) { + ShowWarningError(state, "Control Type Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, "..specifies control type 0 for all entries."); + ShowContinueError(state, "All zones using this Control Type Schedule have no thermal comfort control."); + } + CCmSchedMapToControlledZone(ComfortControlledZoneNum) = CTIndex; + } + + for (ControlTypeNum = SchedMin; ControlTypeNum <= SchedMax; ++ControlTypeNum) { + + int ComfortIndex; + switch (static_cast(ControlTypeNum)) { + case DataHVACGlobals::ThermostatType::Uncontrolled: + break; + case DataHVACGlobals::ThermostatType::SingleHeating: + ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeating; + TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)] = true; + if (ComfortIndex != 0) { + SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); + if (SchedTypeIndex == 0) { + ShowSevereError(state, + format("GetZoneAirSetpoints: Could not find {} Schedule={}", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)], + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); + ErrorsFound = true; + } + } else { // ComfortIndex = 0 + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeating))) { + ShowSevereError(state, "Control Type Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies thermal control type 1 ({}) as the control type. Not valid for this zone.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleCooling; + TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)] = true; + if (ComfortIndex != 0) { + SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); + if (SchedTypeIndex == 0) { + ShowSevereError(state, + format("GetZoneAirSetpoints: Could not find {} Schedule={}", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)], + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); + ErrorsFound = true; + } + } else { // ComfortIndex = 0 + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleCooling))) { + ShowSevereError(state, "Control Type Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies thermal control type 2 ({}) as the control type. Not valid for this zone.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeatCool; + TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)] = true; + if (ComfortIndex != 0) { + SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); + if (SchedTypeIndex == 0) { + ShowSevereError(state, + format("GetZoneAirSetpoints: Could not find {} Schedule={}", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)], + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); + ErrorsFound = true; + } + } else { // ComfortIndex = 0 + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool))) { + ShowSevereError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies thermal control type 3 ({}) as the control type. Not valid for this zone.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_DualSetPointWithDeadBand; + TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)] = + true; + if (ComfortIndex != 0) { + SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); + if (SchedTypeIndex == 0) { + ShowSevereError(state, + format("GetZoneAirSetpoints: Could not find {} Schedule={}", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)], + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); + ErrorsFound = true; + } + } else { // ComfortIndex = 0 + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand))) { + ShowSevereError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError( + state, + format("..specifies thermal control type 4 ({}) as the control type. Not valid for this zone.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + default: + ShowSevereError(state, + format("GetZoneAirSetpoints: Illegal control type for Zone={}, Found value={}, in Schedule={}", + Zone(ActualZoneNum).Name, + ControlTypeNum, + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName)); + ShowContinueError(state, "..valid range values are [0,4]."); + ErrorsFound = true; + break; + } + } + } + + for (ComfortControlledZoneNum = 1; ComfortControlledZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++ComfortControlledZoneNum) { + + ActualZoneNum = ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum; + CTIndex = ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex; + if (CTIndex == 0) continue; // error caught elsewhere -- would just be confusing here + + for (ControlTypeNum = 1; ControlTypeNum <= 4; ++ControlTypeNum) { + if (TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum] && + TComfortControlTypes(ComfortControlledZoneNum).DidHave[ControlTypeNum]) + continue; + + switch (static_cast(ControlTypeNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 1 ({}) but does not.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 2 ({}) but does not.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 3 ({}) but does not.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 4 ({}) but does not.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + break; + default: + break; + } + } + } + + if (allocated(TComfortControlTypes)) TComfortControlTypes.deallocate(); + + // Get the Hybrid Model setting inputs + HybridModel::GetHybridModelZone(state); + + // Default multiplier values + Real64 ZoneVolCapMultpSens = 1.0; + Real64 ZoneVolCapMultpMoist = 1.0; + Real64 ZoneVolCapMultpCO2 = 1.0; + Real64 ZoneVolCapMultpGenContam = 1.0; + + // Get the Zone Air Capacitance Multiplier for use in the Predictor-Corrector Procedure + cCurrentModuleObject = "ZoneCapacitanceMultiplier:ResearchSpecial"; + int NumZoneCapaMultiplier = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); // Number of ZonesCapacityMultiplier object + if (NumZoneCapaMultiplier == 0) { + // Assign default multiplier values to all zones + for (int ZoneNum = 1; ZoneNum <= NumOfZones; ZoneNum++) { + Zone(ZoneNum).ZoneVolCapMultpSens = ZoneVolCapMultpSens; + Zone(ZoneNum).ZoneVolCapMultpMoist = ZoneVolCapMultpMoist; + Zone(ZoneNum).ZoneVolCapMultpCO2 = ZoneVolCapMultpCO2; + Zone(ZoneNum).ZoneVolCapMultpGenContam = ZoneVolCapMultpGenContam; + } + + } else { + + // Allow user to specify ZoneCapacitanceMultiplier:ResearchSpecial at zone level + // Added by S. Lee and R. Zhang in Oct. 2016. + // Assign the user inputted multipliers to specified zones + for (int ZoneCapNum = 1; ZoneCapNum <= NumZoneCapaMultiplier; ZoneCapNum++) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + ZoneCapNum, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + + if (lAlphaFieldBlanks(2)) { + // default multiplier values for all the zones not specified (zone or zonelist name field is empty) + ZoneVolCapMultpSens = rNumericArgs(1); + ZoneVolCapMultpMoist = rNumericArgs(2); + ZoneVolCapMultpCO2 = rNumericArgs(3); + ZoneVolCapMultpGenContam = rNumericArgs(4); + } else { + // multiplier values for the specified zone(s) + int ZoneNum = 0; + ZLItem = 0; + Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); + if (Item1 > 0) { + ZoneNum = Item1; + Zone(ZoneNum).FlagCustomizedZoneCap = true; + Zone(ZoneNum).ZoneVolCapMultpSens = rNumericArgs(1); + Zone(ZoneNum).ZoneVolCapMultpMoist = rNumericArgs(2); + Zone(ZoneNum).ZoneVolCapMultpCO2 = rNumericArgs(3); + Zone(ZoneNum).ZoneVolCapMultpGenContam = rNumericArgs(4); + } else if (ZLItem > 0) { + for (int ZonePtrNum = 1; ZonePtrNum < ZoneList(ZLItem).NumOfZones; ZonePtrNum++) { + ZoneNum = ZoneList(ZLItem).Zone(ZonePtrNum); + Zone(ZoneNum).FlagCustomizedZoneCap = true; + Zone(ZoneNum).ZoneVolCapMultpSens = rNumericArgs(1); + Zone(ZoneNum).ZoneVolCapMultpMoist = rNumericArgs(2); + Zone(ZoneNum).ZoneVolCapMultpCO2 = rNumericArgs(3); + Zone(ZoneNum).ZoneVolCapMultpGenContam = rNumericArgs(4); + } + + } else { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" not found."); + ErrorsFound = true; + } + } + } + + // Assign default multiplier values to all the other zones + for (int ZoneNum = 1; ZoneNum <= NumOfZones; ZoneNum++) { + if (!Zone(ZoneNum).FlagCustomizedZoneCap) { + Zone(ZoneNum).ZoneVolCapMultpSens = ZoneVolCapMultpSens; + Zone(ZoneNum).ZoneVolCapMultpMoist = ZoneVolCapMultpMoist; + Zone(ZoneNum).ZoneVolCapMultpCO2 = ZoneVolCapMultpCO2; + Zone(ZoneNum).ZoneVolCapMultpGenContam = ZoneVolCapMultpGenContam; + } + } + + // Calculate the average multiplier value from all zones + { + Real64 ZoneVolCapMultpSens_temp = 0.0; + Real64 ZoneVolCapMultpMoist_temp = 0.0; + Real64 ZoneVolCapMultpCO2_temp = 0.0; + Real64 ZoneVolCapMultpGenContam_temp = 0.0; + + for (int ZoneNum = 1; ZoneNum <= NumOfZones; ZoneNum++) { + ZoneVolCapMultpSens_temp += Zone(ZoneNum).ZoneVolCapMultpSens; + ZoneVolCapMultpMoist_temp += Zone(ZoneNum).ZoneVolCapMultpMoist; + ZoneVolCapMultpCO2_temp += Zone(ZoneNum).ZoneVolCapMultpCO2; + ZoneVolCapMultpGenContam_temp += Zone(ZoneNum).ZoneVolCapMultpGenContam; + } + + if (NumOfZones > 0) { + ZoneVolCapMultpSens = ZoneVolCapMultpSens_temp / NumOfZones; + ZoneVolCapMultpMoist = ZoneVolCapMultpMoist_temp / NumOfZones; + ZoneVolCapMultpCO2 = ZoneVolCapMultpCO2_temp / NumOfZones; + ZoneVolCapMultpGenContam = ZoneVolCapMultpGenContam_temp / NumOfZones; + } + } + } + + print(state.files.eio, Header); + print(state.files.eio, Format_701, ZoneVolCapMultpSens, ZoneVolCapMultpMoist, ZoneVolCapMultpCO2, ZoneVolCapMultpGenContam); + + cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::OTTStat)); + state.dataZoneCtrls->NumOpTempControlledZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneCtrls->NumOpTempControlledZones > 0) { + state.dataZoneCtrls->AnyOpTempControl = true; + + for (int idx = 1; idx <= state.dataZoneCtrls->NumOpTempControlledZones; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + // find matching name of ZONECONTROL:THERMOSTAT object + found = UtilityRoutines::FindItem(cAlphaArgs(1), TStatObjects); + if (found == 0) { + // It might be in the TempControlledZones + found = UtilityRoutines::FindItem(cAlphaArgs(1), TempControlledZone); + if (found == 0) { // throw error + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + " reference not found."); + ErrorsFound = true; + } else { + TempControlledZoneNum = found; + TempControlledZone(TempControlledZoneNum).OperativeTempControl = true; + if (UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled")) { + TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled = true; + } + if ((!(UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled"))) && (!(UtilityRoutines::SameString(cAlphaArgs(2), "Constant")))) { + ShowSevereError( + state, cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\"."); + ErrorsFound = true; + } + + TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction = rNumericArgs(1); + TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched = GetScheduleIndex(state, cAlphaArgs(3)); + if ((TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched == 0) && + (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled)) { // throw error + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + + "\" not found."); + ErrorsFound = true; + } + + // check validity of fixed radiative fraction + if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction < 0.0) && + (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be negative.", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction >= 0.9) && + (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot >= .9.", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + + // check schedule min max. + if (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled) { + ValidRadFractSched = CheckScheduleValueMinMax( + state, TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched, ">=", 0.0, "<", 0.9); + if (!ValidRadFractSched) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(3) + "=[" + + cAlphaArgs(3) + "\"."); + ShowContinueError(state, "..Values outside of range [0.0,0.9)."); + ErrorsFound = true; + } + } + + // added Jan, 2017 - Xuan Luo + // read adaptive comfort model and calculate adaptive thermal comfort setpoint + if (TempControlledZone(TempControlledZoneNum).OperativeTempControl) { + if (NumAlphas >= 4 && !lAlphaFieldBlanks(4)) { + int adaptiveComfortModelTypeIndex = + UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); + if (!adaptiveComfortModelTypeIndex) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + + cAlphaArgs(4) + "\" not found."); + ErrorsFound = true; + } else if (adaptiveComfortModelTypeIndex != static_cast(AdaptiveComfortModel::ADAP_NONE)) { + TempControlledZone(TempControlledZoneNum).AdaptiveComfortTempControl = true; + TempControlledZone(TempControlledZoneNum).AdaptiveComfortModelTypeIndex = + UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); + if (!state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule.initialized) { + Array1D runningAverageASH(state.dataWeatherManager->NumDaysInYear, 0.0); + Array1D runningAverageCEN(state.dataWeatherManager->NumDaysInYear, 0.0); + CalculateMonthlyRunningAverageDryBulb(state, runningAverageASH, runningAverageCEN); + CalculateAdaptiveComfortSetPointSchl(state, runningAverageASH, runningAverageCEN); + } + } + } + } + + // CurrentModuleObject='ZoneControl:Thermostat:OperativeTemperature' + SetupOutputVariable(state, + "Zone Thermostat Operative Temperature", + OutputProcessor::Unit::C, + state.dataHeatBal->ZnAirRpt(TempControlledZone(TempControlledZoneNum).ActualZoneNum).ThermOperativeTemp, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + Zone(TempControlledZone(TempControlledZoneNum).ActualZoneNum).Name); + } + } else { + for (Item = 1; Item <= TStatObjects(found).NumOfZones; ++Item) { + TempControlledZoneNum = TStatObjects(found).TempControlledZoneStartPtr + Item - 1; + if (NumTempControlledZones == 0) continue; + TempControlledZone(TempControlledZoneNum).OperativeTempControl = true; + if (UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled")) { + TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled = true; + } + if (Item == 1) { + if ((!(UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled"))) && + (!(UtilityRoutines::SameString(cAlphaArgs(2), "Constant")))) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\"."); + ErrorsFound = true; + } + } + + TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction = rNumericArgs(1); + TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched = GetScheduleIndex(state, cAlphaArgs(3)); + if (Item == 1) { + if ((TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched == 0) && + (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled)) { // throw error + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + + "\" not found."); + ErrorsFound = true; + } + } + + // check validity of fixed radiative fraction + if (Item == 1) { + if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction < 0.0) && + (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be negative.", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + } + if (Item == 1) { + if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction >= 0.9) && + (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot >= .9.", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + } + + // check schedule min max. + if (Item == 1) { + if (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled) { + ValidRadFractSched = CheckScheduleValueMinMax( + state, TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched, ">=", 0.0, "<", 0.9); + if (!ValidRadFractSched) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(3) + "=[" + + cAlphaArgs(3) + "\"."); + ShowContinueError(state, "..Values outside of range [0.0,0.9)."); + ErrorsFound = true; + } + } + } + + // added Jan, 2017 - Xuan Luo + // read adaptive comfort model and calculate adaptive thermal comfort setpoint + if (TempControlledZone(TempControlledZoneNum).OperativeTempControl) { + if (NumAlphas >= 4 && !lAlphaFieldBlanks(4)) { + int adaptiveComfortModelTypeIndex = + UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); + if (!adaptiveComfortModelTypeIndex) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + + cAlphaArgs(4) + "\" not found."); + ErrorsFound = true; + } else if (adaptiveComfortModelTypeIndex != static_cast(AdaptiveComfortModel::ADAP_NONE)) { + TempControlledZone(TempControlledZoneNum).AdaptiveComfortTempControl = true; + TempControlledZone(TempControlledZoneNum).AdaptiveComfortModelTypeIndex = + UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); + if (!state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule.initialized) { + Array1D runningAverageASH(state.dataWeatherManager->NumDaysInYear, 0.0); + Array1D runningAverageCEN(state.dataWeatherManager->NumDaysInYear, 0.0); + CalculateMonthlyRunningAverageDryBulb(state, runningAverageASH, runningAverageCEN); + CalculateAdaptiveComfortSetPointSchl(state, runningAverageASH, runningAverageCEN); + } + } + } + } + + // CurrentModuleObject='ZoneControl:Thermostat:OperativeTemperature' + SetupOutputVariable(state, + "Zone Thermostat Operative Temperature", + OutputProcessor::Unit::C, + state.dataHeatBal->ZnAirRpt(TempControlledZone(TempControlledZoneNum).ActualZoneNum).ThermOperativeTemp, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + Zone(TempControlledZone(TempControlledZoneNum).ActualZoneNum).Name); + } // TStat Objects Loop + } // found thermostat referene + } // loop over NumOpTempControlledZones + } // NumOpTempControlledZones > 0 + + // Overcool dehumidificaton GetInput starts here + cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::TandHStat)); + state.dataZoneCtrls->NumTempAndHumidityControlledZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneCtrls->NumTempAndHumidityControlledZones > 0) { + state.dataZoneCtrls->AnyZoneTempAndHumidityControl = true; + + for (int idx = 1; idx <= state.dataZoneCtrls->NumTempAndHumidityControlledZones; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + // find matching name of ZONECONTROL:THERMOSTAT object + found = UtilityRoutines::FindItem(cAlphaArgs(1), TStatObjects); + if (found == 0) { + // It might be in the TempControlledZones + found = UtilityRoutines::FindItem(cAlphaArgs(1), TempControlledZone); + if (found == 0) { // throw error + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + " reference not found."); + ErrorsFound = true; + } else { + TempControlledZoneNum = found; + TempControlledZone(TempControlledZoneNum).DehumidifyingSched = cAlphaArgs(2); + TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" not found."); + ErrorsFound = true; + } + TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = true; + if ((UtilityRoutines::SameString(cAlphaArgs(3), "None"))) { + TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = false; + } + if (UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled")) { + TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled = true; + } + if ((!(UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled"))) && (!(UtilityRoutines::SameString(cAlphaArgs(4), "Constant")))) { + ShowSevereError( + state, cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + "\"."); + ErrorsFound = true; + } + + TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange = rNumericArgs(1); + TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex = GetScheduleIndex(state, cAlphaArgs(4)); + if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex == 0) && + (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled)) { // throw error + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + + "\" not found."); + ErrorsFound = true; + } + + // check validity of zone Overcool constant range + if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange < 0.0) && + (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be negative.", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange > 3.0) && + (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be > 3.0", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + + // check zone Overcool range schedule min/max values. + if (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled) { + ValidZoneOvercoolRangeSched = CheckScheduleValueMinMax( + state, TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex, ">=", 0.0, "<=", 3.0); + if (!ValidZoneOvercoolRangeSched) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(5) + "=[" + + cAlphaArgs(5) + "\"."); + ShowContinueError(state, "..Values outside of range [0.0,3.0]."); + ErrorsFound = true; + } + } + // check Overcool Control Ratio limits + TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio = rNumericArgs(2); + if (TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio < 0.0) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be negative.", + cCurrentModuleObject, + cAlphaArgs(2), + cNumericFieldNames(2), + rNumericArgs(2))); + ErrorsFound = true; + } + } + } else { + for (Item = 1; Item <= TStatObjects(found).NumOfZones; ++Item) { + TempControlledZoneNum = TStatObjects(found).TempControlledZoneStartPtr + Item - 1; + TempControlledZone(TempControlledZoneNum).DehumidifyingSched = cAlphaArgs(2); + TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" not found."); + ErrorsFound = true; + } + TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = true; + if ((UtilityRoutines::SameString(cAlphaArgs(3), "None"))) { + TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = false; + } + if (UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled")) { + TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled = false; + } + if (Item == 1) { + if ((!(UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled"))) && + (!(UtilityRoutines::SameString(cAlphaArgs(4), "Constant")))) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + + "\"."); + ErrorsFound = true; + } + } + TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange = rNumericArgs(1); + TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex = GetScheduleIndex(state, cAlphaArgs(6)); + if (Item == 1) { + if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex == 0) && + (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled)) { // throw error + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + + "\" not found."); + ErrorsFound = true; + } + } + // check validity of zone Overcool constant range + if (Item == 1) { + if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange < 0.0) && + (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be negative.", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + } + if (Item == 1) { + if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange > 3.0) && + (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot > 3.0", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + } + // check zone Overcool range schedule min/max values. + if (Item == 1) { + if (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled) { + ValidZoneOvercoolRangeSched = CheckScheduleValueMinMax( + state, TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex, ">=", 0.0, "<=", 3.0); + if (!ValidZoneOvercoolRangeSched) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(5) + "=[" + + cAlphaArgs(5) + "\"."); + ShowContinueError(state, "..Values outside of range [0.0,3.0]."); + ErrorsFound = true; + } + } + } + TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio = rNumericArgs(2); + // check Overcool Control Ratio limits + if (Item == 1) { + if (TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio < 0.0) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be negative.", + cCurrentModuleObject, + cAlphaArgs(2), + cNumericFieldNames(2), + rNumericArgs(2))); + ErrorsFound = true; + } + } + + } // TStat Objects Loop + } // found thermostat reference + } // loop over NumTempAndHumidityControlledZones + } // NumTempAndHumidityControlledZones > 0 + + // Staged thermostat control inputs start + cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::StagedDual)); + NumStageControlledZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + if (NumStageControlledZones > 0) state.dataZoneCtrls->StagedTStatObjects.allocate(NumStageControlledZones); + + // Pre-scan for use of Zone lists in TStat statements (i.e. Global application of TStat) + state.dataZoneTempPredictorCorrector->NumStageCtrZone = 0; + for (Item = 1; Item <= NumStageControlledZones; ++Item) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Item, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + + state.dataZoneCtrls->StagedTStatObjects(Item).Name = cAlphaArgs(1); + Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + ZLItem = 0; + if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); + if (Item1 > 0) { + state.dataZoneCtrls->StagedTStatObjects(Item).StageControlledZoneStartPtr = state.dataZoneTempPredictorCorrector->NumStageCtrZone + 1; + ++state.dataZoneTempPredictorCorrector->NumStageCtrZone; + state.dataZoneCtrls->StagedTStatObjects(Item).NumOfZones = 1; + state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive = false; + state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr = Item1; + } else if (ZLItem > 0) { + state.dataZoneCtrls->StagedTStatObjects(Item).TempControlledZoneStartPtr = state.dataZoneTempPredictorCorrector->NumStageCtrZone + 1; + state.dataZoneTempPredictorCorrector->NumStageCtrZone += ZoneList(ZLItem).NumOfZones; + state.dataZoneCtrls->StagedTStatObjects(Item).NumOfZones = ZoneList(ZLItem).NumOfZones; + state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive = true; + state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr = ZLItem; + } else { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + } + + if (ErrorsFound) { + ShowSevereError(state, "GetStagedDualSetpoint: Errors with invalid names in " + cCurrentModuleObject + " objects."); + ShowContinueError(state, "...These will not be read in. Other errors may occur."); + state.dataZoneTempPredictorCorrector->NumStageCtrZone = 0; + } + + if (state.dataZoneTempPredictorCorrector->NumStageCtrZone > 0) { + StageControlledZone.allocate(state.dataZoneTempPredictorCorrector->NumStageCtrZone); + state.dataZoneCtrls->StageZoneLogic.dimension(NumOfZones, false); + + StageControlledZoneNum = 0; + for (Item = 1; Item <= NumStageControlledZones; ++Item) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Item, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + for (Item1 = 1; Item1 <= state.dataZoneCtrls->StagedTStatObjects(Item).NumOfZones; ++Item1) { + ++StageControlledZoneNum; + if (state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive) { + cAlphaArgs(2) = + state.dataHeatBal->Zone(ZoneList(state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name; + } + int ZoneAssigned = UtilityRoutines::FindItemInList( + cAlphaArgs(2), StageControlledZone, &DataZoneControls::ZoneStagedControls::ZoneName, StageControlledZoneNum - 1); + if (ZoneAssigned == 0) { + StageControlledZone(StageControlledZoneNum).ZoneName = cAlphaArgs(2); + StageControlledZone(StageControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + if (StageControlledZone(StageControlledZoneNum).ActualZoneNum == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" not found."); + ErrorsFound = true; + } else { + // Zone(StageControlledZone(StageControlledZoneNum)%ActualZoneNum)%StageControlledZoneIndex = + // StageControlledZoneNum + } + state.dataZoneCtrls->StageZoneLogic(StageControlledZone(StageControlledZoneNum).ActualZoneNum) = true; + } else { + StageControlledZone(StageControlledZoneNum).ZoneName = cAlphaArgs(2); // for continuity + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" zone previously assigned."); + ShowContinueError(state, "...Zone was previously assigned to Thermostat=\"" + StageControlledZone(ZoneAssigned).Name + "\"."); + ErrorsFound = true; + continue; + } + + if (!state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive) { + StageControlledZone(StageControlledZoneNum).Name = cAlphaArgs(1); + } else { + CheckCreatedZoneItemName( + state, + RoutineName, + cCurrentModuleObject, + state.dataHeatBal->Zone(ZoneList(state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name, + ZoneList(state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr).MaxZoneNameLength, + state.dataZoneCtrls->StagedTStatObjects(Item).Name, + StageControlledZone, + StageControlledZoneNum - 1, + StageControlledZone(StageControlledZoneNum).Name, + errFlag); + if (errFlag) ErrorsFound = true; + } + + StageControlledZone(StageControlledZoneNum).NumOfHeatStages = rNumericArgs(1); + if (rNumericArgs(1) < 1 || rNumericArgs(1) > 4) { + ShowSevereError( + state, + format("{}=\"{}\" invalid range {}=\"{:.0R}\"", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(1), rNumericArgs(1))); + ShowContinueError(state, "..contains values outside of range [1,4]."); + ErrorsFound = true; + } + + StageControlledZone(StageControlledZoneNum).HeatSetBaseSchedName = cAlphaArgs(3); + StageControlledZone(StageControlledZoneNum).HSBchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); + if (Item1 == 1) { // only show error on first of several if zone list + if (StageControlledZone(StageControlledZoneNum).HSBchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + + "\" not found."); + ErrorsFound = true; + } + } + + StageControlledZone(StageControlledZoneNum).HeatThroRange = rNumericArgs(2); + if (rNumericArgs(1) < 0.0) { + ShowSevereError(state, + format("{}=\"{}\" negative value is found at {}=\"{:.1R}\"", + cAlphaArgs(1), + cCurrentModuleObject, + cNumericFieldNames(2), + rNumericArgs(2))); + ShowContinueError(state, ".. The minimum value is 0."); + ErrorsFound = true; + } + + if (StageControlledZone(StageControlledZoneNum).NumOfHeatStages > 0) { + StageControlledZone(StageControlledZoneNum).HeatTOffset.allocate(StageControlledZone(StageControlledZoneNum).NumOfHeatStages); + for (i = 1; i <= StageControlledZone(StageControlledZoneNum).NumOfHeatStages; ++i) { + StageControlledZone(StageControlledZoneNum).HeatTOffset(i) = rNumericArgs(2 + i); + if (rNumericArgs(2 + i) > 0.0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" positive value is found at " + + format("{}=\"{:.1R}\"", cNumericFieldNames(2 + i), rNumericArgs(2 + i))); + ShowContinueError(state, ".. The maximum value is 0."); + ErrorsFound = true; + } + if (lNumericFieldBlanks(2 + i)) { + ShowSevereError(state, + cCurrentModuleObject + " object =" + cAlphaArgs(1) + ". The input of " + cNumericFieldNames(2 + i) + + " is required, but a blank is found."); + ErrorsFound = true; + } + if (i > 1) { + if (rNumericArgs(2 + i) >= rNumericArgs(1 + i)) { + ShowSevereError(state, + format(R"({}="{}" The value at {}="{:.1R}" has to be less than )", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(2 + i), + rNumericArgs(2 + i))); + ShowContinueError(state, format("{}=\"{:.1R}", cNumericFieldNames(1 + i), rNumericArgs(1 + i))); + ErrorsFound = true; + } + } + } + } + + StageControlledZone(StageControlledZoneNum).NumOfCoolStages = rNumericArgs(7); + if (rNumericArgs(7) < 1 || rNumericArgs(7) > 4) { + ShowSevereError( + state, + format("{}=\"{}\" invalid range {}=\"{:.0R}\"", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(7), rNumericArgs(7))); + ShowContinueError(state, "..contains values outside of range [1,4]."); + ErrorsFound = true; + } + + StageControlledZone(StageControlledZoneNum).CoolSetBaseSchedName = cAlphaArgs(4); + StageControlledZone(StageControlledZoneNum).CSBchedIndex = GetScheduleIndex(state, cAlphaArgs(4)); + if (Item1 == 1) { // only show error on first of several if zone list + if (StageControlledZone(StageControlledZoneNum).CSBchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + + "\" not found."); + ErrorsFound = true; + } + } + + StageControlledZone(StageControlledZoneNum).CoolThroRange = rNumericArgs(8); + if (rNumericArgs(8) < 0.0) { + ShowSevereError(state, + format("{}=\"{}\" negative value is found at {}=\"{:.1R}\"", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(8), + rNumericArgs(8))); + ShowContinueError(state, ".. The minumum value is 0."); + ErrorsFound = true; + } + + if (StageControlledZone(StageControlledZoneNum).NumOfCoolStages > 0) { + StageControlledZone(StageControlledZoneNum).CoolTOffset.allocate(StageControlledZone(StageControlledZoneNum).NumOfCoolStages); + for (i = 1; i <= StageControlledZone(StageControlledZoneNum).NumOfCoolStages; ++i) { + StageControlledZone(StageControlledZoneNum).CoolTOffset(i) = rNumericArgs(8 + i); + if (rNumericArgs(8 + i) < 0.0) { + ShowSevereError(state, + format("{}=\"{}\" negative value is found at {}=\"{:.1R}\"", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(8 + i), + rNumericArgs(8 + i))); + ShowContinueError(state, ".. The minimum value is 0."); + ErrorsFound = true; + } + if (lNumericFieldBlanks(8 + i)) { + ShowSevereError(state, + cCurrentModuleObject + " object =" + cAlphaArgs(1) + ". The input of " + cNumericFieldNames(8 + i) + + " is required, but a blank is found."); + ErrorsFound = true; + } + if (i > 1) { + if (rNumericArgs(8 + i) <= rNumericArgs(7 + i)) { + ShowSevereError(state, + format("{}=\"{}\" The value at {}=\"{:.1R}\" has to be greater than ", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(8 + i), + rNumericArgs(8 + i))); + ShowContinueError(state, format("{}=\"{:.1R}", cNumericFieldNames(7 + i), rNumericArgs(7 + i))); + ErrorsFound = true; + } + } + } + } + } + } // loop over NumStageControlledZones + if ((inputProcessor->getNumObjectsFound(state, "AirLoopHVAC:UnitaryHeatPump:AirToAir:MultiSpeed") == 0) && + (inputProcessor->getNumObjectsFound(state, "AirLoopHVAC:UnitarySystem") == 0) && + (inputProcessor->getNumObjectsFound(state, "SetpointManager:SingleZone:OneStageCooling") == 0) && + (inputProcessor->getNumObjectsFound(state, "SetpointManager:SingleZone:OneStageHeating") == 0)) { + ShowWarningError(state, cCurrentModuleObject + " is applicable to only selected HVAC objects which are missing from input."); + ShowContinueError(state, "Model should include one or more of the following objects: "); + ShowContinueError(state, "AirLoopHVAC:UnitaryHeatPump:AirToAir:MultiSpeed, AirLoopHVAC:UnitarySystem, "); + ShowContinueError( + state, "SetpointManager:SingleZone:OneStageCooling, and/or SetpointManager:SingleZone:OneStageHeating. The simulation continues..."); + } + } // NumStageControlledZones > 0 + + if (ErrorsFound) { + ShowFatalError(state, "Errors getting Zone Control input data. Preceding condition(s) cause termination."); + } +} + +void CalculateMonthlyRunningAverageDryBulb(EnergyPlusData &state, Array1D &runningAverageASH, Array1D &runningAverageCEN) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Xuan Luo + // DATE WRITTEN January 2017 + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine calculate the monthly running average dry bulb temperature; + + // Using/Aliasing + + using OutputReportTabular::GetColumnUsingTabs; + using OutputReportTabular::StrToReal; + + // SUBROUTINE PARAMETER DEFINITIONS: + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + + std::string lineIn; + std::string lineAvg; + std::string epwLine; + + Real64 dryBulb; + Real64 avgDryBulb; + + int readStat; + int calcEndDay; + int calcStartDayASH; + int calcStartDayCEN; + + std::string::size_type pos; + int ind, i, j; + + Array1D adaptiveTemp(state.dataWeatherManager->NumDaysInYear, 0.0); + Array1D dailyDryTemp(state.dataWeatherManager->NumDaysInYear, 0.0); + + readStat = 0; + if (FileSystem::fileExists(state.files.inputWeatherFilePath.filePath)) { + // Read hourly dry bulb temperature first + auto epwFile = state.files.inputWeatherFilePath.open(state, "CalcThermalComfortAdaptive"); + for (i = 1; i <= 9; ++i) { // Headers + epwFile.readLine(); + } + for (i = 1; i <= state.dataWeatherManager->NumDaysInYear; ++i) { + avgDryBulb = 0.0; + for (j = 1; j <= 24; ++j) { + epwLine = epwFile.readLine().data; + for (ind = 1; ind <= 6; ++ind) { + pos = index(epwLine, ','); + epwLine.erase(0, pos + 1); + } + pos = index(epwLine, ','); + dryBulb = StrToReal(epwLine.substr(0, pos)); + avgDryBulb += (dryBulb / 24.0); + } + dailyDryTemp(i) = avgDryBulb; + } + epwFile.close(); + + // Calculate monthly running average dry bulb temperature. + int dayOfYear = 0; + while (dayOfYear < state.dataWeatherManager->NumDaysInYear) { + dayOfYear++; + calcEndDay = dayOfYear - 1; + calcStartDayASH = calcEndDay - 30; + calcStartDayCEN = calcEndDay - 7; + + if (calcStartDayASH > 0) { + for (i = calcStartDayASH; i <= calcStartDayASH + 30; i++) { + avgDryBulb = dailyDryTemp(i); + runningAverageASH(dayOfYear) = runningAverageASH(dayOfYear) + avgDryBulb; + } + runningAverageASH(dayOfYear) /= 30; + } else { // Do special things for wrapping the epw + calcStartDayASH += state.dataWeatherManager->NumDaysInYear; + for (i = 1; i <= calcEndDay; i++) { + avgDryBulb = dailyDryTemp(i); + runningAverageASH(dayOfYear) = runningAverageASH(dayOfYear) + avgDryBulb; + } + for (i = calcStartDayASH; i < state.dataWeatherManager->NumDaysInYear; i++) { + avgDryBulb = dailyDryTemp(i); + runningAverageASH(dayOfYear) = runningAverageASH(dayOfYear) + avgDryBulb; + } + runningAverageASH(dayOfYear) /= 30; + } + + if (calcStartDayCEN > 0) { + for (i = calcStartDayCEN; i <= calcStartDayCEN + 7; i++) { + avgDryBulb = dailyDryTemp(i); + runningAverageCEN(dayOfYear) = runningAverageCEN(dayOfYear) + avgDryBulb; + } + runningAverageCEN(dayOfYear) /= 7; + } else { // Do special things for wrapping the epw + calcStartDayCEN += state.dataWeatherManager->NumDaysInYear; + for (i = 1; i <= calcEndDay; i++) { + avgDryBulb = dailyDryTemp(i); + runningAverageCEN(dayOfYear) = runningAverageCEN(dayOfYear) + avgDryBulb; + } + for (i = calcStartDayCEN; i < state.dataWeatherManager->NumDaysInYear; i++) { + avgDryBulb = dailyDryTemp(i); + runningAverageCEN(dayOfYear) = runningAverageCEN(dayOfYear) + avgDryBulb; + } + runningAverageCEN(dayOfYear) /= 7; + } + } + } else { + ShowFatalError(state, + "CalcThermalComfortAdaptive: Could not open file " + state.files.inputWeatherFilePath.filePath.string() + + " for input (read). (File does not exist)"); + } +} + +void CalculateAdaptiveComfortSetPointSchl(EnergyPlusData &state, Array1D const &runningAverageASH, Array1D const &runningAverageCEN) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Xuan Luo + // DATE WRITTEN January 2017 + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine calculates the zone operative temperature setpoint using adaptive comfort model. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int constexpr summerDesignDayTypeIndex(9); + Real64 GrossApproxAvgDryBulbDesignDay(0.0); + + auto &AdapComfortDailySetPointSchedule = state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule; + auto &AdapComfortSetPointSummerDesDay = state.dataZoneTempPredictorCorrector->AdapComfortSetPointSummerDesDay; + + for (size_t i = 1; i <= state.dataWeatherManager->DesDayInput.size(); i++) { + // Summer design day + if (state.dataWeatherManager->DesDayInput(i).DayType == summerDesignDayTypeIndex) { + GrossApproxAvgDryBulbDesignDay = + (state.dataWeatherManager->DesDayInput(i).MaxDryBulb + + (state.dataWeatherManager->DesDayInput(i).MaxDryBulb - state.dataWeatherManager->DesDayInput(i).DailyDBRange)) / + 2.0; + if (GrossApproxAvgDryBulbDesignDay > 10 && GrossApproxAvgDryBulbDesignDay < 33.5) { + AdapComfortSetPointSummerDesDay[0] = 0.31 * GrossApproxAvgDryBulbDesignDay + 17.8; + AdapComfortSetPointSummerDesDay[1] = 0.31 * GrossApproxAvgDryBulbDesignDay + 20.3; + AdapComfortSetPointSummerDesDay[2] = 0.31 * GrossApproxAvgDryBulbDesignDay + 21.3; + } + if (GrossApproxAvgDryBulbDesignDay > 10 && GrossApproxAvgDryBulbDesignDay < 30) { + AdapComfortSetPointSummerDesDay[3] = 0.33 * GrossApproxAvgDryBulbDesignDay + 18.8; + AdapComfortSetPointSummerDesDay[4] = 0.33 * GrossApproxAvgDryBulbDesignDay + 20.8; + ; + AdapComfortSetPointSummerDesDay[5] = 0.33 * GrossApproxAvgDryBulbDesignDay + 21.8; + ; + AdapComfortSetPointSummerDesDay[6] = 0.33 * GrossApproxAvgDryBulbDesignDay + 22.8; + ; + } + } + } + + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central.allocate(state.dataWeatherManager->NumDaysInYear); + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90.allocate(state.dataWeatherManager->NumDaysInYear); + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80.allocate(state.dataWeatherManager->NumDaysInYear); + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central.allocate(state.dataWeatherManager->NumDaysInYear); + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I.allocate(state.dataWeatherManager->NumDaysInYear); + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II.allocate(state.dataWeatherManager->NumDaysInYear); + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III.allocate(state.dataWeatherManager->NumDaysInYear); + + // Calculate the set points based on different models, set flag as -1 when running average temperature is not in the range. + for (int day = 1; day <= state.dataWeatherManager->NumDaysInYear; day++) { + if (runningAverageASH(day) > 10 && runningAverageASH(day) < 33.5) { + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central(day) = 0.31 * runningAverageASH(day) + 17.8; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90(day) = 0.31 * runningAverageASH(day) + 20.3; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80(day) = 0.31 * runningAverageASH(day) + 21.3; + } else { + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central(day) = -1; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90(day) = -1; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80(day) = -1; + } + if (runningAverageCEN(day) > 10 && runningAverageCEN(day) < 30) { + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central(day) = 0.33 * runningAverageCEN(day) + 18.8; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I(day) = 0.33 * runningAverageCEN(day) + 20.8; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II(day) = 0.33 * runningAverageCEN(day) + 21.8; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III(day) = 0.33 * runningAverageCEN(day) + 22.8; + } else { + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central(day) = -1; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I(day) = -1; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II(day) = -1; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III(day) = -1; + } + } + AdapComfortDailySetPointSchedule.initialized = true; +} + +void InitZoneAirSetPoints(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Russell Taylor + // DATE WRITTEN September 1998 + // MODIFIED November 2004, M. J. Witte additional report variables + // MODIFIED L.Gu, May 2006 + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine initializes the data for the zone air setpoints. + + // METHODOLOGY EMPLOYED: + // Uses the status flags to trigger events. + + // SUBROUTINE PARAMETER DEFINITIONS: + static constexpr std::string_view RoutineName("InitZoneAirSetpoints: "); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + bool FirstSurfFlag; + int TRefFlag; // Flag for Reference Temperature process in Zones + + auto &ZoneList = state.dataHeatBal->ZoneList; + auto &TempControlledZone = state.dataZoneCtrls->TempControlledZone; + auto &TempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint; + auto &TempControlType = state.dataHeatBalFanSys->TempControlType; + auto &TempControlTypeRpt = state.dataHeatBalFanSys->TempControlTypeRpt; + auto &ComfortControlledZone = state.dataZoneCtrls->ComfortControlledZone; + auto &ZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo; + auto &ZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi; + auto &NumOfZones = state.dataGlobal->NumOfZones; + + if (state.dataZoneTempPredictorCorrector->InitZoneAirSetPointsOneTimeFlag) { + TempZoneThermostatSetPoint.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->AdapComfortCoolingSetPoint.dimension(NumOfZones, 0.0); + ZoneThermostatSetPointHi.dimension(NumOfZones, 0.0); + ZoneThermostatSetPointLo.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->ZoneThermostatSetPointHiAver.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->ZoneThermostatSetPointLoAver.dimension(NumOfZones, 0.0); + + state.dataHeatBalFanSys->LoadCorrectionFactor.dimension(NumOfZones, 0.0); + TempControlType.dimension(NumOfZones, DataHVACGlobals::ThermostatType::Uncontrolled); + TempControlTypeRpt.dimension(NumOfZones, 0); + if (state.dataZoneCtrls->NumComfortControlledZones > 0) { + state.dataHeatBalFanSys->ComfortControlType.dimension(NumOfZones, DataHVACGlobals::ThermostatType::Uncontrolled); + state.dataHeatBalFanSys->ComfortControlTypeRpt.dimension(NumOfZones, 0); + state.dataHeatBalFanSys->ZoneComfortControlsFanger.allocate(NumOfZones); + } + state.dataZoneEnergyDemand->Setback.dimension(NumOfZones, false); + state.dataZoneEnergyDemand->DeadBandOrSetback.dimension(NumOfZones, false); + state.dataZoneEnergyDemand->CurDeadBandOrSetback.dimension(NumOfZones, false); + + state.dataHeatBal->ZoneListSNLoadHeatEnergy.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); + state.dataHeatBal->ZoneListSNLoadCoolEnergy.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); + state.dataHeatBal->ZoneListSNLoadHeatRate.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); + state.dataHeatBal->ZoneListSNLoadCoolRate.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); + + state.dataHeatBal->ZoneGroupSNLoadHeatEnergy.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); + state.dataHeatBal->ZoneGroupSNLoadCoolEnergy.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); + state.dataHeatBal->ZoneGroupSNLoadHeatRate.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); + state.dataHeatBal->ZoneGroupSNLoadCoolRate.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); + + // Hybrid modeling + state.dataHeatBalFanSys->PreviousMeasuredZT1.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->PreviousMeasuredZT2.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->PreviousMeasuredZT3.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->PreviousMeasuredHumRat1.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->PreviousMeasuredHumRat2.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->PreviousMeasuredHumRat3.dimension(NumOfZones, 0.0); + + // Allocate Derived Types + state.dataZoneEnergyDemand->ZoneSysEnergyDemand.allocate(NumOfZones); + state.dataZoneEnergyDemand->ZoneSysMoistureDemand.allocate(NumOfZones); + state.dataHeatBal->doSpaceHeatBalanceSimulation = true; + state.dataHeatBal->doSpaceHeatBalanceSizing = true; + if (state.dataHeatBal->doSpaceHeatBalanceSimulation || state.dataHeatBal->doSpaceHeatBalanceSizing) { + state.dataZoneEnergyDemand->spaceSysEnergyDemand.allocate(state.dataGlobal->numSpaces); + state.dataZoneEnergyDemand->spaceSysMoistureDemand.allocate(state.dataGlobal->numSpaces); + } + + for (int zoneNum = 1; zoneNum <= NumOfZones; ++zoneNum) { + FirstSurfFlag = true; + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + auto &thisSpace = state.dataHeatBal->space(spaceNum); + for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { + if (FirstSurfFlag) { + TRefFlag = state.dataSurface->SurfTAirRef(SurfNum); + FirstSurfFlag = false; + } + // for each particular zone, the reference air temperature(s) should be the same + // (either mean air, bulk air, or supply air temp). + if (state.dataSurface->SurfTAirRef(SurfNum) != TRefFlag) { + ShowWarningError(state, + "Different reference air temperatures for difference surfaces encountered in zone " + + state.dataHeatBal->Zone(zoneNum).Name); + } + } + } + } + + // CurrentModuleObject='Zone' + for (int zoneNum = 1; zoneNum <= NumOfZones; ++zoneNum) { + auto &thisZone = state.dataHeatBal->Zone(zoneNum); + state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).setUpOutputVars(state, DataStringGlobals::zonePrefix, thisZone.Name); + if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).setUpOutputVars( + state, DataStringGlobals::spacePrefix, state.dataHeatBal->space(spaceNum).Name); + } + } + bool staged = false; + if (allocated(state.dataZoneCtrls->StageZoneLogic)) { + staged = state.dataZoneCtrls->StageZoneLogic(zoneNum); + } + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).setUpOutputVars( + state, DataStringGlobals::zonePrefix, thisZone.Name, thisZone.Multiplier, thisZone.ListMultiplier, staged); + if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).setUpOutputVars(state, + DataStringGlobals::spacePrefix, + state.dataHeatBal->space(spaceNum).Name, + thisZone.Multiplier, + thisZone.ListMultiplier, + staged); + } + } + state.dataZoneEnergyDemand->ZoneSysMoistureDemand(zoneNum).setUpOutputVars( + state, DataStringGlobals::zonePrefix, thisZone.Name, thisZone.Multiplier, thisZone.ListMultiplier, staged); + if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneEnergyDemand->spaceSysMoistureDemand(spaceNum).setUpOutputVars(state, + DataStringGlobals::spacePrefix, + state.dataHeatBal->space(spaceNum).Name, + thisZone.Multiplier, + thisZone.ListMultiplier, + staged); + } + } + SetupOutputVariable(state, + "Zone Thermostat Air Temperature", + OutputProcessor::Unit::C, + state.dataHeatBalFanSys->TempTstatAir(zoneNum), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Thermostat Control Type", + OutputProcessor::Unit::None, + TempControlTypeRpt(zoneNum), + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Thermostat Heating Setpoint Temperature", + OutputProcessor::Unit::C, + ZoneThermostatSetPointLo(zoneNum), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Thermostat Cooling Setpoint Temperature", + OutputProcessor::Unit::C, + ZoneThermostatSetPointHi(zoneNum), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Adaptive Comfort Operative Temperature Set Point", + OutputProcessor::Unit::C, + state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(zoneNum), + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Predicted Sensible Load Room Air Correction Factor", + OutputProcessor::Unit::None, + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + } // zoneNum + + // Thermal comfort control output + if (state.dataZoneCtrls->NumComfortControlledZones > 0) { + // CurrentModuleObject='ZoneControl:Thermostat:ThermalComfort' + for (int Loop = 1; Loop <= state.dataZoneCtrls->NumComfortControlledZones; ++Loop) { + int zoneNum = ComfortControlledZone(Loop).ActualZoneNum; + auto &thisZone = state.dataHeatBal->Zone(zoneNum); + SetupOutputVariable(state, + "Zone Thermal Comfort Control Type", + OutputProcessor::Unit::None, + state.dataHeatBalFanSys->ComfortControlTypeRpt(zoneNum), + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Thermal Comfort Control Fanger Low Setpoint PMV", + OutputProcessor::Unit::None, + state.dataHeatBalFanSys->ZoneComfortControlsFanger(zoneNum).LowPMV, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Thermal Comfort Control Fanger High Setpoint PMV", + OutputProcessor::Unit::None, + state.dataHeatBalFanSys->ZoneComfortControlsFanger(zoneNum).HighPMV, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + } + } + + // CurrentModuleObject='ZoneList' + for (int Loop = 1; Loop <= state.dataHeatBal->NumOfZoneLists; ++Loop) { + SetupOutputVariable(state, + "Zone List Sensible Heating Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZoneListSNLoadHeatEnergy(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + ZoneList(Loop).Name); + SetupOutputVariable(state, + "Zone List Sensible Cooling Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZoneListSNLoadCoolEnergy(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + ZoneList(Loop).Name); + SetupOutputVariable(state, + "Zone List Sensible Heating Rate", + OutputProcessor::Unit::W, + state.dataHeatBal->ZoneListSNLoadHeatRate(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + ZoneList(Loop).Name); + SetupOutputVariable(state, + "Zone List Sensible Cooling Rate", + OutputProcessor::Unit::W, + state.dataHeatBal->ZoneListSNLoadCoolRate(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + ZoneList(Loop).Name); + } // Loop + + // CurrentModuleObject='ZoneGroup' + for (int Loop = 1; Loop <= state.dataHeatBal->NumOfZoneGroups; ++Loop) { + SetupOutputVariable(state, + "Zone Group Sensible Heating Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZoneGroupSNLoadHeatEnergy(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->ZoneGroup(Loop).Name); + SetupOutputVariable(state, + "Zone Group Sensible Cooling Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZoneGroupSNLoadCoolEnergy(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->ZoneGroup(Loop).Name); + SetupOutputVariable(state, + "Zone Group Sensible Heating Rate", + OutputProcessor::Unit::W, + state.dataHeatBal->ZoneGroupSNLoadHeatRate(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->ZoneGroup(Loop).Name); + SetupOutputVariable(state, + "Zone Group Sensible Cooling Rate", + OutputProcessor::Unit::W, + state.dataHeatBal->ZoneGroupSNLoadCoolRate(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->ZoneGroup(Loop).Name); + } // Loop + + state.dataZoneTempPredictorCorrector->InitZoneAirSetPointsOneTimeFlag = false; + } + + // Do the Begin Environment initializations + if (state.dataZoneTempPredictorCorrector->MyEnvrnFlag && state.dataGlobal->BeginEnvrnFlag) { + for (auto &thisZoneHB : state.dataZoneTempPredictorCorrector->zoneHeatBalance) { + thisZoneHB.beginEnvironmentInit(state); + } + if (state.dataHeatBal->doSpaceHeatBalance) { + for (auto &thisSpaceHB : state.dataZoneTempPredictorCorrector->spaceHeatBalance) { + thisSpaceHB.beginEnvironmentInit(state); + } + } + TempZoneThermostatSetPoint = 0.0; + state.dataHeatBalFanSys->AdapComfortCoolingSetPoint = 0.0; + ZoneThermostatSetPointHi = 0.0; + ZoneThermostatSetPointLo = 0.0; + + state.dataHeatBalFanSys->LoadCorrectionFactor = 1.0; + TempControlType = DataHVACGlobals::ThermostatType::Uncontrolled; + for (auto &e : state.dataZoneEnergyDemand->ZoneSysEnergyDemand) { + e.beginEnvironmentInit(); + } + for (auto &e : state.dataZoneEnergyDemand->ZoneSysMoistureDemand) { + e.beginEnvironmentInit(); + } + if (state.dataHeatBal->doSpaceHeatBalance) { + for (auto &e : state.dataZoneEnergyDemand->spaceSysEnergyDemand) { + e.beginEnvironmentInit(); + } + for (auto &e : state.dataZoneEnergyDemand->spaceSysMoistureDemand) { + e.beginEnvironmentInit(); + } + } + + state.dataZoneEnergyDemand->DeadBandOrSetback = false; + + for (auto &e : state.dataHeatBal->Zone) + e.NoHeatToReturnAir = false; + state.dataHeatBalFanSys->PreviousMeasuredZT1 = 0.0; // Hybrid modeling + state.dataHeatBalFanSys->PreviousMeasuredZT2 = 0.0; // Hybrid modeling + state.dataHeatBalFanSys->PreviousMeasuredZT3 = 0.0; // Hybrid modeling + state.dataHeatBalFanSys->PreviousMeasuredHumRat1 = 0.0; // Hybrid modeling + state.dataHeatBalFanSys->PreviousMeasuredHumRat2 = 0.0; // Hybrid modeling + state.dataHeatBalFanSys->PreviousMeasuredHumRat3 = 0.0; // Hybrid modeling + + state.dataZoneTempPredictorCorrector->MyEnvrnFlag = false; + } + + if (!state.dataGlobal->BeginEnvrnFlag) { + state.dataZoneTempPredictorCorrector->MyEnvrnFlag = true; + } + + // Do the Begin Day initializations + if (state.dataZoneTempPredictorCorrector->MyDayFlag && state.dataGlobal->BeginDayFlag) { + state.dataZoneTempPredictorCorrector->MyDayFlag = false; + } + + if (!state.dataGlobal->BeginDayFlag) { + state.dataZoneTempPredictorCorrector->MyDayFlag = true; + } + + for (int Loop = 1; Loop <= state.dataZoneCtrls->NumTempControlledZones; ++Loop) { + if (state.dataZoneEquip->ZoneEquipInputsFilled && !state.dataZoneTempPredictorCorrector->ControlledZonesChecked) { + if (!VerifyControlledZoneForThermostat(state, TempControlledZone(Loop).ZoneName)) { + ShowSevereError(state, + format("{}Zone=\"{}\" has specified a Thermostatic control but is not a controlled zone.", + RoutineName, + TempControlledZone(Loop).ZoneName)); + ShowContinueError(state, "...must have a ZoneHVAC:EquipmentConnections specification for this zone."); + state.dataZoneTempPredictorCorrector->ErrorsFound = true; + } + } + + if (TempControlledZone(Loop).ManageDemand) { + int ZoneNum = TempControlledZone(Loop).ActualZoneNum; + + switch (TempControlType(ZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + if (TempZoneThermostatSetPoint(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) { + TempZoneThermostatSetPoint(ZoneNum) = TempControlledZone(Loop).HeatingResetLimit; + ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + } + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + if (TempZoneThermostatSetPoint(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit) { + TempZoneThermostatSetPoint(ZoneNum) = TempControlledZone(Loop).CoolingResetLimit; + ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + } + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + if ((TempZoneThermostatSetPoint(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) || + (TempZoneThermostatSetPoint(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit)) { + + TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; + TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); + ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + + if (ZoneThermostatSetPointLo(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) + ZoneThermostatSetPointLo(ZoneNum) = TempControlledZone(Loop).HeatingResetLimit; + if (ZoneThermostatSetPointHi(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit) + ZoneThermostatSetPointHi(ZoneNum) = TempControlledZone(Loop).CoolingResetLimit; + } + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + if (ZoneThermostatSetPointLo(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) + ZoneThermostatSetPointLo(ZoneNum) = TempControlledZone(Loop).HeatingResetLimit; + if (ZoneThermostatSetPointHi(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit) + ZoneThermostatSetPointHi(ZoneNum) = TempControlledZone(Loop).CoolingResetLimit; + break; + default: + break; + } + } + } + + for (int Loop = 1; Loop <= state.dataZoneCtrls->NumComfortControlledZones; ++Loop) { + if (state.dataZoneEquip->ZoneEquipInputsFilled && !state.dataZoneTempPredictorCorrector->ControlledZonesChecked) { + if (!VerifyControlledZoneForThermostat(state, ComfortControlledZone(Loop).ZoneName)) { + ShowSevereError(state, + format("{}Zone=\"{}\" has specified a Comfort control but is not a controlled zone.", + RoutineName, + ComfortControlledZone(Loop).ZoneName)); + ShowContinueError(state, "...must have a ZoneHVAC:EquipmentConnections specification for this zone."); + state.dataZoneTempPredictorCorrector->ErrorsFound = true; + } + } + if (ComfortControlledZone(Loop).ManageDemand) { + int ZoneNum = ComfortControlledZone(Loop).ActualZoneNum; + + switch (state.dataHeatBalFanSys->ComfortControlType(ZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + if (TempZoneThermostatSetPoint(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) { + TempZoneThermostatSetPoint(ZoneNum) = ComfortControlledZone(Loop).HeatingResetLimit; + ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::SingleHeating; + TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); + } + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + if (TempZoneThermostatSetPoint(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit) { + TempZoneThermostatSetPoint(ZoneNum) = ComfortControlledZone(Loop).CoolingResetLimit; + ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::SingleCooling; + TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); + } + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + if ((TempZoneThermostatSetPoint(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) || + (TempZoneThermostatSetPoint(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit)) { + + TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; + TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); + ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + + if (ZoneThermostatSetPointLo(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) + ZoneThermostatSetPointLo(ZoneNum) = ComfortControlledZone(Loop).HeatingResetLimit; + if (ZoneThermostatSetPointHi(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit) + ZoneThermostatSetPointHi(ZoneNum) = ComfortControlledZone(Loop).CoolingResetLimit; + } + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; + TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); + if (ZoneThermostatSetPointLo(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) + ZoneThermostatSetPointLo(ZoneNum) = ComfortControlledZone(Loop).HeatingResetLimit; + if (ZoneThermostatSetPointHi(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit) + ZoneThermostatSetPointHi(ZoneNum) = ComfortControlledZone(Loop).CoolingResetLimit; + break; + default: + break; + } + } // Demand manager + } + + if (state.dataZoneTempPredictorCorrector->ErrorsFound) { + ShowFatalError(state, "InitZoneAirSetpoints - program terminates due to previous condition."); + } + + if (state.dataZoneEquip->ZoneEquipInputsFilled) { + state.dataZoneTempPredictorCorrector->ControlledZonesChecked = true; + } +} + +void ZoneSpaceHeatBalanceData::beginEnvironmentInit(EnergyPlusData &state) +{ + for (int i = 0; i <= 3; ++i) { + this->ZTM[i] = 0.0; + this->WPrevZoneTS[i] = state.dataEnvrn->OutHumRat; + this->DSWPrevZoneTS[i] = state.dataEnvrn->OutHumRat; + this->WPrevZoneTSTemp[i] = 0.0; + } + this->WZoneTimeMinusP = state.dataEnvrn->OutHumRat; + this->ZoneW1 = state.dataEnvrn->OutHumRat; + this->ZoneWMX = state.dataEnvrn->OutHumRat; + this->ZoneWM2 = state.dataEnvrn->OutHumRat; + this->ZoneAirHumRatTemp = 0.0; + this->TempIndZnLd = 0.0; + this->TempDepZnLd = 0.0; + this->ZoneAirRelHum = 0.0; + this->AirPowerCap = 0.0; + this->ZoneT1 = 0.0; +} + +void ZoneSpaceHeatBalanceData::setUpOutputVars(EnergyPlusData &state, std::string_view prefix, std::string_view name) +{ + SetupOutputVariable(state, + format("{} Air Temperature", prefix), + OutputProcessor::Unit::C, + this->ZT, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + name); + SetupOutputVariable(state, + format("{} Air Humidity Ratio", prefix), + OutputProcessor::Unit::None, + this->ZoneAirHumRat, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + name); + SetupOutputVariable(state, + format("{} Air Relative Humidity", prefix), + OutputProcessor::Unit::Perc, + this->ZoneAirRelHum, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + name); +} + +void PredictSystemLoads(EnergyPlusData &state, + bool const ShortenTimeStepSys, + bool const UseZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step + Real64 const PriorTimeStep // the old value for timestep length is passed for possible use in interpolating +) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Russ Taylor + // DATE WRITTEN May 1997 + // MODIFIED na + // RE-ENGINEERED July 2003 (Peter Graham Ellis) + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine is responsible for determining + // how much of each type of energy every zone requires. + // In effect, this subroutine defines and simulates all + // the system types and in the case of hybrid systems + // which use more than one type of energy must determine + // how to apportion the load. An example of a hybrid system + // is a water loop heat pump with supplemental air. In + // this case, a zone will require water from the loop and + // cooled or heated air from the air system. A simpler + // example would be a VAV system with baseboard heaters. + + // Basic Air System Types + // 1) Constant Volume Single Duct + // 2) Variable Volume Single Duct + // 3) Constant Volume Dual Duct + // 4) Variable Volume Dual Duct + + // METHODOLOGY EMPLOYED: + // 0. Determine if simulation has downstepped and readjust history and revert node results + // 1. Determine zone load - this is zone temperature dependent + // 2. Determine balance point - the temperature at which the + // zone load is balanced by the system output. The way the + // balance point is determined will be different depending on + // the type of system being simulated. + // 3. Calculate zone energy requirements + + // Staged thermostat setpoint + if (state.dataZoneTempPredictorCorrector->NumStageCtrZone > 0) { + for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneTempPredictorCorrector->NumStageCtrZone; ++RelativeZoneNum) { + auto &thisStageControlZone = state.dataZoneCtrls->StageControlledZone(RelativeZoneNum); + int ActualZoneNum = thisStageControlZone.ActualZoneNum; + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ActualZoneNum); + auto &thisZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum); + auto &thisZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum); + Real64 ZoneT = thisZoneHB.MAT; // Zone temperature at previous time step + if (ShortenTimeStepSys) ZoneT = thisZoneHB.XMPT; + thisStageControlZone.HeatSetPoint = ScheduleManager::GetCurrentScheduleValue(state, thisStageControlZone.HSBchedIndex); + thisStageControlZone.CoolSetPoint = ScheduleManager::GetCurrentScheduleValue(state, thisStageControlZone.CSBchedIndex); + if (thisStageControlZone.HeatSetPoint >= thisStageControlZone.CoolSetPoint) { + ++thisStageControlZone.StageErrCount; + if (thisStageControlZone.StageErrCount < 2) { + ShowWarningError(state, + "ZoneControl:Thermostat:StagedDualSetpoint: The heating setpoint is equal to or above the cooling setpoint in " + + thisStageControlZone.Name); + ShowContinueError(state, "The zone heating setpoint is set to the cooling setpoint - 0.1C."); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } else { + ShowRecurringWarningErrorAtEnd(state, + "The heating setpoint is still above the cooling setpoint", + thisStageControlZone.StageErrIndex, + thisStageControlZone.HeatSetPoint, + thisStageControlZone.HeatSetPoint); + } + thisStageControlZone.HeatSetPoint = thisStageControlZone.CoolSetPoint - 0.1; //??????????? + } + // Determine either cooling or heating + if (thisStageControlZone.CoolSetPoint < ZoneT) { // Cooling + Real64 SetpointOffset = ZoneT - thisStageControlZone.CoolSetPoint; + int Itemp = 0; + for (int I = 1; I <= thisStageControlZone.NumOfCoolStages; ++I) { + if (SetpointOffset >= thisStageControlZone.CoolTOffset(I)) { + Itemp = -I; + } + } + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum = Itemp; + if (SetpointOffset >= 0.5 * thisStageControlZone.CoolThroRange) { + thisZoneThermostatSetPointHi = thisStageControlZone.CoolSetPoint - 0.5 * thisStageControlZone.CoolThroRange; + } else { + thisZoneThermostatSetPointHi = thisStageControlZone.CoolSetPoint + 0.5 * thisStageControlZone.CoolThroRange; + } + thisZoneThermostatSetPointLo = thisZoneThermostatSetPointHi; + } else if (thisStageControlZone.HeatSetPoint > ZoneT) { // heating + Real64 SetpointOffset = ZoneT - thisStageControlZone.HeatSetPoint; + int Itemp = 0; + for (int I = 1; I <= thisStageControlZone.NumOfHeatStages; ++I) { + if (std::abs(SetpointOffset) >= std::abs(thisStageControlZone.HeatTOffset(I))) { + Itemp = I; + } + } + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum = Itemp; + if (std::abs(SetpointOffset) >= 0.5 * thisStageControlZone.CoolThroRange) { + thisZoneThermostatSetPointLo = thisStageControlZone.HeatSetPoint + 0.5 * thisStageControlZone.HeatThroRange; + } else { + thisZoneThermostatSetPointLo = thisStageControlZone.HeatSetPoint - 0.5 * thisStageControlZone.HeatThroRange; + } + thisZoneThermostatSetPointHi = thisZoneThermostatSetPointLo; + } else { + thisZoneThermostatSetPointHi = thisStageControlZone.CoolSetPoint + 0.5 * thisStageControlZone.CoolThroRange; + thisZoneThermostatSetPointLo = thisStageControlZone.HeatSetPoint - 0.5 * thisStageControlZone.HeatThroRange; + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum = 0; + } + // SpaceHB TODO: For now, set space stagenum to zone stagenum - later need to see what space the thermostat is in + if (state.dataHeatBal->doSpaceHeatBalance) { + for (int spaceNum : state.dataHeatBal->Zone(ActualZoneNum).spaceIndexes) { + state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).StageNum = + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum; + } + } + } + } + + // Setpoint revision for onoff thermostat + if (state.dataZoneTempPredictorCorrector->NumOnOffCtrZone > 0) { + Real64 TempTole = 0.02; + Real64 Tprev; + for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumTempControlledZones; ++RelativeZoneNum) { + auto &thisTempControlledZone = state.dataZoneCtrls->TempControlledZone(RelativeZoneNum); + if (thisTempControlledZone.DeltaTCutSet > 0.0) { + if (ShortenTimeStepSys) { + thisTempControlledZone.HeatModeLast = thisTempControlledZone.HeatModeLastSave; + thisTempControlledZone.CoolModeLast = thisTempControlledZone.CoolModeLastSave; + } else { + thisTempControlledZone.HeatModeLastSave = thisTempControlledZone.HeatModeLast; + thisTempControlledZone.CoolModeLastSave = thisTempControlledZone.CoolModeLast; + } + auto &thisTempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint(thisTempControlledZone.ActualZoneNum); + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(thisTempControlledZone.ActualZoneNum); + auto &thisZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(thisTempControlledZone.ActualZoneNum); + auto &thisZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(thisTempControlledZone.ActualZoneNum); + + thisTempControlledZone.CoolOffFlag = false; + thisTempControlledZone.HeatOffFlag = false; + if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::ThirdOrder) { + Tprev = thisZoneHB.MAT; + if (ShortenTimeStepSys) Tprev = thisZoneHB.XMPT; + } else { + Tprev = thisZoneHB.ZoneT1; + } + + switch (state.dataHeatBalFanSys->TempControlType(thisTempControlledZone.ActualZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo; + thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; + if (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + TempTole) { + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; + thisZoneThermostatSetPointLo = thisTempZoneThermostatSetPoint; + } else if (Tprev > thisTempControlledZone.ZoneThermostatSetPointLo && + (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet - TempTole)) { + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; + thisZoneThermostatSetPointLo = thisTempZoneThermostatSetPoint; + } else { + thisTempControlledZone.HeatOffFlag = true; + } + if (thisTempControlledZone.HeatModeLast && Tprev > thisTempControlledZone.ZoneThermostatSetPointLo) { + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo; + thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; + thisTempControlledZone.HeatOffFlag = true; + } + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi; + thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; + if (Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - TempTole) { + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; + thisZoneThermostatSetPointHi = thisTempZoneThermostatSetPoint; + } else if (Tprev < thisTempControlledZone.ZoneThermostatSetPointHi && + Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet + TempTole) { + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; + thisZoneThermostatSetPointHi = thisTempZoneThermostatSetPoint; + } else { + thisTempControlledZone.CoolOffFlag = true; + } + if (thisTempControlledZone.CoolModeLast && Tprev < thisTempControlledZone.ZoneThermostatSetPointHi) { + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi; + thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; + thisTempControlledZone.CoolOffFlag = true; + } + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; + thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; + if (Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - TempTole) { + thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; + } else if (Tprev < thisTempControlledZone.ZoneThermostatSetPointHi && + Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet + TempTole) { + thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; + } else { + thisTempControlledZone.CoolOffFlag = true; + } + if (thisTempControlledZone.CoolModeLast && Tprev < thisTempControlledZone.ZoneThermostatSetPointHi) { + thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; + thisTempControlledZone.CoolOffFlag = true; + } + + if (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + TempTole) { + thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; + } else if (Tprev > thisTempControlledZone.ZoneThermostatSetPointLo && + (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet - TempTole)) { + thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; + } else { + thisTempControlledZone.HeatOffFlag = true; + } + if (thisTempControlledZone.HeatModeLast && Tprev > thisTempControlledZone.ZoneThermostatSetPointLo) { + thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; + thisTempControlledZone.HeatOffFlag = true; + } + // check setpoint for both and provde an error message + if (thisZoneThermostatSetPointLo >= thisZoneThermostatSetPointHi) { + ShowSevereError(state, + "DualSetPointWithDeadBand: When Temperature Difference Between Cutout And Setpoint is applied, the heating " + "setpoint is greater than the cooling setpoint. "); + ShowContinueErrorTimeStamp(state, "occurs in Zone=" + state.dataHeatBal->Zone(thisTempControlledZone.ActualZoneNum).Name); + ShowContinueError(state, format("Zone Heating ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointLo)); + ShowContinueError(state, format("Zone Cooling ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointHi)); + ShowFatalError(state, "Program terminates due to above conditions."); + } + break; + default: + break; + } + } + } + } + + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).predictSystemLoad( + state, ShortenTimeStepSys, UseZoneTimeStepHistory, PriorTimeStep, zoneNum); + if (state.dataHeatBal->doSpaceHeatBalance) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).predictSystemLoad( + state, ShortenTimeStepSys, UseZoneTimeStepHistory, PriorTimeStep, zoneNum, spaceNum); + } + } + } + if (state.dataZoneTempPredictorCorrector->NumOnOffCtrZone > 0) { + for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumTempControlledZones; ++RelativeZoneNum) { + auto &thisTempControlledZone = state.dataZoneCtrls->TempControlledZone(RelativeZoneNum); + if (thisTempControlledZone.DeltaTCutSet > 0.0) { + int ZoneNum = thisTempControlledZone.ActualZoneNum; + if (thisTempControlledZone.CoolOffFlag && state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneNum).TotalOutputRequired >= 0.0) { + thisTempControlledZone.CoolModeLast = true; + } else { + thisTempControlledZone.CoolModeLast = false; + } + if (thisTempControlledZone.HeatOffFlag && state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneNum).TotalOutputRequired <= 0.0) { + thisTempControlledZone.HeatModeLast = true; + } else { + thisTempControlledZone.HeatModeLast = false; + } + } + } + } +} +void ZoneSpaceHeatBalanceData::predictSystemLoad( + EnergyPlusData &state, + bool const shortenTimeStepSys, + bool const useZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step + Real64 const priorTimeStep, // the old value for timestep length is passed for possible use in interpolating + int zoneNum, + int spaceNum) +{ + assert(zoneNum > 0); + this->updateTemperatures(state, shortenTimeStepSys, useZoneTimeStepHistory, priorTimeStep, zoneNum, spaceNum); + + Real64 volume = 0.0; + if (spaceNum > 0) { + volume = state.dataHeatBal->space(spaceNum).Volume; + } else { + volume = state.dataHeatBal->Zone(zoneNum).Volume; + } + this->AirPowerCap = volume * state.dataHeatBal->Zone(zoneNum).ZoneVolCapMultpSens * + Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->MAT, this->ZoneAirHumRat) * + Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat) / (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); + Real64 RAFNFrac = 0.0; + + // Calculate the various heat balance sums + + // NOTE: SumSysMCp and SumSysMCpT are not used in the predict step + this->calcZoneOrSpaceSums(state, false, zoneNum, spaceNum); + + // Sum all convective internal gains except for people: SumIntGainExceptPeople + if (spaceNum == 0 && state.dataHybridModel->FlagHybridModel_PC) { + this->SumIntGainExceptPeople = 0.0; + this->SumIntGainExceptPeople = InternalHeatGains::SumAllInternalConvectionGainsExceptPeople(state, zoneNum); + } + + this->TempDepCoef = this->SumHA + this->SumMCp; + this->TempIndCoef = this->SumIntGain + this->SumHATsurf - this->SumHATref + this->SumMCpT + this->SysDepZoneLoadsLagged; + this->TempHistoryTerm = this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2]); + this->TempDepZnLd = (11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef; + this->TempIndZnLd = this->TempHistoryTerm + this->TempIndCoef; + if (state.dataRoomAirMod->anyNonMixingRoomAirModel) { + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + // RoomAirflowNetworkModel - make dynamic term independent of TimeStepSys + auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); + if (thisRoomAirflowNetworkZoneInfo.IsUsed) { + int RoomAirNode = thisRoomAirflowNetworkZoneInfo.ControlAirNodeID; + RoomAirModelAirflowNetwork::LoadPredictionRoomAirModelAirflowNetwork(state, zoneNum, RoomAirNode); + this->TempDepCoef = + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumHA + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumLinkMCp; + this->TempIndCoef = thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumIntSensibleGain + + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumHATsurf - + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumHATref + + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumLinkMCpT + + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SysDepZoneLoadsLagged; + this->AirPowerCap = thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).AirVolume * + state.dataHeatBal->Zone(zoneNum).ZoneVolCapMultpSens * thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).RhoAir * + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).CpAir / + (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); + this->TempHistoryTerm = this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2]); + this->TempDepZnLd = (11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef; + this->TempIndZnLd = this->TempHistoryTerm + this->TempIndCoef; + if (thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).HasHVACAssigned) + RAFNFrac = thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).HVAC(1).SupplyFraction; + } + } + } + + // Exact solution or Euler method + state.dataHVACGlobal->ShortenTimeStepSysRoomAir = false; + if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) { + if (shortenTimeStepSys && state.dataHVACGlobal->TimeStepSys < state.dataGlobal->TimeStepZone) { + if (state.dataHVACGlobal->PreviousTimeStep < state.dataGlobal->TimeStepZone) { + this->ZoneT1 = this->ZoneTM2; + this->ZoneW1 = this->ZoneWM2; + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); + for (int LoopNode = 1; LoopNode <= thisRoomAirflowNetworkZoneInfo.NumOfAirNodes; ++LoopNode) { + thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempT1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempTM2; + thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatW1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatWM2; + } + } + } else { + this->ZoneT1 = this->ZoneTMX; + this->ZoneW1 = this->ZoneWMX; + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); + for (int LoopNode = 1; LoopNode <= thisRoomAirflowNetworkZoneInfo.NumOfAirNodes; ++LoopNode) { + thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempT1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempTMX; + thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatW1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatWMX; + } + } + } + state.dataHVACGlobal->ShortenTimeStepSysRoomAir = true; + } else { + this->ZoneT1 = this->ZT; + this->ZoneW1 = this->ZoneAirHumRat; + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); + for (int LoopNode = 1; LoopNode <= thisRoomAirflowNetworkZoneInfo.NumOfAirNodes; ++LoopNode) { + thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempT1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTemp; + thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatW1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRat; + } + } + } + this->TempDepZnLd = this->TempDepCoef; + this->TempIndZnLd = this->TempIndCoef; + } + + // Calculate the predicted zone load to be provided by the system with the given desired zone air temperature + this->calcPredictedSystemLoad(state, RAFNFrac, zoneNum, spaceNum); + + // Calculate the predicted zone load to be provided by the system with the given desired humidity ratio + this->calcPredictedHumidityRatio(state, RAFNFrac, zoneNum, spaceNum); +} + +void CalcZoneAirTempSetPoints(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Russ Taylor + // DATE WRITTEN Nov 1997 + // MODIFIED Aug 2013, Xiufeng Pang (XP) - Added code for updating set points during + // optimum start period + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This routine sets what the setpoints for each controlled zone should be based on schedules. + // This is called each time step. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int RelativeZoneNum; + int ActualZoneNum; + int TempControlSchedIndex; + int SetPointTempSchedIndexHot; + int SetPointTempSchedIndexCold; + int SchedNameIndex; + Array2D DaySPValues; // Day room temp setpoint values - for optimum start + int OccStartTime; // Occupancy start time - for optimum start + Real64 DeltaT; // Temperature difference between cutout and setpoint + + auto &Zone = state.dataHeatBal->Zone; + auto &TempControlledZone = state.dataZoneCtrls->TempControlledZone; + auto &TempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint; + auto &TempControlType = state.dataHeatBalFanSys->TempControlType; + auto &TempControlTypeRpt = state.dataHeatBalFanSys->TempControlTypeRpt; + auto &ZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo; + auto &ZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi; + auto &NumOfZones = state.dataGlobal->NumOfZones; + + TempControlType = DataHVACGlobals::ThermostatType::Uncontrolled; // Default + + // Place holder for occupied heating and cooling set points - for optimum start + if (!allocated(state.dataZoneCtrls->OccRoomTSetPointHeat)) { + state.dataZoneCtrls->OccRoomTSetPointHeat.allocate(NumOfZones); + } + if (!allocated(state.dataZoneCtrls->OccRoomTSetPointCool)) { + state.dataZoneCtrls->OccRoomTSetPointCool.allocate(NumOfZones); + } + state.dataZoneCtrls->OccRoomTSetPointHeat = 0.0; + state.dataZoneCtrls->OccRoomTSetPointCool = 100.0; + DeltaT = 0.0; + + for (RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumTempControlledZones; ++RelativeZoneNum) { + + // What if this zone not controlled??? + ActualZoneNum = TempControlledZone(RelativeZoneNum).ActualZoneNum; + TempControlSchedIndex = TempControlledZone(RelativeZoneNum).CTSchedIndex; + TempControlType(ActualZoneNum) = + static_cast(ScheduleManager::GetCurrentScheduleValue(state, TempControlSchedIndex)); + TempControlTypeRpt(ActualZoneNum) = static_cast(TempControlType(ActualZoneNum)); + // Error detection for these values is done in the Get routine + + switch (TempControlType(ActualZoneNum)) { + case DataHVACGlobals::ThermostatType::Uncontrolled: + break; + case DataHVACGlobals::ThermostatType::SingleHeating: + SchedNameIndex = TempControlledZone(RelativeZoneNum).SchIndx_SingleHeatSetPoint; + TempZoneThermostatSetPoint(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SchedNameIndex); + TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointLo = TempZoneThermostatSetPoint(ActualZoneNum); + + AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); + ZoneThermostatSetPointLo(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + SchedNameIndex = TempControlledZone(RelativeZoneNum).SchIndx_SingleCoolSetPoint; + TempZoneThermostatSetPoint(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SchedNameIndex); + TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointHi = TempZoneThermostatSetPoint(ActualZoneNum); + + // Added Jan 17 (X. Luo) + // Adjust operative temperature based on adaptive comfort model + if ((TempControlledZone(RelativeZoneNum).AdaptiveComfortTempControl)) { + AdjustOperativeSetPointsforAdapComfort(state, RelativeZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); + state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + } + + AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); + ZoneThermostatSetPointHi(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + + AdjustCoolingSetPointforTempAndHumidityControl(state, RelativeZoneNum, ActualZoneNum); + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + + SchedNameIndex = TempControlledZone(RelativeZoneNum).SchIndx_SingleHeatCoolSetPoint; + + TempZoneThermostatSetPoint(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SchedNameIndex); + + // Added Jan 17 (X. Luo) + // Adjust operative temperature based on adaptive comfort model + if ((TempControlledZone(RelativeZoneNum).AdaptiveComfortTempControl)) { + AdjustOperativeSetPointsforAdapComfort(state, RelativeZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); + state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + } + + AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); + + ZoneThermostatSetPointHi(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + ZoneThermostatSetPointLo(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + + // Change the room set point to occupied set point during optimum start period-------------- + + if (allocated(state.dataHVACGlobal->OptStartData.OptStartFlag)) { + if (!allocated(DaySPValues)) { + DaySPValues.allocate(state.dataGlobal->NumOfTimeStepInHour, 24); + } + if (state.dataHVACGlobal->OptStartData.ActualZoneNum(ActualZoneNum) == ActualZoneNum) { + ScheduleManager::GetScheduleValuesForDay(state, SetPointTempSchedIndexCold, DaySPValues); + OccStartTime = CEILING(state.dataHVACGlobal->OptStartData.OccStartTime(ActualZoneNum)) + 1; + TempZoneThermostatSetPoint(ActualZoneNum) = DaySPValues(1, OccStartTime); + } + + if (state.dataHVACGlobal->OptStartData.OptStartFlag(ActualZoneNum)) { + ZoneThermostatSetPointHi(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + ZoneThermostatSetPointLo(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + } + } + //-------------------------------------------------------------------------------------------- + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + SetPointTempSchedIndexHot = TempControlledZone(RelativeZoneNum).SchIndx_DualSetPointWDeadBandHeat; + SetPointTempSchedIndexCold = TempControlledZone(RelativeZoneNum).SchIndx_DualSetPointWDeadBandCool; + + ZoneThermostatSetPointHi(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SetPointTempSchedIndexCold); + TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointHi = ZoneThermostatSetPointHi(ActualZoneNum); + + // Added Jan 17 (X. Luo) + // Adjust operative temperature based on adaptive comfort model + if ((TempControlledZone(RelativeZoneNum).AdaptiveComfortTempControl)) { + AdjustOperativeSetPointsforAdapComfort(state, RelativeZoneNum, ZoneThermostatSetPointHi(ActualZoneNum)); + state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(ActualZoneNum) = ZoneThermostatSetPointHi(ActualZoneNum); + } + + AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, ZoneThermostatSetPointHi(ActualZoneNum)); + + ZoneThermostatSetPointLo(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SetPointTempSchedIndexHot); + TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointLo = ZoneThermostatSetPointLo(ActualZoneNum); + AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, ZoneThermostatSetPointLo(ActualZoneNum)); + + // Change the room set point to occupied set point during optimum start period-------------- + + if (allocated(state.dataHVACGlobal->OptStartData.OptStartFlag)) { + if (!allocated(DaySPValues)) { + DaySPValues.allocate(state.dataGlobal->NumOfTimeStepInHour, 24); + } + if (state.dataHVACGlobal->OptStartData.ActualZoneNum(ActualZoneNum) == ActualZoneNum) { + ScheduleManager::GetScheduleValuesForDay(state, SetPointTempSchedIndexCold, DaySPValues); + OccStartTime = CEILING(state.dataHVACGlobal->OptStartData.OccStartTime(ActualZoneNum)) + 1; + state.dataZoneCtrls->OccRoomTSetPointCool(ActualZoneNum) = DaySPValues(1, OccStartTime); + ScheduleManager::GetScheduleValuesForDay(state, SetPointTempSchedIndexHot, DaySPValues); + state.dataZoneCtrls->OccRoomTSetPointHeat(ActualZoneNum) = DaySPValues(1, OccStartTime); + } + + if (state.dataHVACGlobal->OptStartData.OptStartFlag(ActualZoneNum)) { + ZoneThermostatSetPointHi(ActualZoneNum) = state.dataZoneCtrls->OccRoomTSetPointCool(ActualZoneNum); + ZoneThermostatSetPointLo(ActualZoneNum) = state.dataZoneCtrls->OccRoomTSetPointHeat(ActualZoneNum); + } + } + //-------------------------------------------------------------------------------------------- + + AdjustCoolingSetPointforTempAndHumidityControl(state, RelativeZoneNum, ActualZoneNum); + break; + default: + ShowSevereError(state, + format("CalcZoneAirTempSetpoints: Illegal control type for Zone={}, Found value={}, in Schedule={}", + Zone(ActualZoneNum).Name, + TempControlType(ActualZoneNum), + TempControlledZone(RelativeZoneNum).ControlTypeSchedName)); + + break; + } + + // Apply offset for faulty therostats + if ((state.dataFaultsMgr->NumFaultyThermostat > 0) && (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing) && + (!state.dataGlobal->KickOffSimulation)) { + // loop through the FaultsThermostatOffset objects to find the one for the zone + for (int iFault = 1; iFault <= state.dataFaultsMgr->NumFaultyThermostat; ++iFault) { + + if (UtilityRoutines::SameString(TempControlledZone(RelativeZoneNum).Name, + state.dataFaultsMgr->FaultsThermostatOffset(iFault).FaultyThermostatName)) { + + // Check fault availability schedules + if (ScheduleManager::GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsThermostatOffset(iFault).AvaiSchedPtr) > 0.0) { + + // Check fault severity schedules to update the reference thermostat offset + double rSchVal = 1.0; + double offsetUpdated; + if (state.dataFaultsMgr->FaultsThermostatOffset(iFault).SeveritySchedPtr >= 0) { + rSchVal = + ScheduleManager::GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsThermostatOffset(iFault).SeveritySchedPtr); + } + offsetUpdated = rSchVal * state.dataFaultsMgr->FaultsThermostatOffset(iFault).Offset; + + // Positive offset means the sensor reading is higher than the actual value + TempZoneThermostatSetPoint(ActualZoneNum) -= offsetUpdated; + ZoneThermostatSetPointLo(ActualZoneNum) -= offsetUpdated; + ZoneThermostatSetPointHi(ActualZoneNum) -= offsetUpdated; + } + + // Stop searching the FaultsThermostatOffset object for the zone + break; + } + } + } + } + + if (state.dataZoneCtrls->NumComfortControlledZones > 0) CalcZoneAirComfortSetPoints(state); + OverrideAirSetPointsforEMSCntrl(state); +} + +void ZoneSpaceHeatBalanceData::calcPredictedHumidityRatio(EnergyPlusData &state, Real64 const RAFNFrac, int const zoneNum, int const spaceNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Richard J. Liesen + // DATE WRITTEN May 2001 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine does the prediction step for humidity control + + // METHODOLOGY EMPLOYED: + // This solves for the required system moisture required to try and achieve the desired + // Humidity Ratio in the Zone + + // REFERENCES: + // Routine FinalZnCalcs - FINAL ZONE CALCULATIONS, authored by Dale Herron + // for BLAST. + + static constexpr std::string_view RoutineName("calcPredictedHumidityRatio"); + + Real64 ZoneRHHumidifyingSetPoint = 0.0; // Zone humidifying set point (%) + Real64 ZoneRHDehumidifyingSetPoint = 0.0; // Zone dehumidifying set point (%) + + auto &thisZone = state.dataHeatBal->Zone(zoneNum); + bool SingleSetPoint = false; // This determines whether both setpoint are equal or not + + // Check to see if this is a "humidity controlled zone" + bool ControlledHumidZoneFlag = false; + // Check all the controlled zones to see if it matches the zone simulated + if (thisZone.humidityControlZoneIndex > 0) { + auto &humidityControlZone = state.dataZoneCtrls->HumidityControlZone(thisZone.humidityControlZoneIndex); + assert(humidityControlZone.ActualZoneNum == zoneNum); + ZoneRHHumidifyingSetPoint = ScheduleManager::GetCurrentScheduleValue(state, humidityControlZone.HumidifyingSchedIndex); + ZoneRHDehumidifyingSetPoint = ScheduleManager::GetCurrentScheduleValue(state, humidityControlZone.DehumidifyingSchedIndex); + + // Apply EMS values to overwrite the humidistat values + if (humidityControlZone.EMSOverrideHumidifySetPointOn) { + ZoneRHHumidifyingSetPoint = humidityControlZone.EMSOverrideHumidifySetPointValue; + } + if (humidityControlZone.EMSOverrideDehumidifySetPointOn) { + ZoneRHDehumidifyingSetPoint = humidityControlZone.EMSOverrideDehumidifySetPointValue; + } + + // Apply offsets for faulty humidistats + if ((state.dataFaultsMgr->NumFaultyHumidistat > 0) && (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing) && + (!state.dataGlobal->KickOffSimulation)) { + + // loop through the FaultsHumidistatOffset objects to find the one for the zone + for (int iFault = 1; iFault <= state.dataFaultsMgr->NumFaultyHumidistat; ++iFault) { + + if (UtilityRoutines::SameString(humidityControlZone.ControlName, + state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyHumidistatName)) { + + if (UtilityRoutines::SameString(state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyHumidistatType, + "ThermostatOffsetDependent")) { + // For Humidistat Offset Type I: ThermostatOffsetDependent + + bool IsThermostatFound = false; + double offsetThermostat = 0.0; + double offsetZoneRHHumidifyingSetPoint = 0.0; + double offsetZoneRHDehumidifyingSetPoint = 0.0; + double faultZoneWHumidifyingSetPoint; + double faultZoneWDehumidifyingSetPoint; + + // Get the offset value of the corresponding thermostat fault object + if (state.dataFaultsMgr->NumFaultyThermostat > 0) { + + // loop through the FaultsThermostatOffset objects to find the one causes the Humidistat Offset + for (int iFaultThermo = 1; iFaultThermo <= state.dataFaultsMgr->NumFaultyThermostat; ++iFaultThermo) { + + if (UtilityRoutines::SameString(state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyThermostatName, + state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).Name)) { + IsThermostatFound = true; + + // Check fault availability schedules + if (ScheduleManager::GetCurrentScheduleValue( + state, state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).AvaiSchedPtr) > 0.0) { + + // Check fault severity schedules to update the reference thermostat offset + double rSchVal = 1.0; + if (state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).SeveritySchedPtr >= 0) { + rSchVal = ScheduleManager::GetCurrentScheduleValue( + state, state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).SeveritySchedPtr); + } + offsetThermostat = rSchVal * state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).Offset; + } + + // Stop searching the FaultsThermostatOffset object for the Humidistat Offset + break; + } + } + } + + // The FaultsThermostatOffset specified in the FaultHumidistatOffset is not found + if (!IsThermostatFound) { + ShowSevereError(state, + "FaultModel:HumidistatOffset = \"" + state.dataFaultsMgr->FaultsHumidistatOffset(iFault).Name + + "\" invalid Reference Humidistat Offset Name = \"" + + state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyThermostatName + "\" not found."); + ShowFatalError(state, "Errors getting FaultModel input data. Preceding condition(s) cause termination."); + } + + if (offsetThermostat != 0.0) { + // Calculate the humidistat offset value from the thermostat offset value + faultZoneWHumidifyingSetPoint = Psychrometrics::PsyWFnTdbRhPb( + state, (this->MAT + offsetThermostat), (ZoneRHHumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress); + faultZoneWDehumidifyingSetPoint = Psychrometrics::PsyWFnTdbRhPb( + state, (this->MAT + offsetThermostat), (ZoneRHDehumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress); + offsetZoneRHHumidifyingSetPoint = + ZoneRHHumidifyingSetPoint - + Psychrometrics::PsyRhFnTdbWPb(state, this->MAT, faultZoneWHumidifyingSetPoint, state.dataEnvrn->OutBaroPress) * 100.0; + offsetZoneRHDehumidifyingSetPoint = + ZoneRHDehumidifyingSetPoint - + Psychrometrics::PsyRhFnTdbWPb(state, this->MAT, faultZoneWDehumidifyingSetPoint, state.dataEnvrn->OutBaroPress) * + 100.0; + + // Apply the calculated humidistat offset value + // Positive offset means the sensor reading is higher than the actual value + ZoneRHHumidifyingSetPoint -= offsetZoneRHHumidifyingSetPoint; + ZoneRHDehumidifyingSetPoint -= offsetZoneRHDehumidifyingSetPoint; + + // constrain value to something reasonable + ZoneRHHumidifyingSetPoint = min(100.0, max(0.0, ZoneRHHumidifyingSetPoint)); + ZoneRHDehumidifyingSetPoint = min(100.0, max(0.0, ZoneRHDehumidifyingSetPoint)); + } + + } else { + // For Humidistat Offset Type II: ThermostatOffsetIndependent + + // Check fault availability schedules + if (ScheduleManager::GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsHumidistatOffset(iFault).AvaiSchedPtr) > 0.0) { + + // Check fault severity schedules to update the reference humidistat offset + double rSchVal = 1.0; + double offsetUpdated; + if (state.dataFaultsMgr->FaultsHumidistatOffset(iFault).SeveritySchedPtr >= 0) { + rSchVal = ScheduleManager::GetCurrentScheduleValue( + state, state.dataFaultsMgr->FaultsHumidistatOffset(iFault).SeveritySchedPtr); + } + offsetUpdated = rSchVal * state.dataFaultsMgr->FaultsHumidistatOffset(iFault).Offset; + + // Positive offset means the sensor reading is higher than the actual value + ZoneRHHumidifyingSetPoint -= offsetUpdated; + ZoneRHDehumidifyingSetPoint -= offsetUpdated; + + // constrain value to something reasonable + ZoneRHHumidifyingSetPoint = min(100.0, max(0.0, ZoneRHHumidifyingSetPoint)); + ZoneRHDehumidifyingSetPoint = min(100.0, max(0.0, ZoneRHDehumidifyingSetPoint)); + } + } + break; + } + } + } + + // Run-time error check + if (ZoneRHHumidifyingSetPoint > ZoneRHDehumidifyingSetPoint) { + if (humidityControlZone.ErrorIndex == 0) { + ShowWarningMessage(state, + "HUMIDISTAT: The humidifying setpoint is above the dehumidifying setpoint in " + humidityControlZone.ControlName); + ShowContinueError(state, "The zone humidifying setpoint is set to the dehumidifying setpoint."); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "The humidifying setpoint is still above the dehumidifying setpoint", + humidityControlZone.ErrorIndex, + ZoneRHHumidifyingSetPoint, + ZoneRHHumidifyingSetPoint); + ZoneRHHumidifyingSetPoint = ZoneRHDehumidifyingSetPoint; + } + if (ZoneRHHumidifyingSetPoint == ZoneRHDehumidifyingSetPoint) SingleSetPoint = true; + ControlledHumidZoneFlag = true; + + } // HumidControlledZoneNum + + // if zone latent sizing is requested but no humidistat exists + if (state.dataGlobal->DoingSizing && !ControlledHumidZoneFlag && state.dataHeatBal->DoLatentSizing) { + for (size_t zoneEqConfigNum = 1; zoneEqConfigNum <= state.dataZoneEquip->ZoneEquipConfig.size(); ++zoneEqConfigNum) { + auto &zoneEqConfig = state.dataZoneEquip->ZoneEquipConfig(zoneEqConfigNum); + if (!zoneEqConfig.IsControlled) continue; + int ZoneSizNum = + UtilityRoutines::FindItemInList(zoneEqConfig.ZoneName, state.dataSize->ZoneSizingInput, &DataSizing::ZoneSizingInputData::ZoneName); + // should use the first Sizing:Zone object if not found + if (ZoneSizNum == 0 && !state.dataSize->ZoneSizingInput.empty()) ZoneSizNum = 1; + if (ZoneSizNum > 0) { + auto &zoneSizingInput = state.dataSize->ZoneSizingInput(ZoneSizNum); + if (zoneSizingInput.zoneLatentSizing) { + ZoneRHDehumidifyingSetPoint = (zoneSizingInput.zoneRHDehumidifySchIndex) + ? ScheduleManager::GetCurrentScheduleValue(state, zoneSizingInput.zoneRHDehumidifySchIndex) + : zoneSizingInput.zoneRHDehumidifySetPoint; + ZoneRHHumidifyingSetPoint = (zoneSizingInput.zoneRHHumidifySchIndex) + ? ScheduleManager::GetCurrentScheduleValue(state, zoneSizingInput.zoneRHHumidifySchIndex) + : zoneSizingInput.zoneRHHumidifySetPoint; + if (ZoneRHHumidifyingSetPoint > ZoneRHDehumidifyingSetPoint) ZoneRHHumidifyingSetPoint = ZoneRHDehumidifyingSetPoint; + if (ZoneRHHumidifyingSetPoint == ZoneRHDehumidifyingSetPoint) SingleSetPoint = true; + ControlledHumidZoneFlag = true; + } + } + break; + } + } + + Real64 LoadToHumidifySetPoint = 0.0; // Moisture load at humidifying set point + Real64 LoadToDehumidifySetPoint = 0.0; // Moisture load at dehumidifying set point + Real64 totalOutputRequired = 0.0; + if (ControlledHumidZoneFlag) { + + // Calculate hourly humidity ratio from infiltration + humidity added from latent load + // to determine system added/subtracted moisture. + Real64 LatentGain = + this->ZoneLatentGain + state.dataHeatBalFanSys->SumLatentHTRadSys(zoneNum) + state.dataHeatBalFanSys->SumLatentPool(zoneNum); + + Real64 SysTimeStepInSeconds = DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys; + + // Calculate the coefficients for the 3rd Order derivative for final + // zone humidity ratio. The A, B, C coefficients are analogous to the heat balance. + // SumHmARaW and SumHmARa will be used with the Moisture Balance on the building elements and + // are currently set to zero when the CTF only version is used. + + // The density of air and latent heat of vaporization are calculated as functions. + Real64 RhoAir = Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->ZT, this->ZoneAirHumRat, RoutineName); + Real64 H2OHtOfVap = Psychrometrics::PsyHgAirFnWTdb(this->ZoneAirHumRat, this->ZT); + + // Assume that the system will have flow + Real64 A = 0.0; + Real64 B = 0.0; + Real64 C = 0.0; + if (state.afn->multizone_always_simulated || + (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && + state.afn->AirflowNetworkFanActivated)) { + // Multizone airflow calculated in AirflowNetwork + B = (LatentGain / H2OHtOfVap) + state.afn->exchangeData(zoneNum).SumMHrW + state.afn->exchangeData(zoneNum).SumMMHrW + this->SumHmARaW; + A = state.afn->exchangeData(zoneNum).SumMHr + state.afn->exchangeData(zoneNum).SumMMHr + this->SumHmARa; + } else { + B = (LatentGain / H2OHtOfVap) + ((this->OAMFL + this->VAMFL + this->CTMFL) * state.dataEnvrn->OutHumRat) + this->EAMFLxHumRat + + this->SumHmARaW + this->MixingMassFlowXHumRat + this->MDotOA * state.dataEnvrn->OutHumRat; + A = this->OAMFL + this->VAMFL + this->EAMFL + this->CTMFL + this->SumHmARa + this->MixingMassFlowZone + this->MDotOA; + } + Real64 volume = 0.0; + if (spaceNum > 0) { + volume = state.dataHeatBal->space(spaceNum).Volume; + } else { + volume = thisZone.Volume; + } + C = RhoAir * volume * thisZone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; + + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + auto &roomAFNInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); + int RoomAirNode = roomAFNInfo.ControlAirNodeID; + H2OHtOfVap = Psychrometrics::PsyHgAirFnWTdb(roomAFNInfo.Node(RoomAirNode).HumRat, roomAFNInfo.Node(RoomAirNode).AirTemp); + A = roomAFNInfo.Node(RoomAirNode).SumLinkM + roomAFNInfo.Node(RoomAirNode).SumHmARa; + B = (roomAFNInfo.Node(RoomAirNode).SumIntLatentGain / H2OHtOfVap) + roomAFNInfo.Node(RoomAirNode).SumLinkMW + + roomAFNInfo.Node(RoomAirNode).SumHmARaW; + C = roomAFNInfo.Node(RoomAirNode).RhoAir * roomAFNInfo.Node(RoomAirNode).AirVolume * thisZone.ZoneVolCapMultpMoist / + (DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys); + } + + // Use a 3rd Order derivative to predict zone moisture addition or removal and + // smooth the changes using the zone air capacitance. Positive values of Moist Load means that + // this amount of moisture must be added to the zone to reach the setpoint. Negative values represent + // the amount of moisture that must be removed by the system. + // MoistLoadHumidSetPoint = massflow * HumRat = kgDryAir/s * kgWater/kgDryAir = kgWater/s + Real64 WZoneSetPoint = + Psychrometrics::PsyWFnTdbRhPb(state, this->ZT, (ZoneRHHumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress, RoutineName); + Real64 exp_700_A_C(0.0); + if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::ThirdOrder) { + LoadToHumidifySetPoint = + ((11.0 / 6.0) * C + A) * WZoneSetPoint - + (B + C * (3.0 * this->WPrevZoneTSTemp[0] - (3.0 / 2.0) * this->WPrevZoneTSTemp[1] + (1.0 / 3.0) * this->WPrevZoneTSTemp[2])); + // Exact solution + } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::AnalyticalSolution) { + if (A == 0.0) { // B=0 + LoadToHumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) - B; + } else { + exp_700_A_C = std::exp(min(700.0, -A / C)); // Tuned Save expensive value + LoadToHumidifySetPoint = A * (WZoneSetPoint - this->ZoneW1 * exp_700_A_C) / (1.0 - exp_700_A_C) - B; + } + } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::EulerMethod) { + LoadToHumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) + A * WZoneSetPoint - B; + } + if (RAFNFrac > 0.0) LoadToHumidifySetPoint = LoadToHumidifySetPoint / RAFNFrac; + WZoneSetPoint = + Psychrometrics::PsyWFnTdbRhPb(state, this->ZT, (ZoneRHDehumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress, RoutineName); + if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::ThirdOrder) { + LoadToDehumidifySetPoint = + ((11.0 / 6.0) * C + A) * WZoneSetPoint - + (B + C * (3.0 * this->WPrevZoneTSTemp[0] - (3.0 / 2.0) * this->WPrevZoneTSTemp[1] + (1.0 / 3.0) * this->WPrevZoneTSTemp[2])); + // Exact solution + } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::AnalyticalSolution) { + if (A == 0.0) { // B=0 + LoadToDehumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) - B; + } else { + LoadToDehumidifySetPoint = A * (WZoneSetPoint - this->ZoneW1 * exp_700_A_C) / (1.0 - exp_700_A_C) - B; // exp_700_A_C set above + } + } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::EulerMethod) { + LoadToDehumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) + A * WZoneSetPoint - B; + } + if (RAFNFrac > 0.0) LoadToDehumidifySetPoint = LoadToDehumidifySetPoint / RAFNFrac; + + // The load is added to the TotalOutputRequired as in the Temperature Predictor. There is also the remaining + // output variable for those who will use this for humidity control and stored in DataZoneEnergyDemands with the + // analogous temperature terms. + + if (SingleSetPoint) { + totalOutputRequired = LoadToHumidifySetPoint; + } else { + if (LoadToHumidifySetPoint > 0.0 && LoadToDehumidifySetPoint > 0.0) { + totalOutputRequired = LoadToHumidifySetPoint; + } else if (LoadToHumidifySetPoint < 0.0 && LoadToDehumidifySetPoint < 0.0) { + totalOutputRequired = LoadToDehumidifySetPoint; + } else if (LoadToHumidifySetPoint <= 0.0 && LoadToDehumidifySetPoint >= 0.0) { // deadband includes zero loads + totalOutputRequired = 0.0; + } else { // this should never occur! + ShowSevereError( + state, "Humidistat: Unanticipated combination of humidifying and dehumidifying loads - report to EnergyPlus Development Team"); + ShowContinueErrorTimeStamp(state, format("occurs in Zone = {}", thisZone.Name)); + ShowContinueError( + state, + format("LoadToHumidifySetPoint={:.5R}, LoadToDehumidifySetPoint={:.5R}", LoadToHumidifySetPoint, LoadToDehumidifySetPoint)); + ShowContinueError(state, format("Zone RH Humidifying Set-point={:.1R}", ZoneRHHumidifyingSetPoint)); + ShowContinueError(state, format("Zone RH Dehumidifying Set-point={:.2R}", ZoneRHDehumidifyingSetPoint)); + ShowFatalError(state, "Program terminates due to above conditions."); + } + } + } + + // Apply zone multipliers as needed or set to zero + if (spaceNum > 0) { + auto &thisspaceSysMoistureDemand = state.dataZoneEnergyDemand->spaceSysMoistureDemand(spaceNum); + if (ControlledHumidZoneFlag) { + thisspaceSysMoistureDemand.reportMoistLoadsZoneMultiplier( + state, zoneNum, totalOutputRequired, LoadToHumidifySetPoint, LoadToDehumidifySetPoint); + } else { + thisspaceSysMoistureDemand.TotalOutputRequired = 0.0; + thisspaceSysMoistureDemand.OutputRequiredToDehumidifyingSP = 0.0; + thisspaceSysMoistureDemand.OutputRequiredToHumidifyingSP = 0.0; + } + } else { + auto &thisZoneSysMoistureDemand = state.dataZoneEnergyDemand->ZoneSysMoistureDemand(zoneNum); + if (ControlledHumidZoneFlag) { + thisZoneSysMoistureDemand.reportMoistLoadsZoneMultiplier( + state, zoneNum, totalOutputRequired, LoadToHumidifySetPoint, LoadToDehumidifySetPoint); + } else { + thisZoneSysMoistureDemand.TotalOutputRequired = 0.0; + thisZoneSysMoistureDemand.OutputRequiredToDehumidifyingSP = 0.0; + thisZoneSysMoistureDemand.OutputRequiredToHumidifyingSP = 0.0; + } + } +} + +Real64 correctZoneAirTemps(EnergyPlusData &state, + bool useZoneTimeStepHistory // if true then use zone timestep history, if false use system time step history +) +{ + Real64 maxTempChange = DataPrecisionGlobals::constant_zero; // Max absolute air temperature change between previous and current timestep + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + Real64 zoneTempChange = state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).correctAirTemp(state, useZoneTimeStepHistory, zoneNum); + if (state.dataHeatBal->doSpaceHeatBalance) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + Real64 spaceTempChange = + state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).correctAirTemp(state, useZoneTimeStepHistory, zoneNum, spaceNum); + maxTempChange = max(maxTempChange, spaceTempChange); + } + } + maxTempChange = max(maxTempChange, zoneTempChange); + } + return maxTempChange; +} + +Real64 ZoneSpaceHeatBalanceData::correctAirTemp( + EnergyPlusData &state, + bool const useZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step history + int const zoneNum, + int const spaceNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Russell Taylor + // MODIFIED November 1999, LKL; November 2016 Sang Hoon Lee, Tianzhen Hong, Rongpeng Zhang; + // RE-ENGINEERED July 2003 (Peter Graham Ellis) + // February 2008 (Brent Griffith reworked history ) + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine updates the zone air temperature and modifies the system + // time step. + + static constexpr std::string_view RoutineName("correctAirTemp"); + + Real64 tempChange = DataPrecisionGlobals::constant_zero; // Zone or space air temperature change between previous and current timestep + + assert(zoneNum > 0); + auto &thisZone = state.dataHeatBal->Zone(zoneNum); + + // Update zone temperatures + + Real64 ZoneMult = thisZone.Multiplier * thisZone.ListMultiplier; + + // update the variables actually used in the balance equations. + if (!useZoneTimeStepHistory) { + this->ZTM = this->DSXMAT; + this->WPrevZoneTSTemp = this->DSWPrevZoneTS; + } else { + this->ZTM = this->XMAT; + this->WPrevZoneTSTemp = this->WPrevZoneTS; + } + + Real64 volume = 0.0; + if (spaceNum > 0) { + volume = state.dataHeatBal->space(spaceNum).Volume; + } else { + volume = thisZone.Volume; + } + this->AirPowerCap = volume * thisZone.ZoneVolCapMultpSens * + Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->MAT, this->ZoneAirHumRat, RoutineName) * + Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat) / (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); + + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0) { + RoomAirModelManager::ManageAirModel(state, zoneNum); + } + + // Calculate the various heat balance sums + this->calcZoneOrSpaceSums(state, true, zoneNum, spaceNum); + + // Sum all convective internal gains except for people: SumIntGainExceptPeople + if (state.dataHybridModel->FlagHybridModel_PC) { + // TODO: For now, don't do space heat balance with hybrid model + this->SumIntGainExceptPeople = InternalHeatGains::SumAllInternalConvectionGainsExceptPeople(state, zoneNum); + } + + // ZoneTempHistoryTerm = (3.0D0 * ZTM1(zoneNum) - (3.0D0/2.0D0) * ZTM2(zoneNum) + (1.0D0/3.0D0) * ZTM3(zoneNum)) + int ZoneNodeNum = thisZone.SystemZoneNodeNumber; + if (spaceNum > 0) { + ZoneNodeNum = state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber; + } + + Real64 SNLoad = 0.0; + + if (ZoneNodeNum > 0) { // This zone is controlled by a zone equipment configuration or zone plenum + auto &thisSystemNode = state.dataLoopNodes->Node(ZoneNodeNum); + + // Heat balance coefficients for controlled zone, i.e. with system air flow + this->TempDepCoef = this->SumHA + this->SumMCp + this->SumSysMCp; + this->TempIndCoef = this->SumIntGain + this->SumHATsurf - this->SumHATref + this->SumMCpT + this->SumSysMCpT + + (this->NonAirSystemResponse / ZoneMult + this->SysDepZoneLoadsLagged); + + if (state.afn->distribution_simulated) { + this->TempIndCoef += state.afn->exchangeData(zoneNum).TotalSen; + } + + // Solve for zone air temperature + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + this->ZT = (this->TempIndCoef + this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2])) / + ((11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef); + } break; + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepCoef == 0.0) { // B=0 + this->ZT = this->ZoneT1 + this->TempIndCoef / this->AirPowerCap; + } else { + this->ZT = (this->ZoneT1 - this->TempIndCoef / this->TempDepCoef) * std::exp(min(700.0, -this->TempDepCoef / this->AirPowerCap)) + + this->TempIndCoef / this->TempDepCoef; + } + } break; + case DataHeatBalance::SolutionAlgo::EulerMethod: { + this->ZT = (this->AirPowerCap * this->ZoneT1 + this->TempIndCoef) / (this->AirPowerCap + this->TempDepCoef); + } break; + default: + break; + } + // Update zone node temperature and thermostat temperature unless already updated in Room Air Model, + // calculate load correction factor + if (!state.dataRoomAirMod->anyNonMixingRoomAirModel) { + // Fully mixed + thisSystemNode.Temp = this->ZT; + // SpaceHB TODO: What to do here if this is for space + if (spaceNum == 0) { + state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; + } + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; + } else { + auto &thisAirModel = state.dataRoomAirMod->AirModel(zoneNum); + if ((thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::Mixing) || (!thisAirModel.SimAirModel)) { + // Fully mixed + thisSystemNode.Temp = this->ZT; + // SpaceHB TODO: What to do here if this is for space + if (spaceNum == 0) { + state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; + } + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; + } else if (state.dataRoomAirMod->IsZoneDV(zoneNum) || state.dataRoomAirMod->IsZoneUI(zoneNum)) { + // UCSDDV: Not fully mixed - calculate factor to correct load for fully mixed assumption + // Space HB TODO: Space HB doesn't mix with DV etc. + if (this->SumSysMCp > DataHVACGlobals::SmallMassFlow) { + Real64 TempSupplyAir = this->SumSysMCpT / this->SumSysMCp; // Non-negligible flow, calculate supply air temperature + if (std::abs(TempSupplyAir - this->ZT) > state.dataHeatBal->TempConvergTol) { + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = (TempSupplyAir - thisSystemNode.Temp) / (TempSupplyAir - this->ZT); + // constrain value to something reasonable + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = max(-3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = min(3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); + + } else { + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; // Indeterminate + } + } else { + // Negligible flow, assume mixed - reasonable lagged starting value for first step time with significant flow + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; + } + } else if (thisAirModel.SimAirModel && ((thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UserDefined) || + (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::Mundt))) { + if (this->SumSysMCp > DataHVACGlobals::SmallMassFlow) { + Real64 TempSupplyAir = this->SumSysMCpT / this->SumSysMCp; // Non-negligible flow, calculate supply air temperature + if (std::abs(TempSupplyAir - this->ZT) > state.dataHeatBal->TempConvergTol) { + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = (TempSupplyAir - thisSystemNode.Temp) / (TempSupplyAir - this->ZT); + // constrain value + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = max(-3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = min(3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); + + } else { + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; // Indeterminate + } + } else { + // Negligible flow, assume mixed - reasonable lagged starting value for first step time with significant flow + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; + } + } else if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + // Zone node used in the RoomAirflowNetwork model + this->ZT = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum) + .Node(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).ControlAirNodeID) + .AirTemp; + thisSystemNode.Temp = this->ZT; + // SpaceHB TODO: What to do here if this is for space + if (spaceNum == 0) { + state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; + } + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; + } else { + thisSystemNode.Temp = this->ZT; + // SpaceHB TODO: What to do here if this is for space + if (spaceNum == 0) { + state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; + } + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; + } + } + + // Sensible load is the enthalpy into the zone minus the enthalpy that leaves the zone. + Real64 CpAir = Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat); + Real64 ZoneEnthalpyIn = this->SumSysMCpT; + + // SNLOAD is the single zone load, without Zone Multiplier or Zone List Multiplier + SNLoad = ZoneEnthalpyIn - (thisSystemNode.MassFlowRate / ZoneMult) * CpAir * thisSystemNode.Temp + this->NonAirSystemResponse / ZoneMult + + this->SysDepZoneLoadsLagged; + + } else { + + // Heat balance coefficients for uncontrolled zone, i.e. without system air flow + this->TempDepCoef = this->SumHA + this->SumMCp; + this->TempIndCoef = this->SumIntGain + this->SumHATsurf - this->SumHATref + this->SumMCpT; + + if (state.afn->distribution_simulated) { + this->TempIndCoef += state.afn->exchangeData(zoneNum).TotalSen; + } + + // Solve for zone air temperature + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + this->ZT = (this->TempIndCoef + this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2])) / + ((11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef); + // Exact solution + } break; + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepCoef == 0.0) { // B=0 + this->ZT = this->ZoneT1 + this->TempIndCoef / this->AirPowerCap; + } else { + this->ZT = (this->ZoneT1 - this->TempIndCoef / this->TempDepCoef) * std::exp(min(700.0, -this->TempDepCoef / this->AirPowerCap)) + + this->TempIndCoef / this->TempDepCoef; + } + } break; + case DataHeatBalance::SolutionAlgo::EulerMethod: { + this->ZT = (this->AirPowerCap * this->ZoneT1 + this->TempIndCoef) / (this->AirPowerCap + this->TempDepCoef); + } break; + default: + break; + } + + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + this->ZT = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum) + .Node(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).ControlAirNodeID) + .AirTemp; + } + } + + // No sensible load + SNLoad = 0.0; + } + + // Hybrid modeling start + // SpaceHB TODO: For now, hybrid model is only for zones + if (spaceNum == 0 && state.dataHybridModel->FlagHybridModel) { + if ((state.dataHybridModel->HybridModelZone(zoneNum).InfiltrationCalc_T || + state.dataHybridModel->HybridModelZone(zoneNum).InternalThermalMassCalc_T || + state.dataHybridModel->HybridModelZone(zoneNum).PeopleCountCalc_T) && + (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing)) { + InverseModelTemperature(state, + zoneNum, + this->SumIntGain, + this->SumIntGainExceptPeople, + this->SumHA, + this->SumHATsurf, + this->SumHATref, + this->SumMCp, + this->SumMCpT, + this->SumSysMCp, + this->SumSysMCpT, + this->AirPowerCap); + } + } + + this->MAT = this->ZT; + + // Determine sensible load heating/cooling rate and energy + if (spaceNum > 0) { + state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).reportZoneAirSystemSensibleLoads(state, SNLoad); + } else { + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).reportZoneAirSystemSensibleLoads(state, SNLoad); + } + + // Final humidity calcs + this->correctHumRat(state, zoneNum, spaceNum); + + this->ZoneAirHumRat = this->ZoneAirHumRatTemp; + this->ZoneAirRelHum = 100.0 * Psychrometrics::PsyRhFnTdbWPb(state, this->ZT, this->ZoneAirHumRat, state.dataEnvrn->OutBaroPress, RoutineName); + + // tempChange is used by HVACManager to determine if the timestep needs to be shortened. + bool isMixed = true; + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { + isMixed = !((state.dataRoomAirMod->IsZoneDV(zoneNum) && !state.dataRoomAirMod->ZoneDVMixedFlag(zoneNum)) || + (state.dataRoomAirMod->IsZoneUI(zoneNum) && !state.dataRoomAirMod->ZoneUFMixedFlag(zoneNum))); + } + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + if (isMixed) { + tempChange = max(tempChange, std::abs(this->ZT - this->ZTM[0])); + } else { + tempChange = max(tempChange, + max(std::abs(state.dataRoomAirMod->ZTOC(zoneNum) - state.dataRoomAirMod->ZTM1OC(zoneNum)), + std::abs(state.dataRoomAirMod->ZTMX(zoneNum) - state.dataRoomAirMod->ZTM1MX(zoneNum)))); + } + } break; + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: + case DataHeatBalance::SolutionAlgo::EulerMethod: { + if (isMixed) { + tempChange = max(tempChange, std::abs(this->ZT - this->ZoneT1)); + } else { + tempChange = max(tempChange, + max(std::abs(state.dataRoomAirMod->ZTOC(zoneNum) - state.dataRoomAirMod->Zone1OC(zoneNum)), + std::abs(state.dataRoomAirMod->ZTMX(zoneNum) - state.dataRoomAirMod->Zone1MX(zoneNum)))); + } + } break; + default: + break; + } + + CalcZoneComponentLoadSums(state, + zoneNum, + this->TempDepCoef, + this->TempIndCoef, + state.dataHeatBal->ZnAirRpt(zoneNum).SumIntGains, + state.dataHeatBal->ZnAirRpt(zoneNum).SumHADTsurfs, + state.dataHeatBal->ZnAirRpt(zoneNum).SumMCpDTzones, + state.dataHeatBal->ZnAirRpt(zoneNum).SumMCpDtInfil, + state.dataHeatBal->ZnAirRpt(zoneNum).SumMCpDTsystem, + state.dataHeatBal->ZnAirRpt(zoneNum).SumNonAirSystem, + state.dataHeatBal->ZnAirRpt(zoneNum).CzdTdt, + state.dataHeatBal->ZnAirRpt(zoneNum).imBalance, + state.dataHeatBal->ZnAirRpt(zoneNum).SumEnthalpyM, + state.dataHeatBal->ZnAirRpt(zoneNum).SumEnthalpyH); + return tempChange; +} + +void PushZoneTimestepHistories(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Brent Griffith + // DATE WRITTEN February 2008 + + // PURPOSE OF THIS SUBROUTINE: + // push histories for timestep advancing + + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).pushZoneTimestepHistory(state, zoneNum); + if (state.dataHeatBal->doSpaceHeatBalance) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).pushZoneTimestepHistory(state, zoneNum, spaceNum); + } + } + } +} + +void ZoneSpaceHeatBalanceData::pushZoneTimestepHistory(EnergyPlusData &state, int const zoneNum, int const spaceNum) +{ + + constexpr std::string_view routineName("pushTimestepHistories"); + assert(zoneNum > 0); + + auto &thisAirModel = state.dataRoomAirMod->AirModel(zoneNum); + + // Push the temperature and humidity ratio histories + + for (int iHistory = 3; iHistory >= 1; --iHistory) { + this->XMAT[iHistory] = this->XMAT[iHistory - 1]; + this->WPrevZoneTS[iHistory] = this->WPrevZoneTS[iHistory - 1]; + } + this->XMAT[0] = this->ZTAV; // using average for whole zone time step. + this->XMPT = this->ZT; + this->WPrevZoneTS[0] = this->ZoneAirHumRatAvg; // using average for whole zone time step. + this->ZoneAirHumRat = this->ZoneAirHumRatTemp; + this->WZoneTimeMinusP = this->ZoneAirHumRatTemp; + this->ZoneAirRelHum = 100.0 * Psychrometrics::PsyRhFnTdbWPb(state, this->ZT, this->ZoneAirHumRat, state.dataEnvrn->OutBaroPress, routineName); + + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0) { + if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || + thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || + thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { + state.dataRoomAirMod->XM4TFloor(zoneNum) = state.dataRoomAirMod->XM3TFloor(zoneNum); + state.dataRoomAirMod->XM3TFloor(zoneNum) = state.dataRoomAirMod->XM2TFloor(zoneNum); + state.dataRoomAirMod->XM2TFloor(zoneNum) = state.dataRoomAirMod->XMATFloor(zoneNum); + state.dataRoomAirMod->XMATFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); + state.dataRoomAirMod->MATFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); + + state.dataRoomAirMod->XM4TOC(zoneNum) = state.dataRoomAirMod->XM3TOC(zoneNum); + state.dataRoomAirMod->XM3TOC(zoneNum) = state.dataRoomAirMod->XM2TOC(zoneNum); + state.dataRoomAirMod->XM2TOC(zoneNum) = state.dataRoomAirMod->XMATOC(zoneNum); + state.dataRoomAirMod->XMATOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); + state.dataRoomAirMod->MATOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); + + state.dataRoomAirMod->XM4TMX(zoneNum) = state.dataRoomAirMod->XM3TMX(zoneNum); + state.dataRoomAirMod->XM3TMX(zoneNum) = state.dataRoomAirMod->XM2TMX(zoneNum); + state.dataRoomAirMod->XM2TMX(zoneNum) = state.dataRoomAirMod->XMATMX(zoneNum); + state.dataRoomAirMod->XMATMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); + state.dataRoomAirMod->MATMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); + } + + // for RoomAirflowNetwork model + if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { + auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); + roomAirflowNetworkZoneInfo.AirTempX4 = roomAirflowNetworkZoneInfo.AirTempX3; + roomAirflowNetworkZoneInfo.AirTempX3 = roomAirflowNetworkZoneInfo.AirTempX2; + roomAirflowNetworkZoneInfo.AirTempX2 = roomAirflowNetworkZoneInfo.AirTempX1; + roomAirflowNetworkZoneInfo.AirTempX1 = roomAirflowNetworkZoneInfo.AirTemp; + + roomAirflowNetworkZoneInfo.HumRatX4 = roomAirflowNetworkZoneInfo.HumRatX3; + roomAirflowNetworkZoneInfo.HumRatX3 = roomAirflowNetworkZoneInfo.HumRatX2; + roomAirflowNetworkZoneInfo.HumRatX2 = roomAirflowNetworkZoneInfo.HumRatX1; + roomAirflowNetworkZoneInfo.HumRatX1 = roomAirflowNetworkZoneInfo.HumRat; + } + } + } + + if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) { + this->ZoneTM2 = this->ZoneTMX; + this->ZoneTMX = this->ZTAV; // using average for whole zone time step. + this->ZoneWM2 = this->ZoneWMX; + this->ZoneWMX = this->ZoneAirHumRatAvg; // using average for whole zone time step. + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0) { + if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || + thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || + thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { + state.dataRoomAirMod->ZoneM2Floor(zoneNum) = state.dataRoomAirMod->ZoneMXFloor(zoneNum); + state.dataRoomAirMod->ZoneMXFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); // using average for whole zone time step. + state.dataRoomAirMod->ZoneM2OC(zoneNum) = state.dataRoomAirMod->ZoneMXOC(zoneNum); + state.dataRoomAirMod->ZoneMXOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); // using average for whole zone time step. + state.dataRoomAirMod->ZoneM2MX(zoneNum) = state.dataRoomAirMod->ZoneMXMX(zoneNum); + state.dataRoomAirMod->ZoneMXMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); // using average for whole zone time step. + } + + if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { + auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); + roomAirflowNetworkZoneInfo.AirTempTM2 = roomAirflowNetworkZoneInfo.AirTempTMX; + roomAirflowNetworkZoneInfo.AirTempTMX = roomAirflowNetworkZoneInfo.AirTemp; + + roomAirflowNetworkZoneInfo.HumRatWM2 = roomAirflowNetworkZoneInfo.HumRatWMX; + roomAirflowNetworkZoneInfo.HumRatWMX = roomAirflowNetworkZoneInfo.HumRat; + } + } + } + } +} + +void PushSystemTimestepHistories(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Brent Griffith + // DATE WRITTEN April 2008 + + // PURPOSE OF THIS SUBROUTINE: + // Push the temperature and humidity ratio histories back in time + + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).pushSystemTimestepHistory(state, zoneNum); + if (state.dataHeatBal->doSpaceHeatBalance) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).pushSystemTimestepHistory(state, zoneNum, spaceNum); + } + } + } +} + +void ZoneSpaceHeatBalanceData::pushSystemTimestepHistory(EnergyPlusData &state, int const zoneNum, int const spaceNum) +{ + assert(zoneNum > 0); + for (int iHistory = 3; iHistory >= 1; --iHistory) { + this->DSXMAT[iHistory] = this->DSXMAT[iHistory - 1]; + this->DSWPrevZoneTS[iHistory] = this->DSWPrevZoneTS[iHistory - 1]; + } + this->DSXMAT[0] = this->MAT; + this->DSWPrevZoneTS[0] = this->ZoneAirHumRat; + + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { + if (state.dataRoomAirMod->IsZoneDV(zoneNum) || state.dataRoomAirMod->IsZoneUI(zoneNum)) { + state.dataRoomAirMod->DSXM4TFloor(zoneNum) = state.dataRoomAirMod->DSXM3TFloor(zoneNum); + state.dataRoomAirMod->DSXM3TFloor(zoneNum) = state.dataRoomAirMod->DSXM2TFloor(zoneNum); + state.dataRoomAirMod->DSXM2TFloor(zoneNum) = state.dataRoomAirMod->DSXMATFloor(zoneNum); + state.dataRoomAirMod->DSXMATFloor(zoneNum) = state.dataRoomAirMod->MATFloor(zoneNum); + + state.dataRoomAirMod->DSXM4TOC(zoneNum) = state.dataRoomAirMod->DSXM3TOC(zoneNum); + state.dataRoomAirMod->DSXM3TOC(zoneNum) = state.dataRoomAirMod->DSXM2TOC(zoneNum); + state.dataRoomAirMod->DSXM2TOC(zoneNum) = state.dataRoomAirMod->DSXMATOC(zoneNum); + state.dataRoomAirMod->DSXMATOC(zoneNum) = state.dataRoomAirMod->MATOC(zoneNum); + + state.dataRoomAirMod->DSXM4TMX(zoneNum) = state.dataRoomAirMod->DSXM3TMX(zoneNum); + state.dataRoomAirMod->DSXM3TMX(zoneNum) = state.dataRoomAirMod->DSXM2TMX(zoneNum); + state.dataRoomAirMod->DSXM2TMX(zoneNum) = state.dataRoomAirMod->DSXMATMX(zoneNum); + state.dataRoomAirMod->DSXMATMX(zoneNum) = state.dataRoomAirMod->MATMX(zoneNum); + } + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { + auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); + roomAirflowNetworkZoneInfo.AirTempDSX4 = roomAirflowNetworkZoneInfo.AirTempDSX3; + roomAirflowNetworkZoneInfo.AirTempDSX3 = roomAirflowNetworkZoneInfo.AirTempDSX2; + roomAirflowNetworkZoneInfo.AirTempDSX2 = roomAirflowNetworkZoneInfo.AirTempDSX1; + roomAirflowNetworkZoneInfo.AirTempDSX1 = roomAirflowNetworkZoneInfo.AirTemp; + + roomAirflowNetworkZoneInfo.HumRatDSX4 = roomAirflowNetworkZoneInfo.HumRatDSX3; + roomAirflowNetworkZoneInfo.HumRatDSX3 = roomAirflowNetworkZoneInfo.HumRatDSX2; + roomAirflowNetworkZoneInfo.HumRatDSX2 = roomAirflowNetworkZoneInfo.HumRatDSX1; + roomAirflowNetworkZoneInfo.HumRatDSX1 = roomAirflowNetworkZoneInfo.HumRat; + } + } + } + + if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) { + this->ZoneTM2 = this->ZoneTMX; + this->ZoneTMX = this->MAT; // using average for whole zone time step. + this->ZoneWM2 = this->ZoneWMX; + this->ZoneWMX = this->ZoneAirHumRatTemp; // using average for whole zone time step. + + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0) { + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || + state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || + state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { + state.dataRoomAirMod->ZoneM2Floor(zoneNum) = state.dataRoomAirMod->ZoneMXFloor(zoneNum); + state.dataRoomAirMod->ZoneMXFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); // using average for whole zone time step. + state.dataRoomAirMod->ZoneM2OC(zoneNum) = state.dataRoomAirMod->ZoneMXOC(zoneNum); + state.dataRoomAirMod->ZoneMXOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); // using average for whole zone time step. + state.dataRoomAirMod->ZoneM2MX(zoneNum) = state.dataRoomAirMod->ZoneMXMX(zoneNum); + state.dataRoomAirMod->ZoneMXMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); // using average for whole zone time step. + } + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { + auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); + roomAirflowNetworkZoneInfo.AirTempTM2 = roomAirflowNetworkZoneInfo.AirTempTMX; + roomAirflowNetworkZoneInfo.AirTempTMX = roomAirflowNetworkZoneInfo.AirTemp; + + roomAirflowNetworkZoneInfo.HumRatWM2 = roomAirflowNetworkZoneInfo.HumRatWMX; + roomAirflowNetworkZoneInfo.HumRatWMX = roomAirflowNetworkZoneInfo.HumRat; + } + } + } + } +} + +void RevertZoneTimestepHistories(EnergyPlusData &state) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Brent Griffith + // DATE WRITTEN February 2008 + + // PURPOSE OF THIS SUBROUTINE: + // Revert the temperature and humidity ratio histories + + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).revertZoneTimestepHistory(state, zoneNum); + if (state.dataHeatBal->doSpaceHeatBalance) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).revertZoneTimestepHistory(state, zoneNum, spaceNum); + } + } + } +} + +void ZoneSpaceHeatBalanceData::revertZoneTimestepHistory(EnergyPlusData &state, int const zoneNum, int const spaceNum) +{ + assert(zoneNum > 0); + + for (int iHistory = 0; iHistory <= 2; ++iHistory) { + this->XMAT[iHistory] = this->XMAT[iHistory + 1]; + this->WPrevZoneTS[iHistory] = this->WPrevZoneTS[iHistory + 1]; + } + + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0) { + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || + state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || + state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { + + state.dataRoomAirMod->XMATFloor(zoneNum) = state.dataRoomAirMod->XM2TFloor(zoneNum); + state.dataRoomAirMod->XM2TFloor(zoneNum) = state.dataRoomAirMod->XM3TFloor(zoneNum); + state.dataRoomAirMod->XM3TFloor(zoneNum) = state.dataRoomAirMod->XM4TFloor(zoneNum); + + state.dataRoomAirMod->XMATOC(zoneNum) = state.dataRoomAirMod->XM2TOC(zoneNum); + state.dataRoomAirMod->XM2TOC(zoneNum) = state.dataRoomAirMod->XM3TOC(zoneNum); + state.dataRoomAirMod->XM3TOC(zoneNum) = state.dataRoomAirMod->XM4TOC(zoneNum); + + state.dataRoomAirMod->XMATMX(zoneNum) = state.dataRoomAirMod->XM2TMX(zoneNum); + state.dataRoomAirMod->XM2TMX(zoneNum) = state.dataRoomAirMod->XM3TMX(zoneNum); + state.dataRoomAirMod->XM3TMX(zoneNum) = state.dataRoomAirMod->XM4TMX(zoneNum); + } + + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { + auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); + roomAirflowNetworkZoneInfo.AirTempX1 = roomAirflowNetworkZoneInfo.AirTempX2; + roomAirflowNetworkZoneInfo.AirTempX2 = roomAirflowNetworkZoneInfo.AirTempX3; + roomAirflowNetworkZoneInfo.AirTempX3 = roomAirflowNetworkZoneInfo.AirTempX4; + + roomAirflowNetworkZoneInfo.HumRatX1 = roomAirflowNetworkZoneInfo.HumRatX2; + roomAirflowNetworkZoneInfo.HumRatX2 = roomAirflowNetworkZoneInfo.HumRatX3; + roomAirflowNetworkZoneInfo.HumRatX3 = roomAirflowNetworkZoneInfo.HumRatX4; + } + } + } +} + +void ZoneSpaceHeatBalanceData::correctHumRat(EnergyPlusData &state, int const zoneNum, int const spaceNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Richard Liesen + // DATE WRITTEN 2000 + // REFERENCES: Routine FinalZnCalcs - FINAL ZONE CALCULATIONS, authored by Dale Herron for BLAST. + + assert(zoneNum > 0); + static constexpr std::string_view RoutineName("correctHumRat"); + + Real64 MoistureMassFlowRate = 0.0; + Real64 ZoneMassFlowRate = 0.0; + auto &zone = state.dataHeatBal->Zone(zoneNum); + int ZoneMult = zone.Multiplier * zone.ListMultiplier; + bool ControlledZoneAirFlag = zone.IsControlled; + bool ZoneRetPlenumAirFlag = zone.IsReturnPlenum; + bool ZoneSupPlenumAirFlag = zone.IsSupplyPlenum; + + if (ControlledZoneAirFlag) { // If there is system flow then calculate the flow rates + auto &zoneEquipConfig = state.dataZoneEquip->ZoneEquipConfig(zoneNum); + // Calculate moisture flow rate into each zone + for (int NodeNum = 1; NodeNum <= zoneEquipConfig.NumInletNodes; ++NodeNum) { + auto &inletNode = state.dataLoopNodes->Node(zoneEquipConfig.InletNode(NodeNum)); + MoistureMassFlowRate += (inletNode.MassFlowRate * inletNode.HumRat) / ZoneMult; + ZoneMassFlowRate += inletNode.MassFlowRate / ZoneMult; + } + + // Do the calculations for the plenum zone + } else if (ZoneRetPlenumAirFlag) { + int ZoneRetPlenumNum = zone.PlenumCondNum; + auto &zoneRetPlenCond = state.dataZonePlenum->ZoneRetPlenCond(ZoneRetPlenumNum); + for (int NodeNum = 1; NodeNum <= zoneRetPlenCond.NumInletNodes; ++NodeNum) { + auto &inletNode = state.dataLoopNodes->Node(zoneRetPlenCond.InletNode(NodeNum)); + MoistureMassFlowRate += (inletNode.MassFlowRate * inletNode.HumRat) / ZoneMult; + ZoneMassFlowRate += inletNode.MassFlowRate / ZoneMult; + } + // add in the leak flow + for (int ADUListIndex = 1; ADUListIndex <= zoneRetPlenCond.NumADUs; ++ADUListIndex) { + int ADUNum = zoneRetPlenCond.ADUIndex(ADUListIndex); + auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(ADUNum); + if (airDistUnit.UpStreamLeak) { + int ADUInNode = airDistUnit.InletNodeNum; + MoistureMassFlowRate += (airDistUnit.MassFlowRateUpStrLk * state.dataLoopNodes->Node(ADUInNode).HumRat) / ZoneMult; + ZoneMassFlowRate += airDistUnit.MassFlowRateUpStrLk / ZoneMult; + } + if (airDistUnit.DownStreamLeak) { + int ADUOutNode = airDistUnit.OutletNodeNum; + MoistureMassFlowRate += (airDistUnit.MassFlowRateDnStrLk * state.dataLoopNodes->Node(ADUOutNode).HumRat) / ZoneMult; + ZoneMassFlowRate += airDistUnit.MassFlowRateDnStrLk / ZoneMult; + } + } + + } else if (ZoneSupPlenumAirFlag) { + int ZoneSupPlenumNum = zone.PlenumCondNum; + auto &inletNode = state.dataLoopNodes->Node(state.dataZonePlenum->ZoneSupPlenCond(ZoneSupPlenumNum).InletNode); + MoistureMassFlowRate += (inletNode.MassFlowRate * inletNode.HumRat) / ZoneMult; + ZoneMassFlowRate += inletNode.MassFlowRate / ZoneMult; + } + + // Calculate hourly humidity ratio from infiltration + humidity added from latent load + system added moisture + Real64 LatentGain = this->ZoneLatentGain + state.dataHeatBalFanSys->SumLatentHTRadSys(zoneNum) + state.dataHeatBalFanSys->SumLatentPool(zoneNum); + + Real64 SysTimeStepInSeconds = DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys; + + // Calculate the coefficients for the 3rd order derivative for final + // zone humidity ratio. The A, B, C coefficients are analogous to the + // heat balance. There are 2 cases that should be considered, system + // operating and system shutdown. + + Real64 const RhoAir = Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->ZT, this->ZoneAirHumRat, RoutineName); + Real64 const H2OHtOfVap = Psychrometrics::PsyHgAirFnWTdb(this->ZoneAirHumRat, this->ZT); + + Real64 B = (LatentGain / H2OHtOfVap) + ((this->OAMFL + this->VAMFL + this->CTMFL) * state.dataEnvrn->OutHumRat) + this->EAMFLxHumRat + + (MoistureMassFlowRate) + this->SumHmARaW + this->MixingMassFlowXHumRat + this->MDotOA * state.dataEnvrn->OutHumRat; + Real64 A = ZoneMassFlowRate + this->OAMFL + this->VAMFL + this->EAMFL + this->CTMFL + this->SumHmARa + this->MixingMassFlowZone + this->MDotOA; + + if (state.afn->multizone_always_simulated || + (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && + state.afn->AirflowNetworkFanActivated)) { + auto &exchangeData = state.afn->exchangeData(zoneNum); + // Multizone airflow calculated in AirflowNetwork + B = (LatentGain / H2OHtOfVap) + (exchangeData.SumMHrW + exchangeData.SumMMHrW) + (MoistureMassFlowRate) + this->SumHmARaW; + A = ZoneMassFlowRate + exchangeData.SumMHr + exchangeData.SumMMHr + this->SumHmARa; + } + Real64 C = RhoAir * zone.Volume * zone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; + + if (state.afn->distribution_simulated) { + B += state.afn->exchangeData(zoneNum).TotalLat; + } + + // Use a 3rd order derivative to predict final zone humidity ratio and + // smooth the changes using the zone air capacitance. + // auto &zoneAirHumRatTemp = this->ZoneAirHumRatTemp; + // auto &zoneW1 = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).ZoneW1; + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + this->ZoneAirHumRatTemp = + (B + C * (3.0 * this->WPrevZoneTSTemp[0] - (3.0 / 2.0) * this->WPrevZoneTSTemp[1] + (1.0 / 3.0) * this->WPrevZoneTSTemp[2])) / + ((11.0 / 6.0) * C + A); + // Exact solution + } break; + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (A == 0.0) { // B=0 + this->ZoneAirHumRatTemp = this->ZoneW1 + B / C; + } else { + this->ZoneAirHumRatTemp = (this->ZoneW1 - B / A) * std::exp(min(700.0, -A / C)) + B / A; + } + } break; + case DataHeatBalance::SolutionAlgo::EulerMethod: { + this->ZoneAirHumRatTemp = (C * this->ZoneW1 + B) / (C + A); + } break; + default: + break; + } + + // Set the humidity ratio to zero if the zone has been dried out + if (this->ZoneAirHumRatTemp < 0.0) this->ZoneAirHumRatTemp = 0.0; + + // Check to make sure that is saturated there is condensation in the zone + // by resetting to saturation conditions. + Real64 const WZSat = Psychrometrics::PsyWFnTdbRhPb(state, this->ZT, 1.0, state.dataEnvrn->OutBaroPress, RoutineName); + + if (this->ZoneAirHumRatTemp > WZSat) this->ZoneAirHumRatTemp = WZSat; + + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + this->ZoneAirHumRatTemp = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum) + .Node(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).ControlAirNodeID) + .HumRat; + } + + // HybridModel with measured humidity ratio begins + // SpaceHB TODO: For now, hybrid model is only for zones + if (spaceNum == 0 && state.dataHybridModel->FlagHybridModel) { + if ((state.dataHybridModel->HybridModelZone(zoneNum).InfiltrationCalc_H || + state.dataHybridModel->HybridModelZone(zoneNum).PeopleCountCalc_H) && + (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing)) { + Real64 LatentGainExceptPeople = 0.0; + if (state.dataHybridModel->HybridModelZone(zoneNum).PeopleCountCalc_H) { + LatentGainExceptPeople = this->ZoneLatentGainExceptPeople + state.dataHeatBalFanSys->SumLatentHTRadSys(zoneNum) + + state.dataHeatBalFanSys->SumLatentPool(zoneNum); + } + + InverseModelHumidity(state, zoneNum, LatentGain, LatentGainExceptPeople, ZoneMassFlowRate, MoistureMassFlowRate, H2OHtOfVap, RhoAir); + } + } + + // Now put the calculated info into the actual zone nodes; ONLY if there is zone air flow, i.e. controlled zone or plenum zone + int ZoneNodeNum = zone.SystemZoneNodeNumber; + if (spaceNum > 0) { + ZoneNodeNum = state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber; + } + if (ZoneNodeNum > 0) { + state.dataLoopNodes->Node(ZoneNodeNum).HumRat = this->ZoneAirHumRatTemp; + state.dataLoopNodes->Node(ZoneNodeNum).Enthalpy = Psychrometrics::PsyHFnTdbW(this->ZT, this->ZoneAirHumRatTemp); + } + if (state.dataHeatBal->DoLatentSizing) { + Real64 sensibleLoad = 0.0; + Real64 pSat = Psychrometrics::PsyPsatFnTemp(state, this->ZT, RoutineName); + Real64 Tdp = Psychrometrics::PsyTdpFnWPb(state, this->ZoneAirHumRatTemp, state.dataEnvrn->StdBaroPress); + Real64 vaporPressureDiff = pSat - Psychrometrics::PsyPsatFnTemp(state, Tdp, RoutineName); + if (spaceNum > 0) { + sensibleLoad = state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).ZoneSNLoadHeatRate + + state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).ZoneSNLoadCoolRate; + state.dataZoneEnergyDemand->spaceSysMoistureDemand(spaceNum).reportZoneAirSystemMoistureLoads( + state, LatentGain, sensibleLoad, vaporPressureDiff); + } else { + sensibleLoad = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).ZoneSNLoadHeatRate + + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).ZoneSNLoadCoolRate; + state.dataZoneEnergyDemand->ZoneSysMoistureDemand(zoneNum).reportZoneAirSystemMoistureLoads( + state, LatentGain, sensibleLoad, vaporPressureDiff); + } + } +} + +void DownInterpolate4HistoryValues(Real64 const OldTimeStep, + Real64 const NewTimeStep, + Real64 const oldVal0, + Real64 const oldVal1, + Real64 const oldVal2, + Real64 &newVal0, + Real64 &newVal1, + Real64 &newVal2, + Real64 &newVal3, + Real64 &newVal4) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Brent Griffith + // DATE WRITTEN Feb 2008 + + // PURPOSE OF THIS SUBROUTINE: + // provide a reusable routine for the various places that need to + // interpolate a new set of history values on a different time scale + // Once the systemtimestep has shortened, the new history terms need to be interpolated + + // METHODOLOGY EMPLOYED: + // This routine assumes that the direction is to a shorter timestep. + // The down step ratio, DSRatio = OldTimeStep/ NewTimeStep + // is expected to be roughly integer-valued and near 2.0 or 3.0 or 4.0 or more. + + // first construct data on timestamps for interpolating with later + Real64 const oldTime0 = 0.0; + Real64 const oldTime1 = oldTime0 - OldTimeStep; + + Real64 const newTime0 = 0.0; + Real64 const newTime1 = newTime0 - NewTimeStep; + Real64 const newTime2 = newTime1 - NewTimeStep; + Real64 const newTime3 = newTime2 - NewTimeStep; + Real64 const newTime4 = newTime3 - NewTimeStep; + + Real64 const DSRatio = OldTimeStep / NewTimeStep; // should pretty much be an integer value 2, 3, 4, etc. + + newVal0 = oldVal0; + + if (std::abs(DSRatio - 2.0) < 0.01) { // DSRatio = 2 + // first two points lie between oldVal0 and oldVal1 + newVal1 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime1) / (OldTimeStep)); + newVal2 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime2) / (OldTimeStep)); + // last two points lie between oldVal1 and oldVal2 + newVal3 = oldVal1 + (oldVal2 - oldVal1) * ((oldTime1 - newTime3) / (OldTimeStep)); + newVal4 = oldVal1 + (oldVal2 - oldVal1) * ((oldTime1 - newTime4) / (OldTimeStep)); + } else if (std::abs(DSRatio - 3.0) < 0.01) { // DSRatio = 3 + // first three points lie between oldVal0 and oldVal1 + newVal1 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime1) / (OldTimeStep)); + newVal2 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime2) / (OldTimeStep)); + newVal3 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime3) / (OldTimeStep)); + // last point lie between oldVal1 and oldVal2 + newVal4 = oldVal1 + (oldVal2 - oldVal1) * ((oldTime1 - newTime4) / (OldTimeStep)); + + } else { // DSRatio = 4 or more + // all new points lie between oldVal0 and oldVal1 + newVal1 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime1) / (OldTimeStep)); + newVal2 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime2) / (OldTimeStep)); + newVal3 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime3) / (OldTimeStep)); + newVal4 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime4) / (OldTimeStep)); + } +} + +Real64 DownInterpolate4HistoryValues(Real64 OldTimeStep, Real64 NewTimeStep, std::array const &oldVals, std::array &newVals) +{ + // first construct data on timestamps for interpolating with later + Real64 const oldTime0 = 0.0; + Real64 const oldTime1 = oldTime0 - OldTimeStep; + + Real64 const newTime0 = 0.0; + Real64 const newTime1 = newTime0 - NewTimeStep; + Real64 const newTime2 = newTime1 - NewTimeStep; + Real64 const newTime3 = newTime2 - NewTimeStep; + Real64 const newTime4 = newTime3 - NewTimeStep; + + Real64 const DSRatio = OldTimeStep / NewTimeStep; // should pretty much be an integer value 2, 3, 4, etc. + + if (std::abs(DSRatio - 2.0) < 0.01) { // DSRatio = 2 + // first two points lie between oldVals[0] and oldVals[1] + Real64 delta10 = oldVals[1] - oldVals[0]; + newVals[0] = oldVals[0] + delta10 * ((oldTime0 - newTime1) / OldTimeStep); + newVals[1] = oldVals[0] + delta10 * ((oldTime0 - newTime2) / OldTimeStep); + // last two points lie between oldVals[1] and oldVals[2] + Real64 delta21 = oldVals[2] - oldVals[1]; + newVals[2] = oldVals[1] + delta21 * ((oldTime1 - newTime3) / OldTimeStep); + newVals[3] = oldVals[1] + delta21 * ((oldTime1 - newTime4) / OldTimeStep); + } else if (std::abs(DSRatio - 3.0) < 0.01) { // DSRatio = 3 + // first three points lie between oldVals[0] and oldVals[1] + Real64 delta10 = oldVals[1] - oldVals[0]; + newVals[0] = oldVals[0] + delta10 * ((oldTime0 - newTime1) / OldTimeStep); + newVals[1] = oldVals[0] + delta10 * ((oldTime0 - newTime2) / OldTimeStep); + newVals[2] = oldVals[0] + delta10 * ((oldTime0 - newTime3) / OldTimeStep); + // last point lie between oldVals[1] and oldVals[2] + Real64 delta21 = (oldVals[2] - oldVals[1]) / OldTimeStep; + newVals[3] = oldVals[1] + delta21 * ((oldTime1 - newTime4) / OldTimeStep); + + } else { // DSRatio = 4 or more + // all new points lie between oldVals[0] and oldVals[1] + Real64 delta10 = oldVals[1] - oldVals[0]; + newVals[0] = oldVals[0] + delta10 * ((oldTime0 - newTime1) / OldTimeStep); + newVals[1] = oldVals[0] + delta10 * ((oldTime0 - newTime2) / OldTimeStep); + newVals[2] = oldVals[0] + delta10 * ((oldTime0 - newTime3) / OldTimeStep); + newVals[3] = oldVals[0] + delta10 * ((oldTime0 - newTime4) / OldTimeStep); + } + return oldVals[0]; + + // if (std::abs(DSRatio - 2.0) < 0.01) { // DSRatio = 2 + // // first two points lie between oldVals[0] and oldVals[1] + // Real64 ratio10 = (oldVals[1] - oldVals[0]) / OldTimeStep; + // newVals[0] = oldVals[0] + ratio10 * (oldTime0 - newTime1); + // newVals[1] = oldVals[0] + ratio10 * (oldTime0 - newTime2); + // // last two points lie between oldVals[1] and oldVals[2] + // Real64 ratio21 = (oldVals[2] - oldVals[1]) / OldTimeStep; + // newVals[2] = oldVals[1] + ratio21 * (oldTime1 - newTime3); + // newVals[3] = oldVals[1] + ratio21 * (oldTime1 - newTime4); + // } else if (std::abs(DSRatio - 3.0) < 0.01) { // DSRatio = 3 + // // first three points lie between oldVals[0] and oldVals[1] + // Real64 ratio10 = (oldVals[1] - oldVals[0]) / OldTimeStep; + // newVals[0] = oldVals[0] + ratio10 * (oldTime0 - newTime1); + // newVals[1] = oldVals[0] + ratio10 * (oldTime0 - newTime2); + // newVals[2] = oldVals[0] + ratio10 * (oldTime0 - newTime3); + // // last point lie between oldVals[1] and oldVals[2] + // Real64 ratio21 = (oldVals[2] - oldVals[1]) / OldTimeStep; + // newVals[3] = oldVals[1] + ratio21 * (oldTime1 - newTime4); + + //} else { // DSRatio = 4 or more + // // all new points lie between oldVals[0] and oldVals[1] + // Real64 ratio10 = (oldVals[1] - oldVals[0]) / OldTimeStep; + // newVals[0] = oldVals[0] + ratio10 * (oldTime0 - newTime1); + // newVals[1] = oldVals[0] + ratio10 * (oldTime0 - newTime2); + // newVals[2] = oldVals[0] + ratio10 * (oldTime0 - newTime3); + // newVals[3] = oldVals[0] + ratio10 * (oldTime0 - newTime4); + //} +} +void InverseModelTemperature(EnergyPlusData &state, + int const ZoneNum, // Zone number + Real64 const SumIntGain, // Zone sum of convective internal gains + Real64 const SumIntGainExceptPeople, // Zone sum of convective internal gains except for people + Real64 const SumHA, // Zone sum of Hc*Area + Real64 const SumHATsurf, // Zone sum of Hc*Area*Tsurf + Real64 const SumHATref, // Zone sum of Hc*Area*Tref, for ceiling diffuser convection correlation + Real64 const SumMCp, // Zone sum of MassFlowRate*Cp + Real64 const SumMCpT, // Zone sum of MassFlowRate*Cp*T + Real64 const SumSysMCp, // Zone sum of air system MassFlowRate*Cp + Real64 const SumSysMCpT, // Zone sum of air system MassFlowRate*Cp*T + Real64 const AirCap // Formerly CoefAirrat, coef in zone temp eqn with dim of "air power capacity"rd +) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Han Li + // DATE WRITTEN February 2019 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine inversely solve infiltration airflow rate or people count with zone air temperatures measurements. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Real64 AirCapHM(0.0); // Air power capacity for hybrid modeling + Real64 AA(0.0); + Real64 BB(0.0); + Real64 FractionConvection(0.0); // Default convection portion of the sensible heat from people + + auto &zone = state.dataHeatBal->Zone(ZoneNum); + auto &hybridModelZone = state.dataHybridModel->HybridModelZone(ZoneNum); + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); + + int ZoneMult = zone.Multiplier * zone.ListMultiplier; + zone.ZoneMeasuredTemperature = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneMeasuredTemperatureSchedulePtr); + + // HM calculation only HM calculation period start + if (state.dataEnvrn->DayOfYear >= hybridModelZone.HybridStartDayOfYear && state.dataEnvrn->DayOfYear <= hybridModelZone.HybridEndDayOfYear) { + Real64 HMMultiplierAverage(1.0); + Real64 MultpHM(1.0); + + thisZoneHB.ZT = zone.ZoneMeasuredTemperature; // Array1D ZT -- Zone + // Air Temperature Averaged over + // the System Time Increment + if (hybridModelZone.InfiltrationCalc_T && state.dataHVACGlobal->UseZoneTimeStepHistory) { + static constexpr std::string_view RoutineNameInfiltration("CalcAirFlowSimple:Infiltration"); + + if (hybridModelZone.IncludeSystemSupplyParameters) { + zone.ZoneMeasuredSupplyAirTemperature = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirTemperatureSchedulePtr); + zone.ZoneMeasuredSupplyAirFlowRate = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); + zone.ZoneMeasuredSupplyAirHumidityRatio = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); + // Calculate the air humidity ratio at supply air inlet. + Real64 CpAirInlet(0.0); + CpAirInlet = Psychrometrics::PsyCpAirFnW(zone.ZoneMeasuredSupplyAirHumidityRatio); + + Real64 SumSysMCp_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet; + Real64 SumSysMCpT_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet * zone.ZoneMeasuredSupplyAirTemperature; + + AA = SumSysMCp_HM + SumHA + thisZoneHB.MCPV + thisZoneHB.MCPM + thisZoneHB.MCPE + thisZoneHB.MCPC + thisZoneHB.MDotCPOA; + BB = SumSysMCpT_HM + SumIntGain + SumHATsurf - SumHATref + thisZoneHB.MCPTV + thisZoneHB.MCPTM + thisZoneHB.MCPTE + thisZoneHB.MCPTC + + thisZoneHB.MDotCPOA * zone.OutDryBulbTemp + (thisZoneHB.NonAirSystemResponse / ZoneMult + thisZoneHB.SysDepZoneLoadsLagged); + } else { + AA = SumHA + thisZoneHB.MCPV + thisZoneHB.MCPM + thisZoneHB.MCPE + thisZoneHB.MCPC + thisZoneHB.MDotCPOA; + BB = SumIntGain + SumHATsurf - SumHATref + thisZoneHB.MCPTV + thisZoneHB.MCPTM + thisZoneHB.MCPTE + thisZoneHB.MCPTC + + thisZoneHB.MDotCPOA * zone.OutDryBulbTemp; + } + Real64 CC = AirCap; + Real64 DD = + (3.0 * state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) - (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum) + + (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredZT3(ZoneNum)); + + Real64 delta_T = (zone.ZoneMeasuredTemperature - zone.OutDryBulbTemp); + Real64 CpAir = Psychrometrics::PsyCpAirFnW(state.dataEnvrn->OutHumRat); + Real64 AirDensity = Psychrometrics::PsyRhoAirFnPbTdbW( + state, state.dataEnvrn->OutBaroPress, zone.OutDryBulbTemp, state.dataEnvrn->OutHumRat, RoutineNameInfiltration); + zone.delta_T = delta_T; + + // s4 - Set ACH to 0 when delta_T <= 0.5, add max and min limits to ach + Real64 M_inf = 0.0; + if (std::abs(delta_T) > 0.5) { + M_inf = (BB + CC * DD - ((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredTemperature) / (CpAir * delta_T); + } + Real64 ACH_inf = max(0.0, min(10.0, (M_inf / AirDensity) / zone.Volume * DataGlobalConstants::SecInHour)); + M_inf = (ACH_inf / DataGlobalConstants::SecInHour) * zone.Volume * AirDensity; + + // Overwrite variable with inverse solution + zone.MCPIHM = M_inf; + zone.InfilOAAirChangeRateHM = ACH_inf; + + } // Hybrid model infiltration calculation end + + // Hybrid modeling internal thermal mass calculation start + if (hybridModelZone.InternalThermalMassCalc_T && SumSysMCpT == 0 && thisZoneHB.ZT != state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) && + state.dataHVACGlobal->UseZoneTimeStepHistory) { // HM calculation only when SumSysMCpT =0, + // TimeStepZone (not @ TimeStepSys) + Real64 TempDepCoef = SumHA + SumMCp + SumSysMCp; + Real64 TempIndCoef = SumIntGain + SumHATsurf - SumHATref + SumMCpT + SumSysMCpT + + (thisZoneHB.NonAirSystemResponse / ZoneMult + thisZoneHB.SysDepZoneLoadsLagged); + // TempHistoryTerm = AirCap * (3.0 * ZTM1(ZoneNum) - (3.0/2.0) * ZTM2(ZoneNum) + (1.0/3.0) * ZTM3(ZoneNum)) !debug only + + if (state.afn->distribution_simulated) { + TempIndCoef += state.afn->exchangeData(ZoneNum).TotalSen; + } + // Calculate air capacity using DataHeatBalance::SolutionAlgo::AnalyticalSolution + if (TempDepCoef == 0.0) { + // Is this correct? Shouldn't we use log?? What if thisZT == + // PreviousMeasuredZT1(ZoneNum)?? + AirCapHM = TempIndCoef / (thisZoneHB.ZT - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)); // Inverse equation + } else { + Real64 AirCapHM_temp = 0.0; + if (TempIndCoef == TempDepCoef * thisZoneHB.ZT) { + AirCapHM_temp = 0.0; // This is the denominator. + } else { + AirCapHM_temp = (TempIndCoef - TempDepCoef * state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)) / + (TempIndCoef - TempDepCoef * thisZoneHB.ZT); + } + + if ((AirCapHM_temp > 0) && (AirCapHM_temp != 1)) { // Avoide IND + AirCapHM = TempDepCoef / std::log(AirCapHM_temp); // Inverse equation + } else { + AirCapHM = TempIndCoef / (thisZoneHB.ZT - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)); + } + } + + // Calculate multiplier + if (std::abs(thisZoneHB.ZT - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)) > 0.05) { // Filter + MultpHM = AirCapHM / + (zone.Volume * + Psychrometrics::PsyRhoAirFnPbTdbW(state, + state.dataEnvrn->OutBaroPress, + thisZoneHB.ZT, + thisZoneHB.ZoneAirHumRat) * + Psychrometrics::PsyCpAirFnW(thisZoneHB.ZoneAirHumRat)) * + (state.dataGlobal->TimeStepZone * DataGlobalConstants::SecInHour); // Inverse equation + if ((MultpHM < 1.0) || (MultpHM > 30.0)) { // Temperature capacity multiplier greater than + // 1 and less than 30 + MultpHM = 1.0; // Default value 1.0 + } + } else { + MultpHM = 1.0; // Default value 1.0 + } + + zone.ZoneVolCapMultpSensHM = MultpHM; // For timestep output + + // Calculate the average multiplier of the zone for the whole running period + { + // count for hybrid model calculations + if (MultpHM > 1.0) { + zone.ZoneVolCapMultpSensHMSum += MultpHM; + zone.ZoneVolCapMultpSensHMCountSum++; + } + + // Calculate and store the multiplier average at the end of HM + // simulations + if (state.dataEnvrn->DayOfYear == hybridModelZone.HybridEndDayOfYear && state.dataGlobal->EndDayFlag) { + HMMultiplierAverage = zone.ZoneVolCapMultpSensHMSum / zone.ZoneVolCapMultpSensHMCountSum; + zone.ZoneVolCapMultpSensHMAverage = HMMultiplierAverage; + } + } + } // Hybrid model internal thermal mass calcualtion end + + // Hybrid model people count calculation + if (hybridModelZone.PeopleCountCalc_T && state.dataHVACGlobal->UseZoneTimeStepHistory) { + zone.ZoneMeasuredTemperature = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneMeasuredTemperatureSchedulePtr); + zone.ZonePeopleActivityLevel = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleActivityLevelSchedulePtr); + zone.ZonePeopleSensibleHeatFraction = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleSensibleFractionSchedulePtr); + zone.ZonePeopleRadiantHeatFraction = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleRadiationFractionSchedulePtr); + + Real64 FractionSensible = zone.ZonePeopleSensibleHeatFraction; + Real64 FractionRadiation = zone.ZonePeopleRadiantHeatFraction; + Real64 ActivityLevel = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleActivityLevelSchedulePtr); + + if (FractionSensible <= 0.0) { + FractionSensible = 0.6; + } + + if (FractionRadiation <= 0.0) { + FractionConvection = 0.7; + } else { + FractionConvection = 1.0 - FractionRadiation; + } + + if (ActivityLevel <= 0.0) { + ActivityLevel = 130.0; + } + + if (hybridModelZone.IncludeSystemSupplyParameters) { + zone.ZoneMeasuredSupplyAirTemperature = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirTemperatureSchedulePtr); + zone.ZoneMeasuredSupplyAirFlowRate = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); + zone.ZoneMeasuredSupplyAirHumidityRatio = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); + + // Calculate the air humidity ratio at supply air inlet. + Real64 CpAirInlet = Psychrometrics::PsyCpAirFnW(zone.ZoneMeasuredSupplyAirHumidityRatio); + + Real64 SumSysMCp_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet; + Real64 SumSysMCpT_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet * zone.ZoneMeasuredSupplyAirTemperature; + + AA = SumSysMCp_HM + SumHA + SumMCp; + BB = SumSysMCpT_HM + SumIntGainExceptPeople + SumHATsurf - SumHATref + SumMCpT + + (thisZoneHB.NonAirSystemResponse / ZoneMult + thisZoneHB.SysDepZoneLoadsLagged); + } else { + AA = SumHA + SumMCp; + BB = SumIntGainExceptPeople + SumHATsurf - SumHATref + SumMCpT; + } + + Real64 CC = AirCap; + Real64 DD = + (3.0 * state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) - (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum) + + (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredZT3(ZoneNum)); + + Real64 SumIntGainPeople = ((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredTemperature - BB - CC * DD; + Real64 UpperBound = max(0.0, SumIntGain / (ActivityLevel * FractionSensible * FractionConvection)); + Real64 NumPeople = min(UpperBound, max(0.0, SumIntGainPeople / (ActivityLevel * FractionSensible * FractionConvection))); + + if (NumPeople < 0.05) { + NumPeople = 0; + } + zone.NumOccHM = NumPeople; + } + } + + // Update zone temperatures in the previous steps + state.dataHeatBalFanSys->PreviousMeasuredZT3(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum); + state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum); + state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) = thisZoneHB.ZT; +} + +void InverseModelHumidity(EnergyPlusData &state, + int const ZoneNum, // Zone number + Real64 const LatentGain, // Zone sum of latent gain + Real64 const LatentGainExceptPeople, // Zone sum of latent gain except for people + Real64 const ZoneMassFlowRate, // Zone air mass flow rate + Real64 const MoistureMassFlowRate, // Zone moisture mass flow rate + Real64 const H2OHtOfVap, // Heat of vaporization of air + Real64 const RhoAir // Air density +) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Han Li + // DATE WRITTEN February 2019 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine inversely solve infiltration airflow rate or people count with zone air humidity measurements. + + // SUBROUTINE PARAMETER DEFINITIONS: + static constexpr std::string_view RoutineName("InverseModelHumidity"); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Real64 AA(0.0); + Real64 BB(0.0); + Real64 ActivityLevel(0.0); + Real64 SysTimeStepInSeconds = DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys; + + auto &zone = state.dataHeatBal->Zone(ZoneNum); + auto &hybridModelZone = state.dataHybridModel->HybridModelZone(ZoneNum); + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); + + // Get measured zone humidity ratio + zone.ZoneMeasuredHumidityRatio = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneMeasuredHumidityRatioSchedulePtr); + + if (state.dataEnvrn->DayOfYear >= hybridModelZone.HybridStartDayOfYear && state.dataEnvrn->DayOfYear <= hybridModelZone.HybridEndDayOfYear) { + thisZoneHB.ZoneAirHumRat = zone.ZoneMeasuredHumidityRatio; + + // Hybrid Model calculate air infiltration rate + if (hybridModelZone.InfiltrationCalc_H && state.dataHVACGlobal->UseZoneTimeStepHistory) { + // Conditionally calculate the time dependent and time independent terms + if (hybridModelZone.IncludeSystemSupplyParameters) { + zone.ZoneMeasuredSupplyAirFlowRate = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); + zone.ZoneMeasuredSupplyAirHumidityRatio = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); + + Real64 SumSysM_HM = zone.ZoneMeasuredSupplyAirFlowRate; + Real64 SumSysMHumRat_HM = zone.ZoneMeasuredSupplyAirFlowRate * zone.ZoneMeasuredSupplyAirHumidityRatio; + + AA = SumSysM_HM + thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + thisZoneHB.MixingMassFlowZone + + thisZoneHB.MDotOA; + BB = SumSysMHumRat_HM + (LatentGain / H2OHtOfVap) + ((thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + + thisZoneHB.EAMFLxHumRat + thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + + thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; + } else { + AA = thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + thisZoneHB.MixingMassFlowZone + thisZoneHB.MDotOA; + BB = (LatentGain / H2OHtOfVap) + ((thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + thisZoneHB.EAMFLxHumRat + + thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; + } + + Real64 CC = RhoAir * zone.Volume * zone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; + Real64 DD = (3.0 * state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum) - + (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum) + + (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat3(ZoneNum)); + + Real64 delta_HR = (zone.ZoneMeasuredHumidityRatio - state.dataEnvrn->OutHumRat); + + Real64 AirDensity = + Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, zone.OutDryBulbTemp, state.dataEnvrn->OutHumRat, RoutineName); + + Real64 M_inf = 0.0; + if (std::abs(zone.ZoneMeasuredHumidityRatio - state.dataEnvrn->OutHumRat) > 0.0000001) { + M_inf = (CC * DD + BB - ((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredHumidityRatio) / delta_HR; + } + + // Add threshold for air change rate + Real64 ACH_inf = max(0.0, min(10.0, (M_inf / AirDensity) / zone.Volume * DataGlobalConstants::SecInHour)); + M_inf = (ACH_inf / DataGlobalConstants::SecInHour) * zone.Volume * AirDensity; + zone.MCPIHM = M_inf; + zone.InfilOAAirChangeRateHM = ACH_inf; + } + + // Hybrid Model calculate people count + if (hybridModelZone.PeopleCountCalc_H && state.dataHVACGlobal->UseZoneTimeStepHistory) { + zone.ZonePeopleActivityLevel = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleActivityLevelSchedulePtr); + zone.ZonePeopleSensibleHeatFraction = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleSensibleFractionSchedulePtr); + zone.ZonePeopleRadiantHeatFraction = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleRadiationFractionSchedulePtr); + + Real64 FractionSensible = zone.ZonePeopleSensibleHeatFraction; + + if (FractionSensible <= 0.0) { + FractionSensible = 0.6; + } + + if (ActivityLevel <= 0.0) { + ActivityLevel = 130.0; + } + + // Conditionally calculate the humidity-dependent and humidity-independent + // terms. + if (hybridModelZone.IncludeSystemSupplyParameters) { + zone.ZoneMeasuredSupplyAirFlowRate = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); + zone.ZoneMeasuredSupplyAirHumidityRatio = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); + + Real64 SumSysM_HM = zone.ZoneMeasuredSupplyAirFlowRate; + Real64 SumSysMHumRat_HM = zone.ZoneMeasuredSupplyAirFlowRate * zone.ZoneMeasuredSupplyAirHumidityRatio; + + AA = SumSysM_HM + thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + + thisZoneHB.MixingMassFlowZone + thisZoneHB.MDotOA; + BB = SumSysMHumRat_HM + (LatentGainExceptPeople / H2OHtOfVap) + + ((thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + thisZoneHB.EAMFLxHumRat + + thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; + } else { + AA = ZoneMassFlowRate + thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + + thisZoneHB.MixingMassFlowZone + thisZoneHB.MDotOA; + BB = (LatentGainExceptPeople / H2OHtOfVap) + ((thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + + thisZoneHB.EAMFLxHumRat + (MoistureMassFlowRate) + thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + + thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; + } + + Real64 CC = RhoAir * zone.Volume * zone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; + Real64 DD = (3.0 * state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum) - + (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum) + + (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat3(ZoneNum)); + + Real64 LatentGainPeople = (((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredHumidityRatio - BB - CC * DD) * H2OHtOfVap; + Real64 UpperBound = max(0.0, LatentGain / (ActivityLevel * (1.0 - FractionSensible))); + Real64 NumPeople = min(UpperBound, max(0.0, LatentGainPeople / (ActivityLevel * (1.0 - FractionSensible)))); + NumPeople = floor(NumPeople * 100.00 + 0.5) / 100.00; + if (NumPeople < 0.05) { + NumPeople = 0; + } + zone.NumOccHM = NumPeople; + } + } + + // Update zone humidity ratio in the previous steps + state.dataHeatBalFanSys->PreviousMeasuredHumRat3(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum); + state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum); + state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum) = zone.ZoneMeasuredHumidityRatio; +} + +void ZoneSpaceHeatBalanceData::calcZoneOrSpaceSums(EnergyPlusData &state, + bool const CorrectorFlag, // Corrector call flag + int const zoneNum, + int const spaceNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Peter Graham Ellis + // DATE WRITTEN July 2003 + // MODIFIED Aug 2003, FCW: add this->SumHA contributions from window frame and divider + // Aug 2003, CC: change how the reference temperatures are used + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine calculates the various sums that go into the zone heat balance + // equation. This replaces the SUMC, SumHA, and SumHAT calculations that were + // previously done in various places throughout the program. + // The SumHAT portion of the code is reproduced in RadiantSystemHighTemp and + // RadiantSystemLowTemp and should be updated accordingly. + // A reference temperature (Tref) is specified for use with the ceiling diffuser + // convection correlation. A bogus value of Tref = -999.9 defaults to using + // the zone air (i.e. outlet) temperature for the reference temperature. + // If Tref is applied to all surfaces, SumHA = 0, and SumHATref /= 0. + // If Tref is not used at all, SumHATref = 0, and SumHA /= 0. + // For future implementations, Tref can be easily converted into an array to + // allow a different reference temperature to be specified for each surface. + assert(zoneNum > 0); + + this->SumHA = 0.0; + this->SumHATsurf = 0.0; + this->SumHATref = 0.0; + this->SumSysMCp = 0.0; + this->SumSysMCpT = 0.0; + // Sum all convective internal gains: this->SumIntGain + if (spaceNum == 0) { + this->SumIntGain = InternalHeatGains::zoneSumAllInternalConvectionGains(state, zoneNum); + } else { + this->SumIntGain = InternalHeatGains::spaceSumAllInternalConvectionGains(state, spaceNum); + } + this->SumIntGain += state.dataHeatBalFanSys->SumConvHTRadSys(zoneNum) + state.dataHeatBalFanSys->SumConvPool(zoneNum); + + // Add heat to return air if zonal system (no return air) or cycling system (return air frequently very low or zero) + assert(zoneNum > 0); + auto &thisZone = state.dataHeatBal->Zone(zoneNum); + if (thisZone.NoHeatToReturnAir) { + if (spaceNum == 0) { + this->SumIntGain += InternalHeatGains::zoneSumAllReturnAirConvectionGains(state, zoneNum, 0); + } else { + this->SumIntGain += InternalHeatGains::spaceSumAllReturnAirConvectionGains(state, spaceNum, 0); + } + } + + // Sum all non-system air flow, i.e. infiltration, simple ventilation, mixing, earth tube: this->SumMCp, this->SumMCpT + this->SumMCp = this->MCPI + this->MCPV + this->MCPM + this->MCPE + this->MCPC + this->MDotCPOA; + this->SumMCpT = this->MCPTI + this->MCPTV + this->MCPTM + this->MCPTE + this->MCPTC + this->MDotCPOA * thisZone.OutDryBulbTemp; + + // Sum all multizone air flow calculated from AirflowNetwork by assuming no simple air infiltration model + if (state.afn->multizone_always_simulated || + (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && + state.afn->AirflowNetworkFanActivated)) { + auto &exchangeData = state.afn->exchangeData(zoneNum); + this->SumMCp = exchangeData.SumMCp + exchangeData.SumMVCp + exchangeData.SumMMCp; + this->SumMCpT = exchangeData.SumMCpT + exchangeData.SumMVCpT + exchangeData.SumMMCpT; + } + + // Sum all system air flow: this->SumSysMCp, this->SumSysMCpT and check to see if this is a controlled zone + if (CorrectorFlag) { + // Plenum and controlled zones have a different set of inlet nodes which must be calculated. + if (thisZone.IsControlled) { + auto const &zec(state.dataZoneEquip->ZoneEquipConfig(zoneNum)); + for (int NodeNum = 1, NodeNum_end = zec.NumInletNodes; NodeNum <= NodeNum_end; ++NodeNum) { + // Get node conditions, this next block is of interest to irratic system loads... maybe nodes are not accurate at time of call? + // how can we tell? predict step must be lagged ? correct step, systems have run. + auto const &node(state.dataLoopNodes->Node(zec.InletNode(NodeNum))); + Real64 CpAir = Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat); + Real64 const MassFlowRate_CpAir(node.MassFlowRate * CpAir); + this->SumSysMCp += MassFlowRate_CpAir; + this->SumSysMCpT += MassFlowRate_CpAir * node.Temp; + } + + } else if (thisZone.IsReturnPlenum) { + auto const &zrpc(state.dataZonePlenum->ZoneRetPlenCond(thisZone.PlenumCondNum)); + Real64 const air_hum_rat(this->ZoneAirHumRat); + for (int NodeNum = 1, NodeNum_end = zrpc.NumInletNodes; NodeNum <= NodeNum_end; ++NodeNum) { + auto const &node(state.dataLoopNodes->Node(zrpc.InletNode(NodeNum))); + Real64 const MassFlowRate_CpAir(node.MassFlowRate * Psychrometrics::PsyCpAirFnW(air_hum_rat)); + this->SumSysMCp += MassFlowRate_CpAir; + this->SumSysMCpT += MassFlowRate_CpAir * node.Temp; + } + // add in the leaks + for (int ADUListIndex = 1, ADUListIndex_end = zrpc.NumADUs; ADUListIndex <= ADUListIndex_end; ++ADUListIndex) { + auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(zrpc.ADUIndex(ADUListIndex)); + if (airDistUnit.UpStreamLeak) { + Real64 const MassFlowRate_CpAir(airDistUnit.MassFlowRateUpStrLk * Psychrometrics::PsyCpAirFnW(air_hum_rat)); + this->SumSysMCp += MassFlowRate_CpAir; + this->SumSysMCpT += MassFlowRate_CpAir * state.dataLoopNodes->Node(airDistUnit.InletNodeNum).Temp; + } + if (airDistUnit.DownStreamLeak) { + Real64 const MassFlowRate_CpAir(airDistUnit.MassFlowRateDnStrLk * Psychrometrics::PsyCpAirFnW(air_hum_rat)); + this->SumSysMCp += MassFlowRate_CpAir; + this->SumSysMCpT += MassFlowRate_CpAir * state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).Temp; + } + } + + } else if (thisZone.IsSupplyPlenum) { + Real64 MassFlowRate = state.dataLoopNodes->Node(state.dataZonePlenum->ZoneSupPlenCond(thisZone.PlenumCondNum).InletNode).MassFlowRate; + Real64 CpAir = Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat); + this->SumSysMCp += MassFlowRate * CpAir; + this->SumSysMCpT += + MassFlowRate * CpAir * state.dataLoopNodes->Node(state.dataZonePlenum->ZoneSupPlenCond(thisZone.PlenumCondNum).InletNode).Temp; + } + + int ZoneMult = thisZone.Multiplier * thisZone.ListMultiplier; + + this->SumSysMCp /= ZoneMult; + this->SumSysMCpT /= ZoneMult; + } + + if (spaceNum > 0) { + Real64 spaceFrac = state.dataHeatBal->space(spaceNum).fracZoneVolume; + this->SumSysMCp *= spaceFrac; + this->SumSysMCpT *= spaceFrac; + } + + // Sum all surface convection: this->SumHA, this->SumHATsurf, this->SumHATref (and additional contributions to this->SumIntGain) + SumHATOutput sumHATResults; // space or zone return values + sumHATResults = this->calcSumHAT(state, zoneNum, spaceNum); + this->SumIntGain += sumHATResults.sumIntGain; + this->SumHA = sumHATResults.sumHA; + this->SumHATsurf = sumHATResults.sumHATsurf; + this->SumHATref = sumHATResults.sumHATref; +} + +SumHATOutput ZoneHeatBalanceData::calcSumHAT(EnergyPlusData &state, int const zoneNum, [[maybe_unused]] int const spaceNum) +{ + assert(zoneNum > 0); + assert(spaceNum == 0); + SumHATOutput zoneResults; // zone-level return values + for (int zoneSpaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + SumHATOutput spaceResults; // temporary return value from space-level calcSumHAT + spaceResults = state.dataZoneTempPredictorCorrector->spaceHeatBalance(zoneSpaceNum).calcSumHAT(state, zoneNum, zoneSpaceNum); + zoneResults.sumIntGain += spaceResults.sumIntGain; + zoneResults.sumHA += spaceResults.sumHA; + zoneResults.sumHATsurf += spaceResults.sumHATsurf; + zoneResults.sumHATref += spaceResults.sumHATref; + } + return zoneResults; +} + +SumHATOutput SpaceHeatBalanceData::calcSumHAT(EnergyPlusData &state, int const zoneNum, int const spaceNum) +{ + assert(zoneNum > 0); + assert(spaceNum > 0); + auto &thisZone = state.dataHeatBal->Zone(zoneNum); + auto &thisSpace = state.dataHeatBal->space(spaceNum); + SumHATOutput results; // space-level return values + + for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { + Real64 HA = 0.0; + Real64 Area = state.dataSurface->Surface(SurfNum).Area; // For windows, this is the glazing area + + if (state.dataSurface->Surface(SurfNum).Class == DataSurfaces::SurfaceClass::Window) { + DataSurfaces::WinShadingType const shading_flag = state.dataSurface->SurfWinShadingFlag(SurfNum); + + // Add to the convective internal gains + if (ANY_INTERIOR_SHADE_BLIND(shading_flag)) { + // The shade area covers the area of the glazing plus the area of the dividers. + Area += state.dataSurface->SurfWinDividerArea(SurfNum); + // If interior shade or blind is present it is assumed that both the convective and IR radiative gain + // from the inside surface of the divider goes directly into the zone air -- i.e., the IR radiative + // interaction between divider and shade or blind is ignored due to the difficulty of calculating this interaction + // at the same time that the interaction between glass and shade is calculated. + results.sumIntGain += state.dataSurface->SurfWinDividerHeatGain(SurfNum); + } + + // Other convection term is applicable to equivalent layer window (ASHWAT) model + if (state.dataConstruction->Construct(state.dataSurface->Surface(SurfNum).Construction).WindowTypeEQL) + results.sumIntGain += state.dataSurface->SurfWinOtherConvHeatGain(SurfNum); + + // Convective heat gain from natural convection in gap between glass and interior shade or blind + if (ANY_INTERIOR_SHADE_BLIND(shading_flag)) results.sumIntGain += state.dataSurface->SurfWinConvHeatFlowNatural(SurfNum); + + // Convective heat gain from airflow window + if (state.dataSurface->SurfWinAirflowThisTS(SurfNum) > 0.0) { + results.sumIntGain += state.dataSurface->SurfWinConvHeatGainToZoneAir(SurfNum); + if (thisZone.NoHeatToReturnAir) { + results.sumIntGain += state.dataSurface->SurfWinRetHeatGainToZoneAir(SurfNum); + state.dataSurface->SurfWinHeatGain(SurfNum) += state.dataSurface->SurfWinRetHeatGainToZoneAir(SurfNum); + if (state.dataSurface->SurfWinHeatGain(SurfNum) >= 0.0) { + state.dataSurface->SurfWinHeatGainRep(SurfNum) = state.dataSurface->SurfWinHeatGain(SurfNum); + state.dataSurface->SurfWinHeatGainRepEnergy(SurfNum) = + state.dataSurface->SurfWinHeatGainRep(SurfNum) * state.dataGlobal->TimeStepZoneSec; + } else { + state.dataSurface->SurfWinHeatLossRep(SurfNum) = -state.dataSurface->SurfWinHeatGain(SurfNum); + state.dataSurface->SurfWinHeatLossRepEnergy(SurfNum) = + state.dataSurface->SurfWinHeatLossRep(SurfNum) * state.dataGlobal->TimeStepZoneSec; + } + state.dataSurface->SurfWinHeatTransferRepEnergy(SurfNum) = + state.dataSurface->SurfWinHeatGain(SurfNum) * state.dataGlobal->TimeStepZoneSec; + } + } + + // Add to the surface convection sums + if (state.dataSurface->SurfWinFrameArea(SurfNum) > 0.0) { + // Window frame contribution + Real64 const HA_surf(state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinFrameArea(SurfNum) * + (1.0 + state.dataSurface->SurfWinProjCorrFrIn(SurfNum))); + results.sumHATsurf += HA_surf * state.dataSurface->SurfWinFrameTempIn(SurfNum); + HA += HA_surf; + } + + if (state.dataSurface->SurfWinDividerArea(SurfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(shading_flag)) { + // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) + Real64 const HA_surf(state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinDividerArea(SurfNum) * + (1.0 + 2.0 * state.dataSurface->SurfWinProjCorrDivIn(SurfNum))); + results.sumHATsurf += HA_surf * state.dataSurface->SurfWinDividerTempIn(SurfNum); + HA += HA_surf; + } + + } // End of check if window + + HA += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * Area; + results.sumHATsurf += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * Area * state.dataHeatBalSurf->SurfTempInTmp(SurfNum); + + // determine reference air temperature for this surface + switch (state.dataSurface->SurfTAirRef(SurfNum)) { + case DataSurfaces::RefAirTemp::ZoneMeanAirTemp: + // The zone air is the reference temperature (which is to be solved for in CorrectZoneAirTemp). + results.sumHA += HA; + break; + case DataSurfaces::RefAirTemp::AdjacentAirTemp: + results.sumHATref += HA * state.dataHeatBal->SurfTempEffBulkAir(SurfNum); + break; + case DataSurfaces::RefAirTemp::ZoneSupplyAirTemp: + // check whether this zone is a controlled zone or not + if (!thisZone.IsControlled) { + ShowFatalError(state, "Zones must be controlled for Ceiling-Diffuser Convection model. No system serves zone " + thisZone.Name); + return results; + } + // determine supply air temperature as a weighted average of the inlet temperatures. + // TODO: For now, use zone-level values for system flow + if (state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).SumSysMCp > 0.0) { + results.sumHATref += HA * state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).SumSysMCpT / + state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).SumSysMCp; + } else { + // no system flow (yet) so just use zone air temperature #5906 + results.sumHA += HA; + } + break; + default: + // currently set to mean air temp but should add error warning here + results.sumHA += HA; + break; + } + + } // SurfNum + return results; +} +void CalcZoneComponentLoadSums(EnergyPlusData &state, + int const ZoneNum, // Zone number + Real64 const TempDepCoef, // Dependent coefficient + Real64 const TempIndCoef, // Independent coefficient + Real64 &SumIntGains, // Zone sum of convective internal gains + Real64 &SumHADTsurfs, // Zone sum of Hc*Area*(Tsurf - Tz) + Real64 &SumMCpDTzones, // zone sum of MassFlowRate*cp*(TremotZone - Tz) transfer air from other zone, Mixing + Real64 &SumMCpDtInfil, // Zone sum of MassFlowRate*Cp*(Tout - Tz) transfer from outside, ventil, earth tube + Real64 &SumMCpDTsystem, // Zone sum of air system MassFlowRate*Cp*(Tsup - Tz) + Real64 &SumNonAirSystem, // Zone sum of non air system convective heat gains + Real64 &CzdTdt, // Zone air energy storage term. + Real64 &imBalance, // put all terms in eq. 5 on RHS , should be zero + Real64 &SumEnthalpyM, // Zone sum of phase change material melting enthlpy + Real64 &SumEnthalpyH // Zone sum of phase change material freezing enthalpy +) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Brent Griffith + // DATE WRITTEN Feb 2008 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine calculates the various sums that go into the zone heat balance + // equation for reporting (and diagnostic) purposes only. + // It was derived from CalcZoneSums but differs in that that routine + // breaks up the component's dependence on zone air temp in order to *solve* for zone air temp, + // but here we *use* the result for zone air temp and calculate the terms of the heat balance + // Go back and calculate each of the 6 terms in Equation 5 and fill report variables. + // notes on these raw terms for zone air heat balance model : + // these are state variables at the end of the last system timestep. + // they are not necessarily proper averages for what happened over entire zone time step + // these are not multiplied by zone multipliers. + // The values are all Watts. + + // REFERENCES: + // Equation 5 in Engineering Reference. + + SumIntGains = 0.0; // Zone sum of convective internal gains + SumHADTsurfs = 0.0; // Zone sum of Hc*Area*(Tsurf - Tz) + SumMCpDTzones = 0.0; // zone sum of MassFlowRate*cp*(TremotZone - Tz) transfer air from other zone, Mixing + SumMCpDtInfil = 0.0; // Zone sum of MassFlowRate*Cp*(Tout - Tz) + SumMCpDTsystem = 0.0; // Zone sum of air system MassFlowRate*Cp*(Tsup - Tz) + SumNonAirSystem = 0.0; + CzdTdt = 0.0; + imBalance = 0.0; + SumEnthalpyM = 0.0; + SumEnthalpyH = 0.0; + + auto &thisZone = state.dataHeatBal->Zone(ZoneNum); + auto const &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); + + // Sum all convective internal gains: SumIntGain + SumIntGains = InternalHeatGains::zoneSumAllInternalConvectionGains(state, ZoneNum); + + // Add heat to return air if zonal system (no return air) or cycling system (return air frequently very + // low or zero) + if (thisZone.NoHeatToReturnAir) { + SumIntGains += InternalHeatGains::zoneSumAllReturnAirConvectionGains(state, ZoneNum, 0); + } + + // sum non-system air flow transfers between zones + SumMCpDTzones = thisZoneHB.MCPTM - thisZoneHB.MCPM * thisZoneHB.MAT; // but maybe it should be ZTAV(ZoneNum) + + // Sum non-system air flow, i.e. infiltration, simple ventilation, earth tube + // reuse SumMCp, SumMCpT from CalcZoneSum but use MAT (or maybe ZTAV?) to complete + SumMCpDtInfil = (thisZoneHB.MCPTI - thisZoneHB.MCPI * thisZoneHB.MAT) + (thisZoneHB.MCPTV - thisZoneHB.MCPV * thisZoneHB.MAT) + + (thisZoneHB.MCPTE - thisZoneHB.MCPE * thisZoneHB.MAT) + (thisZoneHB.MCPTC - thisZoneHB.MCPC * thisZoneHB.MAT) + + (thisZoneHB.MDotCPOA * thisZone.OutDryBulbTemp - + thisZoneHB.MDotCPOA * thisZoneHB.MAT); // infiltration | Ventilation (simple) | Earth tube. | Cooltower | combined OA flow + + // Sum all multizone air flow calculated from AirflowNetwork by assuming no simple air infiltration model (if used) + if (state.afn->multizone_always_simulated || + (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && + state.afn->AirflowNetworkFanActivated)) { + // Multizone airflow calculated in AirflowNetwork + SumMCpDtInfil = state.afn->exchangeData(ZoneNum).SumMCpT + state.afn->exchangeData(ZoneNum).SumMVCpT - + (state.afn->exchangeData(ZoneNum).SumMCp + state.afn->exchangeData(ZoneNum).SumMVCp) * thisZoneHB.MAT; + SumMCpDTzones = state.afn->exchangeData(ZoneNum).SumMMCpT - state.afn->exchangeData(ZoneNum).SumMMCp * thisZoneHB.MAT; + } + + // Sum all system air flow: reusing how SumSysMCp, SumSysMCpT are calculated in CalcZoneSums + // Plenum and controlled zones have a different set of inlet nodes which must be calculated. + Real64 QSensRate = 0.0; + if (thisZone.IsControlled) { + auto &zoneEquipConfig = state.dataZoneEquip->ZoneEquipConfig(ZoneNum); + for (int NodeNum = 1; NodeNum <= zoneEquipConfig.NumInletNodes; ++NodeNum) { + // Get node conditions + Real64 const NodeTemp = state.dataLoopNodes->Node(zoneEquipConfig.InletNode(NodeNum)).Temp; + Real64 const MassFlowRate = state.dataLoopNodes->Node(zoneEquipConfig.InletNode(NodeNum)).MassFlowRate; + QSensRate = calcZoneSensibleOutput(MassFlowRate, NodeTemp, thisZoneHB.MAT, thisZoneHB.ZoneAirHumRat); + SumMCpDTsystem += QSensRate; + + if (zoneEquipConfig.InletNodeADUNum(NodeNum) > 0) { + auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(zoneEquipConfig.InletNodeADUNum(NodeNum)); + Real64 ADUHeatAddRate = calcZoneSensibleOutput(state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).MassFlowRate, + state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).Temp, + thisZoneHB.MAT, + thisZoneHB.ZoneAirHumRat); + airDistUnit.HeatRate = max(0.0, ADUHeatAddRate); + airDistUnit.CoolRate = std::abs(min(0.0, ADUHeatAddRate)); + airDistUnit.HeatGain = airDistUnit.HeatRate * state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour; + airDistUnit.CoolGain = airDistUnit.CoolRate * state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour; + } + } + + } else if (thisZone.IsReturnPlenum) { + auto &zoneRetPlenCond = state.dataZonePlenum->ZoneRetPlenCond(thisZone.PlenumCondNum); + for (int NodeNum = 1; NodeNum <= zoneRetPlenCond.NumInletNodes; ++NodeNum) { + QSensRate = calcZoneSensibleOutput(state.dataLoopNodes->Node(zoneRetPlenCond.InletNode(NodeNum)).MassFlowRate, + state.dataLoopNodes->Node(zoneRetPlenCond.InletNode(NodeNum)).Temp, + thisZoneHB.MAT, + thisZoneHB.ZoneAirHumRat); + SumMCpDTsystem += QSensRate; + } + // add in the leaks + for (int ADUListIndex = 1; ADUListIndex <= zoneRetPlenCond.NumADUs; ++ADUListIndex) { + auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(zoneRetPlenCond.ADUIndex(ADUListIndex)); + if (airDistUnit.UpStreamLeak) { + QSensRate = calcZoneSensibleOutput(airDistUnit.MassFlowRateUpStrLk, + state.dataLoopNodes->Node(airDistUnit.InletNodeNum).Temp, + thisZoneHB.MAT, + thisZoneHB.ZoneAirHumRat); + SumMCpDTsystem += QSensRate; + } + if (airDistUnit.DownStreamLeak) { + QSensRate = calcZoneSensibleOutput(airDistUnit.MassFlowRateDnStrLk, + state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).Temp, + thisZoneHB.MAT, + thisZoneHB.ZoneAirHumRat); + SumMCpDTsystem += QSensRate; + } + } + + } else if (thisZone.IsSupplyPlenum) { + auto &zoneSupPlenCond = state.dataZonePlenum->ZoneSupPlenCond(thisZone.PlenumCondNum); + QSensRate = calcZoneSensibleOutput(state.dataLoopNodes->Node(zoneSupPlenCond.InletNode).MassFlowRate, + state.dataLoopNodes->Node(zoneSupPlenCond.InletNode).Temp, + thisZoneHB.MAT, + thisZoneHB.ZoneAirHumRat); + SumMCpDTsystem += QSensRate; + } + + // non air system response. + SumNonAirSystem = + thisZoneHB.NonAirSystemResponse + state.dataHeatBalFanSys->SumConvHTRadSys(ZoneNum) + state.dataHeatBalFanSys->SumConvPool(ZoneNum); + + // Sum all surface convection: SumHA, SumHATsurf, SumHATref (and additional contributions to SumIntGain) + for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) { + auto &thisSpace = state.dataHeatBal->space(spaceNum); + for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { + + Real64 Area = state.dataSurface->Surface(SurfNum).Area; // For windows, this is the glazing area + Real64 RefAirTemp = state.dataSurface->Surface(SurfNum).getInsideAirTemperature(state, SurfNum); + + if (state.dataSurface->Surface(SurfNum).Class == DataSurfaces::SurfaceClass::Window) { + + // Add to the convective internal gains + if (ANY_INTERIOR_SHADE_BLIND(state.dataSurface->SurfWinShadingFlag(SurfNum))) { + // The shade area covers the area of the glazing plus the area of the dividers. + Area += state.dataSurface->SurfWinDividerArea(SurfNum); + // If interior shade or blind is present it is assumed that both the convective and IR radiative gain + // from the inside surface of the divider goes directly into the zone air -- i.e., the IR radiative + // interaction between divider and shade or blind is ignored due to the difficulty of calculating this interaction + // at the same time that the interaction between glass and shade is calculated. + SumIntGains += state.dataSurface->SurfWinDividerHeatGain(SurfNum); + } + + // Other convection term is applicable to equivalent layer window (ASHWAT) model + if (state.dataConstruction->Construct(state.dataSurface->Surface(SurfNum).Construction).WindowTypeEQL) + SumIntGains += state.dataSurface->SurfWinOtherConvHeatGain(SurfNum); + + // Convective heat gain from natural convection in gap between glass and interior shade or blind + if (ANY_INTERIOR_SHADE_BLIND(state.dataSurface->SurfWinShadingFlag(SurfNum))) + SumIntGains += state.dataSurface->SurfWinConvHeatFlowNatural(SurfNum); + + // Convective heat gain from airflow window + if (state.dataSurface->SurfWinAirflowThisTS(SurfNum) > 0.0) { + SumIntGains += state.dataSurface->SurfWinConvHeatGainToZoneAir(SurfNum); + if (thisZone.NoHeatToReturnAir) { + SumIntGains += state.dataSurface->SurfWinRetHeatGainToZoneAir(SurfNum); + } + } + + // Add to the surface convection sums + if (state.dataSurface->SurfWinFrameArea(SurfNum) > 0.0) { + // Window frame contribution + SumHADTsurfs += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinFrameArea(SurfNum) * + (1.0 + state.dataSurface->SurfWinProjCorrFrIn(SurfNum)) * + (state.dataSurface->SurfWinFrameTempIn(SurfNum) - RefAirTemp); + } + + if (state.dataSurface->SurfWinDividerArea(SurfNum) > 0.0 && + !ANY_INTERIOR_SHADE_BLIND(state.dataSurface->SurfWinShadingFlag(SurfNum))) { + // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) + SumHADTsurfs += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinDividerArea(SurfNum) * + (1.0 + 2.0 * state.dataSurface->SurfWinProjCorrDivIn(SurfNum)) * + (state.dataSurface->SurfWinDividerTempIn(SurfNum) - RefAirTemp); + } + + } // End of check if window + + SumHADTsurfs += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * Area * (state.dataHeatBalSurf->SurfTempInTmp(SurfNum) - RefAirTemp); + + // Accumulate Zone Phase Change Material Melting/Freezing Enthalpy output variables + if (state.dataSurface->Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD) { + state.dataHeatBal->ZnAirRpt(ZoneNum).SumEnthalpyM += state.dataHeatBalFiniteDiffMgr->SurfaceFD(SurfNum).EnthalpyM; + state.dataHeatBal->ZnAirRpt(ZoneNum).SumEnthalpyH += state.dataHeatBalFiniteDiffMgr->SurfaceFD(SurfNum).EnthalpyF; + } + } + } + // now calculate air energy storage source term. + // capacitance is volume * density * heat capacity + Real64 CpAir = Psychrometrics::PsyCpAirFnW(thisZoneHB.ZoneAirHumRat); + Real64 RhoAir = Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, thisZoneHB.MAT, thisZoneHB.ZoneAirHumRat); + + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + CzdTdt = RhoAir * CpAir * thisZone.Volume * thisZone.ZoneVolCapMultpSens * (thisZoneHB.MAT - thisZoneHB.ZTM[0]) / + (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); + // Exact solution + } break; + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + CzdTdt = TempIndCoef - TempDepCoef * thisZoneHB.MAT; + } break; + case DataHeatBalance::SolutionAlgo::EulerMethod: { + CzdTdt = thisZoneHB.AirPowerCap * (thisZoneHB.MAT - thisZoneHB.ZoneT1); + } break; + default: + break; + } + + if (state.dataGlobal->DisplayZoneAirHeatBalanceOffBalance) { + imBalance = SumIntGains + SumHADTsurfs + SumMCpDTzones + SumMCpDtInfil + SumMCpDTsystem + SumNonAirSystem - CzdTdt; + + // throw warning if seriously out of balance (this may need to be removed if too noisy... ) + // formulate dynamic threshold value based on 20% of quadrature sum of components + Real64 Threshold = 0.2 * std::sqrt(pow_2(SumIntGains) + pow_2(SumHADTsurfs) + pow_2(SumMCpDTzones) + pow_2(SumMCpDtInfil) + + pow_2(SumMCpDTsystem) + pow_2(SumNonAirSystem) + pow_2(CzdTdt)); + if ((std::abs(imBalance) > Threshold) && (!state.dataGlobal->WarmupFlag) && + (!state.dataGlobal->DoingSizing)) { // air balance is out by more than threshold + if (thisZone.AirHBimBalanceErrIndex == 0) { + ShowWarningMessage(state, format("Zone Air Heat Balance is out of balance for zone named {}", thisZone.Name)); + ShowContinueError(state, format("Zone Air Heat Balance Deviation Rate is more than {:.1R} {{W}}", Threshold)); + if (state.dataHVACGlobal->TurnFansOn) { + ShowContinueError(state, "Night cycle fan operation may be causing above error"); + } + + ShowContinueErrorTimeStamp(state, " Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + format("Zone Air Heat Balance is out of balance ... zone named {}", thisZone.Name), + thisZone.AirHBimBalanceErrIndex, + std::abs(imBalance) - Threshold, + std::abs(imBalance) - Threshold, + _, + "{W}", + "{W}"); + } + } +} + +bool VerifyThermostatInZone(EnergyPlusData &state, std::string const &ZoneName) // Zone to verify +{ + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN Feb 2005 + + // PURPOSE OF THIS FUNCTION: + // This function verifies that a zone (by name) has a Zone Control:Thermostatic object entered. + + if (state.dataZoneCtrls->GetZoneAirStatsInputFlag) { + GetZoneAirSetPoints(state); + state.dataZoneCtrls->GetZoneAirStatsInputFlag = false; + } + if (state.dataZoneCtrls->NumTempControlledZones > 0) { + if (UtilityRoutines::FindItemInList(ZoneName, state.dataZoneCtrls->TempControlledZone, &DataZoneControls::ZoneTempControls::ZoneName) > 0) { + return true; + } else { + return false; + } + } + return false; +} + +bool VerifyControlledZoneForThermostat(EnergyPlusData &state, std::string const &ZoneName) // Zone to verify +{ + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN Mar 2007 + + // PURPOSE OF THIS FUNCTION: + // This function verifies that a zone (by name) has a ZoneHVAC:EquipmentConnections object entered. + + return (UtilityRoutines::FindItemInList(ZoneName, state.dataZoneEquip->ZoneEquipConfig, &DataZoneEquipment::EquipConfiguration::ZoneName) > 0); +} + +void DetectOscillatingZoneTemp(EnergyPlusData &state) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Jason Glazer + // DATE WRITTEN August 2005 + + // PURPOSE OF THIS SUBROUTINE: + // Oscillating temperatures between HVAC timesteps indicate that the + // simulation may be poor. Code is trying to be fast since the purpose + // is to see the impact on oscillating by trying longer time steps in + // an attempt to speed up the simulation. + // Note that the OscillateMagnitude threshold must be less than + // MaxZoneTempDiff since ManageHVAC keeps shortening the timestep + // until that is reached unless it goes to less than the + // MinTimeStepSys. + + // first time run allocate arrays and setup output variable + if (state.dataZoneTempPredictorCorrector->SetupOscillationOutputFlag) { + state.dataZoneTempPredictorCorrector->ZoneTempHist.allocate(4, state.dataGlobal->NumOfZones); + state.dataZoneTempPredictorCorrector->ZoneTempHist = 0.0; + state.dataZoneTempPredictorCorrector->ZoneTempOscillate.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband.dimension(state.dataGlobal->NumOfZones, 0.0); + // set up zone by zone variables, CurrentModuleObject='Zone' + for (int iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) { + auto &zone = state.dataHeatBal->Zone(iZone); + SetupOutputVariable(state, + "Zone Oscillating Temperatures Time", + OutputProcessor::Unit::hr, + state.dataZoneTempPredictorCorrector->ZoneTempOscillate(iZone), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zone.Name); + SetupOutputVariable(state, + "Zone Oscillating Temperatures During Occupancy Time", + OutputProcessor::Unit::hr, + state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy(iZone), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zone.Name); + SetupOutputVariable(state, + "Zone Oscillating Temperatures in Deadband Time", + OutputProcessor::Unit::hr, + state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband(iZone), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zone.Name); + } + // set up a variable covering all zones + SetupOutputVariable(state, + "Facility Any Zone Oscillating Temperatures Time", + OutputProcessor::Unit::hr, + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + "Facility"); + SetupOutputVariable(state, + "Facility Any Zone Oscillating Temperatures During Occupancy Time", + OutputProcessor::Unit::hr, + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateDuringOccupancy, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + "Facility"); + SetupOutputVariable(state, + "Facility Any Zone Oscillating Temperatures in Deadband Time", + OutputProcessor::Unit::hr, + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateInDeadband, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + "Facility"); + // test if the oscillation variables are even used + if (ReportingThisVariable(state, "Zone Oscillating Temperatures Time") || + ReportingThisVariable(state, "Zone Oscillating Temperatures During Occupancy Time") || + ReportingThisVariable(state, "Zone Oscillating Temperatures in Deadband Time") || + ReportingThisVariable(state, "Facility Any Zone Oscillating Temperatures Time") || + ReportingThisVariable(state, "Facility Any Zone Oscillating Temperatures During Occupancy Time") || + ReportingThisVariable(state, "Facility Any Zone Oscillating Temperatures in Deadband Time")) { + state.dataZoneTempPredictorCorrector->OscillationVariablesNeeded = true; + } + state.dataZoneTempPredictorCorrector->SetupOscillationOutputFlag = false; + } + + auto &TimeStepSys = state.dataHVACGlobal->TimeStepSys; + if (state.dataZoneTempPredictorCorrector->OscillationVariablesNeeded) { + // precalc the negative value for performance + Real64 NegOscillateMagnitude = -DataHVACGlobals::OscillateMagnitude; + // assume no zone is oscillating + bool isAnyZoneOscillating = false; + bool isAnyZoneOscillatingDuringOccupancy = false; + bool isAnyZoneOscillatingInDeadband = false; + + for (int iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) { + bool isOscillate = false; + state.dataZoneTempPredictorCorrector->ZoneTempHist(4, iZone) = state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone); + state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone) = state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone); + state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone) = state.dataZoneTempPredictorCorrector->ZoneTempHist(1, iZone); + state.dataZoneTempPredictorCorrector->ZoneTempHist(1, iZone) = state.dataZoneTempPredictorCorrector->zoneHeatBalance(iZone).ZT; + Real64 Diff34 = + state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone) - state.dataZoneTempPredictorCorrector->ZoneTempHist(4, iZone); + Real64 Diff23 = + state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone) - state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone); + Real64 Diff12 = + state.dataZoneTempPredictorCorrector->ZoneTempHist(1, iZone) - state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone); + // roll out the conditionals for increased performance + if (Diff12 > DataHVACGlobals::OscillateMagnitude) { + if (Diff23 < NegOscillateMagnitude) { + if (Diff34 > DataHVACGlobals::OscillateMagnitude) { + isOscillate = true; + } + } + } + // now try the opposite sequence of swings + if (Diff12 < NegOscillateMagnitude) { + if (Diff23 > DataHVACGlobals::OscillateMagnitude) { + if (Diff34 < NegOscillateMagnitude) { + isOscillate = true; + } + } + } + state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy(iZone) = 0.0; + state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband(iZone) = 0.0; + if (isOscillate) { + state.dataZoneTempPredictorCorrector->ZoneTempOscillate(iZone) = TimeStepSys; + isAnyZoneOscillating = true; + if (allocated(state.dataThermalComforts->ThermalComfortInASH55)) { + if (state.dataThermalComforts->ThermalComfortInASH55(iZone).ZoneIsOccupied) { + state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy(iZone) = TimeStepSys; + isAnyZoneOscillatingDuringOccupancy = true; + } + } + if (state.dataZoneEnergyDemand->CurDeadBandOrSetback(iZone)) { + state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband(iZone) = TimeStepSys; + isAnyZoneOscillatingInDeadband = true; + } + } else { + state.dataZoneTempPredictorCorrector->ZoneTempOscillate(iZone) = 0.0; + } + } + // any zone variable + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillate = (isAnyZoneOscillating) ? TimeStepSys : 0.0; + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateDuringOccupancy = (isAnyZoneOscillatingDuringOccupancy) ? TimeStepSys : 0.0; + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateInDeadband = (isAnyZoneOscillatingInDeadband) ? TimeStepSys : 0.0; + + // annual/runperiod sum for _perflog.csv file + state.dataZoneTempPredictorCorrector->AnnualAnyZoneTempOscillate += state.dataZoneTempPredictorCorrector->AnyZoneTempOscillate; + state.dataZoneTempPredictorCorrector->AnnualAnyZoneTempOscillateDuringOccupancy += + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateDuringOccupancy; + state.dataZoneTempPredictorCorrector->AnnualAnyZoneTempOscillateInDeadband += + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateInDeadband; + } +} + +void AdjustAirSetPointsforOpTempCntrl(EnergyPlusData &state, int const TempControlledZoneID, int const ActualZoneNum, Real64 &ZoneAirSetPoint) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR B. Griffith + // DATE WRITTEN June 2006 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine modifies the air temperature setpoint to effect operative temperature control + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Real64 thisMRTFraction; // local variable for fraction that MRT is in Op Temp definition + + if (!(state.dataZoneCtrls->AnyOpTempControl)) return; // do nothing to setpoint + + auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID); + if (!(tempControlledZone.OperativeTempControl)) return; // do nothing to setpoint + + // is operative temp radiative fraction scheduled or fixed? + thisMRTFraction = (tempControlledZone.OpTempCntrlModeScheduled) + ? ScheduleManager::GetCurrentScheduleValue(state, tempControlledZone.OpTempRadiativeFractionSched) + : tempControlledZone.FixedRadiativeFraction; + + // get mean radiant temperature for zone + Real64 thisMRT = state.dataHeatBal->ZoneMRT(ActualZoneNum); + + // modify setpoint for operative temperature control + // traping for MRT fractions between 0.0 and 0.9 during get input, so shouldn't be able to divide by zero here. + ZoneAirSetPoint = (ZoneAirSetPoint - thisMRTFraction * thisMRT) / (1.0 - thisMRTFraction); +} + +void AdjustOperativeSetPointsforAdapComfort(EnergyPlusData &state, int const TempControlledZoneID, Real64 &ZoneAirSetPoint) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Xuan Luo + // DATE WRITTEN Jan 2017 + + // PURPOSE OF THIS SUBROUTINE: + // This routine adjust the operative setpoints for each controlled adaptive thermal comfort models. + + auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID); + auto &AdapComfortDailySetPointSchedule = state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule; + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int originZoneAirSetPoint = ZoneAirSetPoint; + int AdaptiveComfortModelTypeIndex = tempControlledZone.AdaptiveComfortModelTypeIndex; + + // adjust zone operative setpoint + if (!(tempControlledZone.AdaptiveComfortTempControl)) return; // do nothing to setpoint + if ((state.dataWeatherManager->Environment(state.dataWeatherManager->Envrn).KindOfEnvrn != DataGlobalConstants::KindOfSim::DesignDay) && + (state.dataWeatherManager->Environment(state.dataWeatherManager->Envrn).KindOfEnvrn != DataGlobalConstants::KindOfSim::HVACSizeDesignDay)) { + // Adjust run period cooling set point + switch (AdaptiveComfortModelTypeIndex) { + case static_cast(AdaptiveComfortModel::ASH55_CENTRAL): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central(state.dataEnvrn->DayOfYear); + break; + case static_cast(AdaptiveComfortModel::ASH55_UPPER_90): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90(state.dataEnvrn->DayOfYear); + break; + case static_cast(AdaptiveComfortModel::ASH55_UPPER_80): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80(state.dataEnvrn->DayOfYear); + break; + case static_cast(AdaptiveComfortModel::CEN15251_CENTRAL): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central(state.dataEnvrn->DayOfYear); + break; + case static_cast(AdaptiveComfortModel::CEN15251_UPPER_I): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I(state.dataEnvrn->DayOfYear); + break; + case static_cast(AdaptiveComfortModel::CEN15251_UPPER_II): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II(state.dataEnvrn->DayOfYear); + break; + case static_cast(AdaptiveComfortModel::CEN15251_UPPER_III): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III(state.dataEnvrn->DayOfYear); + break; + default: + break; + } + } else { + int const envrnDayNum(state.dataWeatherManager->Environment(state.dataWeatherManager->Envrn).DesignDayNum); + int constexpr summerDesignDayTypeIndex(9); + // Adjust summer design day set point + if (state.dataWeatherManager->DesDayInput(envrnDayNum).DayType == summerDesignDayTypeIndex) { + ZoneAirSetPoint = state.dataZoneTempPredictorCorrector->AdapComfortSetPointSummerDesDay[AdaptiveComfortModelTypeIndex - 2]; + } + } + // If adaptive operative temperature not applicable, set back + if (ZoneAirSetPoint < originZoneAirSetPoint) { + ZoneAirSetPoint = originZoneAirSetPoint; + } + // If meet fault flag, set back + if (ZoneAirSetPoint == -1) { + ZoneAirSetPoint = originZoneAirSetPoint; + } +} + +void CalcZoneAirComfortSetPoints(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Lixing Gu + // DATE WRITTEN May 2006 + + // PURPOSE OF THIS SUBROUTINE: + // This routine sets the thermal comfort setpoints for each controlled zone based on air tempeature obtained from thermal comfort models. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Real64 SetPointLo = 0.0; + Real64 SetPointHi = 0.0; + Real64 Tset = 0.0; + int PeopleNum = 0; + int ObjectCount = 0; + Real64 PeopleCount = 0.0; + int SetPointComfortSchedIndex = 0; + int SchedTypeIndex = 0; + + // Call thermal comfort module to read zone control comfort object + if (state.dataZoneTempPredictorCorrector->CalcZoneAirComfortSetPointsFirstTimeFlag) { + ThermalComfort::ManageThermalComfort(state, true); + state.dataZoneTempPredictorCorrector->CalcZoneAirComfortSetPointsFirstTimeFlag = false; + } + + state.dataHeatBalFanSys->ComfortControlType = DataHVACGlobals::ThermostatType::Uncontrolled; // Default + + for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++RelativeZoneNum) { + + auto &comfortControlledZone = state.dataZoneCtrls->ComfortControlledZone(RelativeZoneNum); + int ActualZoneNum = comfortControlledZone.ActualZoneNum; + auto &zone = state.dataHeatBal->Zone(ActualZoneNum); + auto &comfortControlType = state.dataHeatBalFanSys->ComfortControlType(ActualZoneNum); + auto &comfortControlTypeRpt = state.dataHeatBalFanSys->ComfortControlTypeRpt(ActualZoneNum); + auto &tempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ActualZoneNum); + auto &zoneComfortControlsFanger = state.dataHeatBalFanSys->ZoneComfortControlsFanger(ActualZoneNum); + comfortControlType = + static_cast(ScheduleManager::GetCurrentScheduleValue(state, comfortControlledZone.ComfortSchedIndex)); + comfortControlTypeRpt = static_cast(comfortControlType); + + // Get PMV values + switch (comfortControlType) { + case DataHVACGlobals::ThermostatType::Uncontrolled: + zoneComfortControlsFanger.LowPMV = -999.0; + zoneComfortControlsFanger.HighPMV = -999.0; + break; + case DataHVACGlobals::ThermostatType::SingleHeating: + zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::SingleHeating); + zoneComfortControlsFanger.LowPMV = ScheduleManager::GetCurrentScheduleValue( + state, + state.dataZoneTempPredictorCorrector + ->SetPointSingleHeatingFanger(comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_SingleHeating)) + .PMVSchedIndex); + zoneComfortControlsFanger.HighPMV = -999.0; + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::SingleCooling); + zoneComfortControlsFanger.LowPMV = -999.0; + zoneComfortControlsFanger.HighPMV = ScheduleManager::GetCurrentScheduleValue( + state, + state.dataZoneTempPredictorCorrector + ->SetPointSingleCoolingFanger(comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_SingleCooling)) + .PMVSchedIndex); + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + SetPointComfortSchedIndex = + state.dataZoneTempPredictorCorrector + ->SetPointSingleHeatCoolFanger(comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_SingleHeatCool)) + .PMVSchedIndex; + zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool); + zoneComfortControlsFanger.LowPMV = ScheduleManager::GetCurrentScheduleValue(state, SetPointComfortSchedIndex); + zoneComfortControlsFanger.HighPMV = ScheduleManager::GetCurrentScheduleValue(state, SetPointComfortSchedIndex); + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + SchedTypeIndex = comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_DualSetPointWithDeadBand); + zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand); + zoneComfortControlsFanger.LowPMV = ScheduleManager::GetCurrentScheduleValue( + state, state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(SchedTypeIndex).HeatPMVSchedIndex); + zoneComfortControlsFanger.HighPMV = ScheduleManager::GetCurrentScheduleValue( + state, state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(SchedTypeIndex).CoolPMVSchedIndex); + if (zoneComfortControlsFanger.LowPMV > zoneComfortControlsFanger.HighPMV) { + ++zoneComfortControlsFanger.DualPMVErrCount; + if (zoneComfortControlsFanger.DualPMVErrCount < 2) { + ShowWarningError(state, + "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint: The heating PMV setpoint is above the cooling " + "PMV setpoint in " + + state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(SchedTypeIndex).Name); + ShowContinueError(state, "The zone dual heating PMV setpoint is set to the dual cooling PMV setpoint."); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } else { + ShowRecurringWarningErrorAtEnd(state, + "The heating PMV setpoint is still above the cooling PMV setpoint", + zoneComfortControlsFanger.DualPMVErrIndex, + zoneComfortControlsFanger.LowPMV, + zoneComfortControlsFanger.LowPMV); + } + zoneComfortControlsFanger.LowPMV = zoneComfortControlsFanger.HighPMV; + } + break; + default: + ShowSevereError(state, + format("CalcZoneAirTempSetpoints: Illegal thermal control control type for Zone={}, Found value={}, in Schedule={}", + zone.Name, + comfortControlTypeRpt, + comfortControlledZone.ControlTypeSchedName)); + break; + } + + // Check Average method + switch (comfortControlledZone.AverageMethod) { + case DataZoneControls::AverageMethod::NO: + PeopleNum = comfortControlledZone.SpecificObjectNum; + if (comfortControlType == DataHVACGlobals::ThermostatType::SingleCooling) { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointLo); + } else { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, SetPointLo); + } + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointHi); + break; + case DataZoneControls::AverageMethod::SPE: + PeopleNum = comfortControlledZone.SpecificObjectNum; + if (comfortControlType == DataHVACGlobals::ThermostatType::SingleCooling) { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointLo); + } else { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, SetPointLo); + } + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointHi); + break; + case DataZoneControls::AverageMethod::OBJ: + SetPointLo = 0.0; + SetPointHi = 0.0; + for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { + if (ActualZoneNum == state.dataHeatBal->People(PeopleNum).ZonePtr) { + ++ObjectCount; + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, Tset); + SetPointLo += Tset; + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, Tset); + SetPointHi += Tset; + } + } + } + SetPointLo /= ObjectCount; + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) SetPointHi /= ObjectCount; + break; + case DataZoneControls::AverageMethod::PEO: + SetPointLo = 0.0; + SetPointHi = 0.0; + for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { + if (ActualZoneNum == state.dataHeatBal->People(PeopleNum).ZonePtr) { + int NumberOccupants = state.dataHeatBal->People(PeopleNum).NumberOfPeople * + ScheduleManager::GetCurrentScheduleValue(state, state.dataHeatBal->People(PeopleNum).NumberOfPeoplePtr); + PeopleCount += NumberOccupants; + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, Tset); + SetPointLo += Tset * NumberOccupants; + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, Tset); + SetPointHi += Tset * NumberOccupants; + } + } + } + if (PeopleCount > 0) { + SetPointLo /= PeopleCount; + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) SetPointHi /= PeopleCount; + } else { + if (comfortControlledZone.PeopleAverageErrIndex == 0) { + ShowWarningMessage(state, + "ZoneControl:Thermostat:ThermalComfort: The total number of people in Zone = " + zone.Name + + " is zero. The People Average option is not used."); + ShowContinueError(state, "The Object Average option is used instead. Simulation continues ....."); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "ZoneControl:Thermostat:ThermalComfort: The total number of people in Zone = " + zone.Name + + " is still zero. The People Average option is not used", + comfortControlledZone.PeopleAverageErrIndex, + PeopleCount, + PeopleCount); + SetPointLo = 0.0; + SetPointHi = 0.0; + for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { + if (ActualZoneNum == state.dataHeatBal->People(PeopleNum).ZonePtr) { + ++ObjectCount; + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, Tset); + SetPointLo += Tset; + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, Tset); + SetPointHi += Tset; + } + } + } + SetPointLo /= ObjectCount; + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) SetPointHi /= ObjectCount; + } + break; + default: + break; + } + + // Assign setpoint + switch (comfortControlType) { + case DataHVACGlobals::ThermostatType::Uncontrolled: + switch (state.dataHeatBalFanSys->TempControlType(ActualZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = 0.0; + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = 0.0; + break; + default: + break; + } + break; + case DataHVACGlobals::ThermostatType::SingleHeating: + if (SetPointLo < comfortControlledZone.TdbMinSetPoint) { + SetPointLo = comfortControlledZone.TdbMinSetPoint; + if (comfortControlledZone.TdbMinErrIndex < 2) { + ShowWarningMessage(state, + "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeating temperature is below the Minimum dry-bulb " + "temperature setpoint " + + comfortControlledZone.Name); + ShowContinueError(state, "The zone heating setpoint is set to the Minimum dry-bulb temperature setpoint"); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeating temperature is still below the " + "Minimum dry-bulb temperature setpoint ...", + comfortControlledZone.TdbMinErrIndex, + SetPointLo, + SetPointLo); + } + tempZoneThermostatSetPoint = SetPointLo; + state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = tempZoneThermostatSetPoint; + state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::SingleHeating; + state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + if (SetPointLo > comfortControlledZone.TdbMaxSetPoint) { + SetPointLo = comfortControlledZone.TdbMaxSetPoint; + if (comfortControlledZone.TdbMaxErrIndex == 0) { + ShowWarningMessage(state, + "ThermostatSetpoint:ThermalComfort:Fanger:SingleCooling temperature is above the Maximum dry-bulb " + "temperature setpoint " + + comfortControlledZone.Name); + ShowContinueError(state, "The zone cooling setpoint is set to the Maximum dry-bulb temperature setpoint"); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "ThermostatSetpoint:ThermalComfort:Fanger:SingleCooling temperature is still above the " + "Maximum dry-bulb temperature setpoint ...", + comfortControlledZone.TdbMaxErrIndex, + SetPointLo, + SetPointLo); + } + tempZoneThermostatSetPoint = SetPointLo; + state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = tempZoneThermostatSetPoint; + state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::SingleCooling; + state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + if (comfortControlledZone.TdbMaxSetPoint == comfortControlledZone.TdbMinSetPoint) { + SetPointLo = comfortControlledZone.TdbMaxSetPoint; + } + if (SetPointLo > comfortControlledZone.TdbMaxSetPoint) SetPointLo = comfortControlledZone.TdbMaxSetPoint; + if (SetPointLo < comfortControlledZone.TdbMinSetPoint) SetPointLo = comfortControlledZone.TdbMinSetPoint; + if (SetPointLo < comfortControlledZone.TdbMinSetPoint || SetPointLo > comfortControlledZone.TdbMaxSetPoint) { + if (comfortControlledZone.TdbHCErrIndex == 0) { + ShowWarningMessage(state, + "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeatingOrCooling temperature is above the Maximum or " + "below the Minimum dry-bulb temperature setpoint " + + comfortControlledZone.Name); + ShowContinueError(state, + "The zone setpoint is set to the Maximum dry-bulb temperature setpoint if above or the Minimum " + "dry-bulb temperature setpoint if below"); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeatingOrCooling temperature is still beyond " + "the range between Maximum and Minimum dry-bulb temperature setpoint ...", + comfortControlledZone.TdbHCErrIndex, + SetPointLo, + SetPointLo); + } + tempZoneThermostatSetPoint = SetPointLo; + state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = tempZoneThermostatSetPoint; + state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = tempZoneThermostatSetPoint; + state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::SingleHeatCool; + state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + if (SetPointLo < comfortControlledZone.TdbMinSetPoint) { + SetPointLo = comfortControlledZone.TdbMinSetPoint; + + if (comfortControlledZone.TdbDualMinErrIndex == 0) { + ShowWarningMessage(state, + "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is below the Minimum dry-bulb " + "temperature setpoint " + + comfortControlledZone.Name); + ShowContinueError(state, "The zone dual heating setpoint is set to the Minimum dry-bulb temperature setpoint"); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is still below the Minimum " + "dry-bulb temperature setpoint ...", + comfortControlledZone.TdbDualMinErrIndex, + SetPointLo, + SetPointLo); + } + if (SetPointHi > comfortControlledZone.TdbMaxSetPoint) { + SetPointHi = comfortControlledZone.TdbMaxSetPoint; + if (comfortControlledZone.TdbDualMaxErrIndex == 0) { + ShowWarningMessage(state, + format("ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is above the Maximum dry-bulb " + "temperature setpoint in zone = {}", + comfortControlledZone.Name)); + ShowContinueError(state, "The zone dual cooling setpoint is set to the Maximum dry-bulb temperature setpoint"); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is still above the Maximum " + "dry-bulb temperature setpoint ...", + comfortControlledZone.TdbDualMaxErrIndex, + SetPointLo, + SetPointLo); + } + + state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = SetPointLo; + state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = SetPointHi; + state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; + state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); + break; + default: + ShowSevereError(state, + format("CalcZoneAirComfortSetpoints: Illegal thermal control control type for Zone={}, Found value={}, in Schedule={}", + zone.Name, + comfortControlTypeRpt, + comfortControlledZone.ControlTypeSchedName)); + } + } +} + +void GetComfortSetPoints(EnergyPlusData &state, + int const PeopleNum, + int const ComfortControlNum, + Real64 const PMVSet, + Real64 &Tset // drybulb setpoint temperature for a given PMV value +) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Lixing Gu + // DATE WRITTEN May, 2006 + // PURPOSE OF THIS SUBROUTINE: + // This routine sets what the thermal comfort setpoints for each controlled zone should be based on air temperature + // obtained from thermal comfort models. This is called each time step. + + // SUBROUTINE ARGUMENT DEFINITIONS: + // 0 = Solution; 1 = Set to Min; 2 Set to Max + + // SUBROUTINE PARAMETER DEFINITIONS: + Real64 constexpr Acc(0.001); // accuracy control for SolveRoot + int constexpr MaxIter(500); // iteration control for SolveRoot + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Real64 PMVResult = 0.0; // Calculated PMV value + int SolFla = 0; // feed back flag from SolveRoot + + auto &comfortControlledZone = state.dataZoneCtrls->ComfortControlledZone(ComfortControlNum); + Real64 Tmin = comfortControlledZone.TdbMinSetPoint; + Real64 Tmax = comfortControlledZone.TdbMaxSetPoint; + + ThermalComfort::CalcThermalComfortFanger(state, PeopleNum, Tmin, PMVResult); + Real64 PMVMin = PMVResult; + ThermalComfort::CalcThermalComfortFanger(state, PeopleNum, Tmax, PMVResult); + Real64 PMVMax = PMVResult; + if (PMVSet > PMVMin && PMVSet < PMVMax) { + + auto f = [&state, PMVSet, PeopleNum](Real64 Tset) { + Real64 PMVresult = 0.0; // resulting PMV values + ThermalComfort::CalcThermalComfortFanger(state, PeopleNum, Tset, PMVresult); + return (PMVSet - PMVresult); + }; + + General::SolveRoot(state, Acc, MaxIter, SolFla, Tset, f, Tmin, Tmax); + if (SolFla == -1) { + if (!state.dataGlobal->WarmupFlag) { + ++state.dataZoneTempPredictorCorrector->IterLimitExceededNum1; + if (state.dataZoneTempPredictorCorrector->IterLimitExceededNum1 == 1) { + ShowWarningError(state, + comfortControlledZone.Name + + ": Iteration limit exceeded calculating thermal comfort Fanger setpoint and non-converged setpoint is used"); + } else { + ShowRecurringWarningErrorAtEnd(state, + comfortControlledZone.Name + ": Iteration limit exceeded calculating thermal comfort setpoint.", + state.dataZoneTempPredictorCorrector->IterLimitErrIndex1, + Tset, + Tset); + } + } + } else if (SolFla == -2) { + if (!state.dataGlobal->WarmupFlag) { + ++state.dataZoneTempPredictorCorrector->IterLimitExceededNum2; + if (state.dataZoneTempPredictorCorrector->IterLimitExceededNum2 == 1) { + ShowWarningError( + state, + format("{}: Solution is not found in calculating thermal comfort Fanger setpoint and the minimum setpoint is used", + comfortControlledZone.Name)); + } else { + ShowRecurringWarningErrorAtEnd( + state, + format("{}: Solution is not found in calculating thermal comfort Fanger setpoint.", comfortControlledZone.Name), + state.dataZoneTempPredictorCorrector->IterLimitErrIndex2, + Tset, + Tset); + } + } + } + } else if (PMVSet < PMVMin) { + Tset = Tmin; + } else if (PMVSet > PMVMax) { + Tset = Tmax; + } +} + +void AdjustCoolingSetPointforTempAndHumidityControl(EnergyPlusData &state, + int const TempControlledZoneID, + int const ActualZoneNum // controlled zone actual zone number +) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Bereket A Nigusse, FSEC/UCF + // DATE WRITTEN Nov 2010 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine modifies the air cooling setpoint temperature to effect zone air Temperature and humidity control + // Alter the zone air cooling setpoint if the zone air relative humidity value exceeds the the zone dehumidifying relative humidity setpoint. + + Real64 ZoneOvercoolRange = 0.0; + auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID); + + if (!(state.dataZoneCtrls->AnyZoneTempAndHumidityControl)) return; // do nothing to setpoint + if (!(tempControlledZone.ZoneOvercoolControl)) return; // do nothing to setpoint + + if (tempControlledZone.OvercoolCntrlModeScheduled) { + ZoneOvercoolRange = ScheduleManager::GetCurrentScheduleValue(state, tempControlledZone.ZoneOvercoolRangeSchedIndex); + } else { + ZoneOvercoolRange = tempControlledZone.ZoneOvercoolConstRange; + } + Real64 ZoneOvercoolControlRatio = tempControlledZone.ZoneOvercoolControlRatio; + + // For Dual Setpoint thermostat the overcool range is limited by the temperature difference between cooling and heating setpoints + Real64 MaxAllowedOvercoolRange = + state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) - state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum); + if (MaxAllowedOvercoolRange > 0.0) { + ZoneOvercoolRange = min(ZoneOvercoolRange, MaxAllowedOvercoolRange); + } + // Calculate difference between zone air relative humidity and the dehumidifying setpoint + Real64 RelativeHumidityDiff = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ActualZoneNum).ZoneAirRelHum - + ScheduleManager::GetCurrentScheduleValue(state, tempControlledZone.DehumidifyingSchedIndex); + if (RelativeHumidityDiff > 0.0 && ZoneOvercoolControlRatio > 0.0) { + // proportionally reset the cooling setpoint temperature downward (zone Overcool) + ZoneOvercoolRange = min(ZoneOvercoolRange, RelativeHumidityDiff / ZoneOvercoolControlRatio); + state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) -= ZoneOvercoolRange; + } +} + +void OverrideAirSetPointsforEMSCntrl(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR L. Gu + // DATE WRITTEN June 2017 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine overrides the air temperature setpoint based on EMS + + auto &ZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo; + auto &ZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi; + + for (int Loop = 1; Loop <= state.dataZoneCtrls->NumTempControlledZones; ++Loop) { + auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(Loop); + if (tempControlledZone.EMSOverrideHeatingSetPointOn) { + int ZoneNum = tempControlledZone.ActualZoneNum; + + switch (state.dataHeatBalFanSys->TempControlType(ZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; + ZoneThermostatSetPointLo(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; + ZoneThermostatSetPointLo(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + ZoneThermostatSetPointLo(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; + break; + default: + break; + } + } + if (tempControlledZone.EMSOverrideCoolingSetPointOn) { + int ZoneNum = tempControlledZone.ActualZoneNum; + + switch (state.dataHeatBalFanSys->TempControlType(ZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleCooling: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; + ZoneThermostatSetPointHi(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; + ZoneThermostatSetPointHi(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + ZoneThermostatSetPointHi(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; + break; + default: + break; + } + } + } + + for (int Loop = 1; Loop <= state.dataZoneCtrls->NumComfortControlledZones; ++Loop) { + auto &comfortControlledZone = state.dataZoneCtrls->ComfortControlledZone(Loop); + if (comfortControlledZone.EMSOverrideHeatingSetPointOn) { + int ZoneNum = comfortControlledZone.ActualZoneNum; + switch (state.dataHeatBalFanSys->ComfortControlType(ZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; + ZoneThermostatSetPointLo(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; + ZoneThermostatSetPointLo(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + ZoneThermostatSetPointLo(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; + break; + default: + break; + } + } + + if (comfortControlledZone.EMSOverrideCoolingSetPointOn) { + int ZoneNum = comfortControlledZone.ActualZoneNum; + switch (static_cast(state.dataHeatBalFanSys->ComfortControlType(ZoneNum))) { + case DataHVACGlobals::ThermostatType::SingleCooling: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; + ZoneThermostatSetPointHi(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; + ZoneThermostatSetPointHi(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + ZoneThermostatSetPointHi(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; + break; + default: + break; + } + } + } +} + +// add values to the LEED tabular report related to schedules used by the thermostat objects +void FillPredefinedTableOnThermostatSetpoints(EnergyPlusData &state) +{ + // J.Glazer - Aug 2017 + using namespace OutputReportPredefined; + std::vector uniqSch; + uniqSch.reserve( + state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls + state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls + + state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls + state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls * 2); + Real64 setPointAt11; + Real64 setPointAt23; + int numDays; + std::string monthAssumed; + std::string monthAssumed2; + constexpr int wednesday = 4; + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls; ++idx) { + auto &singleHtgSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleHeating(idx); + if (std::find(uniqSch.begin(), uniqSch.end(), singleHtgSetpoint.TempSchedIndex) == uniqSch.end()) { + uniqSch.emplace_back(singleHtgSetpoint.TempSchedIndex); + PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, singleHtgSetpoint.TempSchedName, singleHtgSetpoint.Name); + + std::tie(setPointAt11, numDays, monthAssumed) = temperatureAndCountInSch(state, singleHtgSetpoint.TempSchedIndex, false, wednesday, 11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, singleHtgSetpoint.TempSchedName, setPointAt11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, singleHtgSetpoint.TempSchedName, numDays); + + std::tie(setPointAt23, numDays, monthAssumed) = temperatureAndCountInSch(state, singleHtgSetpoint.TempSchedIndex, false, wednesday, 23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, singleHtgSetpoint.TempSchedName, setPointAt23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, singleHtgSetpoint.TempSchedName, numDays); + + PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, singleHtgSetpoint.TempSchedName, monthAssumed); + } + } + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls; ++idx) { + auto &singleClgSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleCooling(idx); + if (std::find(uniqSch.begin(), uniqSch.end(), singleClgSetpoint.TempSchedIndex) == uniqSch.end()) { + uniqSch.emplace_back(singleClgSetpoint.TempSchedIndex); + PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, singleClgSetpoint.TempSchedName, singleClgSetpoint.Name); + + std::tie(setPointAt11, numDays, monthAssumed) = temperatureAndCountInSch(state, singleClgSetpoint.TempSchedIndex, true, wednesday, 11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, singleClgSetpoint.TempSchedName, setPointAt11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, singleClgSetpoint.TempSchedName, numDays); + + std::tie(setPointAt23, numDays, monthAssumed) = temperatureAndCountInSch(state, singleClgSetpoint.TempSchedIndex, true, wednesday, 23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, singleClgSetpoint.TempSchedName, setPointAt23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, singleClgSetpoint.TempSchedName, numDays); + + PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, singleClgSetpoint.TempSchedName, monthAssumed); + } + } + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls; ++idx) { + auto &singleHeatCoolSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool(idx); + if (std::find(uniqSch.begin(), uniqSch.end(), singleHeatCoolSetpoint.TempSchedIndex) == uniqSch.end()) { + uniqSch.emplace_back(singleHeatCoolSetpoint.TempSchedIndex); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, singleHeatCoolSetpoint.TempSchedName, singleHeatCoolSetpoint.Name); + + std::string schNm = singleHeatCoolSetpoint.TempSchedName + " (summer)"; + std::tie(setPointAt11, numDays, monthAssumed) = + temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, true, wednesday, 11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, schNm, setPointAt11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, schNm, numDays); + + std::tie(setPointAt23, numDays, monthAssumed) = + temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, true, wednesday, 23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, schNm, setPointAt23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, schNm, numDays); + + schNm = singleHeatCoolSetpoint.TempSchedName + " (winter)"; + std::tie(setPointAt11, numDays, monthAssumed2) = + temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, false, wednesday, 11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, schNm, setPointAt11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, schNm, numDays); + + std::tie(setPointAt23, numDays, monthAssumed2) = + temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, false, wednesday, 23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, schNm, setPointAt23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, schNm, numDays); + + PreDefTableEntry(state, + state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, + singleHeatCoolSetpoint.TempSchedName, + monthAssumed + " and " + monthAssumed2); + } + } + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls; ++idx) { + auto &dualHeatCoolSetpoint = state.dataZoneTempPredictorCorrector->SetPointDualHeatCool(idx); + if (std::find(uniqSch.begin(), uniqSch.end(), dualHeatCoolSetpoint.HeatTempSchedIndex) == uniqSch.end()) { + uniqSch.emplace_back(dualHeatCoolSetpoint.HeatTempSchedIndex); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, + dualHeatCoolSetpoint.HeatTempSetptSchedName, + dualHeatCoolSetpoint.Name); + + std::tie(setPointAt11, numDays, monthAssumed) = + temperatureAndCountInSch(state, dualHeatCoolSetpoint.HeatTempSchedIndex, false, wednesday, 11); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, dualHeatCoolSetpoint.HeatTempSetptSchedName, setPointAt11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, dualHeatCoolSetpoint.HeatTempSetptSchedName, numDays); + + std::tie(setPointAt23, numDays, monthAssumed) = + temperatureAndCountInSch(state, dualHeatCoolSetpoint.HeatTempSchedIndex, false, wednesday, 23); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, dualHeatCoolSetpoint.HeatTempSetptSchedName, setPointAt23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, dualHeatCoolSetpoint.HeatTempSetptSchedName, numDays); + + PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, dualHeatCoolSetpoint.HeatTempSetptSchedName, monthAssumed); + } + if (std::find(uniqSch.begin(), uniqSch.end(), dualHeatCoolSetpoint.CoolTempSchedIndex) == uniqSch.end()) { + uniqSch.emplace_back(dualHeatCoolSetpoint.CoolTempSchedIndex); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, + dualHeatCoolSetpoint.CoolTempSetptSchedName, + dualHeatCoolSetpoint.Name); + + std::tie(setPointAt11, numDays, monthAssumed) = + temperatureAndCountInSch(state, dualHeatCoolSetpoint.CoolTempSchedIndex, true, wednesday, 11); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, dualHeatCoolSetpoint.CoolTempSetptSchedName, setPointAt11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, dualHeatCoolSetpoint.CoolTempSetptSchedName, numDays); + + std::tie(setPointAt23, numDays, monthAssumed) = + temperatureAndCountInSch(state, dualHeatCoolSetpoint.CoolTempSchedIndex, true, wednesday, 23); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, dualHeatCoolSetpoint.CoolTempSetptSchedName, setPointAt23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, dualHeatCoolSetpoint.CoolTempSetptSchedName, numDays); + + PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, dualHeatCoolSetpoint.CoolTempSetptSchedName, monthAssumed); + } + } +} + +// returns the temperature value from a schedule at a certain time for the first day of the week in either January or July +std::tuple +temperatureAndCountInSch(EnergyPlusData &state, int const scheduleIndex, bool const isSummer, int const dayOfWeek, int const hourOfDay) +{ + // J.Glazer - Aug 2017 + + // determine month to use based on hemiphere and season + int monthToUse; + if (isSummer) { + if (state.dataEnvrn->Latitude > 0.) { + monthToUse = 7; // July - summer in northern hemisphere + } else { + monthToUse = 1; // January - summer in southern hemisphere + } + } else { + if (state.dataEnvrn->Latitude > 0.) { + monthToUse = 1; // January - winter in northern hemisphere + } else { + monthToUse = 7; // July - winter in southern hemisphere + } + } + std::string monthName; + if (monthToUse == 1) { + monthName = "January"; + } else { + monthName = "July"; + } + + int jdateSelect = General::nthDayOfWeekOfMonth(state, dayOfWeek, 1, monthToUse); + + // determine number of days in year + int DaysInYear; + if (state.dataEnvrn->CurrentYearIsLeapYear) { + DaysInYear = 366; + } else { + DaysInYear = 365; + } + + // should adjust date if lands on a holiday but for now assume that it does not + + // adjust time of day for daylight savings time + int hourSelect = hourOfDay + state.dataWeatherManager->DSTIndex(jdateSelect); + + // get the value at the selected time + int constexpr firstTimeStep = 1; + int weekSchIndexSelect = state.dataScheduleMgr->Schedule(scheduleIndex).WeekSchedulePointer(jdateSelect); + int daySchIndexSelect = state.dataScheduleMgr->WeekSchedule(weekSchIndexSelect).DaySchedulePointer(dayOfWeek); + Real64 valueAtSelectTime = state.dataScheduleMgr->DaySchedule(daySchIndexSelect).TSValue(firstTimeStep, hourSelect); + int countOfSame = 0; + + // count the number of times with that same value + for (int jdateOfYear = 1; jdateOfYear <= DaysInYear; ++jdateOfYear) { + int wkSch = state.dataScheduleMgr->Schedule(scheduleIndex).WeekSchedulePointer(jdateOfYear); + if (wkSch == weekSchIndexSelect) { // if same week schedule can short circuit rest of testing and increment counter + ++countOfSame; + } else { + int daySch = state.dataScheduleMgr->WeekSchedule(wkSch).DaySchedulePointer(dayOfWeek); + if (daySch == daySchIndexSelect) { // if same day schedule can short circuit rest of testing and increment counter + ++countOfSame; + } else { + Real64 valueAt = state.dataScheduleMgr->DaySchedule(daySch).TSValue(firstTimeStep, hourSelect); + if (valueAt == valueAtSelectTime) { + ++countOfSame; + } + } + } + } + + return std::make_tuple(valueAtSelectTime, countOfSame, monthName); +} + +void ZoneSpaceHeatBalanceData::updateTemperatures(EnergyPlusData &state, + bool const ShortenTimeStepSys, + bool const UseZoneTimeStepHistory, + Real64 const PriorTimeStep, + int const zoneNum, + int const spaceNum) +{ + assert(zoneNum > 0); + if (ShortenTimeStepSys) { + // timestep has just shifted from full zone timestep to a new shorter system timestep + // throw away last updates in corrector and rewind for resimulating smaller timestep + if (spaceNum == 0) { + if (state.dataHeatBal->Zone(zoneNum).SystemZoneNodeNumber > 0) { // roll back result for zone air node, + auto &zoneNode = state.dataLoopNodes->Node(state.dataHeatBal->Zone(zoneNum).SystemZoneNodeNumber); + zoneNode.Temp = this->XMAT[0]; + state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->XMAT[0]; + zoneNode.HumRat = this->WPrevZoneTS[0]; + zoneNode.Enthalpy = Psychrometrics::PsyHFnTdbW(this->XMAT[0], this->WPrevZoneTS[0]); + } + } else { + if (state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber > 0) { // roll back result for space air node, + auto &spaceNode = state.dataLoopNodes->Node(state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber); + spaceNode.Temp = this->XMAT[0]; + state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->XMAT[0]; + spaceNode.HumRat = this->WPrevZoneTS[0]; + spaceNode.Enthalpy = Psychrometrics::PsyHFnTdbW(this->XMAT[0], this->WPrevZoneTS[0]); + } + } + + if (state.dataHVACGlobal->NumOfSysTimeSteps != + state.dataHVACGlobal->NumOfSysTimeStepsLastZoneTimeStep) { // cannot reuse existing DS data, interpolate from zone time + + this->MAT = DownInterpolate4HistoryValues(PriorTimeStep, state.dataHVACGlobal->TimeStepSys, this->XMAT, this->DSXMAT); + this->ZoneAirHumRat = + DownInterpolate4HistoryValues(PriorTimeStep, state.dataHVACGlobal->TimeStepSys, this->WPrevZoneTS, this->DSWPrevZoneTS); + + if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { + if (state.dataRoomAirMod->IsZoneDV(zoneNum) || state.dataRoomAirMod->IsZoneUI(zoneNum)) { + + DownInterpolate4HistoryValues(PriorTimeStep, + state.dataHVACGlobal->TimeStepSys, + state.dataRoomAirMod->XMATFloor(zoneNum), + state.dataRoomAirMod->XM2TFloor(zoneNum), + state.dataRoomAirMod->XM3TFloor(zoneNum), + state.dataRoomAirMod->MATFloor(zoneNum), + state.dataRoomAirMod->DSXMATFloor(zoneNum), + state.dataRoomAirMod->DSXM2TFloor(zoneNum), + state.dataRoomAirMod->DSXM3TFloor(zoneNum), + state.dataRoomAirMod->DSXM4TFloor(zoneNum)); + DownInterpolate4HistoryValues(PriorTimeStep, + state.dataHVACGlobal->TimeStepSys, + state.dataRoomAirMod->XMATOC(zoneNum), + state.dataRoomAirMod->XM2TOC(zoneNum), + state.dataRoomAirMod->XM3TOC(zoneNum), + state.dataRoomAirMod->MATOC(zoneNum), + state.dataRoomAirMod->DSXMATOC(zoneNum), + state.dataRoomAirMod->DSXM2TOC(zoneNum), + state.dataRoomAirMod->DSXM3TOC(zoneNum), + state.dataRoomAirMod->DSXM4TOC(zoneNum)); + DownInterpolate4HistoryValues(PriorTimeStep, + state.dataHVACGlobal->TimeStepSys, + state.dataRoomAirMod->XMATMX(zoneNum), + state.dataRoomAirMod->XM2TMX(zoneNum), + state.dataRoomAirMod->XM3TMX(zoneNum), + state.dataRoomAirMod->MATMX(zoneNum), + state.dataRoomAirMod->DSXMATMX(zoneNum), + state.dataRoomAirMod->DSXM2TMX(zoneNum), + state.dataRoomAirMod->DSXM3TMX(zoneNum), + state.dataRoomAirMod->DSXM4TMX(zoneNum)); + } + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { + auto &ThisRAFNNode(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode)); + DownInterpolate4HistoryValues(PriorTimeStep, + state.dataHVACGlobal->TimeStepSys, + ThisRAFNNode.AirTempX1, + ThisRAFNNode.AirTempX2, + ThisRAFNNode.AirTempX3, + ThisRAFNNode.AirTemp, + ThisRAFNNode.AirTempDSX1, + ThisRAFNNode.AirTempDSX2, + ThisRAFNNode.AirTempDSX3, + ThisRAFNNode.AirTempDSX4); + DownInterpolate4HistoryValues(PriorTimeStep, + state.dataHVACGlobal->TimeStepSys, + ThisRAFNNode.HumRatX1, + ThisRAFNNode.HumRatX2, + ThisRAFNNode.HumRatX3, + ThisRAFNNode.HumRat, + ThisRAFNNode.HumRatDSX1, + ThisRAFNNode.HumRatDSX2, + ThisRAFNNode.HumRatDSX3, + ThisRAFNNode.HumRatDSX4); + } + } + } + } else { // reuse history data in DS terms from last zone time step to preserve information that would be lost + // do nothing because DS history would have been pushed prior and should be ready + } + } + // now update the variables actually used in the balance equations. + if (UseZoneTimeStepHistory) { + this->ZTM = this->XMAT; + this->WPrevZoneTSTemp = this->WPrevZoneTS; + } else { // use down-stepped history + this->ZTM = this->DSXMAT; + this->WPrevZoneTSTemp = this->DSWPrevZoneTS; + } +} + +void ZoneSpaceHeatBalanceData::calcPredictedSystemLoad(EnergyPlusData &state, Real64 const RAFNFrac, int const zoneNum, int const spaceNum) +{ + // Calculate the predicted system load for a time step. + + assert(zoneNum > 0); + auto const &thisZone = state.dataHeatBal->Zone(zoneNum); + Real64 &thisTempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint(zoneNum); + Real64 const thisZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(zoneNum); + Real64 const thisZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(zoneNum); + bool &thisDeadBandOrSetBack = state.dataZoneEnergyDemand->DeadBandOrSetback(zoneNum); + + thisDeadBandOrSetBack = false; + Real64 ZoneSetPoint = 0.0; + Real64 totalLoad = 0.0; + Real64 LoadToHeatingSetPoint = 0.0; + Real64 LoadToCoolingSetPoint = 0.0; + + switch (state.dataHeatBalFanSys->TempControlType(zoneNum)) { + case DataHVACGlobals::ThermostatType::Uncontrolled: + // Uncontrolled Zone + LoadToHeatingSetPoint = 0.0; + LoadToCoolingSetPoint = 0.0; + totalLoad = 0.0; + break; + case DataHVACGlobals::ThermostatType::SingleHeating: + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + LoadToHeatingSetPoint = (this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd); + break; + } + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepZnLd == 0.0) { // B=0 + LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; + } else { + Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); + LoadToHeatingSetPoint = + this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + } + break; + } + case DataHeatBalance::SolutionAlgo::EulerMethod: { + LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + + this->TempDepZnLd * (thisTempZoneThermostatSetPoint) - this->TempIndZnLd; + break; + } + default: { + assert(false); + } + } + if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; + totalLoad = LoadToHeatingSetPoint; + ZoneSetPoint = thisTempZoneThermostatSetPoint; + LoadToCoolingSetPoint = LoadToHeatingSetPoint; + // for consistency with the other cases, use LE instead of LT and don't subtract 1.0 Watt as a way of pushing the zero load + // case over the threshold + if ((totalLoad) <= 0.0) thisDeadBandOrSetBack = true; + + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + LoadToCoolingSetPoint = this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; + break; + } + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepZnLd == 0.0) { // B=0 + LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; + } else { + Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); + LoadToCoolingSetPoint = + this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + } + break; + } + case DataHeatBalance::SolutionAlgo::EulerMethod: { + LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + + this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; + break; + } + default: { + assert(false); + } + } + if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; + if (thisZone.HasAdjustedReturnTempByITE && !(state.dataGlobal->BeginSimFlag)) { + LoadToCoolingSetPoint = this->TempDepZnLd * thisZone.AdjustedReturnTempByITE - this->TempIndZnLd; + } + totalLoad = LoadToCoolingSetPoint; + ZoneSetPoint = thisTempZoneThermostatSetPoint; + LoadToHeatingSetPoint = LoadToCoolingSetPoint; + // for consistency with the other cases, use GE instead of GT and don't add 1.0 Watt as a way of pushing the zero load + // case over the threshold + if ((totalLoad) >= 0.0) thisDeadBandOrSetBack = true; + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + LoadToHeatingSetPoint = (this->TempDepZnLd * (thisTempZoneThermostatSetPoint) - this->TempIndZnLd); + LoadToCoolingSetPoint = (this->TempDepZnLd * (thisTempZoneThermostatSetPoint) - this->TempIndZnLd); + break; + } + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepZnLd == 0.0) { // B=0 + LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; + LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; + } else { + Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); + LoadToHeatingSetPoint = + this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + LoadToCoolingSetPoint = + this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + } + break; + } + case DataHeatBalance::SolutionAlgo::EulerMethod: { + LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + + this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; + LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + + this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; + break; + } + default: { + assert(false); + } + } + ZoneSetPoint = thisTempZoneThermostatSetPoint; + if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; + if (RAFNFrac > 0.0) LoadToCoolingSetPoint = LoadToCoolingSetPoint / RAFNFrac; + + if (thisZone.HasAdjustedReturnTempByITE && !(state.dataGlobal->BeginSimFlag)) { + LoadToCoolingSetPoint = this->TempDepZnLd * thisZone.AdjustedReturnTempByITE - this->TempIndZnLd; + } + + // Note that LoadToHeatingSetPoint is generally not equal to LoadToCoolingSetPoint + // when the heating and cooling set-points are equal if the zone is unmixed, + // e.g. displacement ventilation or UFAD, since the stratification is generally not the same in heating and cooling modes + + // Possible combinations: + // 1/ LoadToHeatingSetPoint > 0 & LoadToCoolingSetPoint > 0 --> Heating required + // 2/ LoadToHeatingSetPoint > LoadToCoolingSetPoint --> Possible in the unmixed case but should be trapped + // as a poor choice of set-points + // 3/ LoadToHeatingSetPoint < 0 & LoadToCoolingSetPoint < 0 --> Cooling Required + // 4/ LoadToHeatingSetPoint <=0 & LoadToCoolingSetPoint >=0 --> Dead Band Operation ! includes zero load cases + // First trap bad set-points + if (LoadToHeatingSetPoint > LoadToCoolingSetPoint) { + ShowSevereError( + state, + "DataHVACGlobals::ThermostatType::SingleHeatCool: Effective heating set-point higher than effective cooling set-point - use " + "DualSetPointWithDeadBand if using unmixed air model"); + ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); + ShowContinueError(state, + format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); + ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); + ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); + ShowContinueError(state, format("Zone ThermostatSetPoint={:.2R}", thisTempZoneThermostatSetPoint)); + ShowFatalError(state, "Program terminates due to above conditions."); + } + + if (LoadToHeatingSetPoint > 0.0 && LoadToCoolingSetPoint > 0.0) { + totalLoad = LoadToHeatingSetPoint; + } else if (LoadToHeatingSetPoint < 0.0 && LoadToCoolingSetPoint < 0.0) { + totalLoad = LoadToCoolingSetPoint; + } else if (LoadToHeatingSetPoint <= 0.0 && LoadToCoolingSetPoint >= 0.0) { // deadband includes zero loads + totalLoad = 0.0; + if (thisZone.SystemZoneNodeNumber > 0) { + ZoneSetPoint = state.dataLoopNodes->Node(thisZone.SystemZoneNodeNumber).Temp; + ZoneSetPoint = max(ZoneSetPoint, thisZoneThermostatSetPointLo); // trap out of deadband + ZoneSetPoint = min(ZoneSetPoint, thisZoneThermostatSetPointHi); // trap out of deadband + } + thisDeadBandOrSetBack = true; + } else { // this should never occur! + ShowSevereError(state, + "SingleHeatCoolSetPoint: Unanticipated combination of heating and cooling loads - report to EnergyPlus Development Team"); + ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); + ShowContinueError(state, + format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); + ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); + ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); + ShowContinueError(state, format("Zone ThermostatSetPoint={:.2R}", thisTempZoneThermostatSetPoint)); + ShowFatalError(state, "Program terminates due to above conditions."); + } + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + LoadToHeatingSetPoint = (this->TempDepZnLd * (thisZoneThermostatSetPointLo) - this->TempIndZnLd); + LoadToCoolingSetPoint = (this->TempDepZnLd * (thisZoneThermostatSetPointHi) - this->TempIndZnLd); + break; + } + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepZnLd == 0.0) { // B=0 + LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) - this->TempIndZnLd; + LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) - this->TempIndZnLd; + } else { + Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); + LoadToHeatingSetPoint = + this->TempDepZnLd * (thisZoneThermostatSetPointLo - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + LoadToCoolingSetPoint = + this->TempDepZnLd * (thisZoneThermostatSetPointHi - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + } + break; + } + case DataHeatBalance::SolutionAlgo::EulerMethod: { + LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) + + this->TempDepZnLd * thisZoneThermostatSetPointLo - this->TempIndZnLd; + LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) + + this->TempDepZnLd * thisZoneThermostatSetPointHi - this->TempIndZnLd; + break; + } + default: { + assert(false); + } + } + if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; + if (RAFNFrac > 0.0) LoadToCoolingSetPoint = LoadToCoolingSetPoint / RAFNFrac; + + if (thisZone.HasAdjustedReturnTempByITE && !(state.dataGlobal->BeginSimFlag)) { + LoadToCoolingSetPoint = this->TempDepZnLd * thisZone.AdjustedReturnTempByITE - this->TempIndZnLd; + } + + // Possible combinations: + // 1/ LoadToHeatingSetPoint > 0 & LoadToCoolingSetPoint > 0 --> Heating required + // 2/ LoadToHeatingSetPoint > LoadToCoolingSetPoint --> Possible in the unmixed case but should be trapped + // as a poor choice of set-points + // 3/ LoadToHeatingSetPoint < 0 & LoadToCoolingSetPoint < 0 --> Cooling Required + // 4/ LoadToHeatingSetPoint <=0 & LoadToCoolingSetPoint >=0 --> Dead Band Operation - includes zero load cases + // First trap bad set-points + if (LoadToHeatingSetPoint > LoadToCoolingSetPoint) { + ShowSevereError(state, + "DualSetPointWithDeadBand: Effective heating set-point higher than effective cooling set-point - increase " + "deadband if using unmixed air model"); + ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); + ShowContinueError(state, + format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); + ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); + ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); + ShowContinueError(state, format("Zone Heating ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointLo)); + ShowContinueError(state, format("Zone Cooling ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointHi)); + ShowFatalError(state, "Program terminates due to above conditions."); + } + + if (LoadToHeatingSetPoint > 0.0 && LoadToCoolingSetPoint > 0.0) { + totalLoad = LoadToHeatingSetPoint; + ZoneSetPoint = thisZoneThermostatSetPointLo; + } else if (LoadToHeatingSetPoint < 0.0 && LoadToCoolingSetPoint < 0.0) { + totalLoad = LoadToCoolingSetPoint; + ZoneSetPoint = thisZoneThermostatSetPointHi; + } else if (LoadToHeatingSetPoint <= 0.0 && LoadToCoolingSetPoint >= 0.0) { // deadband includes zero loads + // this turns out to cause instabilities sometimes? that lead to setpoint errors if predictor is off. + totalLoad = 0.0; + if (thisZone.SystemZoneNodeNumber > 0) { + ZoneSetPoint = state.dataLoopNodes->Node(thisZone.SystemZoneNodeNumber).Temp; + ZoneSetPoint = max(ZoneSetPoint, thisZoneThermostatSetPointLo); // trap out of deadband + ZoneSetPoint = min(ZoneSetPoint, thisZoneThermostatSetPointHi); // trap out of deadband + } + thisDeadBandOrSetBack = true; + } else { // this should never occur! + ShowSevereError( + state, "DualSetPointWithDeadBand: Unanticipated combination of heating and cooling loads - report to EnergyPlus Development Team"); + ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); + ShowContinueError(state, + format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); + ShowContinueError(state, format("Zone Heating Set-point={:.2R}", thisZoneThermostatSetPointLo)); + ShowContinueError(state, format("Zone Cooling Set-point={:.2R}", thisZoneThermostatSetPointHi)); + ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); + ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); + ShowContinueError(state, format("Zone ThermostatSetPoint={:.2R}", thisTempZoneThermostatSetPoint)); + + ShowFatalError(state, "Program terminates due to above conditions."); + } + break; + default: + break; + } + + int systemNodeNumber = 0; + int stageNum = 0; + if (spaceNum > 0) { + systemNodeNumber = state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber; + stageNum = state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).StageNum; + assert(stageNum == state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).StageNum); + } else { + systemNodeNumber = thisZone.SystemZoneNodeNumber; + stageNum = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).StageNum; + } + // Staged control zone + if (state.dataZoneTempPredictorCorrector->NumStageCtrZone > 0) { + if (state.dataZoneCtrls->StageZoneLogic(zoneNum)) { + if (stageNum == 0) { // No load + LoadToHeatingSetPoint = 0.0; + LoadToCoolingSetPoint = 0.0; + totalLoad = 0.0; + if (systemNodeNumber > 0) { + ZoneSetPoint = state.dataLoopNodes->Node(systemNodeNumber).Temp; + ZoneSetPoint = max(ZoneSetPoint, thisZoneThermostatSetPointLo); // trap out of deadband + ZoneSetPoint = min(ZoneSetPoint, thisZoneThermostatSetPointHi); // trap out of deadband + } + thisDeadBandOrSetBack = true; + } else if (stageNum < 0) { // Cooling load + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + LoadToCoolingSetPoint = (this->TempDepZnLd * (thisZoneThermostatSetPointHi) - this->TempIndZnLd); + break; + } + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepZnLd == 0.0) { // B=0 + LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) - this->TempIndZnLd; + } else { + Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); + LoadToCoolingSetPoint = + this->TempDepZnLd * (thisZoneThermostatSetPointHi - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + } + break; + } + case DataHeatBalance::SolutionAlgo::EulerMethod: { + LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) + + this->TempDepZnLd * thisZoneThermostatSetPointHi - this->TempIndZnLd; + break; + } + default: { + assert(false); + } + } + totalLoad = LoadToCoolingSetPoint; + ZoneSetPoint = thisZoneThermostatSetPointHi; + LoadToHeatingSetPoint = LoadToCoolingSetPoint; + if ((totalLoad) >= 0.0) thisDeadBandOrSetBack = true; + } else { // Heating load + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + LoadToHeatingSetPoint = (this->TempDepZnLd * thisZoneThermostatSetPointLo - this->TempIndZnLd); + break; + } + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepZnLd == 0.0) { // B=0 + LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) - this->TempIndZnLd; + } else { + Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); + LoadToHeatingSetPoint = + this->TempDepZnLd * (thisZoneThermostatSetPointLo - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + } + break; + } + case DataHeatBalance::SolutionAlgo::EulerMethod: { + LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) + + this->TempDepZnLd * (thisZoneThermostatSetPointLo) - this->TempIndZnLd; + break; + } + default: { + assert(false); + } + } + totalLoad = LoadToHeatingSetPoint; + ZoneSetPoint = thisZoneThermostatSetPointLo; + LoadToCoolingSetPoint = LoadToHeatingSetPoint; + if ((totalLoad) <= 0.0) thisDeadBandOrSetBack = true; + } + } + } + + // If the ZoneNodeNum has been set for a Controlled Zone, then the zone setpoint is placed on the node. + if (thisZone.SystemZoneNodeNumber > 0) { + state.dataLoopNodes->Node(thisZone.SystemZoneNodeNumber).TempSetPoint = ZoneSetPoint; + } + + if (ZoneSetPoint > this->ZoneSetPointLast) { + state.dataZoneEnergyDemand->Setback(zoneNum) = true; + } else { + state.dataZoneEnergyDemand->Setback(zoneNum) = false; + } + + this->ZoneSetPointLast = ZoneSetPoint; + thisTempZoneThermostatSetPoint = ZoneSetPoint; // needed to fix Issue # 5048 + state.dataZoneEnergyDemand->CurDeadBandOrSetback(zoneNum) = thisDeadBandOrSetBack; + + // Apply the Zone Multiplier and Load Correction factor as needed + if (spaceNum > 0) { + state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).reportSensibleLoadsZoneMultiplier( + state, zoneNum, totalLoad, LoadToHeatingSetPoint, LoadToCoolingSetPoint); + } else { + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).reportSensibleLoadsZoneMultiplier( + state, zoneNum, totalLoad, LoadToHeatingSetPoint, LoadToCoolingSetPoint); + } +} +} // namespace EnergyPlus::ZoneTempPredictorCorrector diff --git a/src/EnergyPlus/InternalHeatGains.cc b/src/EnergyPlus/InternalHeatGains.cc index cc1933d46ea..8fc2ddb9de5 100644 --- a/src/EnergyPlus/InternalHeatGains.cc +++ b/src/EnergyPlus/InternalHeatGains.cc @@ -733,8 +733,8 @@ namespace InternalHeatGains { if (state.dataInternalHeatGains->UsingThermalComfort) { - // Set the default value of MRTCalcType as 'ZoneAveraged' - thisPeople.MRTCalcType = DataHeatBalance::CalcMRT::ZoneAveraged; + // Set the default value of MRTCalcType as 'EnclosureAveraged' + thisPeople.MRTCalcType = DataHeatBalance::CalcMRT::EnclosureAveraged; bool ModelWithAdditionalInputs = thisPeople.Fanger || thisPeople.Pierce || thisPeople.KSU || thisPeople.CoolingEffectASH55 || thisPeople.AnkleDraftASH55; @@ -743,8 +743,8 @@ namespace InternalHeatGains { { std::string const &mrtType = IHGAlphas(7); - if (mrtType == "ZONEAVERAGED") { - thisPeople.MRTCalcType = DataHeatBalance::CalcMRT::ZoneAveraged; + if (mrtType == "ENCLOSUREAVERAGED") { + thisPeople.MRTCalcType = DataHeatBalance::CalcMRT::EnclosureAveraged; } else if (mrtType == "SURFACEWEIGHTED") { thisPeople.MRTCalcType = DataHeatBalance::CalcMRT::SurfaceWeighted; @@ -797,7 +797,7 @@ namespace InternalHeatGains { IHGAlphas(1), IHGAlphaFieldNames(7), IHGAlphas(7))); - ShowContinueError(state, "...Valid values are \"ZoneAveraged\", \"SurfaceWeighted\", \"AngleFactor\"."); + ShowContinueError(state, "...Valid values are \"EnclosureAveraged\", \"SurfaceWeighted\", \"AngleFactor\"."); } } } @@ -3787,7 +3787,7 @@ namespace InternalHeatGains { state.dataHeatBal->People(Loop).CoolingEffectASH55 || state.dataHeatBal->People(Loop).AnkleDraftASH55) { print(state.files.eio, "{:.0R},", state.dataHeatBal->People(Loop).NomMaxNumberPeople); - if (state.dataHeatBal->People(Loop).MRTCalcType == DataHeatBalance::CalcMRT::ZoneAveraged) { + if (state.dataHeatBal->People(Loop).MRTCalcType == DataHeatBalance::CalcMRT::EnclosureAveraged) { print(state.files.eio, "Zone Averaged,"); } else if (state.dataHeatBal->People(Loop).MRTCalcType == DataHeatBalance::CalcMRT::SurfaceWeighted) { print(state.files.eio, "Surface Weighted,"); diff --git a/src/EnergyPlus/MixedAir.cc.bak b/src/EnergyPlus/MixedAir.cc.bak new file mode 100644 index 00000000000..f4763c74b34 --- /dev/null +++ b/src/EnergyPlus/MixedAir.cc.bak @@ -0,0 +1,5578 @@ +// EnergyPlus, Copyright (c) 1996-2023, The Board of Trustees of the University of Illinois, +// The Regents of the University of California, through Lawrence Berkeley National Laboratory +// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge +// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other +// contributors. All rights reserved. +// +// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the +// U.S. Government consequently retains certain rights. As such, the U.S. Government has been +// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, +// worldwide license in the Software to reproduce, distribute copies to the public, prepare +// derivative works, and perform publicly and display publicly, and to permit others to do so. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted +// provided that the following conditions are met: +// +// (1) Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// (2) Redistributions in binary form must reproduce the above copyright notice, this list of +// conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, +// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific prior +// written permission. +// +// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form +// without changes from the version obtained under this License, or (ii) Licensee makes a +// reference solely to the software portion of its product, Licensee must refer to the +// software as "EnergyPlus version X" software, where "X" is the version number Licensee +// obtained under this License and may not use a different name for the software. Except as +// specifically required in this Section (4), Licensee shall not use in a company name, a +// product name, in advertising, publicity, or other promotional activities any name, trade +// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly +// similar designation, without the U.S. Department of Energy's prior written consent. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +// C++ Headers +#include +#include + +// ObjexxFCL Headers +#include +#include + +// EnergyPlus Headers +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace EnergyPlus::MixedAir { + +// Module containing the routines dealing with the mixed air portion +// of the HVAC air loop. + +// MODULE INFORMATION: +// AUTHOR Fred Buhl +// DATE WRITTEN October 1998 +// MODIFIED Shirey/Raustad FSEC, June/Aug 2003, Jan 2004 +// Lawrie, March 2006 - Module order (per template) +// Craig Wray 22Aug2010 - Added Fan ComponentModel +// Chandan Sharma, FSEC, 25Aug 2011 - Added ProportionalControl +// to enhance CO2 based DCV control +// Feb 2013 Bereket Nigusse, FSEC +// Added DX Coil Model For 100% OA systems +// RE-ENGINEERED na + +// PURPOSE OF THIS MODULE: +// To encapsulate the data and algorithms required to +// simulate the mixed air portion of the EPlus air loop. + +// METHODOLOGY EMPLOYED: +// An algorithmic controller will be employed - there is no attempt to +// simulate real controllers for the economizer. The mixed air controller +// will sense various node conditions and set some node flow rates. Mixed +// air components will operate with predetermined flow rates. + +// Using/Aliasing +using namespace DataLoopNode; +using namespace DataAirLoop; +using namespace DataEnvironment; +using namespace DataHVACGlobals; +using namespace ScheduleManager; +using namespace DataSizing; +using namespace FaultsManager; + +constexpr std::array(ControllerKind::Num)> ControllerKindNamesUC{"CONTROLLER:WATERCOIL", "CONTROLLER:OUTDOORAIR"}; + +constexpr std::array(MixedAirControllerType::Num)> MixedAirControllerTypeNames{ + "Controller:OutdoorAir", "ZoneHVAC:EnergyRecoveryVentilator:Controller"}; + +constexpr std::array(CMO::Num)> CurrentModuleObjects{"None", + "AirLoopHVAC:OutdoorAirSystem", + "AirLoopHVAC:OutdoorAirSystem:EquipmentList", + "AirLoopHVAC:ControllerList", + "AvailabilityManagerAssignmentList", + "Controller:OutdoorAir", + "ZoneHVAC:EnergyRecoveryVentilator:Controller", + "Controller:MechanicalVentilation", + "OutdoorAir:Mixer"}; + +constexpr std::array(DataSizing::SysOAMethod::Num)> SOAMNamesUC{"ZONESUM", + "STANDARD62.1VENTILATIONRATEPROCEDURE", + "INDOORAIRQUALITYPROCEDURE", + "PROPORTIONALCONTROLBASEDONOCCUPANCYSCHEDULE", + "INDOORAIRQUALITYPROCEDUREGENERICCONTAMINANT", + "INDOORAIRQUALITYPROCEDURECOMBINED", + "PROPORTIONALCONTROLBASEDONDESIGNOCCUPANCY", + "PROPORTIONALCONTROLBASEDONDESIGNOARATE", + "STANDARD62.1SIMPLIFIEDPROCEDURE", + "STANDARD62.1VENTILATIONRATEPROCEDUREWITHLIMIT"}; + +constexpr std::array(SimAirServingZones::CompType::Num)> CompTypeNamesUC{ + "OUTDOORAIR:MIXER", + "FAN:CONSTANTVOLUME", + "FAN:VARIABLEVOLUME", + "COIL:COOLING:WATER", + "COIL:HEATING:WATER", + "COIL:HEATING:STEAM", + "COIL:COOLING:WATER:DETAILEDGEOMETRY", + "COIL:HEATING:ELECTRIC", + "COIL:HEATING:FUEL", + "COILSYSTEM:COOLING:WATER:HEATEXCHANGERASSISTED", + "COIL:HEATING:DESUPERHEATER", + "COILSYSTEM:COOLING:DX", + "HEATEXCHANGER:AIRTOAIR:FLATPLATE", + "DEHUMIDIFIER:DESICCANT:NOFANS", + "SOLARCOLLECTOR:UNGLAZEDTRANSPIRED", + "EVAPORATIVECOOLER:DIRECT:CELDEKPAD", + "AIRLOOPHVAC:UNITARY:FURNACE:HEATONLY", + "AIRLOOPHVAC:UNITARY:FURNACE:HEATCOOL", + "HUMIDIFIER:STEAM:ELECTRIC", + "DUCT", + "AIRLOOPHVAC:UNITARYHEATCOOL:VAVCHANGEOVERBYPASS", + "AIRLOOPHVAC:UNITARYHEATPUMP:AIRTOAIR:MULTISPEED", + "FAN:COMPONENTMODEL", + "COILSYSTEM:HEATING:DX", + "COIL:USERDEFINED", + "FAN:SYSTEMMODEL", + "AIRLOOPHVAC:UNITARYSYSTEM", + "ZONEHVAC:TERMINALUNIT:VARIABLEREFRIGERANTFLOW", + "SOLARCOLLECTOR:FLATPLATE:PHOTOVOLTAICTHERMAL", + "COILSYSTEM:COOLING:WATER"}; + +static constexpr std::array(DataSizing::SysOAMethod::Num)> printSysOAMethod{ + "ZoneSum,", + "Standard62.1VentilationRateProcedure,", + "IndoorAirQualityProcedure,", + "ProportionalControlBasedOnOccupancySchedule,", + "IndoorAirQualityGenericContaminant,", + "IndoorAirQualityProcedureCombined,", + "ProportionalControlBasedOnDesignOccupancy,", + "ProportionalControlBasedOnDesignOARate,", + "Standard62.1SimplifiedProcedure,", + "Standard62.1VentilationRateProcedureWithLimit,"}; + +Real64 OAGetFlowRate(EnergyPlusData &state, int OAPtr) +{ + Real64 FlowRate(0); + if ((OAPtr > 0) && (OAPtr <= state.dataMixedAir->NumOAControllers) && (state.dataEnvrn->StdRhoAir != 0)) { + FlowRate = state.dataMixedAir->OAController(OAPtr).OAMassFlow / state.dataEnvrn->StdRhoAir; + } + return FlowRate; +} +Real64 OAGetMinFlowRate(EnergyPlusData &state, int OAPtr) +{ + Real64 MinFlowRate(0); + if ((OAPtr > 0) && (OAPtr <= state.dataMixedAir->NumOAControllers)) { + MinFlowRate = state.dataMixedAir->OAController(OAPtr).MinOA; + } + return MinFlowRate; +} +void OASetDemandManagerVentilationState(EnergyPlusData &state, int OAPtr, bool aState) +{ + if ((OAPtr > 0) && (OAPtr <= state.dataMixedAir->NumOAControllers)) { + state.dataMixedAir->OAController(OAPtr).ManageDemand = aState; + } +} +void OASetDemandManagerVentilationFlow(EnergyPlusData &state, int OAPtr, Real64 aFlow) +{ + if ((OAPtr > 0) && (OAPtr <= state.dataMixedAir->NumOAControllers)) { + state.dataMixedAir->OAController(OAPtr).DemandLimitFlowRate = aFlow * state.dataEnvrn->StdRhoAir; + } +} +int GetOAController(EnergyPlusData &state, std::string const &OAName) +{ + int CurrentOAController(0); + for (int i = 1; i <= state.dataMixedAir->NumOAControllers; i++) { + if (OAName == state.dataMixedAir->OAController(i).Name) { + CurrentOAController = i; + break; + } + } + return CurrentOAController; +} + +void ManageOutsideAirSystem(EnergyPlusData &state, std::string const &OASysName, bool const FirstHVACIteration, int const AirLoopNum, int &OASysNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + + // PURPOSE OF THIS SUBROUTINE + // Manage the outside air system + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + if (OASysNum == 0) { + OASysNum = UtilityRoutines::FindItemInList(OASysName, state.dataAirLoop->OutsideAirSys); + if (OASysNum == 0) { + ShowFatalError(state, format("ManageOutsideAirSystem: AirLoopHVAC:OutdoorAirSystem not found={}", OASysName)); + } + } + + InitOutsideAirSys(state, OASysNum, AirLoopNum); + + SimOutsideAirSys(state, OASysNum, FirstHVACIteration, AirLoopNum); +} + +void SimOASysComponents(EnergyPlusData &state, int const OASysNum, bool const FirstHVACIteration, int const AirLoopNum) +{ + auto &CompType = state.dataMixedAir->CompType; + auto &CompName = state.dataMixedAir->CompName; + bool ReSim(false); + bool Sim(true); + bool OAHeatCoil(false); + bool OACoolCoil(false); + bool OAHX(false); + + for (int CompNum = 1; CompNum <= state.dataAirLoop->OutsideAirSys(OASysNum).NumComponents; ++CompNum) { + CompType = state.dataAirLoop->OutsideAirSys(OASysNum).ComponentType(CompNum); + CompName = state.dataAirLoop->OutsideAirSys(OASysNum).ComponentName(CompNum); + SimOAComponent(state, + CompType, + CompName, + state.dataAirLoop->OutsideAirSys(OASysNum).ComponentTypeEnum(CompNum), + FirstHVACIteration, + state.dataAirLoop->OutsideAirSys(OASysNum).ComponentIndex(CompNum), + AirLoopNum, + Sim, + OASysNum, + OAHeatCoil, + OACoolCoil, + OAHX); + if (OAHX) ReSim = true; + } + // if there were heat exchangers and/or desiccant wheel in the OA path, need to simulate again in reverse + // order to propagate the air flow and conditions out the relief air path to the relief air exit node + if (ReSim) { + for (int CompNum = state.dataAirLoop->OutsideAirSys(OASysNum).NumComponents - 1; CompNum >= 1; --CompNum) { + CompType = state.dataAirLoop->OutsideAirSys(OASysNum).ComponentType(CompNum); + CompName = state.dataAirLoop->OutsideAirSys(OASysNum).ComponentName(CompNum); + SimOAComponent(state, + CompType, + CompName, + state.dataAirLoop->OutsideAirSys(OASysNum).ComponentTypeEnum(CompNum), + FirstHVACIteration, + state.dataAirLoop->OutsideAirSys(OASysNum).ComponentIndex(CompNum), + AirLoopNum, + Sim, + OASysNum, + OAHeatCoil, + OACoolCoil, + OAHX); + } + // now simulate again propagate current temps back through OA system + for (int CompNum = 1; CompNum <= state.dataAirLoop->OutsideAirSys(OASysNum).NumComponents; ++CompNum) { + CompType = state.dataAirLoop->OutsideAirSys(OASysNum).ComponentType(CompNum); + CompName = state.dataAirLoop->OutsideAirSys(OASysNum).ComponentName(CompNum); + SimOAComponent(state, + CompType, + CompName, + state.dataAirLoop->OutsideAirSys(OASysNum).ComponentTypeEnum(CompNum), + FirstHVACIteration, + state.dataAirLoop->OutsideAirSys(OASysNum).ComponentIndex(CompNum), + AirLoopNum, + Sim, + OASysNum, + OAHeatCoil, + OACoolCoil, + OAHX); + } + } +} + +void SimOutsideAirSys(EnergyPlusData &state, int const OASysNum, bool const FirstHVACIteration, int const AirLoopNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + + // PURPOSE OF THIS SUBROUTINE + // Simulate the controllers and components in the outside air system. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int OAMixerNum; + int OAControllerNum; // OA controller index in OAController + auto &CompType = state.dataMixedAir->CompType; // Tuned Made static + auto &CompName = state.dataMixedAir->CompName; // Tuned Made static + bool FatalErrorFlag(false); + + state.dataSize->CurOASysNum = OASysNum; + auto &CurrentOASystem(state.dataAirLoop->OutsideAirSys(OASysNum)); + if (state.dataAirLoop->OutsideAirSys(OASysNum).AirLoopDOASNum == -1) { + SimOAController(state, CurrentOASystem.OAControllerName, CurrentOASystem.OAControllerIndex, FirstHVACIteration, AirLoopNum); + } + SimOASysComponents(state, OASysNum, FirstHVACIteration, AirLoopNum); + + if (state.dataMixedAir->MyOneTimeErrorFlag(OASysNum)) { + if (CurrentOASystem.NumControllers - CurrentOASystem.NumSimpleControllers > 1) { + ShowWarningError( + state, + format("AirLoopHVAC:OutdoorAirSystem {} has more than 1 outside air controller; only the 1st will be used", CurrentOASystem.Name)); + } + for (int CompNum = 1; CompNum <= CurrentOASystem.NumComponents; ++CompNum) { + CompType = CurrentOASystem.ComponentType(CompNum); + CompName = CurrentOASystem.ComponentName(CompNum); + if (UtilityRoutines::SameString(CompType, "OutdoorAir:Mixer")) { + OAMixerNum = UtilityRoutines::FindItemInList(CompName, state.dataMixedAir->OAMixer); + OAControllerNum = CurrentOASystem.OAControllerIndex; + if (state.dataMixedAir->OAController(OAControllerNum).MixNode != state.dataMixedAir->OAMixer(OAMixerNum).MixNode) { + ShowSevereError( + state, format("The mixed air node of Controller:OutdoorAir=\"{}\"", state.dataMixedAir->OAController(OAControllerNum).Name)); + ShowContinueError(state, + format("should be the same node as the mixed air node of OutdoorAir:Mixer=\"{}\".", + state.dataMixedAir->OAMixer(OAMixerNum).Name)); + ShowContinueError(state, + format("Controller:OutdoorAir mixed air node=\"{}\".", + state.dataLoopNodes->NodeID(state.dataMixedAir->OAController(OAControllerNum).MixNode))); + ShowContinueError(state, + format("OutdoorAir:Mixer mixed air node=\"{}\".", + state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OAMixerNum).MixNode))); + FatalErrorFlag = true; + } + if (state.dataMixedAir->OAController(OAControllerNum).RelNode != state.dataMixedAir->OAMixer(OAMixerNum).RelNode) { + ShowSevereError( + state, format("The relief air node of Controller:OutdoorAir=\"{}\"", state.dataMixedAir->OAController(OAControllerNum).Name)); + ShowContinueError(state, + format("should be the same node as the relief air node of OutdoorAir:Mixer=\"{}\".", + state.dataMixedAir->OAMixer(OAMixerNum).Name)); + ShowContinueError(state, + format("Controller:OutdoorAir relief air node=\"{}\".", + state.dataLoopNodes->NodeID(state.dataMixedAir->OAController(OAControllerNum).RelNode))); + ShowContinueError(state, + format("OutdoorAir:Mixer relief air node=\"{}\".", + state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OAMixerNum).RelNode))); + FatalErrorFlag = true; + } + if (state.dataMixedAir->OAController(OAControllerNum).RetNode != state.dataMixedAir->OAMixer(OAMixerNum).RetNode) { + ShowSevereError( + state, format("The return air node of Controller:OutdoorAir=\"{}\"", state.dataMixedAir->OAController(OAControllerNum).Name)); + ShowContinueError(state, + format("should be the same node as the return air node of OutdoorAir:Mixer=\"{}\".", + state.dataMixedAir->OAMixer(OAMixerNum).Name)); + ShowContinueError(state, + format("Controller:OutdoorAir return air node=\"{}\".", + state.dataLoopNodes->NodeID(state.dataMixedAir->OAController(OAControllerNum).RetNode))); + ShowContinueError(state, + format("OutdoorAir:Mixer return air node=\"{}\".", + state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OAMixerNum).RetNode))); + FatalErrorFlag = true; + } + } + } + state.dataMixedAir->MyOneTimeErrorFlag(OASysNum) = false; + if (FatalErrorFlag) ShowFatalError(state, "Previous severe error(s) cause program termination"); + } + + state.dataSize->CurOASysNum = 0; + if (state.dataAirLoop->OutsideAirSys(OASysNum).AirLoopDOASNum == -1) { + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysComponentsSimulated = true; + } +} + +void SimOAComponent(EnergyPlusData &state, + std::string const &CompType, // the component type + std::string const &CompName, // the component Name + SimAirServingZones::CompType const CompTypeNum, // Component Type -- Integerized for this module + bool const FirstHVACIteration, + int &CompIndex, + int const AirLoopNum, // air loop index for economizer lockout coordination + bool const Sim, // if TRUE, simulate component; if FALSE, just set the coil exisitence flags + int const OASysNum, // index to outside air system + bool &OAHeatingCoil, // TRUE indicates a heating coil has been found + bool &OACoolingCoil, // TRUE indicates a cooling coil has been found + bool &OAHX) // TRUE indicates a heat exchanger has been found +{ + + // SUBROUTINE INFORMATION + // AUTHOR: Russ Taylor, Dan Fisher, Fred Buhl + // DATE WRITTEN: Oct 1997 + // MODIFIED: Dec 1997 Fred Buhl, D Shirey Feb/Sept 2003 + // Nov 2004 M. J. Witte, GARD Analytics, Inc. + // Add DXSystem:AirLoop as valid OA system equipment + // Work supported by ASHRAE research project 1254-RP + + // PURPOSE OF THIS SUBROUTINE: + // Calls the individual air loop component simulation routines + + // SUBROUTINE LOCAL VARIABLE DEFINITIONS + OAHeatingCoil = false; + OACoolingCoil = false; + OAHX = false; + int FanOpMode; + bool HeatingActive = false; + bool CoolingActive = false; + Real64 sensOut = 0.0; + Real64 latOut = 0.0; + int constexpr zoneOAUnitNum = -1; + Real64 constexpr OAUCoilOutTemp = 0.0; + bool constexpr ZoneEquipFlag = false; + + switch (CompTypeNum) { + case SimAirServingZones::CompType::OAMixer_Num: { // OutdoorAir:Mixer + if (Sim) { + SimOAMixer(state, CompName, CompIndex); + } + break; + } + case SimAirServingZones::CompType::Fan_Simple_CV: // Fan:ConstantVolume + case SimAirServingZones::CompType::Fan_Simple_VAV: { // Fan:VariableVolume + if (Sim) { + Fans::SimulateFanComponents(state, CompName, FirstHVACIteration, CompIndex); + } + break; + } + case SimAirServingZones::CompType::Fan_System_Object: { // Fan:SystemModel + if (CompIndex == 0) { // 0 means has not been filled because of 1-based arrays in old fortran + CompIndex = HVACFan::getFanObjectVectorIndex(state, CompName) + 1; // + 1 for shift from zero-based vector to 1-based compIndex + } + if (Sim) { + state.dataHVACFan->fanObjs[CompIndex - 1]->simulate(state, _, _, _, _); // vector is 0 based, but CompIndex is 1 based so shift + } + break; + } + case SimAirServingZones::CompType::Fan_ComponentModel: { // Fan:ComponentModel + if (Sim) { + Fans::SimulateFanComponents(state, CompName, FirstHVACIteration, CompIndex); + } + break; + } + case SimAirServingZones::CompType::WaterCoil_Cooling: { // Coil:Cooling:Water + if (Sim) { + // get water coil and controller data if not called previously + if (CompIndex == 0) WaterCoils::SimulateWaterCoilComponents(state, CompName, FirstHVACIteration, CompIndex); + // iterate on OA sys controller and water coil at the same time + if (!state.dataWaterCoils->WaterCoil(CompIndex).heatRecoveryCoil) { + SimAirServingZones::SolveWaterCoilController(state, + FirstHVACIteration, + AirLoopNum, + CompName, + CompIndex, + state.dataWaterCoils->WaterCoil(CompIndex).ControllerName, + state.dataWaterCoils->WaterCoil(CompIndex).ControllerIndex, + false); + // set flag to tell HVAC controller it will be simulated only in SolveWaterCoilController() + state.dataHVACControllers->ControllerProps(state.dataWaterCoils->WaterCoil(CompIndex).ControllerIndex).BypassControllerCalc = true; + } else { + WaterCoils::SimulateWaterCoilComponents(state, CompName, FirstHVACIteration, CompIndex); + } + } else { + // This is not working as intended ... don't want to include the HR coil in sizing. + // But if the water coil is called to get this index, then the controller is called to set the + // controller index and the simulation sizes the controller before the cooling coil. + // Pushing this aspect forward to a follow up issue where the + // controller index call is moved out of water coils getInput. + // if (CompIndex == 0) { + // bool errFound = false; + // CompIndex = WaterCoils::GetWaterCoilIndex(state, CompType, CompName, errFound); + // if (errFound) ShowFatalError(state, "SimOAComponent: Program terminates for preceding reason."); + // } + // if (!state.dataWaterCoils->WaterCoil(CompIndex).heatRecoveryCoil) OACoolingCoil = true; + // should not include heat recovery coils in sizing since heat transfer at peak cooling is minimal. + OACoolingCoil = true; + } + } break; + case SimAirServingZones::CompType::WaterCoil_SimpleHeat: { // Coil:Heating:Water + if (Sim) { + // get water coil and controller data if not called previously + if (CompIndex == 0) WaterCoils::SimulateWaterCoilComponents(state, CompName, FirstHVACIteration, CompIndex); + // iterate on OA sys controller and water coil at the same time + SimAirServingZones::SolveWaterCoilController(state, + FirstHVACIteration, + AirLoopNum, + CompName, + CompIndex, + state.dataWaterCoils->WaterCoil(CompIndex).ControllerName, + state.dataWaterCoils->WaterCoil(CompIndex).ControllerIndex, + false); + // set flag to tell HVAC controller it will be simulated only in SolveWaterCoilController() + state.dataHVACControllers->ControllerProps(state.dataWaterCoils->WaterCoil(CompIndex).ControllerIndex).BypassControllerCalc = true; + } + OAHeatingCoil = true; + } break; + case SimAirServingZones::CompType::SteamCoil_AirHeat: { // Coil:Heating:Steam + if (Sim) { + SteamCoils::SimulateSteamCoilComponents(state, CompName, FirstHVACIteration, CompIndex, 0.0); + } + OAHeatingCoil = true; + } break; + case SimAirServingZones::CompType::WaterCoil_DetailedCool: { // Coil:Cooling:Water:DetailedGeometry + if (Sim) { + // get water coil and controller data if not called previously + if (CompIndex == 0) WaterCoils::SimulateWaterCoilComponents(state, CompName, FirstHVACIteration, CompIndex); + // iterate on OA sys controller and water coil at the same time + SimAirServingZones::SolveWaterCoilController(state, + FirstHVACIteration, + AirLoopNum, + CompName, + CompIndex, + state.dataWaterCoils->WaterCoil(CompIndex).ControllerName, + state.dataWaterCoils->WaterCoil(CompIndex).ControllerIndex, + false); + // set flag to tell HVAC controller it will be simulated only in SolveWaterCoilController() + state.dataHVACControllers->ControllerProps(state.dataWaterCoils->WaterCoil(CompIndex).ControllerIndex).BypassControllerCalc = true; + } + OACoolingCoil = true; + } break; + case SimAirServingZones::CompType::Coil_ElectricHeat: // Coil:Heating:Electric + case SimAirServingZones::CompType::Coil_GasHeat: { // Coil:Heating:Fuel + if (Sim) { + // stand-alone coils are temperature controlled (do not pass QCoilReq in argument list, QCoilReq overrides temp SP) + HeatingCoils::SimulateHeatingCoilComponents(state, CompName, FirstHVACIteration, _, CompIndex); + } + OAHeatingCoil = true; + } break; + case SimAirServingZones::CompType::WaterCoil_CoolingHXAsst: { // CoilSystem:Cooling:Water:HeatExchangerAssisted + if (Sim) { + // get water coil and controller data if not called previously + if (CompIndex == 0) + HVACHXAssistedCoolingCoil::SimHXAssistedCoolingCoil( + state, CompName, FirstHVACIteration, CompressorOperation::On, 0.0, CompIndex, ContFanCycCoil); + // iterate on OA sys controller and water coil at the same time + SimAirServingZones::SolveWaterCoilController(state, + FirstHVACIteration, + AirLoopNum, + CompName, + CompIndex, + state.dataHVACAssistedCC->HXAssistedCoil(CompIndex).ControllerName, + state.dataHVACAssistedCC->HXAssistedCoil(CompIndex).ControllerIndex, + true); + // set flag to tell HVAC controller it will be simulated only in SolveWaterCoilController() + state.dataHVACControllers->ControllerProps(state.dataHVACAssistedCC->HXAssistedCoil(CompIndex).ControllerIndex).BypassControllerCalc = + true; + } + OACoolingCoil = true; + } break; + case SimAirServingZones::CompType::DXSystem: // CoilSystem:Cooling:DX + case SimAirServingZones::CompType::CoilSystemWater: // CoilSystem:Cooling:Water + case SimAirServingZones::CompType::UnitarySystemModel: { // AirloopHVAC:UnitarySystem + if (Sim) { + int compNum = CompIndex; // use local so return value of compNum from simulate call does not overwrite CompIndex + state.dataAirLoop->OutsideAirSys(OASysNum).compPointer[compNum]->simulate(state, + CompName, + FirstHVACIteration, + AirLoopNum, + compNum, + HeatingActive, + CoolingActive, + zoneOAUnitNum, + OAUCoilOutTemp, + ZoneEquipFlag, + sensOut, + latOut); + } + if (state.dataMixedAir->MyOneTimeCheckUnitarySysFlag(OASysNum) && CompTypeNum == SimAirServingZones::CompType::UnitarySystemModel) { + UnitarySystems::UnitarySys::getUnitarySysHeatCoolCoil(state, CompName, OACoolingCoil, OAHeatingCoil, 0); + UnitarySystems::UnitarySys::checkUnitarySysCoilInOASysExists(state, CompName, 0); + if (Sim) state.dataMixedAir->MyOneTimeCheckUnitarySysFlag(OASysNum) = false; + } else { + OACoolingCoil = true; + } + } break; + case SimAirServingZones::CompType::DXHeatPumpSystem: { // CoilSystem:IntegratedHeatPump:AirSource + if (Sim) { + HVACDXHeatPumpSystem::SimDXHeatPumpSystem(state, CompName, FirstHVACIteration, AirLoopNum, CompIndex); + } + OAHeatingCoil = true; + } break; + case SimAirServingZones::CompType::CoilUserDefined: { // Coil:UserDefined + if (Sim) { + UserDefinedComponents::SimCoilUserDefined(state, CompName, CompIndex, AirLoopNum, OAHeatingCoil, OACoolingCoil); + } + } break; + case SimAirServingZones::CompType::HeatXchngr: { + // HeatExchanger:AirToAir:FlatPlate, HeatExchanger:AirToAir:SensibleAndLatent, HeatExchanger:Desiccant:BalancedFlow + if (Sim) { + Real64 AirloopPLR = 1; + if (state.dataAirLoop->OutsideAirSys(OASysNum).AirLoopDOASNum > -1) { + FanOpMode = DataHVACGlobals::ContFanCycCoil; + } else { + if (state.dataAirLoop->AirLoopControlInfo(AirLoopNum).FanOpMode == DataHVACGlobals::CycFanCycCoil) { + FanOpMode = DataHVACGlobals::CycFanCycCoil; + } else { + FanOpMode = DataHVACGlobals::ContFanCycCoil; + } + if (FanOpMode == DataHVACGlobals::CycFanCycCoil) { + // HX's in the OA system can be troublesome given that the OA flow rate is not necessarily proportional to air loop PLR + // adding that user input for branch flow rate, HX nominal flow rate, OA system min/max flow rate will not necessarily be + // perfectly input, a compromise is used for OA sys HX's as the ratio of flow to max. Issue #4298. + // AirloopPLR = AirLoopFlow( AirLoopNum ).FanPLR; + AirloopPLR = state.dataMixedAir->OAController(OASysNum).OAMassFlow / state.dataMixedAir->OAController(OASysNum).MaxOAMassFlowRate; + } + } + if (state.dataAirLoop->OutsideAirSys(OASysNum).AirLoopDOASNum > -1) { + HeatRecovery::SimHeatRecovery(state, CompName, FirstHVACIteration, CompIndex, FanOpMode, AirloopPLR, _, _, _, _, _); + } else { + HeatRecovery::SimHeatRecovery(state, + CompName, + FirstHVACIteration, + CompIndex, + FanOpMode, + AirloopPLR, + _, + _, + _, + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).HeatRecoveryBypass, + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).HighHumCtrlActive); + } + } + OAHX = true; + } break; + case SimAirServingZones::CompType::Desiccant: { // Dehumidifier:Desiccant:NoFans, Dehumidifier:Desiccant:NoFans, Dehumidifier:Desiccant:System + if (Sim) { + DesiccantDehumidifiers::SimDesiccantDehumidifier(state, CompName, FirstHVACIteration, CompIndex); + } + OAHX = true; + } break; + case SimAirServingZones::CompType::Humidifier: { // Humidifier:Steam:Electric Humidifier:Steam:Gas + if (Sim) { + Humidifiers::SimHumidifier(state, CompName, FirstHVACIteration, CompIndex); + } + } break; + case SimAirServingZones::CompType::Unglazed_SolarCollector: { // SolarCollector:UnglazedTranspired + if (Sim) { + TranspiredCollector::SimTranspiredCollector(state, CompName, CompIndex); + } + } break; + case SimAirServingZones::CompType::PVT_AirBased: { // SolarCollector:FlatPlate:PhotovoltaicThermal + if (Sim) { + if (CompIndex == 0) { + CompIndex = PhotovoltaicThermalCollectors::getPVTindexFromName(state, CompName); + } + PhotovoltaicThermalCollectors::simPVTfromOASys(state, CompIndex, FirstHVACIteration); + } + } break; + case SimAirServingZones::CompType::EvapCooler: { // EvaporativeCooler:Direct:CelDekPad, EvaporativeCooler:Indirect:CelDekPad + // EvaporativeCooler:Indirect:WetCoil, EvaporativeCooler:Indirect:ResearchSpecial + if (Sim) { + EvaporativeCoolers::SimEvapCooler(state, CompName, CompIndex); + } + } break; + case SimAirServingZones::CompType::ZoneVRFasAirLoopEquip: { // ZoneHVAC:TerminalUnit:VariableRefrigerantFlow + if (Sim) { + int ControlledZoneNum = 0; + bool HeatingActive = false; + bool CoolingActive = false; + int constexpr OAUnitNum = 0; + Real64 constexpr OAUCoilOutTemp = 0.0; + bool constexpr ZoneEquipment = false; + Real64 sysOut = 0.0; + Real64 latOut = 0.0; + HVACVariableRefrigerantFlow::SimulateVRF(state, + CompName, + FirstHVACIteration, + ControlledZoneNum, + CompIndex, + HeatingActive, + CoolingActive, + OAUnitNum, + OAUCoilOutTemp, + ZoneEquipment, + sysOut, + latOut); + } else { + HVACVariableRefrigerantFlow::isVRFCoilPresent(state, CompName, OACoolingCoil, OAHeatingCoil); + } + } break; + default: + ShowFatalError(state, format("Invalid Outside Air Component={}", CompType)); + } +} + +void SimOAMixer(EnergyPlusData &state, std::string const &CompName, int &CompIndex) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + + // PURPOSE OF THIS SUBROUTINE + // Simulate an Outside Air Mixer component + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int OAMixerNum; + + if (state.dataMixedAir->GetOAMixerInputFlag) { + GetOAMixerInputs(state); + state.dataMixedAir->GetOAMixerInputFlag = false; + } + + if (CompIndex == 0) { + OAMixerNum = UtilityRoutines::FindItemInList(CompName, state.dataMixedAir->OAMixer); + CompIndex = OAMixerNum; + if (OAMixerNum == 0) { + ShowFatalError(state, format("SimOAMixer: OutdoorAir:Mixer not found={}", CompName)); + } + } else { + OAMixerNum = CompIndex; + } + + InitOAMixer(state, OAMixerNum); + + CalcOAMixer(state, OAMixerNum); + + UpdateOAMixer(state, OAMixerNum); +} + +void SimOAController(EnergyPlusData &state, std::string const &CtrlName, int &CtrlIndex, bool const FirstHVACIteration, int const AirLoopNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + + // PURPOSE OF THIS SUBROUTINE + // Simulate an Outside Air Controller component + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int OAControllerNum; + + if ((state.dataMixedAir->GetOAControllerInputFlag) && + (AirLoopNum > 0)) { // Gets input for object first time Sim routine is called from an airloop + GetOAControllerInputs(state); + state.dataMixedAir->GetOAControllerInputFlag = false; + } + + if (CtrlIndex == 0) { + if (state.dataMixedAir->NumOAControllers > 0) { + OAControllerNum = UtilityRoutines::FindItemInList(CtrlName, state.dataMixedAir->OAController); + } else { + OAControllerNum = 0; + } + CtrlIndex = OAControllerNum; + if (OAControllerNum == 0) { + ShowFatalError(state, format("SimOAController: Outside Air Controller not found={}", CtrlName)); + } + } else { + OAControllerNum = CtrlIndex; + } + + InitOAController(state, OAControllerNum, FirstHVACIteration, AirLoopNum); + + state.dataMixedAir->OAController(OAControllerNum).CalcOAController(state, AirLoopNum, FirstHVACIteration); + state.dataMixedAir->OAController(OAControllerNum).UpdateOAController(state); +} + +// Get Input Section of the Module +//****************************************************************************** + +void GetOutsideAirSysInputs(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + + // PURPOSE OF THIS SUBROUTINE + // Input the Outside Air System data and store it in the OutsideAirSys array. + + // METHODOLOGY EMPLOYED: + // Use the Get routines from the InputProcessor module. + + // SUBROUTINE PARAMETER DEFINITIONS: + static constexpr std::string_view RoutineName("GetOutsideAirSysInputs: "); // include trailing blank space + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + bool ErrorsFound(false); + int NumNums; // Number of real numbers returned by GetObjectItem + int NumAlphas; // Number of alphanumerics returned by GetObjectItem + int AlphaNum; + int TotalArgs(0); // Total number of alpha and numeric arguments (max) for a + int IOStat; + Array1D NumArray; + Array1D_string AlphArray; + Array1D_string cAlphaFields; // Alpha field names + Array1D_string cNumericFields; // Numeric field names + Array1D_bool lAlphaBlanks; // Logical array, alpha field input BLANK = .TRUE. + Array1D_bool lNumericBlanks; // Logical array, numeric field input BLANK = .TRUE. + + if (!state.dataMixedAir->GetOASysInputFlag) return; + + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( + state, CurrentModuleObjects[static_cast(CMO::OASystem)], TotalArgs, NumAlphas, NumNums); + int MaxNums = NumNums; + int MaxAlphas = NumAlphas; + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( + state, CurrentModuleObjects[static_cast(CMO::AirLoopEqList)], TotalArgs, NumAlphas, NumNums); + MaxNums = max(MaxNums, NumNums); + MaxAlphas = max(MaxAlphas, NumAlphas); + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( + state, CurrentModuleObjects[static_cast(CMO::ControllerList)], TotalArgs, NumAlphas, NumNums); + MaxNums = max(MaxNums, NumNums); + MaxAlphas = max(MaxAlphas, NumAlphas); + + AlphArray.allocate(MaxAlphas); + cAlphaFields.allocate(MaxAlphas); + NumArray.dimension(MaxNums, 0.0); + cNumericFields.allocate(MaxNums); + lAlphaBlanks.dimension(MaxAlphas, true); + lNumericBlanks.dimension(MaxNums, true); + + std::string_view CurrentModuleObject = CurrentModuleObjects[static_cast(CMO::ControllerList)]; + state.dataMixedAir->NumControllerLists = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + + state.dataMixedAir->ControllerLists.allocate(state.dataMixedAir->NumControllerLists); + + for (int Item = 1; Item <= state.dataMixedAir->NumControllerLists; ++Item) { + + // create a reference for convenience + auto &thisControllerList(state.dataMixedAir->ControllerLists(Item)); + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + Item, + AlphArray, + NumAlphas, + NumArray, + NumNums, + IOStat, + lNumericBlanks, + lAlphaBlanks, + cAlphaFields, + cNumericFields); + thisControllerList.Name = AlphArray(1); // no need to check if AlphaArray(1) is empty since Json will catch missing required fields + thisControllerList.NumControllers = (NumAlphas - 1) / 2; + thisControllerList.ControllerType.dimension(thisControllerList.NumControllers, ControllerKind::Invalid); + thisControllerList.ControllerName.allocate(thisControllerList.NumControllers); + AlphaNum = 2; + for (int CompNum = 1; CompNum <= thisControllerList.NumControllers; ++CompNum) { + // Json will catch any object types that are not the correct key choice of Controller:OutdoorAir or Controller:WaterCoil + thisControllerList.ControllerType(CompNum) = + static_cast(getEnumerationValue(ControllerKindNamesUC, UtilityRoutines::MakeUPPERCase(AlphArray(AlphaNum)))); + thisControllerList.ControllerName(CompNum) = AlphArray(AlphaNum + 1); + // loop over all previous controller lists to check if this controllers is also present on previous controllers + for (int previousListNum = 1; previousListNum < Item; ++previousListNum) { + // loop over each of the controllers listed for this list + auto &previousList(state.dataMixedAir->ControllerLists(previousListNum)); + for (int PreviousListControllerNum = 1; PreviousListControllerNum <= previousList.NumControllers; ++PreviousListControllerNum) { + if ((previousList.ControllerType(PreviousListControllerNum) == thisControllerList.ControllerType(CompNum)) && + (previousList.ControllerName(PreviousListControllerNum) == thisControllerList.ControllerName(CompNum))) { + ShowSevereError(state, format("Controller instance repeated in multiple {} objects", CurrentModuleObject)); + ShowContinueError(state, format("Found in {} = {}", CurrentModuleObject, thisControllerList.Name)); + ShowContinueError(state, format("Also found in {} = {}", CurrentModuleObject, previousList.Name)); + ErrorsFound = true; + } + } + } + AlphaNum += 2; + } + } + + CurrentModuleObject = CurrentModuleObjects[static_cast(CMO::OASystem)]; + + state.dataAirLoop->NumOASystems = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + + state.dataAirLoop->OutsideAirSys.allocate(state.dataAirLoop->NumOASystems); + state.dataSize->OASysEqSizing.allocate(state.dataAirLoop->NumOASystems); + state.dataMixedAir->ControllerListUniqueNames.reserve(static_cast(state.dataAirLoop->NumOASystems)); + state.dataMixedAir->MyOneTimeErrorFlag.dimension(state.dataAirLoop->NumOASystems, true); + state.dataMixedAir->MyOneTimeCheckUnitarySysFlag.dimension(state.dataAirLoop->NumOASystems, true); + state.dataMixedAir->initOASysFlag.dimension(state.dataAirLoop->NumOASystems, true); + + for (int OASysNum = 1; OASysNum <= state.dataAirLoop->NumOASystems; ++OASysNum) { + auto &OASys = state.dataAirLoop->OutsideAirSys(OASysNum); + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + OASysNum, + AlphArray, + NumAlphas, + NumArray, + NumNums, + IOStat, + lNumericBlanks, + lAlphaBlanks, + cAlphaFields, + cNumericFields); + OASys.Name = AlphArray(1); // no need to check if AlphaArray(1) is empty since Json will catch missing required fields + if (!AlphArray(2).empty()) { + GlobalNames::IntraObjUniquenessCheck( + state, AlphArray(2), CurrentModuleObject, cAlphaFields(2), state.dataMixedAir->ControllerListUniqueNames, ErrorsFound); + } + OASys.ControllerListName = AlphArray(2); + OASys.ComponentListName = AlphArray(3); + + BranchNodeConnections::TestCompSet(state, CurrentModuleObject, OASys.Name, "UNDEFINED", "UNDEFINED", "Air Nodes"); + + if (!lAlphaBlanks(3)) { + int ListNum = state.dataInputProcessing->inputProcessor->getObjectItemNum( + state, CurrentModuleObjects[static_cast(CMO::AirLoopEqList)], OASys.ComponentListName); + if (ListNum > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem( + state, CurrentModuleObjects[static_cast(CMO::AirLoopEqList)], ListNum, AlphArray, NumAlphas, NumArray, NumNums, IOStat); + int NumInList = (NumAlphas - 1) / 2; + OASys.NumComponents = NumInList; + OASys.ComponentName.allocate(NumInList); + OASys.ComponentType.allocate(NumInList); + OASys.ComponentTypeEnum.dimension(NumInList, SimAirServingZones::CompType::Invalid); + OASys.ComponentIndex.dimension(NumInList, 0); + OASys.InletNodeNum.dimension(NumInList, 0); + OASys.OutletNodeNum.dimension(NumInList, 0); + OASys.compPointer.resize(NumInList + 1, nullptr); + for (int InListNum = 1; InListNum <= NumInList; ++InListNum) { + OASys.ComponentName(InListNum) = AlphArray(InListNum * 2 + 1); + OASys.ComponentType(InListNum) = AlphArray(InListNum * 2); + + // Add equipment to component sets array + BranchNodeConnections::SetUpCompSets(state, + CurrentModuleObject, + OASys.Name, + OASys.ComponentType(InListNum), + OASys.ComponentName(InListNum), + "UNDEFINED", + "UNDEFINED"); + } + } else { + ShowSevereError( + state, + format("{} = \"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, OASys.Name, cAlphaFields(3), OASys.ComponentListName)); + ErrorsFound = true; + } + } else { + ShowSevereError(state, format("{} = \"{}\" invalid {} is blank and must be entered.", CurrentModuleObject, OASys.Name, cAlphaFields(3))); + ErrorsFound = true; + } + + int ListNum = 0; + int NumSimpControllers = 0; // number of Controller:Simple objects in an OA System + if (!lAlphaBlanks(2)) { + ListNum = state.dataInputProcessing->inputProcessor->getObjectItemNum( + state, CurrentModuleObjects[static_cast(CMO::ControllerList)], OASys.ControllerListName); + if (ListNum > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem( + state, CurrentModuleObjects[static_cast(CMO::ControllerList)], ListNum, AlphArray, NumAlphas, NumArray, NumNums, IOStat); + int NumInList = (NumAlphas - 1) / 2; + OASys.NumControllers = NumInList; + OASys.ControllerName.allocate(NumInList); + OASys.ControllerType.allocate(NumInList); + OASys.controllerTypeEnum.dimension(NumInList, DataAirLoop::ControllerKind::Invalid); + OASys.ControllerIndex.dimension(NumInList, 0); + for (int InListNum = 1; InListNum <= NumInList; ++InListNum) { + OASys.ControllerName(InListNum) = AlphArray(InListNum * 2 + 1); + OASys.ControllerType(InListNum) = AlphArray(InListNum * 2); + OASys.controllerTypeEnum(InListNum) = + static_cast(getEnumerationValue(ControllerKindNamesUC, OASys.ControllerType(InListNum))); + // only count Controller:OutdoorAir types as valid simple controllers + if (OASys.controllerTypeEnum(InListNum) != DataAirLoop::ControllerKind::OutdoorAir) { + ++NumSimpControllers; + } + } + } else { + ShowSevereError(state, + format("{} = \"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, AlphArray(1), cAlphaFields(2), AlphArray(2))); + ErrorsFound = true; + } + } else { + if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "AirLoopHVAC:DedicatedOutdoorAirSystem") == 0) { + ShowSevereError(state, + format("{} = \"{}\" invalid {} is blank and must be entered.", CurrentModuleObject, AlphArray(1), cAlphaFields(2))); + ErrorsFound = true; + } else { + ShowWarningError(state, + format("{} = \"{}\": blank {} must be used with AirLoopHVAC:DedicatedOutdoorAirSystem.", + CurrentModuleObject, + AlphArray(1), + cAlphaFields(2))); + } + } + OASys.ControllerListNum = ListNum; + OASys.NumSimpleControllers = NumSimpControllers; + } + + for (int OASysNum = 1; OASysNum <= state.dataAirLoop->NumOASystems; ++OASysNum) { + auto &OASys = state.dataAirLoop->OutsideAirSys(OASysNum); + for (int CompNum = 1; CompNum <= OASys.NumComponents; ++CompNum) { + OASys.ComponentTypeEnum(CompNum) = + static_cast(getEnumerationValue(CompTypeNamesUC, OASys.ComponentType(CompNum))); + if (OASys.ComponentTypeEnum(CompNum) == SimAirServingZones::CompType::Fan_System_Object) { + // construct fan object + state.dataHVACFan->fanObjs.emplace_back(new HVACFan::FanSystem(state, OASys.ComponentName(CompNum))); + OASys.ComponentIndex(CompNum) = state.dataHVACFan->fanObjs.size(); + } else if (OASys.ComponentTypeEnum(CompNum) == SimAirServingZones::CompType::CoilSystemWater || + OASys.ComponentTypeEnum(CompNum) == SimAirServingZones::CompType::UnitarySystemModel || + OASys.ComponentTypeEnum(CompNum) == SimAirServingZones::CompType::DXSystem) { + OASys.ComponentIndex(CompNum) = CompNum; + OASys.compPointer[CompNum] = + UnitarySystems::UnitarySys::factory(state, DataHVACGlobals::UnitarySys_AnyCoilType, OASys.ComponentName(CompNum), false, 0); + } else if (OASys.ComponentTypeEnum(CompNum) == SimAirServingZones::CompType::Invalid) { + std::string const thisComp = OASys.ComponentType(CompNum); + if (thisComp == "HEATEXCHANGER:AIRTOAIR:SENSIBLEANDLATENT" || thisComp == "HEATEXCHANGER:DESICCANT:BALANCEDFLOW") { + OASys.ComponentTypeEnum(CompNum) = SimAirServingZones::CompType::HeatXchngr; + } else if (thisComp == "DEHUMIDIFIER:DESICCANT:SYSTEM") { + OASys.ComponentTypeEnum(CompNum) = SimAirServingZones::CompType::Desiccant; + } else if (thisComp == "EVAPORATIVECOOLER:INDIRECT:CELDEKPAD" || thisComp == "EVAPORATIVECOOLER:INDIRECT:WETCOIL" || + thisComp == "EVAPORATIVECOOLER:INDIRECT:RESEARCHSPECIAL" || thisComp == "EVAPORATIVECOOLER:DIRECT:RESEARCHSPECIAL") { + OASys.ComponentTypeEnum(CompNum) = SimAirServingZones::CompType::EvapCooler; + } else if (thisComp == "HUMIDIFIER:STEAM:GAS") { + OASys.ComponentTypeEnum(CompNum) = SimAirServingZones::CompType::Humidifier; + } else { + ShowSevereError( + state, + format("{} = \"{}\" invalid Outside Air Component=\"{}\".", CurrentModuleObject, AlphArray(1), OASys.ComponentType(CompNum))); + ErrorsFound = true; + } + } + } + + // loop through the controllers in the controller list for OA system and save the pointer to the OA controller index + for (int OAControllerNum = 1; OAControllerNum <= state.dataAirLoop->OutsideAirSys(OASysNum).NumControllers; ++OAControllerNum) { + if (state.dataAirLoop->OutsideAirSys(OASysNum).controllerTypeEnum(OAControllerNum) == DataAirLoop::ControllerKind::OutdoorAir) { + state.dataAirLoop->OutsideAirSys(OASysNum).OAControllerName = + state.dataAirLoop->OutsideAirSys(OASysNum).ControllerName(OAControllerNum); + break; + } + } + } + + if (ErrorsFound) { + ShowFatalError(state, format("{}Errors found in getting {}.", RoutineName, CurrentModuleObject)); + } + + AlphArray.deallocate(); + cAlphaFields.deallocate(); + NumArray.deallocate(); + cNumericFields.deallocate(); + lAlphaBlanks.deallocate(); + lNumericBlanks.deallocate(); + + state.dataMixedAir->GetOASysInputFlag = false; +} + +void GetOAControllerInputs(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + // MODIFIED Shirey/Raustad FSEC, June 2003, Jan 2004 + // Mangesh Basarkar, 06/2011: Getting zone OA specifications from Design Specification Object + // Tianzhen Hong, 3/2012: getting zone air distribution effectiveness and secondary recirculation + // from DesignSpecification:ZoneAirDistribution objects + + // PURPOSE OF THIS SUBROUTINE + // Input the OAController data and store it in the OAController array. + // Input the Ventilation:Mechanical data and store it in the VentilationMechanical array. + // Condense Ventilation:Mechanical data array to include only unique zones specified for each instance of this object. + + // METHODOLOGY EMPLOYED: + // Use the Get routines from the InputProcessor module. + + // SUBROUTINE PARAMETER DEFINITIONS: + static constexpr std::string_view RoutineName("GetOAControllerInputs: "); // include trailing blank space + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int NumArg; // Number of arguments from GetObjectDefMaxArgs call + int NumNums; // Number of real numbers returned by GetObjectItem + int NumAlphas; // Number of alphanumerics returned by GetObjectItem + int IOStat; // Status of GetObjectItem call + Array1D NumArray; + Array1D_string AlphArray; + std::string_view CurrentModuleObject; // Object type for getting and messages + Array1D_string cAlphaFields; // Alpha field names + Array1D_string cNumericFields; // Numeric field names + Array1D_bool lAlphaBlanks; // Logical array, alpha field input BLANK = .TRUE. + Array1D_bool lNumericBlanks; // Logical array, numeric field input BLANK = .TRUE. + bool ErrorsFound(false); // Flag identifying errors found during get input + + // First, call other get input routines in this module to make sure data is filled during this routine. + if (state.dataMixedAir->GetOASysInputFlag) { // Gets input for object first time Sim routine is called + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + if (state.dataMixedAir->GetOAMixerInputFlag) { // Gets input for object first time Sim routine is called + GetOAMixerInputs(state); + state.dataMixedAir->GetOAMixerInputFlag = false; + } + + FaultsManager::CheckAndReadFaults(state); + + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( + state, CurrentModuleObjects[static_cast(CMO::OAController)], NumArg, NumAlphas, NumNums); + int MaxAlphas = NumAlphas; + int MaxNums = NumNums; + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( + state, CurrentModuleObjects[static_cast(CMO::ERVController)], NumArg, NumAlphas, NumNums); + MaxAlphas = max(MaxAlphas, NumAlphas); + MaxNums = max(MaxNums, NumNums); + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( + state, CurrentModuleObjects[static_cast(CMO::MechVentilation)], NumArg, NumAlphas, NumNums); + MaxAlphas = max(MaxAlphas, NumAlphas); + MaxNums = max(MaxNums, NumNums); + + AlphArray.allocate(MaxAlphas); + NumArray.dimension(MaxNums, 0.0); + lAlphaBlanks.dimension(MaxAlphas, true); + lNumericBlanks.dimension(MaxNums, true); + cAlphaFields.allocate(MaxAlphas); + cNumericFields.allocate(MaxNums); + + // Count OAcontrollers and ERVcontrollers and allocate arrays + AllocateOAControllers(state); + + // If there are ERV controllers, they have been filled before now NumOAControllers includes the count of NumERVControllers + if (state.dataMixedAir->NumOAControllers > state.dataMixedAir->NumERVControllers) { + CurrentModuleObject = CurrentModuleObjects[static_cast(CMO::OAController)]; + int currentOAControllerNum = 0; + for (int OutAirNum = state.dataMixedAir->NumERVControllers + 1; OutAirNum <= state.dataMixedAir->NumOAControllers; ++OutAirNum) { + ++currentOAControllerNum; + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + currentOAControllerNum, + AlphArray, + NumAlphas, + NumArray, + NumNums, + IOStat, + lNumericBlanks, + lAlphaBlanks, + cAlphaFields, + cNumericFields); + GlobalNames::VerifyUniqueInterObjectName( + state, state.dataMixedAir->OAControllerUniqueNames, AlphArray(1), CurrentModuleObject, cAlphaFields(1), ErrorsFound); + + ProcessOAControllerInputs(state, + CurrentModuleObject, + OutAirNum, + AlphArray, + NumAlphas, + NumArray, + NumNums, + lNumericBlanks, + lAlphaBlanks, + cAlphaFields, + cNumericFields, + ErrorsFound); + + // add applicable faults identifier to avoid string comparison at each time step + // loop through each fault for each OA controller and determine economizer faultys + for (int i = 1; i <= state.dataFaultsMgr->NumFaultyEconomizer; ++i) { + if (state.dataFaultsMgr->FaultsEconomizer(i).ControllerTypeEnum != iController_AirEconomizer) continue; + if (UtilityRoutines::SameString(state.dataMixedAir->OAController(OutAirNum).Name, + state.dataFaultsMgr->FaultsEconomizer(i).ControllerName)) { + state.dataFaultsMgr->FaultsEconomizer(i).ControllerID = OutAirNum; + ++state.dataMixedAir->OAController(OutAirNum).NumFaultyEconomizer; + } + } + // loop through each fault for each OA controller to determine faulty counts + state.dataMixedAir->OAController(OutAirNum).EconmizerFaultNum.allocate(state.dataMixedAir->OAController(OutAirNum).NumFaultyEconomizer); + if (state.dataMixedAir->OAController(OutAirNum).NumFaultyEconomizer > 0) { + for (int j = 0, i = 1; i <= state.dataFaultsMgr->NumFaultyEconomizer; ++i) { + if (state.dataFaultsMgr->FaultsEconomizer(i).ControllerTypeEnum != iController_AirEconomizer) continue; + if (UtilityRoutines::SameString(state.dataMixedAir->OAController(OutAirNum).Name, + state.dataFaultsMgr->FaultsEconomizer(i).ControllerName)) { + state.dataMixedAir->OAController(OutAirNum).EconmizerFaultNum(++j) = i; + } + } + } + } // LOOP FOR OutAirNum + + if (ErrorsFound) { + AlphArray.deallocate(); + NumArray.deallocate(); + lNumericBlanks.deallocate(); + lAlphaBlanks.deallocate(); + cAlphaFields.deallocate(); + cNumericFields.deallocate(); + ShowFatalError(state, format("{}Errors found in getting {} inputs.", RoutineName, CurrentModuleObject)); + } + } + + state.dataMixedAir->GetOAControllerInputFlag = false; + + // Process Controller:MechanicalVentilation objects + CurrentModuleObject = CurrentModuleObjects[static_cast(CMO::MechVentilation)]; + state.dataMixedAir->NumVentMechControllers = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + if (state.dataMixedAir->NumVentMechControllers > 0) { + state.dataMixedAir->VentilationMechanical.allocate(state.dataMixedAir->NumVentMechControllers); + for (int VentMechNum = 1; VentMechNum <= state.dataMixedAir->NumVentMechControllers; ++VentMechNum) { + auto &thisVentilationMechanical(state.dataMixedAir->VentilationMechanical(VentMechNum)); + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + VentMechNum, + AlphArray, + NumAlphas, + NumArray, + NumNums, + IOStat, + lNumericBlanks, + lAlphaBlanks, + cAlphaFields, + cNumericFields); + + int MechVentZoneCount = 0; + + int NumGroups = (NumAlphas + NumNums - 5) / 3; // Number of extensible input groups of the VentilationMechanical object + if (mod((NumAlphas + NumNums - 5), 3) != 0) ++NumGroups; + thisVentilationMechanical.Name = AlphArray(1); // no need to check if AlphaArray(1) is empty since Json will catch missing required fields + thisVentilationMechanical.SchName = AlphArray(2); + if (lAlphaBlanks(2)) { + thisVentilationMechanical.SchPtr = ScheduleManager::ScheduleAlwaysOn; + } else { + thisVentilationMechanical.SchPtr = GetScheduleIndex(state, AlphArray(2)); // convert schedule name to pointer + if (thisVentilationMechanical.SchPtr == 0) { + ShowSevereError( + state, format("{}=\"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, AlphArray(1), cAlphaFields(2), AlphArray(2))); + ErrorsFound = true; + } + } + + // Adding new flag for DCV + if (UtilityRoutines::SameString(AlphArray(3), "Yes")) { + thisVentilationMechanical.DCVFlag = true; + } else if (UtilityRoutines::SameString(AlphArray(3), "No") || lAlphaBlanks(3)) { + thisVentilationMechanical.DCVFlag = false; + } else { + ShowSevereError(state, + format("{}=\"{}\" invalid value {}=\"{}\".", CurrentModuleObject, AlphArray(1), cAlphaFields(3), AlphArray(3))); + ShowContinueError(state, "...Valid values are \"Yes\" or \"No\"."); + ErrorsFound = true; + } + + // System outdoor air method + thisVentilationMechanical.SystemOAMethod = + static_cast(getEnumerationValue(SOAMNamesUC, UtilityRoutines::MakeUPPERCase(AlphArray(4)))); + + if (thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::IAQP || + thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc || + thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc || + thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate || + thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::IAQPCOM) { + if (!state.dataContaminantBalance->Contaminant.CO2Simulation) { + ShowSevereError( + state, + format( + "{}=\"{}\" valid {}=\"{}\" requires CO2 simulation.", CurrentModuleObject, AlphArray(1), cAlphaFields(2), AlphArray(2))); + ShowContinueError(state, "The choice must be Yes for the field Carbon Dioxide Concentration in ZoneAirContaminantBalance"); + ErrorsFound = true; + } + } + + if (thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::IAQPGC || + thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::IAQPCOM) { + if (!state.dataContaminantBalance->Contaminant.GenericContamSimulation) { + ShowSevereError(state, + format("{}=\"{}\" valid {}=\"{}\" requires generic contaminant simulation.", + CurrentModuleObject, + AlphArray(1), + cAlphaFields(2), + AlphArray(2))); + ShowContinueError(state, "The choice must be Yes for the field Generic Contaminant Concentration in ZoneAirContaminantBalance"); + ErrorsFound = true; + } + } + + if (thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::Invalid) { // If specified incorrectly, show errors + thisVentilationMechanical.SystemOAMethod = DataSizing::SysOAMethod::ZoneSum; + ShowWarningError(state, + format("{}=\"{}\" incorrect specification for {}, the ZoneSum method will be used.", + CurrentModuleObject, + AlphArray(1), + cAlphaFields(4))); + // ErrorsFound=.TRUE. + } + + // Zone maximum outdoor air fraction + thisVentilationMechanical.ZoneMaxOAFraction = NumArray(1); + + state.dataMixedAir->VentMechZoneOrListName.allocate(NumGroups); + state.dataMixedAir->DesignSpecOAObjName.allocate(NumGroups); + state.dataMixedAir->DesignSpecOAObjIndex.dimension(NumGroups, 0); + state.dataMixedAir->DesignSpecZoneADObjName.allocate(NumGroups); + state.dataMixedAir->DesignSpecZoneADObjIndex.dimension(NumGroups, 0); + + // First time through find the total number of zones requiring mechanical ventilation + // May include duplicate zones. Will check for duplicate zones further down in this subroutine. + for (int groupNum = 1; groupNum <= NumGroups; ++groupNum) { + state.dataMixedAir->VentMechZoneOrListName(groupNum) = AlphArray((groupNum - 1) * 3 + 5); + + // Getting OA details from design specification OA object + if (!lAlphaBlanks((groupNum - 1) * 3 + 6)) { + state.dataMixedAir->DesignSpecOAObjName(groupNum) = AlphArray((groupNum - 1) * 3 + 6); + int ObjIndex = UtilityRoutines::FindItemInList(state.dataMixedAir->DesignSpecOAObjName(groupNum), state.dataSize->OARequirements); + state.dataMixedAir->DesignSpecOAObjIndex(groupNum) = ObjIndex; + + if (ObjIndex == 0) { + ShowSevereError(state, format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, thisVentilationMechanical.Name)); + ShowContinueError(state, + format("... not found {}=\"{}\".", + cAlphaFields((groupNum - 1) * 3 + 6), + state.dataMixedAir->DesignSpecOAObjName(groupNum))); + ErrorsFound = true; + } + } + + // Get zone air distribution details from design specification Zone Air Distribution object + if (!lAlphaBlanks((groupNum - 1) * 3 + 7)) { + state.dataMixedAir->DesignSpecZoneADObjName(groupNum) = AlphArray((groupNum - 1) * 3 + 7); + int ObjIndex = + UtilityRoutines::FindItemInList(state.dataMixedAir->DesignSpecZoneADObjName(groupNum), state.dataSize->ZoneAirDistribution); + state.dataMixedAir->DesignSpecZoneADObjIndex(groupNum) = ObjIndex; + + if (ObjIndex == 0) { + // Cannot find the design specification Zone Air Distribution object + ShowSevereError(state, format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, thisVentilationMechanical.Name)); + ShowContinueError(state, + format("... not found {}=\"{}\".", + cAlphaFields((groupNum - 1) * 3 + 7), + state.dataMixedAir->DesignSpecZoneADObjName(groupNum))); + ErrorsFound = true; + } + } + + int ZoneNum = UtilityRoutines::FindItemInList(state.dataMixedAir->VentMechZoneOrListName(groupNum), state.dataHeatBal->Zone); + if (ZoneNum > 0) { + ++MechVentZoneCount; + } else { + int ZoneListNum = + UtilityRoutines::FindItemInList(state.dataMixedAir->VentMechZoneOrListName(groupNum), state.dataHeatBal->ZoneList); + if (ZoneListNum > 0) { + MechVentZoneCount += state.dataHeatBal->ZoneList(ZoneListNum).NumOfZones; + } else { + ShowWarningError( + state, + format("{}=\"{}\" invalid {} not found.", CurrentModuleObject, AlphArray(1), cAlphaFields((groupNum - 1) * 3 + 5))); + ShowContinueError( + state, + format("Missing {} = {}", cAlphaFields((groupNum - 1) * 3 + 5), state.dataMixedAir->VentMechZoneOrListName(groupNum))); + ErrorsFound = true; + } + } + } + + thisVentilationMechanical.NumofVentMechZones = MechVentZoneCount; + + // Now allocate and store unique zone and associated ventilation rate information + thisVentilationMechanical.VentMechZone.allocate(MechVentZoneCount); + + MechVentZoneCount = 0; + + // Loop through zone names and list of zone names, remove duplicate zones, and store designspec names and indexes + for (int groupNum = 1; groupNum <= NumGroups; ++groupNum) { + int ZoneNum = UtilityRoutines::FindItemInList(state.dataMixedAir->VentMechZoneOrListName(groupNum), state.dataHeatBal->Zone); + if (ZoneNum > 0) { + if (std::any_of(thisVentilationMechanical.VentMechZone.begin(), + thisVentilationMechanical.VentMechZone.end(), + [ZoneNum](auto const &vmZone) { return vmZone.zoneNum == ZoneNum; })) { + // Disregard duplicate zone names, show warning and do not store data for this zone + ShowWarningError(state, + format("Zone name = {} for {} object = {}", + state.dataMixedAir->VentMechZoneOrListName(groupNum), + CurrentModuleObject, + thisVentilationMechanical.Name)); + ShowContinueError(state, "is specified more than once. The first ventilation values specified for this zone will be used"); + ShowContinueError(state, "and the rest will be ignored. Simulation will continue.."); + } else { + // Store unique zone names + ++MechVentZoneCount; + auto &thisMechVentZone = thisVentilationMechanical.VentMechZone(MechVentZoneCount); + thisMechVentZone.zoneNum = ZoneNum; + thisMechVentZone.name = state.dataHeatBal->Zone(ZoneNum).Name; + + // Populating new temp array to hold design spec OA object for each zone + if (state.dataMixedAir->DesignSpecOAObjIndex(groupNum) > 0) { + thisMechVentZone.ZoneDesignSpecOAObjName = state.dataMixedAir->DesignSpecOAObjName(groupNum); + thisMechVentZone.ZoneDesignSpecOAObjIndex = state.dataMixedAir->DesignSpecOAObjIndex(groupNum); + } else { + if (state.dataGlobal->DoZoneSizing) { + int ObjIndex = UtilityRoutines::FindItemInList(state.dataMixedAir->VentMechZoneOrListName(groupNum), + state.dataSize->ZoneSizingInput, + &ZoneSizingInputData::ZoneName); + if (ObjIndex > 0) { + thisMechVentZone.ZoneDesignSpecOAObjName = state.dataSize->ZoneSizingInput(ObjIndex).DesignSpecOAObjName; + thisMechVentZone.ZoneDesignSpecOAObjIndex = state.dataSize->ZoneSizingInput(ObjIndex).ZoneDesignSpecOAIndex; + } + } + } + // Zone Air Distribution inputs + if (state.dataMixedAir->DesignSpecZoneADObjIndex(groupNum) > 0) { + // new DCV inputs + thisMechVentZone.ZoneDesignSpecADObjName = state.dataMixedAir->DesignSpecZoneADObjName(groupNum); + thisMechVentZone.ZoneDesignSpecADObjIndex = state.dataMixedAir->DesignSpecZoneADObjIndex(groupNum); + } else { + if (state.dataGlobal->DoZoneSizing) { + int ObjIndex = UtilityRoutines::FindItemInList(state.dataMixedAir->VentMechZoneOrListName(groupNum), + state.dataSize->ZoneSizingInput, + &ZoneSizingInputData::ZoneName); + if (ObjIndex > 0) { + thisMechVentZone.ZoneDesignSpecADObjName = state.dataSize->ZoneSizingInput(ObjIndex).ZoneAirDistEffObjName; + thisMechVentZone.ZoneDesignSpecADObjIndex = state.dataSize->ZoneSizingInput(ObjIndex).ZoneAirDistributionIndex; + } + } + } + } + } else { + // Not a zone name, must be a zone list + int ZoneListNum = + UtilityRoutines::FindItemInList(state.dataMixedAir->VentMechZoneOrListName(groupNum), state.dataHeatBal->ZoneList); + if (ZoneListNum > 0) { + for (int ScanZoneListNum = 1; ScanZoneListNum <= state.dataHeatBal->ZoneList(ZoneListNum).NumOfZones; ++ScanZoneListNum) { + // check to make sure zone name is unique (not listed more than once)... + int zoneNum2 = state.dataHeatBal->ZoneList(ZoneListNum).Zone(ScanZoneListNum); + if (std::any_of(thisVentilationMechanical.VentMechZone.begin(), + thisVentilationMechanical.VentMechZone.end(), + [zoneNum2](auto const &vmZone) { return vmZone.zoneNum == zoneNum2; })) { + // Disregard duplicate zone names, show warning and do not store data for this zone + ShowWarningError(state, + format("Zone name = {} in ZoneList = {} for {} object = {}", + state.dataHeatBal->Zone(zoneNum2).Name, + state.dataMixedAir->VentMechZoneOrListName(groupNum), + CurrentModuleObject, + thisVentilationMechanical.Name)); + ShowContinueError(state, "is a duplicate. The first ventilation values specified for this zone will be used "); + ShowContinueError(state, "and the rest will be ignored. The simulation will continue..."); + } else { + // Store data for each zone name from zone list (duplicate zone names accounted for in + // HeatBalanceManager) + ++MechVentZoneCount; + auto &thisMechVentZone = thisVentilationMechanical.VentMechZone(MechVentZoneCount); + thisMechVentZone.zoneNum = zoneNum2; + thisMechVentZone.name = state.dataHeatBal->Zone(zoneNum2).Name; + // Populating new temp array to hold design spec OA object for each zone + if (state.dataMixedAir->DesignSpecOAObjIndex(groupNum) > 0) { + thisMechVentZone.ZoneDesignSpecOAObjName = state.dataMixedAir->DesignSpecOAObjName(groupNum); + thisMechVentZone.ZoneDesignSpecOAObjIndex = state.dataMixedAir->DesignSpecOAObjIndex(groupNum); + } else { + if (state.dataGlobal->DoZoneSizing) { + int ObjIndex = UtilityRoutines::FindItemInList( + state.dataHeatBal->Zone(zoneNum2).Name, state.dataSize->ZoneSizingInput, &ZoneSizingInputData::ZoneName); + if (ObjIndex > 0) { + thisMechVentZone.ZoneDesignSpecOAObjName = state.dataSize->ZoneSizingInput(ObjIndex).DesignSpecOAObjName; + thisMechVentZone.ZoneDesignSpecOAObjIndex = + state.dataSize->ZoneSizingInput(ObjIndex).ZoneDesignSpecOAIndex; + } + } + } + + if (state.dataMixedAir->DesignSpecZoneADObjIndex(groupNum) > 0) { + // new DCV inputs + thisMechVentZone.ZoneDesignSpecADObjName = state.dataMixedAir->DesignSpecZoneADObjName(groupNum); + thisMechVentZone.ZoneDesignSpecADObjIndex = state.dataMixedAir->DesignSpecZoneADObjIndex(groupNum); + } else { + if (state.dataGlobal->DoZoneSizing) { + int ObjIndex = UtilityRoutines::FindItemInList( + state.dataHeatBal->Zone(zoneNum2).Name, state.dataSize->ZoneSizingInput, &ZoneSizingInputData::ZoneName); + if (ObjIndex > 0) { + thisMechVentZone.ZoneDesignSpecADObjName = + state.dataSize->ZoneSizingInput(ObjIndex).ZoneAirDistEffObjName; + thisMechVentZone.ZoneDesignSpecADObjIndex = + state.dataSize->ZoneSizingInput(ObjIndex).ZoneAirDistributionIndex; + } + } + } + } + } + } + } + } + + // Overwrite previous number of zones with number that does not include duplicates + thisVentilationMechanical.NumofVentMechZones = MechVentZoneCount; + + // Loop over zones and fill OA and AD specs, if none were found, use defaults + for (int ventMechZoneNum = 1; ventMechZoneNum <= MechVentZoneCount; ++ventMechZoneNum) { + auto &thisVentMechZone = thisVentilationMechanical.VentMechZone(ventMechZoneNum); + int zoneOAReqObjIndex = thisVentMechZone.ZoneDesignSpecOAObjIndex; + if (zoneOAReqObjIndex > 0) { + auto const &curOARequirements(state.dataSize->OARequirements(zoneOAReqObjIndex)); + thisVentMechZone.ZoneOAAreaRate = curOARequirements.OAFlowPerArea; + thisVentMechZone.ZoneOAPeopleRate = curOARequirements.OAFlowPerPerson; + thisVentMechZone.ZoneOAFlowRate = curOARequirements.OAFlowPerZone; + thisVentMechZone.ZoneOAACHRate = curOARequirements.OAFlowACH; + thisVentMechZone.ZoneOAFlowMethod = curOARequirements.OAFlowMethod; + thisVentMechZone.ZoneOASchPtr = curOARequirements.OAFlowFracSchPtr; + thisVentMechZone.OAPropCtlMinRateSchPtr = curOARequirements.OAPropCtlMinRateSchPtr; + if (thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate) { + if (thisVentMechZone.ZoneOAPeopleRate == 0.0 && thisVentMechZone.ZoneOAAreaRate == 0.0) { + ShowSevereError( + state, + format("{}{}=\"{}\", invalid input with System Outdoor Air Method = ProportionalControlBasedOnDesignOARate.", + RoutineName, + CurrentModuleObject, + thisVentilationMechanical.Name)); + ShowContinueError(state, + " The values of Outdoor Air Flow per Person and Outdoor Air Flow per Zone Floor Area in the same " + "object can not be zero."); + ErrorsFound = true; + } + } + } else { // use defaults + thisVentMechZone.ZoneOAAreaRate = 0.0; + // since this is case with no DesSpcOA object, cannot determine the method and default would be Flow/Person which should + // default to this flow rate + thisVentMechZone.ZoneOAPeopleRate = 0.00944; + thisVentMechZone.ZoneOAFlowRate = 0.0; + thisVentMechZone.ZoneOAACHRate = 0.0; + thisVentMechZone.ZoneOAFlowMethod = OAFlowCalcMethod::PerPerson; + thisVentMechZone.ZoneOASchPtr = ScheduleManager::ScheduleAlwaysOn; + ShowWarningError(state, format("{}{}=\"{}", RoutineName, CurrentModuleObject, thisVentilationMechanical.Name)); + ShowContinueError( + state, format("Cannot locate a matching DesignSpecification:OutdoorAir object for Zone=\"{}\".", thisVentMechZone.name)); + ShowContinueError(state, "Using default OA of 0.00944 m3/s-person and 0.0 m3/s-m2."); + } + int zoneAirDistObjIndex = thisVentMechZone.ZoneDesignSpecADObjIndex; + if (zoneAirDistObjIndex > 0) { + auto const &curZoneAirDistribution(state.dataSize->ZoneAirDistribution(zoneAirDistObjIndex)); + thisVentMechZone.ZoneADEffCooling = curZoneAirDistribution.ZoneADEffCooling; + thisVentMechZone.ZoneADEffHeating = curZoneAirDistribution.ZoneADEffHeating; + thisVentMechZone.ZoneADEffSchPtr = curZoneAirDistribution.ZoneADEffSchPtr; + thisVentMechZone.ZoneSecondaryRecirculation = curZoneAirDistribution.ZoneSecondaryRecirculation; + } else { // use defaults + thisVentMechZone.ZoneADEffCooling = 1.0; + thisVentMechZone.ZoneADEffHeating = 1.0; + thisVentMechZone.ZoneSecondaryRecirculation = 0.0; + ShowWarningError(state, format("{}{}=\"{}\"", RoutineName, CurrentModuleObject, thisVentilationMechanical.Name)); + ShowContinueError( + state, + format("Cannot locate a matching DesignSpecification:ZoneAirDistribution object for Zone=\"{}\".", thisVentMechZone.name)); + ShowContinueError(state, "Using default zone air distribution effectiveness of 1.0 for heating and cooling."); + } + } + state.dataMixedAir->VentMechZoneOrListName.deallocate(); + state.dataMixedAir->DesignSpecOAObjName.deallocate(); + state.dataMixedAir->DesignSpecOAObjIndex.deallocate(); + state.dataMixedAir->DesignSpecZoneADObjName.deallocate(); + state.dataMixedAir->DesignSpecZoneADObjIndex.deallocate(); + } + + for (int VentMechNum = 1; VentMechNum <= state.dataMixedAir->NumVentMechControllers; ++VentMechNum) { + auto &thisVentilationMechanical(state.dataMixedAir->VentilationMechanical(VentMechNum)); + for (int jZone = 1; jZone <= thisVentilationMechanical.NumofVentMechZones; ++jZone) { + auto &thisVentMechZone = thisVentilationMechanical.VentMechZone(jZone); + if (thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc) { + if (thisVentMechZone.ZoneOAACHRate > 0.0 || thisVentMechZone.ZoneOAFlowRate > 0.0) { + ShowWarningError(state, + format("{}=\"{}\", inappropriate outdoor air method", CurrentModuleObject, thisVentilationMechanical.Name)); + ShowContinueError(state, + format("Inappropriate method for Design Specification Outdoor Air Object Name=\"{}\".", + thisVentMechZone.ZoneDesignSpecOAObjName)); + ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); + ShowContinueError(state, + "Since System Outdoor Air Method= ProportionalControlBasedOnOccupancySchedule\", AirChanges/Hour or " + "Flow/Zone outdoor air methods are not valid. Simulation continues.... "); + } + } + if (thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc) { + if (thisVentMechZone.ZoneOAACHRate > 0.0 || thisVentMechZone.ZoneOAFlowRate > 0.0) { + ShowWarningError(state, + format("{}=\"{}\", inappropriate outdoor air method", CurrentModuleObject, thisVentilationMechanical.Name)); + ShowContinueError(state, + format("Inappropriate method for Design Specification Outdoor Air Object Name=\"{}\".", + thisVentMechZone.ZoneDesignSpecOAObjName)); + ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); + ShowContinueError(state, + "Since System Outdoor Air Method= ProportionalControlBasedOnDesignOccupancy\", AirChanges/Hour or " + "Flow/Zone outdoor air methods are not valid. Simulation continues.... "); + } + } + + // Error check to see if a single duct air terminal is assigned to a zone that has zone secondary recirculation + if (thisVentMechZone.ZoneSecondaryRecirculation > 0.0) { + int ZoneNum = thisVentMechZone.zoneNum; + if (ZoneNum > 0) { + int EquipListIndex = state.dataZoneEquip->ZoneEquipConfig(ZoneNum).EquipListIndex; + if (EquipListIndex > 0) { + for (int EquipListNum = 1; EquipListNum <= state.dataZoneEquip->NumOfZoneEquipLists; ++EquipListNum) { + if (EquipListNum == EquipListIndex) { + for (int EquipNum = 1; EquipNum <= state.dataZoneEquip->ZoneEquipList(EquipListNum).NumOfEquipTypes; ++EquipNum) { + if (UtilityRoutines::SameString(state.dataZoneEquip->ZoneEquipList(EquipListNum).EquipType(EquipNum), + "ZONEHVAC:AIRDISTRIBUTIONUNIT")) { + for (int ADUNum = 1; ADUNum <= (int)state.dataDefineEquipment->AirDistUnit.size(); ++ADUNum) { + if (UtilityRoutines::SameString(state.dataZoneEquip->ZoneEquipList(EquipListNum).EquipName(EquipNum), + state.dataDefineEquipment->AirDistUnit(ADUNum).Name)) { + if ((state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == + DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheat) || + (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == + DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolNoReheat) || + (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == + DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolReheat) || + (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == + DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVNoReheat) || + (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == + DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheatVSFan) || + (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == + DataDefineEquip::ZnAirLoopEquipType::SingleDuctCBVAVReheat) || + (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == + DataDefineEquip::ZnAirLoopEquipType::SingleDuctCBVAVNoReheat) || + (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == + DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolCooledBeam) || + (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == + DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolFourPipeBeam) || + (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == + DataDefineEquip::ZnAirLoopEquipType::DualDuctVAVOutdoorAir)) { + ShowWarningError(state, + format("{}=\"{}\", inappropriate use of Zone secondary recirculation", + CurrentModuleObject, + thisVentilationMechanical.Name)); + ShowContinueError(state, + "A zone secondary recirculation fraction is specified for zone served by "); + ShowContinueError(state, + format("...terminal unit \"{}\" , that indicates a single path system", + state.dataDefineEquipment->AirDistUnit(ADUNum).Name)); + ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); + ShowContinueError(state, "...The zone secondary recirculation for that zone was set to 0.0"); + thisVentMechZone.ZoneSecondaryRecirculation = 0.0; + } + goto EquipLoop_exit; + } + } + } + } + } + } + EquipLoop_exit:; + } + } + } + if (thisVentMechZone.ZoneDesignSpecOAObjName.empty()) { + ShowSevereError( + state, + format("{}=\"{}\", Design Specification Outdoor Air Object Name blank", CurrentModuleObject, thisVentilationMechanical.Name)); + ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); + ShowContinueError(state, "This field either needs to be filled in in this object or Sizing:Zone object."); + ShowContinueError(state, "For this run, default values for these fields will be used."); + } + if (thisVentMechZone.ZoneOAPeopleRate <= 0.0 && thisVentilationMechanical.DCVFlag) { + ShowWarningError(state, format("{}=\"{}\", Zone OA/person rate", CurrentModuleObject, thisVentilationMechanical.Name)); + ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); + ShowContinueError(state, + format("Zone outside air per person rate not set in Design Specification Outdoor Air Object=\"{}\".", + thisVentMechZone.ZoneDesignSpecOAObjName)); + } + + if (thisVentMechZone.ZoneOAAreaRate < 0.0) { + ShowSevereError(state, + format("{}=\"{}\", invalid Outdoor Air flow per area", CurrentModuleObject, thisVentilationMechanical.Name)); + ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); + ShowContinueError(state, + format("invalid Outdoor Air flow per area specified in object=\"{}\". Value must be >= 0.0.", + thisVentMechZone.ZoneDesignSpecOAObjName)); + ErrorsFound = true; + } + if (thisVentMechZone.ZoneOAPeopleRate < 0.0) { + ShowSevereError(state, + format("{}=\"{}\", invalid Outdoor Air flow per person", CurrentModuleObject, thisVentilationMechanical.Name)); + ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); + ShowContinueError(state, + format("invalid Outdoor Air flow per person specified in object \"{}\". Value must be >= 0.0.", + thisVentMechZone.ZoneDesignSpecOAObjName)); + ErrorsFound = true; + } + } + } + + // Link OA controller object with mechanical ventilation object + for (int OAControllerNum = 1; OAControllerNum <= state.dataMixedAir->NumOAControllers; ++OAControllerNum) { + state.dataMixedAir->OAController(OAControllerNum).VentMechObjectNum = UtilityRoutines::FindItemInList( + state.dataMixedAir->OAController(OAControllerNum).VentilationMechanicalName, state.dataMixedAir->VentilationMechanical); + if (state.dataMixedAir->OAController(OAControllerNum).VentMechObjectNum == 0 && + !state.dataMixedAir->OAController(OAControllerNum).VentilationMechanicalName.empty()) { + ShowSevereError(state, + format("{}=\"{}\", non-match to Controller:OutdoorAir", + CurrentModuleObject, + state.dataMixedAir->OAController(OAControllerNum).VentilationMechanicalName)); + ShowContinueError( + state, format("Invalid specified in Controller:OutdoorAir object = {}", state.dataMixedAir->OAController(OAControllerNum).Name)); + ShowContinueError(state, + format("{} object name must match the {} object name specified in Controller:OutdoorAir.", + CurrentModuleObject, + CurrentModuleObject)); + ErrorsFound = true; + } + } + + // write to .eio file + static constexpr std::string_view Format_700( + "!,Name,Availability Schedule Name,Demand Controlled Ventilation " + "{Yes/No},System Outdoor Air Method,Zone Maximum Outdoor Air Fraction,Number of Zones,Zone Name,DSOA " + "Name,DSZAD Name"); + print(state.files.eio, "{}\n", Format_700); + for (int VentMechNum = 1; VentMechNum <= state.dataMixedAir->NumVentMechControllers; ++VentMechNum) { + auto &thisVentilationMechanical(state.dataMixedAir->VentilationMechanical(VentMechNum)); + print(state.files.eio, " Controller:MechanicalVentilation,{},{},", thisVentilationMechanical.Name, thisVentilationMechanical.SchName); + + if (thisVentilationMechanical.DCVFlag) { + print(state.files.eio, "Yes,"); + } else { + print(state.files.eio, "No,"); + } + + if (thisVentilationMechanical.SystemOAMethod != DataSizing::SysOAMethod::Invalid) { + print(state.files.eio, printSysOAMethod[static_cast(thisVentilationMechanical.SystemOAMethod)]); + } else { + print(state.files.eio, "Invalid/Unknown,"); + } + + print(state.files.eio, "{:.2R},", thisVentilationMechanical.ZoneMaxOAFraction); + print(state.files.eio, "{},", thisVentilationMechanical.NumofVentMechZones); + + for (int jZone = 1; jZone <= thisVentilationMechanical.NumofVentMechZones; ++jZone) { + auto &thisVentMechZone = thisVentilationMechanical.VentMechZone(jZone); + if (jZone < thisVentilationMechanical.NumofVentMechZones) { + print(state.files.eio, + "{},{},{},", + state.dataHeatBal->Zone(thisVentMechZone.zoneNum).Name, + thisVentMechZone.ZoneDesignSpecOAObjName, + thisVentMechZone.ZoneDesignSpecADObjName); + } else { + print(state.files.eio, + "{},{},{}\n", + state.dataHeatBal->Zone(thisVentMechZone.zoneNum).Name, + thisVentMechZone.ZoneDesignSpecOAObjName, + thisVentMechZone.ZoneDesignSpecADObjName); + } + } + } + + } // Number of Mechanical Ventilation Objects > 0 + + AlphArray.deallocate(); + NumArray.deallocate(); + lNumericBlanks.deallocate(); + lAlphaBlanks.deallocate(); + cAlphaFields.deallocate(); + cNumericFields.deallocate(); + + if (ErrorsFound) { + ShowFatalError(state, format("{}Errors found when getting {} inputs.", RoutineName, CurrentModuleObject)); + } +} + +void AllocateOAControllers(EnergyPlusData &state) +{ + // PURPOSE OF THIS SUBROUTINE: + // Allocate the OA controller arrays which are shared by Controller:OutdoorAir and ZoneHVAC:EnergyRecoveryVentilator:Controller + + if (state.dataMixedAir->AllocateOAControllersFlag) { + state.dataMixedAir->NumOAControllers = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObjects[static_cast(CMO::OAController)]); + state.dataMixedAir->NumERVControllers = + state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObjects[static_cast(CMO::ERVController)]); + state.dataMixedAir->NumOAControllers += state.dataMixedAir->NumERVControllers; + state.dataMixedAir->OAController.allocate(state.dataMixedAir->NumOAControllers); + state.dataMixedAir->OAControllerUniqueNames.reserve(static_cast(state.dataMixedAir->NumOAControllers)); + state.dataMixedAir->AllocateOAControllersFlag = false; + } +} + +void GetOAMixerInputs(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + + // PURPOSE OF THIS SUBROUTINE + // Input the OAMixer data and store it in the OAMixer array. + + // METHODOLOGY EMPLOYED: + // Use the Get routines from the InputProcessor module. + + // SUBROUTINE PARAMETER DEFINITIONS: + static constexpr std::string_view RoutineName("GetOAMixerInputs: "); // include trailing blank space + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + + int NumNums; // Number of REAL(r64) numbers returned by GetObjectItem + int NumAlphas; // Number of alphanumerics returned by GetObjectItem + int NumArg; // Number of arguments from GetObjectDefMaxArgs call + int IOStat; + Array1D NumArray; // array that holds numeric input values + Array1D_string AlphArray; // array that holds alpha input values + Array1D_string cAlphaFields; // Alpha field names + Array1D_string cNumericFields; // Numeric field names + Array1D_bool lAlphaBlanks; // Logical array, alpha field input BLANK = .TRUE. + Array1D_bool lNumericBlanks; // Logical array, numeric field input BLANK = .TRUE. + bool ErrorsFound(false); + + if (!state.dataMixedAir->GetOAMixerInputFlag) return; + + state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( + state, CurrentModuleObjects[static_cast(CMO::OAMixer)], NumArg, NumAlphas, NumNums); + + AlphArray.allocate(NumAlphas); + NumArray.dimension(NumNums, 0.0); + lNumericBlanks.dimension(NumNums, true); + lAlphaBlanks.dimension(NumAlphas, true); + cAlphaFields.allocate(NumAlphas); + cNumericFields.allocate(NumNums); + + std::string_view const CurrentModuleObject = CurrentModuleObjects[static_cast(CMO::OAMixer)]; + + state.dataMixedAir->NumOAMixers = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + + if (state.dataMixedAir->NumOAMixers > 0) { + + state.dataMixedAir->OAMixer.allocate(state.dataMixedAir->NumOAMixers); + + for (int OutAirNum = 1; OutAirNum <= state.dataMixedAir->NumOAMixers; ++OutAirNum) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + CurrentModuleObject, + OutAirNum, + AlphArray, + NumAlphas, + NumArray, + NumNums, + IOStat, + lNumericBlanks, + lAlphaBlanks, + cAlphaFields, + cNumericFields); + // no need to check if AlphaArray(1) is empty since Json will catch missing required fields + state.dataMixedAir->OAMixer(OutAirNum).Name = AlphArray(1); + state.dataMixedAir->OAMixer(OutAirNum).MixNode = NodeInputManager::GetOnlySingleNode(state, + AlphArray(2), + ErrorsFound, + DataLoopNode::ConnectionObjectType::OutdoorAirMixer, + AlphArray(1), + DataLoopNode::NodeFluidType::Air, + DataLoopNode::ConnectionType::Outlet, + NodeInputManager::CompFluidStream::Primary, + ObjectIsNotParent); + // Set connection type to 'Inlet', because this is not necessarily directly from + // outside air. Outside Air Inlet Node List will set the connection to outside air + state.dataMixedAir->OAMixer(OutAirNum).InletNode = + NodeInputManager::GetOnlySingleNode(state, + AlphArray(3), + ErrorsFound, + DataLoopNode::ConnectionObjectType::OutdoorAirMixer, + AlphArray(1), + DataLoopNode::NodeFluidType::Air, + DataLoopNode::ConnectionType::Inlet, + NodeInputManager::CompFluidStream::Primary, + ObjectIsNotParent); + state.dataMixedAir->OAMixer(OutAirNum).RelNode = NodeInputManager::GetOnlySingleNode(state, + AlphArray(4), + ErrorsFound, + DataLoopNode::ConnectionObjectType::OutdoorAirMixer, + AlphArray(1), + DataLoopNode::NodeFluidType::Air, + DataLoopNode::ConnectionType::ReliefAir, + NodeInputManager::CompFluidStream::Primary, + ObjectIsNotParent); + state.dataMixedAir->OAMixer(OutAirNum).RetNode = NodeInputManager::GetOnlySingleNode(state, + AlphArray(5), + ErrorsFound, + DataLoopNode::ConnectionObjectType::OutdoorAirMixer, + AlphArray(1), + DataLoopNode::NodeFluidType::Air, + DataLoopNode::ConnectionType::Inlet, + NodeInputManager::CompFluidStream::Primary, + ObjectIsNotParent); + // Check for dupes in the four nodes. + if (state.dataMixedAir->OAMixer(OutAirNum).MixNode == state.dataMixedAir->OAMixer(OutAirNum).InletNode) { + ShowSevereError(state, + format("{} = {} {} = {} duplicates the {}.", + CurrentModuleObject, + state.dataMixedAir->OAMixer(OutAirNum).Name, + cAlphaFields(3), + state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OutAirNum).InletNode), + cAlphaFields(2))); + ErrorsFound = true; + } else if (state.dataMixedAir->OAMixer(OutAirNum).MixNode == state.dataMixedAir->OAMixer(OutAirNum).RelNode) { + ShowSevereError(state, + format("{} = {} {} = {} duplicates the {}.", + CurrentModuleObject, + state.dataMixedAir->OAMixer(OutAirNum).Name, + cAlphaFields(4), + state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OutAirNum).RelNode), + cAlphaFields(2))); + ErrorsFound = true; + } else if (state.dataMixedAir->OAMixer(OutAirNum).MixNode == state.dataMixedAir->OAMixer(OutAirNum).RetNode) { + ShowSevereError(state, + format("{} = {} {} = {} duplicates the {}.", + CurrentModuleObject, + state.dataMixedAir->OAMixer(OutAirNum).Name, + cAlphaFields(5), + state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OutAirNum).RetNode), + cAlphaFields(2))); + ErrorsFound = true; + } + + if (state.dataMixedAir->OAMixer(OutAirNum).InletNode == state.dataMixedAir->OAMixer(OutAirNum).RelNode) { + ShowSevereError(state, + format("{} = {} {} = {} duplicates the {}.", + CurrentModuleObject, + state.dataMixedAir->OAMixer(OutAirNum).Name, + cAlphaFields(4), + state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OutAirNum).RelNode), + cAlphaFields(3))); + ErrorsFound = true; + } else if (state.dataMixedAir->OAMixer(OutAirNum).InletNode == state.dataMixedAir->OAMixer(OutAirNum).RetNode) { + ShowSevereError(state, + format("{} = {} {} = {} duplicates the {}.", + CurrentModuleObject, + state.dataMixedAir->OAMixer(OutAirNum).Name, + cAlphaFields(5), + state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OutAirNum).RetNode), + cAlphaFields(3))); + ErrorsFound = true; + } + + if (state.dataMixedAir->OAMixer(OutAirNum).RelNode == state.dataMixedAir->OAMixer(OutAirNum).RetNode) { + ShowSevereError(state, + format("{} = {} {} = {} duplicates the {}.", + CurrentModuleObject, + state.dataMixedAir->OAMixer(OutAirNum).Name, + cAlphaFields(5), + state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OutAirNum).RetNode), + cAlphaFields(4))); + ErrorsFound = true; + } + BranchNodeConnections::TestCompSet( + state, CurrentModuleObject, state.dataMixedAir->OAMixer(OutAirNum).Name, AlphArray(3), AlphArray(2), "Air Nodes"); + } + } + + if (ErrorsFound) { + ShowFatalError(state, format("{}Errors found in getting {}", RoutineName, CurrentModuleObject)); + } + + state.dataMixedAir->GetOAMixerInputFlag = false; +} + +void ProcessOAControllerInputs(EnergyPlusData &state, + std::string_view const CurrentModuleObject, + int const OutAirNum, + Array1D_string const &AlphArray, + int &NumAlphas, + Array1D const &NumArray, + int &NumNums, + Array1D_bool const &lNumericBlanks, // Unused + Array1D_bool const &lAlphaBlanks, + Array1D_string const &cAlphaFields, + Array1D_string const &cNumericFields, // Unused + bool &ErrorsFound // If errors found in input +) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + // MODIFIED Shirey/Raustad FSEC, June 2003, Jan 2004 + // Mangesh Basarkar, 06/2011: Getting zone OA specifications from Design Specification Object + // Tianzhen Hong, 3/2012: getting zone air distribution effectiveness and secondary recirculation + // from DesignSpecification:ZoneAirDistribution objects + // RE-ENGINEERED MJW: Split out processing controller:outdoorair input to facilitate unit testing, Feb 2015 + + // PURPOSE OF THIS SUBROUTINE + // Input the OAController data and store it in the OAController array. + + // SUBROUTINE PARAMETER DEFINITIONS: + static constexpr std::string_view RoutineName("GetOAControllerInputs: "); // include trailing blank space + + state.dataMixedAir->OAController(OutAirNum).Name = AlphArray(1); + state.dataMixedAir->OAController(OutAirNum).ControllerType = MixedAirControllerType::ControllerOutsideAir; + state.dataMixedAir->OAController(OutAirNum).MaxOA = NumArray(2); + state.dataMixedAir->OAController(OutAirNum).MinOA = NumArray(1); + state.dataMixedAir->OAController(OutAirNum).MixNode = + NodeInputManager::GetOnlySingleNode(state, + AlphArray(4), + ErrorsFound, + DataLoopNode::ConnectionObjectType::ControllerOutdoorAir, + AlphArray(1), + DataLoopNode::NodeFluidType::Air, + DataLoopNode::ConnectionType::Sensor, + NodeInputManager::CompFluidStream::Primary, + ObjectIsNotParent); + state.dataMixedAir->OAController(OutAirNum).OANode = NodeInputManager::GetOnlySingleNode(state, + AlphArray(5), + ErrorsFound, + DataLoopNode::ConnectionObjectType::ControllerOutdoorAir, + AlphArray(1), + DataLoopNode::NodeFluidType::Air, + DataLoopNode::ConnectionType::Actuator, + NodeInputManager::CompFluidStream::Primary, + ObjectIsNotParent); + if (!OutAirNodeManager::CheckOutAirNodeNumber(state, state.dataMixedAir->OAController(OutAirNum).OANode)) { + ShowWarningError(state, + format("{}=\"{}\": {}=\"{}\" is not an OutdoorAir:Node.", CurrentModuleObject, AlphArray(1), cAlphaFields(5), AlphArray(5))); + ShowContinueError(state, "Confirm that this is the intended source for the outdoor air stream."); + } + if (UtilityRoutines::SameString(AlphArray(6), "NoEconomizer")) { + state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::NoEconomizer; + } else if (UtilityRoutines::SameString(AlphArray(6), "FixedDryBulb")) { + state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::FixedDryBulb; + } else if (UtilityRoutines::SameString(AlphArray(6), "FixedEnthalpy")) { + state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::FixedEnthalpy; + } else if (UtilityRoutines::SameString(AlphArray(6), "FixedDewPointAndDryBulb")) { + state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::FixedDewPointAndDryBulb; + } else if (UtilityRoutines::SameString(AlphArray(6), "DifferentialDryBulb")) { + state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::DifferentialDryBulb; + } else if (UtilityRoutines::SameString(AlphArray(6), "DifferentialEnthalpy")) { + state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::DifferentialEnthalpy; + } else if (UtilityRoutines::SameString(AlphArray(6), "DifferentialDryBulbAndEnthalpy")) { + state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::DifferentialDryBulbAndEnthalpy; + } else if (UtilityRoutines::SameString(AlphArray(6), "ElectronicEnthalpy")) { + state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::ElectronicEnthalpy; + } else { + ShowSevereError(state, format("{}=\"{}\" invalid {}=\"{}\" value.", CurrentModuleObject, AlphArray(1), cAlphaFields(6), AlphArray(6))); + ErrorsFound = true; + } + // Bypass choice - Added by Amit for new feature implementation + if (UtilityRoutines::SameString(AlphArray(7), "ModulateFlow")) { + state.dataMixedAir->OAController(OutAirNum).EconBypass = false; + } else if (UtilityRoutines::SameString(AlphArray(7), "MinimumFlowWithBypass")) { + state.dataMixedAir->OAController(OutAirNum).EconBypass = true; + } else { + ShowSevereError(state, format("{}=\"{}\" invalid {}=\"{}\" value.", CurrentModuleObject, AlphArray(1), cAlphaFields(7), AlphArray(7))); + ErrorsFound = true; + } + + if (UtilityRoutines::SameString(AlphArray(9), "NoLockout")) { + state.dataMixedAir->OAController(OutAirNum).Lockout = LockoutType::NoLockoutPossible; + } else if (UtilityRoutines::SameString(AlphArray(9), "LockoutWithHeating")) { + state.dataMixedAir->OAController(OutAirNum).Lockout = LockoutType::LockoutWithHeatingPossible; + } else if (UtilityRoutines::SameString(AlphArray(9), "LockoutWithCompressor")) { + state.dataMixedAir->OAController(OutAirNum).Lockout = LockoutType::LockoutWithCompressorPossible; + } else { + ShowSevereError(state, format("{}=\"{}\" invalid {}=\"{}\" value.", CurrentModuleObject, AlphArray(1), cAlphaFields(9), AlphArray(9))); + ErrorsFound = true; + } + if (UtilityRoutines::SameString(AlphArray(10), "FixedMinimum")) { + state.dataMixedAir->OAController(OutAirNum).FixedMin = true; + } else { + state.dataMixedAir->OAController(OutAirNum).FixedMin = false; + } + if (lNumericBlanks(3)) { + state.dataMixedAir->OAController(OutAirNum).TempLim = BlankNumeric; + } else { + state.dataMixedAir->OAController(OutAirNum).TempLim = NumArray(3); + } + + if (lNumericBlanks(4)) { + state.dataMixedAir->OAController(OutAirNum).EnthLim = BlankNumeric; + } else { + state.dataMixedAir->OAController(OutAirNum).EnthLim = NumArray(4); + } + if (lNumericBlanks(5)) { + state.dataMixedAir->OAController(OutAirNum).DPTempLim = BlankNumeric; + } else { + state.dataMixedAir->OAController(OutAirNum).DPTempLim = NumArray(5); + } + + if (lNumericBlanks(6)) { + state.dataMixedAir->OAController(OutAirNum).TempLowLim = BlankNumeric; + } else { + state.dataMixedAir->OAController(OutAirNum).TempLowLim = NumArray(6); + } + + if (!lAlphaBlanks(8)) { + state.dataMixedAir->OAController(OutAirNum).EnthalpyCurvePtr = Curve::GetCurveIndex(state, AlphArray(8)); // convert curve name to number + if (state.dataMixedAir->OAController(OutAirNum).EnthalpyCurvePtr == 0) { + ShowSevereError(state, + format("{}=\"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, AlphArray(1), cAlphaFields(8), AlphArray(8))); + ErrorsFound = true; + } else { + // Verify Curve Object, only legal types are Quadratic and Cubic + ErrorsFound |= Curve::CheckCurveDims(state, + state.dataMixedAir->OAController(OutAirNum).EnthalpyCurvePtr, // Curve index + {1}, // Valid dimensions + RoutineName, // Routine name + CurrentModuleObject, // Object Type + state.dataMixedAir->OAController(OutAirNum).Name, // Object Name + cAlphaFields(8)); // Field Name + } + } + + state.dataMixedAir->OAController(OutAirNum).RelNode = + NodeInputManager::GetOnlySingleNode(state, + AlphArray(2), + ErrorsFound, + DataLoopNode::ConnectionObjectType::ControllerOutdoorAir, + AlphArray(1), + DataLoopNode::NodeFluidType::Air, + DataLoopNode::ConnectionType::Actuator, + NodeInputManager::CompFluidStream::Primary, + ObjectIsNotParent); + state.dataMixedAir->OAController(OutAirNum).RetNode = + NodeInputManager::GetOnlySingleNode(state, + AlphArray(3), + ErrorsFound, + DataLoopNode::ConnectionObjectType::ControllerOutdoorAir, + AlphArray(1), + DataLoopNode::NodeFluidType::Air, + DataLoopNode::ConnectionType::Sensor, + NodeInputManager::CompFluidStream::Primary, + ObjectIsNotParent); + state.dataMixedAir->OAController(OutAirNum).MinOASch = AlphArray(11); + state.dataMixedAir->OAController(OutAirNum).MinOASchPtr = GetScheduleIndex(state, AlphArray(11)); + if (state.dataMixedAir->OAController(OutAirNum).MinOASchPtr == 0 && (!lAlphaBlanks(11))) { + ShowSevereError(state, format("{}=\"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, AlphArray(1), cAlphaFields(11), AlphArray(11))); + ErrorsFound = true; + } + + // Changed by Amit for new feature implementation + state.dataMixedAir->OAController(OutAirNum).MinOAflowSch = AlphArray(12); + state.dataMixedAir->OAController(OutAirNum).MinOAflowSchPtr = GetScheduleIndex(state, AlphArray(12)); + if (state.dataMixedAir->OAController(OutAirNum).MinOAflowSchPtr == 0 && (!lAlphaBlanks(12))) { + ShowSevereError(state, format("{}=\"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, AlphArray(1), cAlphaFields(12), AlphArray(12))); + ErrorsFound = true; + } + + state.dataMixedAir->OAController(OutAirNum).MaxOAflowSch = AlphArray(13); + state.dataMixedAir->OAController(OutAirNum).MaxOAflowSchPtr = GetScheduleIndex(state, AlphArray(13)); + if (state.dataMixedAir->OAController(OutAirNum).MaxOAflowSchPtr == 0 && (!lAlphaBlanks(13))) { + ShowSevereError(state, format("{}=\"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, AlphArray(1), cAlphaFields(13), AlphArray(13))); + ErrorsFound = true; + } + state.dataMixedAir->OAController(OutAirNum).VentilationMechanicalName = AlphArray(14); + + // Check for a time of day economizer control schedule + state.dataMixedAir->OAController(OutAirNum).EconomizerOASchedPtr = GetScheduleIndex(state, AlphArray(15)); + + // High humidity control option can be used with any economizer flag + if (UtilityRoutines::SameString(AlphArray(16), "Yes")) { + + state.dataMixedAir->OAController(OutAirNum).HumidistatZoneNum = UtilityRoutines::FindItemInList(AlphArray(17), state.dataHeatBal->Zone); + + // Get the node number for the zone with the humidistat + if (state.dataMixedAir->OAController(OutAirNum).HumidistatZoneNum > 0) { + bool AirNodeFound = false; + bool AirLoopFound = false; + bool OASysFound = false; + for (int ControlledZoneNum = 1; ControlledZoneNum <= state.dataGlobal->NumOfZones; ++ControlledZoneNum) { + if (ControlledZoneNum != state.dataMixedAir->OAController(OutAirNum).HumidistatZoneNum) continue; + // Find the controlled zone number for the specified humidistat location + state.dataMixedAir->OAController(OutAirNum).NodeNumofHumidistatZone = + state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode; + // Determine which OA System uses this OA Controller + int OASysIndex = 0; + for (int OASysNum = 1; OASysNum <= state.dataAirLoop->NumOASystems; ++OASysNum) { + for (int OAControllerNum = 1; OAControllerNum <= state.dataAirLoop->OutsideAirSys(OASysNum).NumControllers; ++OAControllerNum) { + if (!UtilityRoutines::SameString(state.dataAirLoop->OutsideAirSys(OASysNum).ControllerType(OAControllerNum), + CurrentModuleObject) || + !UtilityRoutines::SameString(state.dataAirLoop->OutsideAirSys(OASysNum).ControllerName(OAControllerNum), + state.dataMixedAir->OAController(OutAirNum).Name)) + continue; + OASysIndex = OASysNum; + OASysFound = true; + break; + } + if (OASysFound) break; + } + // Determine if controller is on air loop served by the humidistat location specified + for (int zoneInNode = 1; zoneInNode <= state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).NumInletNodes; ++zoneInNode) { + int AirLoopNumber = state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).InletNodeAirLoopNum(zoneInNode); + if (AirLoopNumber > 0 && OASysIndex > 0) { + for (int BranchNum = 1; BranchNum <= state.dataAirSystemsData->PrimaryAirSystems(AirLoopNumber).NumBranches; ++BranchNum) { + for (int CompNum = 1; + CompNum <= state.dataAirSystemsData->PrimaryAirSystems(AirLoopNumber).Branch(BranchNum).TotalComponents; + ++CompNum) { + if (!UtilityRoutines::SameString( + state.dataAirSystemsData->PrimaryAirSystems(AirLoopNumber).Branch(BranchNum).Comp(CompNum).Name, + state.dataAirLoop->OutsideAirSys(OASysIndex).Name) || + !UtilityRoutines::SameString( + state.dataAirSystemsData->PrimaryAirSystems(AirLoopNumber).Branch(BranchNum).Comp(CompNum).TypeOf, + "AirLoopHVAC:OutdoorAirSystem")) + continue; + AirLoopFound = true; + break; + } + if (AirLoopFound) break; + } + for (int HStatZoneNum = 1; HStatZoneNum <= state.dataZoneCtrls->NumHumidityControlZones; ++HStatZoneNum) { + if (state.dataZoneCtrls->HumidityControlZone(HStatZoneNum).ActualZoneNum != + state.dataMixedAir->OAController(OutAirNum).HumidistatZoneNum) + continue; + AirNodeFound = true; + break; + } + } else { + if (OASysIndex == 0) { + ShowSevereError( + state, + format("Did not find an AirLoopHVAC:OutdoorAirSystem for {} = \"{}\"", + MixedAirControllerTypeNames[static_cast(state.dataMixedAir->OAController(OutAirNum).ControllerType)], + state.dataMixedAir->OAController(OutAirNum).Name)); + ErrorsFound = true; + } + } + } + } + if (!AirNodeFound) { + ShowSevereError(state, + format("Did not find Air Node (Zone with Humidistat), {} = \"{}\"", + MixedAirControllerTypeNames[static_cast(state.dataMixedAir->OAController(OutAirNum).ControllerType)], + state.dataMixedAir->OAController(OutAirNum).Name)); + ShowContinueError(state, format("Specified {} = {}", cAlphaFields(17), AlphArray(17))); + ShowContinueError(state, + "Both a ZoneHVAC:EquipmentConnections object and a ZoneControl:Humidistat object must be specified for this zone."); + ErrorsFound = true; + } + if (!AirLoopFound) { + ShowSevereError(state, + format("Did not find correct Primary Air Loop for {} = \"{}\"", + MixedAirControllerTypeNames[static_cast(state.dataMixedAir->OAController(OutAirNum).ControllerType)], + state.dataMixedAir->OAController(OutAirNum).Name)); + ShowContinueError(state, format("{} = {} is not served by this Primary Air Loop equipment.", cAlphaFields(17), AlphArray(17))); + ErrorsFound = true; + } + } else { + ShowSevereError(state, + format("Did not find Air Node (Zone with Humidistat), {} = \"{}\"", + MixedAirControllerTypeNames[static_cast(state.dataMixedAir->OAController(OutAirNum).ControllerType)], + state.dataMixedAir->OAController(OutAirNum).Name)); + ShowContinueError(state, format("Specified {} = {}", cAlphaFields(17), AlphArray(17))); + ShowContinueError(state, + "Both a ZoneHVAC:EquipmentConnections object and a ZoneControl:Humidistat object must be specified for this zone."); + ErrorsFound = true; + } + + state.dataMixedAir->OAController(OutAirNum).HighRHOAFlowRatio = NumArray(7); + if (state.dataMixedAir->OAController(OutAirNum).HighRHOAFlowRatio <= 0.0 && NumNums > 6) { + ShowWarningError(state, format("{} \"{}\"", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); + ShowContinueError(state, format(" {} must be greater than 0.", cNumericFields(7))); + ShowContinueError(state, format(" {} is reset to 1 and the simulation continues.", cNumericFields(7))); + state.dataMixedAir->OAController(OutAirNum).HighRHOAFlowRatio = 1.0; + } + + if (UtilityRoutines::SameString(AlphArray(16), "Yes") && state.dataMixedAir->OAController(OutAirNum).FixedMin) { + if (state.dataMixedAir->OAController(OutAirNum).MaxOA > 0.0 && state.dataMixedAir->OAController(OutAirNum).MinOA != AutoSize) { + Real64 OAFlowRatio = state.dataMixedAir->OAController(OutAirNum).MinOA / state.dataMixedAir->OAController(OutAirNum).MaxOA; + if (state.dataMixedAir->OAController(OutAirNum).HighRHOAFlowRatio < OAFlowRatio) { + ShowWarningError(state, format("{} \"{}\"", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); + ShowContinueError(state, "... A fixed minimum outside air flow rate and high humidity control have been specified."); + ShowContinueError( + state, + format("... The {} is less than the ratio of the outside air controllers minimum to maximum outside air flow rate.", + cNumericFields(7))); + ShowContinueError( + state, format("... Controller {} = {:.4T} m3/s.", cNumericFields(1), state.dataMixedAir->OAController(OutAirNum).MinOA)); + ShowContinueError( + state, format("... Controller {} = {:.4T} m3/s.", cNumericFields(2), state.dataMixedAir->OAController(OutAirNum).MaxOA)); + ShowContinueError(state, format("... Controller minimum to maximum flow ratio = {:.4T}.", OAFlowRatio)); + ShowContinueError(state, + format("... {} = {:.4T}.", cNumericFields(7), state.dataMixedAir->OAController(OutAirNum).HighRHOAFlowRatio)); + } + } + } + + if (NumAlphas >= 18) { + if (UtilityRoutines::SameString(AlphArray(18), "Yes")) { + state.dataMixedAir->OAController(OutAirNum).ModifyDuringHighOAMoisture = false; + } else if (UtilityRoutines::SameString(AlphArray(18), "No")) { + state.dataMixedAir->OAController(OutAirNum).ModifyDuringHighOAMoisture = true; + } else { + ShowSevereError(state, + format("{} \"{}\", invalid field value", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); + ShowContinueError(state, format("...{}=\"{}\" - valid values are \"Yes\" or \"No\".", cAlphaFields(18), AlphArray(18))); + ErrorsFound = true; + } + } else { + if (state.dataMixedAir->OAController(OutAirNum).Econo == EconoOp::NoEconomizer) { + state.dataMixedAir->OAController(OutAirNum).ModifyDuringHighOAMoisture = true; + } else { + state.dataMixedAir->OAController(OutAirNum).ModifyDuringHighOAMoisture = false; + ShowWarningError(state, + format("{} \"{}\", missing field value", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); + ShowContinueError(state, format("...{} will default to Yes when {}= \"Yes\"", cAlphaFields(18), cAlphaFields(16))); + } + } + + } else if (UtilityRoutines::SameString(AlphArray(16), "No") || lAlphaBlanks(16)) { + if (NumAlphas >= 18) { + if (!UtilityRoutines::SameString(AlphArray(18), "Yes") && !UtilityRoutines::SameString(AlphArray(18), "No")) { + ShowSevereError(state, + format("{} \"{}\", invalid field value", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); + ShowContinueError(state, format("...{}=\"{}\" - valid values are \"Yes\" or \"No\".", cAlphaFields(18), AlphArray(18))); + ErrorsFound = true; + } + } + } else { // Invalid field 16 + ShowSevereError(state, format("{} \"{}\", invalid field value", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); + ShowContinueError(state, format("...{}=\"{}\" - valid values are \"Yes\" or \"No\".", cAlphaFields(16), AlphArray(16))); + ErrorsFound = true; + if (NumAlphas >= 18) { + if (!UtilityRoutines::SameString(AlphArray(18), "Yes") && !UtilityRoutines::SameString(AlphArray(18), "No")) { + ShowSevereError(state, + format("{} \"{}\", invalid field value", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); + ShowContinueError(state, format("...{}=\"{}\" - valid values are \"Yes\" or \"No\".", cAlphaFields(18), AlphArray(18))); + ErrorsFound = true; + } + } + } + + if (NumAlphas > 18) { + if (!lAlphaBlanks(19)) { + if (UtilityRoutines::SameString(AlphArray(19), "BypassWhenWithinEconomizerLimits")) { + state.dataMixedAir->OAController(OutAirNum).HeatRecoveryBypassControlType = BypassWhenWithinEconomizerLimits; + } else if (UtilityRoutines::SameString(AlphArray(19), "BypassWhenOAFlowGreaterThanMinimum")) { + state.dataMixedAir->OAController(OutAirNum).HeatRecoveryBypassControlType = BypassWhenOAFlowGreaterThanMinimum; + } else { + ShowWarningError(state, format("{}=\"{}\" invalid {}=\"{}\".", CurrentModuleObject, AlphArray(1), cAlphaFields(19), AlphArray(19))); + ShowContinueError(state, "...assuming \"BypassWhenWithinEconomizerLimits\" and the simulation continues."); + state.dataMixedAir->OAController(OutAirNum).HeatRecoveryBypassControlType = BypassWhenWithinEconomizerLimits; + } + } + } + + if (UtilityRoutines::SameString(AlphArray(16), "Yes") && state.dataMixedAir->OAController(OutAirNum).Econo == EconoOp::NoEconomizer) { + ShowWarningError(state, + format("{} \"{}\"", + MixedAirControllerTypeNames[static_cast(state.dataMixedAir->OAController(OutAirNum).ControllerType)], + state.dataMixedAir->OAController(OutAirNum).Name)); + ShowContinueError(state, format("...Economizer operation must be enabled when {} is set to YES.", cAlphaFields(16))); + ShowContinueError(state, "...The high humidity control option will be disabled and the simulation continues."); + } + + state.dataMixedAir->OAController(OutAirNum).MixedAirSPMNum = + SetPointManager::GetMixedAirNumWithCoilFreezingCheck(state, state.dataMixedAir->OAController(OutAirNum).MixNode); +} + +// End of Get Input subroutines for the Module +//****************************************************************************** + +// Beginning Initialization Section of the Module +//****************************************************************************** + +void InitOutsideAirSys(EnergyPlusData &state, int const(OASysNum), int const AirLoopNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + + // PURPOSE OF THIS SUBROUTINE + // Initialize the OutsideAirSys data structure + + if (state.dataAirLoop->OutsideAirSys(OASysNum).AirLoopDOASNum > -1) return; + + if (state.dataMixedAir->initOASysFlag(OASysNum)) { + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysNum = OASysNum; + state.dataMixedAir->initOASysFlag(OASysNum) = false; + } +} + +void InitOAController(EnergyPlusData &state, int const OAControllerNum, bool const FirstHVACIteration, int const AirLoopNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + // MODIFIED Shirey/Raustad FSEC, June/Aug 2003, Feb 2004 + // Tianzhen Hong, Feb 2009 for DCV + // Tianzhen Hong, Aug 2013 for economizer faults + + // PURPOSE OF THIS SUBROUTINE + // Initialize the OAController data structure with input node data + + std::string airloopName; // Temporary equipment name + bool ErrorsFound = false; + + auto &thisOAController(state.dataMixedAir->OAController(OAControllerNum)); + + if (state.dataMixedAir->InitOAControllerOneTimeFlag) { + state.dataMixedAir->OAControllerMyOneTimeFlag.dimension(state.dataMixedAir->NumOAControllers, true); + state.dataMixedAir->OAControllerMyEnvrnFlag.dimension(state.dataMixedAir->NumOAControllers, true); + state.dataMixedAir->OAControllerMySizeFlag.dimension(state.dataMixedAir->NumOAControllers, true); + state.dataMixedAir->MechVentCheckFlag.dimension(state.dataMixedAir->NumOAControllers, true); + state.dataMixedAir->InitOAControllerSetPointCheckFlag.dimension(state.dataMixedAir->NumOAControllers, true); + state.dataMixedAir->InitOAControllerOneTimeFlag = false; + } + if (state.dataMixedAir->OAControllerMyOneTimeFlag(OAControllerNum)) { + // Determine Inlet node index for OAController, not a user input for controller, but is obtained from OutsideAirSys and OAMixer + switch (thisOAController.ControllerType) { + case MixedAirControllerType::ControllerOutsideAir: { + int thisOASys = 0; + for (int OASysNum = 1; OASysNum <= state.dataAirLoop->NumOASystems; ++OASysNum) { + // find which OAsys has this controller + int found = UtilityRoutines::FindItemInList(thisOAController.Name, + state.dataAirLoop->OutsideAirSys(OASysNum).ControllerName, + isize(state.dataAirLoop->OutsideAirSys(OASysNum).ControllerName)); + if (found != 0) { + thisOASys = OASysNum; + state.dataAirLoop->OutsideAirSys(thisOASys).OAControllerIndex = GetOAController(state, thisOAController.Name); + break; // we found it + } + } + if (thisOASys == 0) { + ShowSevereError(state, format("InitOAController: Did not find OAController=\"{}\".", thisOAController.Name)); + ShowContinueError(state, "in list of valid OA Controllers."); + ErrorsFound = true; + } + int thisNumForMixer = UtilityRoutines::FindItem(CurrentModuleObjects[static_cast(CMO::OAMixer)], + state.dataAirLoop->OutsideAirSys(thisOASys).ComponentType, + isize(state.dataAirLoop->OutsideAirSys(thisOASys).ComponentType)); + if (thisNumForMixer != 0) { + std::string_view const equipName = state.dataAirLoop->OutsideAirSys(thisOASys).ComponentName(thisNumForMixer); + int thisMixerIndex = UtilityRoutines::FindItemInList(equipName, state.dataMixedAir->OAMixer); + if (thisMixerIndex != 0) { + thisOAController.InletNode = state.dataMixedAir->OAMixer(thisMixerIndex).InletNode; + } else { + ShowSevereError(state, format("InitOAController: Did not find OAMixer=\"{}\".", equipName)); + ShowContinueError(state, "in list of valid OA Mixers."); + ErrorsFound = true; + } + } else { + ShowSevereError(state, "InitOAController: Did not find OutdoorAir:Mixer Component=\"OutdoorAir:Mixer\"."); + ShowContinueError(state, "in list of valid OA Components."); + ErrorsFound = true; + } + + if (thisOAController.InletNode == 0) { // throw an error + ShowSevereError( + state, + format("InitOAController: Failed to find proper inlet node for OutdoorAir:Mixer and Controller = {}", thisOAController.Name)); + ErrorsFound = true; + } + } break; + case MixedAirControllerType::ControllerStandAloneERV: { + // set the inlet node to also equal the OA node because this is a special controller for economizing stand alone ERV + // with the assumption that equipment is bypassed.... + thisOAController.InletNode = thisOAController.OANode; + } break; + default: { + ShowSevereError(state, + format("InitOAController: Failed to find ControllerType: {}", + MixedAirControllerTypeNames[static_cast(thisOAController.ControllerType)])); + ErrorsFound = true; + } break; + } + + state.dataMixedAir->OAControllerMyOneTimeFlag(OAControllerNum) = false; + } + + if (!state.dataGlobal->SysSizingCalc && state.dataMixedAir->InitOAControllerSetPointCheckFlag(OAControllerNum) && + state.dataHVACGlobal->DoSetPointTest && !FirstHVACIteration) { + int MixedAirNode = thisOAController.MixNode; + if (MixedAirNode > 0) { + // IF (OAController(OAControllerNum)%Econo == 1 .AND. .NOT. AirLoopControlInfo(AirLoopNum)%CyclingFan) THEN + if (thisOAController.Econo > EconoOp::NoEconomizer && state.dataAirLoop->AirLoopControlInfo(AirLoopNum).AnyContFan) { + if (state.dataLoopNodes->Node(MixedAirNode).TempSetPoint == SensedNodeFlagValue) { + if (!state.dataGlobal->AnyEnergyManagementSystemInModel) { + ShowSevereError(state, format("MixedAir: Missing temperature setpoint for economizer controller {}", thisOAController.Name)); + ShowSevereError(state, format("Node Referenced (by Controller)={}", state.dataLoopNodes->NodeID(MixedAirNode))); + ShowContinueError( + state, " use a Setpoint Manager with Control Variable = \"Temperature\" to establish a setpoint at the mixed air node."); + state.dataHVACGlobal->SetPointErrorFlag = true; + } else { + // add call to check node in EMS + CheckIfNodeSetPointManagedByEMS( + state, MixedAirNode, EMSManager::SPControlType::TemperatureSetPoint, state.dataHVACGlobal->SetPointErrorFlag); + if (state.dataHVACGlobal->SetPointErrorFlag) { + ShowSevereError(state, + format("MixedAir: Missing temperature setpoint for economizer controller {}", thisOAController.Name)); + ShowSevereError(state, format("Node Referenced (by Controller)={}", state.dataLoopNodes->NodeID(MixedAirNode))); + ShowContinueError(state, + " use a Setpoint Manager with Control Variable = \"Temperature\" to establish a setpoint at the " + "mixed air node."); + ShowContinueError(state, "Or add EMS Actuator to provide temperature setpoint at this node"); + } + } + } + } + } + + state.dataMixedAir->InitOAControllerSetPointCheckFlag(OAControllerNum) = false; + } + + if (!state.dataGlobal->SysSizingCalc && state.dataMixedAir->OAControllerMySizeFlag(OAControllerNum)) { + thisOAController.SizeOAController(state); + if (AirLoopNum > 0) { + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OACtrlNum = OAControllerNum; + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OACtrlName = thisOAController.Name; + if (thisOAController.Lockout == LockoutType::LockoutWithHeatingPossible) { + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanLockoutEconoWithHeating = true; + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanLockoutEconoWithCompressor = false; + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanNotLockoutEcono = false; + } else if (thisOAController.Lockout == LockoutType::LockoutWithCompressorPossible) { + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanLockoutEconoWithHeating = false; + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanLockoutEconoWithCompressor = true; + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanNotLockoutEcono = false; + } else { + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanLockoutEconoWithHeating = false; + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanLockoutEconoWithCompressor = false; + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanNotLockoutEcono = true; + } + } + if ((thisOAController.MaxOA - thisOAController.MinOA) < -SmallAirVolFlow) { + ShowSevereError(state, format("For Controller:OutdoorAir: {}", thisOAController.Name)); + ShowContinueError(state, + format(" maximum outdoor air flow rate ({:.4R}) < minimum outdoor air flow rate ({:.4R})", + thisOAController.MaxOA, + thisOAController.MinOA)); + ShowContinueError(state, + " To set the minimum outside air flow rate use the \"Design (minimum) outdoor air flow rate\" field in the " + "Sizing:System object"); + ErrorsFound = true; + } + + if (AirLoopNum > 0) { + Real64 DesSupplyVolFlowRate = state.dataAirLoop->AirLoopFlow(AirLoopNum).DesSupply / state.dataEnvrn->StdRhoAir; + if ((thisOAController.MinOA - DesSupplyVolFlowRate) > 0.0001) { + ShowWarningError(state, + format("InitOAController: Minimum Outdoor Air Flow Rate for Controller:OutdoorAir={} is greater than Design Supply " + "Air Flow Rate for AirLoopHVAC={}.", + thisOAController.Name, + state.dataAirSystemsData->PrimaryAirSystems(AirLoopNum).Name)); + ShowContinueError(state, + format("...Minimum Outdoor Air Flow Rate={:.6R} will be reset to loop Design Supply Air Flow Rate={:.6R}", + thisOAController.MinOA, + DesSupplyVolFlowRate)); + thisOAController.MinOA = DesSupplyVolFlowRate; + } else if ((thisOAController.MinOA - DesSupplyVolFlowRate) > 0.0) { + // If difference is tiny, reset silently + thisOAController.MinOA = DesSupplyVolFlowRate; + } + if ((thisOAController.MaxOA - DesSupplyVolFlowRate) > 0.0001) { + ShowWarningError(state, + format("InitOAController: Maximum Outdoor Air Flow Rate for Controller:OutdoorAir={} is greater than Design Supply " + "Air Flow Rate for AirLoopHVAC={}.", + thisOAController.Name, + state.dataAirSystemsData->PrimaryAirSystems(AirLoopNum).Name)); + ShowContinueError(state, + format("...Maximum Outdoor Air Flow Rate={:.6R} will be reset to loop Design Supply Air Flow Rate={:.6R}", + thisOAController.MaxOA, + DesSupplyVolFlowRate)); + thisOAController.MaxOA = DesSupplyVolFlowRate; + } else if ((thisOAController.MaxOA - DesSupplyVolFlowRate) > 0.0) { + // If difference is tiny, reset silently + thisOAController.MaxOA = DesSupplyVolFlowRate; + } + + // Check if system has a Sizing:System object and a sizing run has been done + bool SizingDesRunThisAirSys = false; + CheckThisAirSystemForSizing(state, AirLoopNum, SizingDesRunThisAirSys); + + // Get design outdoor air flow rate + if (SizingDesRunThisAirSys && thisOAController.VentMechObjectNum > 0) { + state.dataMixedAir->VentilationMechanical(thisOAController.VentMechObjectNum).SysDesOA = + state.dataSize->FinalSysSizing(AirLoopNum).DesOutAirVolFlow; + } + } + + state.dataMixedAir->OAControllerMySizeFlag(OAControllerNum) = false; + } + + if (state.dataGlobal->BeginEnvrnFlag && state.dataMixedAir->OAControllerMyEnvrnFlag(OAControllerNum)) { + Real64 RhoAirStdInit = state.dataEnvrn->StdRhoAir; + thisOAController.MinOAMassFlowRate = thisOAController.MinOA * RhoAirStdInit; + thisOAController.MaxOAMassFlowRate = thisOAController.MaxOA * RhoAirStdInit; + state.dataMixedAir->OAControllerMyEnvrnFlag(OAControllerNum) = false; + state.dataLoopNodes->Node(thisOAController.OANode).MassFlowRateMax = thisOAController.MaxOAMassFlowRate; + + // predefined reporting + if (thisOAController.Econo > EconoOp::NoEconomizer) { + std::string_view const equipName = thisOAController.Name; + // 90.1 descriptor for economizer controls. Changed by Amit for New Feature implementation + if (thisOAController.Econo == EconoOp::DifferentialEnthalpy) { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoKind, equipName, "DifferentialEnthalpy"); + } else if (thisOAController.Econo == EconoOp::DifferentialDryBulb) { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoKind, equipName, "DifferentialDryBulb"); + } else if (thisOAController.Econo == EconoOp::FixedEnthalpy) { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoKind, equipName, "FixedEnthalpy"); + } else if (thisOAController.Econo == EconoOp::FixedDryBulb) { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoKind, equipName, "FixedDryBulb"); + } else { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoKind, equipName, "Other"); + } + + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoMinOA, equipName, thisOAController.MinOA); + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoMaxOA, equipName, thisOAController.MaxOA); + // EnergyPlus input echos for economizer controls. Changed by Amit for new feature implementation + if (thisOAController.Econo == EconoOp::DifferentialDryBulb) { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, "Yes"); + } else { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, "No"); + } + if (thisOAController.Econo == EconoOp::DifferentialEnthalpy) { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, "Yes"); + } else { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, "No"); + } + if (thisOAController.Econo == EconoOp::FixedDryBulb) { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, thisOAController.TempLim); + } else { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, "-"); + } + if (thisOAController.Econo == EconoOp::FixedEnthalpy) { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, thisOAController.EnthLim); + } else { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, "-"); + } + } + } + + if (!state.dataGlobal->BeginEnvrnFlag) { + state.dataMixedAir->OAControllerMyEnvrnFlag(OAControllerNum) = true; + } + + if (state.dataMixedAir->MechVentCheckFlag(OAControllerNum)) { + // Make these checks only once at the beginning of the simulation + + // Make sure all air loop zones and air loop zones with people objects are covered by mechanical ventilation + // Issue a warning only if the zone is not accounted for in the associated mechanical ventilation object + if (thisOAController.VentMechObjectNum > 0) { + auto &vent_mech(state.dataMixedAir->VentilationMechanical(thisOAController.VentMechObjectNum)); + + // Make sure all zones with mechanical ventilation are on the correct air loop + int TempMechVentArrayCounter = 0; + for (int NumMechVentZone = 1; NumMechVentZone <= vent_mech.NumofVentMechZones; ++NumMechVentZone) { + auto &thisMechVentZone = vent_mech.VentMechZone(NumMechVentZone); + int ZoneNum = thisMechVentZone.zoneNum; + auto const &zone(state.dataHeatBal->Zone(ZoneNum)); + bool FoundZone = false; + + for (int AirLoopZoneInfoZoneNum = 1; AirLoopZoneInfoZoneNum <= state.dataAirLoop->AirLoopZoneInfo(AirLoopNum).NumZones; + ++AirLoopZoneInfoZoneNum) { + int NumZone = state.dataAirLoop->AirLoopZoneInfo(AirLoopNum).ActualZoneNumber(AirLoopZoneInfoZoneNum); + if (ZoneNum == NumZone) { + FoundZone = true; + ++TempMechVentArrayCounter; + if (TempMechVentArrayCounter < NumMechVentZone) { // Copy to lower index + auto &tempMechVentZone = vent_mech.VentMechZone(TempMechVentArrayCounter); + tempMechVentZone.zoneNum = thisMechVentZone.zoneNum; + tempMechVentZone.ZoneOAAreaRate = thisMechVentZone.ZoneOAAreaRate; + tempMechVentZone.ZoneOAPeopleRate = thisMechVentZone.ZoneOAPeopleRate; + tempMechVentZone.ZoneOAFlowRate = thisMechVentZone.ZoneOAFlowRate; + tempMechVentZone.ZoneOAACHRate = thisMechVentZone.ZoneOAACHRate; + tempMechVentZone.ZoneOAFlowMethod = thisMechVentZone.ZoneOAFlowMethod; + tempMechVentZone.ZoneOASchPtr = thisMechVentZone.ZoneOASchPtr; + tempMechVentZone.ZoneDesignSpecOAObjIndex = thisMechVentZone.ZoneDesignSpecOAObjIndex; + tempMechVentZone.ZoneDesignSpecOAObjName = thisMechVentZone.ZoneDesignSpecOAObjName; + + // new DCV + tempMechVentZone.ZoneADEffCooling = thisMechVentZone.ZoneADEffCooling; + tempMechVentZone.ZoneADEffHeating = thisMechVentZone.ZoneADEffHeating; + tempMechVentZone.ZoneADEffSchPtr = thisMechVentZone.ZoneADEffSchPtr; + } + + // Sum outside air per unit floor area for each mechanical ventilation object only once per simulation + vent_mech.TotAreaOAFlow += zone.FloorArea * zone.Multiplier * zone.ListMultiplier * thisMechVentZone.ZoneOAAreaRate; + vent_mech.TotZoneOAFlow += zone.Multiplier * zone.ListMultiplier * thisMechVentZone.ZoneOAFlowRate; + vent_mech.TotZoneOAACH += zone.Multiplier * zone.ListMultiplier * (thisMechVentZone.ZoneOAACHRate * zone.Volume / 3600.0); + break; + } + } + if (!FoundZone) { + ShowWarningError(state, + format("Zone name = {} in {} object name = {} is not on the same air loop as Controller:OutdoorAir = {}", + zone.Name, + CurrentModuleObjects[static_cast(CMO::MechVentilation)], + thisOAController.VentilationMechanicalName, + thisOAController.Name)); + ShowContinueError(state, "This zone will not be used and the simulation will continue..."); + } + } + + // Shrink final arrays to conserve environment space + if (TempMechVentArrayCounter < vent_mech.NumofVentMechZones) { + vent_mech.VentMechZone.resize(TempMechVentArrayCounter); + vent_mech.NumofVentMechZones = TempMechVentArrayCounter; + } + + // predefined report + for (int jZone = 1; jZone <= vent_mech.NumofVentMechZones; ++jZone) { + auto &thisMechVentZone = vent_mech.VentMechZone(jZone); + std::string_view const zoneName = state.dataHeatBal->Zone(thisMechVentZone.zoneNum).Name; + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchDCVventMechName, zoneName, vent_mech.Name); + OutputReportPredefined::PreDefTableEntry( + state, state.dataOutRptPredefined->pdchDCVperPerson, zoneName, thisMechVentZone.ZoneOAPeopleRate, 6); + OutputReportPredefined::PreDefTableEntry( + state, state.dataOutRptPredefined->pdchDCVperArea, zoneName, thisMechVentZone.ZoneOAAreaRate, 6); + OutputReportPredefined::PreDefTableEntry( + state, state.dataOutRptPredefined->pdchDCVperZone, zoneName, thisMechVentZone.ZoneOAFlowRate, 6); + OutputReportPredefined::PreDefTableEntry( + state, state.dataOutRptPredefined->pdchDCVperACH, zoneName, thisMechVentZone.ZoneOAACHRate, 6); + OutputReportPredefined::PreDefTableEntry(state, + state.dataOutRptPredefined->pdchDCVMethod, + zoneName, + OAFlowCalcMethodNames[static_cast(thisMechVentZone.ZoneOAFlowMethod)]); + if (thisMechVentZone.ZoneOASchPtr > 0) { + OutputReportPredefined::PreDefTableEntry( + state, state.dataOutRptPredefined->pdchDCVOASchName, zoneName, GetScheduleName(state, thisMechVentZone.ZoneOASchPtr)); + } else { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchDCVOASchName, zoneName, ""); + } + + // added for new DCV inputs + if (thisMechVentZone.ZoneADEffSchPtr > 0) { + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchDCVZoneADEffCooling, zoneName, ""); + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchDCVZoneADEffHeating, zoneName, ""); + OutputReportPredefined::PreDefTableEntry(state, + state.dataOutRptPredefined->pdchDCVZoneADEffSchName, + zoneName, + GetScheduleName(state, thisMechVentZone.ZoneADEffSchPtr)); + } else { + OutputReportPredefined::PreDefTableEntry( + state, state.dataOutRptPredefined->pdchDCVZoneADEffCooling, zoneName, thisMechVentZone.ZoneADEffCooling, 2); + OutputReportPredefined::PreDefTableEntry( + state, state.dataOutRptPredefined->pdchDCVZoneADEffHeating, zoneName, thisMechVentZone.ZoneADEffHeating, 2); + OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchDCVZoneADEffSchName, zoneName, ""); + } + } + + // Check to see if any zones on an air loop are not accounted for by a mechanical ventilation object + for (int AirLoopZoneInfoZoneNum = 1; AirLoopZoneInfoZoneNum <= state.dataAirLoop->AirLoopZoneInfo(AirLoopNum).NumZones; + ++AirLoopZoneInfoZoneNum) { + int NumZone = state.dataAirLoop->AirLoopZoneInfo(AirLoopNum).ActualZoneNumber(AirLoopZoneInfoZoneNum); + bool FoundAreaZone = false; + bool FoundPeopleZone = false; + for (int NumMechVentZone = 1; NumMechVentZone <= vent_mech.NumofVentMechZones; ++NumMechVentZone) { + auto &thisMechVentZone = vent_mech.VentMechZone(NumMechVentZone); + int ZoneNum = thisMechVentZone.zoneNum; + if (ZoneNum == NumZone) { + FoundAreaZone = true; + if (thisMechVentZone.ZoneOAPeopleRate > 0.0) { + FoundPeopleZone = true; + } + break; + } + } + if (!FoundAreaZone) { + ShowWarningError(state, + format("Zone name = {} is not accounted for by {} object name = {}", + state.dataHeatBal->Zone(NumZone).Name, + CurrentModuleObjects[static_cast(CMO::MechVentilation)], + thisOAController.VentilationMechanicalName)); + ShowContinueError(state, "Ventilation per unit floor area has not been specified for this zone, which is connected to"); + ShowContinueError( + state, format("the air loop served by Controller:OutdoorAir = {}. Simulation will continue...", thisOAController.Name)); + } + if (!FoundPeopleZone) { + // Loop through people objects to see if this zone has a people object and only then show a warning + for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { + if (state.dataHeatBal->People(PeopleNum).ZonePtr == NumZone) { + if (!FoundAreaZone) { + ShowWarningError(state, + format("PEOPLE object for zone = {} is not accounted for by {} object name = {}", + state.dataHeatBal->Zone(NumZone).Name, + CurrentModuleObjects[static_cast(CMO::MechVentilation)], + thisOAController.VentilationMechanicalName)); + ShowContinueError( + state, + format( + "A \"PEOPLE\" object has been specified in the idf for this zone, but it is not included in this {} Object.", + CurrentModuleObjects[static_cast(CMO::MechVentilation)])); + ShowContinueError(state, + format("Check {} object. Simulation will continue.", + CurrentModuleObjects[static_cast(CMO::MechVentilation)])); + } + } + } + } else { // People > 0, check to make sure there is a people statement in the zone + FoundAreaZone = false; + for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { + if (state.dataHeatBal->People(PeopleNum).ZonePtr != NumZone) continue; + FoundAreaZone = true; + break; + } + if (!FoundAreaZone) { + ShowWarningError(state, + format("{} = \"{}\", Zone=\"{}\".", + CurrentModuleObjects[static_cast(CMO::MechVentilation)], + thisOAController.VentilationMechanicalName, + state.dataHeatBal->Zone(NumZone).Name)); + ShowContinueError(state, + "No \"PEOPLE\" object has been specified in the idf for this zone, but the ventilation rate is > 0 in " + "this Controller:MechanicalVentilation Object."); + ShowContinueError(state, "Check ventilation rate in Controller:MechanicalVentilation object. Simulation will continue."); + } + } + } + } + + state.dataMixedAir->MechVentCheckFlag(OAControllerNum) = false; + } + //**** + + // Perform a one time initialization of AirloopHVAC OA System report variables + // If AirloopHVAC objects are used, NumPrimaryAirSys > 0 and the initialization proceeds and then sets + // SetUpAirLoopHVACVariables to .FALSE. so this is never done again and only the first IF is checked + // each time through Init. If for some reason the primary air system have not yet been read in, this + // code waits for the air loop data to be available before performing the report variable initialization. + // If AirloopHVAC objects are not used, NumPrimaryAirSys is always equal to 0 and only these + // two IF statements are checked each time through Init (e.g., if StandAloneERV controllers are used + // without AirloopHVAC objects). + if (state.dataMixedAir->InitOAControllerSetUpAirLoopHVACVariables) { + if (AirLoopNum > 0) { + // Added code to report (TH, 10/20/2008): + // air economizer status (1 = on, 0 = off or does not exist), and actual and minimum outside air fraction (0 to 1) + for (int OAControllerLoop = 1; OAControllerLoop <= state.dataMixedAir->NumOAControllers; ++OAControllerLoop) { + auto &loopOAController(state.dataMixedAir->OAController(OAControllerLoop)); + + // Find the outside air system that has the OA controller + if (loopOAController.ControllerType == MixedAirControllerType::ControllerStandAloneERV) continue; // ERV controller not on airloop + bool OASysFound = false; + int thisOASys = 0; + for (int OASysNum = 1; OASysNum <= state.dataAirLoop->NumOASystems; ++OASysNum) { + for (int OAControllerLoop2 = 1; OAControllerLoop2 <= state.dataAirLoop->OutsideAirSys(OASysNum).NumControllers; + ++OAControllerLoop2) { + if (UtilityRoutines::SameString(state.dataAirLoop->OutsideAirSys(OASysNum).ControllerName(OAControllerLoop2), + loopOAController.Name)) { + thisOASys = OASysNum; + OASysFound = true; + break; + } + } + if (OASysFound) break; + } + + int airLoopNum = 0; + bool AirLoopFound = false; + if (thisOASys <= 0) { + // Check outside air system name + ShowWarningError(state, format("Cannot find the AirLoopHVAC:OutdoorAirSystem for the OA Controller: {}", loopOAController.Name)); + } else { + // Find the primary air loop that has the outside air system + for (int thisAirLoop = 1; thisAirLoop <= state.dataHVACGlobal->NumPrimaryAirSys; ++thisAirLoop) { + for (int BranchNum = 1; BranchNum <= state.dataAirSystemsData->PrimaryAirSystems(thisAirLoop).NumBranches; ++BranchNum) { + for (int CompNum = 1; + CompNum <= state.dataAirSystemsData->PrimaryAirSystems(thisAirLoop).Branch(BranchNum).TotalComponents; + ++CompNum) { + if (!UtilityRoutines::SameString( + state.dataAirSystemsData->PrimaryAirSystems(thisAirLoop).Branch(BranchNum).Comp(CompNum).Name, + state.dataAirLoop->OutsideAirSys(thisOASys).Name) || + !UtilityRoutines::SameString( + state.dataAirSystemsData->PrimaryAirSystems(thisAirLoop).Branch(BranchNum).Comp(CompNum).TypeOf, + "AirLoopHVAC:OutdoorAirSystem")) + continue; + AirLoopFound = true; + airLoopNum = thisAirLoop; + break; + } + if (AirLoopFound) break; + } + if (AirLoopFound) break; + } + } + // Check primary air loop name + if (AirLoopFound && airLoopNum > 0) { + airloopName = state.dataAirSystemsData->PrimaryAirSystems(airLoopNum).Name; // OutsideAirSys(OASysIndex)%Name + } else { + ShowWarningError(state, format("Cannot find the primary air loop for the OA Controller: {}", loopOAController.Name)); + airloopName = "AirLoop not found"; + } + + // Note use of OAControllerLoop here to keep DO Loop index separate from InitOAController local variable + // CurrentModuleObject='AirLoopHVAC' + SetupOutputVariable(state, + "Air System Outdoor Air Economizer Status", + OutputProcessor::Unit::None, + loopOAController.EconomizerStatus, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + + SetupOutputVariable(state, + "Air System Outdoor Air Heat Recovery Bypass Status", + OutputProcessor::Unit::None, + loopOAController.HeatRecoveryBypassStatus, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + + SetupOutputVariable(state, + "Air System Outdoor Air Heat Recovery Bypass Heating Coil Activity Status", + OutputProcessor::Unit::None, + loopOAController.HRHeatingCoilActive, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + SetupOutputVariable(state, + "Air System Outdoor Air Heat Recovery Bypass Minimum Outdoor Air Mixed Air Temperature", + OutputProcessor::Unit::C, + loopOAController.MixedAirTempAtMinOAFlow, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + + SetupOutputVariable(state, + "Air System Outdoor Air High Humidity Control Status", + OutputProcessor::Unit::None, + loopOAController.HighHumCtrlStatus, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + + SetupOutputVariable(state, + "Air System Outdoor Air Limiting Factor", + OutputProcessor::Unit::None, + loopOAController.OALimitingFactorReport, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + + SetupOutputVariable(state, + "Air System Outdoor Air Flow Fraction", + OutputProcessor::Unit::None, + loopOAController.OAFractionRpt, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + + SetupOutputVariable(state, + "Air System Outdoor Air Minimum Flow Fraction", + OutputProcessor::Unit::None, + loopOAController.MinOAFracLimit, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + + SetupOutputVariable(state, + "Air System Outdoor Air Mass Flow Rate", + OutputProcessor::Unit::kg_s, + loopOAController.OAMassFlow, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + + SetupOutputVariable(state, + "Air System Mixed Air Mass Flow Rate", + OutputProcessor::Unit::kg_s, + loopOAController.MixMassFlow, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + + SetupOutputVariable(state, + "Air System Relief Air Heat Transfer Rate", + OutputProcessor::Unit::W, + loopOAController.RelTotalLossRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + + SetupOutputVariable(state, + "Air System Relief Air Sensible Heat Transfer Rate", + OutputProcessor::Unit::W, + loopOAController.RelSensiLossRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + + SetupOutputVariable(state, + "Air System Relief Air Latent Heat Transfer Rate", + OutputProcessor::Unit::W, + loopOAController.RelLatentLossRate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + + if (loopOAController.MixedAirSPMNum > 0) { + SetupOutputVariable(state, + "Air System Outdoor Air Maximum Flow Fraction", + OutputProcessor::Unit::None, + loopOAController.MaxOAFracBySetPoint, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + } + + if (state.dataGlobal->AnyEnergyManagementSystemInModel) { + SetupEMSInternalVariable( + state, "Outdoor Air Controller Maximum Mass Flow Rate", loopOAController.Name, "[kg/s]", loopOAController.MaxOAMassFlowRate); + SetupEMSInternalVariable( + state, "Outdoor Air Controller Minimum Mass Flow Rate", loopOAController.Name, "[kg/s]", loopOAController.MinOAMassFlowRate); + SetupEMSActuator(state, + "Outdoor Air Controller", + loopOAController.Name, + "Air Mass Flow Rate", + "[kg/s]", + loopOAController.EMSOverrideOARate, + loopOAController.EMSOARateValue); + } + + if (loopOAController.VentMechObjectNum > 0 && airLoopNum > 0) { + SetupOutputVariable(state, + "Air System Outdoor Air Mechanical Ventilation Requested Mass Flow Rate", + OutputProcessor::Unit::kg_s, + loopOAController.MechVentOAMassFlowRequest, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + airloopName); + if (!state.dataMixedAir->VentilationMechanical(loopOAController.VentMechObjectNum).DCVFlag) { + state.dataAirLoop->AirLoopControlInfo(airLoopNum).AirLoopDCVFlag = false; + } + } + } + + state.dataMixedAir->InitOAControllerSetUpAirLoopHVACVariables = false; + } + } + + // Each time step + if (FirstHVACIteration) { + // Mixed air setpoint. Set by a setpoint manager. + if (thisOAController.ControllerType == MixedAirControllerType::ControllerOutsideAir) { + if (state.dataLoopNodes->Node(thisOAController.MixNode).TempSetPoint > SensedNodeFlagValue) { + thisOAController.MixSetTemp = state.dataLoopNodes->Node(thisOAController.MixNode).TempSetPoint; + } else { + thisOAController.MixSetTemp = thisOAController.TempLowLim; + } + + Real64 TotalPeopleOAFlow = 0.0; + if (thisOAController.VentMechObjectNum != 0) { + auto &vent_mech(state.dataMixedAir->VentilationMechanical(thisOAController.VentMechObjectNum)); + for (int ZoneIndex = 1; ZoneIndex <= vent_mech.NumofVentMechZones; ++ZoneIndex) { + auto &thisVentMechZone = vent_mech.VentMechZone(ZoneIndex); + int ZoneNum = thisVentMechZone.zoneNum; + + // ZoneIntGain(ZoneNum)%NOFOCC is the number of occupants of a zone at each time step, already counting the occupant schedule + OAFlowCalcMethod OAFlowMethod = thisVentMechZone.ZoneOAFlowMethod; + if (OAFlowMethod == OAFlowCalcMethod::PerPerson || OAFlowMethod == OAFlowCalcMethod::Sum || + OAFlowMethod == OAFlowCalcMethod::Max) { + TotalPeopleOAFlow += state.dataHeatBal->ZoneIntGain(ZoneNum).NOFOCC * state.dataHeatBal->Zone(ZoneNum).Multiplier * + state.dataHeatBal->Zone(ZoneNum).ListMultiplier * thisVentMechZone.ZoneOAPeopleRate * + GetCurrentScheduleValue(state, thisVentMechZone.ZoneOASchPtr); + } + } + vent_mech.TotPeopleOAFlow = TotalPeopleOAFlow; + } + } else { + // Stand Alone ERV does not require a termperature setpoint schedule, make setpoint equal to lower economizer limit + thisOAController.MixSetTemp = thisOAController.TempLowLim; + } + } + + // Each iteration + + if (thisOAController.ControllerType == MixedAirControllerType::ControllerOutsideAir) { + // zone exhaust mass flow is saved in AirLoopFlow%ZoneExhaust + // the zone exhaust mass flow that is said to be balanced by simple air flows is saved in AirLoopFlow%ZoneExhaustBalanced + if (AirLoopNum > 0) { + thisOAController.ExhMassFlow = + max(0.0, state.dataAirLoop->AirLoopFlow(AirLoopNum).SupFlow - state.dataAirLoop->AirLoopFlow(AirLoopNum).SysRetFlow); + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).ZoneExhMassFlow = thisOAController.ExhMassFlow; + if (state.dataAirLoop->AirLoopControlInfo(AirLoopNum).LoopFlowRateSet && !FirstHVACIteration) { + // if flow rate has been specified by a manager, set it to the specified value + thisOAController.MixMassFlow = + state.dataAirLoop->AirLoopFlow(AirLoopNum).ReqSupplyFrac * state.dataAirLoop->AirLoopFlow(AirLoopNum).DesSupply; + } else { + thisOAController.MixMassFlow = state.dataLoopNodes->Node(thisOAController.RetNode).MassFlowRate + thisOAController.ExhMassFlow; + + // The following was commented out after discussion on PR 7382, it can be reopened for discussion anytime + // found this equation results in flow that exceeds the design flow rate when there is exhaust flow rate is greater than + // the design supply air flow rate. Capped the mixed air flow rate at design supply air flow rate, issue #77379 + // thisOAController.MixMassFlow = Node(thisOAController.RetNode).MassFlowRate + thisOAController.ExhMassFlow; + // thisOAController.MixMassFlow = + // min(Node(thisOAController.RetNode).MassFlowRate + thisOAController.ExhMassFlow, AirLoopFlow(AirLoopNum).DesSupply); + } + } else { + thisOAController.ExhMassFlow = 0.0; + thisOAController.MixMassFlow = state.dataLoopNodes->Node(thisOAController.RetNode).MassFlowRate; + } + if (state.dataLoopNodes->Node(thisOAController.MixNode).MassFlowRateMaxAvail <= 0.0) { + thisOAController.MixMassFlow = 0.0; + } + } else { + // Mixed and exhaust flow rates are passed through to model CONTROLLER:STAND ALONE ERV in SimOAController + thisOAController.OAMassFlow = thisOAController.MaxOAMassFlowRate; + thisOAController.MixMassFlow = thisOAController.MaxOAMassFlowRate; + thisOAController.ExhMassFlow = state.dataLoopNodes->Node(thisOAController.RetNode).MassFlowRate; + } + thisOAController.ExhMassFlow = max(thisOAController.ExhMassFlow, 0.0); + + // Outside air values + thisOAController.OATemp = state.dataLoopNodes->Node(thisOAController.OANode).Temp; + thisOAController.OAEnth = state.dataLoopNodes->Node(thisOAController.OANode).Enthalpy; + thisOAController.OAPress = state.dataLoopNodes->Node(thisOAController.OANode).Press; + thisOAController.OAHumRat = state.dataLoopNodes->Node(thisOAController.OANode).HumRat; + + // Inlet air values (on OA input side) + thisOAController.InletTemp = state.dataLoopNodes->Node(thisOAController.InletNode).Temp; + thisOAController.InletEnth = state.dataLoopNodes->Node(thisOAController.InletNode).Enthalpy; + thisOAController.InletPress = state.dataLoopNodes->Node(thisOAController.InletNode).Press; + thisOAController.InletHumRat = state.dataLoopNodes->Node(thisOAController.InletNode).HumRat; + + // Return air values + thisOAController.RetTemp = state.dataLoopNodes->Node(thisOAController.RetNode).Temp; + thisOAController.RetEnth = state.dataLoopNodes->Node(thisOAController.RetNode).Enthalpy; + + // Check sensors faults for the air economizer + EconoOp iEco = thisOAController.Econo; + if (state.dataFaultsMgr->AnyFaultsInModel && (iEco != EconoOp::NoEconomizer)) { + for (int i = 1; i <= thisOAController.NumFaultyEconomizer; ++i) { + int j = thisOAController.EconmizerFaultNum(i); + Real64 rSchVal = 0.0; + if (GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsEconomizer(j).AvaiSchedPtr) > 0.0) { + rSchVal = 1.0; + if (state.dataFaultsMgr->FaultsEconomizer(j).SeveritySchedPtr > 0) { + rSchVal = GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsEconomizer(j).SeveritySchedPtr); + } + } else { + continue; // no fault + } + + Real64 rOffset = rSchVal * state.dataFaultsMgr->FaultsEconomizer(j).Offset; + + if (std::abs(rOffset) < 0.000000001) continue; + + // ECONOMIZER - outdoor air dry-bulb temperature sensor offset + switch (iEco) { + case EconoOp::FixedDryBulb: + case EconoOp::DifferentialDryBulb: + case EconoOp::FixedDewPointAndDryBulb: + case EconoOp::ElectronicEnthalpy: + case EconoOp::DifferentialDryBulbAndEnthalpy: { + if (state.dataFaultsMgr->FaultsEconomizer(j).FaultTypeEnum == Fault::TemperatureSensorOffset_OutdoorAir) { + // FaultModel:TemperatureSensorOffset:OutdoorAir + thisOAController.OATemp += rOffset; + thisOAController.InletTemp += rOffset; + } + } break; + default: + break; + } + + // ECONOMIZER - outdoor air humidity ratio sensor offset. really needed ??? + switch (iEco) { + case EconoOp::FixedDewPointAndDryBulb: + case EconoOp::ElectronicEnthalpy: { + if (state.dataFaultsMgr->FaultsEconomizer(j).FaultTypeEnum == Fault::HumiditySensorOffset_OutdoorAir) { + // FaultModel:HumiditySensorOffset:OutdoorAir + thisOAController.OAHumRat += rOffset; + thisOAController.InletHumRat += rOffset; + } + } break; + default: + break; + } + + // ECONOMIZER - outdoor air enthalpy sensor offset + switch (iEco) { + case EconoOp::FixedEnthalpy: + case EconoOp::ElectronicEnthalpy: + case EconoOp::DifferentialDryBulbAndEnthalpy: { + if (state.dataFaultsMgr->FaultsEconomizer(j).FaultTypeEnum == Fault::EnthalpySensorOffset_OutdoorAir) { + // FaultModel:EnthalpySensorOffset:OutdoorAir + thisOAController.OAEnth += rOffset; + thisOAController.InletEnth += rOffset; + } + } break; + default: + break; + } + + // ECONOMIZER - return air dry-bulb temperature sensor offset + switch (iEco) { + case EconoOp::DifferentialDryBulb: + case EconoOp::DifferentialDryBulbAndEnthalpy: { + if (state.dataFaultsMgr->FaultsEconomizer(j).FaultTypeEnum == Fault::TemperatureSensorOffset_ReturnAir) { + // FaultModel:TemperatureSensorOffset:ReturnAir + thisOAController.RetTemp += rOffset; + } + } break; + default: + break; + } + + // ECONOMIZER - return air enthalpy sensor offset + switch (iEco) { + case EconoOp::ElectronicEnthalpy: + case EconoOp::DifferentialDryBulbAndEnthalpy: { + if (state.dataFaultsMgr->FaultsEconomizer(j).FaultTypeEnum == Fault::EnthalpySensorOffset_ReturnAir) { + // FaultModel:EnthalpySensorOffset:ReturnAir + thisOAController.RetEnth += rOffset; + } + } break; + default: + break; + } + } + } + + if (ErrorsFound) { + ShowFatalError(state, format("Error in {}; program terminated", CurrentModuleObjects[static_cast(CMO::OAController)])); + } +} // namespace MixedAir + +void InitOAMixer(EnergyPlusData &state, int const OAMixerNum) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + + // PURPOSE OF THIS SUBROUTINE + // Initialize the OAMixer data structure with input node data + + int RetNode = state.dataMixedAir->OAMixer(OAMixerNum).RetNode; + int InletNode = state.dataMixedAir->OAMixer(OAMixerNum).InletNode; + int RelNode = state.dataMixedAir->OAMixer(OAMixerNum).RelNode; + + // Return air stream data + state.dataMixedAir->OAMixer(OAMixerNum).RetTemp = state.dataLoopNodes->Node(RetNode).Temp; + state.dataMixedAir->OAMixer(OAMixerNum).RetHumRat = state.dataLoopNodes->Node(RetNode).HumRat; + state.dataMixedAir->OAMixer(OAMixerNum).RetEnthalpy = state.dataLoopNodes->Node(RetNode).Enthalpy; + state.dataMixedAir->OAMixer(OAMixerNum).RetPressure = state.dataLoopNodes->Node(RetNode).Press; + state.dataMixedAir->OAMixer(OAMixerNum).RetMassFlowRate = state.dataLoopNodes->Node(RetNode).MassFlowRate; + // Outside air stream data + state.dataMixedAir->OAMixer(OAMixerNum).OATemp = state.dataLoopNodes->Node(InletNode).Temp; + state.dataMixedAir->OAMixer(OAMixerNum).OAHumRat = state.dataLoopNodes->Node(InletNode).HumRat; + state.dataMixedAir->OAMixer(OAMixerNum).OAEnthalpy = state.dataLoopNodes->Node(InletNode).Enthalpy; + state.dataMixedAir->OAMixer(OAMixerNum).OAPressure = state.dataLoopNodes->Node(InletNode).Press; + state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate = state.dataLoopNodes->Node(InletNode).MassFlowRate; + // Relief air data + state.dataMixedAir->OAMixer(OAMixerNum).RelMassFlowRate = state.dataLoopNodes->Node(RelNode).MassFlowRate; +} + +void OAControllerProps::CalcOAController(EnergyPlusData &state, int const AirLoopNum, bool const FirstHVACIteration) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + // MODIFIED Shirey/Raustad FSEC, June 2003 + // Tianzhen Hong, Feb 2009 for new DCV + // Brent Griffith ,EMS override of OA rate + // Mangesh Basarkar, 06/2011: Modifying outside air calculation based on DCV flag + // Chandan Sharma, FSEC, 25Aug 2011 - Added ProportionalControl + // to enhance CO2 based DCV control + // Tianzhen Hong, March 2012, zone maximum OA fraction - a TRACE feature + // Tianzhen Hong, March 2012, multi-path VRP based on ASHRAE 62.1-2010 + + // PURPOSE OF THIS SUBROUTINE + // Determine the outside air flow + + // REFERENCES: + // DOE-2.1E Supplement pages 3.97 - 3.100 + // BLAST User Reference pages 183 - 186 + // ASHRAE Standard 62.1-2010 + + // SUBROUTINE PARAMETER DEFINITIONS: + static constexpr std::string_view RoutineName("CalcOAController: "); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Real64 OASignal = 0.0; // Outside air flow rate fraction (0.0 to 1.0) + bool AirLoopCyclingFan = false; // Type of air loop fan (TRUE if Fan:OnOff) + bool HighHumidityOperationFlag = false; // TRUE if zone humidistat senses a high humidity condition + + if (AirLoopNum > 0) { + AirLoopCyclingFan = (state.dataAirLoop->AirLoopControlInfo(AirLoopNum).FanOpMode == CycFanCycCoil); + } else { + AirLoopCyclingFan = false; + } + + this->OALimitingFactor = OALimitFactor::None; // oa controller limiting factor + + // Check for no flow + if (this->MixMassFlow <= SmallMassFlow) { + + this->OAMassFlow = 0.0; // outside air mass flow rate + this->RelMassFlow = 0.0; // relief air mass flow rate + this->MixMassFlow = 0.0; // mixed air mass flow rate + this->MinOAFracLimit = 0.0; // minimum OA fraction limit + + this->EconomizerStatus = 0; // economizer status for reporting + this->HeatRecoveryBypassStatus = 0; // HR bypass status for reporting + this->HRHeatingCoilActive = 0; // resets report variable + this->MixedAirTempAtMinOAFlow = state.dataLoopNodes->Node(this->RetNode).Temp; // track return T + this->HighHumCtrlStatus = 0; // high humdity control status for reporting + this->OAFractionRpt = 0.0; // actual OA fraction for reporting + + this->EconoActive = false; // DataAirLoop variable (OA Controllers) + this->HighHumCtrlActive = false; // DataAirLoop variable (OA Controllers) + + // also reset air loop data for use by other routines + if (AirLoopNum > 0) { + auto &curAirLoopControlInfo(state.dataAirLoop->AirLoopControlInfo(AirLoopNum)); + auto &curAirLoopFlow(state.dataAirLoop->AirLoopFlow(AirLoopNum)); + + curAirLoopControlInfo.EconoActive = false; // DataAirLoop variable (AirloopHVAC) + curAirLoopControlInfo.HeatRecoveryBypass = false; // DataAirLoop variable (AirloopHVAC) + curAirLoopControlInfo.HighHumCtrlActive = false; // DataAirLoop variable (AirloopHVAC) + curAirLoopControlInfo.ResimAirLoopFlag = false; // DataAirLoop variable (AirloopHVAC) + curAirLoopFlow.OAFrac = 0.0; // DataAirLoop variable (AirloopHVAC) + curAirLoopFlow.OAMinFrac = 0.0; // DataAirLoop variable (AirloopHVAC) + curAirLoopFlow.MinOutAir = 0.0; + curAirLoopFlow.OAFlow = 0.0; + } + return; + } + + Real64 OutAirMinFrac = 0.0; // Local variable used to calculate min OA fraction + if (AirLoopNum > 0) { + auto &curAirLoopFlow(state.dataAirLoop->AirLoopFlow(AirLoopNum)); + if (curAirLoopFlow.DesSupply >= SmallAirVolFlow) { + OutAirMinFrac = this->MinOAMassFlowRate / curAirLoopFlow.DesSupply; + } + } else { + if (this->MaxOA >= SmallAirVolFlow) { + OutAirMinFrac = this->MinOA / this->MaxOA; + } + } + Real64 MinOASchedVal = 1.0; // value of the minimum outside air schedule + if (this->MinOASchPtr > 0) { + MinOASchedVal = GetCurrentScheduleValue(state, this->MinOASchPtr); + MinOASchedVal = min(max(MinOASchedVal, 0.0), 1.0); + OutAirMinFrac *= MinOASchedVal; + this->OALimitingFactor = OALimitFactor::Limits; + } + + // Get outside air mass flow rate calculated by mechanical ventilation object [kg/s] + Real64 MechVentOutsideAirMinFrac = 0.0; // fraction of OA specified by mechanical ventilation object + if (AirLoopNum > 0 && this->VentMechObjectNum != 0) { + auto &curAirLoopControlInfo(state.dataAirLoop->AirLoopControlInfo(AirLoopNum)); + auto &curAirLoopFlow(state.dataAirLoop->AirLoopFlow(AirLoopNum)); + + // Get system supply air flow rate + Real64 SysSA = 0.0; // System supply air mass flow rate [kg/s] + if (curAirLoopControlInfo.LoopFlowRateSet) { + // if flow rate has been specified by a manager, set it to the specified value + // DesSupply and SupFlow are mass flow rate in kg/s + SysSA = curAirLoopFlow.ReqSupplyFrac * curAirLoopFlow.DesSupply; + } else { + SysSA = curAirLoopFlow.SupFlow; + } + + this->MechVentOAMassFlowRequest = state.dataMixedAir->VentilationMechanical(this->VentMechObjectNum).CalcMechVentController(state, SysSA); + MechVentOutsideAirMinFrac = this->MechVentOAMassFlowRequest / curAirLoopFlow.DesSupply; + if (curAirLoopFlow.FanPLR > 0.0) { + MechVentOutsideAirMinFrac *= curAirLoopFlow.FanPLR; + this->MechVentOAMassFlowRequest *= curAirLoopFlow.FanPLR; + } + } else { + this->MechVentOAMassFlowRequest = 0.0; + } + //****** use greater of Mechanical Ventilation Outside Air fraction and OutAirMinFrac + if ((MechVentOutsideAirMinFrac > 0.0) && (OutAirMinFrac > MechVentOutsideAirMinFrac)) { + if (!state.dataGlobal->WarmupFlag) { + if (this->CountMechVentFrac == 0) { + ++this->CountMechVentFrac; + ShowWarningError( + state, + format("{}Minimum OA fraction > Mechanical Ventilation Controller request for Controller:OutdoorAir={}, Min OA fraction is used.", + RoutineName, + this->Name)); + ShowContinueError(state, + "This may be overriding desired ventilation controls. Check inputs for Minimum Outdoor Air Flow Rate, Minimum " + "Outdoor Air Schedule Name and Controller:MechanicalVentilation"); + ShowContinueErrorTimeStamp( + state, format("Minimum OA fraction = {:.4R}, Mech Vent OA fraction = {:.4R}", OutAirMinFrac, MechVentOutsideAirMinFrac)); + } else { + ShowRecurringWarningErrorAtEnd(state, + "Controller:OutdoorAir=\"" + this->Name + + "\": Min OA fraction > Mechanical ventilation OA fraction, continues...", + this->IndexMechVentFrac, + OutAirMinFrac, + OutAirMinFrac); + } + } + } + if (MechVentOutsideAirMinFrac > OutAirMinFrac) { + OutAirMinFrac = MechVentOutsideAirMinFrac; + this->OALimitingFactor = OALimitFactor::DCV; + } + + OutAirMinFrac = min(max(OutAirMinFrac, 0.0), 1.0); + + // At this point, OutAirMinFrac is still based on AirLoopFlow.DesSupply + if (AirLoopNum > 0) { + auto &curAirLoopFlow(state.dataAirLoop->AirLoopFlow(AirLoopNum)); + + curAirLoopFlow.MinOutAir = OutAirMinFrac * curAirLoopFlow.DesSupply; + + // calculate mixed air temp at min OA flow rate + Real64 ReliefMassFlowAtMinOA = max(curAirLoopFlow.MinOutAir - this->ExhMassFlow, 0.0); + Real64 RecircMassFlowRateAtMinOAFlow = max(state.dataLoopNodes->Node(this->RetNode).MassFlowRate - ReliefMassFlowAtMinOA, 0.0); + if ((RecircMassFlowRateAtMinOAFlow + curAirLoopFlow.MinOutAir) > 0.0) { + Real64 RecircTemp = state.dataLoopNodes->Node(this->RetNode).Temp; // return air temp used for custom economizer control calculation + this->MixedAirTempAtMinOAFlow = + (RecircMassFlowRateAtMinOAFlow * RecircTemp + curAirLoopFlow.MinOutAir * state.dataLoopNodes->Node(this->OANode).Temp) / + (RecircMassFlowRateAtMinOAFlow + curAirLoopFlow.MinOutAir); + } else { + this->MixedAirTempAtMinOAFlow = state.dataLoopNodes->Node(this->RetNode).Temp; + } + } + + // Economizer + this->CalcOAEconomizer(state, AirLoopNum, OutAirMinFrac, OASignal, HighHumidityOperationFlag, FirstHVACIteration); + + this->OAMassFlow = OASignal * this->MixMassFlow; + + // Do not allow OA to be below Ventilation:Mechanical flow rate or above mixed mass flow rate + if (AirLoopNum > 0 && VentMechObjectNum != 0) { + if (this->MechVentOAMassFlowRequest > this->OAMassFlow) { + this->OAMassFlow = min(this->MechVentOAMassFlowRequest, this->MixMassFlow); + } + } + + // Do not allow OA to be below Exh for controller:outside air + if (this->ControllerType == MixedAirControllerType::ControllerOutsideAir) { + if (this->ExhMassFlow > this->OAMassFlow) { + this->OAMassFlow = this->ExhMassFlow; + this->OALimitingFactor = OALimitFactor::Exhaust; + } + } + + // if fixed minimum, don't let go below min OA + if (this->FixedMin) { + // cycling fans allow "average" min OA to be below minimum + if (!AirLoopCyclingFan) { + Real64 minOASchedMassFlowRate = this->MinOAMassFlowRate * MinOASchedVal; + if (minOASchedMassFlowRate > this->OAMassFlow) { + this->OAMassFlow = minOASchedMassFlowRate; + this->OALimitingFactor = OALimitFactor::Limits; + } + } + } + + // Apply Minimum Fraction of Outdoor Air Schedule + if (this->MinOAflowSchPtr > 0) { + Real64 MinOAflowfracVal = GetCurrentScheduleValue(state, this->MinOAflowSchPtr); + MinOAflowfracVal = min(max(MinOAflowfracVal, 0.0), 1.0); + OutAirMinFrac = max(MinOAflowfracVal, OutAirMinFrac); + Real64 minOAFracMassFlowRate = this->MixMassFlow * MinOAflowfracVal; + if (minOAFracMassFlowRate > this->OAMassFlow) { + this->OAMassFlow = minOAFracMassFlowRate; + this->OALimitingFactor = OALimitFactor::Limits; + } + } + + // Apply Maximum Fraction of Outdoor Air Schedule + Real64 currentMaxOAMassFlowRate = this->MaxOAMassFlowRate; + if (this->MaxOAflowSchPtr > 0) { + Real64 MaxOAflowfracVal = GetCurrentScheduleValue(state, this->MaxOAflowSchPtr); + MaxOAflowfracVal = min(max(MaxOAflowfracVal, 0.0), 1.0); + currentMaxOAMassFlowRate = min(this->MaxOAMassFlowRate, this->MixMassFlow * MaxOAflowfracVal); + OutAirMinFrac = min(MaxOAflowfracVal, OutAirMinFrac); + if (currentMaxOAMassFlowRate < this->OAMassFlow) { + this->OAMassFlow = currentMaxOAMassFlowRate; + this->OALimitingFactor = OALimitFactor::Limits; + } + } + + // Don't let the OA flow be > than the max OA limit. OA for high humidity control is allowed to be greater than max OA. + // Night Ventilation has priority and may override an OASignal > 1 high humidity condition with OASignal = 1 + if (HighHumidityOperationFlag) { + Real64 maxOAMassFlow = this->MaxOAMassFlowRate * max(1.0, OASignal); + if (maxOAMassFlow < this->OAMassFlow) { + this->OAMassFlow = maxOAMassFlow; + this->OALimitingFactor = OALimitFactor::Limits; + } + } else { + if (this->MaxOAMassFlowRate < this->OAMassFlow) { + this->OAMassFlow = this->MaxOAMassFlowRate; + this->OALimitingFactor = OALimitFactor::Limits; + } + } + + if (!state.dataGlobal->WarmupFlag && !state.dataGlobal->DoingSizing && (this->ManageDemand) && (this->OAMassFlow > this->DemandLimitFlowRate)) { + this->OAMassFlow = this->DemandLimitFlowRate; + this->OALimitingFactor = OALimitFactor::DemandLimit; + } + if (this->EMSOverrideOARate) { + this->OAMassFlow = this->EMSOARateValue; + this->OALimitingFactor = OALimitFactor::EMS; + } + + // Don't let OA flow be > mixed air flow. + // Seems if RAB (return air bypass) that this should be don't let OA flow be > design supply flow but that causes other issues + if (this->MixMassFlow < this->OAMassFlow) { + this->OAMassFlow = this->MixMassFlow; + this->OALimitingFactor = OALimitFactor::MixedAir; + } + + // save the min outside air flow fraction and max outside air mass flow rate + if (AirLoopNum > 0) { + auto &curAirLoopControlInfo(state.dataAirLoop->AirLoopControlInfo(AirLoopNum)); + auto &curAirLoopFlow(state.dataAirLoop->AirLoopFlow(AirLoopNum)); + + curAirLoopFlow.OAMinFrac = OutAirMinFrac; + if (this->FixedMin) { + curAirLoopFlow.MinOutAir = min(OutAirMinFrac * curAirLoopFlow.DesSupply, this->MixMassFlow); + } else { + curAirLoopFlow.MinOutAir = OutAirMinFrac * this->MixMassFlow; + } + if (this->MixMassFlow > 0.0) { + curAirLoopFlow.OAFrac = this->OAMassFlow / this->MixMassFlow; + curAirLoopFlow.OAFlow = this->OAMassFlow; + } else { + curAirLoopFlow.OAFrac = 0.0; + curAirLoopFlow.OAFlow = 0.0; + } + this->MinOAFracLimit = OutAirMinFrac; + if (HighHumidityOperationFlag && OASignal > 1.0) { + curAirLoopFlow.MaxOutAir = this->MaxOAMassFlowRate * OASignal; + } else { + curAirLoopFlow.MaxOutAir = currentMaxOAMassFlowRate; + } + + // MJW - Not sure if this is necessary but keeping it for now + if (curAirLoopControlInfo.HeatingActiveFlag && curAirLoopControlInfo.EconomizerFlowLocked) { + // The airloop needs to be simulated again so that the heating coil & HX can be resimulated + if (curAirLoopControlInfo.HeatRecoveryResimFlag && curAirLoopControlInfo.OASysComponentsSimulated) { + curAirLoopControlInfo.ResimAirLoopFlag = true; + curAirLoopControlInfo.HeatRecoveryResimFlag = false; + curAirLoopControlInfo.HeatRecoveryResimFlag2 = true; + // on the first iteration, air loop heating coils have not be simulated so HeatingCoilActive=FALSE + // on the second iteration, the heating coils could have been on, but logic tests here could deactivate heating coil + // reset heating coil active status and HX since logic tests may turn off heating coil + // the ResimAirLoopFlag will force another iteration and things should line up on subsequent iterations + curAirLoopControlInfo.HeatingActiveFlag = false; + this->HRHeatingCoilActive = 0; + curAirLoopControlInfo.HeatRecoveryBypass = true; + this->HeatRecoveryBypassStatus = 1; + } else if (curAirLoopControlInfo.HeatRecoveryResimFlag2) { + curAirLoopControlInfo.ResimAirLoopFlag = true; + curAirLoopControlInfo.HeatRecoveryResimFlag2 = false; + } else { + curAirLoopControlInfo.ResimAirLoopFlag = false; + } + } else if (curAirLoopControlInfo.HeatingActiveFlag) { + this->HRHeatingCoilActive = 1; + } else { + this->HRHeatingCoilActive = 0; + } + + } // if (AirLoopNum > 0) + + // Set the relief air flow rate (must be done last to account for changes in OAMassFlow + this->RelMassFlow = max(this->OAMassFlow - this->ExhMassFlow, 0.0); + + // Save OA fraction for reporting + if (this->MixMassFlow > 0) { + this->OAFractionRpt = this->OAMassFlow / this->MixMassFlow; + } else { + if (this->OAMassFlow > 0) { + this->OAFractionRpt = OASignal; + } else { + this->OAFractionRpt = 0.0; + } + } + this->RelTemp = this->RetTemp; + this->RelEnth = this->RetEnth; + this->RelSensiLossRate = + this->RelMassFlow * Psychrometrics::PsyCpAirFnW(state.dataEnvrn->OutHumRat) * (this->RelTemp - state.dataEnvrn->OutDryBulbTemp); + this->RelTotalLossRate = this->RelMassFlow * (this->RelEnth - state.dataEnvrn->OutEnthalpy); + this->RelLatentLossRate = this->RelTotalLossRate - this->RelSensiLossRate; + this->OALimitingFactorReport = static_cast(OALimitingFactor); +} + +Real64 VentilationMechanicalProps::CalcMechVentController(EnergyPlusData &state, + Real64 SysSA // System supply air mass flow rate [kg/s] +) +{ + static constexpr std::string_view RoutineName("CalcMechVentController: "); + static std::string_view const &CurrentModuleObject(CurrentModuleObjects[static_cast(CMO::MechVentilation)]); + + // new local variables for DCV + // Zone OA flow rate based on each calculation method [m3/s] + std::array(DataSizing::OAFlowCalcMethod::Num)> ZoneOACalc{0.0}; + Real64 CO2PeopleGeneration = 0; // CO2 generation from people at design level + Real64 ZoneOABZ; // Zone breathing-zone OA flow rate [m3/s] + Real64 ZoneOA; // Zone OA flow rate [m3/s] + Real64 ZoneOAFrac; // Zone OA fraction (as a fraction of actual supply air flow rate) + Real64 SysOAuc; // System uncorrected OA flow rate + Real64 SysOA; // System supply OA volume flow rate [m3/s] + Real64 SysEv; // System ventilation efficiency + Real64 NodeTemp; // node temperature + Real64 NodeHumRat; // node humidity ratio + Real64 ZoneMaxCO2 = 0.0; // Breathing-zone CO2 concentartion + Real64 ZoneMinCO2 = 0.0; // Minimum CO2 concentration in zone + Real64 ZoneOAMin = 0.0; // Minimum Zone OA flow rate when the zone is unoccupied (i.e. ZoneOAPeople = 0) + Real64 ZoneOAMax = 0.0; // Maximum Zone OA flow rate (ZoneOAPeople + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)]) + Real64 MechVentOAMassFlow = 0.0; + + // Apply mechanical ventilation only when it is available/allowed + if (GetCurrentScheduleValue(state, this->SchPtr) > 0) { + Real64 SysOAMassFlow = 0.0; // System supply OA mass flow rate [kg/s] + if (this->SystemOAMethod == DataSizing::SysOAMethod::IAQP) { + // IAQP for CO2 control + for (int ZoneIndex = 1; ZoneIndex <= this->NumofVentMechZones; ++ZoneIndex) { + auto &thisMechVentZone = this->VentMechZone(ZoneIndex); + int ZoneNum = thisMechVentZone.zoneNum; + SysOAMassFlow += state.dataContaminantBalance->ZoneSysContDemand(ZoneNum).OutputRequiredToCO2SP * + GetCurrentScheduleValue(state, thisMechVentZone.ZoneOASchPtr); + } + MechVentOAMassFlow = SysOAMassFlow; + } else if (this->SystemOAMethod == DataSizing::SysOAMethod::IAQPGC) { + // IAQP for generic contaminant control + for (int ZoneIndex = 1; ZoneIndex <= this->NumofVentMechZones; ++ZoneIndex) { + auto &thisMechVentZone = this->VentMechZone(ZoneIndex); + int ZoneNum = thisMechVentZone.zoneNum; + SysOAMassFlow += state.dataContaminantBalance->ZoneSysContDemand(ZoneNum).OutputRequiredToGCSP * + GetCurrentScheduleValue(state, thisMechVentZone.ZoneOASchPtr); + } + MechVentOAMassFlow = SysOAMassFlow; + } else if (this->SystemOAMethod == DataSizing::SysOAMethod::IAQPCOM) { + // IAQP for both CO2 and generic contaminant control + SysOAMassFlow = 0.0; + for (int ZoneIndex = 1; ZoneIndex <= this->NumofVentMechZones; ++ZoneIndex) { + auto &thisMechVentZone = this->VentMechZone(ZoneIndex); + int ZoneNum = thisMechVentZone.zoneNum; + SysOAMassFlow += state.dataContaminantBalance->ZoneSysContDemand(ZoneNum).OutputRequiredToCO2SP * + GetCurrentScheduleValue(state, thisMechVentZone.ZoneOASchPtr); + } + MechVentOAMassFlow = SysOAMassFlow; + SysOAMassFlow = 0.0; + for (int ZoneIndex = 1; ZoneIndex <= this->NumofVentMechZones; ++ZoneIndex) { + auto &thisMechVentZone = this->VentMechZone(ZoneIndex); + int ZoneNum = thisMechVentZone.zoneNum; + SysOAMassFlow += state.dataContaminantBalance->ZoneSysContDemand(ZoneNum).OutputRequiredToGCSP * + GetCurrentScheduleValue(state, thisMechVentZone.ZoneOASchPtr); + } + MechVentOAMassFlow = max(SysOAMassFlow, MechVentOAMassFlow); + } else { + // for system OA methods: Zone_Sum, VRP, CO2 methods + // new code for DCV method complying with the VRP defined in ASHRAE Standard 62.1-2010 + + // Loop through each zone first to calc uncorrected system OA flow rate + SysOAuc = 0.0; + SysOA = 0.0; + for (int ZoneIndex = 1; ZoneIndex <= this->NumofVentMechZones; ++ZoneIndex) { + auto &thisMechVentZone = this->VentMechZone(ZoneIndex); + int ZoneNum = thisMechVentZone.zoneNum; + auto const &curZone(state.dataHeatBal->Zone(ZoneNum)); + Real64 multiplier = curZone.Multiplier * curZone.ListMultiplier * GetCurrentScheduleValue(state, thisMechVentZone.ZoneOASchPtr); + + // Calc the zone OA flow rate based on the people component + // ZoneIntGain(ZoneNum)%NOFOCC is the number of occupants of a zone at each time step, already counting the occupant schedule + // Checking DCV flag before calculating zone OA per person + if (this->DCVFlag && this->SystemOAMethod != DataSizing::SysOAMethod::ProportionalControlDesOcc) { + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] = + state.dataHeatBal->ZoneIntGain(ZoneNum).NOFOCC * thisMechVentZone.ZoneOAPeopleRate; + } else { + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] = curZone.TotOccupants * thisMechVentZone.ZoneOAPeopleRate; + } + + // Calc the zone OA flow rate based on the floor area component + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] = curZone.FloorArea * thisMechVentZone.ZoneOAAreaRate; + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerZone)] = thisMechVentZone.ZoneOAFlowRate; + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::ACH)] = (thisMechVentZone.ZoneOAACHRate * curZone.Volume) / 3600.0; + + // Calc the breathing-zone OA flow rate + int OAIndex = thisMechVentZone.ZoneDesignSpecOAObjIndex; // index to design specification outdoor air objects + if (OAIndex > 0) { + switch (state.dataSize->OARequirements(OAIndex).OAFlowMethod) { + case DataSizing::OAFlowCalcMethod::Sum: { + ZoneOABZ = multiplier * (ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] + + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] + + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerZone)] + + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::ACH)]); + } break; + case DataSizing::OAFlowCalcMethod::Max: { + ZoneOABZ = multiplier * max(ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)], + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)], + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerZone)], + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::ACH)]); + + } break; + default: { + ZoneOABZ = multiplier * ZoneOACalc[static_cast(state.dataSize->OARequirements(OAIndex).OAFlowMethod)]; + break; + } + } + } else { + ZoneOABZ = multiplier * ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)]; + } + + if (this->SystemOAMethod == DataSizing::SysOAMethod::ZoneSum) { + // Sum the zone OA flow rates and done + SysOA += ZoneOABZ; + } else { + // Calc the uncorrected system OA flow rate - VRP and ProportionalControl + SysOAuc += ZoneOABZ; + } + } + + // get system supply air flow rate + if (this->SystemOAMethod == DataSizing::SysOAMethod::VRP || this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc || + this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc || + this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate || + this->SystemOAMethod == DataSizing::SysOAMethod::VRPL) { + + // System supply air flow rate is always greater than or equal the system outdoor air flow rate + if ((SysSA > 0.0) && (SysSA < (SysOAuc * state.dataEnvrn->StdRhoAir))) SysSA = SysOAuc * state.dataEnvrn->StdRhoAir; + + // calc Xs - average outdoor air fraction + if (SysSA > 0.0) { + Xs = (SysOAuc * state.dataEnvrn->StdRhoAir) / SysSA; + } else { + Xs = 0.0; + } + + // Loop through each zone again + SysEv = 2.0; // starting with a big fraction + for (int ZoneIndex = 1; ZoneIndex <= this->NumofVentMechZones; ++ZoneIndex) { + auto &thisMechVentZone = this->VentMechZone(ZoneIndex); + int ZoneNum = thisMechVentZone.zoneNum; + int ZoneEquipConfigNum = ZoneNum; // correspondence - 1:1 of ZoneEquipConfig to Zone index + Real64 ZoneEz = 0.0; // Zone air distribution effectiveness + + // Assign references + auto &curZone(state.dataHeatBal->Zone(ZoneNum)); + auto &curZoneSysEnergyDemand(state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneEquipConfigNum)); + Real64 multiplier = curZone.Multiplier * curZone.ListMultiplier * GetCurrentScheduleValue(state, thisMechVentZone.ZoneOASchPtr); + + // Calc the zone OA flow rate based on the people component + // ZoneIntGain(ZoneNum)%NOFOCC is the number of occupants of a zone at each time step, already counting the occupant schedule + // Checking DCV flag before calculating zone OA per person + if (this->DCVFlag && this->SystemOAMethod != DataSizing::SysOAMethod::ProportionalControlDesOcc) { + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] = + state.dataHeatBal->ZoneIntGain(ZoneNum).NOFOCC * multiplier * thisMechVentZone.ZoneOAPeopleRate; + } else { + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] = + curZone.TotOccupants * multiplier * thisMechVentZone.ZoneOAPeopleRate; + } + + // Calc the zone OA flow rate based on the floor area component + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] = + curZone.FloorArea * multiplier * thisMechVentZone.ZoneOAAreaRate; + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerZone)] = multiplier * thisMechVentZone.ZoneOAFlowRate; + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::ACH)] = + multiplier * (thisMechVentZone.ZoneOAACHRate * curZone.Volume) / 3600.0; + + // Calc the breathing-zone OA flow rate + int OAIndex = thisMechVentZone.ZoneDesignSpecOAObjIndex; + if (OAIndex > 0) { + switch (state.dataSize->OARequirements(OAIndex).OAFlowMethod) { + case DataSizing::OAFlowCalcMethod::Sum: { + ZoneOABZ = ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] + + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] + + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerZone)] + + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::ACH)]; + } break; + case DataSizing::OAFlowCalcMethod::Max: { + ZoneOABZ = max(ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)], + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)], + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerZone)], + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::ACH)]); + + } break; + default: { + ZoneOABZ = ZoneOACalc[static_cast(state.dataSize->OARequirements(OAIndex).OAFlowMethod)]; + break; + } + } + } + + // use the ventilation rate procedure in ASHRAE Standard 62.1-2007 + // Calc the zone supplied OA flow rate counting the zone air distribution effectiveness + // First check whether the zone air distribution effectiveness schedule exists, if yes uses it; + // otherwise uses the inputs of zone distribution effectiveness in cooling mode or heating mode + int ADEffSchPtr = thisMechVentZone.ZoneADEffSchPtr; + if (ADEffSchPtr > 0) { + // Get schedule value for the zone air distribution effectiveness + ZoneEz = GetCurrentScheduleValue(state, ADEffSchPtr); + } else { + Real64 ZoneLoad = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneNum).TotalOutputRequired; + + // Zone in cooling mode + if (ZoneLoad < 0.0) ZoneEz = thisMechVentZone.ZoneADEffCooling; + + // Zone in heating mode + if (ZoneLoad > 0.0) ZoneEz = thisMechVentZone.ZoneADEffHeating; + } + if (ZoneEz <= 0.0) { + // Enforce defaults + ZoneEz = 1.0; + } + + // Calc zone supply OA flow rate + if (this->SystemOAMethod == DataSizing::SysOAMethod::VRP || this->SystemOAMethod == DataSizing::SysOAMethod::VRPL) { + // the VRP case + ZoneOA = ZoneOABZ / ZoneEz; + + } else if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc || + this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc || + this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate) { + // Check whether "Carbon Dioxide Control Availability Schedule" for ZoneControl:ContaminantController is specified + if (curZone.ZoneContamControllerSchedIndex > 0.0) { + // Check the availability schedule value for ZoneControl:ContaminantController + Real64 ZoneContamControllerSched = GetCurrentScheduleValue(state, curZone.ZoneContamControllerSchedIndex); + if (ZoneContamControllerSched > 0.0) { + ZoneOAMin = ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] / ZoneEz; + ZoneOAMax = (ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] + + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)]) / + ZoneEz; + if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate) { + ZoneOAMax = ZoneOABZ / ZoneEz; + if (thisMechVentZone.OAPropCtlMinRateSchPtr > 0) { + ZoneOAMin = ZoneOAMax * GetCurrentScheduleValue(state, thisMechVentZone.OAPropCtlMinRateSchPtr); + } else { + ZoneOAMin = ZoneOAMax; + } + if (ZoneOAMax < ZoneOAMin) { + ZoneOAMin = ZoneOAMax; + ++this->OAMaxMinLimitErrorCount; + if (this->OAMaxMinLimitErrorCount < 2) { + ShowSevereError(state, format("{}{} = \"{}\".", RoutineName, CurrentModuleObject, this->Name)); + ShowContinueError( + state, + format("For System Outdoor Air Method = ProportionalControlBasedOnDesignOARate, maximum zone " + "outdoor air rate ({:.4R}), is not greater than minimum zone outdoor air rate ({:.4R}).", + ZoneOAMax, + ZoneOAMin)); + ShowContinueError(state, + " The minimum zone outdoor air rate is set to the maximum zone outdoor air rate. " + "Simulation continues..."); + ShowContinueErrorTimeStamp(state, ""); + } else { + ShowRecurringWarningErrorAtEnd( + state, + format("{} = \"{}\", For System Outdoor Air Method = ProportionalControlBasedOnDesignOARate, maximum " + "zone outdoor air rate is not greater than minimum zone outdoor air rate. Error continues...", + CurrentModuleObject, + this->Name), + this->OAMaxMinLimitErrorIndex); + } + } + } + + if (ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] > 0.0) { + if (state.dataContaminantBalance->ZoneCO2GainFromPeople(ZoneNum) > 0.0) { + if (curZone.ZoneMinCO2SchedIndex > 0.0) { + // Take the schedule value of "Minimum Carbon Dioxide Concentration Schedule Name" + // in the ZoneControl:ContaminantController + ZoneMinCO2 = GetCurrentScheduleValue(state, curZone.ZoneMinCO2SchedIndex); + } else { + ZoneMinCO2 = state.dataContaminantBalance->OutdoorCO2; + } + + // Calculate zone maximum target CO2 concentration in PPM + if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc) { + // Accumulate CO2 generation from people at design occupancy and current activity level + for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { + if (state.dataHeatBal->People(PeopleNum).ZonePtr != ZoneNum) continue; + CO2PeopleGeneration += + state.dataHeatBal->People(PeopleNum).NumberOfPeople * + state.dataHeatBal->People(PeopleNum).CO2RateFactor * + GetCurrentScheduleValue(state, state.dataHeatBal->People(PeopleNum).ActivityLevelPtr); + } + ZoneMaxCO2 = state.dataContaminantBalance->OutdoorCO2 + + (CO2PeopleGeneration * curZone.Multiplier * curZone.ListMultiplier * 1.0e6) / ZoneOAMax; + } else if (curZone.ZoneMaxCO2SchedIndex > 0.0) { + ZoneMaxCO2 = GetCurrentScheduleValue(state, curZone.ZoneMaxCO2SchedIndex); + } else { + ZoneMaxCO2 = state.dataContaminantBalance->OutdoorCO2 + + (state.dataContaminantBalance->ZoneCO2GainFromPeople(ZoneNum) * curZone.Multiplier * + curZone.ListMultiplier * 1.0e6) / + ZoneOAMax; + } + + if (ZoneMaxCO2 <= ZoneMinCO2) { + ++this->CO2MaxMinLimitErrorCount; + if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc) { + if (this->CO2MaxMinLimitErrorCount < 2) { + ShowSevereError(state, format("{}{} = \"{}\".", RoutineName, CurrentModuleObject, this->Name)); + ShowContinueError( + state, + format("For System Outdoor Air Method = ProportionalControlBasedOnOccupancySchedule, " + "maximum target CO2 concentration ({:.2R}), is not greater than minimum target " + "CO2 concentration ({:.2R}).", + ZoneMaxCO2, + ZoneMinCO2)); + ShowContinueError(state, + "\"ProportionalControlBasedOnOccupancySchedule\" will not be modeled. " + "Default \"Standard62.1VentilationRateProcedure\" will be modeled. Simulation " + "continues..."); + ShowContinueErrorTimeStamp(state, ""); + } else { + ShowRecurringWarningErrorAtEnd(state, + format("{} = \"{}\", For System Outdoor Air Method = " + "ProportionalControlBasedOnOccupancySchedule, maximum " + "target CO2 concentration is not greater than minimum " + "target CO2 concentration. Error continues...", + CurrentModuleObject, + this->Name), + this->CO2MaxMinLimitErrorIndex); + } + } + if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc) { + if (this->CO2MaxMinLimitErrorCount < 2) { + ShowSevereError(state, format("{}{} = \"{}\".", RoutineName, CurrentModuleObject, this->Name)); + ShowContinueError( + state, + format("For System Outdoor Air Method = ProportionalControlBasedOnDesignOccupancy, " + "maximum target CO2 concentration ({:.2R}), is not greater than minimum target " + "CO2 concentration ({:.2R}).", + ZoneMaxCO2, + ZoneMinCO2)); + ShowContinueError(state, + "\"ProportionalControlBasedOnDesignOccupancy\" will not be modeled. " + "Default \"Standard62.1VentilationRateProcedure\" will be modeled. Simulation " + "continues..."); + ShowContinueErrorTimeStamp(state, ""); + } else { + ShowRecurringWarningErrorAtEnd(state, + format("{} = \"{}\", For System Outdoor Air Method = " + "ProportionalControlBasedOnDesignOccupancy, maximum " + "target CO2 concentration is not greater than minimum " + "target CO2 concentration. Error continues...", + CurrentModuleObject, + this->Name), + this->CO2MaxMinLimitErrorIndex); + } + } + if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate) { + if (this->CO2MaxMinLimitErrorCount < 2) { + ShowSevereError(state, format("{}{} = \"{}\".", RoutineName, CurrentModuleObject, this->Name)); + ShowContinueError( + state, + format("For System Outdoor Air Method = ProportionalControlBasedOnDesignOARate, maximum " + "target CO2 concentration ({:.2R}), is not greater than minimum target CO2 " + "concentration ({:.2R}).", + ZoneMaxCO2, + ZoneMinCO2)); + ShowContinueError( + state, + "\"ProportionalControlBasedOnDesignOARate\" will not be modeled. Default " + "\"Standard62.1VentilationRateProcedure\" will be modeled. Simulation continues..."); + ShowContinueErrorTimeStamp(state, ""); + } else { + ShowRecurringWarningErrorAtEnd(state, + format("{} = \"{}\", For System Outdoor Air Method = " + "ProportionalControlBasedOnDesignOARate, maximum target " + "CO2 concentration is not greater than minimum target CO2 " + "concentration. Error continues...", + CurrentModuleObject, + this->Name), + this->CO2MaxMinLimitErrorIndex); + } + } + + ZoneOA = ZoneOABZ / ZoneEz; + } else { + + if (state.dataContaminantBalance->ZoneAirCO2(ZoneNum) <= ZoneMinCO2) { + // Zone air CO2 concentration is less than minimum zone CO2 concentration, set the Zone OA flow + // rate to minimum Zone OA flow rate when the zone is unoccupied + ZoneOA = ZoneOAMin; + } else if (state.dataContaminantBalance->ZoneAirCO2(ZoneNum) >= ZoneMaxCO2) { + // Zone air CO2 concentration is greater than maximum zone CO2 concentration, set the Zone OA flow + // rate to maximum Zone OA flow rate (i.e. + // ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] + ZoneOAPeople) + ZoneOA = ZoneOAMax; + } else { + // Zone air CO2 concentration is between maximum and minimum limits of zone CO2 concentration, + // set Zone OA flow rate by proportionally adjusting between ZoneOAMin and ZoneOAMax + ZoneOA = ZoneOAMin + + (ZoneOAMax - ZoneOAMin) * ((state.dataContaminantBalance->ZoneAirCO2(ZoneNum) - ZoneMinCO2) / + (ZoneMaxCO2 - ZoneMinCO2)); + } + } + } else { + if (state.dataGlobal->DisplayExtraWarnings) { + ++this->CO2GainErrorCount; + if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc) { + if (this->CO2GainErrorCount < 2) { + ShowSevereError(state, format("{}{} = \"{}\".", RoutineName, CurrentModuleObject, this->Name)); + ShowContinueError( + state, + format("For System Outdoor Air Method = ProportionalControlBasedOnOccupancySchedule, CO2 " + "generation from people is not greater than zero. Occurs in Zone =\"{}\". ", + curZone.Name)); + ShowContinueError(state, + "\"ProportionalControlBasedOnOccupancySchedule\" will not be modeled. " + "Default \"Standard62.1VentilationRateProcedure\" will be modeled. Simulation " + "continues..."); + ShowContinueErrorTimeStamp(state, ""); + } else { + ShowRecurringWarningErrorAtEnd( + state, + format("{} = \"{}\", For System Outdoor Air Method = " + "ProportionalControlBasedOnOccupancySchedule, " + "CO2 generation from people is not greater than zero. Error continues...", + CurrentModuleObject, + this->Name), + this->CO2GainErrorIndex); + } + } + if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc) { + if (this->CO2GainErrorCount < 2) { + ShowSevereError(state, format("{}{} = \"{}\".", RoutineName, CurrentModuleObject, this->Name)); + ShowContinueError( + state, + format("For System Outdoor Air Method = ProportionalControlBasedOnDesignOccupancy, CO2 " + "generation from people is not greater than zero. Occurs in Zone =\"{}\". ", + curZone.Name)); + ShowContinueError(state, + "\"ProportionalControlBasedOnDesignOccupancy\" will not be modeled. " + "Default \"Standard62.1VentilationRateProcedure\" will be modeled. Simulation " + "continues..."); + ShowContinueErrorTimeStamp(state, ""); + } else { + ShowRecurringWarningErrorAtEnd( + state, + format( + "{} = \"{}\", For System Outdoor Air Method = ProportionalControlBasedOnDesignOccupancy, " + "CO2 generation from people is not greater than zero. Error continues...", + CurrentModuleObject, + this->Name), + this->CO2GainErrorIndex); + } + } + } + ZoneOA = ZoneOABZ / ZoneEz; + } + } else { + // ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] is less than or equal to zero + ZoneOA = ZoneOABZ / ZoneEz; + } + } else { + // ZoneControl:ContaminantController is scheduled off (not available) + ZoneOA = ZoneOABZ / ZoneEz; + } + } else { + // "Carbon Dioxide Control Availability Schedule" for ZoneControl:ContaminantController not found + ZoneOA = ZoneOABZ / ZoneEz; + } + SysOA = SysOA + ZoneOA; + } + + // Get the zone supply air flow rate + Real64 ZoneSA = 0.0; // Zone supply air flow rate + Real64 ZonePA = 0.0; // Zone primary air flow rate + Ep = 1.0; + if (ZoneEquipConfigNum > 0) { + auto &curZoneEquipConfig = state.dataZoneEquip->ZoneEquipConfig(ZoneEquipConfigNum); + for (int InNodeIndex = 1; InNodeIndex <= curZoneEquipConfig.NumInletNodes; ++InNodeIndex) { + // Assume primary air is always stored at the AirDistUnitCool (cooling deck if dual duct) + int PriNode = curZoneEquipConfig.AirDistUnitCool(InNodeIndex).InNode; // primary node of zone terminal unit + Real64 MassFlowRate = 0.0; + if (PriNode > 0) { + NodeTemp = state.dataLoopNodes->Node(PriNode).Temp; + NodeHumRat = state.dataLoopNodes->Node(PriNode).HumRat; + MassFlowRate = state.dataLoopNodes->Node(PriNode).MassFlowRate; + } + // total primary air to terminal units of the zone + if (MassFlowRate > 0.0) + ZonePA += + MassFlowRate / Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, NodeTemp, NodeHumRat); + + // or InletNode = ZoneEquipConfig(ZoneEquipConfigNum)%AirDistUnitCool(InNodeIndex)%OutNode + int InletNode = curZoneEquipConfig.InletNode(InNodeIndex); // outlet node of zone terminal unit + MassFlowRate = 0.0; + if (InletNode > 0) { + NodeTemp = state.dataLoopNodes->Node(InletNode).Temp; + NodeHumRat = state.dataLoopNodes->Node(InletNode).HumRat; // ZoneAirHumRat(ZoneNum) + MassFlowRate = state.dataLoopNodes->Node(InletNode).MassFlowRate; + } + // total supply air to the zone + if (MassFlowRate > 0.0) + ZoneSA += + MassFlowRate / Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, NodeTemp, NodeHumRat); + } + + // calc zone primary air fraction + if (ZoneSA > 0.0) Ep = ZonePA / ZoneSA; + if (Ep > 1.0) Ep = 1.0; + } + + // Calc the zone OA fraction = Zone OA flow rate / Zone supply air flow rate + if (ZoneSA > 0.0) { + ZoneOAFrac = ZoneOA / ZoneSA; + // Zone OA fraction cannot be more than 1 + if (ZoneOAFrac > 1.0) ZoneOAFrac = 1.0; + } else { + ZoneOAFrac = 0.0; + } + + // added for TRACE - zone maximum OA fraction - calculate the adjustment factor for the TU/zone supply air flow + // only for VRP system OA method + curZoneSysEnergyDemand.SupplyAirAdjustFactor = 1.0; + + if (this->SystemOAMethod == DataSizing::SysOAMethod::VRP || this->SystemOAMethod == DataSizing::SysOAMethod::VRPL) { + if (ZoneOAFrac > this->ZoneMaxOAFraction) { + if (this->ZoneMaxOAFraction > 0.0) { + curZoneSysEnergyDemand.SupplyAirAdjustFactor = ZoneOAFrac / this->ZoneMaxOAFraction; + } else { + curZoneSysEnergyDemand.SupplyAirAdjustFactor = 1.0; + } + + // cap zone OA fraction at the maximum specified + ZoneOAFrac = this->ZoneMaxOAFraction; + } + } + + // Zone air secondary recirculation fraction + Er = thisMechVentZone.ZoneSecondaryRecirculation; + if (Er > 0.0) { + // multi-path ventilation system using VRP + Fa = Ep + (1.0 - Ep) * Er; + Fb = Ep; + Fc = 1.0 - (1.0 - ZoneEz) * (1.0 - Er) * (1.0 - Ep); + + // Calc zone ventilation efficiency + if (Fa > 0.0) { + Evz = 1.0 + Xs * Fb / Fa - ZoneOAFrac * Ep * Fc / Fa; + } else { + Evz = 1.0; + } + } else { + // single-path ventilation system + Evz = 1.0 + Xs - ZoneOAFrac; + } + + // calc system ventilation efficiency = Minimum of zone ventilation efficiency + if (Evz < 0.0) Evz = 0.0; + if (Evz < SysEv) SysEv = Evz; + + } // zone loop + + // Calc the system supply OA flow rate counting the system ventilation efficiency + if (SysEv <= 0.0) SysEv = 1.0; + + // Calc system outdoor air requirement + if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc || + this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc || + this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate) { + SysOA = SysOA / SysEv; + } else if (this->SystemOAMethod == DataSizing::SysOAMethod::VRPL && this->SysDesOA > 0.0) { + // Limit system OA to design OA minimum flow rate, as per ASHRAE Guideline 36-2018 Section 5.16.3.1 + // If no system sizing run is done (i.e. no Sizing:System) the design outdoor air flow rate is not known + SysOA = min(SysOAuc / SysEv, this->SysDesOA); + } else { + SysOA = SysOAuc / SysEv; + } + } + + // Finally calc the system supply OA mass flow rate + MechVentOAMassFlow = SysOA * state.dataEnvrn->StdRhoAir; + } + } + return MechVentOAMassFlow; +} + +void OAControllerProps::CalcOAEconomizer(EnergyPlusData &state, + int const AirLoopNum, + Real64 const OutAirMinFrac, + Real64 &OASignal, + bool &HighHumidityOperationFlag, + bool const FirstHVACIteration) +{ + int constexpr MaxIte(500); // Maximum number of iterations + Real64 constexpr Acc(0.0001); // Accuracy of result + bool AirLoopEconoLockout; // Economizer lockout flag + bool AirLoopNightVent; // Night Ventilation flag for air loop + bool EconomizerOperationFlag; // TRUE if OA economizer is active + Real64 EconomizerAirFlowScheduleValue; // value of economizer operation schedule (push-button type control schedule) + Real64 MaximumOAFracBySetPoint; // The maximum OA fraction due to freezing cooling coil check + Real64 OutAirSignal; // Used to set OA mass flow rate + int SolFla; // Flag of solver + Real64 minOAFrac; + + if (AirLoopNum > 0) { + // Check lockout with heating for any airloop - will lockout economizer even on airloops without a unitary system + if (this->Lockout == LockoutType::LockoutWithHeatingPossible) { + // For all system types (even ones that don't set AirLoopEconoLockout) lock out economizer if unfavorable for heating + if (state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CheckHeatRecoveryBypassStatus && + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysComponentsSimulated) { + + if (this->MixedAirTempAtMinOAFlow <= state.dataLoopNodes->Node(this->MixNode).TempSetPoint) { + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).EconomizerFlowLocked = true; + // this->OAMassFlow = AirLoopFlow( AirLoopNum ).MinOutAir; + // AirLoopFlow( AirLoopNum ).OAFrac = this->OAMassFlow / this->MixMassFlow; + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).EconoLockout = true; + EconomizerOperationFlag = false; + } else { + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).EconomizerFlowLocked = false; + this->HRHeatingCoilActive = 0; + } + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CheckHeatRecoveryBypassStatus = false; + } + } + } + + if (AirLoopNum > 0) { + AirLoopEconoLockout = state.dataAirLoop->AirLoopControlInfo(AirLoopNum).EconoLockout; + AirLoopNightVent = state.dataAirLoop->AirLoopControlInfo(AirLoopNum).NightVent; + } else { + AirLoopEconoLockout = false; + AirLoopNightVent = false; + } + + // Define an outside air signal + if (this->MixedAirSPMNum > 0) { + this->CoolCoilFreezeCheck = SetPointManager::GetCoilFreezingCheckFlag(state, this->MixedAirSPMNum); + } else { + this->CoolCoilFreezeCheck = false; + } + + if (std::abs(this->RetTemp - this->InletTemp) > SmallTempDiff) { + OutAirSignal = (this->RetTemp - this->MixSetTemp) / (this->RetTemp - this->InletTemp); + if (this->CoolCoilFreezeCheck) { + this->MaxOAFracBySetPoint = 0.0; + MaximumOAFracBySetPoint = OutAirSignal; + } + } else { + if (this->RetTemp - this->MixSetTemp < 0.0) { + if (this->RetTemp - this->InletTemp >= 0.0) { + OutAirSignal = -1.0; + } else { + OutAirSignal = 1.0; + } + } else { + if (this->RetTemp - this->InletTemp >= 0.0) { + OutAirSignal = 1.0; + } else { + OutAirSignal = -1.0; + } + } + } + OutAirSignal = min(max(OutAirSignal, OutAirMinFrac), 1.0); + + // If no economizer, set to minimum and disable economizer and high humidity control + if (this->Econo == EconoOp::NoEconomizer) { + OutAirSignal = OutAirMinFrac; + EconomizerOperationFlag = false; + EconomizerAirFlowScheduleValue = 0.0; + HighHumidityOperationFlag = false; + } else if (this->MaxOA < SmallAirVolFlow) { + OutAirSignal = OutAirMinFrac; + EconomizerOperationFlag = false; + EconomizerAirFlowScheduleValue = 0.0; + HighHumidityOperationFlag = false; + } else if (AirLoopEconoLockout) { + OutAirSignal = OutAirMinFrac; + EconomizerOperationFlag = false; + EconomizerAirFlowScheduleValue = 0.0; + HighHumidityOperationFlag = false; + } else { + // Changed by Amit for new implementation + // Otherwise do the limit checks + EconomizerOperationFlag = true; + // Outside air temp greater than mix air setpoint + if (this->InletTemp > this->MixSetTemp) { + OutAirSignal = 1.0; + } + // Return air temp limit + if (this->Econo == EconoOp::DifferentialDryBulb) { + if (this->InletTemp > this->RetTemp) { + OutAirSignal = OutAirMinFrac; + EconomizerOperationFlag = false; + } + this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); + } + // Return air enthalpy limit + if (this->Econo == EconoOp::DifferentialEnthalpy) { + if (this->InletEnth > this->RetEnth) { + OutAirSignal = OutAirMinFrac; + EconomizerOperationFlag = false; + } + this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); + } + // Outside air temperature limit + if (this->Econo == EconoOp::FixedDryBulb) { + this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); + } + // Fixed Enthalpy limit + if (this->Econo == EconoOp::FixedEnthalpy) { + this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); + } + // FIXED DEW POINT AND DRY BULB TEMPERATURE STRATEGY + if (this->Econo == EconoOp::FixedDewPointAndDryBulb) { + this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); + } + // ELECRONIC ENTHALPY, HUMIDITY RATIO CURVE + if (this->Econo == EconoOp::ElectronicEnthalpy) { + this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); + } + // Differential dry bulb and enthalpy strategy + if (this->Econo == EconoOp::DifferentialDryBulbAndEnthalpy) { + if (this->InletTemp > this->RetTemp) { + OutAirSignal = OutAirMinFrac; + EconomizerOperationFlag = false; + } + if (this->InletEnth > this->RetEnth) { + OutAirSignal = OutAirMinFrac; + EconomizerOperationFlag = false; + } + this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); + } + + if (this->TempLowLim != BlankNumeric && this->OATemp < this->TempLowLim) { + OutAirSignal = OutAirMinFrac; + EconomizerOperationFlag = false; + } + // Increase air flow for humidity control + // (HumidistatZoneNum is greater than 0 IF High Humidity Control Flag = YES, checked in GetInput) + if (this->HumidistatZoneNum > 0) { + // IF humidistat senses a moisture load check to see if modifying air flow is appropriate, otherwise disable modified air flow + if (state.dataZoneEnergyDemand->ZoneSysMoistureDemand(this->HumidistatZoneNum).TotalOutputRequired < 0.0) { + // IF OAController is not allowed to modify air flow during high outdoor humrat condition, then disable modified air flow + // if indoor humrat is less than or equal to outdoor humrat + if (!this->ModifyDuringHighOAMoisture && + (state.dataLoopNodes->Node(this->NodeNumofHumidistatZone).HumRat - this->OAHumRat) <= DataHVACGlobals::SmallHumRatDiff) { + HighHumidityOperationFlag = false; + } else { + HighHumidityOperationFlag = true; + } + } else { + HighHumidityOperationFlag = false; + } + } else { + HighHumidityOperationFlag = false; + } + + // Check time of day economizer schedule, enable economizer if schedule value > 0 + EconomizerAirFlowScheduleValue = 0.0; + if (this->EconomizerOASchedPtr > 0) { + EconomizerAirFlowScheduleValue = GetCurrentScheduleValue(state, this->EconomizerOASchedPtr); + if (EconomizerAirFlowScheduleValue > 0.0) { + EconomizerOperationFlag = true; + OutAirSignal = 1.0; + } + } + } + + // OutAirSignal will not give exactly the correct mixed air temperature (equal to the setpoint) since + // it was calculated using the approximate method of sensible energy balance. Now we have to get the + // accurate result using a full mass, enthalpy and moisture balance and iteration. + if (OutAirSignal > OutAirMinFrac && OutAirSignal < 1.0 && this->MixMassFlow > VerySmallMassFlow && + this->ControllerType == MixedAirControllerType::ControllerOutsideAir && !AirLoopNightVent) { + + if (AirLoopNum > 0) { + + if (state.dataAirLoop->OutsideAirSys(state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysNum).NumComponents == 1) { + // no need to simulate OA System if only a mixer is used in the OutsideAirSystem + + auto f = [&state, this](Real64 const OASignal) { + Real64 const OAMassFlowRate = OASignal * this->MixMassFlow; + Real64 const RecircMassFlowRate = max(this->MixMassFlow - OAMassFlowRate, 0.0); + Real64 const RecircEnth = state.dataLoopNodes->Node(this->RetNode).Enthalpy; + Real64 const RecircHumRat = state.dataLoopNodes->Node(this->RetNode).HumRat; + Real64 const MixEnth = + (RecircMassFlowRate * RecircEnth + OAMassFlowRate * state.dataLoopNodes->Node(this->OANode).Enthalpy) / this->MixMassFlow; + Real64 const MixHumRat = + (RecircMassFlowRate * RecircHumRat + OAMassFlowRate * state.dataLoopNodes->Node(this->OANode).HumRat) / this->MixMassFlow; + Real64 const MixTemp = Psychrometrics::PsyTdbFnHW(MixEnth, MixHumRat); + return state.dataLoopNodes->Node(this->MixNode).TempSetPoint - MixTemp; + }; + + General::SolveRoot(state, Acc, MaxIte, SolFla, OASignal, f, OutAirMinFrac, 1.0); + if (SolFla < 0) { + OASignal = OutAirSignal; + } + + } else { + + // simulate OA System if equipment exists other than the mixer (e.g., heating/cooling coil, HX, ect.) + + // 1 - check min OA flow result + if (this->FixedMin) { + state.dataLoopNodes->Node(this->OANode).MassFlowRate = + min(max(this->ExhMassFlow, OutAirMinFrac * state.dataAirLoop->AirLoopFlow(AirLoopNum).DesSupply), + state.dataLoopNodes->Node(this->MixNode).MassFlowRate); + state.dataLoopNodes->Node(this->RelNode).MassFlowRate = + max(state.dataLoopNodes->Node(this->OANode).MassFlowRate - this->ExhMassFlow, 0.0); + // save actual OA flow frac for use as min value for RegulaFalsi call + minOAFrac = max(OutAirMinFrac, state.dataLoopNodes->Node(this->OANode).MassFlowRate / this->MixMassFlow); + } else { + state.dataLoopNodes->Node(this->OANode).MassFlowRate = + max(this->ExhMassFlow, OutAirMinFrac * state.dataLoopNodes->Node(this->MixNode).MassFlowRate); + state.dataLoopNodes->Node(this->RelNode).MassFlowRate = + max(state.dataLoopNodes->Node(this->OANode).MassFlowRate - this->ExhMassFlow, 0.0); + // save actual OA flow frac for use as min value for RegulaFalsi call + minOAFrac = max(OutAirMinFrac, state.dataLoopNodes->Node(this->OANode).MassFlowRate / this->MixMassFlow); + } + SimOASysComponents(state, state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysNum, FirstHVACIteration, AirLoopNum); + Real64 lowFlowResiduum = state.dataLoopNodes->Node(this->MixNode).TempSetPoint - state.dataLoopNodes->Node(this->MixNode).Temp; + + // 2 - check max OA flow result + state.dataLoopNodes->Node(this->OANode).MassFlowRate = max(this->ExhMassFlow, state.dataLoopNodes->Node(this->MixNode).MassFlowRate); + state.dataLoopNodes->Node(this->RelNode).MassFlowRate = + max(state.dataLoopNodes->Node(this->OANode).MassFlowRate - this->ExhMassFlow, 0.0); + SimOASysComponents(state, state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysNum, FirstHVACIteration, AirLoopNum); + Real64 highFlowResiduum = state.dataLoopNodes->Node(this->MixNode).TempSetPoint - state.dataLoopNodes->Node(this->MixNode).Temp; + + // 3 - test to ensure RegulaFalsi can find an answer + if ((sign(lowFlowResiduum) == sign(highFlowResiduum))) { + OASignal = OutAirSignal; + } else { + // 4 - find result + + auto f = [&state, this, FirstHVACIteration, AirLoopNum](Real64 const OASignal) { + Real64 const MixMassFlowRate = this->MixMassFlow; + int const OASysNum = state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysNum; + Real64 localExhMassFlow = state.dataAirLoop->AirLoopControlInfo(AirLoopNum).ZoneExhMassFlow; + Real64 const OAMassFlowRate = max(localExhMassFlow, OASignal * MixMassFlowRate); + state.dataLoopNodes->Node(this->OANode).MassFlowRate = OAMassFlowRate; // set OA node mass flow rate + state.dataLoopNodes->Node(this->RelNode).MassFlowRate = + max(OAMassFlowRate - localExhMassFlow, 0.0); // set relief node mass flow rate to maintain mixer continuity calcs + SimOASysComponents(state, OASysNum, FirstHVACIteration, AirLoopNum); + return state.dataLoopNodes->Node(this->MixNode).TempSetPoint - state.dataLoopNodes->Node(this->MixNode).Temp; + }; + + General::SolveRoot(state, (Acc / 10.0), MaxIte, SolFla, OASignal, f, minOAFrac, 1.0); + if (SolFla < 0) { // if RegulaFalsi fails to find a solution, returns -1 or -2, set to existing OutAirSignal + OASignal = OutAirSignal; + } + } + } + + } else { + + auto f = [&state, this](Real64 const OASignal) { + Real64 const MixMassFlowRate = this->MixMassFlow; + Real64 OAMassFlowRate = OASignal * MixMassFlowRate; + Real64 RecircMassFlowRate = max(MixMassFlowRate - OAMassFlowRate, 0.0); + Real64 RecircEnth = state.dataLoopNodes->Node(this->RetNode).Enthalpy; + Real64 RecircHumRat = state.dataLoopNodes->Node(this->RetNode).HumRat; + Real64 MixEnth = + (RecircMassFlowRate * RecircEnth + OAMassFlowRate * state.dataLoopNodes->Node(this->OANode).Enthalpy) / MixMassFlowRate; + Real64 MixHumRat = + (RecircMassFlowRate * RecircHumRat + OAMassFlowRate * state.dataLoopNodes->Node(this->OANode).HumRat) / MixMassFlowRate; + Real64 MixTemp = Psychrometrics::PsyTdbFnHW(MixEnth, MixHumRat); + return state.dataLoopNodes->Node(this->MixNode).TempSetPoint - MixTemp; + }; + + General::SolveRoot(state, Acc, MaxIte, SolFla, OASignal, f, OutAirMinFrac, 1.0); + if (SolFla < 0) { + OASignal = OutAirSignal; + } + } + + } else { + OASignal = OutAirSignal; + } + + // Economizer choice "Bypass" forces minimum OA except when high humidity air flow is active based on indoor RH + if (this->EconBypass && EconomizerAirFlowScheduleValue == 0.0) { + OASignal = OutAirMinFrac; + } + + // Set outdoor air signal based on OA flow ratio if high humidity air flow is enabled + if (HighHumidityOperationFlag) { + if (this->MixMassFlow > 0.0) { + // calculate the actual ratio of outside air to mixed air so the magnitude of OA during high humidity control is correct + OASignal = max(OutAirMinFrac, (this->HighRHOAFlowRatio * this->MaxOAMassFlowRate / this->MixMassFlow)); + this->OALimitingFactor = OALimitFactor::HighHum; + } + } + + if (this->CoolCoilFreezeCheck) { + MaximumOAFracBySetPoint = min(max(MaximumOAFracBySetPoint, 0.0), 1.0); + this->MaxOAFracBySetPoint = MaximumOAFracBySetPoint; + + // This should not be messing with OutAirMinFrac, freeze protection should only limit economizer operation + // if (MaximumOAFracBySetPoint < OutAirMinFrac) { + // OutAirMinFrac = MaximumOAFracBySetPoint; + // if (AirLoopNum > 0) AirLoopFlow(AirLoopNum).MinOutAir = OutAirMinFrac * this->MixMassFlow; + //} + if (MaximumOAFracBySetPoint < OASignal) { + OASignal = MaximumOAFracBySetPoint; + this->OALimitingFactor = OALimitFactor::Limits; + } + if (OutAirMinFrac > OASignal) { + OASignal = OutAirMinFrac; + this->OALimitingFactor = OALimitFactor::Limits; + } + } + + if (AirLoopNum > 0) { + + // Set the air loop economizer and high humidity control flags. + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).EconoActive = EconomizerOperationFlag; + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).HighHumCtrlActive = HighHumidityOperationFlag; + if (state.dataAirLoop->AirLoopControlInfo(AirLoopNum).EconomizerFlowLocked) { + this->OAMassFlow = state.dataAirLoop->AirLoopFlow(AirLoopNum).MinOutAir; + state.dataAirLoop->AirLoopFlow(AirLoopNum).OAFrac = this->OAMassFlow / this->MixMassFlow; + state.dataAirLoop->AirLoopFlow(AirLoopNum).OAFlow = this->OAMassFlow; + } + + // Check heat exchanger bypass control + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).HeatRecoveryBypass = false; + this->HeatRecoveryBypassStatus = 0; + if (EconomizerOperationFlag) { + if (this->HeatRecoveryBypassControlType == BypassWhenWithinEconomizerLimits) { + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).HeatRecoveryBypass = true; + this->HeatRecoveryBypassStatus = 1; + } else if (this->HeatRecoveryBypassControlType == BypassWhenOAFlowGreaterThanMinimum) { + Real64 OAMassFlowMin = OutAirMinFrac * state.dataAirLoop->AirLoopFlow(AirLoopNum).DesSupply; + Real64 OAMassFlowActual = OASignal * this->MixMassFlow; + Real64 reasonablySmallMassFlow = 1e-6; + if (OAMassFlowActual > (OAMassFlowMin + reasonablySmallMassFlow)) { + state.dataAirLoop->AirLoopControlInfo(AirLoopNum).HeatRecoveryBypass = true; + this->HeatRecoveryBypassStatus = 1; + } + } + } + } + + // Set economizer report variable and status flag + if (this->Econo == EconoOp::NoEconomizer) { + // No economizer + this->EconomizerStatus = 0; + this->EconoActive = false; + } else { + // With economizer. + if (EconomizerOperationFlag) { + // Economizer is enabled + this->EconomizerStatus = 1; + this->EconoActive = true; + if ((OASignal > OutAirMinFrac) && !HighHumidityOperationFlag) { + this->OALimitingFactor = OALimitFactor::Economizer; + } + } else { + // Economizer is disabled + this->EconomizerStatus = 0; + this->EconoActive = false; + } + } + + // Night ventilation control overrides economizer and high humidity control. + if (AirLoopNightVent) { + OASignal = 1.0; + this->OALimitingFactor = OALimitFactor::NightVent; + } + + // Set high humidity control report variable and status flag + if (HighHumidityOperationFlag) { + this->HighHumCtrlStatus = 1; + this->HighHumCtrlActive = true; + } else { + this->HighHumCtrlStatus = 0; + this->HighHumCtrlActive = false; + } +} +void CalcOAMixer(EnergyPlusData &state, int const OAMixerNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + + // PURPOSE OF THIS SUBROUTINE + // Calculate the mixed air flow and conditions + + // Define a recirculation mass flow rate + Real64 RecircMassFlowRate = state.dataMixedAir->OAMixer(OAMixerNum).RetMassFlowRate - state.dataMixedAir->OAMixer(OAMixerNum).RelMassFlowRate; + // In certain low flow conditions the return air mass flow rate can be below the outside air value established + // by the user. This check will ensure that this condition does not result in unphysical air properties. + if (RecircMassFlowRate < 0.0) { + RecircMassFlowRate = 0.0; + state.dataMixedAir->OAMixer(OAMixerNum).RelMassFlowRate = state.dataMixedAir->OAMixer(OAMixerNum).RetMassFlowRate; + } + + // Pass through the return air conditions to the relief air stream. The return air is "split" to + // the relief air and the recirculation air. + state.dataMixedAir->OAMixer(OAMixerNum).RelTemp = state.dataMixedAir->OAMixer(OAMixerNum).RetTemp; + state.dataMixedAir->OAMixer(OAMixerNum).RelHumRat = state.dataMixedAir->OAMixer(OAMixerNum).RetHumRat; + state.dataMixedAir->OAMixer(OAMixerNum).RelEnthalpy = state.dataMixedAir->OAMixer(OAMixerNum).RetEnthalpy; + state.dataMixedAir->OAMixer(OAMixerNum).RelPressure = state.dataMixedAir->OAMixer(OAMixerNum).RetPressure; + Real64 RecircPressure = state.dataMixedAir->OAMixer(OAMixerNum).RetPressure; + Real64 RecircEnthalpy = state.dataMixedAir->OAMixer(OAMixerNum).RetEnthalpy; + Real64 RecircHumRat = state.dataMixedAir->OAMixer(OAMixerNum).RetHumRat; + // The recirculation air and the outside air are mixed to form the mixed air stream + state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate = state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate + RecircMassFlowRate; + // Check for zero flow + if (state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate <= VerySmallMassFlow) { + state.dataMixedAir->OAMixer(OAMixerNum).MixEnthalpy = state.dataMixedAir->OAMixer(OAMixerNum).RetEnthalpy; + state.dataMixedAir->OAMixer(OAMixerNum).MixHumRat = state.dataMixedAir->OAMixer(OAMixerNum).RetHumRat; + state.dataMixedAir->OAMixer(OAMixerNum).MixPressure = state.dataMixedAir->OAMixer(OAMixerNum).RetPressure; + state.dataMixedAir->OAMixer(OAMixerNum).MixTemp = state.dataMixedAir->OAMixer(OAMixerNum).RetTemp; + return; + } + + state.dataMixedAir->OAMixer(OAMixerNum).MixEnthalpy = + (RecircMassFlowRate * RecircEnthalpy + + state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate * state.dataMixedAir->OAMixer(OAMixerNum).OAEnthalpy) / + state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; + state.dataMixedAir->OAMixer(OAMixerNum).MixHumRat = (RecircMassFlowRate * RecircHumRat + state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate * + state.dataMixedAir->OAMixer(OAMixerNum).OAHumRat) / + state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; + state.dataMixedAir->OAMixer(OAMixerNum).MixPressure = + (RecircMassFlowRate * RecircPressure + + state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate * state.dataMixedAir->OAMixer(OAMixerNum).OAPressure) / + state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; + // Mixed air temperature is calculated from the mixed air enthalpy and humidity ratio. + state.dataMixedAir->OAMixer(OAMixerNum).MixTemp = + Psychrometrics::PsyTdbFnHW(state.dataMixedAir->OAMixer(OAMixerNum).MixEnthalpy, state.dataMixedAir->OAMixer(OAMixerNum).MixHumRat); +} + +// End of Calculation/Simulation Section of the Module +//****************************************************************************** + +// Beginning Sizing Section of the Module +//****************************************************************************** + +void OAControllerProps::SizeOAController(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN September 2001 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine is for sizing OAController Components for which flow rates have not been + // specified in the input. + + // METHODOLOGY EMPLOYED: + // Obtains flow rates from the zone or system sizing arrays. + + // SUBROUTINE PARAMETER DEFINITIONS: + static std::string_view const &CurrentModuleObject(CurrentModuleObjects[static_cast(CMO::OAController)]); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + std::string CoilName; + std::string CoilType; + + bool ErrorsFound = false; + if (this->MaxOA == AutoSize) { + + if (state.dataSize->CurSysNum > 0) { + + switch (this->ControllerType) { + case MixedAirControllerType::ControllerOutsideAir: { + CheckSysSizing(state, CurrentModuleObject, this->Name); + switch (state.dataSize->CurDuctType) { + case DataHVACGlobals::AirDuctType::Cooling: { + this->MaxOA = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesCoolVolFlow; + } break; + case DataHVACGlobals::AirDuctType::Heating: { + this->MaxOA = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesHeatVolFlow; + } break; + case DataHVACGlobals::AirDuctType::Main: + case DataHVACGlobals::AirDuctType::Other: + default: { + this->MaxOA = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesMainVolFlow; + } break; + } + } break; + case MixedAirControllerType::ControllerStandAloneERV: { + } break; + default: + break; + } + + } else if (state.dataSize->CurZoneEqNum > 0) { + + switch (this->ControllerType) { + case MixedAirControllerType::ControllerOutsideAir: { + CheckZoneSizing(state, CurrentModuleObject, this->Name); + this->MaxOA = max(state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum).DesCoolVolFlow, + state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum).DesHeatVolFlow); + } break; + case MixedAirControllerType::ControllerStandAloneERV: { + } break; + default: + break; + } + } + + if (this->MaxOA < SmallAirVolFlow) { + this->MaxOA = 0.0; + } + + BaseSizer::reportSizerOutput(state, CurrentModuleObject, this->Name, "Maximum Outdoor Air Flow Rate [m3/s]", this->MaxOA); + } + + if (this->MinOA == AutoSize) { + + if (state.dataSize->CurSysNum > 0) { + + CheckSysSizing(state, CurrentModuleObject, this->Name); + if (state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesOutAirVolFlow >= SmallAirVolFlow) { + this->MinOA = min(state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesOutAirVolFlow, this->MaxOA); + } else { + this->MinOA = 0.0; + } + } + + BaseSizer::reportSizerOutput(state, CurrentModuleObject, this->Name, "Minimum Outdoor Air Flow Rate [m3/s]", this->MinOA); + + if (this->HumidistatZoneNum > 0 && this->FixedMin) { + if (this->MaxOA > 0.0) { + Real64 OAFlowRatio = this->MinOA / this->MaxOA; + if (this->HighRHOAFlowRatio < OAFlowRatio) { + ShowWarningError(state, format("{} \"{}\"", CurrentModuleObject, this->Name)); + ShowContinueError(state, "... A fixed minimum outdoor air flow rate and high humidity control have been specified."); + ShowContinueError(state, + "... The High Humidity Outdoor Air Flow Ratio is less than the ratio of the outdoor air controllers " + "minimum to maximum outside air flow rate."); + ShowContinueError(state, format("... Controller minimum flow rate = {:.4T} m3/s.", this->MinOA)); + ShowContinueError(state, format("... Controller maximum flow rate = {:.4T} m3/s.", this->MaxOA)); + ShowContinueError(state, format("... Controller minimum to maximum flow ratio = {:.4T}.", OAFlowRatio)); + ShowContinueError(state, format("... High humidity control flow ratio = {:.4T}.", this->HighRHOAFlowRatio)); + } + } + } + } + // If there is an outside air system, loop over components in the OA system; pass the design air flow rate + // to the coil components that don't have design air flow as an input. + if (state.dataSize->CurOASysNum > 0) { + for (int CompNum = 1; CompNum <= state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).NumComponents; ++CompNum) { + std::string const &CompType = state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).ComponentType(CompNum); + std::string const &CompName = state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).ComponentName(CompNum); + if (UtilityRoutines::SameString(CompType, "COIL:COOLING:WATER:DETAILEDGEOMETRY") || + UtilityRoutines::SameString(CompType, "COIL:HEATING:WATER") || + UtilityRoutines::SameString(CompType, "COILSYSTEM:COOLING:WATER:HEATEXCHANGERASSISTED")) { + if (UtilityRoutines::SameString(CompType, "COILSYSTEM:COOLING:WATER:HEATEXCHANGERASSISTED")) { + CoilName = HVACHXAssistedCoolingCoil::GetHXDXCoilName(state, CompType, CompName, ErrorsFound); + CoilType = HVACHXAssistedCoolingCoil::GetHXCoilType(state, CompType, CompName, ErrorsFound); + } else { + CoilName = CompName; + CoilType = CompType; + } + WaterCoils::SetCoilDesFlow(state, CoilType, CoilName, this->MinOA, ErrorsFound); + } + } // End of component loop + } + if (ErrorsFound) { + ShowFatalError(state, "Preceding sizing errors cause program termination"); + } +} + +// End of Sizing Section of the Module +//****************************************************************************** + +// Beginning Update/Reporting Section of the Module +//****************************************************************************** + +void OAControllerProps::UpdateOAController(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + // MODIFIED Shirey/Raustad FSEC, June 2003 + + // PURPOSE OF THIS SUBROUTINE + // Move the results of CalcOAController to the affected nodes + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int OutAirNodeNum = this->OANode; + int InletAirNodeNum = this->InletNode; + int RelAirNodeNum = this->RelNode; + int RetAirNodeNum = this->RetNode; + + if (this->ControllerType == MixedAirControllerType::ControllerOutsideAir) { + // The outside air controller sets the outside air flow rate and the relief air flow rate + if (!state.dataGlobal->WarmupFlag && !state.dataGlobal->DoingSizing && (this->ManageDemand) && + (this->OAMassFlow > this->DemandLimitFlowRate)) { + state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRate = this->DemandLimitFlowRate; + state.dataLoopNodes->Node(InletAirNodeNum).MassFlowRate = this->DemandLimitFlowRate; + state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRateMaxAvail = this->DemandLimitFlowRate; + } else { + state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRate = this->OAMassFlow; + state.dataLoopNodes->Node(InletAirNodeNum).MassFlowRate = this->OAMassFlow; + state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRateMaxAvail = this->OAMassFlow; + } + state.dataLoopNodes->Node(RelAirNodeNum).MassFlowRate = this->RelMassFlow; + } else { + // The ERV controller sets the supply and secondary inlet node information for the Stand Alone ERV + // Currently, the Stand Alone ERV only has constant air flows (supply and exhaust), and these are + // already set in HVACStandAloneERV.cc (subroutine init). Therefore, these flow assignments below are + // currently redundant but may be useful in the future as mass flow rates can vary based on the controller signal. + if (!state.dataGlobal->WarmupFlag && !state.dataGlobal->DoingSizing && (this->ManageDemand) && + (this->OAMassFlow > this->DemandLimitFlowRate)) { + state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRate = this->DemandLimitFlowRate; + state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRateMaxAvail = this->DemandLimitFlowRate; + } else { + state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRate = this->OAMassFlow; + state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRateMaxAvail = this->OAMassFlow; + } + state.dataLoopNodes->Node(RetAirNodeNum).MassFlowRate = state.dataLoopNodes->Node(this->RetNode).MassFlowRate; + state.dataLoopNodes->Node(RetAirNodeNum).MassFlowRateMaxAvail = state.dataLoopNodes->Node(this->RetNode).MassFlowRate; + } +} + +void UpdateOAMixer(EnergyPlusData &state, int const OAMixerNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN Oct 1998 + + // PURPOSE OF THIS SUBROUTINE + // Move the results of CalcOAMixer to the affected nodes + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int MixNode = state.dataMixedAir->OAMixer(OAMixerNum).MixNode; + int RelNode = state.dataMixedAir->OAMixer(OAMixerNum).RelNode; + int RetNode = state.dataMixedAir->OAMixer(OAMixerNum).RetNode; + // Move mixed air data to the mixed air node + state.dataLoopNodes->Node(MixNode).MassFlowRate = state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; + state.dataLoopNodes->Node(MixNode).Temp = state.dataMixedAir->OAMixer(OAMixerNum).MixTemp; + state.dataLoopNodes->Node(MixNode).HumRat = state.dataMixedAir->OAMixer(OAMixerNum).MixHumRat; + state.dataLoopNodes->Node(MixNode).Enthalpy = state.dataMixedAir->OAMixer(OAMixerNum).MixEnthalpy; + state.dataLoopNodes->Node(MixNode).Press = state.dataMixedAir->OAMixer(OAMixerNum).MixPressure; + state.dataLoopNodes->Node(MixNode).MassFlowRateMaxAvail = state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; + // Move the relief air data to the relief air node + state.dataLoopNodes->Node(RelNode).MassFlowRate = state.dataMixedAir->OAMixer(OAMixerNum).RelMassFlowRate; + state.dataLoopNodes->Node(RelNode).Temp = state.dataMixedAir->OAMixer(OAMixerNum).RelTemp; + state.dataLoopNodes->Node(RelNode).HumRat = state.dataMixedAir->OAMixer(OAMixerNum).RelHumRat; + state.dataLoopNodes->Node(RelNode).Enthalpy = state.dataMixedAir->OAMixer(OAMixerNum).RelEnthalpy; + state.dataLoopNodes->Node(RelNode).Press = state.dataMixedAir->OAMixer(OAMixerNum).RelPressure; + state.dataLoopNodes->Node(RelNode).MassFlowRateMaxAvail = state.dataMixedAir->OAMixer(OAMixerNum).RelMassFlowRate; + + if (state.dataContaminantBalance->Contaminant.CO2Simulation) { + state.dataLoopNodes->Node(RelNode).CO2 = state.dataLoopNodes->Node(RetNode).CO2; + if (state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate <= VerySmallMassFlow) { + state.dataLoopNodes->Node(MixNode).CO2 = state.dataLoopNodes->Node(RetNode).CO2; + } else { + state.dataLoopNodes->Node(MixNode).CO2 = + ((state.dataLoopNodes->Node(RetNode).MassFlowRate - state.dataLoopNodes->Node(RelNode).MassFlowRate) * + state.dataLoopNodes->Node(RetNode).CO2 + + state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate * state.dataContaminantBalance->OutdoorCO2) / + state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; + } + } + + if (state.dataContaminantBalance->Contaminant.GenericContamSimulation) { + state.dataLoopNodes->Node(RelNode).GenContam = state.dataLoopNodes->Node(RetNode).GenContam; + if (state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate <= VerySmallMassFlow) { + state.dataLoopNodes->Node(MixNode).GenContam = state.dataLoopNodes->Node(RetNode).GenContam; + } else { + state.dataLoopNodes->Node(MixNode).GenContam = + ((state.dataLoopNodes->Node(RetNode).MassFlowRate - state.dataLoopNodes->Node(RelNode).MassFlowRate) * + state.dataLoopNodes->Node(RetNode).GenContam + + state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate * state.dataContaminantBalance->OutdoorGC) / + state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; + } + } +} + +// End of Sizing Section of the Module +//****************************************************************************** + +// Beginning Utility Section of the Module +//****************************************************************************** + +Array1D_int GetOAMixerNodeNumbers(EnergyPlusData &state, + std::string const &OAMixerName, // must match OA mixer names for the OA mixer type + bool &ErrorsFound // set to true if problem +) +{ + + // FUNCTION INFORMATION: + // AUTHOR Richard Raustad + // DATE WRITTEN June 2006 + + // PURPOSE OF THIS FUNCTION: + // This function looks up the given OA mixer and returns the node numbers. If + // incorrect OA mixer name is given, ErrorsFound is returned as true + // as zero. + + // Return value + Array1D_int OANodeNumbers(4); // return OA mixer nodes + + // Obtains and Allocates OA mixer related parameters from input file + if (state.dataMixedAir->GetOAMixerInputFlag) { // First time subroutine has been entered + GetOAMixerInputs(state); + state.dataMixedAir->GetOAMixerInputFlag = false; + } + + int WhichOAMixer = UtilityRoutines::FindItemInList(OAMixerName, state.dataMixedAir->OAMixer); + if (WhichOAMixer != 0) { + OANodeNumbers(1) = state.dataMixedAir->OAMixer(WhichOAMixer).InletNode; + OANodeNumbers(2) = state.dataMixedAir->OAMixer(WhichOAMixer).RelNode; + OANodeNumbers(3) = state.dataMixedAir->OAMixer(WhichOAMixer).RetNode; + OANodeNumbers(4) = state.dataMixedAir->OAMixer(WhichOAMixer).MixNode; + } + + if (WhichOAMixer == 0) { + ShowSevereError(state, format("GetOAMixerNodeNumbers: Could not find OA Mixer = \"{}\"", OAMixerName)); + ErrorsFound = true; + OANodeNumbers = 0; + } + + return OANodeNumbers; +} + +int GetNumOAMixers(EnergyPlusData &state) +{ + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN October 2006 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the number of OA mixers is returned. + + if (state.dataMixedAir->GetOAMixerInputFlag) { // First time subroutine has been entered + GetOAMixerInputs(state); + state.dataMixedAir->GetOAMixerInputFlag = false; + } + + return state.dataMixedAir->NumOAMixers; +} + +int GetNumOAControllers(EnergyPlusData &state) +{ + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN October 2006 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the number of OA Controllers is returned. + + if (state.dataMixedAir->AllocateOAControllersFlag) { + // Make sure OAControllers are allocated + AllocateOAControllers(state); + } + + return state.dataMixedAir->NumOAControllers; +} + +int GetOAMixerReliefNodeNumber(EnergyPlusData &state, int const OAMixerNum) // Which Mixer +{ + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN October 2006 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the relief node number of indicated mixer is returned. + + if (state.dataMixedAir->GetOAMixerInputFlag) { // First time subroutine has been entered + GetOAMixerInputs(state); + state.dataMixedAir->GetOAMixerInputFlag = false; + } + + if (OAMixerNum > state.dataMixedAir->NumOAMixers) { + ShowFatalError(state, + format("GetOAMixerReliefNodeNumber: Requested Mixer #={}, which is > number of OA Mixers={}", + OAMixerNum, + state.dataMixedAir->NumOAMixers)); + } + + return state.dataMixedAir->OAMixer(OAMixerNum).RelNode; +} + +int GetOASysControllerListIndex(EnergyPlusData &state, int const OASysNumber) // OA Sys Number +{ + + // FUNCTION INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN April 2007 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the Controller List index of the indicated OA System is returned. + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + return state.dataAirLoop->OutsideAirSys(OASysNumber).ControllerListNum; +} + +int GetOASysNumSimpControllers(EnergyPlusData &state, int const OASysNumber) // OA Sys Number +{ + + // FUNCTION INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN April 2007 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the number of Controller:Simple objects in the OA System is returned. + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + return state.dataAirLoop->OutsideAirSys(OASysNumber).NumSimpleControllers; +} + +int GetOASysNumHeatingCoils(EnergyPlusData &state, int const OASysNumber) // OA Sys Number +{ + + // FUNCTION INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN May 2007 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the number of heating coils in the OA System is returned. + + // FUNCTION LOCAL VARIABLE DECLARATIONS: + bool Sim(false); + bool FirstHVACIteration(false); + bool OAHeatingCoil(false); + bool OACoolingCoil(false); + int AirLoopNum(0); + bool OAHX(false); + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + int NumHeatingCoils = 0; + for (int CompNum = 1; CompNum <= state.dataAirLoop->OutsideAirSys(OASysNumber).NumComponents; ++CompNum) { + std::string const &CompType = state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentType(CompNum); + std::string const &CompName = state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentName(CompNum); + SimOAComponent(state, + CompType, + CompName, + state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentTypeEnum(CompNum), + FirstHVACIteration, + state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentIndex(CompNum), + AirLoopNum, + Sim, + OASysNumber, + OAHeatingCoil, + OACoolingCoil, + OAHX); + if (OAHeatingCoil) { + ++NumHeatingCoils; + } + } + + return NumHeatingCoils; +} + +int GetOASysNumHXs(EnergyPlusData &state, int const OASysNumber) +{ + + // FUNCTION INFORMATION: + // AUTHOR Fred Buhl, Rongpeng Zhang + // DATE WRITTEN Oct. 2015 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the number of heat recovery exchangers in the OA System is returned. + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + int NumHX = 0; + + auto const &componentType_Num = state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentTypeEnum; + for (int CompNum = 1; CompNum <= state.dataAirLoop->OutsideAirSys(OASysNumber).NumComponents; ++CompNum) { + SimAirServingZones::CompType const componentTypeNum = componentType_Num(CompNum); + if (SimAirServingZones::CompType::HeatXchngr == componentTypeNum || SimAirServingZones::CompType::Desiccant == componentTypeNum) { + ++NumHX; + } + } + + return NumHX; +} + +int GetOASysNumCoolingCoils(EnergyPlusData &state, int const OASysNumber) // OA Sys Number +{ + + // FUNCTION INFORMATION: + // AUTHOR Fred Buhl + // DATE WRITTEN May 2007 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the number of cooling coils in the OA System is returned. + + // FUNCTION LOCAL VARIABLE DECLARATIONS: + bool Sim(false); + bool FirstHVACIteration(false); + bool OAHeatingCoil(false); + bool OACoolingCoil(false); + int AirLoopNum(0); + bool OAHX(false); + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + int NumCoolingCoils = 0; + for (int CompNum = 1; CompNum <= state.dataAirLoop->OutsideAirSys(OASysNumber).NumComponents; ++CompNum) { + std::string const &CompType = state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentType(CompNum); + std::string const &CompName = state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentName(CompNum); + SimOAComponent(state, + CompType, + CompName, + state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentTypeEnum(CompNum), + FirstHVACIteration, + state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentIndex(CompNum), + AirLoopNum, + Sim, + OASysNumber, + OAHeatingCoil, + OACoolingCoil, + OAHX); + if (OACoolingCoil) { + ++NumCoolingCoils; + } + } + + return NumCoolingCoils; +} + +int GetOASystemNumber(EnergyPlusData &state, std::string const &OASysName) // OA Sys Name +{ + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN October 2006 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the OA System number of indicated OA System is returned. + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + return UtilityRoutines::FindItemInList(OASysName, state.dataAirLoop->OutsideAirSys); +} + +int FindOAMixerMatchForOASystem(EnergyPlusData &state, int const OASysNumber) // Which OA System +{ + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN October 2006 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the matched mixer number is found. + // Note -- only the first is looked at for an Outside Air System. + + if (state.dataMixedAir->GetOAMixerInputFlag) { + GetOAMixerInputs(state); + state.dataMixedAir->GetOAMixerInputFlag = false; + } + + int OAMixerNumber = 0; + if (OASysNumber > 0 && OASysNumber <= state.dataAirLoop->NumOASystems) { + for (int OACompNum = 1; OACompNum <= state.dataAirLoop->OutsideAirSys(OASysNumber).NumComponents; ++OACompNum) { + if (UtilityRoutines::SameString(state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentType(OACompNum), "OUTDOORAIR:MIXER")) { + OAMixerNumber = UtilityRoutines::FindItemInList(state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentName(OACompNum), + state.dataMixedAir->OAMixer); + break; + } + } + } + + return OAMixerNumber; +} + +int GetOAMixerIndex(EnergyPlusData &state, std::string const &OAMixerName) // Which Mixer +{ + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN December 2010 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the mixer index of indicated mixer is returned. + + if (state.dataMixedAir->GetOAMixerInputFlag) { + GetOAMixerInputs(state); + state.dataMixedAir->GetOAMixerInputFlag = false; + } + + int OAMixerIndex = UtilityRoutines::FindItem(OAMixerName, state.dataMixedAir->OAMixer); + + if (OAMixerIndex == 0) { + ShowSevereError(state, format("GetOAMixerIndex: Could not find OutdoorAir:Mixer, Name=\"{}\"", OAMixerName)); + } + + return OAMixerIndex; +} + +int GetOAMixerInletNodeNumber(EnergyPlusData &state, int const OAMixerNumber) // Which Mixer +{ + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN October 2006 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the mixer inlet node number of indicated mixer is returned. + + if (state.dataMixedAir->GetOAMixerInputFlag) { + GetOAMixerInputs(state); + state.dataMixedAir->GetOAMixerInputFlag = false; + } + + int OAMixerInletNodeNumber = 0; + if (OAMixerNumber > 0 && OAMixerNumber <= state.dataMixedAir->NumOAMixers) { + OAMixerInletNodeNumber = state.dataMixedAir->OAMixer(OAMixerNumber).InletNode; + } + + return OAMixerInletNodeNumber; +} + +int GetOAMixerReturnNodeNumber(EnergyPlusData &state, int const OAMixerNumber) // Which Mixer +{ + + // FUNCTION INFORMATION: + // AUTHOR Brent Griffith + // DATE WRITTEN December 2006 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the mixer return node number of indicated mixer is returned. + + // METHODOLOGY EMPLOYED: + // followed Linda Lawrie's GetOAMixerInletNodeNumber + + if (state.dataMixedAir->GetOAMixerInputFlag) { + GetOAMixerInputs(state); + state.dataMixedAir->GetOAMixerInputFlag = false; + } + + int OAMixerReturnNodeNumber = 0; + if (OAMixerNumber > 0 && OAMixerNumber <= state.dataMixedAir->NumOAMixers) { + OAMixerReturnNodeNumber = state.dataMixedAir->OAMixer(OAMixerNumber).RetNode; + } + + return OAMixerReturnNodeNumber; +} + +int GetOAMixerMixedNodeNumber(EnergyPlusData &state, int const OAMixerNumber) // Which Mixer +{ + + // FUNCTION INFORMATION: + // AUTHOR Brent Griffith + // DATE WRITTEN December 2006 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the mixer mixed air node number of indicated mixer is returned. + + if (state.dataMixedAir->GetOAMixerInputFlag) { + GetOAMixerInputs(state); + state.dataMixedAir->GetOAMixerInputFlag = false; + } + + int OAMixerMixedNodeNumber = 0; + if (OAMixerNumber > 0 && OAMixerNumber <= state.dataMixedAir->NumOAMixers) { + OAMixerMixedNodeNumber = state.dataMixedAir->OAMixer(OAMixerNumber).MixNode; + } + + return OAMixerMixedNodeNumber; +} + +bool CheckForControllerWaterCoil(EnergyPlusData &state, + DataAirLoop::ControllerKind ControllerType, // should be passed in as UPPERCASE + std::string const &ControllerName // should be passed in as UPPERCASE +) +{ + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN May 2009 + + // PURPOSE OF THIS FUNCTION: + // This routine checks the controller list for existance of the reference coil. + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + int OnControllerList = false; + + for (int Num = 1; Num <= state.dataMixedAir->NumControllerLists; ++Num) { + for (int CompNum = 1; CompNum <= state.dataMixedAir->ControllerLists(Num).NumControllers; ++CompNum) { + + if (state.dataMixedAir->ControllerLists(Num).ControllerType(CompNum) != ControllerType) continue; + if (!UtilityRoutines::SameString(state.dataMixedAir->ControllerLists(Num).ControllerName(CompNum), ControllerName)) continue; + OnControllerList = true; + break; + } + } + + return OnControllerList; +} + +void CheckControllerLists(EnergyPlusData &state, bool &ErrFound) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN May 2009 + + // PURPOSE OF THIS SUBROUTINE: + // This routine checks for a "dangling" controller list (AirLoopHVAC:ControllerList). + // It must be either found on a AirLoopHVAC or AirLoopHVAC:OutdoorAirSystem. + + // SUBROUTINE PARAMETER DEFINITIONS: + static std::string const CurrentModuleObject("AirLoopHVAC:ControllerList"); + static std::string const AirLoopObject("AirLoopHVAC"); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int NumAlphas; + int NumNumbers; + int IOStat; + int Count; + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + int NumControllers = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); + int NumAirLoop = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, AirLoopObject); + std::string_view AirLoopName = ""; + + for (int Item = 1; Item <= NumControllers; ++Item) { + + state.dataInputProcessing->inputProcessor->getObjectItem( + state, CurrentModuleObject, Item, state.dataIPShortCut->cAlphaArgs, NumAlphas, state.dataIPShortCut->rNumericArgs, NumNumbers, IOStat); + std::string const ControllerListName = state.dataIPShortCut->cAlphaArgs(1); + Count = 0; + + // Check AirLoopHVAC -- brute force, get each AirLoopHVAC + + for (int Loop = 1; Loop <= NumAirLoop; ++Loop) { + state.dataInputProcessing->inputProcessor->getObjectItem( + state, AirLoopObject, Loop, state.dataIPShortCut->cAlphaArgs, NumAlphas, state.dataIPShortCut->rNumericArgs, NumNumbers, IOStat); + if (state.dataIPShortCut->cAlphaArgs(2) != ControllerListName) continue; + if (++Count == 1) AirLoopName = state.dataIPShortCut->cAlphaArgs(1); + } + + // Now check AirLoopHVAC and AirLoopHVAC:OutdoorAirSystem + int Found = 0; + if (state.dataAirLoop->NumOASystems > 0) { + Found = UtilityRoutines::FindItemInList(ControllerListName, state.dataAirLoop->OutsideAirSys, &OutsideAirSysProps::ControllerListName); + if (Found > 0) ++Count; + } + + if (Count == 0) { + ShowSevereError(state, + format("{}=\"{}\" is not referenced on a AirLoopHVAC or AirLoopHVAC:OutdoorAirSystem object.", + CurrentModuleObject, + ControllerListName)); + ErrFound = true; + } else if (Count > 1) { + ShowSevereError(state, + format("{}=\"{}\" has too many references on AirLoopHVAC or AirLoopHVAC:OutdoorAirSystem objects.", + CurrentModuleObject, + ControllerListName)); + if (Found > 0) { + ShowContinueError(state, format("...AirLoopHVAC:OutdoorAirSystem=\"{}\".", state.dataAirLoop->OutsideAirSys(Found).Name)); + } + ShowContinueError(state, format("...also on AirLoopHVAC=\"{}\".", AirLoopName)); + ErrFound = true; + } + } +} + +void CheckOAControllerName( + EnergyPlusData &state, std::string &OAControllerName, std::string const &ObjectType, std::string const &FieldName, bool &ErrorsFound) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN October 2006 + + // PURPOSE OF THIS SUBROUTINE: + // When OA Controller data is gotten from other routines, must check to make sure + // new name doesn't duplicate. (Essentially a pass through to call Verify Name) + // Currently, this is only called from HVACStandAlongERV::GetStandaloneERV() + + if (state.dataMixedAir->AllocateOAControllersFlag) { + // Make sure OAControllers are allocated + AllocateOAControllers(state); + } + + GlobalNames::VerifyUniqueInterObjectName( + state, state.dataMixedAir->OAControllerUniqueNames, OAControllerName, ObjectType, FieldName, ErrorsFound); +} + +void OAControllerProps::Checksetpoints(EnergyPlusData &state, + Real64 const OutAirMinFrac, // Local variable used to calculate min OA fraction + Real64 &OutAirSignal, // Used to set OA mass flow rate + bool &EconomizerOperationFlag // logical used to show economizer status +) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Amit bhansali + // DATE WRITTEN August 2008? + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine checks the setpoints of the upper limits of temperatures, limit enthalpy + // Limit dew point, Enthalpy curve + + if (this->TempLim != BlankNumeric && this->OATemp > this->TempLim) { + OutAirSignal = OutAirMinFrac; + EconomizerOperationFlag = false; + } + // Outside air enthalpy limit + if (this->EnthLim != BlankNumeric && this->OAEnth > this->EnthLim) { + OutAirSignal = OutAirMinFrac; + EconomizerOperationFlag = false; + } + + if (this->DPTempLim != BlankNumeric) { + Real64 OADPTemp = Psychrometrics::PsyTdpFnWPb(state, this->OAHumRat, this->OAPress); + if (OADPTemp > this->DPTempLim) { + OutAirSignal = OutAirMinFrac; + EconomizerOperationFlag = false; + } + } + + if (this->EnthalpyCurvePtr > 0) { + if (this->OAHumRat > Curve::CurveValue(state, this->EnthalpyCurvePtr, this->OATemp)) { + OutAirSignal = OutAirMinFrac; + EconomizerOperationFlag = false; + } + } +} + +int GetNumOASystems(EnergyPlusData &state) +{ + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN November 2010 + + // PURPOSE OF THIS FUNCTION: + // Get Number of OA Systems, After making sure get input is done + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + return state.dataAirLoop->NumOASystems; +} + +int GetOACompListNumber(EnergyPlusData &state, int const OASysNum) // OA Sys Number +{ + + // FUNCTION INFORMATION: + // AUTHOR Heejin Cho + // DATE WRITTEN November 2010 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the OA System number of indicated OA System is returned. + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + return state.dataAirLoop->OutsideAirSys(OASysNum).NumComponents; +} + +std::string GetOACompName(EnergyPlusData &state, + int const OASysNum, // OA Sys Number + int const InListNum // In-list Number +) +{ + + // FUNCTION INFORMATION: + // AUTHOR Heejin Cho + // DATE WRITTEN November 2010 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the number of heating coils in the OA System is returned. + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + return state.dataAirLoop->OutsideAirSys(OASysNum).ComponentName(InListNum); +} + +std::string GetOACompType(EnergyPlusData &state, + int const OASysNum, // OA Sys Number + int const InListNum // In-list Number +) +{ + + // FUNCTION INFORMATION: + // AUTHOR Heejin Cho + // DATE WRITTEN November 2010 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the number of heating coils in the OA System is returned. + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + return state.dataAirLoop->OutsideAirSys(OASysNum).ComponentType(InListNum); +} + +SimAirServingZones::CompType GetOACompTypeNum(EnergyPlusData &state, + int const OASysNum, // OA Sys Number + int const InListNum // In-list Number +) +{ + + // FUNCTION INFORMATION: + // AUTHOR Heejin Cho + // DATE WRITTEN November 2010 + + // PURPOSE OF THIS FUNCTION: + // After making sure get input is done, the number of heating coils in the OA System is returned. + + if (state.dataMixedAir->GetOASysInputFlag) { + GetOutsideAirSysInputs(state); + state.dataMixedAir->GetOASysInputFlag = false; + } + + return state.dataAirLoop->OutsideAirSys(OASysNum).ComponentTypeEnum(InListNum); +} + +int GetOAMixerNumber(EnergyPlusData &state, std::string const &OAMixerName // must match OA mixer names for the OA mixer type +) +{ + + // FUNCTION INFORMATION: + // AUTHOR Lixing Gu + // DATE WRITTEN Feb. 2018 + + // PURPOSE OF THIS FUNCTION: + // This function looks up the given OA mixer and returns the OAMixer number. If + // incorrect OA mixer name is given, ErrorsFound is returned as true + + // Obtains and Allocates OA mixer related parameters from input file + if (state.dataMixedAir->GetOAMixerInputFlag) { // First time subroutine has been entered + GetOAMixerInputs(state); + state.dataMixedAir->GetOAMixerInputFlag = false; + } + + return UtilityRoutines::FindItemInList(OAMixerName, state.dataMixedAir->OAMixer); +} +// End of Utility Section of the Module +//****************************************************************************** + +} // namespace EnergyPlus::MixedAir diff --git a/src/EnergyPlus/MixedAir.hh.bak b/src/EnergyPlus/MixedAir.hh.bak new file mode 100644 index 00000000000..9596783a5d7 --- /dev/null +++ b/src/EnergyPlus/MixedAir.hh.bak @@ -0,0 +1,600 @@ +// EnergyPlus, Copyright (c) 1996-2023, The Board of Trustees of the University of Illinois, +// The Regents of the University of California, through Lawrence Berkeley National Laboratory +// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge +// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other +// contributors. All rights reserved. +// +// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the +// U.S. Government consequently retains certain rights. As such, the U.S. Government has been +// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, +// worldwide license in the Software to reproduce, distribute copies to the public, prepare +// derivative works, and perform publicly and display publicly, and to permit others to do so. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted +// provided that the following conditions are met: +// +// (1) Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// (2) Redistributions in binary form must reproduce the above copyright notice, this list of +// conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, +// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific prior +// written permission. +// +// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form +// without changes from the version obtained under this License, or (ii) Licensee makes a +// reference solely to the software portion of its product, Licensee must refer to the +// software as "EnergyPlus version X" software, where "X" is the version number Licensee +// obtained under this License and may not use a different name for the software. Except as +// specifically required in this Section (4), Licensee shall not use in a company name, a +// product name, in advertising, publicity, or other promotional activities any name, trade +// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly +// similar designation, without the U.S. Department of Energy's prior written consent. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +#ifndef MixedAir_hh_INCLUDED +#define MixedAir_hh_INCLUDED + +// C++ Headers +#include + +// ObjexxFCL Headers +#include + +// EnergyPlus Headers +#include +#include +#include +#include +#include +#include +#include +#include + +namespace EnergyPlus { + +// Forward declarations +struct EnergyPlusData; + +namespace MixedAir { + + // Data + // MODULE PARAMETER DEFINITIONS + + enum class LockoutType + { + Invalid = -1, + NoLockoutPossible, + LockoutWithHeatingPossible, + LockoutWithCompressorPossible, + Num + }; + + enum class EconoOp + { + Invalid = -1, + NoEconomizer, + FixedDryBulb, + FixedEnthalpy, + DifferentialDryBulb, + DifferentialEnthalpy, + FixedDewPointAndDryBulb, + ElectronicEnthalpy, + DifferentialDryBulbAndEnthalpy, + Num + }; + + enum class MixedAirControllerType + { + Invalid = -1, + ControllerOutsideAir, + ControllerStandAloneERV, + Num, + }; + + // Parameters below (CMO - Current Module Object. used primarily in Get Inputs) + // Multiple Get Input routines in this module or these would be in individual routines. + enum class CMO + { + Invalid = -1, + None, + OASystem, + AirLoopEqList, + ControllerList, + SysAvailMgrList, + OAController, + ERVController, + MechVentilation, + OAMixer, + Num, + }; + + // OA Controller Limiting Factor + // Must keep these values to use for integer output variable OAControllerProps::OALimitingFactorReport + enum class OALimitFactor + { + Invalid = -1, + None = 0, // No limit other than fixed OA amount + Limits = 1, // Limits and scheduled limits + Economizer = 2, // Economizer operation + Exhaust = 3, // Exhaust flow + MixedAir = 4, // Mixed air flow rate + HighHum = 5, // High humidity economizer control + DCV = 6, // Demand-controlled ventilation + NightVent = 7, // Night ventilation + DemandLimit = 8, // Demand-limiting + EMS = 9, // EMS override + Num + }; + + extern const std::array(CMO::Num)> CurrentModuleObjects; + + struct ControllerListProps + { + // Members + std::string Name; + int NumControllers = 0; // number of controllers on list + EPVector ControllerType; + Array1D_string ControllerName; + }; + + struct OAControllerProps // Derived type for Outside Air Controller data + { + // Members + std::string Name; + MixedAirControllerType ControllerType = MixedAirControllerType::Invalid; // Mixed air controller type + LockoutType Lockout = LockoutType::NoLockoutPossible; // 0=NoLockoutPossible; 1=LockoutWithHeatingPossible; + // 2=LockoutWithCompressorPossible; + bool FixedMin = true; // Fixed Minimum or Proportional Minimum + Real64 TempLim = 0.0; // Temperature Limit + Real64 TempLowLim = 0.0; // Temperature Lower Limit + Real64 EnthLim = 0.0; // Enthalpy Limit + Real64 DPTempLim = 0.0; // Dew Point Temperature Limit + int EnthalpyCurvePtr = 0; // Electronic Enthalpy Curve Index (max HumRat = f[OAT]) + Real64 MinOA = 0.0; // Minimum outside air flow (m3/sec) + Real64 MaxOA = 0.0; // Maximum outside air flow (m3/sec) + EconoOp Econo = EconoOp::NoEconomizer; // 0 = NoEconomizer, 1 = FixedDryBulb, 2 = FixedEnthalpy, 3=DifferentialDryBulb, + // 4=DifferentialEnthalpy, 5=FixedDewPointAndDryBulb, 6 = ElectronicEnthalpy, + // 7 =DifferentialDryBulbAndEnthalpy + bool EconBypass = false; // ModulateFlow =FALSE , MinimumFlowWithBypass =TRUE + int MixNode = 0; // Controlled node (mixed air node) + int OANode = 0; // Actuated node (outside air node) + int InletNode = 0; // Inlet Air Node for into Mixer (BTG Nov 2004) + int RelNode = 0; // Relief Air Node Number + int RetNode = 0; // Return Air Node Number + std::string MinOASch; // Name of the minimum outside air schedule + int MinOASchPtr = 0; // Index to the minimum outside air schedule + Real64 RelMassFlow = 0.0; + Real64 OAMassFlow = 0.0; + Real64 ExhMassFlow = 0.0; + Real64 MixMassFlow = 0.0; + Real64 InletTemp = 0.0; + Real64 InletEnth = 0.0; + Real64 InletPress = 0.0; + Real64 InletHumRat = 0.0; + Real64 OATemp = 0.0; + Real64 OAEnth = 0.0; + Real64 OAPress = 0.0; + Real64 OAHumRat = 0.0; + Real64 RetTemp = 0.0; + Real64 RetEnth = 0.0; + Real64 MixSetTemp = 0.0; + Real64 MinOAMassFlowRate = 0.0; // Minimum outside air flow (kg/s) + Real64 MaxOAMassFlowRate = 0.0; // Maximum outside air flow (kg/s) + Real64 RelTemp = 0.0; + Real64 RelEnth = 0.0; + Real64 RelSensiLossRate = 0.0; // Heat lost to ambient from relief air (W) + Real64 RelLatentLossRate = 0.0; + Real64 RelTotalLossRate = 0.0; + + int ZoneEquipZoneNum = 0; + std::string VentilationMechanicalName; // Name of ventilation:mechanical object used for DCV + int VentMechObjectNum = 0; // Index to VENTILATION:MECHANICAL object for this controller + int HumidistatZoneNum = 0; // zone number where humidistat is located + int NodeNumofHumidistatZone = 0; // node number of zone where humidistat is located + Real64 HighRHOAFlowRatio = 1.0; // Modify ratio with respect to maximum outdoor air flow rate (high RH) + bool ModifyDuringHighOAMoisture = false; // flag to Modify outdoor air flow, TRUE when modify any time, FALSE when modify only when indoor air + // humrat is less than outdoor HR + int EconomizerOASchedPtr = 0; // schedule to modify outdoor air flow + std::string MinOAflowSch; // Name of the Minimum fraction of Design/Mixed Mass of air + std::string MaxOAflowSch; // Name of the Maximum fraction of Design/Mixed Mass of air + int MinOAflowSchPtr = 0; // Index to the Minimum Fraction of Outdoor Air Schedule + int MaxOAflowSchPtr = 0; // Index to the Maximum Fraction of Outdoor Air Schedule + // Economizer Status, which is currently following the EconomizerOperationFlag, might be something like "Economizer status + // indicates when the conditions are favorable for the economizer to operate (i.e., none of the control limits have been exceeded). + // While this status signal indicates favorable conditions for economizer operation, it does not guarantee that the air-side + // economizer has increased outdoor air flow above the minimum level since the actual outdoor air flow rate is also governed + // by other controls (e.g., mixed air setpoint temperature, time of day economizer control, etc.). + int EconomizerStatus = 0; // Air Economizer status (1 = on, 0 = off or economizer not exists) + int HeatRecoveryBypassStatus = 0; // OA Sys Heat Recovery Bypass status (1 = on, 0 = off or economizer not exists) + int HRHeatingCoilActive = 0; // OA Sys Heat Recovery Heating Coil Was Active status (1 = on, 0 = off) + Real64 MixedAirTempAtMinOAFlow = 0.0; // calculated mixed air temp at min flow rate when using special HX bypass control + int HighHumCtrlStatus = 0; // High Humidity Control status (1 = on, 0 = off or high hum ctrl not used) + Real64 OAFractionRpt = 0.0; // Actual outdoor air fraction for reporting (based on mixed air flow rate), + // 0 to 1 (normally) + Real64 MinOAFracLimit = 0.0; // Minimum OA fraction limit + Real64 MechVentOAMassFlowRequest = 0.0; // outside air mass flow rate calculated by mechanical ventilation object [kg/s] + bool EMSOverrideOARate = false; // if true, EMS is calling to override OA rate + Real64 EMSOARateValue = 0.0; // Value EMS is directing to use. [kg/s] + int HeatRecoveryBypassControlType = + DataHVACGlobals::BypassWhenWithinEconomizerLimits; // User input selects type of heat recovery optimization + bool ManageDemand = false; // Used by demand manager to manage ventilation + Real64 DemandLimitFlowRate = 0.0; // Current demand limit if demand manager is ON + Real64 MaxOAFracBySetPoint = 0.0; // The maximum OA fraction due to freezing cooling coil check + int MixedAirSPMNum = 0; // index of mixed air setpoint manager + bool CoolCoilFreezeCheck = false; // if true, cooling coil freezing is prevented by recalculating the amount of OA + bool EconoActive = false; // if true economizer is active + bool HighHumCtrlActive = false; // if true high humidity control is active + Array1D_int EconmizerFaultNum; // index to economizer fault + int NumFaultyEconomizer = 0; // total number of economizer faults + int CountMechVentFrac = 0; // Count when OA min fraction > mech vent fraction + int IndexMechVentFrac = 0; // Index when OA min fraction > mech vent fraction + OALimitFactor OALimitingFactor = OALimitFactor::Invalid; // OA controller limiting factor + int OALimitingFactorReport = 0; // OA controller limiting factor - integer for reporting + + void CalcOAController(EnergyPlusData &state, int const AirLoopNum, bool const FirstHVACIteration); + + void CalcOAEconomizer(EnergyPlusData &state, + int const AirLoopNum, + Real64 const OutAirMinFrac, + Real64 &OASignal, + bool &HighHumidityOperationFlag, + bool const FirstHVACIteration); + + void SizeOAController(EnergyPlusData &state); + + void UpdateOAController(EnergyPlusData &state); + + void Checksetpoints(EnergyPlusData &state, + Real64 const OutAirMinFrac, // Local variable used to calculate min OA fraction + Real64 &OutAirSignal, // Used to set OA mass flow rate + bool &EconomizerOperationFlag // logical used to show economizer status + ); + }; + + struct VentilationMechanicalZoneProps + { + std::string name; // name of mech vent zone + int zoneNum = 0; // Actual zones number + Real64 ZoneOAAreaRate = 0.0; // Mechanical ventilation rate (m3/s/m2) for each zone + Real64 ZoneOAPeopleRate = 0.0; // Mechanical ventilation rate (m3/s/person) for each zone + Real64 ZoneOAFlowRate = 0.0; // OA Flow Rate (m3/s/zone) for each zone + Real64 ZoneOAACHRate = 0.0; // OA ACH (m3/s/volume) for each zone + int ZoneDesignSpecOAObjIndex = 0; // index of the design specification outdoor air object for each zone + std::string ZoneDesignSpecOAObjName; // name of the design specification outdoor air object for each zone + Real64 ZoneADEffCooling = 1.0; // Zone air distribution effectiveness in cooling mode for each zone + Real64 ZoneADEffHeating = 1.0; // Zone air distribution effectiveness in heating mode for each zone + int ZoneADEffSchPtr = 0; // Pointer to the zone air distribution effectiveness schedule for each zone + int ZoneDesignSpecADObjIndex = 0; // index of the design specification zone air distribution object for each zone + std::string ZoneDesignSpecADObjName; // name of the design specification zone air distribution object for each zone + Real64 ZoneSecondaryRecirculation = 0.0; // zone air secondary recirculation ratio for each zone + DataSizing::OAFlowCalcMethod ZoneOAFlowMethod = DataSizing::OAFlowCalcMethod::PerPerson; // OA flow method for each zone + int ZoneOASchPtr = 0; // Index to the outdoor air schedule for each zone (from DesignSpecification:OutdoorAir or default) + Real64 OAPropCtlMinRateSchPtr = 0; // Outdoor design OA flow rate schedule from DesignSpecification:OutdoorAir + }; + + struct VentilationMechanicalProps // Derived type for Ventilation:Mechanical data + { + // Members + std::string Name; // Name of Ventilation:Mechanical object + std::string SchName; // Name of the mechanical ventilation schedule + int SchPtr = 0; // Index to the mechanical ventilation schedule + bool DCVFlag = false; // if true, implement OA based on demand controlled ventilation + int NumofVentMechZones = 0; // Number of zones with mechanical ventilation + Real64 TotAreaOAFlow = 0.0; // Total outdoor air flow rate for all zones per area (m3/s/m2) + Real64 TotPeopleOAFlow = 0.0; // Total outdoor air flow rate for all PEOPLE objects in zones (m3/s) + Real64 TotZoneOAFlow = 0.0; // Total outdoor air flow rate for all zones (m3/s) + Real64 TotZoneOAACH = 0.0; // Total outdoor air flow rate for all zones Air Changes per hour (m3/s/m3) + DataSizing::SysOAMethod SystemOAMethod = DataSizing::SysOAMethod::Invalid; // System Outdoor Air Method - SOAM_ZoneSum, SOAM_VRP, SOAM_VRPL + Real64 ZoneMaxOAFraction = 1.0; // Zone maximum outdoor air fraction + int CO2MaxMinLimitErrorCount = 0; // Counter when max CO2 concentration < min CO2 concentration for SOAM_ProportionalControlSchOcc + int CO2MaxMinLimitErrorIndex = 0; // Index for max CO2 concentration < min CO2 concentration recurring error message for + // SOAM_ProportionalControlSchOcc + int CO2GainErrorCount = 0; // Counter when CO2 generation from people is zero for SOAM_ProportionalControlSchOcc + int CO2GainErrorIndex = 0; // Index for recurring error message when CO2 generation from people is zero for SOAM_ProportionalControlSchOcc + int OAMaxMinLimitErrorCount = 0; // Counter when max OA < min OA for SOAM_ProportionalControlDesOARate + int OAMaxMinLimitErrorIndex = 0; // Index for max OA < min OA recurring error message for SOAM_ProportionalControlDesOARate + Real64 Ep = 1.0; // zone primary air fraction + Real64 Er = 0.0; // zone secondary recirculation fraction + Real64 Fa = 1.0; // temporary variable used in multi-path VRP calc + Real64 Fb = 1.0; + Real64 Fc = 1.0; + Real64 Xs = 1.0; // uncorrected system outdoor air fraction + Real64 Evz = 1.0; // zone ventilation efficiency + Real64 SysDesOA = 0.0; // System design OA + EPVector VentMechZone; + + Real64 CalcMechVentController(EnergyPlusData &state, + Real64 SysSA // System supply air mass flow rate [kg/s] + ); + }; + + struct OAMixerProps // Derived type for Outside Air Mixing Component + { + // Members + std::string Name; + int MixerIndex = 0; // Set on first call... + int MixNode = 0; // Outlet node - mixed air + int InletNode = 0; // Inlet node for outside air stream (Nov. 2004 BTG was OANode ) + int RelNode = 0; // Outlet node - relief air + int RetNode = 0; // Inlet node - return air + Real64 MixTemp = 0.0; + Real64 MixHumRat = 0.0; + Real64 MixEnthalpy = 0.0; + Real64 MixPressure = 0.0; + Real64 MixMassFlowRate = 0.0; + Real64 OATemp = 0.0; + Real64 OAHumRat = 0.0; + Real64 OAEnthalpy = 0.0; + Real64 OAPressure = 0.0; + Real64 OAMassFlowRate = 0.0; + Real64 RelTemp = 0.0; + Real64 RelHumRat = 0.0; + Real64 RelEnthalpy = 0.0; + Real64 RelPressure = 0.0; + Real64 RelMassFlowRate = 0.0; + Real64 RetTemp = 0.0; + Real64 RetHumRat = 0.0; + Real64 RetEnthalpy = 0.0; + Real64 RetPressure = 0.0; + Real64 RetMassFlowRate = 0.0; + }; + + // Functions + + Real64 OAGetFlowRate(EnergyPlusData &state, int OAPtr); + + Real64 OAGetMinFlowRate(EnergyPlusData &state, int OAPtr); + + void OASetDemandManagerVentilationState(EnergyPlusData &state, int OAPtr, bool aState); + + void OASetDemandManagerVentilationFlow(EnergyPlusData &state, int OAPtr, Real64 aFlow); + + int GetOAController(EnergyPlusData &state, std::string const &OAName); + + void + ManageOutsideAirSystem(EnergyPlusData &state, std::string const &OASysName, bool const FirstHVACIteration, int const AirLoopNum, int &OASysNum); + + void SimOutsideAirSys(EnergyPlusData &state, int const OASysNum, bool const FirstHVACIteration, int const AirLoopNum); + + void SimOASysComponents(EnergyPlusData &state, int const OASysNum, bool const FirstHVACIteration, int const AirLoopNum); + + void SimOAComponent(EnergyPlusData &state, + std::string const &CompType, // the component type + std::string const &CompName, // the component Name + SimAirServingZones::CompType const CompTypeNum, // Component Type -- Integerized for this module + bool const FirstHVACIteration, + int &CompIndex, + int const AirLoopNum, // air loop index for economizer lockout coordination + bool const Sim, // if TRUE, simulate component; if FALSE, just set the coil exisitence flags + int const OASysNum, // index to outside air system + bool &OAHeatingCoil, // TRUE indicates a heating coil has been found + bool &OACoolingCoil, // TRUE indicates a cooling coil has been found + bool &OAHX); // TRUE indicates a heat exchanger has been found + + void SimOAMixer(EnergyPlusData &state, std::string const &CompName, int &CompIndex); + + void SimOAController(EnergyPlusData &state, std::string const &CtrlName, int &CtrlIndex, bool const FirstHVACIteration, int const AirLoopNum); + + // Get Input Section of the Module + //****************************************************************************** + + void GetOutsideAirSysInputs(EnergyPlusData &state); + + void GetOAControllerInputs(EnergyPlusData &state); + + void AllocateOAControllers(EnergyPlusData &state); + + void GetOAMixerInputs(EnergyPlusData &state); + + void ProcessOAControllerInputs(EnergyPlusData &state, + std::string_view const CurrentModuleObject, + int const OutAirNum, + Array1D_string const &AlphArray, + int &NumAlphas, + Array1D const &NumArray, + int &NumNums, + Array1D_bool const &lNumericBlanks, // Unused + Array1D_bool const &lAlphaBlanks, + Array1D_string const &cAlphaFields, + Array1D_string const &cNumericFields, // Unused + bool &ErrorsFound // If errors found in input + ); + + // End of Get Input subroutines for the Module + //****************************************************************************** + + // Beginning Initialization Section of the Module + //****************************************************************************** + + void InitOutsideAirSys(EnergyPlusData &state, int const OASysNum, int const AirLoopNum); + + void InitOAController(EnergyPlusData &state, int const OAControllerNum, bool const FirstHVACIteration, int const AirLoopNum); + + void InitOAMixer(EnergyPlusData &state, int const OAMixerNum); + + // End of Initialization Section of the Module + //****************************************************************************** + + // Beginning Calculation Section of the Module + //****************************************************************************** + + void CalcOAMixer(EnergyPlusData &state, int const OAMixerNum); + + // End of Calculation/Simulation Section of the Module + //****************************************************************************** + + // Beginning Sizing Section of the Module + //****************************************************************************** + + // End of Sizing Section of the Module + //****************************************************************************** + + // Beginning Update/Reporting Section of the Module + //****************************************************************************** + + void UpdateOAMixer(EnergyPlusData &state, int const OAMixerNum); + + // End of Sizing Section of the Module + //****************************************************************************** + + // Beginning Utility Section of the Module + //****************************************************************************** + + Array1D_int GetOAMixerNodeNumbers(EnergyPlusData &state, + std::string const &OAMixerName, // must match OA mixer names for the OA mixer type + bool &ErrorsFound // set to true if problem + ); + + int GetNumOAMixers(EnergyPlusData &state); + + int GetNumOAControllers(EnergyPlusData &state); + + int GetOAMixerReliefNodeNumber(EnergyPlusData &state, int const OAMixerNum); // Which Mixer + + int GetOASysControllerListIndex(EnergyPlusData &state, int const OASysNumber); // OA Sys Number + + int GetOASysNumSimpControllers(EnergyPlusData &state, int const OASysNumber); // OA Sys Number + + int GetOASysNumHeatingCoils(EnergyPlusData &state, int const OASysNumber); // OA Sys Number + + int GetOASysNumHXs(EnergyPlusData &state, int const OASysNumber); // OA Sys Number + + int GetOASysNumCoolingCoils(EnergyPlusData &state, int const OASysNumber); // OA Sys Number + + int GetOASystemNumber(EnergyPlusData &state, std::string const &OASysName); // OA Sys Name + + int FindOAMixerMatchForOASystem(EnergyPlusData &state, int const OASysNumber); // Which OA System + + int GetOAMixerIndex(EnergyPlusData &state, std::string const &OAMixerName); // Which Mixer + + int GetOAMixerInletNodeNumber(EnergyPlusData &state, int const OAMixerNumber); // Which Mixer + + int GetOAMixerReturnNodeNumber(EnergyPlusData &state, int const OAMixerNumber); // Which Mixer + + int GetOAMixerMixedNodeNumber(EnergyPlusData &state, int const OAMixerNumber); // Which Mixer + + bool CheckForControllerWaterCoil(EnergyPlusData &state, + DataAirLoop::ControllerKind ControllerType, // should be passed in as UPPERCASE + std::string const &ControllerName // should be passed in as UPPERCASE + ); + + void CheckControllerLists(EnergyPlusData &state, bool &ErrFound); + + void CheckOAControllerName( + EnergyPlusData &state, std::string &OAControllerName, std::string const &ObjectType, std::string const &FieldName, bool &ErrorsFound); + + int GetNumOASystems(EnergyPlusData &state); + + int GetOACompListNumber(EnergyPlusData &state, int const OASysNum); // OA Sys Number + + std::string GetOACompName(EnergyPlusData &state, + int const OASysNum, // OA Sys Number + int const InListNum // In-list Number + ); + + std::string GetOACompType(EnergyPlusData &state, + int const OASysNum, // OA Sys Number + int const InListNum // In-list Number + ); + + SimAirServingZones::CompType GetOACompTypeNum(EnergyPlusData &state, + int const OASysNum, // OA Sys Number + int const InListNum // In-list Number + ); + + int GetOAMixerNumber(EnergyPlusData &state, std::string const &OAMixerName); // must match OA mixer names for the OA mixer type + + // End of Utility Section of the Module + //****************************************************************************** + +} // namespace MixedAir + +struct MixedAirData : BaseGlobalStruct +{ + + int NumControllerLists = 0; // Number of Controller Lists + int NumOAControllers = 0; // Number of OA Controllers (includes ERV controllers) + int NumERVControllers = 0; // Number of ERV Controllers + int NumOAMixers = 0; // Number of Outdoor Air Mixers + int NumVentMechControllers = 0; // Number of Controller:MechanicalVentilation objects in input deck + Array1D_bool MyOneTimeErrorFlag; + Array1D_bool MyOneTimeCheckUnitarySysFlag; + Array1D_bool initOASysFlag; + bool GetOASysInputFlag = true; + bool GetOAMixerInputFlag = true; + bool GetOAControllerInputFlag = true; + bool InitOAControllerOneTimeFlag = true; + Array1D_bool InitOAControllerSetPointCheckFlag; + bool InitOAControllerSetUpAirLoopHVACVariables = true; + bool AllocateOAControllersFlag = true; + Array1D_string DesignSpecOAObjName; // name of the design specification outdoor air object + Array1D_int DesignSpecOAObjIndex; // index of the design specification outdoor air object + Array1D_string VentMechZoneOrListName; // Zone or Zone List to apply mechanical ventilation rate + Array1D_string DesignSpecZoneADObjName; // name of the design specification zone air distribution object + Array1D_int DesignSpecZoneADObjIndex; // index of the design specification zone air distribution object + EPVector ControllerLists; + EPVector OAController; + EPVector OAMixer; + EPVector VentilationMechanical; + std::unordered_set ControllerListUniqueNames; + std::unordered_map OAControllerUniqueNames; + std::string CompType; + std::string CompName; + std::string CtrlName; + Array1D_bool OAControllerMyOneTimeFlag; + Array1D_bool OAControllerMyEnvrnFlag; + Array1D_bool OAControllerMySizeFlag; + Array1D_bool MechVentCheckFlag; + + void clear_state() override + { + this->NumControllerLists = 0; + this->NumOAControllers = 0; + this->NumERVControllers = 0; + this->NumOAMixers = 0; + this->NumVentMechControllers = 0; + this->MyOneTimeErrorFlag.deallocate(); + this->MyOneTimeCheckUnitarySysFlag.deallocate(); + this->initOASysFlag.deallocate(); + this->GetOASysInputFlag = true; + this->GetOAMixerInputFlag = true; + this->GetOAControllerInputFlag = true; + this->InitOAControllerOneTimeFlag = true; + this->InitOAControllerSetPointCheckFlag.deallocate(); + this->InitOAControllerSetUpAirLoopHVACVariables = true; + this->AllocateOAControllersFlag = true; + this->DesignSpecOAObjName.deallocate(); + this->DesignSpecOAObjIndex.deallocate(); + this->VentMechZoneOrListName.deallocate(); + this->DesignSpecZoneADObjName.deallocate(); + this->DesignSpecZoneADObjIndex.deallocate(); + this->ControllerLists.deallocate(); + this->OAController.deallocate(); + this->OAMixer.deallocate(); + this->VentilationMechanical.deallocate(); + this->ControllerListUniqueNames.clear(); + this->OAControllerUniqueNames.clear(); + this->OAControllerMyOneTimeFlag.clear(); + this->OAControllerMyEnvrnFlag.clear(); + this->OAControllerMySizeFlag.clear(); + this->MechVentCheckFlag.clear(); + } +}; + +} // namespace EnergyPlus + +#endif diff --git a/src/EnergyPlus/ThermalComfort.cc b/src/EnergyPlus/ThermalComfort.cc index 617222ae0a4..1de6450e821 100644 --- a/src/EnergyPlus/ThermalComfort.cc +++ b/src/EnergyPlus/ThermalComfort.cc @@ -1944,7 +1944,6 @@ namespace ThermalComfort { state.dataIPShortCut->cNumericFieldNames); thisAngFacList.Name = state.dataIPShortCut->cAlphaArgs(1); // no need for verification/uniqueness. - // Ignore ZoneName cAlphaArgs(2) thisAngFacList.TotAngleFacSurfaces = NumNumbers; thisAngFacList.SurfaceName.allocate(thisAngFacList.TotAngleFacSurfaces); @@ -1952,17 +1951,17 @@ namespace ThermalComfort { thisAngFacList.AngleFactor.allocate(thisAngFacList.TotAngleFacSurfaces); for (int SurfNum = 1; SurfNum <= thisAngFacList.TotAngleFacSurfaces; ++SurfNum) { - thisAngFacList.SurfaceName(SurfNum) = state.dataIPShortCut->cAlphaArgs(SurfNum + 2); + thisAngFacList.SurfaceName(SurfNum) = state.dataIPShortCut->cAlphaArgs(SurfNum + 1); thisAngFacList.SurfacePtr(SurfNum) = - UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(SurfNum + 2), state.dataSurface->Surface); + UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(SurfNum + 1), state.dataSurface->Surface); thisAngFacList.AngleFactor(SurfNum) = state.dataIPShortCut->rNumericArgs(SurfNum); // Error trap for surfaces that do not exist or surfaces not in the zone if (thisAngFacList.SurfacePtr(SurfNum) == 0) { ShowSevereError(state, format("{}: invalid {}, entered value={}", cCurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(SurfNum + 2), - state.dataIPShortCut->cAlphaArgs(SurfNum + 2))); + state.dataIPShortCut->cAlphaFieldNames(SurfNum + 1), + state.dataIPShortCut->cAlphaArgs(SurfNum + 1))); ShowContinueError(state, format("ref {}={} not found in {}={}", state.dataIPShortCut->cAlphaFieldNames(1), @@ -2228,7 +2227,7 @@ namespace ThermalComfort { Real64 constexpr StefanBoltzmannConst = 5.6697e-8; // Stefan-Boltzmann constant in W/(m2*K4) switch (state.dataHeatBal->People(PeopleListNum).MRTCalcType) { - case DataHeatBalance::CalcMRT::ZoneAveraged: { + case DataHeatBalance::CalcMRT::EnclosureAveraged: { state.dataThermalComforts->RadTemp = state.dataHeatBal->ZoneMRT(state.dataThermalComforts->ZoneNum); } break; case DataHeatBalance::CalcMRT::SurfaceWeighted: { diff --git a/src/EnergyPlus/ThermalComfort.hh b/src/EnergyPlus/ThermalComfort.hh index c163fefb40a..e43575e40e3 100644 --- a/src/EnergyPlus/ThermalComfort.hh +++ b/src/EnergyPlus/ThermalComfort.hh @@ -298,7 +298,6 @@ struct ThermalComfortsData : BaseGlobalStruct int IterNum = 0; // Number of iteration Real64 LatRespHeatLoss = 0.0; // Latent respiration heat loss int MaxZoneNum = 0; // Number of zones - int MRTCalcType = 0; // The type of MRT calculation (ZoneAveraged or SurfaceWeighted) Real64 OpTemp = 0.0; // Operative temperature Real64 EffTemp = 0.0; // Effective temperature int PeopleNum = 0; // People number diff --git a/src/EnergyPlus/ZoneTempPredictorCorrector.cc.bak b/src/EnergyPlus/ZoneTempPredictorCorrector.cc.bak new file mode 100644 index 00000000000..6c1d8da9bd0 --- /dev/null +++ b/src/EnergyPlus/ZoneTempPredictorCorrector.cc.bak @@ -0,0 +1,7500 @@ +// EnergyPlus, Copyright (c) 1996-2022, The Board of Trustees of the University of Illinois, +// The Regents of the University of California, through Lawrence Berkeley National Laboratory +// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge +// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other +// contributors. All rights reserved. +// +// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the +// U.S. Government consequently retains certain rights. As such, the U.S. Government has been +// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, +// worldwide license in the Software to reproduce, distribute copies to the public, prepare +// derivative works, and perform publicly and display publicly, and to permit others to do so. +// +// Redistribution and use in source and binary forms, with or without modification, are permitted +// provided that the following conditions are met: +// +// (1) Redistributions of source code must retain the above copyright notice, this list of +// conditions and the following disclaimer. +// +// (2) Redistributions in binary form must reproduce the above copyright notice, this list of +// conditions and the following disclaimer in the documentation and/or other materials +// provided with the distribution. +// +// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, +// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be +// used to endorse or promote products derived from this software without specific prior +// written permission. +// +// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form +// without changes from the version obtained under this License, or (ii) Licensee makes a +// reference solely to the software portion of its product, Licensee must refer to the +// software as "EnergyPlus version X" software, where "X" is the version number Licensee +// obtained under this License and may not use a different name for the software. Except as +// specifically required in this Section (4), Licensee shall not use in a company name, a +// product name, in advertising, publicity, or other promotional activities any name, trade +// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly +// similar designation, without the U.S. Department of Energy's prior written consent. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR +// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +// C++ Headers +#include +#include + +// ObjexxFCL Headers +#include +#include + +// EnergyPlus Headers +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +namespace EnergyPlus::ZoneTempPredictorCorrector { + +// MODULE INFORMATION: +// AUTHOR Russell D. Taylor +// DATE WRITTEN 1997 +// MODIFIED Aug 2001(FW): make SNLoadHeatRate public +// Nov 2010 BN(FSEC) added TemperatureAndHumidity Control +// RE-ENGINEERED July 2003 (Peter Graham Ellis) +// July 2006 (BG) added operative temp control +// February 2008 (BG) reworked zone air temp histories + +// PURPOSE OF THIS MODULE: +// This module contains routines to predict and correct zone temperatures. +// also includes zone thermostatic controlling +// Model the "Air Heat Balance" part of the the "Zone Heat Balance Method." + +// METHODOLOGY EMPLOYED: +// apply model equations for air heat balance solved for zone air temp. +// sum up values for the terms (e.g SUMHAT, SUMHA etc. ) +// "Predict" step is used to get zone loads for HVAC equipment +// "correct" step determines zone air temp with available HVAC + +enum class ZoneControlTypes +{ + Invalid = -1, + TStat = 1, + TCTStat = 2, + OTTStat = 3, + HStat = 4, + TandHStat = 5, + StagedDual = 6, + Num +}; + +enum class AdaptiveComfortModel +{ + Invalid = -1, + ADAP_NONE = 1, + ASH55_CENTRAL = 2, + ASH55_UPPER_90 = 3, + ASH55_UPPER_80 = 4, + CEN15251_CENTRAL = 5, + CEN15251_UPPER_I = 6, + CEN15251_UPPER_II = 7, + CEN15251_UPPER_III = 8, + Num +}; + +static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidControlTypes = { + "Uncontrolled", + "ThermostatSetpoint:SingleHeating", + "ThermostatSetpoint:SingleCooling", + "ThermostatSetpoint:SingleHeatingOrCooling", + "ThermostatSetpoint:DualSetpoint"}; + +static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidControlTypesUC = { + "UNCONTROLLED", + "THERMOSTATSETPOINT:SINGLEHEATING", + "THERMOSTATSETPOINT:SINGLECOOLING", + "THERMOSTATSETPOINT:SINGLEHEATINGORCOOLING", + "THERMOSTATSETPOINT:DUALSETPOINT"}; + +static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidComfortControlTypes = { + "Uncontrolled", + "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeating", + "ThermostatSetpoint:ThermalComfort:Fanger:SingleCooling", + "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeatingOrCooling", + "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint"}; + +static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidComfortControlTypesUC = { + "UNCONTROLLED", + "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:SINGLEHEATING", + "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:SINGLECOOLING", + "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:SINGLEHEATINGORCOOLING", + "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:DUALSETPOINT"}; + +Array1D_string const cZControlTypes(6, + {"ZoneControl:Thermostat", + "ZoneControl:Thermostat:ThermalComfort", + "ZoneControl:Thermostat:OperativeTemperature", + "ZoneControl:Humidistat", + "ZoneControl:Thermostat:TemperatureAndHumidity", + "ZoneControl:Thermostat:StagedDualSetpoint"}); + +Array1D_string const AdaptiveComfortModelTypes(8, + {"None", + "AdaptiveASH55CentralLine", + "AdaptiveASH5590PercentUpperLine", + "AdaptiveASH5580PercentUpperLine", + "AdaptiveCEN15251CentralLine", + "AdaptiveCEN15251CategoryIUpperLine", + "AdaptiveCEN15251CategoryIIUpperLine", + "AdaptiveCEN15251CategoryIIIUpperLine"}); + +// Functions +void ManageZoneAirUpdates(EnergyPlusData &state, + DataHeatBalFanSys::PredictorCorrectorCtrl const UpdateType, // Can be iGetZoneSetPoints, iPredictStep, iCorrectStep + Real64 &ZoneTempChange, // Temp change in zone air btw previous and current timestep + bool const ShortenTimeStepSys, + bool const UseZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step + Real64 const PriorTimeStep // the old value for timestep length is passed for possible use in interpolating +) +{ + + // SUBROUTINE INFORMATION + // AUTHOR Russ Taylor + // DATE WRITTEN September 1998 + // MODIFIED na + // RE-ENGINEERED Brent Griffith Feb. 2008, added arguments + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine predicts or corrects the zone air temperature + // depending on the simulation status and determines the correct + // temperature setpoint for each zone from the schedule manager. + + if (state.dataZoneCtrls->GetZoneAirStatsInputFlag) { + GetZoneAirSetPoints(state); + state.dataZoneCtrls->GetZoneAirStatsInputFlag = false; + } + + InitZoneAirSetPoints(state); + + switch (UpdateType) { + case DataHeatBalFanSys::PredictorCorrectorCtrl::GetZoneSetPoints: { + CalcZoneAirTempSetPoints(state); + } break; + case DataHeatBalFanSys::PredictorCorrectorCtrl::PredictStep: { + PredictSystemLoads(state, ShortenTimeStepSys, UseZoneTimeStepHistory, PriorTimeStep); + } break; + case DataHeatBalFanSys::PredictorCorrectorCtrl::CorrectStep: { + ZoneTempChange = correctZoneAirTemps(state, UseZoneTimeStepHistory); + } break; + case DataHeatBalFanSys::PredictorCorrectorCtrl::RevertZoneTimestepHistories: { + RevertZoneTimestepHistories(state); + } break; + case DataHeatBalFanSys::PredictorCorrectorCtrl::PushZoneTimestepHistories: { + PushZoneTimestepHistories(state); + } break; + case DataHeatBalFanSys::PredictorCorrectorCtrl::PushSystemTimestepHistories: { + PushSystemTimestepHistories(state); + } break; + default: + break; + } +} + +void GetZoneAirSetPoints(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Russell Taylor + // DATE WRITTEN September 1998 + // MODIFIED L.Gu, May 2006, B. Griffith June 2006 + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine gets the inputs related to thermostatic control. + + // METHODOLOGY EMPLOYED: + // Uses the status flags to trigger events. + + // Using/Aliasing + using General::CheckCreatedZoneItemName; + using General::FindNumberInList; + + using ScheduleManager::CheckScheduleValue; + using ScheduleManager::CheckScheduleValueMinMax; + using ScheduleManager::GetScheduleIndex; + using ScheduleManager::GetScheduleMaxValue; + using ScheduleManager::GetScheduleMinValue; + + // SUBROUTINE PARAMETER DEFINITIONS: + static constexpr std::string_view RoutineName("GetZoneAirSetpoints: "); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int TempControlledZoneNum; // The Splitter that you are currently loading input into + int NumAlphas; + int NumNums; + int ControlTypeNum; + int IOStat; + bool ErrorsFound(false); + bool errFlag; + int CTIndex; + int HumidControlledZoneNum; // The Humidity Controller that information is being loaded into + bool ValidScheduleControlType; + bool ValidRadFractSched; // check for if radiative fraction schedule has valid numbers + bool ValidZoneOvercoolRangeSched; // check for if Zone Overcool range schedule has valid numbers + int SchedMin; + int SchedMax; + int ActualZoneNum; + int SchedTypeIndex; + + int ComfortControlledZoneNum; // The Splitter that you are currently loading input into + int i; + int IZoneCount; + int found; + int NumStageControlledZones; // Number of staged controlled objects + int StageControlledZoneNum; // Index for staged controlled zones + + Array1D_int CTSchedMapToControlledZone; + Array1D_int CCmSchedMapToControlledZone; + int Item; + int Item1; + int ZLItem; + + struct NeededControlTypes + { + // Members 4= the four control types + uncontrolled + std::array(DataHVACGlobals::ThermostatType::Num)> MustHave = {false, false, false, false, false}; + std::array(DataHVACGlobals::ThermostatType::Num)> DidHave = {false, false, false, false, false}; + }; + + struct NeededComfortControlTypes + { + // Members 4= the four control types + uncontrolled + std::array(DataHVACGlobals::ThermostatType::Num)> MustHave = {false, false, false, false, false}; + std::array(DataHVACGlobals::ThermostatType::Num)> DidHave = {false, false, false, false, false}; + }; + + // Object Data + Array1D TStatControlTypes; + Array1D TComfortControlTypes; + + // Formats + static constexpr std::string_view Header( + "! , Sensible Heat Capacity Multiplier, Moisture Capacity Multiplier, Carbon " + "Dioxide Capacity Multiplier, Generic Contaminant Capacity Multiplier\n"); + static constexpr std::string_view Format_701("Zone Volume Capacitance Multiplier,{:8.3F} ,{:8.3F},{:8.3F},{:8.3F}\n"); + + auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; + auto &TStatObjects = state.dataZoneCtrls->TStatObjects; + auto &NumTStatStatements = state.dataZoneCtrls->NumTStatStatements; + auto &NumTempControlledZones = state.dataZoneCtrls->NumTempControlledZones; + auto &Zone = state.dataHeatBal->Zone; + auto &ZoneList = state.dataHeatBal->ZoneList; + auto &TempControlledZone = state.dataZoneCtrls->TempControlledZone; + auto &HumidityControlZone = state.dataZoneCtrls->HumidityControlZone; + auto &ComfortTStatObjects = state.dataZoneCtrls->ComfortTStatObjects; + auto &ComfortControlledZone = state.dataZoneCtrls->ComfortControlledZone; + auto &NumOfZones = state.dataGlobal->NumOfZones; + auto &StageControlledZone = state.dataZoneCtrls->StageControlledZone; + auto &SetPointSingleHeating = state.dataZoneTempPredictorCorrector->SetPointSingleHeating; + auto &SetPointSingleCooling = state.dataZoneTempPredictorCorrector->SetPointSingleCooling; + auto &cAlphaArgs = state.dataIPShortCut->cAlphaArgs; + auto &rNumericArgs = state.dataIPShortCut->rNumericArgs; + auto &lNumericFieldBlanks = state.dataIPShortCut->lNumericFieldBlanks; + auto &lAlphaFieldBlanks = state.dataIPShortCut->lAlphaFieldBlanks; + auto &cAlphaFieldNames = state.dataIPShortCut->cAlphaFieldNames; + auto &cNumericFieldNames = state.dataIPShortCut->cNumericFieldNames; + auto &inputProcessor = state.dataInputProcessing->inputProcessor; + auto &SetPointDualHeatCool = state.dataZoneTempPredictorCorrector->SetPointDualHeatCool; + + cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::TStat)); + NumTStatStatements = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + TStatObjects.allocate(NumTStatStatements); + + // Pre-scan for use of Zone lists in TStat statements (i.e. Global application of TStat) + NumTempControlledZones = 0; + for (Item = 1; Item <= NumTStatStatements; ++Item) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Item, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + + TStatObjects(Item).Name = cAlphaArgs(1); + Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + ZLItem = 0; + if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); + if (Item1 > 0) { + TStatObjects(Item).TempControlledZoneStartPtr = NumTempControlledZones + 1; + ++NumTempControlledZones; + TStatObjects(Item).NumOfZones = 1; + TStatObjects(Item).ZoneListActive = false; + TStatObjects(Item).ZoneOrZoneListPtr = Item1; + } else if (ZLItem > 0) { + TStatObjects(Item).TempControlledZoneStartPtr = NumTempControlledZones + 1; + NumTempControlledZones += ZoneList(ZLItem).NumOfZones; + TStatObjects(Item).NumOfZones = ZoneList(ZLItem).NumOfZones; + TStatObjects(Item).ZoneListActive = true; + TStatObjects(Item).ZoneOrZoneListPtr = ZLItem; + } else { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + } + + if (ErrorsFound) { + ShowSevereError(state, "GetZoneAirSetpoints: Errors with invalid names in " + cCurrentModuleObject + " objects."); + ShowContinueError(state, "...These will not be read in. Other errors may occur."); + NumTempControlledZones = 0; + } + + if (NumTempControlledZones > 0) { + TempControlledZone.allocate(NumTempControlledZones); + TStatControlTypes.allocate(NumTempControlledZones); // Number of set point types + CTSchedMapToControlledZone.dimension(NumTempControlledZones, 0); + + TempControlledZoneNum = 0; + state.dataZoneTempPredictorCorrector->NumOnOffCtrZone = 0; + for (Item = 1; Item <= NumTStatStatements; ++Item) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Item, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + for (Item1 = 1; Item1 <= TStatObjects(Item).NumOfZones; ++Item1) { + ++TempControlledZoneNum; + if (TStatObjects(Item).ZoneListActive) { + cAlphaArgs(2) = Zone(ZoneList(TStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name; + } + int ZoneAssigned = UtilityRoutines::FindItemInList( + cAlphaArgs(2), TempControlledZone, &DataZoneControls::ZoneTempControls::ZoneName, TempControlledZoneNum - 1); + if (ZoneAssigned == 0) { + TempControlledZone(TempControlledZoneNum).ZoneName = cAlphaArgs(2); + TempControlledZone(TempControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + if (TempControlledZone(TempControlledZoneNum).ActualZoneNum == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" not found."); + ErrorsFound = true; + } else { + Zone(TempControlledZone(TempControlledZoneNum).ActualZoneNum).TempControlledZoneIndex = TempControlledZoneNum; + } + } else { + TempControlledZone(TempControlledZoneNum).ZoneName = cAlphaArgs(2); // for continuity + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" zone previously assigned."); + ShowContinueError(state, "...Zone was previously assigned to Thermostat=\"" + TempControlledZone(ZoneAssigned).Name + "\"."); + ErrorsFound = true; + continue; + } + + if (!TStatObjects(Item).ZoneListActive) { + TempControlledZone(TempControlledZoneNum).Name = cAlphaArgs(1); + } else { + CheckCreatedZoneItemName(state, + RoutineName, + cCurrentModuleObject, + Zone(ZoneList(TStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name, + ZoneList(TStatObjects(Item).ZoneOrZoneListPtr).MaxZoneNameLength, + TStatObjects(Item).Name, + TempControlledZone, + TempControlledZoneNum - 1, + TempControlledZone(TempControlledZoneNum).Name, + errFlag); + if (errFlag) ErrorsFound = true; + } + + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName = cAlphaArgs(3); + TempControlledZone(TempControlledZoneNum).CTSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); + if (Item1 == 1) { // only show error on first of several if zone list + if (TempControlledZone(TempControlledZoneNum).CTSchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + + "\" not found."); + ErrorsFound = true; + } else { + // Check validity of control types. + ValidScheduleControlType = + CheckScheduleValueMinMax(state, TempControlledZone(TempControlledZoneNum).CTSchedIndex, ">=", 0.0, "<=", 4.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid range " + cAlphaFieldNames(2) + "=\"" + + cAlphaArgs(2) + "\""); + ShowContinueError(state, "..contains values outside of range [0,4]."); + ErrorsFound = true; + } + } + } + + if (lAlphaFieldBlanks(7)) { + NumAlphas = 5; + } else if (lAlphaFieldBlanks(9)) { + NumAlphas = 7; + } else if (lAlphaFieldBlanks(11)) { + NumAlphas = 9; + } + + TempControlledZone(TempControlledZoneNum).NumControlTypes = nint((NumAlphas - 3.0) / 2.0); + TempControlledZone(TempControlledZoneNum).ControlType.allocate(TempControlledZone(TempControlledZoneNum).NumControlTypes); + TempControlledZone(TempControlledZoneNum).ControlTypeName.allocate(TempControlledZone(TempControlledZoneNum).NumControlTypes); + TempControlledZone(TempControlledZoneNum).ControlTypeEnum.allocate(TempControlledZone(TempControlledZoneNum).NumControlTypes); + + for (ControlTypeNum = 1; ControlTypeNum <= TempControlledZone(TempControlledZoneNum).NumControlTypes; ++ControlTypeNum) { + + TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 3)); + TempControlledZone(TempControlledZoneNum).ControlTypeName(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum + 3)); + + if (!TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum).empty()) { + auto ctrlType = static_cast( + getEnumerationValue(ValidControlTypesUC, TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum))); + TempControlledZone(TempControlledZoneNum).ControlTypeEnum(ControlTypeNum) = ctrlType; + if (ctrlType == DataHVACGlobals::ThermostatType::Invalid) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + + cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 3)) + "=\"" + + cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 3)) + "\""); + ErrorsFound = true; + } + } else { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + + cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 3)) + "=\"\""); + ErrorsFound = true; + } + } + if (NumNums > 0) { + if (rNumericArgs(1) >= 0.0) { + TempControlledZone(TempControlledZoneNum).DeltaTCutSet = rNumericArgs(1); + if (rNumericArgs(1) > 0.0) state.dataZoneTempPredictorCorrector->NumOnOffCtrZone++; + } else { + ShowSevereError( + state, + format("{}=\"{} invalid {}=[{:.0T}].", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(1), rNumericArgs(1))); + ShowContinueError(state, "..Allowable values must be greater or equal to 0"); + ErrorsFound = true; + } + } + if (TempControlledZone(TempControlledZoneNum).DeltaTCutSet > 0.0) { + for (ControlTypeNum = 1; ControlTypeNum <= TempControlledZone(TempControlledZoneNum).NumControlTypes; ++ControlTypeNum) { + if (UtilityRoutines::SameString(TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum), + "ThermostatSetpoint:SingleHeatingOrCooling")) { + ShowWarningError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + + ": The choice of Temperature Difference Between Cutout And Setpoint will not be applied to " + "ThermostatSetpoint:SingleHeatingOrCooling."); + } + } + } + } + } // NumTStatStatements + } // Check on number of TempControlledZones + + cCurrentModuleObject = ValidControlTypesUC[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)]; + state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls > 0) + SetPointSingleHeating.allocate(state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &singleHtgSetpoint = SetPointSingleHeating(idx); + singleHtgSetpoint.Name = cAlphaArgs(1); + singleHtgSetpoint.TempSchedName = cAlphaArgs(2); + singleHtgSetpoint.TempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (singleHtgSetpoint.TempSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + + } // SingleTempHeatingControlNum + + cCurrentModuleObject = ValidControlTypesUC[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)]; + state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls > 0) + SetPointSingleCooling.allocate(state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &singleClgSetpoint = SetPointSingleCooling(idx); + singleClgSetpoint.Name = cAlphaArgs(1); + singleClgSetpoint.TempSchedName = cAlphaArgs(2); + singleClgSetpoint.TempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (singleClgSetpoint.TempSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + + } // SingleTempCoolingControlNum + + cCurrentModuleObject = ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)]; + state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls > 0) + state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool.allocate(state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + auto &singleHeatCoolSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool(idx); + singleHeatCoolSetpoint.Name = cAlphaArgs(1); + singleHeatCoolSetpoint.TempSchedName = cAlphaArgs(2); + singleHeatCoolSetpoint.TempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (singleHeatCoolSetpoint.TempSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + + } // SingleTempHeatCoolControlNum + + cCurrentModuleObject = ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)]; + state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls > 0) + SetPointDualHeatCool.allocate(state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &dualHeatCoolSetpoint = SetPointDualHeatCool(idx); + dualHeatCoolSetpoint.Name = cAlphaArgs(1); + dualHeatCoolSetpoint.HeatTempSetptSchedName = cAlphaArgs(2); + dualHeatCoolSetpoint.HeatTempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (dualHeatCoolSetpoint.HeatTempSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + dualHeatCoolSetpoint.CoolTempSetptSchedName = cAlphaArgs(3); + dualHeatCoolSetpoint.CoolTempSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); + if (dualHeatCoolSetpoint.CoolTempSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" not found."); + ErrorsFound = true; + } + + } // DualTempHeatCoolControlNum + + // Finish filling in Schedule pointing indexes + int setPointObjectArrayIndex; + for (TempControlledZoneNum = 1; TempControlledZoneNum <= NumTempControlledZones; ++TempControlledZoneNum) { + for (int ct = 1; ct <= state.dataZoneCtrls->TempControlledZone(TempControlledZoneNum).NumControlTypes; ct++) { + switch (state.dataZoneCtrls->TempControlledZone(TempControlledZoneNum).ControlTypeEnum(ct)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + setPointObjectArrayIndex = + UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), SetPointSingleHeating); + TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatSetPoint = + state.dataZoneTempPredictorCorrector->SetPointSingleHeating(setPointObjectArrayIndex).TempSchedIndex; + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + setPointObjectArrayIndex = + UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), SetPointSingleCooling); + TempControlledZone(TempControlledZoneNum).SchIndx_SingleCoolSetPoint = + state.dataZoneTempPredictorCorrector->SetPointSingleCooling(setPointObjectArrayIndex).TempSchedIndex; + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + setPointObjectArrayIndex = UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), + state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool); + TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatCoolSetPoint = + state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool(setPointObjectArrayIndex).TempSchedIndex; + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + setPointObjectArrayIndex = UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), + state.dataZoneTempPredictorCorrector->SetPointDualHeatCool); + TempControlledZone(TempControlledZoneNum).SchIndx_DualSetPointWDeadBandHeat = + state.dataZoneTempPredictorCorrector->SetPointDualHeatCool(setPointObjectArrayIndex).HeatTempSchedIndex; + TempControlledZone(TempControlledZoneNum).SchIndx_DualSetPointWDeadBandCool = + state.dataZoneTempPredictorCorrector->SetPointDualHeatCool(setPointObjectArrayIndex).CoolTempSchedIndex; + break; + default: + assert(false); + } + } + } + + // Now, Check the schedule values/indices for validity + + for (TempControlledZoneNum = 1; TempControlledZoneNum <= NumTempControlledZones; ++TempControlledZoneNum) { + + ActualZoneNum = TempControlledZone(TempControlledZoneNum).ActualZoneNum; + CTIndex = TempControlledZone(TempControlledZoneNum).CTSchedIndex; + if (CTIndex == 0) continue; // error will be caught elsewhere + SchedMin = GetScheduleMinValue(state, CTIndex); + SchedMax = GetScheduleMaxValue(state, CTIndex); + + if (SchedMin == 0 && SchedMax == 0) { + if (FindNumberInList(CTIndex, CTSchedMapToControlledZone, NumTempControlledZones) == 0) { + ShowSevereError(state, "Control Type Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, "..specifies control type 0 for all entries."); + ShowContinueError(state, "All zones using this Control Type Schedule have no heating or cooling available."); + } + CTSchedMapToControlledZone(TempControlledZoneNum) = CTIndex; + } + + for (ControlTypeNum = SchedMin; ControlTypeNum <= SchedMax; ++ControlTypeNum) { + + int TempIndex = 0; + switch (static_cast(ControlTypeNum)) { + case DataHVACGlobals::ThermostatType::Uncontrolled: + break; + case DataHVACGlobals::ThermostatType::SingleHeating: + TempIndex = TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatSetPoint; + if (TempIndex == 0) { + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeating))) { + ShowSevereError(state, "Control Type Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies control type 1 ({}) as the control type. Not valid for this zone.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + TempIndex = TempControlledZone(TempControlledZoneNum).SchIndx_SingleCoolSetPoint; + if (TempIndex == 0) { + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleCooling))) { + ShowSevereError(state, "Control Type Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies control type 2 ({}) as the control type. Not valid for this zone.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + TempIndex = TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatCoolSetPoint; + if (TempIndex == 0) { + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool))) { + ShowSevereError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies control type 3 ({}) as the control type. Not valid for this zone.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + TempIndex = TempControlledZone(TempControlledZoneNum) + .SchIndx_DualSetPointWDeadBandHeat; // using "Heat" as a sentinel that dualsetpoint is on this zone control object + if (TempIndex == 0) { + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand))) { + ShowSevereError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies control type 4 ({}) as the control type. Not valid for this zone.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + default: + ShowSevereError(state, + format("GetZoneAirSetpoints: Illegal control type for Zone={}, Found value={}, in Schedule={}", + Zone(ActualZoneNum).Name, + ControlTypeNum, + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName)); + ShowContinueError(state, "..valid range values are [0,4]."); + ErrorsFound = true; + } + } + } + + for (TempControlledZoneNum = 1; TempControlledZoneNum <= NumTempControlledZones; ++TempControlledZoneNum) { + + ActualZoneNum = TempControlledZone(TempControlledZoneNum).ActualZoneNum; + CTIndex = TempControlledZone(TempControlledZoneNum).CTSchedIndex; + if (CTIndex == 0) continue; // error caught elsewhere -- would just be confusing here + + for (ControlTypeNum = 1; ControlTypeNum <= 4; ++ControlTypeNum) { + if (TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum] && TStatControlTypes(TempControlledZoneNum).DidHave[ControlTypeNum]) + continue; + + switch (static_cast(ControlTypeNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 1 ({}) but does not.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 2 ({}) but does not.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 3 ({}) but does not.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 4 ({}) but does not.", + ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + + TempControlledZone(TempControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); + break; + default: + break; + } + } + } + + if (allocated(TStatControlTypes)) TStatControlTypes.deallocate(); + // This starts the Humidity Control Get Input section + cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::HStat)); + state.dataZoneCtrls->NumHumidityControlZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneCtrls->NumHumidityControlZones > 0) { + HumidityControlZone.allocate(state.dataZoneCtrls->NumHumidityControlZones); + state.dataZoneTempPredictorCorrector->HumidityControlZoneUniqueNames.reserve( + static_cast(state.dataZoneCtrls->NumHumidityControlZones)); + } + + for (HumidControlledZoneNum = 1; HumidControlledZoneNum <= state.dataZoneCtrls->NumHumidityControlZones; ++HumidControlledZoneNum) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + HumidControlledZoneNum, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + + HumidityControlZone(HumidControlledZoneNum).ControlName = cAlphaArgs(1); + GlobalNames::IntraObjUniquenessCheck(state, + cAlphaArgs(2), + cCurrentModuleObject, + cAlphaFieldNames(2), + state.dataZoneTempPredictorCorrector->HumidityControlZoneUniqueNames, + ErrorsFound); + + HumidityControlZone(HumidControlledZoneNum).ZoneName = cAlphaArgs(2); + HumidityControlZone(HumidControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItem(cAlphaArgs(2), Zone); + if (HumidityControlZone(HumidControlledZoneNum).ActualZoneNum == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } else { + state.dataHeatBal->Zone(HumidityControlZone(HumidControlledZoneNum).ActualZoneNum).humidityControlZoneIndex = HumidControlledZoneNum; + } + HumidityControlZone(HumidControlledZoneNum).HumidifyingSched = cAlphaArgs(3); + HumidityControlZone(HumidControlledZoneNum).HumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); + if (HumidityControlZone(HumidControlledZoneNum).HumidifyingSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" not found."); + ErrorsFound = true; + } + if (NumAlphas == 4) { + HumidityControlZone(HumidControlledZoneNum).DehumidifyingSched = cAlphaArgs(4); + HumidityControlZone(HumidControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(4)); + if (HumidityControlZone(HumidControlledZoneNum).DehumidifyingSchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + + "\" not found."); + ErrorsFound = true; + } + } else { + HumidityControlZone(HumidControlledZoneNum).DehumidifyingSched = cAlphaArgs(3); + HumidityControlZone(HumidControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); + } + + } // HumidControlledZoneNum + + // Start to read Thermal comfort control objects + cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::TCTStat)); + state.dataZoneCtrls->NumComfortTStatStatements = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + ComfortTStatObjects.allocate(state.dataZoneCtrls->NumComfortTStatStatements); + + // Pre-scan for use of Zone lists in TStat statements (i.e. Global application of TStat) + state.dataZoneCtrls->NumComfortControlledZones = 0; + errFlag = false; + for (Item = 1; Item <= state.dataZoneCtrls->NumComfortTStatStatements; ++Item) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Item, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + + Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + ZLItem = 0; + if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); + ComfortTStatObjects(Item).Name = cAlphaArgs(1); + if (Item1 > 0) { + ComfortTStatObjects(Item).ComfortControlledZoneStartPtr = state.dataZoneCtrls->NumComfortControlledZones + 1; + ++state.dataZoneCtrls->NumComfortControlledZones; + ComfortTStatObjects(Item).NumOfZones = 1; + ComfortTStatObjects(Item).ZoneListActive = false; + ComfortTStatObjects(Item).ZoneOrZoneListPtr = Item1; + } else if (ZLItem > 0) { + ComfortTStatObjects(Item).ComfortControlledZoneStartPtr = state.dataZoneCtrls->NumComfortControlledZones + 1; + state.dataZoneCtrls->NumComfortControlledZones += ZoneList(ZLItem).NumOfZones; + ComfortTStatObjects(Item).NumOfZones = ZoneList(ZLItem).NumOfZones; + ComfortTStatObjects(Item).ZoneListActive = true; + ComfortTStatObjects(Item).ZoneOrZoneListPtr = ZLItem; + } else { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + errFlag = true; + ErrorsFound = true; + } + } + + if (errFlag) { + ShowSevereError(state, "GetZoneAirSetpoints: Errors with invalid names in " + cCurrentModuleObject + " objects."); + ShowContinueError(state, "...These will not be read in. Other errors may occur."); + state.dataZoneCtrls->NumComfortControlledZones = 0; + } + + if (state.dataZoneCtrls->NumComfortControlledZones > 0) { + ComfortControlledZone.allocate(state.dataZoneCtrls->NumComfortControlledZones); + TComfortControlTypes.allocate(state.dataZoneCtrls->NumComfortControlledZones); // Number of set point types + CCmSchedMapToControlledZone.dimension(state.dataZoneCtrls->NumComfortControlledZones, 0); + + ComfortControlledZoneNum = 0; + for (Item = 1; Item <= state.dataZoneCtrls->NumComfortTStatStatements; ++Item) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Item, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + for (Item1 = 1; Item1 <= ComfortTStatObjects(Item).NumOfZones; ++Item1) { + ++ComfortControlledZoneNum; + if (ComfortTStatObjects(Item).ZoneListActive) { + cAlphaArgs(2) = state.dataHeatBal->Zone(ZoneList(ComfortTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name; + } + int ZoneAssigned = UtilityRoutines::FindItemInList( + cAlphaArgs(2), ComfortControlledZone, &DataZoneControls::ZoneComfortControls::ZoneName, ComfortControlledZoneNum - 1); + if (ZoneAssigned == 0) { + ComfortControlledZone(ComfortControlledZoneNum).ZoneName = cAlphaArgs(2); + ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" not found."); + ErrorsFound = true; + } + } else { + ComfortControlledZone(ComfortControlledZoneNum).ZoneName = cAlphaArgs(2); // for continuity + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" zone previously assigned."); + ShowContinueError(state, "...Zone was previously assigned to Thermostat=\"" + ComfortControlledZone(ZoneAssigned).Name + "\"."); + ErrorsFound = true; + continue; + } + + if (!ComfortTStatObjects(Item).ZoneListActive) { + ComfortControlledZone(ComfortControlledZoneNum).Name = cAlphaArgs(1); + } else { + ComfortControlledZone(ComfortControlledZoneNum).Name = + state.dataHeatBal->Zone(ZoneList(ComfortTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name + ' ' + + ComfortTStatObjects(Item).Name; + } + + // Read Fields A3 and A4 for averaging method + IZoneCount = 0; + for (i = 1; i <= state.dataHeatBal->TotPeople; ++i) { + if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == state.dataHeatBal->People(i).ZonePtr) { + ++IZoneCount; + } + } + // Could not find a people object for this particular zone + if (IZoneCount == 0 && ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum > 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " no PEOPLE in " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" - cannot use Comfort Control."); + ErrorsFound = true; + } + ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::NO; + if (IZoneCount > 1) { + ComfortControlledZone(ComfortControlledZoneNum).AverageMethodName = cAlphaArgs(3); + if (UtilityRoutines::SameString(cAlphaArgs(3), "SpecificObject")) { + ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::SPE; + } + if (UtilityRoutines::SameString(cAlphaArgs(3), "ObjectAverage")) { + ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::OBJ; + } + if (UtilityRoutines::SameString(cAlphaArgs(3), "PeopleAverage")) { + ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::PEO; + } + if (ComfortControlledZone(ComfortControlledZoneNum).AverageMethod == DataZoneControls::AverageMethod::NO) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); + ShowContinueError(state, "Allowed keys are SpecificObject, ObjectAverage, or PeopleAverage"); + ErrorsFound = true; + } + if (ComfortControlledZone(ComfortControlledZoneNum).AverageMethod == DataZoneControls::AverageMethod::SPE) { + ComfortControlledZone(ComfortControlledZoneNum).AverageObjectName = cAlphaArgs(4); + if (UtilityRoutines::FindItem(cAlphaArgs(4), state.dataHeatBal->People) == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + + "\"."); + ErrorsFound = true; + } else { + ComfortControlledZone(ComfortControlledZoneNum).SpecificObjectNum = + UtilityRoutines::FindItem(cAlphaArgs(4), state.dataHeatBal->People); + } + } + } else { + for (i = 1; i <= state.dataHeatBal->TotPeople; ++i) { + if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == state.dataHeatBal->People(i).ZonePtr) break; + } + ComfortControlledZone(ComfortControlledZoneNum).SpecificObjectNum = i; + } + // Check values used for thermal comfort calculation + for (i = 1; i <= state.dataHeatBal->TotPeople; ++i) { + if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == state.dataHeatBal->People(i).ZonePtr) { + // Check activity level + if (state.dataHeatBal->People(i).ActivityLevelPtr > 0) { + ValidScheduleControlType = + CheckScheduleValueMinMax(state, state.dataHeatBal->People(i).ActivityLevelPtr, ">=", 72.0, "<=", 909.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + "GetPeople Activity Level: Invalid activity level values entered for thermal comfort calculation"); + ShowContinueError(state, "Outside of range values [72,909], Reference object=" + state.dataHeatBal->People(i).Name); + ErrorsFound = true; + } + } else { + ShowSevereError(state, + "GetPeople Activity Level: Activity level schedule is not found=" + state.dataHeatBal->People(i).Name); + ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); + ErrorsFound = true; + } + // Check Work Efficiency + if (state.dataHeatBal->People(i).WorkEffPtr > 0) { + ValidScheduleControlType = CheckScheduleValueMinMax(state, state.dataHeatBal->People(i).WorkEffPtr, ">=", 0.0, "<=", 1.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + "GetPeople work efficiency: Invalid work efficiency values entered for thermal comfort calculation"); + ShowContinueError(state, "Outside of range values [0,1], Reference object=" + state.dataHeatBal->People(i).Name); + ErrorsFound = true; + } + } else { + ShowSevereError(state, + "GetPeople work efficiency: Work efficiency schedule is not found=" + state.dataHeatBal->People(i).Name); + ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); + ErrorsFound = true; + } + // Check Clothing Insulation + if (state.dataHeatBal->People(i).ClothingPtr > 0) { + ValidScheduleControlType = CheckScheduleValueMinMax(state, state.dataHeatBal->People(i).ClothingPtr, ">", 0.0, "<=", 2.0); + if (!ValidScheduleControlType) { + ShowSevereError( + state, + "GetPeople Clothing Insulation: Invalid Clothing Insulation values entered for thermal comfort calculation"); + ShowContinueError(state, "Outside of range values [0.0,2.0], Reference object=" + state.dataHeatBal->People(i).Name); + ErrorsFound = true; + } + } else { + ShowSevereError(state, + "GetPeople Clothing Insulation: Clothing Insulation schedule is not found=" + + state.dataHeatBal->People(i).Name); + ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); + ErrorsFound = true; + } + // Check Air velocity + if (state.dataHeatBal->People(i).AirVelocityPtr <= 0) { + ShowSevereError(state, "GetPeople Air Velocity: Air velocity schedule is not found=" + state.dataHeatBal->People(i).Name); + ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); + ErrorsFound = true; + } + } + } + + // Read Max and Min temperature setpoint + if (NumNums > 0) { + ComfortControlledZone(ComfortControlledZoneNum).TdbMinSetPoint = rNumericArgs(1); + if (rNumericArgs(1) > 50 || rNumericArgs(1) < 0) { + ShowSevereError( + state, + format("{}=\"{} invalid {}=[{:.0T}].", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(1), rNumericArgs(1))); + ShowContinueError(state, "..Allowable values must be between 0 C and 50 C"); + ErrorsFound = true; + } + } + if (NumNums > 1) { + ComfortControlledZone(ComfortControlledZoneNum).TdbMaxSetPoint = rNumericArgs(2); + if (rNumericArgs(2) > 50 || rNumericArgs(2) < 0) { + ShowSevereError( + state, + format("{}=\"{} invalid {}=[{:.0T}].", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(2), rNumericArgs(2))); + ShowContinueError(state, "..Allowable values must be between 0 C and 50 C"); + ErrorsFound = true; + } + } + // Ensure MaxTemp >= MinTemp + if (ComfortControlledZone(ComfortControlledZoneNum).TdbMinSetPoint > ComfortControlledZone(ComfortControlledZoneNum).TdbMaxSetPoint) { + ShowSevereError(state, cCurrentModuleObject + "=\"" + cAlphaArgs(1)); + ShowContinueError(state, ".." + cNumericFieldNames(1) + " > " + cNumericFieldNames(2)); + ShowContinueError(state, format("..[{:.0T}] > [{:.0T}].", rNumericArgs(1), rNumericArgs(2))); + ErrorsFound = true; + } + // If MaxTemp = MinTemp, no thermal comfort control + if (ComfortControlledZone(ComfortControlledZoneNum).TdbMinSetPoint == + ComfortControlledZone(ComfortControlledZoneNum).TdbMaxSetPoint) { + ShowSevereError(state, cCurrentModuleObject + "=\"" + cAlphaArgs(1)); + ShowContinueError(state, ".." + cNumericFieldNames(1) + " = " + cNumericFieldNames(2)); + ShowContinueError(state, "The zone will be controlled using this dry-bulb temperature setpoint."); + } + // read Thermal comfort type schedule name + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName = cAlphaArgs(5); + ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex = GetScheduleIndex(state, cAlphaArgs(5)); + if (ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + + "\" not found."); + ErrorsFound = true; + } else { + // Check validity of control types. + ValidScheduleControlType = + CheckScheduleValueMinMax(state, ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex, ">=", 0.0, "<=", 4.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid range " + cAlphaFieldNames(5) + "=\"" + + cAlphaArgs(5) + "\""); + ShowContinueError(state, "..contains values outside of range [0,4]."); + ErrorsFound = true; + } + } + ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes = nint((NumAlphas - 5.0) / 2.0); + ComfortControlledZone(ComfortControlledZoneNum).ControlType.allocate(ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + ComfortControlledZone(ComfortControlledZoneNum) + .ControlTypeName.allocate(ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + ComfortControlledZone(ComfortControlledZoneNum) + .ControlTypeSchIndx.allocate(ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + + for (ControlTypeNum = 1; ControlTypeNum <= ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes; ++ControlTypeNum) { + ComfortControlledZone(ComfortControlledZoneNum).ControlType(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 5)); + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum + 5)); + if (ComfortControlledZone(ComfortControlledZoneNum).ControlType(ControlTypeNum) != "") { + CTIndex = getEnumerationValue( + ValidComfortControlTypesUC, + UtilityRoutines::MakeUPPERCase(ComfortControlledZone(ComfortControlledZoneNum).ControlType(ControlTypeNum))); + if (CTIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + + cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 5)) + "=\"" + + cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 5)) + "\""); + ErrorsFound = true; + } + if (CTIndex > 4) { // For Fanger control only for the time being + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + + cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 5)) + "=\"" + + cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 5)) + "\""); + ShowContinueError(state, "..Fanger is the only valid model."); + ErrorsFound = true; + } + } else { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + + cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 5)) + "=\"\""); + ErrorsFound = true; + } + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ControlTypeNum) = 0; + } + } + } // NumComfortTStatStatements + } + // End of Thermal comfort control reading and checking + + cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)]; + state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls > 0) + state.dataZoneTempPredictorCorrector->SetPointSingleHeatingFanger.allocate( + state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &singleSetpointHtgFanger = state.dataZoneTempPredictorCorrector->SetPointSingleHeatingFanger(idx); + singleSetpointHtgFanger.Name = cAlphaArgs(1); + singleSetpointHtgFanger.PMVSchedName = cAlphaArgs(2); + singleSetpointHtgFanger.PMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (singleSetpointHtgFanger.PMVSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } else { + ValidScheduleControlType = CheckScheduleValueMinMax(state, singleSetpointHtgFanger.PMVSchedIndex, ">=", -3.0, "<=", 3.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + + cAlphaArgs(2) + "\" entered."); + ShowContinueError(state, "..Values outside of range [-3,+3]."); + ErrorsFound = true; + } + } + } // SingleFangerHeatingControlNum + + cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)]; + state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls > 0) { + state.dataZoneTempPredictorCorrector->SetPointSingleCoolingFanger.allocate( + state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls); + } + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &singleSetpointClgFanger = state.dataZoneTempPredictorCorrector->SetPointSingleCoolingFanger(idx); + singleSetpointClgFanger.Name = cAlphaArgs(1); + singleSetpointClgFanger.PMVSchedName = cAlphaArgs(2); + singleSetpointClgFanger.PMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (singleSetpointClgFanger.PMVSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } else { + ValidScheduleControlType = CheckScheduleValueMinMax(state, singleSetpointClgFanger.PMVSchedIndex, ">=", -3.0, "<=", 3.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + + cAlphaArgs(2) + "\" entered."); + ShowContinueError(state, "..Values outside of range [-3,+3]."); + ErrorsFound = true; + } + } + + } // SingleFangerCoolingControlNum + + cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)]; + state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls > 0) + state.dataZoneTempPredictorCorrector->SetPointSingleHeatCoolFanger.allocate( + state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &singleSetpointHeatCoolFanger = state.dataZoneTempPredictorCorrector->SetPointSingleHeatCoolFanger(idx); + singleSetpointHeatCoolFanger.Name = cAlphaArgs(1); + singleSetpointHeatCoolFanger.PMVSchedName = cAlphaArgs(2); + singleSetpointHeatCoolFanger.PMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (singleSetpointHeatCoolFanger.PMVSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } else { + ValidScheduleControlType = CheckScheduleValueMinMax(state, singleSetpointHeatCoolFanger.PMVSchedIndex, ">=", -3.0, "<=", 3.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + + cAlphaArgs(2) + "\" entered."); + ShowContinueError(state, "..Values outside of range [-3,+3]."); + ErrorsFound = true; + } + } + + } // SingleFangerHeatCoolControlNum + + cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)]; + state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls > 0) + state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger.allocate( + state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls); + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + auto &dualSetpointHeatCoolFanger = state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(idx); + dualSetpointHeatCoolFanger.Name = cAlphaArgs(1); + dualSetpointHeatCoolFanger.HeatPMVSetptSchedName = cAlphaArgs(2); + dualSetpointHeatCoolFanger.HeatPMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (dualSetpointHeatCoolFanger.HeatPMVSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + dualSetpointHeatCoolFanger.CoolPMVSetptSchedName = cAlphaArgs(3); + dualSetpointHeatCoolFanger.CoolPMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); + if (dualSetpointHeatCoolFanger.CoolPMVSchedIndex == 0) { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" not found."); + ErrorsFound = true; + } else { + ValidScheduleControlType = CheckScheduleValueMinMax(state, dualSetpointHeatCoolFanger.HeatPMVSchedIndex, ">=", -3.0, "<=", 3.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + + cAlphaArgs(2) + "\" entered."); + ShowContinueError(state, "..Values outside of range [-3,+3]."); + ErrorsFound = true; + } + ValidScheduleControlType = CheckScheduleValueMinMax(state, dualSetpointHeatCoolFanger.CoolPMVSchedIndex, ">=", -3.0, "<=", 3.0); + if (!ValidScheduleControlType) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(3) + "=\"" + + cAlphaArgs(3) + "\" entered."); + ShowContinueError(state, "..Values outside of range [-3,+3]."); + ErrorsFound = true; + } + } + + } // DualFangerHeatCoolControlNum + + // Finish filling in Schedule pointing indexes for Thermal Comfort Control + for (ComfortControlledZoneNum = 1; ComfortControlledZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++ComfortControlledZoneNum) { + + int ComfortIndex = UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)], + ComfortControlledZone(ComfortControlledZoneNum).ControlType, + ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeating = ComfortIndex; + if (ComfortIndex > 0) { + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = + UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), + state.dataZoneTempPredictorCorrector->SetPointSingleHeatingFanger); + TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)] = true; + } + + ComfortIndex = UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)], + ComfortControlledZone(ComfortControlledZoneNum).ControlType, + ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleCooling = ComfortIndex; + if (ComfortIndex > 0) { + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = + UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), + state.dataZoneTempPredictorCorrector->SetPointSingleCoolingFanger); + TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)] = true; + } + + ComfortIndex = UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)], + ComfortControlledZone(ComfortControlledZoneNum).ControlType, + ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeatCool = ComfortIndex; + if (ComfortIndex > 0) { + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = + UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), + state.dataZoneTempPredictorCorrector->SetPointSingleHeatCoolFanger); + TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)] = true; + } + + ComfortIndex = + UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)], + ComfortControlledZone(ComfortControlledZoneNum).ControlType, + ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); + ComfortControlledZone(ComfortControlledZoneNum).SchIndx_DualSetPointWithDeadBand = ComfortIndex; + if (ComfortIndex > 0) { + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = + UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), + state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger); + TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)] = + true; + } + } + + // Now, Check the schedule values/indices for validity for Thermal Comfort Control + + for (ComfortControlledZoneNum = 1; ComfortControlledZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++ComfortControlledZoneNum) { + + ActualZoneNum = ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum; + CTIndex = ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex; + if (CTIndex == 0) continue; // error will be caught elsewhere + SchedMin = GetScheduleMinValue(state, CTIndex); + SchedMax = GetScheduleMaxValue(state, CTIndex); + + if (SchedMin == 0 && SchedMax == 0) { + if (FindNumberInList(CTIndex, CCmSchedMapToControlledZone, state.dataZoneCtrls->NumComfortControlledZones) == 0) { + ShowWarningError(state, "Control Type Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, "..specifies control type 0 for all entries."); + ShowContinueError(state, "All zones using this Control Type Schedule have no thermal comfort control."); + } + CCmSchedMapToControlledZone(ComfortControlledZoneNum) = CTIndex; + } + + for (ControlTypeNum = SchedMin; ControlTypeNum <= SchedMax; ++ControlTypeNum) { + + int ComfortIndex; + switch (static_cast(ControlTypeNum)) { + case DataHVACGlobals::ThermostatType::Uncontrolled: + break; + case DataHVACGlobals::ThermostatType::SingleHeating: + ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeating; + TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)] = true; + if (ComfortIndex != 0) { + SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); + if (SchedTypeIndex == 0) { + ShowSevereError(state, + format("GetZoneAirSetpoints: Could not find {} Schedule={}", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)], + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); + ErrorsFound = true; + } + } else { // ComfortIndex = 0 + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeating))) { + ShowSevereError(state, "Control Type Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies thermal control type 1 ({}) as the control type. Not valid for this zone.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleCooling; + TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)] = true; + if (ComfortIndex != 0) { + SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); + if (SchedTypeIndex == 0) { + ShowSevereError(state, + format("GetZoneAirSetpoints: Could not find {} Schedule={}", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)], + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); + ErrorsFound = true; + } + } else { // ComfortIndex = 0 + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleCooling))) { + ShowSevereError(state, "Control Type Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies thermal control type 2 ({}) as the control type. Not valid for this zone.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeatCool; + TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)] = true; + if (ComfortIndex != 0) { + SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); + if (SchedTypeIndex == 0) { + ShowSevereError(state, + format("GetZoneAirSetpoints: Could not find {} Schedule={}", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)], + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); + ErrorsFound = true; + } + } else { // ComfortIndex = 0 + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool))) { + ShowSevereError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("..specifies thermal control type 3 ({}) as the control type. Not valid for this zone.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_DualSetPointWithDeadBand; + TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)] = + true; + if (ComfortIndex != 0) { + SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); + if (SchedTypeIndex == 0) { + ShowSevereError(state, + format("GetZoneAirSetpoints: Could not find {} Schedule={}", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)], + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); + ErrorsFound = true; + } + } else { // ComfortIndex = 0 + if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand))) { + ShowSevereError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError( + state, + format("..specifies thermal control type 4 ({}) as the control type. Not valid for this zone.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + ErrorsFound = true; + } + } + break; + default: + ShowSevereError(state, + format("GetZoneAirSetpoints: Illegal control type for Zone={}, Found value={}, in Schedule={}", + Zone(ActualZoneNum).Name, + ControlTypeNum, + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName)); + ShowContinueError(state, "..valid range values are [0,4]."); + ErrorsFound = true; + break; + } + } + } + + for (ComfortControlledZoneNum = 1; ComfortControlledZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++ComfortControlledZoneNum) { + + ActualZoneNum = ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum; + CTIndex = ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex; + if (CTIndex == 0) continue; // error caught elsewhere -- would just be confusing here + + for (ControlTypeNum = 1; ControlTypeNum <= 4; ++ControlTypeNum) { + if (TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum] && + TComfortControlTypes(ComfortControlledZoneNum).DidHave[ControlTypeNum]) + continue; + + switch (static_cast(ControlTypeNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 1 ({}) but does not.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 2 ({}) but does not.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 3 ({}) but does not.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; + ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); + ShowContinueError(state, + format("...should include control type 4 ({}) but does not.", + ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); + ShowContinueError(state, + "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + + ComfortControlledZone(ComfortControlledZoneNum).Name); + ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); + break; + default: + break; + } + } + } + + if (allocated(TComfortControlTypes)) TComfortControlTypes.deallocate(); + + // Get the Hybrid Model setting inputs + HybridModel::GetHybridModelZone(state); + + // Default multiplier values + Real64 ZoneVolCapMultpSens = 1.0; + Real64 ZoneVolCapMultpMoist = 1.0; + Real64 ZoneVolCapMultpCO2 = 1.0; + Real64 ZoneVolCapMultpGenContam = 1.0; + + // Get the Zone Air Capacitance Multiplier for use in the Predictor-Corrector Procedure + cCurrentModuleObject = "ZoneCapacitanceMultiplier:ResearchSpecial"; + int NumZoneCapaMultiplier = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); // Number of ZonesCapacityMultiplier object + if (NumZoneCapaMultiplier == 0) { + // Assign default multiplier values to all zones + for (int ZoneNum = 1; ZoneNum <= NumOfZones; ZoneNum++) { + Zone(ZoneNum).ZoneVolCapMultpSens = ZoneVolCapMultpSens; + Zone(ZoneNum).ZoneVolCapMultpMoist = ZoneVolCapMultpMoist; + Zone(ZoneNum).ZoneVolCapMultpCO2 = ZoneVolCapMultpCO2; + Zone(ZoneNum).ZoneVolCapMultpGenContam = ZoneVolCapMultpGenContam; + } + + } else { + + // Allow user to specify ZoneCapacitanceMultiplier:ResearchSpecial at zone level + // Added by S. Lee and R. Zhang in Oct. 2016. + // Assign the user inputted multipliers to specified zones + for (int ZoneCapNum = 1; ZoneCapNum <= NumZoneCapaMultiplier; ZoneCapNum++) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + ZoneCapNum, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + + if (lAlphaFieldBlanks(2)) { + // default multiplier values for all the zones not specified (zone or zonelist name field is empty) + ZoneVolCapMultpSens = rNumericArgs(1); + ZoneVolCapMultpMoist = rNumericArgs(2); + ZoneVolCapMultpCO2 = rNumericArgs(3); + ZoneVolCapMultpGenContam = rNumericArgs(4); + } else { + // multiplier values for the specified zone(s) + int ZoneNum = 0; + ZLItem = 0; + Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); + if (Item1 > 0) { + ZoneNum = Item1; + Zone(ZoneNum).FlagCustomizedZoneCap = true; + Zone(ZoneNum).ZoneVolCapMultpSens = rNumericArgs(1); + Zone(ZoneNum).ZoneVolCapMultpMoist = rNumericArgs(2); + Zone(ZoneNum).ZoneVolCapMultpCO2 = rNumericArgs(3); + Zone(ZoneNum).ZoneVolCapMultpGenContam = rNumericArgs(4); + } else if (ZLItem > 0) { + for (int ZonePtrNum = 1; ZonePtrNum < ZoneList(ZLItem).NumOfZones; ZonePtrNum++) { + ZoneNum = ZoneList(ZLItem).Zone(ZonePtrNum); + Zone(ZoneNum).FlagCustomizedZoneCap = true; + Zone(ZoneNum).ZoneVolCapMultpSens = rNumericArgs(1); + Zone(ZoneNum).ZoneVolCapMultpMoist = rNumericArgs(2); + Zone(ZoneNum).ZoneVolCapMultpCO2 = rNumericArgs(3); + Zone(ZoneNum).ZoneVolCapMultpGenContam = rNumericArgs(4); + } + + } else { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" not found."); + ErrorsFound = true; + } + } + } + + // Assign default multiplier values to all the other zones + for (int ZoneNum = 1; ZoneNum <= NumOfZones; ZoneNum++) { + if (!Zone(ZoneNum).FlagCustomizedZoneCap) { + Zone(ZoneNum).ZoneVolCapMultpSens = ZoneVolCapMultpSens; + Zone(ZoneNum).ZoneVolCapMultpMoist = ZoneVolCapMultpMoist; + Zone(ZoneNum).ZoneVolCapMultpCO2 = ZoneVolCapMultpCO2; + Zone(ZoneNum).ZoneVolCapMultpGenContam = ZoneVolCapMultpGenContam; + } + } + + // Calculate the average multiplier value from all zones + { + Real64 ZoneVolCapMultpSens_temp = 0.0; + Real64 ZoneVolCapMultpMoist_temp = 0.0; + Real64 ZoneVolCapMultpCO2_temp = 0.0; + Real64 ZoneVolCapMultpGenContam_temp = 0.0; + + for (int ZoneNum = 1; ZoneNum <= NumOfZones; ZoneNum++) { + ZoneVolCapMultpSens_temp += Zone(ZoneNum).ZoneVolCapMultpSens; + ZoneVolCapMultpMoist_temp += Zone(ZoneNum).ZoneVolCapMultpMoist; + ZoneVolCapMultpCO2_temp += Zone(ZoneNum).ZoneVolCapMultpCO2; + ZoneVolCapMultpGenContam_temp += Zone(ZoneNum).ZoneVolCapMultpGenContam; + } + + if (NumOfZones > 0) { + ZoneVolCapMultpSens = ZoneVolCapMultpSens_temp / NumOfZones; + ZoneVolCapMultpMoist = ZoneVolCapMultpMoist_temp / NumOfZones; + ZoneVolCapMultpCO2 = ZoneVolCapMultpCO2_temp / NumOfZones; + ZoneVolCapMultpGenContam = ZoneVolCapMultpGenContam_temp / NumOfZones; + } + } + } + + print(state.files.eio, Header); + print(state.files.eio, Format_701, ZoneVolCapMultpSens, ZoneVolCapMultpMoist, ZoneVolCapMultpCO2, ZoneVolCapMultpGenContam); + + cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::OTTStat)); + state.dataZoneCtrls->NumOpTempControlledZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneCtrls->NumOpTempControlledZones > 0) { + state.dataZoneCtrls->AnyOpTempControl = true; + + for (int idx = 1; idx <= state.dataZoneCtrls->NumOpTempControlledZones; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + // find matching name of ZONECONTROL:THERMOSTAT object + found = UtilityRoutines::FindItem(cAlphaArgs(1), TStatObjects); + if (found == 0) { + // It might be in the TempControlledZones + found = UtilityRoutines::FindItem(cAlphaArgs(1), TempControlledZone); + if (found == 0) { // throw error + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + " reference not found."); + ErrorsFound = true; + } else { + TempControlledZoneNum = found; + TempControlledZone(TempControlledZoneNum).OperativeTempControl = true; + if (UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled")) { + TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled = true; + } + if ((!(UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled"))) && (!(UtilityRoutines::SameString(cAlphaArgs(2), "Constant")))) { + ShowSevereError( + state, cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\"."); + ErrorsFound = true; + } + + TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction = rNumericArgs(1); + TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched = GetScheduleIndex(state, cAlphaArgs(3)); + if ((TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched == 0) && + (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled)) { // throw error + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + + "\" not found."); + ErrorsFound = true; + } + + // check validity of fixed radiative fraction + if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction < 0.0) && + (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be negative.", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction >= 0.9) && + (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot >= .9.", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + + // check schedule min max. + if (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled) { + ValidRadFractSched = CheckScheduleValueMinMax( + state, TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched, ">=", 0.0, "<", 0.9); + if (!ValidRadFractSched) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(3) + "=[" + + cAlphaArgs(3) + "\"."); + ShowContinueError(state, "..Values outside of range [0.0,0.9)."); + ErrorsFound = true; + } + } + + // added Jan, 2017 - Xuan Luo + // read adaptive comfort model and calculate adaptive thermal comfort setpoint + if (TempControlledZone(TempControlledZoneNum).OperativeTempControl) { + if (NumAlphas >= 4 && !lAlphaFieldBlanks(4)) { + int adaptiveComfortModelTypeIndex = + UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); + if (!adaptiveComfortModelTypeIndex) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + + cAlphaArgs(4) + "\" not found."); + ErrorsFound = true; + } else if (adaptiveComfortModelTypeIndex != static_cast(AdaptiveComfortModel::ADAP_NONE)) { + TempControlledZone(TempControlledZoneNum).AdaptiveComfortTempControl = true; + TempControlledZone(TempControlledZoneNum).AdaptiveComfortModelTypeIndex = + UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); + if (!state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule.initialized) { + Array1D runningAverageASH(state.dataWeatherManager->NumDaysInYear, 0.0); + Array1D runningAverageCEN(state.dataWeatherManager->NumDaysInYear, 0.0); + CalculateMonthlyRunningAverageDryBulb(state, runningAverageASH, runningAverageCEN); + CalculateAdaptiveComfortSetPointSchl(state, runningAverageASH, runningAverageCEN); + } + } + } + } + + // CurrentModuleObject='ZoneControl:Thermostat:OperativeTemperature' + SetupOutputVariable(state, + "Zone Thermostat Operative Temperature", + OutputProcessor::Unit::C, + state.dataHeatBal->ZnAirRpt(TempControlledZone(TempControlledZoneNum).ActualZoneNum).ThermOperativeTemp, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + Zone(TempControlledZone(TempControlledZoneNum).ActualZoneNum).Name); + } + } else { + for (Item = 1; Item <= TStatObjects(found).NumOfZones; ++Item) { + TempControlledZoneNum = TStatObjects(found).TempControlledZoneStartPtr + Item - 1; + if (NumTempControlledZones == 0) continue; + TempControlledZone(TempControlledZoneNum).OperativeTempControl = true; + if (UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled")) { + TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled = true; + } + if (Item == 1) { + if ((!(UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled"))) && + (!(UtilityRoutines::SameString(cAlphaArgs(2), "Constant")))) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\"."); + ErrorsFound = true; + } + } + + TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction = rNumericArgs(1); + TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched = GetScheduleIndex(state, cAlphaArgs(3)); + if (Item == 1) { + if ((TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched == 0) && + (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled)) { // throw error + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + + "\" not found."); + ErrorsFound = true; + } + } + + // check validity of fixed radiative fraction + if (Item == 1) { + if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction < 0.0) && + (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be negative.", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + } + if (Item == 1) { + if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction >= 0.9) && + (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot >= .9.", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + } + + // check schedule min max. + if (Item == 1) { + if (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled) { + ValidRadFractSched = CheckScheduleValueMinMax( + state, TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched, ">=", 0.0, "<", 0.9); + if (!ValidRadFractSched) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(3) + "=[" + + cAlphaArgs(3) + "\"."); + ShowContinueError(state, "..Values outside of range [0.0,0.9)."); + ErrorsFound = true; + } + } + } + + // added Jan, 2017 - Xuan Luo + // read adaptive comfort model and calculate adaptive thermal comfort setpoint + if (TempControlledZone(TempControlledZoneNum).OperativeTempControl) { + if (NumAlphas >= 4 && !lAlphaFieldBlanks(4)) { + int adaptiveComfortModelTypeIndex = + UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); + if (!adaptiveComfortModelTypeIndex) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + + cAlphaArgs(4) + "\" not found."); + ErrorsFound = true; + } else if (adaptiveComfortModelTypeIndex != static_cast(AdaptiveComfortModel::ADAP_NONE)) { + TempControlledZone(TempControlledZoneNum).AdaptiveComfortTempControl = true; + TempControlledZone(TempControlledZoneNum).AdaptiveComfortModelTypeIndex = + UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); + if (!state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule.initialized) { + Array1D runningAverageASH(state.dataWeatherManager->NumDaysInYear, 0.0); + Array1D runningAverageCEN(state.dataWeatherManager->NumDaysInYear, 0.0); + CalculateMonthlyRunningAverageDryBulb(state, runningAverageASH, runningAverageCEN); + CalculateAdaptiveComfortSetPointSchl(state, runningAverageASH, runningAverageCEN); + } + } + } + } + + // CurrentModuleObject='ZoneControl:Thermostat:OperativeTemperature' + SetupOutputVariable(state, + "Zone Thermostat Operative Temperature", + OutputProcessor::Unit::C, + state.dataHeatBal->ZnAirRpt(TempControlledZone(TempControlledZoneNum).ActualZoneNum).ThermOperativeTemp, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + Zone(TempControlledZone(TempControlledZoneNum).ActualZoneNum).Name); + } // TStat Objects Loop + } // found thermostat referene + } // loop over NumOpTempControlledZones + } // NumOpTempControlledZones > 0 + + // Overcool dehumidificaton GetInput starts here + cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::TandHStat)); + state.dataZoneCtrls->NumTempAndHumidityControlledZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + + if (state.dataZoneCtrls->NumTempAndHumidityControlledZones > 0) { + state.dataZoneCtrls->AnyZoneTempAndHumidityControl = true; + + for (int idx = 1; idx <= state.dataZoneCtrls->NumTempAndHumidityControlledZones; ++idx) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + idx, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + // find matching name of ZONECONTROL:THERMOSTAT object + found = UtilityRoutines::FindItem(cAlphaArgs(1), TStatObjects); + if (found == 0) { + // It might be in the TempControlledZones + found = UtilityRoutines::FindItem(cAlphaArgs(1), TempControlledZone); + if (found == 0) { // throw error + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + " reference not found."); + ErrorsFound = true; + } else { + TempControlledZoneNum = found; + TempControlledZone(TempControlledZoneNum).DehumidifyingSched = cAlphaArgs(2); + TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" not found."); + ErrorsFound = true; + } + TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = true; + if ((UtilityRoutines::SameString(cAlphaArgs(3), "None"))) { + TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = false; + } + if (UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled")) { + TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled = true; + } + if ((!(UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled"))) && (!(UtilityRoutines::SameString(cAlphaArgs(4), "Constant")))) { + ShowSevereError( + state, cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + "\"."); + ErrorsFound = true; + } + + TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange = rNumericArgs(1); + TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex = GetScheduleIndex(state, cAlphaArgs(4)); + if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex == 0) && + (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled)) { // throw error + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + + "\" not found."); + ErrorsFound = true; + } + + // check validity of zone Overcool constant range + if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange < 0.0) && + (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be negative.", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange > 3.0) && + (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be > 3.0", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + + // check zone Overcool range schedule min/max values. + if (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled) { + ValidZoneOvercoolRangeSched = CheckScheduleValueMinMax( + state, TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex, ">=", 0.0, "<=", 3.0); + if (!ValidZoneOvercoolRangeSched) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(5) + "=[" + + cAlphaArgs(5) + "\"."); + ShowContinueError(state, "..Values outside of range [0.0,3.0]."); + ErrorsFound = true; + } + } + // check Overcool Control Ratio limits + TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio = rNumericArgs(2); + if (TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio < 0.0) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be negative.", + cCurrentModuleObject, + cAlphaArgs(2), + cNumericFieldNames(2), + rNumericArgs(2))); + ErrorsFound = true; + } + } + } else { + for (Item = 1; Item <= TStatObjects(found).NumOfZones; ++Item) { + TempControlledZoneNum = TStatObjects(found).TempControlledZoneStartPtr + Item - 1; + TempControlledZone(TempControlledZoneNum).DehumidifyingSched = cAlphaArgs(2); + TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); + if (TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" not found."); + ErrorsFound = true; + } + TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = true; + if ((UtilityRoutines::SameString(cAlphaArgs(3), "None"))) { + TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = false; + } + if (UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled")) { + TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled = false; + } + if (Item == 1) { + if ((!(UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled"))) && + (!(UtilityRoutines::SameString(cAlphaArgs(4), "Constant")))) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + + "\"."); + ErrorsFound = true; + } + } + TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange = rNumericArgs(1); + TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex = GetScheduleIndex(state, cAlphaArgs(6)); + if (Item == 1) { + if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex == 0) && + (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled)) { // throw error + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + + "\" not found."); + ErrorsFound = true; + } + } + // check validity of zone Overcool constant range + if (Item == 1) { + if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange < 0.0) && + (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be negative.", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + } + if (Item == 1) { + if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange > 3.0) && + (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot > 3.0", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(1), + rNumericArgs(1))); + ErrorsFound = true; + } + } + // check zone Overcool range schedule min/max values. + if (Item == 1) { + if (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled) { + ValidZoneOvercoolRangeSched = CheckScheduleValueMinMax( + state, TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex, ">=", 0.0, "<=", 3.0); + if (!ValidZoneOvercoolRangeSched) { + ShowSevereError(state, + cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(5) + "=[" + + cAlphaArgs(5) + "\"."); + ShowContinueError(state, "..Values outside of range [0.0,3.0]."); + ErrorsFound = true; + } + } + } + TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio = rNumericArgs(2); + // check Overcool Control Ratio limits + if (Item == 1) { + if (TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio < 0.0) { + ShowSevereError(state, + format("{}={} invalid {}=[{:.2T}\" cannot be negative.", + cCurrentModuleObject, + cAlphaArgs(2), + cNumericFieldNames(2), + rNumericArgs(2))); + ErrorsFound = true; + } + } + + } // TStat Objects Loop + } // found thermostat reference + } // loop over NumTempAndHumidityControlledZones + } // NumTempAndHumidityControlledZones > 0 + + // Staged thermostat control inputs start + cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::StagedDual)); + NumStageControlledZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); + if (NumStageControlledZones > 0) state.dataZoneCtrls->StagedTStatObjects.allocate(NumStageControlledZones); + + // Pre-scan for use of Zone lists in TStat statements (i.e. Global application of TStat) + state.dataZoneTempPredictorCorrector->NumStageCtrZone = 0; + for (Item = 1; Item <= NumStageControlledZones; ++Item) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Item, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); + + state.dataZoneCtrls->StagedTStatObjects(Item).Name = cAlphaArgs(1); + Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + ZLItem = 0; + if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); + if (Item1 > 0) { + state.dataZoneCtrls->StagedTStatObjects(Item).StageControlledZoneStartPtr = state.dataZoneTempPredictorCorrector->NumStageCtrZone + 1; + ++state.dataZoneTempPredictorCorrector->NumStageCtrZone; + state.dataZoneCtrls->StagedTStatObjects(Item).NumOfZones = 1; + state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive = false; + state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr = Item1; + } else if (ZLItem > 0) { + state.dataZoneCtrls->StagedTStatObjects(Item).TempControlledZoneStartPtr = state.dataZoneTempPredictorCorrector->NumStageCtrZone + 1; + state.dataZoneTempPredictorCorrector->NumStageCtrZone += ZoneList(ZLItem).NumOfZones; + state.dataZoneCtrls->StagedTStatObjects(Item).NumOfZones = ZoneList(ZLItem).NumOfZones; + state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive = true; + state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr = ZLItem; + } else { + ShowSevereError( + state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); + ErrorsFound = true; + } + } + + if (ErrorsFound) { + ShowSevereError(state, "GetStagedDualSetpoint: Errors with invalid names in " + cCurrentModuleObject + " objects."); + ShowContinueError(state, "...These will not be read in. Other errors may occur."); + state.dataZoneTempPredictorCorrector->NumStageCtrZone = 0; + } + + if (state.dataZoneTempPredictorCorrector->NumStageCtrZone > 0) { + StageControlledZone.allocate(state.dataZoneTempPredictorCorrector->NumStageCtrZone); + state.dataZoneCtrls->StageZoneLogic.dimension(NumOfZones, false); + + StageControlledZoneNum = 0; + for (Item = 1; Item <= NumStageControlledZones; ++Item) { + inputProcessor->getObjectItem(state, + cCurrentModuleObject, + Item, + cAlphaArgs, + NumAlphas, + rNumericArgs, + NumNums, + IOStat, + lNumericFieldBlanks, + lAlphaFieldBlanks, + cAlphaFieldNames, + cNumericFieldNames); + for (Item1 = 1; Item1 <= state.dataZoneCtrls->StagedTStatObjects(Item).NumOfZones; ++Item1) { + ++StageControlledZoneNum; + if (state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive) { + cAlphaArgs(2) = + state.dataHeatBal->Zone(ZoneList(state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name; + } + int ZoneAssigned = UtilityRoutines::FindItemInList( + cAlphaArgs(2), StageControlledZone, &DataZoneControls::ZoneStagedControls::ZoneName, StageControlledZoneNum - 1); + if (ZoneAssigned == 0) { + StageControlledZone(StageControlledZoneNum).ZoneName = cAlphaArgs(2); + StageControlledZone(StageControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); + if (StageControlledZone(StageControlledZoneNum).ActualZoneNum == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" not found."); + ErrorsFound = true; + } else { + // Zone(StageControlledZone(StageControlledZoneNum)%ActualZoneNum)%StageControlledZoneIndex = + // StageControlledZoneNum + } + state.dataZoneCtrls->StageZoneLogic(StageControlledZone(StageControlledZoneNum).ActualZoneNum) = true; + } else { + StageControlledZone(StageControlledZoneNum).ZoneName = cAlphaArgs(2); // for continuity + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + + "\" zone previously assigned."); + ShowContinueError(state, "...Zone was previously assigned to Thermostat=\"" + StageControlledZone(ZoneAssigned).Name + "\"."); + ErrorsFound = true; + continue; + } + + if (!state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive) { + StageControlledZone(StageControlledZoneNum).Name = cAlphaArgs(1); + } else { + CheckCreatedZoneItemName( + state, + RoutineName, + cCurrentModuleObject, + state.dataHeatBal->Zone(ZoneList(state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name, + ZoneList(state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr).MaxZoneNameLength, + state.dataZoneCtrls->StagedTStatObjects(Item).Name, + StageControlledZone, + StageControlledZoneNum - 1, + StageControlledZone(StageControlledZoneNum).Name, + errFlag); + if (errFlag) ErrorsFound = true; + } + + StageControlledZone(StageControlledZoneNum).NumOfHeatStages = rNumericArgs(1); + if (rNumericArgs(1) < 1 || rNumericArgs(1) > 4) { + ShowSevereError( + state, + format("{}=\"{}\" invalid range {}=\"{:.0R}\"", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(1), rNumericArgs(1))); + ShowContinueError(state, "..contains values outside of range [1,4]."); + ErrorsFound = true; + } + + StageControlledZone(StageControlledZoneNum).HeatSetBaseSchedName = cAlphaArgs(3); + StageControlledZone(StageControlledZoneNum).HSBchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); + if (Item1 == 1) { // only show error on first of several if zone list + if (StageControlledZone(StageControlledZoneNum).HSBchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + + "\" not found."); + ErrorsFound = true; + } + } + + StageControlledZone(StageControlledZoneNum).HeatThroRange = rNumericArgs(2); + if (rNumericArgs(1) < 0.0) { + ShowSevereError(state, + format("{}=\"{}\" negative value is found at {}=\"{:.1R}\"", + cAlphaArgs(1), + cCurrentModuleObject, + cNumericFieldNames(2), + rNumericArgs(2))); + ShowContinueError(state, ".. The minimum value is 0."); + ErrorsFound = true; + } + + if (StageControlledZone(StageControlledZoneNum).NumOfHeatStages > 0) { + StageControlledZone(StageControlledZoneNum).HeatTOffset.allocate(StageControlledZone(StageControlledZoneNum).NumOfHeatStages); + for (i = 1; i <= StageControlledZone(StageControlledZoneNum).NumOfHeatStages; ++i) { + StageControlledZone(StageControlledZoneNum).HeatTOffset(i) = rNumericArgs(2 + i); + if (rNumericArgs(2 + i) > 0.0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" positive value is found at " + + format("{}=\"{:.1R}\"", cNumericFieldNames(2 + i), rNumericArgs(2 + i))); + ShowContinueError(state, ".. The maximum value is 0."); + ErrorsFound = true; + } + if (lNumericFieldBlanks(2 + i)) { + ShowSevereError(state, + cCurrentModuleObject + " object =" + cAlphaArgs(1) + ". The input of " + cNumericFieldNames(2 + i) + + " is required, but a blank is found."); + ErrorsFound = true; + } + if (i > 1) { + if (rNumericArgs(2 + i) >= rNumericArgs(1 + i)) { + ShowSevereError(state, + format(R"({}="{}" The value at {}="{:.1R}" has to be less than )", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(2 + i), + rNumericArgs(2 + i))); + ShowContinueError(state, format("{}=\"{:.1R}", cNumericFieldNames(1 + i), rNumericArgs(1 + i))); + ErrorsFound = true; + } + } + } + } + + StageControlledZone(StageControlledZoneNum).NumOfCoolStages = rNumericArgs(7); + if (rNumericArgs(7) < 1 || rNumericArgs(7) > 4) { + ShowSevereError( + state, + format("{}=\"{}\" invalid range {}=\"{:.0R}\"", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(7), rNumericArgs(7))); + ShowContinueError(state, "..contains values outside of range [1,4]."); + ErrorsFound = true; + } + + StageControlledZone(StageControlledZoneNum).CoolSetBaseSchedName = cAlphaArgs(4); + StageControlledZone(StageControlledZoneNum).CSBchedIndex = GetScheduleIndex(state, cAlphaArgs(4)); + if (Item1 == 1) { // only show error on first of several if zone list + if (StageControlledZone(StageControlledZoneNum).CSBchedIndex == 0) { + ShowSevereError(state, + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + + "\" not found."); + ErrorsFound = true; + } + } + + StageControlledZone(StageControlledZoneNum).CoolThroRange = rNumericArgs(8); + if (rNumericArgs(8) < 0.0) { + ShowSevereError(state, + format("{}=\"{}\" negative value is found at {}=\"{:.1R}\"", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(8), + rNumericArgs(8))); + ShowContinueError(state, ".. The minumum value is 0."); + ErrorsFound = true; + } + + if (StageControlledZone(StageControlledZoneNum).NumOfCoolStages > 0) { + StageControlledZone(StageControlledZoneNum).CoolTOffset.allocate(StageControlledZone(StageControlledZoneNum).NumOfCoolStages); + for (i = 1; i <= StageControlledZone(StageControlledZoneNum).NumOfCoolStages; ++i) { + StageControlledZone(StageControlledZoneNum).CoolTOffset(i) = rNumericArgs(8 + i); + if (rNumericArgs(8 + i) < 0.0) { + ShowSevereError(state, + format("{}=\"{}\" negative value is found at {}=\"{:.1R}\"", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(8 + i), + rNumericArgs(8 + i))); + ShowContinueError(state, ".. The minimum value is 0."); + ErrorsFound = true; + } + if (lNumericFieldBlanks(8 + i)) { + ShowSevereError(state, + cCurrentModuleObject + " object =" + cAlphaArgs(1) + ". The input of " + cNumericFieldNames(8 + i) + + " is required, but a blank is found."); + ErrorsFound = true; + } + if (i > 1) { + if (rNumericArgs(8 + i) <= rNumericArgs(7 + i)) { + ShowSevereError(state, + format("{}=\"{}\" The value at {}=\"{:.1R}\" has to be greater than ", + cCurrentModuleObject, + cAlphaArgs(1), + cNumericFieldNames(8 + i), + rNumericArgs(8 + i))); + ShowContinueError(state, format("{}=\"{:.1R}", cNumericFieldNames(7 + i), rNumericArgs(7 + i))); + ErrorsFound = true; + } + } + } + } + } + } // loop over NumStageControlledZones + if ((inputProcessor->getNumObjectsFound(state, "AirLoopHVAC:UnitaryHeatPump:AirToAir:MultiSpeed") == 0) && + (inputProcessor->getNumObjectsFound(state, "AirLoopHVAC:UnitarySystem") == 0) && + (inputProcessor->getNumObjectsFound(state, "SetpointManager:SingleZone:OneStageCooling") == 0) && + (inputProcessor->getNumObjectsFound(state, "SetpointManager:SingleZone:OneStageHeating") == 0)) { + ShowWarningError(state, cCurrentModuleObject + " is applicable to only selected HVAC objects which are missing from input."); + ShowContinueError(state, "Model should include one or more of the following objects: "); + ShowContinueError(state, "AirLoopHVAC:UnitaryHeatPump:AirToAir:MultiSpeed, AirLoopHVAC:UnitarySystem, "); + ShowContinueError( + state, "SetpointManager:SingleZone:OneStageCooling, and/or SetpointManager:SingleZone:OneStageHeating. The simulation continues..."); + } + } // NumStageControlledZones > 0 + + if (ErrorsFound) { + ShowFatalError(state, "Errors getting Zone Control input data. Preceding condition(s) cause termination."); + } +} + +void CalculateMonthlyRunningAverageDryBulb(EnergyPlusData &state, Array1D &runningAverageASH, Array1D &runningAverageCEN) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Xuan Luo + // DATE WRITTEN January 2017 + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine calculate the monthly running average dry bulb temperature; + + // Using/Aliasing + + using OutputReportTabular::GetColumnUsingTabs; + using OutputReportTabular::StrToReal; + + // SUBROUTINE PARAMETER DEFINITIONS: + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + + std::string lineIn; + std::string lineAvg; + std::string epwLine; + + Real64 dryBulb; + Real64 avgDryBulb; + + int readStat; + int calcEndDay; + int calcStartDayASH; + int calcStartDayCEN; + + std::string::size_type pos; + int ind, i, j; + + Array1D adaptiveTemp(state.dataWeatherManager->NumDaysInYear, 0.0); + Array1D dailyDryTemp(state.dataWeatherManager->NumDaysInYear, 0.0); + + readStat = 0; + if (FileSystem::fileExists(state.files.inputWeatherFilePath.filePath)) { + // Read hourly dry bulb temperature first + auto epwFile = state.files.inputWeatherFilePath.open(state, "CalcThermalComfortAdaptive"); + for (i = 1; i <= 9; ++i) { // Headers + epwFile.readLine(); + } + for (i = 1; i <= state.dataWeatherManager->NumDaysInYear; ++i) { + avgDryBulb = 0.0; + for (j = 1; j <= 24; ++j) { + epwLine = epwFile.readLine().data; + for (ind = 1; ind <= 6; ++ind) { + pos = index(epwLine, ','); + epwLine.erase(0, pos + 1); + } + pos = index(epwLine, ','); + dryBulb = StrToReal(epwLine.substr(0, pos)); + avgDryBulb += (dryBulb / 24.0); + } + dailyDryTemp(i) = avgDryBulb; + } + epwFile.close(); + + // Calculate monthly running average dry bulb temperature. + int dayOfYear = 0; + while (dayOfYear < state.dataWeatherManager->NumDaysInYear) { + dayOfYear++; + calcEndDay = dayOfYear - 1; + calcStartDayASH = calcEndDay - 30; + calcStartDayCEN = calcEndDay - 7; + + if (calcStartDayASH > 0) { + for (i = calcStartDayASH; i <= calcStartDayASH + 30; i++) { + avgDryBulb = dailyDryTemp(i); + runningAverageASH(dayOfYear) = runningAverageASH(dayOfYear) + avgDryBulb; + } + runningAverageASH(dayOfYear) /= 30; + } else { // Do special things for wrapping the epw + calcStartDayASH += state.dataWeatherManager->NumDaysInYear; + for (i = 1; i <= calcEndDay; i++) { + avgDryBulb = dailyDryTemp(i); + runningAverageASH(dayOfYear) = runningAverageASH(dayOfYear) + avgDryBulb; + } + for (i = calcStartDayASH; i < state.dataWeatherManager->NumDaysInYear; i++) { + avgDryBulb = dailyDryTemp(i); + runningAverageASH(dayOfYear) = runningAverageASH(dayOfYear) + avgDryBulb; + } + runningAverageASH(dayOfYear) /= 30; + } + + if (calcStartDayCEN > 0) { + for (i = calcStartDayCEN; i <= calcStartDayCEN + 7; i++) { + avgDryBulb = dailyDryTemp(i); + runningAverageCEN(dayOfYear) = runningAverageCEN(dayOfYear) + avgDryBulb; + } + runningAverageCEN(dayOfYear) /= 7; + } else { // Do special things for wrapping the epw + calcStartDayCEN += state.dataWeatherManager->NumDaysInYear; + for (i = 1; i <= calcEndDay; i++) { + avgDryBulb = dailyDryTemp(i); + runningAverageCEN(dayOfYear) = runningAverageCEN(dayOfYear) + avgDryBulb; + } + for (i = calcStartDayCEN; i < state.dataWeatherManager->NumDaysInYear; i++) { + avgDryBulb = dailyDryTemp(i); + runningAverageCEN(dayOfYear) = runningAverageCEN(dayOfYear) + avgDryBulb; + } + runningAverageCEN(dayOfYear) /= 7; + } + } + } else { + ShowFatalError(state, + "CalcThermalComfortAdaptive: Could not open file " + state.files.inputWeatherFilePath.filePath.string() + + " for input (read). (File does not exist)"); + } +} + +void CalculateAdaptiveComfortSetPointSchl(EnergyPlusData &state, Array1D const &runningAverageASH, Array1D const &runningAverageCEN) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Xuan Luo + // DATE WRITTEN January 2017 + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine calculates the zone operative temperature setpoint using adaptive comfort model. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int constexpr summerDesignDayTypeIndex(9); + Real64 GrossApproxAvgDryBulbDesignDay(0.0); + + auto &AdapComfortDailySetPointSchedule = state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule; + auto &AdapComfortSetPointSummerDesDay = state.dataZoneTempPredictorCorrector->AdapComfortSetPointSummerDesDay; + + for (size_t i = 1; i <= state.dataWeatherManager->DesDayInput.size(); i++) { + // Summer design day + if (state.dataWeatherManager->DesDayInput(i).DayType == summerDesignDayTypeIndex) { + GrossApproxAvgDryBulbDesignDay = + (state.dataWeatherManager->DesDayInput(i).MaxDryBulb + + (state.dataWeatherManager->DesDayInput(i).MaxDryBulb - state.dataWeatherManager->DesDayInput(i).DailyDBRange)) / + 2.0; + if (GrossApproxAvgDryBulbDesignDay > 10 && GrossApproxAvgDryBulbDesignDay < 33.5) { + AdapComfortSetPointSummerDesDay[0] = 0.31 * GrossApproxAvgDryBulbDesignDay + 17.8; + AdapComfortSetPointSummerDesDay[1] = 0.31 * GrossApproxAvgDryBulbDesignDay + 20.3; + AdapComfortSetPointSummerDesDay[2] = 0.31 * GrossApproxAvgDryBulbDesignDay + 21.3; + } + if (GrossApproxAvgDryBulbDesignDay > 10 && GrossApproxAvgDryBulbDesignDay < 30) { + AdapComfortSetPointSummerDesDay[3] = 0.33 * GrossApproxAvgDryBulbDesignDay + 18.8; + AdapComfortSetPointSummerDesDay[4] = 0.33 * GrossApproxAvgDryBulbDesignDay + 20.8; + ; + AdapComfortSetPointSummerDesDay[5] = 0.33 * GrossApproxAvgDryBulbDesignDay + 21.8; + ; + AdapComfortSetPointSummerDesDay[6] = 0.33 * GrossApproxAvgDryBulbDesignDay + 22.8; + ; + } + } + } + + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central.allocate(state.dataWeatherManager->NumDaysInYear); + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90.allocate(state.dataWeatherManager->NumDaysInYear); + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80.allocate(state.dataWeatherManager->NumDaysInYear); + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central.allocate(state.dataWeatherManager->NumDaysInYear); + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I.allocate(state.dataWeatherManager->NumDaysInYear); + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II.allocate(state.dataWeatherManager->NumDaysInYear); + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III.allocate(state.dataWeatherManager->NumDaysInYear); + + // Calculate the set points based on different models, set flag as -1 when running average temperature is not in the range. + for (int day = 1; day <= state.dataWeatherManager->NumDaysInYear; day++) { + if (runningAverageASH(day) > 10 && runningAverageASH(day) < 33.5) { + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central(day) = 0.31 * runningAverageASH(day) + 17.8; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90(day) = 0.31 * runningAverageASH(day) + 20.3; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80(day) = 0.31 * runningAverageASH(day) + 21.3; + } else { + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central(day) = -1; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90(day) = -1; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80(day) = -1; + } + if (runningAverageCEN(day) > 10 && runningAverageCEN(day) < 30) { + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central(day) = 0.33 * runningAverageCEN(day) + 18.8; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I(day) = 0.33 * runningAverageCEN(day) + 20.8; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II(day) = 0.33 * runningAverageCEN(day) + 21.8; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III(day) = 0.33 * runningAverageCEN(day) + 22.8; + } else { + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central(day) = -1; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I(day) = -1; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II(day) = -1; + AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III(day) = -1; + } + } + AdapComfortDailySetPointSchedule.initialized = true; +} + +void InitZoneAirSetPoints(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Russell Taylor + // DATE WRITTEN September 1998 + // MODIFIED November 2004, M. J. Witte additional report variables + // MODIFIED L.Gu, May 2006 + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine initializes the data for the zone air setpoints. + + // METHODOLOGY EMPLOYED: + // Uses the status flags to trigger events. + + // SUBROUTINE PARAMETER DEFINITIONS: + static constexpr std::string_view RoutineName("InitZoneAirSetpoints: "); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + bool FirstSurfFlag; + int TRefFlag; // Flag for Reference Temperature process in Zones + + auto &ZoneList = state.dataHeatBal->ZoneList; + auto &TempControlledZone = state.dataZoneCtrls->TempControlledZone; + auto &TempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint; + auto &TempControlType = state.dataHeatBalFanSys->TempControlType; + auto &TempControlTypeRpt = state.dataHeatBalFanSys->TempControlTypeRpt; + auto &ComfortControlledZone = state.dataZoneCtrls->ComfortControlledZone; + auto &ZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo; + auto &ZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi; + auto &NumOfZones = state.dataGlobal->NumOfZones; + + if (state.dataZoneTempPredictorCorrector->InitZoneAirSetPointsOneTimeFlag) { + TempZoneThermostatSetPoint.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->AdapComfortCoolingSetPoint.dimension(NumOfZones, 0.0); + ZoneThermostatSetPointHi.dimension(NumOfZones, 0.0); + ZoneThermostatSetPointLo.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->ZoneThermostatSetPointHiAver.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->ZoneThermostatSetPointLoAver.dimension(NumOfZones, 0.0); + + state.dataHeatBalFanSys->LoadCorrectionFactor.dimension(NumOfZones, 0.0); + TempControlType.dimension(NumOfZones, DataHVACGlobals::ThermostatType::Uncontrolled); + TempControlTypeRpt.dimension(NumOfZones, 0); + if (state.dataZoneCtrls->NumComfortControlledZones > 0) { + state.dataHeatBalFanSys->ComfortControlType.dimension(NumOfZones, DataHVACGlobals::ThermostatType::Uncontrolled); + state.dataHeatBalFanSys->ComfortControlTypeRpt.dimension(NumOfZones, 0); + state.dataHeatBalFanSys->ZoneComfortControlsFanger.allocate(NumOfZones); + } + state.dataZoneEnergyDemand->Setback.dimension(NumOfZones, false); + state.dataZoneEnergyDemand->DeadBandOrSetback.dimension(NumOfZones, false); + state.dataZoneEnergyDemand->CurDeadBandOrSetback.dimension(NumOfZones, false); + + state.dataHeatBal->ZoneListSNLoadHeatEnergy.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); + state.dataHeatBal->ZoneListSNLoadCoolEnergy.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); + state.dataHeatBal->ZoneListSNLoadHeatRate.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); + state.dataHeatBal->ZoneListSNLoadCoolRate.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); + + state.dataHeatBal->ZoneGroupSNLoadHeatEnergy.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); + state.dataHeatBal->ZoneGroupSNLoadCoolEnergy.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); + state.dataHeatBal->ZoneGroupSNLoadHeatRate.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); + state.dataHeatBal->ZoneGroupSNLoadCoolRate.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); + + // Hybrid modeling + state.dataHeatBalFanSys->PreviousMeasuredZT1.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->PreviousMeasuredZT2.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->PreviousMeasuredZT3.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->PreviousMeasuredHumRat1.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->PreviousMeasuredHumRat2.dimension(NumOfZones, 0.0); + state.dataHeatBalFanSys->PreviousMeasuredHumRat3.dimension(NumOfZones, 0.0); + + // Allocate Derived Types + state.dataZoneEnergyDemand->ZoneSysEnergyDemand.allocate(NumOfZones); + state.dataZoneEnergyDemand->ZoneSysMoistureDemand.allocate(NumOfZones); + if (state.dataHeatBal->doSpaceHeatBalanceSimulation || state.dataHeatBal->doSpaceHeatBalanceSizing) { + state.dataZoneEnergyDemand->spaceSysEnergyDemand.allocate(state.dataGlobal->numSpaces); + state.dataZoneEnergyDemand->spaceSysMoistureDemand.allocate(state.dataGlobal->numSpaces); + } + + for (int zoneNum = 1; zoneNum <= NumOfZones; ++zoneNum) { + FirstSurfFlag = true; + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + auto &thisSpace = state.dataHeatBal->space(spaceNum); + for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { + if (FirstSurfFlag) { + TRefFlag = state.dataSurface->SurfTAirRef(SurfNum); + FirstSurfFlag = false; + } + // for each particular zone, the reference air temperature(s) should be the same + // (either mean air, bulk air, or supply air temp). + if (state.dataSurface->SurfTAirRef(SurfNum) != TRefFlag) { + ShowWarningError(state, + "Different reference air temperatures for difference surfaces encountered in zone " + + state.dataHeatBal->Zone(zoneNum).Name); + } + } + } + } + + // CurrentModuleObject='Zone' + for (int zoneNum = 1; zoneNum <= NumOfZones; ++zoneNum) { + auto &thisZone = state.dataHeatBal->Zone(zoneNum); + state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).setUpOutputVars(state, DataStringGlobals::zonePrefix, thisZone.Name); + if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).setUpOutputVars( + state, DataStringGlobals::spacePrefix, state.dataHeatBal->space(spaceNum).Name); + } + } + bool staged = false; + if (allocated(state.dataZoneCtrls->StageZoneLogic)) { + staged = state.dataZoneCtrls->StageZoneLogic(zoneNum); + } + // If not doSpaceHeatBalanceSimulation then meter zones, not spaces + bool attachMeters = !state.dataHeatBal->doSpaceHeatBalanceSimulation; + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).setUpOutputVars( + state, DataStringGlobals::zonePrefix, thisZone.Name, staged, attachMeters, thisZone.Multiplier, thisZone.ListMultiplier); + if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { + // If doSpaceHeatBalanceSimulation then meter spaces, not zones + attachMeters = state.dataHeatBal->doSpaceHeatBalanceSimulation; + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).setUpOutputVars(state, + DataStringGlobals::spacePrefix, + state.dataHeatBal->space(spaceNum).Name, + staged, + attachMeters, + thisZone.Multiplier, + thisZone.ListMultiplier); + } + } + state.dataZoneEnergyDemand->ZoneSysMoistureDemand(zoneNum).setUpOutputVars(state, DataStringGlobals::zonePrefix, thisZone.Name); + if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneEnergyDemand->spaceSysMoistureDemand(spaceNum).setUpOutputVars( + state, DataStringGlobals::spacePrefix, state.dataHeatBal->space(spaceNum).Name); + } + } + SetupOutputVariable(state, + "Zone Thermostat Air Temperature", + OutputProcessor::Unit::C, + state.dataHeatBalFanSys->TempTstatAir(zoneNum), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Thermostat Control Type", + OutputProcessor::Unit::None, + TempControlTypeRpt(zoneNum), + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Thermostat Heating Setpoint Temperature", + OutputProcessor::Unit::C, + ZoneThermostatSetPointLo(zoneNum), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Thermostat Cooling Setpoint Temperature", + OutputProcessor::Unit::C, + ZoneThermostatSetPointHi(zoneNum), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Adaptive Comfort Operative Temperature Set Point", + OutputProcessor::Unit::C, + state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(zoneNum), + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Predicted Sensible Load Room Air Correction Factor", + OutputProcessor::Unit::None, + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + } // zoneNum + + // Thermal comfort control output + if (state.dataZoneCtrls->NumComfortControlledZones > 0) { + // CurrentModuleObject='ZoneControl:Thermostat:ThermalComfort' + for (int Loop = 1; Loop <= state.dataZoneCtrls->NumComfortControlledZones; ++Loop) { + int zoneNum = ComfortControlledZone(Loop).ActualZoneNum; + auto &thisZone = state.dataHeatBal->Zone(zoneNum); + SetupOutputVariable(state, + "Zone Thermal Comfort Control Type", + OutputProcessor::Unit::None, + state.dataHeatBalFanSys->ComfortControlTypeRpt(zoneNum), + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Thermal Comfort Control Fanger Low Setpoint PMV", + OutputProcessor::Unit::None, + state.dataHeatBalFanSys->ZoneComfortControlsFanger(zoneNum).LowPMV, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + SetupOutputVariable(state, + "Zone Thermal Comfort Control Fanger High Setpoint PMV", + OutputProcessor::Unit::None, + state.dataHeatBalFanSys->ZoneComfortControlsFanger(zoneNum).HighPMV, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::Average, + thisZone.Name); + } + } + + // CurrentModuleObject='ZoneList' + for (int Loop = 1; Loop <= state.dataHeatBal->NumOfZoneLists; ++Loop) { + SetupOutputVariable(state, + "Zone List Sensible Heating Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZoneListSNLoadHeatEnergy(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + ZoneList(Loop).Name); + SetupOutputVariable(state, + "Zone List Sensible Cooling Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZoneListSNLoadCoolEnergy(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + ZoneList(Loop).Name); + SetupOutputVariable(state, + "Zone List Sensible Heating Rate", + OutputProcessor::Unit::W, + state.dataHeatBal->ZoneListSNLoadHeatRate(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + ZoneList(Loop).Name); + SetupOutputVariable(state, + "Zone List Sensible Cooling Rate", + OutputProcessor::Unit::W, + state.dataHeatBal->ZoneListSNLoadCoolRate(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + ZoneList(Loop).Name); + } // Loop + + // CurrentModuleObject='ZoneGroup' + for (int Loop = 1; Loop <= state.dataHeatBal->NumOfZoneGroups; ++Loop) { + SetupOutputVariable(state, + "Zone Group Sensible Heating Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZoneGroupSNLoadHeatEnergy(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->ZoneGroup(Loop).Name); + SetupOutputVariable(state, + "Zone Group Sensible Cooling Energy", + OutputProcessor::Unit::J, + state.dataHeatBal->ZoneGroupSNLoadCoolEnergy(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + state.dataHeatBal->ZoneGroup(Loop).Name); + SetupOutputVariable(state, + "Zone Group Sensible Heating Rate", + OutputProcessor::Unit::W, + state.dataHeatBal->ZoneGroupSNLoadHeatRate(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->ZoneGroup(Loop).Name); + SetupOutputVariable(state, + "Zone Group Sensible Cooling Rate", + OutputProcessor::Unit::W, + state.dataHeatBal->ZoneGroupSNLoadCoolRate(Loop), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + state.dataHeatBal->ZoneGroup(Loop).Name); + } // Loop + + state.dataZoneTempPredictorCorrector->InitZoneAirSetPointsOneTimeFlag = false; + } + + // Do the Begin Environment initializations + if (state.dataZoneTempPredictorCorrector->MyEnvrnFlag && state.dataGlobal->BeginEnvrnFlag) { + for (auto &thisZoneHB : state.dataZoneTempPredictorCorrector->zoneHeatBalance) { + thisZoneHB.beginEnvironmentInit(state); + } + if (state.dataHeatBal->doSpaceHeatBalance) { + for (auto &thisSpaceHB : state.dataZoneTempPredictorCorrector->spaceHeatBalance) { + thisSpaceHB.beginEnvironmentInit(state); + } + } + TempZoneThermostatSetPoint = 0.0; + state.dataHeatBalFanSys->AdapComfortCoolingSetPoint = 0.0; + ZoneThermostatSetPointHi = 0.0; + ZoneThermostatSetPointLo = 0.0; + + state.dataHeatBalFanSys->LoadCorrectionFactor = 1.0; + TempControlType = DataHVACGlobals::ThermostatType::Uncontrolled; + for (auto &e : state.dataZoneEnergyDemand->ZoneSysEnergyDemand) { + e.beginEnvironmentInit(); + } + for (auto &e : state.dataZoneEnergyDemand->ZoneSysMoistureDemand) { + e.beginEnvironmentInit(); + } + if (state.dataHeatBal->doSpaceHeatBalance) { + for (auto &e : state.dataZoneEnergyDemand->spaceSysEnergyDemand) { + e.beginEnvironmentInit(); + } + for (auto &e : state.dataZoneEnergyDemand->spaceSysMoistureDemand) { + e.beginEnvironmentInit(); + } + } + + state.dataZoneEnergyDemand->DeadBandOrSetback = false; + + for (auto &e : state.dataHeatBal->Zone) + e.NoHeatToReturnAir = false; + state.dataHeatBalFanSys->PreviousMeasuredZT1 = 0.0; // Hybrid modeling + state.dataHeatBalFanSys->PreviousMeasuredZT2 = 0.0; // Hybrid modeling + state.dataHeatBalFanSys->PreviousMeasuredZT3 = 0.0; // Hybrid modeling + state.dataHeatBalFanSys->PreviousMeasuredHumRat1 = 0.0; // Hybrid modeling + state.dataHeatBalFanSys->PreviousMeasuredHumRat2 = 0.0; // Hybrid modeling + state.dataHeatBalFanSys->PreviousMeasuredHumRat3 = 0.0; // Hybrid modeling + + state.dataZoneTempPredictorCorrector->MyEnvrnFlag = false; + } + + if (!state.dataGlobal->BeginEnvrnFlag) { + state.dataZoneTempPredictorCorrector->MyEnvrnFlag = true; + } + + // Do the Begin Day initializations + if (state.dataZoneTempPredictorCorrector->MyDayFlag && state.dataGlobal->BeginDayFlag) { + state.dataZoneTempPredictorCorrector->MyDayFlag = false; + } + + if (!state.dataGlobal->BeginDayFlag) { + state.dataZoneTempPredictorCorrector->MyDayFlag = true; + } + + for (int Loop = 1; Loop <= state.dataZoneCtrls->NumTempControlledZones; ++Loop) { + if (state.dataZoneEquip->ZoneEquipInputsFilled && !state.dataZoneTempPredictorCorrector->ControlledZonesChecked) { + if (!VerifyControlledZoneForThermostat(state, TempControlledZone(Loop).ZoneName)) { + ShowSevereError(state, + format("{}Zone=\"{}\" has specified a Thermostatic control but is not a controlled zone.", + RoutineName, + TempControlledZone(Loop).ZoneName)); + ShowContinueError(state, "...must have a ZoneHVAC:EquipmentConnections specification for this zone."); + state.dataZoneTempPredictorCorrector->ErrorsFound = true; + } + } + + if (TempControlledZone(Loop).ManageDemand) { + int ZoneNum = TempControlledZone(Loop).ActualZoneNum; + + switch (TempControlType(ZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + if (TempZoneThermostatSetPoint(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) { + TempZoneThermostatSetPoint(ZoneNum) = TempControlledZone(Loop).HeatingResetLimit; + ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + } + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + if (TempZoneThermostatSetPoint(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit) { + TempZoneThermostatSetPoint(ZoneNum) = TempControlledZone(Loop).CoolingResetLimit; + ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + } + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + if ((TempZoneThermostatSetPoint(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) || + (TempZoneThermostatSetPoint(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit)) { + + TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; + TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); + ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + + if (ZoneThermostatSetPointLo(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) + ZoneThermostatSetPointLo(ZoneNum) = TempControlledZone(Loop).HeatingResetLimit; + if (ZoneThermostatSetPointHi(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit) + ZoneThermostatSetPointHi(ZoneNum) = TempControlledZone(Loop).CoolingResetLimit; + } + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + if (ZoneThermostatSetPointLo(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) + ZoneThermostatSetPointLo(ZoneNum) = TempControlledZone(Loop).HeatingResetLimit; + if (ZoneThermostatSetPointHi(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit) + ZoneThermostatSetPointHi(ZoneNum) = TempControlledZone(Loop).CoolingResetLimit; + break; + default: + break; + } + } + } + + for (int Loop = 1; Loop <= state.dataZoneCtrls->NumComfortControlledZones; ++Loop) { + if (state.dataZoneEquip->ZoneEquipInputsFilled && !state.dataZoneTempPredictorCorrector->ControlledZonesChecked) { + if (!VerifyControlledZoneForThermostat(state, ComfortControlledZone(Loop).ZoneName)) { + ShowSevereError(state, + format("{}Zone=\"{}\" has specified a Comfort control but is not a controlled zone.", + RoutineName, + ComfortControlledZone(Loop).ZoneName)); + ShowContinueError(state, "...must have a ZoneHVAC:EquipmentConnections specification for this zone."); + state.dataZoneTempPredictorCorrector->ErrorsFound = true; + } + } + if (ComfortControlledZone(Loop).ManageDemand) { + int ZoneNum = ComfortControlledZone(Loop).ActualZoneNum; + + switch (state.dataHeatBalFanSys->ComfortControlType(ZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + if (TempZoneThermostatSetPoint(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) { + TempZoneThermostatSetPoint(ZoneNum) = ComfortControlledZone(Loop).HeatingResetLimit; + ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::SingleHeating; + TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); + } + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + if (TempZoneThermostatSetPoint(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit) { + TempZoneThermostatSetPoint(ZoneNum) = ComfortControlledZone(Loop).CoolingResetLimit; + ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::SingleCooling; + TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); + } + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + if ((TempZoneThermostatSetPoint(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) || + (TempZoneThermostatSetPoint(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit)) { + + TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; + TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); + ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); + + if (ZoneThermostatSetPointLo(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) + ZoneThermostatSetPointLo(ZoneNum) = ComfortControlledZone(Loop).HeatingResetLimit; + if (ZoneThermostatSetPointHi(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit) + ZoneThermostatSetPointHi(ZoneNum) = ComfortControlledZone(Loop).CoolingResetLimit; + } + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; + TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); + if (ZoneThermostatSetPointLo(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) + ZoneThermostatSetPointLo(ZoneNum) = ComfortControlledZone(Loop).HeatingResetLimit; + if (ZoneThermostatSetPointHi(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit) + ZoneThermostatSetPointHi(ZoneNum) = ComfortControlledZone(Loop).CoolingResetLimit; + break; + default: + break; + } + } // Demand manager + } + + if (state.dataZoneTempPredictorCorrector->ErrorsFound) { + ShowFatalError(state, "InitZoneAirSetpoints - program terminates due to previous condition."); + } + + if (state.dataZoneEquip->ZoneEquipInputsFilled) { + state.dataZoneTempPredictorCorrector->ControlledZonesChecked = true; + } +} + +void ZoneSpaceHeatBalanceData::beginEnvironmentInit(EnergyPlusData &state) +{ + for (int i = 0; i <= 3; ++i) { + this->ZTM[i] = 0.0; + this->WPrevZoneTS[i] = state.dataEnvrn->OutHumRat; + this->DSWPrevZoneTS[i] = state.dataEnvrn->OutHumRat; + this->WPrevZoneTSTemp[i] = 0.0; + } + this->WZoneTimeMinusP = state.dataEnvrn->OutHumRat; + this->ZoneW1 = state.dataEnvrn->OutHumRat; + this->ZoneWMX = state.dataEnvrn->OutHumRat; + this->ZoneWM2 = state.dataEnvrn->OutHumRat; + this->ZoneAirHumRatTemp = 0.0; + this->TempIndZnLd = 0.0; + this->TempDepZnLd = 0.0; + this->ZoneAirRelHum = 0.0; + this->AirPowerCap = 0.0; + this->ZoneT1 = 0.0; +} + +void ZoneSpaceHeatBalanceData::setUpOutputVars(EnergyPlusData &state, std::string_view prefix, std::string_view name) +{ + SetupOutputVariable(state, + format("{} Air Temperature", prefix), + OutputProcessor::Unit::C, + this->ZT, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + name); + SetupOutputVariable(state, + format("{} Air Humidity Ratio", prefix), + OutputProcessor::Unit::None, + this->ZoneAirHumRat, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + name); + SetupOutputVariable(state, + format("{} Air Relative Humidity", prefix), + OutputProcessor::Unit::Perc, + this->ZoneAirRelHum, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Average, + name); +} + +void PredictSystemLoads(EnergyPlusData &state, + bool const ShortenTimeStepSys, + bool const UseZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step + Real64 const PriorTimeStep // the old value for timestep length is passed for possible use in interpolating +) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Russ Taylor + // DATE WRITTEN May 1997 + // MODIFIED na + // RE-ENGINEERED July 2003 (Peter Graham Ellis) + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine is responsible for determining + // how much of each type of energy every zone requires. + // In effect, this subroutine defines and simulates all + // the system types and in the case of hybrid systems + // which use more than one type of energy must determine + // how to apportion the load. An example of a hybrid system + // is a water loop heat pump with supplemental air. In + // this case, a zone will require water from the loop and + // cooled or heated air from the air system. A simpler + // example would be a VAV system with baseboard heaters. + + // Basic Air System Types + // 1) Constant Volume Single Duct + // 2) Variable Volume Single Duct + // 3) Constant Volume Dual Duct + // 4) Variable Volume Dual Duct + + // METHODOLOGY EMPLOYED: + // 0. Determine if simulation has downstepped and readjust history and revert node results + // 1. Determine zone load - this is zone temperature dependent + // 2. Determine balance point - the temperature at which the + // zone load is balanced by the system output. The way the + // balance point is determined will be different depending on + // the type of system being simulated. + // 3. Calculate zone energy requirements + + // Staged thermostat setpoint + if (state.dataZoneTempPredictorCorrector->NumStageCtrZone > 0) { + for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneTempPredictorCorrector->NumStageCtrZone; ++RelativeZoneNum) { + auto &thisStageControlZone = state.dataZoneCtrls->StageControlledZone(RelativeZoneNum); + int ActualZoneNum = thisStageControlZone.ActualZoneNum; + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ActualZoneNum); + auto &thisZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum); + auto &thisZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum); + Real64 ZoneT = thisZoneHB.MAT; // Zone temperature at previous time step + if (ShortenTimeStepSys) ZoneT = thisZoneHB.XMPT; + thisStageControlZone.HeatSetPoint = ScheduleManager::GetCurrentScheduleValue(state, thisStageControlZone.HSBchedIndex); + thisStageControlZone.CoolSetPoint = ScheduleManager::GetCurrentScheduleValue(state, thisStageControlZone.CSBchedIndex); + if (thisStageControlZone.HeatSetPoint >= thisStageControlZone.CoolSetPoint) { + ++thisStageControlZone.StageErrCount; + if (thisStageControlZone.StageErrCount < 2) { + ShowWarningError(state, + "ZoneControl:Thermostat:StagedDualSetpoint: The heating setpoint is equal to or above the cooling setpoint in " + + thisStageControlZone.Name); + ShowContinueError(state, "The zone heating setpoint is set to the cooling setpoint - 0.1C."); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } else { + ShowRecurringWarningErrorAtEnd(state, + "The heating setpoint is still above the cooling setpoint", + thisStageControlZone.StageErrIndex, + thisStageControlZone.HeatSetPoint, + thisStageControlZone.HeatSetPoint); + } + thisStageControlZone.HeatSetPoint = thisStageControlZone.CoolSetPoint - 0.1; //??????????? + } + // Determine either cooling or heating + if (thisStageControlZone.CoolSetPoint < ZoneT) { // Cooling + Real64 SetpointOffset = ZoneT - thisStageControlZone.CoolSetPoint; + int Itemp = 0; + for (int I = 1; I <= thisStageControlZone.NumOfCoolStages; ++I) { + if (SetpointOffset >= thisStageControlZone.CoolTOffset(I)) { + Itemp = -I; + } + } + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum = Itemp; + if (SetpointOffset >= 0.5 * thisStageControlZone.CoolThroRange) { + thisZoneThermostatSetPointHi = thisStageControlZone.CoolSetPoint - 0.5 * thisStageControlZone.CoolThroRange; + } else { + thisZoneThermostatSetPointHi = thisStageControlZone.CoolSetPoint + 0.5 * thisStageControlZone.CoolThroRange; + } + thisZoneThermostatSetPointLo = thisZoneThermostatSetPointHi; + } else if (thisStageControlZone.HeatSetPoint > ZoneT) { // heating + Real64 SetpointOffset = ZoneT - thisStageControlZone.HeatSetPoint; + int Itemp = 0; + for (int I = 1; I <= thisStageControlZone.NumOfHeatStages; ++I) { + if (std::abs(SetpointOffset) >= std::abs(thisStageControlZone.HeatTOffset(I))) { + Itemp = I; + } + } + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum = Itemp; + if (std::abs(SetpointOffset) >= 0.5 * thisStageControlZone.CoolThroRange) { + thisZoneThermostatSetPointLo = thisStageControlZone.HeatSetPoint + 0.5 * thisStageControlZone.HeatThroRange; + } else { + thisZoneThermostatSetPointLo = thisStageControlZone.HeatSetPoint - 0.5 * thisStageControlZone.HeatThroRange; + } + thisZoneThermostatSetPointHi = thisZoneThermostatSetPointLo; + } else { + thisZoneThermostatSetPointHi = thisStageControlZone.CoolSetPoint + 0.5 * thisStageControlZone.CoolThroRange; + thisZoneThermostatSetPointLo = thisStageControlZone.HeatSetPoint - 0.5 * thisStageControlZone.HeatThroRange; + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum = 0; + } + // SpaceHB TODO: For now, set space stagenum to zone stagenum - later need to see what space the thermostat is in + if (state.dataHeatBal->doSpaceHeatBalance) { + for (int spaceNum : state.dataHeatBal->Zone(ActualZoneNum).spaceIndexes) { + state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).StageNum = + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum; + } + } + } + } + + // Setpoint revision for onoff thermostat + if (state.dataZoneTempPredictorCorrector->NumOnOffCtrZone > 0) { + Real64 TempTole = 0.02; + Real64 Tprev; + for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumTempControlledZones; ++RelativeZoneNum) { + auto &thisTempControlledZone = state.dataZoneCtrls->TempControlledZone(RelativeZoneNum); + if (thisTempControlledZone.DeltaTCutSet > 0.0) { + if (ShortenTimeStepSys) { + thisTempControlledZone.HeatModeLast = thisTempControlledZone.HeatModeLastSave; + thisTempControlledZone.CoolModeLast = thisTempControlledZone.CoolModeLastSave; + } else { + thisTempControlledZone.HeatModeLastSave = thisTempControlledZone.HeatModeLast; + thisTempControlledZone.CoolModeLastSave = thisTempControlledZone.CoolModeLast; + } + auto &thisTempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint(thisTempControlledZone.ActualZoneNum); + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(thisTempControlledZone.ActualZoneNum); + auto &thisZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(thisTempControlledZone.ActualZoneNum); + auto &thisZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(thisTempControlledZone.ActualZoneNum); + + thisTempControlledZone.CoolOffFlag = false; + thisTempControlledZone.HeatOffFlag = false; + if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::ThirdOrder) { + Tprev = thisZoneHB.MAT; + if (ShortenTimeStepSys) Tprev = thisZoneHB.XMPT; + } else { + Tprev = thisZoneHB.ZoneT1; + } + + switch (state.dataHeatBalFanSys->TempControlType(thisTempControlledZone.ActualZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo; + thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; + if (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + TempTole) { + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; + thisZoneThermostatSetPointLo = thisTempZoneThermostatSetPoint; + } else if (Tprev > thisTempControlledZone.ZoneThermostatSetPointLo && + (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet - TempTole)) { + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; + thisZoneThermostatSetPointLo = thisTempZoneThermostatSetPoint; + } else { + thisTempControlledZone.HeatOffFlag = true; + } + if (thisTempControlledZone.HeatModeLast && Tprev > thisTempControlledZone.ZoneThermostatSetPointLo) { + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo; + thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; + thisTempControlledZone.HeatOffFlag = true; + } + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi; + thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; + if (Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - TempTole) { + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; + thisZoneThermostatSetPointHi = thisTempZoneThermostatSetPoint; + } else if (Tprev < thisTempControlledZone.ZoneThermostatSetPointHi && + Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet + TempTole) { + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; + thisZoneThermostatSetPointHi = thisTempZoneThermostatSetPoint; + } else { + thisTempControlledZone.CoolOffFlag = true; + } + if (thisTempControlledZone.CoolModeLast && Tprev < thisTempControlledZone.ZoneThermostatSetPointHi) { + thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi; + thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; + thisTempControlledZone.CoolOffFlag = true; + } + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; + thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; + if (Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - TempTole) { + thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; + } else if (Tprev < thisTempControlledZone.ZoneThermostatSetPointHi && + Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet + TempTole) { + thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; + } else { + thisTempControlledZone.CoolOffFlag = true; + } + if (thisTempControlledZone.CoolModeLast && Tprev < thisTempControlledZone.ZoneThermostatSetPointHi) { + thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; + thisTempControlledZone.CoolOffFlag = true; + } + + if (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + TempTole) { + thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; + } else if (Tprev > thisTempControlledZone.ZoneThermostatSetPointLo && + (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet - TempTole)) { + thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; + } else { + thisTempControlledZone.HeatOffFlag = true; + } + if (thisTempControlledZone.HeatModeLast && Tprev > thisTempControlledZone.ZoneThermostatSetPointLo) { + thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; + thisTempControlledZone.HeatOffFlag = true; + } + // check setpoint for both and provde an error message + if (thisZoneThermostatSetPointLo >= thisZoneThermostatSetPointHi) { + ShowSevereError(state, + "DualSetPointWithDeadBand: When Temperature Difference Between Cutout And Setpoint is applied, the heating " + "setpoint is greater than the cooling setpoint. "); + ShowContinueErrorTimeStamp(state, "occurs in Zone=" + state.dataHeatBal->Zone(thisTempControlledZone.ActualZoneNum).Name); + ShowContinueError(state, format("Zone Heating ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointLo)); + ShowContinueError(state, format("Zone Cooling ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointHi)); + ShowFatalError(state, "Program terminates due to above conditions."); + } + break; + default: + break; + } + } + } + } + + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).predictSystemLoad( + state, ShortenTimeStepSys, UseZoneTimeStepHistory, PriorTimeStep, zoneNum); + if (state.dataHeatBal->doSpaceHeatBalance) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).predictSystemLoad( + state, ShortenTimeStepSys, UseZoneTimeStepHistory, PriorTimeStep, zoneNum, spaceNum); + } + } + } + if (state.dataZoneTempPredictorCorrector->NumOnOffCtrZone > 0) { + for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumTempControlledZones; ++RelativeZoneNum) { + auto &thisTempControlledZone = state.dataZoneCtrls->TempControlledZone(RelativeZoneNum); + if (thisTempControlledZone.DeltaTCutSet > 0.0) { + int ZoneNum = thisTempControlledZone.ActualZoneNum; + if (thisTempControlledZone.CoolOffFlag && state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneNum).TotalOutputRequired >= 0.0) { + thisTempControlledZone.CoolModeLast = true; + } else { + thisTempControlledZone.CoolModeLast = false; + } + if (thisTempControlledZone.HeatOffFlag && state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneNum).TotalOutputRequired <= 0.0) { + thisTempControlledZone.HeatModeLast = true; + } else { + thisTempControlledZone.HeatModeLast = false; + } + } + } + } +} +void ZoneSpaceHeatBalanceData::predictSystemLoad( + EnergyPlusData &state, + bool const shortenTimeStepSys, + bool const useZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step + Real64 const priorTimeStep, // the old value for timestep length is passed for possible use in interpolating + int zoneNum, + int spaceNum) +{ + assert(zoneNum > 0); + this->updateTemperatures(state, shortenTimeStepSys, useZoneTimeStepHistory, priorTimeStep, zoneNum, spaceNum); + + Real64 volume = 0.0; + if (spaceNum > 0) { + volume = state.dataHeatBal->space(spaceNum).Volume; + } else { + volume = state.dataHeatBal->Zone(zoneNum).Volume; + } + this->AirPowerCap = volume * state.dataHeatBal->Zone(zoneNum).ZoneVolCapMultpSens * + Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->MAT, this->ZoneAirHumRat) * + Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat) / (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); + Real64 RAFNFrac = 0.0; + + // Calculate the various heat balance sums + + // NOTE: SumSysMCp and SumSysMCpT are not used in the predict step + this->calcZoneOrSpaceSums(state, false, zoneNum, spaceNum); + + // Sum all convective internal gains except for people: SumIntGainExceptPeople + if (spaceNum == 0 && state.dataHybridModel->FlagHybridModel_PC) { + this->SumIntGainExceptPeople = 0.0; + this->SumIntGainExceptPeople = InternalHeatGains::SumAllInternalConvectionGainsExceptPeople(state, zoneNum); + } + + this->TempDepCoef = this->SumHA + this->SumMCp; + this->TempIndCoef = this->SumIntGain + this->SumHATsurf - this->SumHATref + this->SumMCpT + this->SysDepZoneLoadsLagged; + this->TempHistoryTerm = this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2]); + this->TempDepZnLd = (11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef; + this->TempIndZnLd = this->TempHistoryTerm + this->TempIndCoef; + if (state.dataRoomAirMod->anyNonMixingRoomAirModel) { + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + // RoomAirflowNetworkModel - make dynamic term independent of TimeStepSys + auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); + if (thisRoomAirflowNetworkZoneInfo.IsUsed) { + int RoomAirNode = thisRoomAirflowNetworkZoneInfo.ControlAirNodeID; + RoomAirModelAirflowNetwork::LoadPredictionRoomAirModelAirflowNetwork(state, zoneNum, RoomAirNode); + this->TempDepCoef = + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumHA + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumLinkMCp; + this->TempIndCoef = thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumIntSensibleGain + + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumHATsurf - + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumHATref + + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumLinkMCpT + + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SysDepZoneLoadsLagged; + this->AirPowerCap = thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).AirVolume * + state.dataHeatBal->Zone(zoneNum).ZoneVolCapMultpSens * thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).RhoAir * + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).CpAir / + (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); + this->TempHistoryTerm = this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2]); + this->TempDepZnLd = (11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef; + this->TempIndZnLd = this->TempHistoryTerm + this->TempIndCoef; + if (thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).HasHVACAssigned) + RAFNFrac = thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).HVAC(1).SupplyFraction; + } + } + } + + // Exact solution or Euler method + state.dataHVACGlobal->ShortenTimeStepSysRoomAir = false; + if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) { + if (shortenTimeStepSys && state.dataHVACGlobal->TimeStepSys < state.dataGlobal->TimeStepZone) { + if (state.dataHVACGlobal->PreviousTimeStep < state.dataGlobal->TimeStepZone) { + this->ZoneT1 = this->ZoneTM2; + this->ZoneW1 = this->ZoneWM2; + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); + for (int LoopNode = 1; LoopNode <= thisRoomAirflowNetworkZoneInfo.NumOfAirNodes; ++LoopNode) { + thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempT1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempTM2; + thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatW1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatWM2; + } + } + } else { + this->ZoneT1 = this->ZoneTMX; + this->ZoneW1 = this->ZoneWMX; + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); + for (int LoopNode = 1; LoopNode <= thisRoomAirflowNetworkZoneInfo.NumOfAirNodes; ++LoopNode) { + thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempT1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempTMX; + thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatW1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatWMX; + } + } + } + state.dataHVACGlobal->ShortenTimeStepSysRoomAir = true; + } else { + this->ZoneT1 = this->ZT; + this->ZoneW1 = this->ZoneAirHumRat; + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); + for (int LoopNode = 1; LoopNode <= thisRoomAirflowNetworkZoneInfo.NumOfAirNodes; ++LoopNode) { + thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempT1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTemp; + thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatW1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRat; + } + } + } + this->TempDepZnLd = this->TempDepCoef; + this->TempIndZnLd = this->TempIndCoef; + } + + // Calculate the predicted zone load to be provided by the system with the given desired zone air temperature + this->calcPredictedSystemLoad(state, RAFNFrac, zoneNum, spaceNum); + + // Calculate the predicted zone load to be provided by the system with the given desired humidity ratio + this->calcPredictedHumidityRatio(state, RAFNFrac, zoneNum, spaceNum); +} + +void CalcZoneAirTempSetPoints(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Russ Taylor + // DATE WRITTEN Nov 1997 + // MODIFIED Aug 2013, Xiufeng Pang (XP) - Added code for updating set points during + // optimum start period + // RE-ENGINEERED na + + // PURPOSE OF THIS SUBROUTINE: + // This routine sets what the setpoints for each controlled zone should be based on schedules. + // This is called each time step. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int RelativeZoneNum; + int ActualZoneNum; + int TempControlSchedIndex; + int SetPointTempSchedIndexHot; + int SetPointTempSchedIndexCold; + int SchedNameIndex; + Array2D DaySPValues; // Day room temp setpoint values - for optimum start + int OccStartTime; // Occupancy start time - for optimum start + Real64 DeltaT; // Temperature difference between cutout and setpoint + + auto &Zone = state.dataHeatBal->Zone; + auto &TempControlledZone = state.dataZoneCtrls->TempControlledZone; + auto &TempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint; + auto &TempControlType = state.dataHeatBalFanSys->TempControlType; + auto &TempControlTypeRpt = state.dataHeatBalFanSys->TempControlTypeRpt; + auto &ZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo; + auto &ZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi; + auto &NumOfZones = state.dataGlobal->NumOfZones; + + TempControlType = DataHVACGlobals::ThermostatType::Uncontrolled; // Default + + // Place holder for occupied heating and cooling set points - for optimum start + if (!allocated(state.dataZoneCtrls->OccRoomTSetPointHeat)) { + state.dataZoneCtrls->OccRoomTSetPointHeat.allocate(NumOfZones); + } + if (!allocated(state.dataZoneCtrls->OccRoomTSetPointCool)) { + state.dataZoneCtrls->OccRoomTSetPointCool.allocate(NumOfZones); + } + state.dataZoneCtrls->OccRoomTSetPointHeat = 0.0; + state.dataZoneCtrls->OccRoomTSetPointCool = 100.0; + DeltaT = 0.0; + + for (RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumTempControlledZones; ++RelativeZoneNum) { + + // What if this zone not controlled??? + ActualZoneNum = TempControlledZone(RelativeZoneNum).ActualZoneNum; + TempControlSchedIndex = TempControlledZone(RelativeZoneNum).CTSchedIndex; + TempControlType(ActualZoneNum) = + static_cast(ScheduleManager::GetCurrentScheduleValue(state, TempControlSchedIndex)); + TempControlTypeRpt(ActualZoneNum) = static_cast(TempControlType(ActualZoneNum)); + // Error detection for these values is done in the Get routine + + switch (TempControlType(ActualZoneNum)) { + case DataHVACGlobals::ThermostatType::Uncontrolled: + break; + case DataHVACGlobals::ThermostatType::SingleHeating: + SchedNameIndex = TempControlledZone(RelativeZoneNum).SchIndx_SingleHeatSetPoint; + TempZoneThermostatSetPoint(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SchedNameIndex); + TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointLo = TempZoneThermostatSetPoint(ActualZoneNum); + + AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); + ZoneThermostatSetPointLo(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + SchedNameIndex = TempControlledZone(RelativeZoneNum).SchIndx_SingleCoolSetPoint; + TempZoneThermostatSetPoint(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SchedNameIndex); + TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointHi = TempZoneThermostatSetPoint(ActualZoneNum); + + // Added Jan 17 (X. Luo) + // Adjust operative temperature based on adaptive comfort model + if ((TempControlledZone(RelativeZoneNum).AdaptiveComfortTempControl)) { + AdjustOperativeSetPointsforAdapComfort(state, RelativeZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); + state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + } + + AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); + ZoneThermostatSetPointHi(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + + AdjustCoolingSetPointforTempAndHumidityControl(state, RelativeZoneNum, ActualZoneNum); + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + + SchedNameIndex = TempControlledZone(RelativeZoneNum).SchIndx_SingleHeatCoolSetPoint; + + TempZoneThermostatSetPoint(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SchedNameIndex); + + // Added Jan 17 (X. Luo) + // Adjust operative temperature based on adaptive comfort model + if ((TempControlledZone(RelativeZoneNum).AdaptiveComfortTempControl)) { + AdjustOperativeSetPointsforAdapComfort(state, RelativeZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); + state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + } + + AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); + + ZoneThermostatSetPointHi(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + ZoneThermostatSetPointLo(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + + // Change the room set point to occupied set point during optimum start period-------------- + + if (allocated(state.dataHVACGlobal->OptStartData.OptStartFlag)) { + if (!allocated(DaySPValues)) { + DaySPValues.allocate(state.dataGlobal->NumOfTimeStepInHour, 24); + } + if (state.dataHVACGlobal->OptStartData.ActualZoneNum(ActualZoneNum) == ActualZoneNum) { + ScheduleManager::GetScheduleValuesForDay(state, SetPointTempSchedIndexCold, DaySPValues); + OccStartTime = CEILING(state.dataHVACGlobal->OptStartData.OccStartTime(ActualZoneNum)) + 1; + TempZoneThermostatSetPoint(ActualZoneNum) = DaySPValues(1, OccStartTime); + } + + if (state.dataHVACGlobal->OptStartData.OptStartFlag(ActualZoneNum)) { + ZoneThermostatSetPointHi(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + ZoneThermostatSetPointLo(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); + } + } + //-------------------------------------------------------------------------------------------- + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + SetPointTempSchedIndexHot = TempControlledZone(RelativeZoneNum).SchIndx_DualSetPointWDeadBandHeat; + SetPointTempSchedIndexCold = TempControlledZone(RelativeZoneNum).SchIndx_DualSetPointWDeadBandCool; + + ZoneThermostatSetPointHi(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SetPointTempSchedIndexCold); + TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointHi = ZoneThermostatSetPointHi(ActualZoneNum); + + // Added Jan 17 (X. Luo) + // Adjust operative temperature based on adaptive comfort model + if ((TempControlledZone(RelativeZoneNum).AdaptiveComfortTempControl)) { + AdjustOperativeSetPointsforAdapComfort(state, RelativeZoneNum, ZoneThermostatSetPointHi(ActualZoneNum)); + state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(ActualZoneNum) = ZoneThermostatSetPointHi(ActualZoneNum); + } + + AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, ZoneThermostatSetPointHi(ActualZoneNum)); + + ZoneThermostatSetPointLo(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SetPointTempSchedIndexHot); + TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointLo = ZoneThermostatSetPointLo(ActualZoneNum); + AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, ZoneThermostatSetPointLo(ActualZoneNum)); + + // Change the room set point to occupied set point during optimum start period-------------- + + if (allocated(state.dataHVACGlobal->OptStartData.OptStartFlag)) { + if (!allocated(DaySPValues)) { + DaySPValues.allocate(state.dataGlobal->NumOfTimeStepInHour, 24); + } + if (state.dataHVACGlobal->OptStartData.ActualZoneNum(ActualZoneNum) == ActualZoneNum) { + ScheduleManager::GetScheduleValuesForDay(state, SetPointTempSchedIndexCold, DaySPValues); + OccStartTime = CEILING(state.dataHVACGlobal->OptStartData.OccStartTime(ActualZoneNum)) + 1; + state.dataZoneCtrls->OccRoomTSetPointCool(ActualZoneNum) = DaySPValues(1, OccStartTime); + ScheduleManager::GetScheduleValuesForDay(state, SetPointTempSchedIndexHot, DaySPValues); + state.dataZoneCtrls->OccRoomTSetPointHeat(ActualZoneNum) = DaySPValues(1, OccStartTime); + } + + if (state.dataHVACGlobal->OptStartData.OptStartFlag(ActualZoneNum)) { + ZoneThermostatSetPointHi(ActualZoneNum) = state.dataZoneCtrls->OccRoomTSetPointCool(ActualZoneNum); + ZoneThermostatSetPointLo(ActualZoneNum) = state.dataZoneCtrls->OccRoomTSetPointHeat(ActualZoneNum); + } + } + //-------------------------------------------------------------------------------------------- + + AdjustCoolingSetPointforTempAndHumidityControl(state, RelativeZoneNum, ActualZoneNum); + break; + default: + ShowSevereError(state, + format("CalcZoneAirTempSetpoints: Illegal control type for Zone={}, Found value={}, in Schedule={}", + Zone(ActualZoneNum).Name, + TempControlType(ActualZoneNum), + TempControlledZone(RelativeZoneNum).ControlTypeSchedName)); + + break; + } + + // Apply offset for faulty therostats + if ((state.dataFaultsMgr->NumFaultyThermostat > 0) && (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing) && + (!state.dataGlobal->KickOffSimulation)) { + // loop through the FaultsThermostatOffset objects to find the one for the zone + for (int iFault = 1; iFault <= state.dataFaultsMgr->NumFaultyThermostat; ++iFault) { + + if (UtilityRoutines::SameString(TempControlledZone(RelativeZoneNum).Name, + state.dataFaultsMgr->FaultsThermostatOffset(iFault).FaultyThermostatName)) { + + // Check fault availability schedules + if (ScheduleManager::GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsThermostatOffset(iFault).AvaiSchedPtr) > 0.0) { + + // Check fault severity schedules to update the reference thermostat offset + double rSchVal = 1.0; + double offsetUpdated; + if (state.dataFaultsMgr->FaultsThermostatOffset(iFault).SeveritySchedPtr >= 0) { + rSchVal = + ScheduleManager::GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsThermostatOffset(iFault).SeveritySchedPtr); + } + offsetUpdated = rSchVal * state.dataFaultsMgr->FaultsThermostatOffset(iFault).Offset; + + // Positive offset means the sensor reading is higher than the actual value + TempZoneThermostatSetPoint(ActualZoneNum) -= offsetUpdated; + ZoneThermostatSetPointLo(ActualZoneNum) -= offsetUpdated; + ZoneThermostatSetPointHi(ActualZoneNum) -= offsetUpdated; + } + + // Stop searching the FaultsThermostatOffset object for the zone + break; + } + } + } + } + + if (state.dataZoneCtrls->NumComfortControlledZones > 0) CalcZoneAirComfortSetPoints(state); + OverrideAirSetPointsforEMSCntrl(state); +} + +void ZoneSpaceHeatBalanceData::calcPredictedHumidityRatio(EnergyPlusData &state, Real64 const RAFNFrac, int const zoneNum, int const spaceNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Richard J. Liesen + // DATE WRITTEN May 2001 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine does the prediction step for humidity control + + // METHODOLOGY EMPLOYED: + // This solves for the required system moisture required to try and achieve the desired + // Humidity Ratio in the Zone + + // REFERENCES: + // Routine FinalZnCalcs - FINAL ZONE CALCULATIONS, authored by Dale Herron + // for BLAST. + + static constexpr std::string_view RoutineName("calcPredictedHumidityRatio"); + + Real64 ZoneRHHumidifyingSetPoint = 0.0; // Zone humidifying set point (%) + Real64 ZoneRHDehumidifyingSetPoint = 0.0; // Zone dehumidifying set point (%) + + auto &thisZone = state.dataHeatBal->Zone(zoneNum); + bool SingleSetPoint = false; // This determines whether both setpoint are equal or not + + // Check to see if this is a "humidity controlled zone" + bool ControlledHumidZoneFlag = false; + // Check all the controlled zones to see if it matches the zone simulated + if (thisZone.humidityControlZoneIndex > 0) { + auto &humidityControlZone = state.dataZoneCtrls->HumidityControlZone(thisZone.humidityControlZoneIndex); + assert(humidityControlZone.ActualZoneNum == zoneNum); + ZoneRHHumidifyingSetPoint = ScheduleManager::GetCurrentScheduleValue(state, humidityControlZone.HumidifyingSchedIndex); + ZoneRHDehumidifyingSetPoint = ScheduleManager::GetCurrentScheduleValue(state, humidityControlZone.DehumidifyingSchedIndex); + + // Apply EMS values to overwrite the humidistat values + if (humidityControlZone.EMSOverrideHumidifySetPointOn) { + ZoneRHHumidifyingSetPoint = humidityControlZone.EMSOverrideHumidifySetPointValue; + } + if (humidityControlZone.EMSOverrideDehumidifySetPointOn) { + ZoneRHDehumidifyingSetPoint = humidityControlZone.EMSOverrideDehumidifySetPointValue; + } + + // Apply offsets for faulty humidistats + if ((state.dataFaultsMgr->NumFaultyHumidistat > 0) && (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing) && + (!state.dataGlobal->KickOffSimulation)) { + + // loop through the FaultsHumidistatOffset objects to find the one for the zone + for (int iFault = 1; iFault <= state.dataFaultsMgr->NumFaultyHumidistat; ++iFault) { + + if (UtilityRoutines::SameString(humidityControlZone.ControlName, + state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyHumidistatName)) { + + if (UtilityRoutines::SameString(state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyHumidistatType, + "ThermostatOffsetDependent")) { + // For Humidistat Offset Type I: ThermostatOffsetDependent + + bool IsThermostatFound = false; + double offsetThermostat = 0.0; + double offsetZoneRHHumidifyingSetPoint = 0.0; + double offsetZoneRHDehumidifyingSetPoint = 0.0; + double faultZoneWHumidifyingSetPoint; + double faultZoneWDehumidifyingSetPoint; + + // Get the offset value of the corresponding thermostat fault object + if (state.dataFaultsMgr->NumFaultyThermostat > 0) { + + // loop through the FaultsThermostatOffset objects to find the one causes the Humidistat Offset + for (int iFaultThermo = 1; iFaultThermo <= state.dataFaultsMgr->NumFaultyThermostat; ++iFaultThermo) { + + if (UtilityRoutines::SameString(state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyThermostatName, + state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).Name)) { + IsThermostatFound = true; + + // Check fault availability schedules + if (ScheduleManager::GetCurrentScheduleValue( + state, state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).AvaiSchedPtr) > 0.0) { + + // Check fault severity schedules to update the reference thermostat offset + double rSchVal = 1.0; + if (state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).SeveritySchedPtr >= 0) { + rSchVal = ScheduleManager::GetCurrentScheduleValue( + state, state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).SeveritySchedPtr); + } + offsetThermostat = rSchVal * state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).Offset; + } + + // Stop searching the FaultsThermostatOffset object for the Humidistat Offset + break; + } + } + } + + // The FaultsThermostatOffset specified in the FaultHumidistatOffset is not found + if (!IsThermostatFound) { + ShowSevereError(state, + "FaultModel:HumidistatOffset = \"" + state.dataFaultsMgr->FaultsHumidistatOffset(iFault).Name + + "\" invalid Reference Humidistat Offset Name = \"" + + state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyThermostatName + "\" not found."); + ShowFatalError(state, "Errors getting FaultModel input data. Preceding condition(s) cause termination."); + } + + if (offsetThermostat != 0.0) { + // Calculate the humidistat offset value from the thermostat offset value + faultZoneWHumidifyingSetPoint = Psychrometrics::PsyWFnTdbRhPb( + state, (this->MAT + offsetThermostat), (ZoneRHHumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress); + faultZoneWDehumidifyingSetPoint = Psychrometrics::PsyWFnTdbRhPb( + state, (this->MAT + offsetThermostat), (ZoneRHDehumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress); + offsetZoneRHHumidifyingSetPoint = + ZoneRHHumidifyingSetPoint - + Psychrometrics::PsyRhFnTdbWPb(state, this->MAT, faultZoneWHumidifyingSetPoint, state.dataEnvrn->OutBaroPress) * 100.0; + offsetZoneRHDehumidifyingSetPoint = + ZoneRHDehumidifyingSetPoint - + Psychrometrics::PsyRhFnTdbWPb(state, this->MAT, faultZoneWDehumidifyingSetPoint, state.dataEnvrn->OutBaroPress) * + 100.0; + + // Apply the calculated humidistat offset value + // Positive offset means the sensor reading is higher than the actual value + ZoneRHHumidifyingSetPoint -= offsetZoneRHHumidifyingSetPoint; + ZoneRHDehumidifyingSetPoint -= offsetZoneRHDehumidifyingSetPoint; + + // constrain value to something reasonable + ZoneRHHumidifyingSetPoint = min(100.0, max(0.0, ZoneRHHumidifyingSetPoint)); + ZoneRHDehumidifyingSetPoint = min(100.0, max(0.0, ZoneRHDehumidifyingSetPoint)); + } + + } else { + // For Humidistat Offset Type II: ThermostatOffsetIndependent + + // Check fault availability schedules + if (ScheduleManager::GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsHumidistatOffset(iFault).AvaiSchedPtr) > 0.0) { + + // Check fault severity schedules to update the reference humidistat offset + double rSchVal = 1.0; + double offsetUpdated; + if (state.dataFaultsMgr->FaultsHumidistatOffset(iFault).SeveritySchedPtr >= 0) { + rSchVal = ScheduleManager::GetCurrentScheduleValue( + state, state.dataFaultsMgr->FaultsHumidistatOffset(iFault).SeveritySchedPtr); + } + offsetUpdated = rSchVal * state.dataFaultsMgr->FaultsHumidistatOffset(iFault).Offset; + + // Positive offset means the sensor reading is higher than the actual value + ZoneRHHumidifyingSetPoint -= offsetUpdated; + ZoneRHDehumidifyingSetPoint -= offsetUpdated; + + // constrain value to something reasonable + ZoneRHHumidifyingSetPoint = min(100.0, max(0.0, ZoneRHHumidifyingSetPoint)); + ZoneRHDehumidifyingSetPoint = min(100.0, max(0.0, ZoneRHDehumidifyingSetPoint)); + } + } + break; + } + } + } + + // Run-time error check + if (ZoneRHHumidifyingSetPoint > ZoneRHDehumidifyingSetPoint) { + if (humidityControlZone.ErrorIndex == 0) { + ShowWarningMessage(state, + "HUMIDISTAT: The humidifying setpoint is above the dehumidifying setpoint in " + humidityControlZone.ControlName); + ShowContinueError(state, "The zone humidifying setpoint is set to the dehumidifying setpoint."); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "The humidifying setpoint is still above the dehumidifying setpoint", + humidityControlZone.ErrorIndex, + ZoneRHHumidifyingSetPoint, + ZoneRHHumidifyingSetPoint); + ZoneRHHumidifyingSetPoint = ZoneRHDehumidifyingSetPoint; + } + if (ZoneRHHumidifyingSetPoint == ZoneRHDehumidifyingSetPoint) SingleSetPoint = true; + ControlledHumidZoneFlag = true; + + } // HumidControlledZoneNum + + // if zone latent sizing is requested but no humidistat exists + if (state.dataGlobal->DoingSizing && !ControlledHumidZoneFlag && state.dataHeatBal->DoLatentSizing) { + for (size_t zoneEqConfigNum = 1; zoneEqConfigNum <= state.dataZoneEquip->ZoneEquipConfig.size(); ++zoneEqConfigNum) { + auto &zoneEqConfig = state.dataZoneEquip->ZoneEquipConfig(zoneEqConfigNum); + if (!zoneEqConfig.IsControlled) continue; + int ZoneSizNum = + UtilityRoutines::FindItemInList(zoneEqConfig.ZoneName, state.dataSize->ZoneSizingInput, &DataSizing::ZoneSizingInputData::ZoneName); + // should use the first Sizing:Zone object if not found + if (ZoneSizNum == 0 && !state.dataSize->ZoneSizingInput.empty()) ZoneSizNum = 1; + if (ZoneSizNum > 0) { + auto &zoneSizingInput = state.dataSize->ZoneSizingInput(ZoneSizNum); + if (zoneSizingInput.zoneLatentSizing) { + ZoneRHDehumidifyingSetPoint = (zoneSizingInput.zoneRHDehumidifySchIndex) + ? ScheduleManager::GetCurrentScheduleValue(state, zoneSizingInput.zoneRHDehumidifySchIndex) + : zoneSizingInput.zoneRHDehumidifySetPoint; + ZoneRHHumidifyingSetPoint = (zoneSizingInput.zoneRHHumidifySchIndex) + ? ScheduleManager::GetCurrentScheduleValue(state, zoneSizingInput.zoneRHHumidifySchIndex) + : zoneSizingInput.zoneRHHumidifySetPoint; + if (ZoneRHHumidifyingSetPoint > ZoneRHDehumidifyingSetPoint) ZoneRHHumidifyingSetPoint = ZoneRHDehumidifyingSetPoint; + if (ZoneRHHumidifyingSetPoint == ZoneRHDehumidifyingSetPoint) SingleSetPoint = true; + ControlledHumidZoneFlag = true; + } + } + break; + } + } + + Real64 LoadToHumidifySetPoint = 0.0; // Moisture load at humidifying set point + Real64 LoadToDehumidifySetPoint = 0.0; // Moisture load at dehumidifying set point + Real64 totalOutputRequired = 0.0; + if (ControlledHumidZoneFlag) { + + // Calculate hourly humidity ratio from infiltration + humidity added from latent load + // to determine system added/subtracted moisture. + Real64 LatentGain = + this->ZoneLatentGain + state.dataHeatBalFanSys->SumLatentHTRadSys(zoneNum) + state.dataHeatBalFanSys->SumLatentPool(zoneNum); + + Real64 SysTimeStepInSeconds = DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys; + + // Calculate the coefficients for the 3rd Order derivative for final + // zone humidity ratio. The A, B, C coefficients are analogous to the heat balance. + // SumHmARaW and SumHmARa will be used with the Moisture Balance on the building elements and + // are currently set to zero when the CTF only version is used. + + // The density of air and latent heat of vaporization are calculated as functions. + Real64 RhoAir = Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->ZT, this->ZoneAirHumRat, RoutineName); + Real64 H2OHtOfVap = Psychrometrics::PsyHgAirFnWTdb(this->ZoneAirHumRat, this->ZT); + + // Assume that the system will have flow + Real64 A = 0.0; + Real64 B = 0.0; + Real64 C = 0.0; + if (state.afn->multizone_always_simulated || + (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && + state.afn->AirflowNetworkFanActivated)) { + // Multizone airflow calculated in AirflowNetwork + B = (LatentGain / H2OHtOfVap) + state.afn->exchangeData(zoneNum).SumMHrW + state.afn->exchangeData(zoneNum).SumMMHrW + this->SumHmARaW; + A = state.afn->exchangeData(zoneNum).SumMHr + state.afn->exchangeData(zoneNum).SumMMHr + this->SumHmARa; + } else { + B = (LatentGain / H2OHtOfVap) + ((this->OAMFL + this->VAMFL + this->CTMFL) * state.dataEnvrn->OutHumRat) + this->EAMFLxHumRat + + this->SumHmARaW + this->MixingMassFlowXHumRat + this->MDotOA * state.dataEnvrn->OutHumRat; + A = this->OAMFL + this->VAMFL + this->EAMFL + this->CTMFL + this->SumHmARa + this->MixingMassFlowZone + this->MDotOA; + } + Real64 volume = 0.0; + if (spaceNum > 0) { + volume = state.dataHeatBal->space(spaceNum).Volume; + } else { + volume = thisZone.Volume; + } + C = RhoAir * volume * thisZone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; + + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + auto &roomAFNInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); + int RoomAirNode = roomAFNInfo.ControlAirNodeID; + H2OHtOfVap = Psychrometrics::PsyHgAirFnWTdb(roomAFNInfo.Node(RoomAirNode).HumRat, roomAFNInfo.Node(RoomAirNode).AirTemp); + A = roomAFNInfo.Node(RoomAirNode).SumLinkM + roomAFNInfo.Node(RoomAirNode).SumHmARa; + B = (roomAFNInfo.Node(RoomAirNode).SumIntLatentGain / H2OHtOfVap) + roomAFNInfo.Node(RoomAirNode).SumLinkMW + + roomAFNInfo.Node(RoomAirNode).SumHmARaW; + C = roomAFNInfo.Node(RoomAirNode).RhoAir * roomAFNInfo.Node(RoomAirNode).AirVolume * thisZone.ZoneVolCapMultpMoist / + (DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys); + } + + // Use a 3rd Order derivative to predict zone moisture addition or removal and + // smooth the changes using the zone air capacitance. Positive values of Moist Load means that + // this amount of moisture must be added to the zone to reach the setpoint. Negative values represent + // the amount of moisture that must be removed by the system. + // MoistLoadHumidSetPoint = massflow * HumRat = kgDryAir/s * kgWater/kgDryAir = kgWater/s + Real64 WZoneSetPoint = + Psychrometrics::PsyWFnTdbRhPb(state, this->ZT, (ZoneRHHumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress, RoutineName); + Real64 exp_700_A_C(0.0); + if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::ThirdOrder) { + LoadToHumidifySetPoint = + ((11.0 / 6.0) * C + A) * WZoneSetPoint - + (B + C * (3.0 * this->WPrevZoneTSTemp[0] - (3.0 / 2.0) * this->WPrevZoneTSTemp[1] + (1.0 / 3.0) * this->WPrevZoneTSTemp[2])); + // Exact solution + } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::AnalyticalSolution) { + if (A == 0.0) { // B=0 + LoadToHumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) - B; + } else { + exp_700_A_C = std::exp(min(700.0, -A / C)); // Tuned Save expensive value + LoadToHumidifySetPoint = A * (WZoneSetPoint - this->ZoneW1 * exp_700_A_C) / (1.0 - exp_700_A_C) - B; + } + } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::EulerMethod) { + LoadToHumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) + A * WZoneSetPoint - B; + } + if (RAFNFrac > 0.0) LoadToHumidifySetPoint = LoadToHumidifySetPoint / RAFNFrac; + WZoneSetPoint = + Psychrometrics::PsyWFnTdbRhPb(state, this->ZT, (ZoneRHDehumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress, RoutineName); + if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::ThirdOrder) { + LoadToDehumidifySetPoint = + ((11.0 / 6.0) * C + A) * WZoneSetPoint - + (B + C * (3.0 * this->WPrevZoneTSTemp[0] - (3.0 / 2.0) * this->WPrevZoneTSTemp[1] + (1.0 / 3.0) * this->WPrevZoneTSTemp[2])); + // Exact solution + } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::AnalyticalSolution) { + if (A == 0.0) { // B=0 + LoadToDehumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) - B; + } else { + LoadToDehumidifySetPoint = A * (WZoneSetPoint - this->ZoneW1 * exp_700_A_C) / (1.0 - exp_700_A_C) - B; // exp_700_A_C set above + } + } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::EulerMethod) { + LoadToDehumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) + A * WZoneSetPoint - B; + } + if (RAFNFrac > 0.0) LoadToDehumidifySetPoint = LoadToDehumidifySetPoint / RAFNFrac; + + // The load is added to the TotalOutputRequired as in the Temperature Predictor. There is also the remaining + // output variable for those who will use this for humidity control and stored in DataZoneEnergyDemands with the + // analogous temperature terms. + + if (SingleSetPoint) { + totalOutputRequired = LoadToHumidifySetPoint; + } else { + if (LoadToHumidifySetPoint > 0.0 && LoadToDehumidifySetPoint > 0.0) { + totalOutputRequired = LoadToHumidifySetPoint; + } else if (LoadToHumidifySetPoint < 0.0 && LoadToDehumidifySetPoint < 0.0) { + totalOutputRequired = LoadToDehumidifySetPoint; + } else if (LoadToHumidifySetPoint <= 0.0 && LoadToDehumidifySetPoint >= 0.0) { // deadband includes zero loads + totalOutputRequired = 0.0; + } else { // this should never occur! + ShowSevereError( + state, "Humidistat: Unanticipated combination of humidifying and dehumidifying loads - report to EnergyPlus Development Team"); + ShowContinueErrorTimeStamp(state, format("occurs in Zone = {}", thisZone.Name)); + ShowContinueError( + state, + format("LoadToHumidifySetPoint={:.5R}, LoadToDehumidifySetPoint={:.5R}", LoadToHumidifySetPoint, LoadToDehumidifySetPoint)); + ShowContinueError(state, format("Zone RH Humidifying Set-point={:.1R}", ZoneRHHumidifyingSetPoint)); + ShowContinueError(state, format("Zone RH Dehumidifying Set-point={:.2R}", ZoneRHDehumidifyingSetPoint)); + ShowFatalError(state, "Program terminates due to above conditions."); + } + } + } + + // Apply zone multipliers as needed or set to zero + if (spaceNum > 0) { + auto &thisspaceSysMoistureDemand = state.dataZoneEnergyDemand->spaceSysMoistureDemand(spaceNum); + if (ControlledHumidZoneFlag) { + thisspaceSysMoistureDemand.reportMoistLoadsZoneMultiplier( + state, zoneNum, totalOutputRequired, LoadToHumidifySetPoint, LoadToDehumidifySetPoint); + } else { + thisspaceSysMoistureDemand.TotalOutputRequired = 0.0; + thisspaceSysMoistureDemand.OutputRequiredToDehumidifyingSP = 0.0; + thisspaceSysMoistureDemand.OutputRequiredToHumidifyingSP = 0.0; + } + } else { + auto &thisZoneSysMoistureDemand = state.dataZoneEnergyDemand->ZoneSysMoistureDemand(zoneNum); + if (ControlledHumidZoneFlag) { + thisZoneSysMoistureDemand.reportMoistLoadsZoneMultiplier( + state, zoneNum, totalOutputRequired, LoadToHumidifySetPoint, LoadToDehumidifySetPoint); + } else { + thisZoneSysMoistureDemand.TotalOutputRequired = 0.0; + thisZoneSysMoistureDemand.OutputRequiredToDehumidifyingSP = 0.0; + thisZoneSysMoistureDemand.OutputRequiredToHumidifyingSP = 0.0; + } + } +} + +Real64 correctZoneAirTemps(EnergyPlusData &state, + bool useZoneTimeStepHistory // if true then use zone timestep history, if false use system time step history +) +{ + Real64 maxTempChange = DataPrecisionGlobals::constant_zero; // Max absolute air temperature change between previous and current timestep + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + Real64 zoneTempChange = state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).correctAirTemp(state, useZoneTimeStepHistory, zoneNum); + if (state.dataHeatBal->doSpaceHeatBalance) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + Real64 spaceTempChange = + state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).correctAirTemp(state, useZoneTimeStepHistory, zoneNum, spaceNum); + maxTempChange = max(maxTempChange, spaceTempChange); + } + } + maxTempChange = max(maxTempChange, zoneTempChange); + } + return maxTempChange; +} + +Real64 ZoneSpaceHeatBalanceData::correctAirTemp( + EnergyPlusData &state, + bool const useZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step history + int const zoneNum, + int const spaceNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Russell Taylor + // MODIFIED November 1999, LKL; November 2016 Sang Hoon Lee, Tianzhen Hong, Rongpeng Zhang; + // RE-ENGINEERED July 2003 (Peter Graham Ellis) + // February 2008 (Brent Griffith reworked history ) + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine updates the zone air temperature and modifies the system + // time step. + + static constexpr std::string_view RoutineName("correctAirTemp"); + + Real64 tempChange = DataPrecisionGlobals::constant_zero; // Zone or space air temperature change between previous and current timestep + + assert(zoneNum > 0); + auto &thisZone = state.dataHeatBal->Zone(zoneNum); + + // Update zone temperatures + + Real64 ZoneMult = thisZone.Multiplier * thisZone.ListMultiplier; + + // update the variables actually used in the balance equations. + if (!useZoneTimeStepHistory) { + this->ZTM = this->DSXMAT; + this->WPrevZoneTSTemp = this->DSWPrevZoneTS; + } else { + this->ZTM = this->XMAT; + this->WPrevZoneTSTemp = this->WPrevZoneTS; + } + + Real64 volume = 0.0; + if (spaceNum > 0) { + volume = state.dataHeatBal->space(spaceNum).Volume; + } else { + volume = thisZone.Volume; + } + this->AirPowerCap = volume * thisZone.ZoneVolCapMultpSens * + Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->MAT, this->ZoneAirHumRat, RoutineName) * + Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat) / (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); + + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0) { + RoomAirModelManager::ManageAirModel(state, zoneNum); + } + + // Calculate the various heat balance sums + this->calcZoneOrSpaceSums(state, true, zoneNum, spaceNum); + + // Sum all convective internal gains except for people: SumIntGainExceptPeople + if (state.dataHybridModel->FlagHybridModel_PC) { + // TODO: For now, don't do space heat balance with hybrid model + this->SumIntGainExceptPeople = InternalHeatGains::SumAllInternalConvectionGainsExceptPeople(state, zoneNum); + } + + // ZoneTempHistoryTerm = (3.0D0 * ZTM1(zoneNum) - (3.0D0/2.0D0) * ZTM2(zoneNum) + (1.0D0/3.0D0) * ZTM3(zoneNum)) + int ZoneNodeNum = thisZone.SystemZoneNodeNumber; + if (spaceNum > 0) { + ZoneNodeNum = state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber; + } + + Real64 SNLoad = 0.0; + + if (ZoneNodeNum > 0) { // This zone is controlled by a zone equipment configuration or zone plenum + auto &thisSystemNode = state.dataLoopNodes->Node(ZoneNodeNum); + + // Heat balance coefficients for controlled zone, i.e. with system air flow + this->TempDepCoef = this->SumHA + this->SumMCp + this->SumSysMCp; + this->TempIndCoef = this->SumIntGain + this->SumHATsurf - this->SumHATref + this->SumMCpT + this->SumSysMCpT + + (this->NonAirSystemResponse / ZoneMult + this->SysDepZoneLoadsLagged); + + if (state.afn->distribution_simulated) { + this->TempIndCoef += state.afn->exchangeData(zoneNum).TotalSen; + } + + // Solve for zone air temperature + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + this->ZT = (this->TempIndCoef + this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2])) / + ((11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef); + } break; + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepCoef == 0.0) { // B=0 + this->ZT = this->ZoneT1 + this->TempIndCoef / this->AirPowerCap; + } else { + this->ZT = (this->ZoneT1 - this->TempIndCoef / this->TempDepCoef) * std::exp(min(700.0, -this->TempDepCoef / this->AirPowerCap)) + + this->TempIndCoef / this->TempDepCoef; + } + } break; + case DataHeatBalance::SolutionAlgo::EulerMethod: { + this->ZT = (this->AirPowerCap * this->ZoneT1 + this->TempIndCoef) / (this->AirPowerCap + this->TempDepCoef); + } break; + default: + break; + } + // Update zone node temperature and thermostat temperature unless already updated in Room Air Model, + // calculate load correction factor + if (!state.dataRoomAirMod->anyNonMixingRoomAirModel) { + // Fully mixed + thisSystemNode.Temp = this->ZT; + // SpaceHB TODO: What to do here if this is for space + if (spaceNum == 0) { + state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; + } + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; + } else { + auto &thisAirModel = state.dataRoomAirMod->AirModel(zoneNum); + if ((thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::Mixing) || (!thisAirModel.SimAirModel)) { + // Fully mixed + thisSystemNode.Temp = this->ZT; + // SpaceHB TODO: What to do here if this is for space + if (spaceNum == 0) { + state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; + } + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; + } else if (state.dataRoomAirMod->IsZoneDV(zoneNum) || state.dataRoomAirMod->IsZoneUI(zoneNum)) { + // UCSDDV: Not fully mixed - calculate factor to correct load for fully mixed assumption + // Space HB TODO: Space HB doesn't mix with DV etc. + if (this->SumSysMCp > DataHVACGlobals::SmallMassFlow) { + Real64 TempSupplyAir = this->SumSysMCpT / this->SumSysMCp; // Non-negligible flow, calculate supply air temperature + if (std::abs(TempSupplyAir - this->ZT) > state.dataHeatBal->TempConvergTol) { + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = (TempSupplyAir - thisSystemNode.Temp) / (TempSupplyAir - this->ZT); + // constrain value to something reasonable + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = max(-3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = min(3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); + + } else { + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; // Indeterminate + } + } else { + // Negligible flow, assume mixed - reasonable lagged starting value for first step time with significant flow + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; + } + } else if (thisAirModel.SimAirModel && ((thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UserDefined) || + (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::Mundt))) { + if (this->SumSysMCp > DataHVACGlobals::SmallMassFlow) { + Real64 TempSupplyAir = this->SumSysMCpT / this->SumSysMCp; // Non-negligible flow, calculate supply air temperature + if (std::abs(TempSupplyAir - this->ZT) > state.dataHeatBal->TempConvergTol) { + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = (TempSupplyAir - thisSystemNode.Temp) / (TempSupplyAir - this->ZT); + // constrain value + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = max(-3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = min(3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); + + } else { + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; // Indeterminate + } + } else { + // Negligible flow, assume mixed - reasonable lagged starting value for first step time with significant flow + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; + } + } else if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + // Zone node used in the RoomAirflowNetwork model + this->ZT = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum) + .Node(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).ControlAirNodeID) + .AirTemp; + thisSystemNode.Temp = this->ZT; + // SpaceHB TODO: What to do here if this is for space + if (spaceNum == 0) { + state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; + } + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; + } else { + thisSystemNode.Temp = this->ZT; + // SpaceHB TODO: What to do here if this is for space + if (spaceNum == 0) { + state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; + } + state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; + } + } + + // Sensible load is the enthalpy into the zone minus the enthalpy that leaves the zone. + Real64 CpAir = Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat); + Real64 ZoneEnthalpyIn = this->SumSysMCpT; + + // SNLOAD is the single zone load, without Zone Multiplier or Zone List Multiplier + SNLoad = ZoneEnthalpyIn - (thisSystemNode.MassFlowRate / ZoneMult) * CpAir * thisSystemNode.Temp + this->NonAirSystemResponse / ZoneMult + + this->SysDepZoneLoadsLagged; + + } else { + + // Heat balance coefficients for uncontrolled zone, i.e. without system air flow + this->TempDepCoef = this->SumHA + this->SumMCp; + this->TempIndCoef = this->SumIntGain + this->SumHATsurf - this->SumHATref + this->SumMCpT; + + if (state.afn->distribution_simulated) { + this->TempIndCoef += state.afn->exchangeData(zoneNum).TotalSen; + } + + // Solve for zone air temperature + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + this->ZT = (this->TempIndCoef + this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2])) / + ((11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef); + // Exact solution + } break; + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepCoef == 0.0) { // B=0 + this->ZT = this->ZoneT1 + this->TempIndCoef / this->AirPowerCap; + } else { + this->ZT = (this->ZoneT1 - this->TempIndCoef / this->TempDepCoef) * std::exp(min(700.0, -this->TempDepCoef / this->AirPowerCap)) + + this->TempIndCoef / this->TempDepCoef; + } + } break; + case DataHeatBalance::SolutionAlgo::EulerMethod: { + this->ZT = (this->AirPowerCap * this->ZoneT1 + this->TempIndCoef) / (this->AirPowerCap + this->TempDepCoef); + } break; + default: + break; + } + + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + this->ZT = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum) + .Node(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).ControlAirNodeID) + .AirTemp; + } + } + + // No sensible load + SNLoad = 0.0; + } + + // Hybrid modeling start + // SpaceHB TODO: For now, hybrid model is only for zones + if (spaceNum == 0 && state.dataHybridModel->FlagHybridModel) { + if ((state.dataHybridModel->HybridModelZone(zoneNum).InfiltrationCalc_T || + state.dataHybridModel->HybridModelZone(zoneNum).InternalThermalMassCalc_T || + state.dataHybridModel->HybridModelZone(zoneNum).PeopleCountCalc_T) && + (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing)) { + InverseModelTemperature(state, + zoneNum, + this->SumIntGain, + this->SumIntGainExceptPeople, + this->SumHA, + this->SumHATsurf, + this->SumHATref, + this->SumMCp, + this->SumMCpT, + this->SumSysMCp, + this->SumSysMCpT, + this->AirPowerCap); + } + } + + this->MAT = this->ZT; + + // Determine sensible load heating/cooling rate and energy + if (spaceNum > 0) { + state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).reportZoneAirSystemSensibleLoads(state, SNLoad); + } else { + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).reportZoneAirSystemSensibleLoads(state, SNLoad); + } + + // Final humidity calcs + this->correctHumRat(state, zoneNum, spaceNum); + + this->ZoneAirHumRat = this->ZoneAirHumRatTemp; + this->ZoneAirRelHum = 100.0 * Psychrometrics::PsyRhFnTdbWPb(state, this->ZT, this->ZoneAirHumRat, state.dataEnvrn->OutBaroPress, RoutineName); + + // tempChange is used by HVACManager to determine if the timestep needs to be shortened. + bool isMixed = true; + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { + isMixed = !((state.dataRoomAirMod->IsZoneDV(zoneNum) && !state.dataRoomAirMod->ZoneDVMixedFlag(zoneNum)) || + (state.dataRoomAirMod->IsZoneUI(zoneNum) && !state.dataRoomAirMod->ZoneUFMixedFlag(zoneNum))); + } + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + if (isMixed) { + tempChange = max(tempChange, std::abs(this->ZT - this->ZTM[0])); + } else { + tempChange = max(tempChange, + max(std::abs(state.dataRoomAirMod->ZTOC(zoneNum) - state.dataRoomAirMod->ZTM1OC(zoneNum)), + std::abs(state.dataRoomAirMod->ZTMX(zoneNum) - state.dataRoomAirMod->ZTM1MX(zoneNum)))); + } + } break; + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: + case DataHeatBalance::SolutionAlgo::EulerMethod: { + if (isMixed) { + tempChange = max(tempChange, std::abs(this->ZT - this->ZoneT1)); + } else { + tempChange = max(tempChange, + max(std::abs(state.dataRoomAirMod->ZTOC(zoneNum) - state.dataRoomAirMod->Zone1OC(zoneNum)), + std::abs(state.dataRoomAirMod->ZTMX(zoneNum) - state.dataRoomAirMod->Zone1MX(zoneNum)))); + } + } break; + default: + break; + } + + CalcZoneComponentLoadSums(state, + zoneNum, + this->TempDepCoef, + this->TempIndCoef, + state.dataHeatBal->ZnAirRpt(zoneNum).SumIntGains, + state.dataHeatBal->ZnAirRpt(zoneNum).SumHADTsurfs, + state.dataHeatBal->ZnAirRpt(zoneNum).SumMCpDTzones, + state.dataHeatBal->ZnAirRpt(zoneNum).SumMCpDtInfil, + state.dataHeatBal->ZnAirRpt(zoneNum).SumMCpDTsystem, + state.dataHeatBal->ZnAirRpt(zoneNum).SumNonAirSystem, + state.dataHeatBal->ZnAirRpt(zoneNum).CzdTdt, + state.dataHeatBal->ZnAirRpt(zoneNum).imBalance, + state.dataHeatBal->ZnAirRpt(zoneNum).SumEnthalpyM, + state.dataHeatBal->ZnAirRpt(zoneNum).SumEnthalpyH); + return tempChange; +} + +void PushZoneTimestepHistories(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Brent Griffith + // DATE WRITTEN February 2008 + + // PURPOSE OF THIS SUBROUTINE: + // push histories for timestep advancing + + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).pushZoneTimestepHistory(state, zoneNum); + if (state.dataHeatBal->doSpaceHeatBalance) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).pushZoneTimestepHistory(state, zoneNum, spaceNum); + } + } + } +} + +void ZoneSpaceHeatBalanceData::pushZoneTimestepHistory(EnergyPlusData &state, int const zoneNum, int const spaceNum) +{ + + constexpr std::string_view routineName("pushTimestepHistories"); + assert(zoneNum > 0); + + auto &thisAirModel = state.dataRoomAirMod->AirModel(zoneNum); + + // Push the temperature and humidity ratio histories + + for (int iHistory = 3; iHistory >= 1; --iHistory) { + this->XMAT[iHistory] = this->XMAT[iHistory - 1]; + this->WPrevZoneTS[iHistory] = this->WPrevZoneTS[iHistory - 1]; + } + this->XMAT[0] = this->ZTAV; // using average for whole zone time step. + this->XMPT = this->ZT; + this->WPrevZoneTS[0] = this->ZoneAirHumRatAvg; // using average for whole zone time step. + this->ZoneAirHumRat = this->ZoneAirHumRatTemp; + this->WZoneTimeMinusP = this->ZoneAirHumRatTemp; + this->ZoneAirRelHum = 100.0 * Psychrometrics::PsyRhFnTdbWPb(state, this->ZT, this->ZoneAirHumRat, state.dataEnvrn->OutBaroPress, routineName); + + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0) { + if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || + thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || + thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { + state.dataRoomAirMod->XM4TFloor(zoneNum) = state.dataRoomAirMod->XM3TFloor(zoneNum); + state.dataRoomAirMod->XM3TFloor(zoneNum) = state.dataRoomAirMod->XM2TFloor(zoneNum); + state.dataRoomAirMod->XM2TFloor(zoneNum) = state.dataRoomAirMod->XMATFloor(zoneNum); + state.dataRoomAirMod->XMATFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); + state.dataRoomAirMod->MATFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); + + state.dataRoomAirMod->XM4TOC(zoneNum) = state.dataRoomAirMod->XM3TOC(zoneNum); + state.dataRoomAirMod->XM3TOC(zoneNum) = state.dataRoomAirMod->XM2TOC(zoneNum); + state.dataRoomAirMod->XM2TOC(zoneNum) = state.dataRoomAirMod->XMATOC(zoneNum); + state.dataRoomAirMod->XMATOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); + state.dataRoomAirMod->MATOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); + + state.dataRoomAirMod->XM4TMX(zoneNum) = state.dataRoomAirMod->XM3TMX(zoneNum); + state.dataRoomAirMod->XM3TMX(zoneNum) = state.dataRoomAirMod->XM2TMX(zoneNum); + state.dataRoomAirMod->XM2TMX(zoneNum) = state.dataRoomAirMod->XMATMX(zoneNum); + state.dataRoomAirMod->XMATMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); + state.dataRoomAirMod->MATMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); + } + + // for RoomAirflowNetwork model + if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { + auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); + roomAirflowNetworkZoneInfo.AirTempX4 = roomAirflowNetworkZoneInfo.AirTempX3; + roomAirflowNetworkZoneInfo.AirTempX3 = roomAirflowNetworkZoneInfo.AirTempX2; + roomAirflowNetworkZoneInfo.AirTempX2 = roomAirflowNetworkZoneInfo.AirTempX1; + roomAirflowNetworkZoneInfo.AirTempX1 = roomAirflowNetworkZoneInfo.AirTemp; + + roomAirflowNetworkZoneInfo.HumRatX4 = roomAirflowNetworkZoneInfo.HumRatX3; + roomAirflowNetworkZoneInfo.HumRatX3 = roomAirflowNetworkZoneInfo.HumRatX2; + roomAirflowNetworkZoneInfo.HumRatX2 = roomAirflowNetworkZoneInfo.HumRatX1; + roomAirflowNetworkZoneInfo.HumRatX1 = roomAirflowNetworkZoneInfo.HumRat; + } + } + } + + if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) { + this->ZoneTM2 = this->ZoneTMX; + this->ZoneTMX = this->ZTAV; // using average for whole zone time step. + this->ZoneWM2 = this->ZoneWMX; + this->ZoneWMX = this->ZoneAirHumRatAvg; // using average for whole zone time step. + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0) { + if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || + thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || + thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { + state.dataRoomAirMod->ZoneM2Floor(zoneNum) = state.dataRoomAirMod->ZoneMXFloor(zoneNum); + state.dataRoomAirMod->ZoneMXFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); // using average for whole zone time step. + state.dataRoomAirMod->ZoneM2OC(zoneNum) = state.dataRoomAirMod->ZoneMXOC(zoneNum); + state.dataRoomAirMod->ZoneMXOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); // using average for whole zone time step. + state.dataRoomAirMod->ZoneM2MX(zoneNum) = state.dataRoomAirMod->ZoneMXMX(zoneNum); + state.dataRoomAirMod->ZoneMXMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); // using average for whole zone time step. + } + + if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { + auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); + roomAirflowNetworkZoneInfo.AirTempTM2 = roomAirflowNetworkZoneInfo.AirTempTMX; + roomAirflowNetworkZoneInfo.AirTempTMX = roomAirflowNetworkZoneInfo.AirTemp; + + roomAirflowNetworkZoneInfo.HumRatWM2 = roomAirflowNetworkZoneInfo.HumRatWMX; + roomAirflowNetworkZoneInfo.HumRatWMX = roomAirflowNetworkZoneInfo.HumRat; + } + } + } + } +} + +void PushSystemTimestepHistories(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Brent Griffith + // DATE WRITTEN April 2008 + + // PURPOSE OF THIS SUBROUTINE: + // Push the temperature and humidity ratio histories back in time + + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).pushSystemTimestepHistory(state, zoneNum); + if (state.dataHeatBal->doSpaceHeatBalance) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).pushSystemTimestepHistory(state, zoneNum, spaceNum); + } + } + } +} + +void ZoneSpaceHeatBalanceData::pushSystemTimestepHistory(EnergyPlusData &state, int const zoneNum, int const spaceNum) +{ + assert(zoneNum > 0); + for (int iHistory = 3; iHistory >= 1; --iHistory) { + this->DSXMAT[iHistory] = this->DSXMAT[iHistory - 1]; + this->DSWPrevZoneTS[iHistory] = this->DSWPrevZoneTS[iHistory - 1]; + } + this->DSXMAT[0] = this->MAT; + this->DSWPrevZoneTS[0] = this->ZoneAirHumRat; + + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { + if (state.dataRoomAirMod->IsZoneDV(zoneNum) || state.dataRoomAirMod->IsZoneUI(zoneNum)) { + state.dataRoomAirMod->DSXM4TFloor(zoneNum) = state.dataRoomAirMod->DSXM3TFloor(zoneNum); + state.dataRoomAirMod->DSXM3TFloor(zoneNum) = state.dataRoomAirMod->DSXM2TFloor(zoneNum); + state.dataRoomAirMod->DSXM2TFloor(zoneNum) = state.dataRoomAirMod->DSXMATFloor(zoneNum); + state.dataRoomAirMod->DSXMATFloor(zoneNum) = state.dataRoomAirMod->MATFloor(zoneNum); + + state.dataRoomAirMod->DSXM4TOC(zoneNum) = state.dataRoomAirMod->DSXM3TOC(zoneNum); + state.dataRoomAirMod->DSXM3TOC(zoneNum) = state.dataRoomAirMod->DSXM2TOC(zoneNum); + state.dataRoomAirMod->DSXM2TOC(zoneNum) = state.dataRoomAirMod->DSXMATOC(zoneNum); + state.dataRoomAirMod->DSXMATOC(zoneNum) = state.dataRoomAirMod->MATOC(zoneNum); + + state.dataRoomAirMod->DSXM4TMX(zoneNum) = state.dataRoomAirMod->DSXM3TMX(zoneNum); + state.dataRoomAirMod->DSXM3TMX(zoneNum) = state.dataRoomAirMod->DSXM2TMX(zoneNum); + state.dataRoomAirMod->DSXM2TMX(zoneNum) = state.dataRoomAirMod->DSXMATMX(zoneNum); + state.dataRoomAirMod->DSXMATMX(zoneNum) = state.dataRoomAirMod->MATMX(zoneNum); + } + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { + auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); + roomAirflowNetworkZoneInfo.AirTempDSX4 = roomAirflowNetworkZoneInfo.AirTempDSX3; + roomAirflowNetworkZoneInfo.AirTempDSX3 = roomAirflowNetworkZoneInfo.AirTempDSX2; + roomAirflowNetworkZoneInfo.AirTempDSX2 = roomAirflowNetworkZoneInfo.AirTempDSX1; + roomAirflowNetworkZoneInfo.AirTempDSX1 = roomAirflowNetworkZoneInfo.AirTemp; + + roomAirflowNetworkZoneInfo.HumRatDSX4 = roomAirflowNetworkZoneInfo.HumRatDSX3; + roomAirflowNetworkZoneInfo.HumRatDSX3 = roomAirflowNetworkZoneInfo.HumRatDSX2; + roomAirflowNetworkZoneInfo.HumRatDSX2 = roomAirflowNetworkZoneInfo.HumRatDSX1; + roomAirflowNetworkZoneInfo.HumRatDSX1 = roomAirflowNetworkZoneInfo.HumRat; + } + } + } + + if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) { + this->ZoneTM2 = this->ZoneTMX; + this->ZoneTMX = this->MAT; // using average for whole zone time step. + this->ZoneWM2 = this->ZoneWMX; + this->ZoneWMX = this->ZoneAirHumRatTemp; // using average for whole zone time step. + + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0) { + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || + state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || + state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { + state.dataRoomAirMod->ZoneM2Floor(zoneNum) = state.dataRoomAirMod->ZoneMXFloor(zoneNum); + state.dataRoomAirMod->ZoneMXFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); // using average for whole zone time step. + state.dataRoomAirMod->ZoneM2OC(zoneNum) = state.dataRoomAirMod->ZoneMXOC(zoneNum); + state.dataRoomAirMod->ZoneMXOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); // using average for whole zone time step. + state.dataRoomAirMod->ZoneM2MX(zoneNum) = state.dataRoomAirMod->ZoneMXMX(zoneNum); + state.dataRoomAirMod->ZoneMXMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); // using average for whole zone time step. + } + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { + auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); + roomAirflowNetworkZoneInfo.AirTempTM2 = roomAirflowNetworkZoneInfo.AirTempTMX; + roomAirflowNetworkZoneInfo.AirTempTMX = roomAirflowNetworkZoneInfo.AirTemp; + + roomAirflowNetworkZoneInfo.HumRatWM2 = roomAirflowNetworkZoneInfo.HumRatWMX; + roomAirflowNetworkZoneInfo.HumRatWMX = roomAirflowNetworkZoneInfo.HumRat; + } + } + } + } +} + +void RevertZoneTimestepHistories(EnergyPlusData &state) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Brent Griffith + // DATE WRITTEN February 2008 + + // PURPOSE OF THIS SUBROUTINE: + // Revert the temperature and humidity ratio histories + + for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { + state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).revertZoneTimestepHistory(state, zoneNum); + if (state.dataHeatBal->doSpaceHeatBalance) { + for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).revertZoneTimestepHistory(state, zoneNum, spaceNum); + } + } + } +} + +void ZoneSpaceHeatBalanceData::revertZoneTimestepHistory(EnergyPlusData &state, int const zoneNum, int const spaceNum) +{ + assert(zoneNum > 0); + + for (int iHistory = 0; iHistory <= 2; ++iHistory) { + this->XMAT[iHistory] = this->XMAT[iHistory + 1]; + this->WPrevZoneTS[iHistory] = this->WPrevZoneTS[iHistory + 1]; + } + + // SpaceHB TODO: For now, room air model is only for zones + if (spaceNum == 0) { + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || + state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || + state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { + + state.dataRoomAirMod->XMATFloor(zoneNum) = state.dataRoomAirMod->XM2TFloor(zoneNum); + state.dataRoomAirMod->XM2TFloor(zoneNum) = state.dataRoomAirMod->XM3TFloor(zoneNum); + state.dataRoomAirMod->XM3TFloor(zoneNum) = state.dataRoomAirMod->XM4TFloor(zoneNum); + + state.dataRoomAirMod->XMATOC(zoneNum) = state.dataRoomAirMod->XM2TOC(zoneNum); + state.dataRoomAirMod->XM2TOC(zoneNum) = state.dataRoomAirMod->XM3TOC(zoneNum); + state.dataRoomAirMod->XM3TOC(zoneNum) = state.dataRoomAirMod->XM4TOC(zoneNum); + + state.dataRoomAirMod->XMATMX(zoneNum) = state.dataRoomAirMod->XM2TMX(zoneNum); + state.dataRoomAirMod->XM2TMX(zoneNum) = state.dataRoomAirMod->XM3TMX(zoneNum); + state.dataRoomAirMod->XM3TMX(zoneNum) = state.dataRoomAirMod->XM4TMX(zoneNum); + } + + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { + auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); + roomAirflowNetworkZoneInfo.AirTempX1 = roomAirflowNetworkZoneInfo.AirTempX2; + roomAirflowNetworkZoneInfo.AirTempX2 = roomAirflowNetworkZoneInfo.AirTempX3; + roomAirflowNetworkZoneInfo.AirTempX3 = roomAirflowNetworkZoneInfo.AirTempX4; + + roomAirflowNetworkZoneInfo.HumRatX1 = roomAirflowNetworkZoneInfo.HumRatX2; + roomAirflowNetworkZoneInfo.HumRatX2 = roomAirflowNetworkZoneInfo.HumRatX3; + roomAirflowNetworkZoneInfo.HumRatX3 = roomAirflowNetworkZoneInfo.HumRatX4; + } + } + } +} + +void ZoneSpaceHeatBalanceData::correctHumRat(EnergyPlusData &state, int const zoneNum, int const spaceNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Richard Liesen + // DATE WRITTEN 2000 + // REFERENCES: Routine FinalZnCalcs - FINAL ZONE CALCULATIONS, authored by Dale Herron for BLAST. + + assert(zoneNum > 0); + static constexpr std::string_view RoutineName("correctHumRat"); + + Real64 MoistureMassFlowRate = 0.0; + Real64 ZoneMassFlowRate = 0.0; + auto &zone = state.dataHeatBal->Zone(zoneNum); + int ZoneMult = zone.Multiplier * zone.ListMultiplier; + bool ControlledZoneAirFlag = zone.IsControlled; + bool ZoneRetPlenumAirFlag = zone.IsReturnPlenum; + bool ZoneSupPlenumAirFlag = zone.IsSupplyPlenum; + + if (ControlledZoneAirFlag) { // If there is system flow then calculate the flow rates + auto &zoneEquipConfig = state.dataZoneEquip->ZoneEquipConfig(zoneNum); + // Calculate moisture flow rate into each zone + for (int NodeNum = 1; NodeNum <= zoneEquipConfig.NumInletNodes; ++NodeNum) { + auto &inletNode = state.dataLoopNodes->Node(zoneEquipConfig.InletNode(NodeNum)); + MoistureMassFlowRate += (inletNode.MassFlowRate * inletNode.HumRat) / ZoneMult; + ZoneMassFlowRate += inletNode.MassFlowRate / ZoneMult; + } + + // Do the calculations for the plenum zone + } else if (ZoneRetPlenumAirFlag) { + int ZoneRetPlenumNum = zone.PlenumCondNum; + auto &zoneRetPlenCond = state.dataZonePlenum->ZoneRetPlenCond(ZoneRetPlenumNum); + for (int NodeNum = 1; NodeNum <= zoneRetPlenCond.NumInletNodes; ++NodeNum) { + auto &inletNode = state.dataLoopNodes->Node(zoneRetPlenCond.InletNode(NodeNum)); + MoistureMassFlowRate += (inletNode.MassFlowRate * inletNode.HumRat) / ZoneMult; + ZoneMassFlowRate += inletNode.MassFlowRate / ZoneMult; + } + // add in the leak flow + for (int ADUListIndex = 1; ADUListIndex <= zoneRetPlenCond.NumADUs; ++ADUListIndex) { + int ADUNum = zoneRetPlenCond.ADUIndex(ADUListIndex); + auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(ADUNum); + if (airDistUnit.UpStreamLeak) { + int ADUInNode = airDistUnit.InletNodeNum; + MoistureMassFlowRate += (airDistUnit.MassFlowRateUpStrLk * state.dataLoopNodes->Node(ADUInNode).HumRat) / ZoneMult; + ZoneMassFlowRate += airDistUnit.MassFlowRateUpStrLk / ZoneMult; + } + if (airDistUnit.DownStreamLeak) { + int ADUOutNode = airDistUnit.OutletNodeNum; + MoistureMassFlowRate += (airDistUnit.MassFlowRateDnStrLk * state.dataLoopNodes->Node(ADUOutNode).HumRat) / ZoneMult; + ZoneMassFlowRate += airDistUnit.MassFlowRateDnStrLk / ZoneMult; + } + } + + } else if (ZoneSupPlenumAirFlag) { + int ZoneSupPlenumNum = zone.PlenumCondNum; + auto &inletNode = state.dataLoopNodes->Node(state.dataZonePlenum->ZoneSupPlenCond(ZoneSupPlenumNum).InletNode); + MoistureMassFlowRate += (inletNode.MassFlowRate * inletNode.HumRat) / ZoneMult; + ZoneMassFlowRate += inletNode.MassFlowRate / ZoneMult; + } + + // Calculate hourly humidity ratio from infiltration + humidity added from latent load + system added moisture + Real64 LatentGain = this->ZoneLatentGain + state.dataHeatBalFanSys->SumLatentHTRadSys(zoneNum) + state.dataHeatBalFanSys->SumLatentPool(zoneNum); + + Real64 SysTimeStepInSeconds = DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys; + + // Calculate the coefficients for the 3rd order derivative for final + // zone humidity ratio. The A, B, C coefficients are analogous to the + // heat balance. There are 2 cases that should be considered, system + // operating and system shutdown. + + Real64 const RhoAir = Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->ZT, this->ZoneAirHumRat, RoutineName); + Real64 const H2OHtOfVap = Psychrometrics::PsyHgAirFnWTdb(this->ZoneAirHumRat, this->ZT); + + Real64 B = (LatentGain / H2OHtOfVap) + ((this->OAMFL + this->VAMFL + this->CTMFL) * state.dataEnvrn->OutHumRat) + this->EAMFLxHumRat + + (MoistureMassFlowRate) + this->SumHmARaW + this->MixingMassFlowXHumRat + this->MDotOA * state.dataEnvrn->OutHumRat; + Real64 A = ZoneMassFlowRate + this->OAMFL + this->VAMFL + this->EAMFL + this->CTMFL + this->SumHmARa + this->MixingMassFlowZone + this->MDotOA; + + if (state.afn->multizone_always_simulated || + (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && + state.afn->AirflowNetworkFanActivated)) { + auto &exchangeData = state.afn->exchangeData(zoneNum); + // Multizone airflow calculated in AirflowNetwork + B = (LatentGain / H2OHtOfVap) + (exchangeData.SumMHrW + exchangeData.SumMMHrW) + (MoistureMassFlowRate) + this->SumHmARaW; + A = ZoneMassFlowRate + exchangeData.SumMHr + exchangeData.SumMMHr + this->SumHmARa; + } + Real64 C = RhoAir * zone.Volume * zone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; + + if (state.afn->distribution_simulated) { + B += state.afn->exchangeData(zoneNum).TotalLat; + } + + // Use a 3rd order derivative to predict final zone humidity ratio and + // smooth the changes using the zone air capacitance. + // auto &zoneAirHumRatTemp = this->ZoneAirHumRatTemp; + // auto &zoneW1 = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).ZoneW1; + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + this->ZoneAirHumRatTemp = + (B + C * (3.0 * this->WPrevZoneTSTemp[0] - (3.0 / 2.0) * this->WPrevZoneTSTemp[1] + (1.0 / 3.0) * this->WPrevZoneTSTemp[2])) / + ((11.0 / 6.0) * C + A); + // Exact solution + } break; + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (A == 0.0) { // B=0 + this->ZoneAirHumRatTemp = this->ZoneW1 + B / C; + } else { + this->ZoneAirHumRatTemp = (this->ZoneW1 - B / A) * std::exp(min(700.0, -A / C)) + B / A; + } + } break; + case DataHeatBalance::SolutionAlgo::EulerMethod: { + this->ZoneAirHumRatTemp = (C * this->ZoneW1 + B) / (C + A); + } break; + default: + break; + } + + // Set the humidity ratio to zero if the zone has been dried out + if (this->ZoneAirHumRatTemp < 0.0) this->ZoneAirHumRatTemp = 0.0; + + // Check to make sure that is saturated there is condensation in the zone + // by resetting to saturation conditions. + Real64 const WZSat = Psychrometrics::PsyWFnTdbRhPb(state, this->ZT, 1.0, state.dataEnvrn->OutBaroPress, RoutineName); + + if (this->ZoneAirHumRatTemp > WZSat) this->ZoneAirHumRatTemp = WZSat; + + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + this->ZoneAirHumRatTemp = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum) + .Node(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).ControlAirNodeID) + .HumRat; + } + + // HybridModel with measured humidity ratio begins + // SpaceHB TODO: For now, hybrid model is only for zones + if (spaceNum == 0 && state.dataHybridModel->FlagHybridModel) { + if ((state.dataHybridModel->HybridModelZone(zoneNum).InfiltrationCalc_H || + state.dataHybridModel->HybridModelZone(zoneNum).PeopleCountCalc_H) && + (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing)) { + Real64 LatentGainExceptPeople = 0.0; + if (state.dataHybridModel->HybridModelZone(zoneNum).PeopleCountCalc_H) { + LatentGainExceptPeople = this->ZoneLatentGainExceptPeople + state.dataHeatBalFanSys->SumLatentHTRadSys(zoneNum) + + state.dataHeatBalFanSys->SumLatentPool(zoneNum); + } + + InverseModelHumidity(state, zoneNum, LatentGain, LatentGainExceptPeople, ZoneMassFlowRate, MoistureMassFlowRate, H2OHtOfVap, RhoAir); + } + } + + // Now put the calculated info into the actual zone nodes; ONLY if there is zone air flow, i.e. controlled zone or plenum zone + int ZoneNodeNum = zone.SystemZoneNodeNumber; + if (spaceNum > 0) { + ZoneNodeNum = state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber; + } + if (ZoneNodeNum > 0) { + state.dataLoopNodes->Node(ZoneNodeNum).HumRat = this->ZoneAirHumRatTemp; + state.dataLoopNodes->Node(ZoneNodeNum).Enthalpy = Psychrometrics::PsyHFnTdbW(this->ZT, this->ZoneAirHumRatTemp); + } + if (state.dataHeatBal->DoLatentSizing) { + Real64 sensibleLoad = 0.0; + Real64 pSat = Psychrometrics::PsyPsatFnTemp(state, this->ZT, RoutineName); + Real64 Tdp = Psychrometrics::PsyTdpFnWPb(state, this->ZoneAirHumRatTemp, state.dataEnvrn->StdBaroPress); + Real64 vaporPressureDiff = pSat - Psychrometrics::PsyPsatFnTemp(state, Tdp, RoutineName); + if (spaceNum > 0) { + sensibleLoad = state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).ZoneSNLoadHeatRate + + state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).ZoneSNLoadCoolRate; + state.dataZoneEnergyDemand->spaceSysMoistureDemand(spaceNum).reportZoneAirSystemMoistureLoads( + state, LatentGain, sensibleLoad, vaporPressureDiff); + } else { + sensibleLoad = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).ZoneSNLoadHeatRate + + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).ZoneSNLoadCoolRate; + state.dataZoneEnergyDemand->ZoneSysMoistureDemand(zoneNum).reportZoneAirSystemMoistureLoads( + state, LatentGain, sensibleLoad, vaporPressureDiff); + } + } +} + +void DownInterpolate4HistoryValues(Real64 const OldTimeStep, + Real64 const NewTimeStep, + Real64 const oldVal0, + Real64 const oldVal1, + Real64 const oldVal2, + Real64 &newVal0, + Real64 &newVal1, + Real64 &newVal2, + Real64 &newVal3, + Real64 &newVal4) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Brent Griffith + // DATE WRITTEN Feb 2008 + + // PURPOSE OF THIS SUBROUTINE: + // provide a reusable routine for the various places that need to + // interpolate a new set of history values on a different time scale + // Once the systemtimestep has shortened, the new history terms need to be interpolated + + // METHODOLOGY EMPLOYED: + // This routine assumes that the direction is to a shorter timestep. + // The down step ratio, DSRatio = OldTimeStep/ NewTimeStep + // is expected to be roughly integer-valued and near 2.0 or 3.0 or 4.0 or more. + + // first construct data on timestamps for interpolating with later + Real64 const oldTime0 = 0.0; + Real64 const oldTime1 = oldTime0 - OldTimeStep; + + Real64 const newTime0 = 0.0; + Real64 const newTime1 = newTime0 - NewTimeStep; + Real64 const newTime2 = newTime1 - NewTimeStep; + Real64 const newTime3 = newTime2 - NewTimeStep; + Real64 const newTime4 = newTime3 - NewTimeStep; + + Real64 const DSRatio = OldTimeStep / NewTimeStep; // should pretty much be an integer value 2, 3, 4, etc. + + newVal0 = oldVal0; + + if (std::abs(DSRatio - 2.0) < 0.01) { // DSRatio = 2 + // first two points lie between oldVal0 and oldVal1 + newVal1 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime1) / (OldTimeStep)); + newVal2 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime2) / (OldTimeStep)); + // last two points lie between oldVal1 and oldVal2 + newVal3 = oldVal1 + (oldVal2 - oldVal1) * ((oldTime1 - newTime3) / (OldTimeStep)); + newVal4 = oldVal1 + (oldVal2 - oldVal1) * ((oldTime1 - newTime4) / (OldTimeStep)); + } else if (std::abs(DSRatio - 3.0) < 0.01) { // DSRatio = 3 + // first three points lie between oldVal0 and oldVal1 + newVal1 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime1) / (OldTimeStep)); + newVal2 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime2) / (OldTimeStep)); + newVal3 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime3) / (OldTimeStep)); + // last point lie between oldVal1 and oldVal2 + newVal4 = oldVal1 + (oldVal2 - oldVal1) * ((oldTime1 - newTime4) / (OldTimeStep)); + + } else { // DSRatio = 4 or more + // all new points lie between oldVal0 and oldVal1 + newVal1 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime1) / (OldTimeStep)); + newVal2 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime2) / (OldTimeStep)); + newVal3 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime3) / (OldTimeStep)); + newVal4 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime4) / (OldTimeStep)); + } +} + +Real64 DownInterpolate4HistoryValues(Real64 OldTimeStep, Real64 NewTimeStep, std::array const &oldVals, std::array &newVals) +{ + // first construct data on timestamps for interpolating with later + Real64 const oldTime0 = 0.0; + Real64 const oldTime1 = oldTime0 - OldTimeStep; + + Real64 const newTime0 = 0.0; + Real64 const newTime1 = newTime0 - NewTimeStep; + Real64 const newTime2 = newTime1 - NewTimeStep; + Real64 const newTime3 = newTime2 - NewTimeStep; + Real64 const newTime4 = newTime3 - NewTimeStep; + + Real64 const DSRatio = OldTimeStep / NewTimeStep; // should pretty much be an integer value 2, 3, 4, etc. + + if (std::abs(DSRatio - 2.0) < 0.01) { // DSRatio = 2 + // first two points lie between oldVals[0] and oldVals[1] + Real64 delta10 = oldVals[1] - oldVals[0]; + newVals[0] = oldVals[0] + delta10 * ((oldTime0 - newTime1) / OldTimeStep); + newVals[1] = oldVals[0] + delta10 * ((oldTime0 - newTime2) / OldTimeStep); + // last two points lie between oldVals[1] and oldVals[2] + Real64 delta21 = oldVals[2] - oldVals[1]; + newVals[2] = oldVals[1] + delta21 * ((oldTime1 - newTime3) / OldTimeStep); + newVals[3] = oldVals[1] + delta21 * ((oldTime1 - newTime4) / OldTimeStep); + } else if (std::abs(DSRatio - 3.0) < 0.01) { // DSRatio = 3 + // first three points lie between oldVals[0] and oldVals[1] + Real64 delta10 = oldVals[1] - oldVals[0]; + newVals[0] = oldVals[0] + delta10 * ((oldTime0 - newTime1) / OldTimeStep); + newVals[1] = oldVals[0] + delta10 * ((oldTime0 - newTime2) / OldTimeStep); + newVals[2] = oldVals[0] + delta10 * ((oldTime0 - newTime3) / OldTimeStep); + // last point lie between oldVals[1] and oldVals[2] + Real64 delta21 = (oldVals[2] - oldVals[1]) / OldTimeStep; + newVals[3] = oldVals[1] + delta21 * ((oldTime1 - newTime4) / OldTimeStep); + + } else { // DSRatio = 4 or more + // all new points lie between oldVals[0] and oldVals[1] + Real64 delta10 = oldVals[1] - oldVals[0]; + newVals[0] = oldVals[0] + delta10 * ((oldTime0 - newTime1) / OldTimeStep); + newVals[1] = oldVals[0] + delta10 * ((oldTime0 - newTime2) / OldTimeStep); + newVals[2] = oldVals[0] + delta10 * ((oldTime0 - newTime3) / OldTimeStep); + newVals[3] = oldVals[0] + delta10 * ((oldTime0 - newTime4) / OldTimeStep); + } + return oldVals[0]; + + // if (std::abs(DSRatio - 2.0) < 0.01) { // DSRatio = 2 + // // first two points lie between oldVals[0] and oldVals[1] + // Real64 ratio10 = (oldVals[1] - oldVals[0]) / OldTimeStep; + // newVals[0] = oldVals[0] + ratio10 * (oldTime0 - newTime1); + // newVals[1] = oldVals[0] + ratio10 * (oldTime0 - newTime2); + // // last two points lie between oldVals[1] and oldVals[2] + // Real64 ratio21 = (oldVals[2] - oldVals[1]) / OldTimeStep; + // newVals[2] = oldVals[1] + ratio21 * (oldTime1 - newTime3); + // newVals[3] = oldVals[1] + ratio21 * (oldTime1 - newTime4); + // } else if (std::abs(DSRatio - 3.0) < 0.01) { // DSRatio = 3 + // // first three points lie between oldVals[0] and oldVals[1] + // Real64 ratio10 = (oldVals[1] - oldVals[0]) / OldTimeStep; + // newVals[0] = oldVals[0] + ratio10 * (oldTime0 - newTime1); + // newVals[1] = oldVals[0] + ratio10 * (oldTime0 - newTime2); + // newVals[2] = oldVals[0] + ratio10 * (oldTime0 - newTime3); + // // last point lie between oldVals[1] and oldVals[2] + // Real64 ratio21 = (oldVals[2] - oldVals[1]) / OldTimeStep; + // newVals[3] = oldVals[1] + ratio21 * (oldTime1 - newTime4); + + //} else { // DSRatio = 4 or more + // // all new points lie between oldVals[0] and oldVals[1] + // Real64 ratio10 = (oldVals[1] - oldVals[0]) / OldTimeStep; + // newVals[0] = oldVals[0] + ratio10 * (oldTime0 - newTime1); + // newVals[1] = oldVals[0] + ratio10 * (oldTime0 - newTime2); + // newVals[2] = oldVals[0] + ratio10 * (oldTime0 - newTime3); + // newVals[3] = oldVals[0] + ratio10 * (oldTime0 - newTime4); + //} +} +void InverseModelTemperature(EnergyPlusData &state, + int const ZoneNum, // Zone number + Real64 const SumIntGain, // Zone sum of convective internal gains + Real64 const SumIntGainExceptPeople, // Zone sum of convective internal gains except for people + Real64 const SumHA, // Zone sum of Hc*Area + Real64 const SumHATsurf, // Zone sum of Hc*Area*Tsurf + Real64 const SumHATref, // Zone sum of Hc*Area*Tref, for ceiling diffuser convection correlation + Real64 const SumMCp, // Zone sum of MassFlowRate*Cp + Real64 const SumMCpT, // Zone sum of MassFlowRate*Cp*T + Real64 const SumSysMCp, // Zone sum of air system MassFlowRate*Cp + Real64 const SumSysMCpT, // Zone sum of air system MassFlowRate*Cp*T + Real64 const AirCap // Formerly CoefAirrat, coef in zone temp eqn with dim of "air power capacity"rd +) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Han Li + // DATE WRITTEN February 2019 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine inversely solve infiltration airflow rate or people count with zone air temperatures measurements. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Real64 AirCapHM(0.0); // Air power capacity for hybrid modeling + Real64 AA(0.0); + Real64 BB(0.0); + Real64 FractionConvection(0.0); // Default convection portion of the sensible heat from people + + auto &zone = state.dataHeatBal->Zone(ZoneNum); + auto &hybridModelZone = state.dataHybridModel->HybridModelZone(ZoneNum); + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); + + int ZoneMult = zone.Multiplier * zone.ListMultiplier; + zone.ZoneMeasuredTemperature = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneMeasuredTemperatureSchedulePtr); + + // HM calculation only HM calculation period start + if (state.dataEnvrn->DayOfYear >= hybridModelZone.HybridStartDayOfYear && state.dataEnvrn->DayOfYear <= hybridModelZone.HybridEndDayOfYear) { + Real64 HMMultiplierAverage(1.0); + Real64 MultpHM(1.0); + + thisZoneHB.ZT = zone.ZoneMeasuredTemperature; // Array1D ZT -- Zone + // Air Temperature Averaged over + // the System Time Increment + if (hybridModelZone.InfiltrationCalc_T && state.dataHVACGlobal->UseZoneTimeStepHistory) { + static constexpr std::string_view RoutineNameInfiltration("CalcAirFlowSimple:Infiltration"); + + if (hybridModelZone.IncludeSystemSupplyParameters) { + zone.ZoneMeasuredSupplyAirTemperature = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirTemperatureSchedulePtr); + zone.ZoneMeasuredSupplyAirFlowRate = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); + zone.ZoneMeasuredSupplyAirHumidityRatio = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); + // Calculate the air humidity ratio at supply air inlet. + Real64 CpAirInlet(0.0); + CpAirInlet = Psychrometrics::PsyCpAirFnW(zone.ZoneMeasuredSupplyAirHumidityRatio); + + Real64 SumSysMCp_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet; + Real64 SumSysMCpT_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet * zone.ZoneMeasuredSupplyAirTemperature; + + AA = SumSysMCp_HM + SumHA + thisZoneHB.MCPV + thisZoneHB.MCPM + thisZoneHB.MCPE + thisZoneHB.MCPC + thisZoneHB.MDotCPOA; + BB = SumSysMCpT_HM + SumIntGain + SumHATsurf - SumHATref + thisZoneHB.MCPTV + thisZoneHB.MCPTM + thisZoneHB.MCPTE + thisZoneHB.MCPTC + + thisZoneHB.MDotCPOA * zone.OutDryBulbTemp + (thisZoneHB.NonAirSystemResponse / ZoneMult + thisZoneHB.SysDepZoneLoadsLagged); + } else { + AA = SumHA + thisZoneHB.MCPV + thisZoneHB.MCPM + thisZoneHB.MCPE + thisZoneHB.MCPC + thisZoneHB.MDotCPOA; + BB = SumIntGain + SumHATsurf - SumHATref + thisZoneHB.MCPTV + thisZoneHB.MCPTM + thisZoneHB.MCPTE + thisZoneHB.MCPTC + + thisZoneHB.MDotCPOA * zone.OutDryBulbTemp; + } + Real64 CC = AirCap; + Real64 DD = + (3.0 * state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) - (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum) + + (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredZT3(ZoneNum)); + + Real64 delta_T = (zone.ZoneMeasuredTemperature - zone.OutDryBulbTemp); + Real64 CpAir = Psychrometrics::PsyCpAirFnW(state.dataEnvrn->OutHumRat); + Real64 AirDensity = Psychrometrics::PsyRhoAirFnPbTdbW( + state, state.dataEnvrn->OutBaroPress, zone.OutDryBulbTemp, state.dataEnvrn->OutHumRat, RoutineNameInfiltration); + zone.delta_T = delta_T; + + // s4 - Set ACH to 0 when delta_T <= 0.5, add max and min limits to ach + Real64 M_inf = 0.0; + if (std::abs(delta_T) > 0.5) { + M_inf = (BB + CC * DD - ((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredTemperature) / (CpAir * delta_T); + } + Real64 ACH_inf = max(0.0, min(10.0, (M_inf / AirDensity) / zone.Volume * DataGlobalConstants::SecInHour)); + M_inf = (ACH_inf / DataGlobalConstants::SecInHour) * zone.Volume * AirDensity; + + // Overwrite variable with inverse solution + zone.MCPIHM = M_inf; + zone.InfilOAAirChangeRateHM = ACH_inf; + + } // Hybrid model infiltration calculation end + + // Hybrid modeling internal thermal mass calculation start + if (hybridModelZone.InternalThermalMassCalc_T && SumSysMCpT == 0 && thisZoneHB.ZT != state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) && + state.dataHVACGlobal->UseZoneTimeStepHistory) { // HM calculation only when SumSysMCpT =0, + // TimeStepZone (not @ TimeStepSys) + Real64 TempDepCoef = SumHA + SumMCp + SumSysMCp; + Real64 TempIndCoef = SumIntGain + SumHATsurf - SumHATref + SumMCpT + SumSysMCpT + + (thisZoneHB.NonAirSystemResponse / ZoneMult + thisZoneHB.SysDepZoneLoadsLagged); + // TempHistoryTerm = AirCap * (3.0 * ZTM1(ZoneNum) - (3.0/2.0) * ZTM2(ZoneNum) + (1.0/3.0) * ZTM3(ZoneNum)) !debug only + + if (state.afn->distribution_simulated) { + TempIndCoef += state.afn->exchangeData(ZoneNum).TotalSen; + } + // Calculate air capacity using DataHeatBalance::SolutionAlgo::AnalyticalSolution + if (TempDepCoef == 0.0) { + // Is this correct? Shouldn't we use log?? What if thisZT == + // PreviousMeasuredZT1(ZoneNum)?? + AirCapHM = TempIndCoef / (thisZoneHB.ZT - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)); // Inverse equation + } else { + Real64 AirCapHM_temp = 0.0; + if (TempIndCoef == TempDepCoef * thisZoneHB.ZT) { + AirCapHM_temp = 0.0; // This is the denominator. + } else { + AirCapHM_temp = (TempIndCoef - TempDepCoef * state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)) / + (TempIndCoef - TempDepCoef * thisZoneHB.ZT); + } + + if ((AirCapHM_temp > 0) && (AirCapHM_temp != 1)) { // Avoide IND + AirCapHM = TempDepCoef / std::log(AirCapHM_temp); // Inverse equation + } else { + AirCapHM = TempIndCoef / (thisZoneHB.ZT - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)); + } + } + + // Calculate multiplier + if (std::abs(thisZoneHB.ZT - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)) > 0.05) { // Filter + MultpHM = AirCapHM / + (zone.Volume * + Psychrometrics::PsyRhoAirFnPbTdbW(state, + state.dataEnvrn->OutBaroPress, + thisZoneHB.ZT, + thisZoneHB.ZoneAirHumRat) * + Psychrometrics::PsyCpAirFnW(thisZoneHB.ZoneAirHumRat)) * + (state.dataGlobal->TimeStepZone * DataGlobalConstants::SecInHour); // Inverse equation + if ((MultpHM < 1.0) || (MultpHM > 30.0)) { // Temperature capacity multiplier greater than + // 1 and less than 30 + MultpHM = 1.0; // Default value 1.0 + } + } else { + MultpHM = 1.0; // Default value 1.0 + } + + zone.ZoneVolCapMultpSensHM = MultpHM; // For timestep output + + // Calculate the average multiplier of the zone for the whole running period + { + // count for hybrid model calculations + if (MultpHM > 1.0) { + zone.ZoneVolCapMultpSensHMSum += MultpHM; + zone.ZoneVolCapMultpSensHMCountSum++; + } + + // Calculate and store the multiplier average at the end of HM + // simulations + if (state.dataEnvrn->DayOfYear == hybridModelZone.HybridEndDayOfYear && state.dataGlobal->EndDayFlag) { + HMMultiplierAverage = zone.ZoneVolCapMultpSensHMSum / zone.ZoneVolCapMultpSensHMCountSum; + zone.ZoneVolCapMultpSensHMAverage = HMMultiplierAverage; + } + } + } // Hybrid model internal thermal mass calcualtion end + + // Hybrid model people count calculation + if (hybridModelZone.PeopleCountCalc_T && state.dataHVACGlobal->UseZoneTimeStepHistory) { + zone.ZoneMeasuredTemperature = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneMeasuredTemperatureSchedulePtr); + zone.ZonePeopleActivityLevel = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleActivityLevelSchedulePtr); + zone.ZonePeopleSensibleHeatFraction = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleSensibleFractionSchedulePtr); + zone.ZonePeopleRadiantHeatFraction = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleRadiationFractionSchedulePtr); + + Real64 FractionSensible = zone.ZonePeopleSensibleHeatFraction; + Real64 FractionRadiation = zone.ZonePeopleRadiantHeatFraction; + Real64 ActivityLevel = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleActivityLevelSchedulePtr); + + if (FractionSensible <= 0.0) { + FractionSensible = 0.6; + } + + if (FractionRadiation <= 0.0) { + FractionConvection = 0.7; + } else { + FractionConvection = 1.0 - FractionRadiation; + } + + if (ActivityLevel <= 0.0) { + ActivityLevel = 130.0; + } + + if (hybridModelZone.IncludeSystemSupplyParameters) { + zone.ZoneMeasuredSupplyAirTemperature = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirTemperatureSchedulePtr); + zone.ZoneMeasuredSupplyAirFlowRate = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); + zone.ZoneMeasuredSupplyAirHumidityRatio = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); + + // Calculate the air humidity ratio at supply air inlet. + Real64 CpAirInlet = Psychrometrics::PsyCpAirFnW(zone.ZoneMeasuredSupplyAirHumidityRatio); + + Real64 SumSysMCp_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet; + Real64 SumSysMCpT_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet * zone.ZoneMeasuredSupplyAirTemperature; + + AA = SumSysMCp_HM + SumHA + SumMCp; + BB = SumSysMCpT_HM + SumIntGainExceptPeople + SumHATsurf - SumHATref + SumMCpT + + (thisZoneHB.NonAirSystemResponse / ZoneMult + thisZoneHB.SysDepZoneLoadsLagged); + } else { + AA = SumHA + SumMCp; + BB = SumIntGainExceptPeople + SumHATsurf - SumHATref + SumMCpT; + } + + Real64 CC = AirCap; + Real64 DD = + (3.0 * state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) - (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum) + + (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredZT3(ZoneNum)); + + Real64 SumIntGainPeople = ((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredTemperature - BB - CC * DD; + Real64 UpperBound = max(0.0, SumIntGain / (ActivityLevel * FractionSensible * FractionConvection)); + Real64 NumPeople = min(UpperBound, max(0.0, SumIntGainPeople / (ActivityLevel * FractionSensible * FractionConvection))); + + if (NumPeople < 0.05) { + NumPeople = 0; + } + zone.NumOccHM = NumPeople; + } + } + + // Update zone temperatures in the previous steps + state.dataHeatBalFanSys->PreviousMeasuredZT3(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum); + state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum); + state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) = thisZoneHB.ZT; +} + +void InverseModelHumidity(EnergyPlusData &state, + int const ZoneNum, // Zone number + Real64 const LatentGain, // Zone sum of latent gain + Real64 const LatentGainExceptPeople, // Zone sum of latent gain except for people + Real64 const ZoneMassFlowRate, // Zone air mass flow rate + Real64 const MoistureMassFlowRate, // Zone moisture mass flow rate + Real64 const H2OHtOfVap, // Heat of vaporization of air + Real64 const RhoAir // Air density +) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Han Li + // DATE WRITTEN February 2019 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine inversely solve infiltration airflow rate or people count with zone air humidity measurements. + + // SUBROUTINE PARAMETER DEFINITIONS: + static constexpr std::string_view RoutineName("InverseModelHumidity"); + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Real64 AA(0.0); + Real64 BB(0.0); + Real64 ActivityLevel(0.0); + Real64 SysTimeStepInSeconds = DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys; + + auto &zone = state.dataHeatBal->Zone(ZoneNum); + auto &hybridModelZone = state.dataHybridModel->HybridModelZone(ZoneNum); + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); + + // Get measured zone humidity ratio + zone.ZoneMeasuredHumidityRatio = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneMeasuredHumidityRatioSchedulePtr); + + if (state.dataEnvrn->DayOfYear >= hybridModelZone.HybridStartDayOfYear && state.dataEnvrn->DayOfYear <= hybridModelZone.HybridEndDayOfYear) { + thisZoneHB.ZoneAirHumRat = zone.ZoneMeasuredHumidityRatio; + + // Hybrid Model calculate air infiltration rate + if (hybridModelZone.InfiltrationCalc_H && state.dataHVACGlobal->UseZoneTimeStepHistory) { + // Conditionally calculate the time dependent and time independent terms + if (hybridModelZone.IncludeSystemSupplyParameters) { + zone.ZoneMeasuredSupplyAirFlowRate = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); + zone.ZoneMeasuredSupplyAirHumidityRatio = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); + + Real64 SumSysM_HM = zone.ZoneMeasuredSupplyAirFlowRate; + Real64 SumSysMHumRat_HM = zone.ZoneMeasuredSupplyAirFlowRate * zone.ZoneMeasuredSupplyAirHumidityRatio; + + AA = SumSysM_HM + thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + thisZoneHB.MixingMassFlowZone + + thisZoneHB.MDotOA; + BB = SumSysMHumRat_HM + (LatentGain / H2OHtOfVap) + ((thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + + thisZoneHB.EAMFLxHumRat + thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + + thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; + } else { + AA = thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + thisZoneHB.MixingMassFlowZone + thisZoneHB.MDotOA; + BB = (LatentGain / H2OHtOfVap) + ((thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + thisZoneHB.EAMFLxHumRat + + thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; + } + + Real64 CC = RhoAir * zone.Volume * zone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; + Real64 DD = (3.0 * state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum) - + (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum) + + (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat3(ZoneNum)); + + Real64 delta_HR = (zone.ZoneMeasuredHumidityRatio - state.dataEnvrn->OutHumRat); + + Real64 AirDensity = + Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, zone.OutDryBulbTemp, state.dataEnvrn->OutHumRat, RoutineName); + + Real64 M_inf = 0.0; + if (std::abs(zone.ZoneMeasuredHumidityRatio - state.dataEnvrn->OutHumRat) > 0.0000001) { + M_inf = (CC * DD + BB - ((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredHumidityRatio) / delta_HR; + } + + // Add threshold for air change rate + Real64 ACH_inf = max(0.0, min(10.0, (M_inf / AirDensity) / zone.Volume * DataGlobalConstants::SecInHour)); + M_inf = (ACH_inf / DataGlobalConstants::SecInHour) * zone.Volume * AirDensity; + zone.MCPIHM = M_inf; + zone.InfilOAAirChangeRateHM = ACH_inf; + } + + // Hybrid Model calculate people count + if (hybridModelZone.PeopleCountCalc_H && state.dataHVACGlobal->UseZoneTimeStepHistory) { + zone.ZonePeopleActivityLevel = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleActivityLevelSchedulePtr); + zone.ZonePeopleSensibleHeatFraction = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleSensibleFractionSchedulePtr); + zone.ZonePeopleRadiantHeatFraction = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleRadiationFractionSchedulePtr); + + Real64 FractionSensible = zone.ZonePeopleSensibleHeatFraction; + + if (FractionSensible <= 0.0) { + FractionSensible = 0.6; + } + + if (ActivityLevel <= 0.0) { + ActivityLevel = 130.0; + } + + // Conditionally calculate the humidity-dependent and humidity-independent + // terms. + if (hybridModelZone.IncludeSystemSupplyParameters) { + zone.ZoneMeasuredSupplyAirFlowRate = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); + zone.ZoneMeasuredSupplyAirHumidityRatio = + ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); + + Real64 SumSysM_HM = zone.ZoneMeasuredSupplyAirFlowRate; + Real64 SumSysMHumRat_HM = zone.ZoneMeasuredSupplyAirFlowRate * zone.ZoneMeasuredSupplyAirHumidityRatio; + + AA = SumSysM_HM + thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + + thisZoneHB.MixingMassFlowZone + thisZoneHB.MDotOA; + BB = SumSysMHumRat_HM + (LatentGainExceptPeople / H2OHtOfVap) + + ((thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + thisZoneHB.EAMFLxHumRat + + thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; + } else { + AA = ZoneMassFlowRate + thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + + thisZoneHB.MixingMassFlowZone + thisZoneHB.MDotOA; + BB = (LatentGainExceptPeople / H2OHtOfVap) + ((thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + + thisZoneHB.EAMFLxHumRat + (MoistureMassFlowRate) + thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + + thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; + } + + Real64 CC = RhoAir * zone.Volume * zone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; + Real64 DD = (3.0 * state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum) - + (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum) + + (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat3(ZoneNum)); + + Real64 LatentGainPeople = (((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredHumidityRatio - BB - CC * DD) * H2OHtOfVap; + Real64 UpperBound = max(0.0, LatentGain / (ActivityLevel * (1.0 - FractionSensible))); + Real64 NumPeople = min(UpperBound, max(0.0, LatentGainPeople / (ActivityLevel * (1.0 - FractionSensible)))); + NumPeople = floor(NumPeople * 100.00 + 0.5) / 100.00; + if (NumPeople < 0.05) { + NumPeople = 0; + } + zone.NumOccHM = NumPeople; + } + } + + // Update zone humidity ratio in the previous steps + state.dataHeatBalFanSys->PreviousMeasuredHumRat3(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum); + state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum); + state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum) = zone.ZoneMeasuredHumidityRatio; +} + +void ZoneSpaceHeatBalanceData::calcZoneOrSpaceSums(EnergyPlusData &state, + bool const CorrectorFlag, // Corrector call flag + int const zoneNum, + int const spaceNum) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Peter Graham Ellis + // DATE WRITTEN July 2003 + // MODIFIED Aug 2003, FCW: add this->SumHA contributions from window frame and divider + // Aug 2003, CC: change how the reference temperatures are used + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine calculates the various sums that go into the zone heat balance + // equation. This replaces the SUMC, SumHA, and SumHAT calculations that were + // previously done in various places throughout the program. + // The SumHAT portion of the code is reproduced in RadiantSystemHighTemp and + // RadiantSystemLowTemp and should be updated accordingly. + // A reference temperature (Tref) is specified for use with the ceiling diffuser + // convection correlation. A bogus value of Tref = -999.9 defaults to using + // the zone air (i.e. outlet) temperature for the reference temperature. + // If Tref is applied to all surfaces, SumHA = 0, and SumHATref /= 0. + // If Tref is not used at all, SumHATref = 0, and SumHA /= 0. + // For future implementations, Tref can be easily converted into an array to + // allow a different reference temperature to be specified for each surface. + assert(zoneNum > 0); + + this->SumHA = 0.0; + this->SumHATsurf = 0.0; + this->SumHATref = 0.0; + this->SumSysMCp = 0.0; + this->SumSysMCpT = 0.0; + // Sum all convective internal gains: this->SumIntGain + if (spaceNum == 0) { + this->SumIntGain = InternalHeatGains::zoneSumAllInternalConvectionGains(state, zoneNum); + } else { + this->SumIntGain = InternalHeatGains::spaceSumAllInternalConvectionGains(state, spaceNum); + } + this->SumIntGain += state.dataHeatBalFanSys->SumConvHTRadSys(zoneNum) + state.dataHeatBalFanSys->SumConvPool(zoneNum); + + // Add heat to return air if zonal system (no return air) or cycling system (return air frequently very low or zero) + assert(zoneNum > 0); + auto &thisZone = state.dataHeatBal->Zone(zoneNum); + if (thisZone.NoHeatToReturnAir) { + if (spaceNum == 0) { + this->SumIntGain += InternalHeatGains::zoneSumAllReturnAirConvectionGains(state, zoneNum, 0); + } else { + this->SumIntGain += InternalHeatGains::spaceSumAllReturnAirConvectionGains(state, spaceNum, 0); + } + } + + // Sum all non-system air flow, i.e. infiltration, simple ventilation, mixing, earth tube: this->SumMCp, this->SumMCpT + this->SumMCp = this->MCPI + this->MCPV + this->MCPM + this->MCPE + this->MCPC + this->MDotCPOA; + this->SumMCpT = this->MCPTI + this->MCPTV + this->MCPTM + this->MCPTE + this->MCPTC + this->MDotCPOA * thisZone.OutDryBulbTemp; + + // Sum all multizone air flow calculated from AirflowNetwork by assuming no simple air infiltration model + if (state.afn->multizone_always_simulated || + (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && + state.afn->AirflowNetworkFanActivated)) { + auto &exchangeData = state.afn->exchangeData(zoneNum); + this->SumMCp = exchangeData.SumMCp + exchangeData.SumMVCp + exchangeData.SumMMCp; + this->SumMCpT = exchangeData.SumMCpT + exchangeData.SumMVCpT + exchangeData.SumMMCpT; + } + + // Sum all system air flow: this->SumSysMCp, this->SumSysMCpT and check to see if this is a controlled zone + if (CorrectorFlag) { + // Plenum and controlled zones have a different set of inlet nodes which must be calculated. + if (thisZone.IsControlled) { + auto const &zec(state.dataZoneEquip->ZoneEquipConfig(zoneNum)); + for (int NodeNum = 1, NodeNum_end = zec.NumInletNodes; NodeNum <= NodeNum_end; ++NodeNum) { + // Get node conditions, this next block is of interest to irratic system loads... maybe nodes are not accurate at time of call? + // how can we tell? predict step must be lagged ? correct step, systems have run. + auto const &node(state.dataLoopNodes->Node(zec.InletNode(NodeNum))); + Real64 CpAir = Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat); + Real64 const MassFlowRate_CpAir(node.MassFlowRate * CpAir); + this->SumSysMCp += MassFlowRate_CpAir; + this->SumSysMCpT += MassFlowRate_CpAir * node.Temp; + } + + } else if (thisZone.IsReturnPlenum) { + auto const &zrpc(state.dataZonePlenum->ZoneRetPlenCond(thisZone.PlenumCondNum)); + Real64 const air_hum_rat(this->ZoneAirHumRat); + for (int NodeNum = 1, NodeNum_end = zrpc.NumInletNodes; NodeNum <= NodeNum_end; ++NodeNum) { + auto const &node(state.dataLoopNodes->Node(zrpc.InletNode(NodeNum))); + Real64 const MassFlowRate_CpAir(node.MassFlowRate * Psychrometrics::PsyCpAirFnW(air_hum_rat)); + this->SumSysMCp += MassFlowRate_CpAir; + this->SumSysMCpT += MassFlowRate_CpAir * node.Temp; + } + // add in the leaks + for (int ADUListIndex = 1, ADUListIndex_end = zrpc.NumADUs; ADUListIndex <= ADUListIndex_end; ++ADUListIndex) { + auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(zrpc.ADUIndex(ADUListIndex)); + if (airDistUnit.UpStreamLeak) { + Real64 const MassFlowRate_CpAir(airDistUnit.MassFlowRateUpStrLk * Psychrometrics::PsyCpAirFnW(air_hum_rat)); + this->SumSysMCp += MassFlowRate_CpAir; + this->SumSysMCpT += MassFlowRate_CpAir * state.dataLoopNodes->Node(airDistUnit.InletNodeNum).Temp; + } + if (airDistUnit.DownStreamLeak) { + Real64 const MassFlowRate_CpAir(airDistUnit.MassFlowRateDnStrLk * Psychrometrics::PsyCpAirFnW(air_hum_rat)); + this->SumSysMCp += MassFlowRate_CpAir; + this->SumSysMCpT += MassFlowRate_CpAir * state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).Temp; + } + } + + } else if (thisZone.IsSupplyPlenum) { + Real64 MassFlowRate = state.dataLoopNodes->Node(state.dataZonePlenum->ZoneSupPlenCond(thisZone.PlenumCondNum).InletNode).MassFlowRate; + Real64 CpAir = Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat); + this->SumSysMCp += MassFlowRate * CpAir; + this->SumSysMCpT += + MassFlowRate * CpAir * state.dataLoopNodes->Node(state.dataZonePlenum->ZoneSupPlenCond(thisZone.PlenumCondNum).InletNode).Temp; + } + + int ZoneMult = thisZone.Multiplier * thisZone.ListMultiplier; + + this->SumSysMCp /= ZoneMult; + this->SumSysMCpT /= ZoneMult; + } + + if (spaceNum > 0) { + Real64 spaceFrac = state.dataHeatBal->space(spaceNum).fracZoneVolume; + this->SumSysMCp *= spaceFrac; + this->SumSysMCpT *= spaceFrac; + } + + // Sum all surface convection: this->SumHA, this->SumHATsurf, this->SumHATref (and additional contributions to this->SumIntGain) + SumHATOutput sumHATResults; // space or zone return values + sumHATResults = this->calcSumHAT(state, zoneNum, spaceNum); + this->SumIntGain += sumHATResults.sumIntGain; + this->SumHA = sumHATResults.sumHA; + this->SumHATsurf = sumHATResults.sumHATsurf; + this->SumHATref = sumHATResults.sumHATref; +} + +SumHATOutput ZoneHeatBalanceData::calcSumHAT(EnergyPlusData &state, int const zoneNum, [[maybe_unused]] int const spaceNum) +{ + assert(zoneNum > 0); + assert(spaceNum == 0); + SumHATOutput zoneResults; // zone-level return values + for (int zoneSpaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { + SumHATOutput spaceResults; // temporary return value from space-level calcSumHAT + spaceResults = state.dataZoneTempPredictorCorrector->spaceHeatBalance(zoneSpaceNum).calcSumHAT(state, zoneNum, zoneSpaceNum); + zoneResults.sumIntGain += spaceResults.sumIntGain; + zoneResults.sumHA += spaceResults.sumHA; + zoneResults.sumHATsurf += spaceResults.sumHATsurf; + zoneResults.sumHATref += spaceResults.sumHATref; + } + return zoneResults; +} + +SumHATOutput SpaceHeatBalanceData::calcSumHAT(EnergyPlusData &state, int const zoneNum, int const spaceNum) +{ + assert(zoneNum > 0); + assert(spaceNum > 0); + auto &thisZone = state.dataHeatBal->Zone(zoneNum); + auto &thisSpace = state.dataHeatBal->space(spaceNum); + SumHATOutput results; // space-level return values + + for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { + Real64 HA = 0.0; + Real64 Area = state.dataSurface->Surface(SurfNum).Area; // For windows, this is the glazing area + + if (state.dataSurface->Surface(SurfNum).Class == DataSurfaces::SurfaceClass::Window) { + DataSurfaces::WinShadingType const shading_flag = state.dataSurface->SurfWinShadingFlag(SurfNum); + + // Add to the convective internal gains + if (ANY_INTERIOR_SHADE_BLIND(shading_flag)) { + // The shade area covers the area of the glazing plus the area of the dividers. + Area += state.dataSurface->SurfWinDividerArea(SurfNum); + // If interior shade or blind is present it is assumed that both the convective and IR radiative gain + // from the inside surface of the divider goes directly into the zone air -- i.e., the IR radiative + // interaction between divider and shade or blind is ignored due to the difficulty of calculating this interaction + // at the same time that the interaction between glass and shade is calculated. + results.sumIntGain += state.dataSurface->SurfWinDividerHeatGain(SurfNum); + } + + // Other convection term is applicable to equivalent layer window (ASHWAT) model + if (state.dataConstruction->Construct(state.dataSurface->Surface(SurfNum).Construction).WindowTypeEQL) + results.sumIntGain += state.dataSurface->SurfWinOtherConvHeatGain(SurfNum); + + // Convective heat gain from natural convection in gap between glass and interior shade or blind + if (ANY_INTERIOR_SHADE_BLIND(shading_flag)) results.sumIntGain += state.dataSurface->SurfWinConvHeatFlowNatural(SurfNum); + + // Convective heat gain from airflow window + if (state.dataSurface->SurfWinAirflowThisTS(SurfNum) > 0.0) { + results.sumIntGain += state.dataSurface->SurfWinConvHeatGainToZoneAir(SurfNum); + if (thisZone.NoHeatToReturnAir) { + results.sumIntGain += state.dataSurface->SurfWinRetHeatGainToZoneAir(SurfNum); + state.dataSurface->SurfWinHeatGain(SurfNum) += state.dataSurface->SurfWinRetHeatGainToZoneAir(SurfNum); + if (state.dataSurface->SurfWinHeatGain(SurfNum) >= 0.0) { + state.dataSurface->SurfWinHeatGainRep(SurfNum) = state.dataSurface->SurfWinHeatGain(SurfNum); + state.dataSurface->SurfWinHeatGainRepEnergy(SurfNum) = + state.dataSurface->SurfWinHeatGainRep(SurfNum) * state.dataGlobal->TimeStepZoneSec; + } else { + state.dataSurface->SurfWinHeatLossRep(SurfNum) = -state.dataSurface->SurfWinHeatGain(SurfNum); + state.dataSurface->SurfWinHeatLossRepEnergy(SurfNum) = + state.dataSurface->SurfWinHeatLossRep(SurfNum) * state.dataGlobal->TimeStepZoneSec; + } + state.dataSurface->SurfWinHeatTransferRepEnergy(SurfNum) = + state.dataSurface->SurfWinHeatGain(SurfNum) * state.dataGlobal->TimeStepZoneSec; + } + } + + // Add to the surface convection sums + if (state.dataSurface->SurfWinFrameArea(SurfNum) > 0.0) { + // Window frame contribution + Real64 const HA_surf(state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinFrameArea(SurfNum) * + (1.0 + state.dataSurface->SurfWinProjCorrFrIn(SurfNum))); + results.sumHATsurf += HA_surf * state.dataSurface->SurfWinFrameTempIn(SurfNum); + HA += HA_surf; + } + + if (state.dataSurface->SurfWinDividerArea(SurfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(shading_flag)) { + // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) + Real64 const HA_surf(state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinDividerArea(SurfNum) * + (1.0 + 2.0 * state.dataSurface->SurfWinProjCorrDivIn(SurfNum))); + results.sumHATsurf += HA_surf * state.dataSurface->SurfWinDividerTempIn(SurfNum); + HA += HA_surf; + } + + } // End of check if window + + HA += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * Area; + results.sumHATsurf += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * Area * state.dataHeatBalSurf->SurfTempInTmp(SurfNum); + + // determine reference air temperature for this surface + switch (state.dataSurface->SurfTAirRef(SurfNum)) { + case DataSurfaces::RefAirTemp::ZoneMeanAirTemp: + // The zone air is the reference temperature (which is to be solved for in CorrectZoneAirTemp). + results.sumHA += HA; + break; + case DataSurfaces::RefAirTemp::AdjacentAirTemp: + results.sumHATref += HA * state.dataHeatBal->SurfTempEffBulkAir(SurfNum); + break; + case DataSurfaces::RefAirTemp::ZoneSupplyAirTemp: + // check whether this zone is a controlled zone or not + if (!thisZone.IsControlled) { + ShowFatalError(state, "Zones must be controlled for Ceiling-Diffuser Convection model. No system serves zone " + thisZone.Name); + return results; + } + // determine supply air temperature as a weighted average of the inlet temperatures. + // TODO: For now, use zone-level values for system flow + if (state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).SumSysMCp > 0.0) { + results.sumHATref += HA * state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).SumSysMCpT / + state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).SumSysMCp; + } else { + // no system flow (yet) so just use zone air temperature #5906 + results.sumHA += HA; + } + break; + default: + // currently set to mean air temp but should add error warning here + results.sumHA += HA; + break; + } + + } // SurfNum + return results; +} +void CalcZoneComponentLoadSums(EnergyPlusData &state, + int const ZoneNum, // Zone number + Real64 const TempDepCoef, // Dependent coefficient + Real64 const TempIndCoef, // Independent coefficient + Real64 &SumIntGains, // Zone sum of convective internal gains + Real64 &SumHADTsurfs, // Zone sum of Hc*Area*(Tsurf - Tz) + Real64 &SumMCpDTzones, // zone sum of MassFlowRate*cp*(TremotZone - Tz) transfer air from other zone, Mixing + Real64 &SumMCpDtInfil, // Zone sum of MassFlowRate*Cp*(Tout - Tz) transfer from outside, ventil, earth tube + Real64 &SumMCpDTsystem, // Zone sum of air system MassFlowRate*Cp*(Tsup - Tz) + Real64 &SumNonAirSystem, // Zone sum of non air system convective heat gains + Real64 &CzdTdt, // Zone air energy storage term. + Real64 &imBalance, // put all terms in eq. 5 on RHS , should be zero + Real64 &SumEnthalpyM, // Zone sum of phase change material melting enthlpy + Real64 &SumEnthalpyH // Zone sum of phase change material freezing enthalpy +) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Brent Griffith + // DATE WRITTEN Feb 2008 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine calculates the various sums that go into the zone heat balance + // equation for reporting (and diagnostic) purposes only. + // It was derived from CalcZoneSums but differs in that that routine + // breaks up the component's dependence on zone air temp in order to *solve* for zone air temp, + // but here we *use* the result for zone air temp and calculate the terms of the heat balance + // Go back and calculate each of the 6 terms in Equation 5 and fill report variables. + // notes on these raw terms for zone air heat balance model : + // these are state variables at the end of the last system timestep. + // they are not necessarily proper averages for what happened over entire zone time step + // these are not multiplied by zone multipliers. + // The values are all Watts. + + // REFERENCES: + // Equation 5 in Engineering Reference. + + SumIntGains = 0.0; // Zone sum of convective internal gains + SumHADTsurfs = 0.0; // Zone sum of Hc*Area*(Tsurf - Tz) + SumMCpDTzones = 0.0; // zone sum of MassFlowRate*cp*(TremotZone - Tz) transfer air from other zone, Mixing + SumMCpDtInfil = 0.0; // Zone sum of MassFlowRate*Cp*(Tout - Tz) + SumMCpDTsystem = 0.0; // Zone sum of air system MassFlowRate*Cp*(Tsup - Tz) + SumNonAirSystem = 0.0; + CzdTdt = 0.0; + imBalance = 0.0; + SumEnthalpyM = 0.0; + SumEnthalpyH = 0.0; + + auto &thisZone = state.dataHeatBal->Zone(ZoneNum); + auto const &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); + + // Sum all convective internal gains: SumIntGain + SumIntGains = InternalHeatGains::zoneSumAllInternalConvectionGains(state, ZoneNum); + + // Add heat to return air if zonal system (no return air) or cycling system (return air frequently very + // low or zero) + if (thisZone.NoHeatToReturnAir) { + SumIntGains += InternalHeatGains::zoneSumAllReturnAirConvectionGains(state, ZoneNum, 0); + } + + // sum non-system air flow transfers between zones + SumMCpDTzones = thisZoneHB.MCPTM - thisZoneHB.MCPM * thisZoneHB.MAT; // but maybe it should be ZTAV(ZoneNum) + + // Sum non-system air flow, i.e. infiltration, simple ventilation, earth tube + // reuse SumMCp, SumMCpT from CalcZoneSum but use MAT (or maybe ZTAV?) to complete + SumMCpDtInfil = (thisZoneHB.MCPTI - thisZoneHB.MCPI * thisZoneHB.MAT) + (thisZoneHB.MCPTV - thisZoneHB.MCPV * thisZoneHB.MAT) + + (thisZoneHB.MCPTE - thisZoneHB.MCPE * thisZoneHB.MAT) + (thisZoneHB.MCPTC - thisZoneHB.MCPC * thisZoneHB.MAT) + + (thisZoneHB.MDotCPOA * thisZone.OutDryBulbTemp - + thisZoneHB.MDotCPOA * thisZoneHB.MAT); // infiltration | Ventilation (simple) | Earth tube. | Cooltower | combined OA flow + + // Sum all multizone air flow calculated from AirflowNetwork by assuming no simple air infiltration model (if used) + if (state.afn->multizone_always_simulated || + (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && + state.afn->AirflowNetworkFanActivated)) { + // Multizone airflow calculated in AirflowNetwork + SumMCpDtInfil = state.afn->exchangeData(ZoneNum).SumMCpT + state.afn->exchangeData(ZoneNum).SumMVCpT - + (state.afn->exchangeData(ZoneNum).SumMCp + state.afn->exchangeData(ZoneNum).SumMVCp) * thisZoneHB.MAT; + SumMCpDTzones = state.afn->exchangeData(ZoneNum).SumMMCpT - state.afn->exchangeData(ZoneNum).SumMMCp * thisZoneHB.MAT; + } + + // Sum all system air flow: reusing how SumSysMCp, SumSysMCpT are calculated in CalcZoneSums + // Plenum and controlled zones have a different set of inlet nodes which must be calculated. + Real64 QSensRate = 0.0; + if (thisZone.IsControlled) { + auto &zoneEquipConfig = state.dataZoneEquip->ZoneEquipConfig(ZoneNum); + for (int NodeNum = 1; NodeNum <= zoneEquipConfig.NumInletNodes; ++NodeNum) { + // Get node conditions + Real64 const NodeTemp = state.dataLoopNodes->Node(zoneEquipConfig.InletNode(NodeNum)).Temp; + Real64 const MassFlowRate = state.dataLoopNodes->Node(zoneEquipConfig.InletNode(NodeNum)).MassFlowRate; + QSensRate = calcZoneSensibleOutput(MassFlowRate, NodeTemp, thisZoneHB.MAT, thisZoneHB.ZoneAirHumRat); + SumMCpDTsystem += QSensRate; + + if (zoneEquipConfig.InletNodeADUNum(NodeNum) > 0) { + auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(zoneEquipConfig.InletNodeADUNum(NodeNum)); + Real64 ADUHeatAddRate = calcZoneSensibleOutput(state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).MassFlowRate, + state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).Temp, + thisZoneHB.MAT, + thisZoneHB.ZoneAirHumRat); + airDistUnit.HeatRate = max(0.0, ADUHeatAddRate); + airDistUnit.CoolRate = std::abs(min(0.0, ADUHeatAddRate)); + airDistUnit.HeatGain = airDistUnit.HeatRate * state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour; + airDistUnit.CoolGain = airDistUnit.CoolRate * state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour; + } + } + + } else if (thisZone.IsReturnPlenum) { + auto &zoneRetPlenCond = state.dataZonePlenum->ZoneRetPlenCond(thisZone.PlenumCondNum); + for (int NodeNum = 1; NodeNum <= zoneRetPlenCond.NumInletNodes; ++NodeNum) { + QSensRate = calcZoneSensibleOutput(state.dataLoopNodes->Node(zoneRetPlenCond.InletNode(NodeNum)).MassFlowRate, + state.dataLoopNodes->Node(zoneRetPlenCond.InletNode(NodeNum)).Temp, + thisZoneHB.MAT, + thisZoneHB.ZoneAirHumRat); + SumMCpDTsystem += QSensRate; + } + // add in the leaks + for (int ADUListIndex = 1; ADUListIndex <= zoneRetPlenCond.NumADUs; ++ADUListIndex) { + auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(zoneRetPlenCond.ADUIndex(ADUListIndex)); + if (airDistUnit.UpStreamLeak) { + QSensRate = calcZoneSensibleOutput(airDistUnit.MassFlowRateUpStrLk, + state.dataLoopNodes->Node(airDistUnit.InletNodeNum).Temp, + thisZoneHB.MAT, + thisZoneHB.ZoneAirHumRat); + SumMCpDTsystem += QSensRate; + } + if (airDistUnit.DownStreamLeak) { + QSensRate = calcZoneSensibleOutput(airDistUnit.MassFlowRateDnStrLk, + state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).Temp, + thisZoneHB.MAT, + thisZoneHB.ZoneAirHumRat); + SumMCpDTsystem += QSensRate; + } + } + + } else if (thisZone.IsSupplyPlenum) { + auto &zoneSupPlenCond = state.dataZonePlenum->ZoneSupPlenCond(thisZone.PlenumCondNum); + QSensRate = calcZoneSensibleOutput(state.dataLoopNodes->Node(zoneSupPlenCond.InletNode).MassFlowRate, + state.dataLoopNodes->Node(zoneSupPlenCond.InletNode).Temp, + thisZoneHB.MAT, + thisZoneHB.ZoneAirHumRat); + SumMCpDTsystem += QSensRate; + } + + // non air system response. + SumNonAirSystem = + thisZoneHB.NonAirSystemResponse + state.dataHeatBalFanSys->SumConvHTRadSys(ZoneNum) + state.dataHeatBalFanSys->SumConvPool(ZoneNum); + + // Sum all surface convection: SumHA, SumHATsurf, SumHATref (and additional contributions to SumIntGain) + for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) { + auto &thisSpace = state.dataHeatBal->space(spaceNum); + for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { + + Real64 Area = state.dataSurface->Surface(SurfNum).Area; // For windows, this is the glazing area + Real64 RefAirTemp = state.dataSurface->Surface(SurfNum).getInsideAirTemperature(state, SurfNum); + + if (state.dataSurface->Surface(SurfNum).Class == DataSurfaces::SurfaceClass::Window) { + + // Add to the convective internal gains + if (ANY_INTERIOR_SHADE_BLIND(state.dataSurface->SurfWinShadingFlag(SurfNum))) { + // The shade area covers the area of the glazing plus the area of the dividers. + Area += state.dataSurface->SurfWinDividerArea(SurfNum); + // If interior shade or blind is present it is assumed that both the convective and IR radiative gain + // from the inside surface of the divider goes directly into the zone air -- i.e., the IR radiative + // interaction between divider and shade or blind is ignored due to the difficulty of calculating this interaction + // at the same time that the interaction between glass and shade is calculated. + SumIntGains += state.dataSurface->SurfWinDividerHeatGain(SurfNum); + } + + // Other convection term is applicable to equivalent layer window (ASHWAT) model + if (state.dataConstruction->Construct(state.dataSurface->Surface(SurfNum).Construction).WindowTypeEQL) + SumIntGains += state.dataSurface->SurfWinOtherConvHeatGain(SurfNum); + + // Convective heat gain from natural convection in gap between glass and interior shade or blind + if (ANY_INTERIOR_SHADE_BLIND(state.dataSurface->SurfWinShadingFlag(SurfNum))) + SumIntGains += state.dataSurface->SurfWinConvHeatFlowNatural(SurfNum); + + // Convective heat gain from airflow window + if (state.dataSurface->SurfWinAirflowThisTS(SurfNum) > 0.0) { + SumIntGains += state.dataSurface->SurfWinConvHeatGainToZoneAir(SurfNum); + if (thisZone.NoHeatToReturnAir) { + SumIntGains += state.dataSurface->SurfWinRetHeatGainToZoneAir(SurfNum); + } + } + + // Add to the surface convection sums + if (state.dataSurface->SurfWinFrameArea(SurfNum) > 0.0) { + // Window frame contribution + SumHADTsurfs += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinFrameArea(SurfNum) * + (1.0 + state.dataSurface->SurfWinProjCorrFrIn(SurfNum)) * + (state.dataSurface->SurfWinFrameTempIn(SurfNum) - RefAirTemp); + } + + if (state.dataSurface->SurfWinDividerArea(SurfNum) > 0.0 && + !ANY_INTERIOR_SHADE_BLIND(state.dataSurface->SurfWinShadingFlag(SurfNum))) { + // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) + SumHADTsurfs += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinDividerArea(SurfNum) * + (1.0 + 2.0 * state.dataSurface->SurfWinProjCorrDivIn(SurfNum)) * + (state.dataSurface->SurfWinDividerTempIn(SurfNum) - RefAirTemp); + } + + } // End of check if window + + SumHADTsurfs += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * Area * (state.dataHeatBalSurf->SurfTempInTmp(SurfNum) - RefAirTemp); + + // Accumulate Zone Phase Change Material Melting/Freezing Enthalpy output variables + if (state.dataSurface->Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD) { + state.dataHeatBal->ZnAirRpt(ZoneNum).SumEnthalpyM += state.dataHeatBalFiniteDiffMgr->SurfaceFD(SurfNum).EnthalpyM; + state.dataHeatBal->ZnAirRpt(ZoneNum).SumEnthalpyH += state.dataHeatBalFiniteDiffMgr->SurfaceFD(SurfNum).EnthalpyF; + } + } + } + // now calculate air energy storage source term. + // capacitance is volume * density * heat capacity + Real64 CpAir = Psychrometrics::PsyCpAirFnW(thisZoneHB.ZoneAirHumRat); + Real64 RhoAir = Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, thisZoneHB.MAT, thisZoneHB.ZoneAirHumRat); + + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + CzdTdt = RhoAir * CpAir * thisZone.Volume * thisZone.ZoneVolCapMultpSens * (thisZoneHB.MAT - thisZoneHB.ZTM[0]) / + (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); + // Exact solution + } break; + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + CzdTdt = TempIndCoef - TempDepCoef * thisZoneHB.MAT; + } break; + case DataHeatBalance::SolutionAlgo::EulerMethod: { + CzdTdt = thisZoneHB.AirPowerCap * (thisZoneHB.MAT - thisZoneHB.ZoneT1); + } break; + default: + break; + } + + if (state.dataGlobal->DisplayZoneAirHeatBalanceOffBalance) { + imBalance = SumIntGains + SumHADTsurfs + SumMCpDTzones + SumMCpDtInfil + SumMCpDTsystem + SumNonAirSystem - CzdTdt; + + // throw warning if seriously out of balance (this may need to be removed if too noisy... ) + // formulate dynamic threshold value based on 20% of quadrature sum of components + Real64 Threshold = 0.2 * std::sqrt(pow_2(SumIntGains) + pow_2(SumHADTsurfs) + pow_2(SumMCpDTzones) + pow_2(SumMCpDtInfil) + + pow_2(SumMCpDTsystem) + pow_2(SumNonAirSystem) + pow_2(CzdTdt)); + if ((std::abs(imBalance) > Threshold) && (!state.dataGlobal->WarmupFlag) && + (!state.dataGlobal->DoingSizing)) { // air balance is out by more than threshold + if (thisZone.AirHBimBalanceErrIndex == 0) { + ShowWarningMessage(state, format("Zone Air Heat Balance is out of balance for zone named {}", thisZone.Name)); + ShowContinueError(state, format("Zone Air Heat Balance Deviation Rate is more than {:.1R} {{W}}", Threshold)); + if (state.dataHVACGlobal->TurnFansOn) { + ShowContinueError(state, "Night cycle fan operation may be causing above error"); + } + + ShowContinueErrorTimeStamp(state, " Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + format("Zone Air Heat Balance is out of balance ... zone named {}", thisZone.Name), + thisZone.AirHBimBalanceErrIndex, + std::abs(imBalance) - Threshold, + std::abs(imBalance) - Threshold, + _, + "{W}", + "{W}"); + } + } +} + +bool VerifyThermostatInZone(EnergyPlusData &state, std::string const &ZoneName) // Zone to verify +{ + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN Feb 2005 + + // PURPOSE OF THIS FUNCTION: + // This function verifies that a zone (by name) has a Zone Control:Thermostatic object entered. + + if (state.dataZoneCtrls->GetZoneAirStatsInputFlag) { + GetZoneAirSetPoints(state); + state.dataZoneCtrls->GetZoneAirStatsInputFlag = false; + } + if (state.dataZoneCtrls->NumTempControlledZones > 0) { + if (UtilityRoutines::FindItemInList(ZoneName, state.dataZoneCtrls->TempControlledZone, &DataZoneControls::ZoneTempControls::ZoneName) > 0) { + return true; + } else { + return false; + } + } + return false; +} + +bool VerifyControlledZoneForThermostat(EnergyPlusData &state, std::string const &ZoneName) // Zone to verify +{ + + // FUNCTION INFORMATION: + // AUTHOR Linda Lawrie + // DATE WRITTEN Mar 2007 + + // PURPOSE OF THIS FUNCTION: + // This function verifies that a zone (by name) has a ZoneHVAC:EquipmentConnections object entered. + + return (UtilityRoutines::FindItemInList(ZoneName, state.dataZoneEquip->ZoneEquipConfig, &DataZoneEquipment::EquipConfiguration::ZoneName) > 0); +} + +void DetectOscillatingZoneTemp(EnergyPlusData &state) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Jason Glazer + // DATE WRITTEN August 2005 + + // PURPOSE OF THIS SUBROUTINE: + // Oscillating temperatures between HVAC timesteps indicate that the + // simulation may be poor. Code is trying to be fast since the purpose + // is to see the impact on oscillating by trying longer time steps in + // an attempt to speed up the simulation. + // Note that the OscillateMagnitude threshold must be less than + // MaxZoneTempDiff since ManageHVAC keeps shortening the timestep + // until that is reached unless it goes to less than the + // MinTimeStepSys. + + // first time run allocate arrays and setup output variable + if (state.dataZoneTempPredictorCorrector->SetupOscillationOutputFlag) { + state.dataZoneTempPredictorCorrector->ZoneTempHist.allocate(4, state.dataGlobal->NumOfZones); + state.dataZoneTempPredictorCorrector->ZoneTempHist = 0.0; + state.dataZoneTempPredictorCorrector->ZoneTempOscillate.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy.dimension(state.dataGlobal->NumOfZones, 0.0); + state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband.dimension(state.dataGlobal->NumOfZones, 0.0); + // set up zone by zone variables, CurrentModuleObject='Zone' + for (int iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) { + auto &zone = state.dataHeatBal->Zone(iZone); + SetupOutputVariable(state, + "Zone Oscillating Temperatures Time", + OutputProcessor::Unit::hr, + state.dataZoneTempPredictorCorrector->ZoneTempOscillate(iZone), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zone.Name); + SetupOutputVariable(state, + "Zone Oscillating Temperatures During Occupancy Time", + OutputProcessor::Unit::hr, + state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy(iZone), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zone.Name); + SetupOutputVariable(state, + "Zone Oscillating Temperatures in Deadband Time", + OutputProcessor::Unit::hr, + state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband(iZone), + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + zone.Name); + } + // set up a variable covering all zones + SetupOutputVariable(state, + "Facility Any Zone Oscillating Temperatures Time", + OutputProcessor::Unit::hr, + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillate, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + "Facility"); + SetupOutputVariable(state, + "Facility Any Zone Oscillating Temperatures During Occupancy Time", + OutputProcessor::Unit::hr, + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateDuringOccupancy, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + "Facility"); + SetupOutputVariable(state, + "Facility Any Zone Oscillating Temperatures in Deadband Time", + OutputProcessor::Unit::hr, + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateInDeadband, + OutputProcessor::SOVTimeStepType::System, + OutputProcessor::SOVStoreType::Summed, + "Facility"); + // test if the oscillation variables are even used + if (ReportingThisVariable(state, "Zone Oscillating Temperatures Time") || + ReportingThisVariable(state, "Zone Oscillating Temperatures During Occupancy Time") || + ReportingThisVariable(state, "Zone Oscillating Temperatures in Deadband Time") || + ReportingThisVariable(state, "Facility Any Zone Oscillating Temperatures Time") || + ReportingThisVariable(state, "Facility Any Zone Oscillating Temperatures During Occupancy Time") || + ReportingThisVariable(state, "Facility Any Zone Oscillating Temperatures in Deadband Time")) { + state.dataZoneTempPredictorCorrector->OscillationVariablesNeeded = true; + } + state.dataZoneTempPredictorCorrector->SetupOscillationOutputFlag = false; + } + + auto &TimeStepSys = state.dataHVACGlobal->TimeStepSys; + if (state.dataZoneTempPredictorCorrector->OscillationVariablesNeeded) { + // precalc the negative value for performance + Real64 NegOscillateMagnitude = -DataHVACGlobals::OscillateMagnitude; + // assume no zone is oscillating + bool isAnyZoneOscillating = false; + bool isAnyZoneOscillatingDuringOccupancy = false; + bool isAnyZoneOscillatingInDeadband = false; + + for (int iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) { + bool isOscillate = false; + state.dataZoneTempPredictorCorrector->ZoneTempHist(4, iZone) = state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone); + state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone) = state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone); + state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone) = state.dataZoneTempPredictorCorrector->ZoneTempHist(1, iZone); + state.dataZoneTempPredictorCorrector->ZoneTempHist(1, iZone) = state.dataZoneTempPredictorCorrector->zoneHeatBalance(iZone).ZT; + Real64 Diff34 = + state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone) - state.dataZoneTempPredictorCorrector->ZoneTempHist(4, iZone); + Real64 Diff23 = + state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone) - state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone); + Real64 Diff12 = + state.dataZoneTempPredictorCorrector->ZoneTempHist(1, iZone) - state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone); + // roll out the conditionals for increased performance + if (Diff12 > DataHVACGlobals::OscillateMagnitude) { + if (Diff23 < NegOscillateMagnitude) { + if (Diff34 > DataHVACGlobals::OscillateMagnitude) { + isOscillate = true; + } + } + } + // now try the opposite sequence of swings + if (Diff12 < NegOscillateMagnitude) { + if (Diff23 > DataHVACGlobals::OscillateMagnitude) { + if (Diff34 < NegOscillateMagnitude) { + isOscillate = true; + } + } + } + state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy(iZone) = 0.0; + state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband(iZone) = 0.0; + if (isOscillate) { + state.dataZoneTempPredictorCorrector->ZoneTempOscillate(iZone) = TimeStepSys; + isAnyZoneOscillating = true; + if (allocated(state.dataThermalComforts->ThermalComfortInASH55)) { + if (state.dataThermalComforts->ThermalComfortInASH55(iZone).ZoneIsOccupied) { + state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy(iZone) = TimeStepSys; + isAnyZoneOscillatingDuringOccupancy = true; + } + } + if (state.dataZoneEnergyDemand->CurDeadBandOrSetback(iZone)) { + state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband(iZone) = TimeStepSys; + isAnyZoneOscillatingInDeadband = true; + } + } else { + state.dataZoneTempPredictorCorrector->ZoneTempOscillate(iZone) = 0.0; + } + } + // any zone variable + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillate = (isAnyZoneOscillating) ? TimeStepSys : 0.0; + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateDuringOccupancy = (isAnyZoneOscillatingDuringOccupancy) ? TimeStepSys : 0.0; + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateInDeadband = (isAnyZoneOscillatingInDeadband) ? TimeStepSys : 0.0; + + // annual/runperiod sum for _perflog.csv file + state.dataZoneTempPredictorCorrector->AnnualAnyZoneTempOscillate += state.dataZoneTempPredictorCorrector->AnyZoneTempOscillate; + state.dataZoneTempPredictorCorrector->AnnualAnyZoneTempOscillateDuringOccupancy += + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateDuringOccupancy; + state.dataZoneTempPredictorCorrector->AnnualAnyZoneTempOscillateInDeadband += + state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateInDeadband; + } +} + +void AdjustAirSetPointsforOpTempCntrl(EnergyPlusData &state, int const TempControlledZoneID, int const ActualZoneNum, Real64 &ZoneAirSetPoint) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR B. Griffith + // DATE WRITTEN June 2006 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine modifies the air temperature setpoint to effect operative temperature control + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Real64 thisMRTFraction; // local variable for fraction that MRT is in Op Temp definition + + if (!(state.dataZoneCtrls->AnyOpTempControl)) return; // do nothing to setpoint + + auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID); + if (!(tempControlledZone.OperativeTempControl)) return; // do nothing to setpoint + + // is operative temp radiative fraction scheduled or fixed? + thisMRTFraction = (tempControlledZone.OpTempCntrlModeScheduled) + ? ScheduleManager::GetCurrentScheduleValue(state, tempControlledZone.OpTempRadiativeFractionSched) + : tempControlledZone.FixedRadiativeFraction; + + // get mean radiant temperature for zone + Real64 thisMRT = state.dataHeatBal->ZoneMRT(ActualZoneNum); + + // modify setpoint for operative temperature control + // traping for MRT fractions between 0.0 and 0.9 during get input, so shouldn't be able to divide by zero here. + ZoneAirSetPoint = (ZoneAirSetPoint - thisMRTFraction * thisMRT) / (1.0 - thisMRTFraction); +} + +void AdjustOperativeSetPointsforAdapComfort(EnergyPlusData &state, int const TempControlledZoneID, Real64 &ZoneAirSetPoint) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Xuan Luo + // DATE WRITTEN Jan 2017 + + // PURPOSE OF THIS SUBROUTINE: + // This routine adjust the operative setpoints for each controlled adaptive thermal comfort models. + + auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID); + auto &AdapComfortDailySetPointSchedule = state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule; + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + int originZoneAirSetPoint = ZoneAirSetPoint; + int AdaptiveComfortModelTypeIndex = tempControlledZone.AdaptiveComfortModelTypeIndex; + + // adjust zone operative setpoint + if (!(tempControlledZone.AdaptiveComfortTempControl)) return; // do nothing to setpoint + if ((state.dataWeatherManager->Environment(state.dataWeatherManager->Envrn).KindOfEnvrn != DataGlobalConstants::KindOfSim::DesignDay) && + (state.dataWeatherManager->Environment(state.dataWeatherManager->Envrn).KindOfEnvrn != DataGlobalConstants::KindOfSim::HVACSizeDesignDay)) { + // Adjust run period cooling set point + switch (AdaptiveComfortModelTypeIndex) { + case static_cast(AdaptiveComfortModel::ASH55_CENTRAL): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central(state.dataEnvrn->DayOfYear); + break; + case static_cast(AdaptiveComfortModel::ASH55_UPPER_90): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90(state.dataEnvrn->DayOfYear); + break; + case static_cast(AdaptiveComfortModel::ASH55_UPPER_80): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80(state.dataEnvrn->DayOfYear); + break; + case static_cast(AdaptiveComfortModel::CEN15251_CENTRAL): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central(state.dataEnvrn->DayOfYear); + break; + case static_cast(AdaptiveComfortModel::CEN15251_UPPER_I): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I(state.dataEnvrn->DayOfYear); + break; + case static_cast(AdaptiveComfortModel::CEN15251_UPPER_II): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II(state.dataEnvrn->DayOfYear); + break; + case static_cast(AdaptiveComfortModel::CEN15251_UPPER_III): + ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III(state.dataEnvrn->DayOfYear); + break; + default: + break; + } + } else { + int const envrnDayNum(state.dataWeatherManager->Environment(state.dataWeatherManager->Envrn).DesignDayNum); + int constexpr summerDesignDayTypeIndex(9); + // Adjust summer design day set point + if (state.dataWeatherManager->DesDayInput(envrnDayNum).DayType == summerDesignDayTypeIndex) { + ZoneAirSetPoint = state.dataZoneTempPredictorCorrector->AdapComfortSetPointSummerDesDay[AdaptiveComfortModelTypeIndex - 2]; + } + } + // If adaptive operative temperature not applicable, set back + if (ZoneAirSetPoint < originZoneAirSetPoint) { + ZoneAirSetPoint = originZoneAirSetPoint; + } + // If meet fault flag, set back + if (ZoneAirSetPoint == -1) { + ZoneAirSetPoint = originZoneAirSetPoint; + } +} + +void CalcZoneAirComfortSetPoints(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Lixing Gu + // DATE WRITTEN May 2006 + + // PURPOSE OF THIS SUBROUTINE: + // This routine sets the thermal comfort setpoints for each controlled zone based on air tempeature obtained from thermal comfort models. + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Real64 SetPointLo = 0.0; + Real64 SetPointHi = 0.0; + Real64 Tset = 0.0; + int PeopleNum = 0; + int ObjectCount = 0; + Real64 PeopleCount = 0.0; + int SetPointComfortSchedIndex = 0; + int SchedTypeIndex = 0; + + // Call thermal comfort module to read zone control comfort object + if (state.dataZoneTempPredictorCorrector->CalcZoneAirComfortSetPointsFirstTimeFlag) { + ThermalComfort::ManageThermalComfort(state, true); + state.dataZoneTempPredictorCorrector->CalcZoneAirComfortSetPointsFirstTimeFlag = false; + } + + state.dataHeatBalFanSys->ComfortControlType = DataHVACGlobals::ThermostatType::Uncontrolled; // Default + + for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++RelativeZoneNum) { + + auto &comfortControlledZone = state.dataZoneCtrls->ComfortControlledZone(RelativeZoneNum); + int ActualZoneNum = comfortControlledZone.ActualZoneNum; + auto &zone = state.dataHeatBal->Zone(ActualZoneNum); + auto &comfortControlType = state.dataHeatBalFanSys->ComfortControlType(ActualZoneNum); + auto &comfortControlTypeRpt = state.dataHeatBalFanSys->ComfortControlTypeRpt(ActualZoneNum); + auto &tempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ActualZoneNum); + auto &zoneComfortControlsFanger = state.dataHeatBalFanSys->ZoneComfortControlsFanger(ActualZoneNum); + comfortControlType = + static_cast(ScheduleManager::GetCurrentScheduleValue(state, comfortControlledZone.ComfortSchedIndex)); + comfortControlTypeRpt = static_cast(comfortControlType); + + // Get PMV values + switch (comfortControlType) { + case DataHVACGlobals::ThermostatType::Uncontrolled: + zoneComfortControlsFanger.LowPMV = -999.0; + zoneComfortControlsFanger.HighPMV = -999.0; + break; + case DataHVACGlobals::ThermostatType::SingleHeating: + zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::SingleHeating); + zoneComfortControlsFanger.LowPMV = ScheduleManager::GetCurrentScheduleValue( + state, + state.dataZoneTempPredictorCorrector + ->SetPointSingleHeatingFanger(comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_SingleHeating)) + .PMVSchedIndex); + zoneComfortControlsFanger.HighPMV = -999.0; + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::SingleCooling); + zoneComfortControlsFanger.LowPMV = -999.0; + zoneComfortControlsFanger.HighPMV = ScheduleManager::GetCurrentScheduleValue( + state, + state.dataZoneTempPredictorCorrector + ->SetPointSingleCoolingFanger(comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_SingleCooling)) + .PMVSchedIndex); + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + SetPointComfortSchedIndex = + state.dataZoneTempPredictorCorrector + ->SetPointSingleHeatCoolFanger(comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_SingleHeatCool)) + .PMVSchedIndex; + zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool); + zoneComfortControlsFanger.LowPMV = ScheduleManager::GetCurrentScheduleValue(state, SetPointComfortSchedIndex); + zoneComfortControlsFanger.HighPMV = ScheduleManager::GetCurrentScheduleValue(state, SetPointComfortSchedIndex); + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + SchedTypeIndex = comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_DualSetPointWithDeadBand); + zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand); + zoneComfortControlsFanger.LowPMV = ScheduleManager::GetCurrentScheduleValue( + state, state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(SchedTypeIndex).HeatPMVSchedIndex); + zoneComfortControlsFanger.HighPMV = ScheduleManager::GetCurrentScheduleValue( + state, state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(SchedTypeIndex).CoolPMVSchedIndex); + if (zoneComfortControlsFanger.LowPMV > zoneComfortControlsFanger.HighPMV) { + ++zoneComfortControlsFanger.DualPMVErrCount; + if (zoneComfortControlsFanger.DualPMVErrCount < 2) { + ShowWarningError(state, + "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint: The heating PMV setpoint is above the cooling " + "PMV setpoint in " + + state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(SchedTypeIndex).Name); + ShowContinueError(state, "The zone dual heating PMV setpoint is set to the dual cooling PMV setpoint."); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } else { + ShowRecurringWarningErrorAtEnd(state, + "The heating PMV setpoint is still above the cooling PMV setpoint", + zoneComfortControlsFanger.DualPMVErrIndex, + zoneComfortControlsFanger.LowPMV, + zoneComfortControlsFanger.LowPMV); + } + zoneComfortControlsFanger.LowPMV = zoneComfortControlsFanger.HighPMV; + } + break; + default: + ShowSevereError(state, + format("CalcZoneAirTempSetpoints: Illegal thermal control control type for Zone={}, Found value={}, in Schedule={}", + zone.Name, + comfortControlTypeRpt, + comfortControlledZone.ControlTypeSchedName)); + break; + } + + // Check Average method + switch (comfortControlledZone.AverageMethod) { + case DataZoneControls::AverageMethod::NO: + PeopleNum = comfortControlledZone.SpecificObjectNum; + if (comfortControlType == DataHVACGlobals::ThermostatType::SingleCooling) { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointLo); + } else { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, SetPointLo); + } + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointHi); + break; + case DataZoneControls::AverageMethod::SPE: + PeopleNum = comfortControlledZone.SpecificObjectNum; + if (comfortControlType == DataHVACGlobals::ThermostatType::SingleCooling) { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointLo); + } else { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, SetPointLo); + } + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointHi); + break; + case DataZoneControls::AverageMethod::OBJ: + SetPointLo = 0.0; + SetPointHi = 0.0; + for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { + if (ActualZoneNum == state.dataHeatBal->People(PeopleNum).ZonePtr) { + ++ObjectCount; + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, Tset); + SetPointLo += Tset; + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, Tset); + SetPointHi += Tset; + } + } + } + SetPointLo /= ObjectCount; + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) SetPointHi /= ObjectCount; + break; + case DataZoneControls::AverageMethod::PEO: + SetPointLo = 0.0; + SetPointHi = 0.0; + for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { + if (ActualZoneNum == state.dataHeatBal->People(PeopleNum).ZonePtr) { + int NumberOccupants = state.dataHeatBal->People(PeopleNum).NumberOfPeople * + ScheduleManager::GetCurrentScheduleValue(state, state.dataHeatBal->People(PeopleNum).NumberOfPeoplePtr); + PeopleCount += NumberOccupants; + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, Tset); + SetPointLo += Tset * NumberOccupants; + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, Tset); + SetPointHi += Tset * NumberOccupants; + } + } + } + if (PeopleCount > 0) { + SetPointLo /= PeopleCount; + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) SetPointHi /= PeopleCount; + } else { + if (comfortControlledZone.PeopleAverageErrIndex == 0) { + ShowWarningMessage(state, + "ZoneControl:Thermostat:ThermalComfort: The total number of people in Zone = " + zone.Name + + " is zero. The People Average option is not used."); + ShowContinueError(state, "The Object Average option is used instead. Simulation continues ....."); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "ZoneControl:Thermostat:ThermalComfort: The total number of people in Zone = " + zone.Name + + " is still zero. The People Average option is not used", + comfortControlledZone.PeopleAverageErrIndex, + PeopleCount, + PeopleCount); + SetPointLo = 0.0; + SetPointHi = 0.0; + for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { + if (ActualZoneNum == state.dataHeatBal->People(PeopleNum).ZonePtr) { + ++ObjectCount; + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, Tset); + SetPointLo += Tset; + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) { + GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, Tset); + SetPointHi += Tset; + } + } + } + SetPointLo /= ObjectCount; + if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) SetPointHi /= ObjectCount; + } + break; + default: + break; + } + + // Assign setpoint + switch (comfortControlType) { + case DataHVACGlobals::ThermostatType::Uncontrolled: + switch (state.dataHeatBalFanSys->TempControlType(ActualZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = 0.0; + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = 0.0; + break; + default: + break; + } + break; + case DataHVACGlobals::ThermostatType::SingleHeating: + if (SetPointLo < comfortControlledZone.TdbMinSetPoint) { + SetPointLo = comfortControlledZone.TdbMinSetPoint; + if (comfortControlledZone.TdbMinErrIndex < 2) { + ShowWarningMessage(state, + "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeating temperature is below the Minimum dry-bulb " + "temperature setpoint " + + comfortControlledZone.Name); + ShowContinueError(state, "The zone heating setpoint is set to the Minimum dry-bulb temperature setpoint"); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeating temperature is still below the " + "Minimum dry-bulb temperature setpoint ...", + comfortControlledZone.TdbMinErrIndex, + SetPointLo, + SetPointLo); + } + tempZoneThermostatSetPoint = SetPointLo; + state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = tempZoneThermostatSetPoint; + state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::SingleHeating; + state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + if (SetPointLo > comfortControlledZone.TdbMaxSetPoint) { + SetPointLo = comfortControlledZone.TdbMaxSetPoint; + if (comfortControlledZone.TdbMaxErrIndex == 0) { + ShowWarningMessage(state, + "ThermostatSetpoint:ThermalComfort:Fanger:SingleCooling temperature is above the Maximum dry-bulb " + "temperature setpoint " + + comfortControlledZone.Name); + ShowContinueError(state, "The zone cooling setpoint is set to the Maximum dry-bulb temperature setpoint"); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "ThermostatSetpoint:ThermalComfort:Fanger:SingleCooling temperature is still above the " + "Maximum dry-bulb temperature setpoint ...", + comfortControlledZone.TdbMaxErrIndex, + SetPointLo, + SetPointLo); + } + tempZoneThermostatSetPoint = SetPointLo; + state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = tempZoneThermostatSetPoint; + state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::SingleCooling; + state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + if (comfortControlledZone.TdbMaxSetPoint == comfortControlledZone.TdbMinSetPoint) { + SetPointLo = comfortControlledZone.TdbMaxSetPoint; + } + if (SetPointLo > comfortControlledZone.TdbMaxSetPoint) SetPointLo = comfortControlledZone.TdbMaxSetPoint; + if (SetPointLo < comfortControlledZone.TdbMinSetPoint) SetPointLo = comfortControlledZone.TdbMinSetPoint; + if (SetPointLo < comfortControlledZone.TdbMinSetPoint || SetPointLo > comfortControlledZone.TdbMaxSetPoint) { + if (comfortControlledZone.TdbHCErrIndex == 0) { + ShowWarningMessage(state, + "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeatingOrCooling temperature is above the Maximum or " + "below the Minimum dry-bulb temperature setpoint " + + comfortControlledZone.Name); + ShowContinueError(state, + "The zone setpoint is set to the Maximum dry-bulb temperature setpoint if above or the Minimum " + "dry-bulb temperature setpoint if below"); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeatingOrCooling temperature is still beyond " + "the range between Maximum and Minimum dry-bulb temperature setpoint ...", + comfortControlledZone.TdbHCErrIndex, + SetPointLo, + SetPointLo); + } + tempZoneThermostatSetPoint = SetPointLo; + state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = tempZoneThermostatSetPoint; + state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = tempZoneThermostatSetPoint; + state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::SingleHeatCool; + state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + if (SetPointLo < comfortControlledZone.TdbMinSetPoint) { + SetPointLo = comfortControlledZone.TdbMinSetPoint; + + if (comfortControlledZone.TdbDualMinErrIndex == 0) { + ShowWarningMessage(state, + "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is below the Minimum dry-bulb " + "temperature setpoint " + + comfortControlledZone.Name); + ShowContinueError(state, "The zone dual heating setpoint is set to the Minimum dry-bulb temperature setpoint"); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is still below the Minimum " + "dry-bulb temperature setpoint ...", + comfortControlledZone.TdbDualMinErrIndex, + SetPointLo, + SetPointLo); + } + if (SetPointHi > comfortControlledZone.TdbMaxSetPoint) { + SetPointHi = comfortControlledZone.TdbMaxSetPoint; + if (comfortControlledZone.TdbDualMaxErrIndex == 0) { + ShowWarningMessage(state, + format("ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is above the Maximum dry-bulb " + "temperature setpoint in zone = {}", + comfortControlledZone.Name)); + ShowContinueError(state, "The zone dual cooling setpoint is set to the Maximum dry-bulb temperature setpoint"); + ShowContinueErrorTimeStamp(state, "Occurrence info:"); + } + ShowRecurringWarningErrorAtEnd(state, + "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is still above the Maximum " + "dry-bulb temperature setpoint ...", + comfortControlledZone.TdbDualMaxErrIndex, + SetPointLo, + SetPointLo); + } + + state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = SetPointLo; + state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = SetPointHi; + state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; + state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); + break; + default: + ShowSevereError(state, + format("CalcZoneAirComfortSetpoints: Illegal thermal control control type for Zone={}, Found value={}, in Schedule={}", + zone.Name, + comfortControlTypeRpt, + comfortControlledZone.ControlTypeSchedName)); + } + } +} + +void GetComfortSetPoints(EnergyPlusData &state, + int const PeopleNum, + int const ComfortControlNum, + Real64 const PMVSet, + Real64 &Tset // drybulb setpoint temperature for a given PMV value +) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR Lixing Gu + // DATE WRITTEN May, 2006 + // PURPOSE OF THIS SUBROUTINE: + // This routine sets what the thermal comfort setpoints for each controlled zone should be based on air temperature + // obtained from thermal comfort models. This is called each time step. + + // SUBROUTINE ARGUMENT DEFINITIONS: + // 0 = Solution; 1 = Set to Min; 2 Set to Max + + // SUBROUTINE PARAMETER DEFINITIONS: + Real64 constexpr Acc(0.001); // accuracy control for SolveRoot + int constexpr MaxIter(500); // iteration control for SolveRoot + + // SUBROUTINE LOCAL VARIABLE DECLARATIONS: + Real64 PMVResult = 0.0; // Calculated PMV value + int SolFla = 0; // feed back flag from SolveRoot + + auto &comfortControlledZone = state.dataZoneCtrls->ComfortControlledZone(ComfortControlNum); + Real64 Tmin = comfortControlledZone.TdbMinSetPoint; + Real64 Tmax = comfortControlledZone.TdbMaxSetPoint; + + ThermalComfort::CalcThermalComfortFanger(state, PeopleNum, Tmin, PMVResult); + Real64 PMVMin = PMVResult; + ThermalComfort::CalcThermalComfortFanger(state, PeopleNum, Tmax, PMVResult); + Real64 PMVMax = PMVResult; + if (PMVSet > PMVMin && PMVSet < PMVMax) { + + auto f = [&state, PMVSet, PeopleNum](Real64 Tset) { + Real64 PMVresult = 0.0; // resulting PMV values + ThermalComfort::CalcThermalComfortFanger(state, PeopleNum, Tset, PMVresult); + return (PMVSet - PMVresult); + }; + + General::SolveRoot(state, Acc, MaxIter, SolFla, Tset, f, Tmin, Tmax); + if (SolFla == -1) { + if (!state.dataGlobal->WarmupFlag) { + ++state.dataZoneTempPredictorCorrector->IterLimitExceededNum1; + if (state.dataZoneTempPredictorCorrector->IterLimitExceededNum1 == 1) { + ShowWarningError(state, + comfortControlledZone.Name + + ": Iteration limit exceeded calculating thermal comfort Fanger setpoint and non-converged setpoint is used"); + } else { + ShowRecurringWarningErrorAtEnd(state, + comfortControlledZone.Name + ": Iteration limit exceeded calculating thermal comfort setpoint.", + state.dataZoneTempPredictorCorrector->IterLimitErrIndex1, + Tset, + Tset); + } + } + } else if (SolFla == -2) { + if (!state.dataGlobal->WarmupFlag) { + ++state.dataZoneTempPredictorCorrector->IterLimitExceededNum2; + if (state.dataZoneTempPredictorCorrector->IterLimitExceededNum2 == 1) { + ShowWarningError( + state, + format("{}: Solution is not found in calculating thermal comfort Fanger setpoint and the minimum setpoint is used", + comfortControlledZone.Name)); + } else { + ShowRecurringWarningErrorAtEnd( + state, + format("{}: Solution is not found in calculating thermal comfort Fanger setpoint.", comfortControlledZone.Name), + state.dataZoneTempPredictorCorrector->IterLimitErrIndex2, + Tset, + Tset); + } + } + } + } else if (PMVSet < PMVMin) { + Tset = Tmin; + } else if (PMVSet > PMVMax) { + Tset = Tmax; + } +} + +void AdjustCoolingSetPointforTempAndHumidityControl(EnergyPlusData &state, + int const TempControlledZoneID, + int const ActualZoneNum // controlled zone actual zone number +) +{ + // SUBROUTINE INFORMATION: + // AUTHOR Bereket A Nigusse, FSEC/UCF + // DATE WRITTEN Nov 2010 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine modifies the air cooling setpoint temperature to effect zone air Temperature and humidity control + // Alter the zone air cooling setpoint if the zone air relative humidity value exceeds the the zone dehumidifying relative humidity setpoint. + + Real64 ZoneOvercoolRange = 0.0; + auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID); + + if (!(state.dataZoneCtrls->AnyZoneTempAndHumidityControl)) return; // do nothing to setpoint + if (!(tempControlledZone.ZoneOvercoolControl)) return; // do nothing to setpoint + + if (tempControlledZone.OvercoolCntrlModeScheduled) { + ZoneOvercoolRange = ScheduleManager::GetCurrentScheduleValue(state, tempControlledZone.ZoneOvercoolRangeSchedIndex); + } else { + ZoneOvercoolRange = tempControlledZone.ZoneOvercoolConstRange; + } + Real64 ZoneOvercoolControlRatio = tempControlledZone.ZoneOvercoolControlRatio; + + // For Dual Setpoint thermostat the overcool range is limited by the temperature difference between cooling and heating setpoints + Real64 MaxAllowedOvercoolRange = + state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) - state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum); + if (MaxAllowedOvercoolRange > 0.0) { + ZoneOvercoolRange = min(ZoneOvercoolRange, MaxAllowedOvercoolRange); + } + // Calculate difference between zone air relative humidity and the dehumidifying setpoint + Real64 RelativeHumidityDiff = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ActualZoneNum).ZoneAirRelHum - + ScheduleManager::GetCurrentScheduleValue(state, tempControlledZone.DehumidifyingSchedIndex); + if (RelativeHumidityDiff > 0.0 && ZoneOvercoolControlRatio > 0.0) { + // proportionally reset the cooling setpoint temperature downward (zone Overcool) + ZoneOvercoolRange = min(ZoneOvercoolRange, RelativeHumidityDiff / ZoneOvercoolControlRatio); + state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) -= ZoneOvercoolRange; + } +} + +void OverrideAirSetPointsforEMSCntrl(EnergyPlusData &state) +{ + + // SUBROUTINE INFORMATION: + // AUTHOR L. Gu + // DATE WRITTEN June 2017 + + // PURPOSE OF THIS SUBROUTINE: + // This subroutine overrides the air temperature setpoint based on EMS + + auto &ZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo; + auto &ZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi; + + for (int Loop = 1; Loop <= state.dataZoneCtrls->NumTempControlledZones; ++Loop) { + auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(Loop); + if (tempControlledZone.EMSOverrideHeatingSetPointOn) { + int ZoneNum = tempControlledZone.ActualZoneNum; + + switch (state.dataHeatBalFanSys->TempControlType(ZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; + ZoneThermostatSetPointLo(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; + ZoneThermostatSetPointLo(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + ZoneThermostatSetPointLo(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; + break; + default: + break; + } + } + if (tempControlledZone.EMSOverrideCoolingSetPointOn) { + int ZoneNum = tempControlledZone.ActualZoneNum; + + switch (state.dataHeatBalFanSys->TempControlType(ZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleCooling: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; + ZoneThermostatSetPointHi(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; + ZoneThermostatSetPointHi(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + ZoneThermostatSetPointHi(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; + break; + default: + break; + } + } + } + + for (int Loop = 1; Loop <= state.dataZoneCtrls->NumComfortControlledZones; ++Loop) { + auto &comfortControlledZone = state.dataZoneCtrls->ComfortControlledZone(Loop); + if (comfortControlledZone.EMSOverrideHeatingSetPointOn) { + int ZoneNum = comfortControlledZone.ActualZoneNum; + switch (state.dataHeatBalFanSys->ComfortControlType(ZoneNum)) { + case DataHVACGlobals::ThermostatType::SingleHeating: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; + ZoneThermostatSetPointLo(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; + ZoneThermostatSetPointLo(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + ZoneThermostatSetPointLo(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; + break; + default: + break; + } + } + + if (comfortControlledZone.EMSOverrideCoolingSetPointOn) { + int ZoneNum = comfortControlledZone.ActualZoneNum; + switch (static_cast(state.dataHeatBalFanSys->ComfortControlType(ZoneNum))) { + case DataHVACGlobals::ThermostatType::SingleCooling: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; + ZoneThermostatSetPointHi(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; + ZoneThermostatSetPointHi(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + ZoneThermostatSetPointHi(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; + break; + default: + break; + } + } + } +} + +// add values to the LEED tabular report related to schedules used by the thermostat objects +void FillPredefinedTableOnThermostatSetpoints(EnergyPlusData &state) +{ + // J.Glazer - Aug 2017 + using namespace OutputReportPredefined; + std::vector uniqSch; + uniqSch.reserve( + state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls + state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls + + state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls + state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls * 2); + Real64 setPointAt11; + Real64 setPointAt23; + int numDays; + std::string monthAssumed; + std::string monthAssumed2; + constexpr int wednesday = 4; + + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls; ++idx) { + auto &singleHtgSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleHeating(idx); + if (std::find(uniqSch.begin(), uniqSch.end(), singleHtgSetpoint.TempSchedIndex) == uniqSch.end()) { + uniqSch.emplace_back(singleHtgSetpoint.TempSchedIndex); + PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, singleHtgSetpoint.TempSchedName, singleHtgSetpoint.Name); + + std::tie(setPointAt11, numDays, monthAssumed) = temperatureAndCountInSch(state, singleHtgSetpoint.TempSchedIndex, false, wednesday, 11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, singleHtgSetpoint.TempSchedName, setPointAt11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, singleHtgSetpoint.TempSchedName, numDays); + + std::tie(setPointAt23, numDays, monthAssumed) = temperatureAndCountInSch(state, singleHtgSetpoint.TempSchedIndex, false, wednesday, 23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, singleHtgSetpoint.TempSchedName, setPointAt23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, singleHtgSetpoint.TempSchedName, numDays); + + PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, singleHtgSetpoint.TempSchedName, monthAssumed); + } + } + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls; ++idx) { + auto &singleClgSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleCooling(idx); + if (std::find(uniqSch.begin(), uniqSch.end(), singleClgSetpoint.TempSchedIndex) == uniqSch.end()) { + uniqSch.emplace_back(singleClgSetpoint.TempSchedIndex); + PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, singleClgSetpoint.TempSchedName, singleClgSetpoint.Name); + + std::tie(setPointAt11, numDays, monthAssumed) = temperatureAndCountInSch(state, singleClgSetpoint.TempSchedIndex, true, wednesday, 11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, singleClgSetpoint.TempSchedName, setPointAt11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, singleClgSetpoint.TempSchedName, numDays); + + std::tie(setPointAt23, numDays, monthAssumed) = temperatureAndCountInSch(state, singleClgSetpoint.TempSchedIndex, true, wednesday, 23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, singleClgSetpoint.TempSchedName, setPointAt23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, singleClgSetpoint.TempSchedName, numDays); + + PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, singleClgSetpoint.TempSchedName, monthAssumed); + } + } + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls; ++idx) { + auto &singleHeatCoolSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool(idx); + if (std::find(uniqSch.begin(), uniqSch.end(), singleHeatCoolSetpoint.TempSchedIndex) == uniqSch.end()) { + uniqSch.emplace_back(singleHeatCoolSetpoint.TempSchedIndex); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, singleHeatCoolSetpoint.TempSchedName, singleHeatCoolSetpoint.Name); + + std::string schNm = singleHeatCoolSetpoint.TempSchedName + " (summer)"; + std::tie(setPointAt11, numDays, monthAssumed) = + temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, true, wednesday, 11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, schNm, setPointAt11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, schNm, numDays); + + std::tie(setPointAt23, numDays, monthAssumed) = + temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, true, wednesday, 23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, schNm, setPointAt23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, schNm, numDays); + + schNm = singleHeatCoolSetpoint.TempSchedName + " (winter)"; + std::tie(setPointAt11, numDays, monthAssumed2) = + temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, false, wednesday, 11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, schNm, setPointAt11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, schNm, numDays); + + std::tie(setPointAt23, numDays, monthAssumed2) = + temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, false, wednesday, 23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, schNm, setPointAt23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, schNm, numDays); + + PreDefTableEntry(state, + state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, + singleHeatCoolSetpoint.TempSchedName, + monthAssumed + " and " + monthAssumed2); + } + } + for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls; ++idx) { + auto &dualHeatCoolSetpoint = state.dataZoneTempPredictorCorrector->SetPointDualHeatCool(idx); + if (std::find(uniqSch.begin(), uniqSch.end(), dualHeatCoolSetpoint.HeatTempSchedIndex) == uniqSch.end()) { + uniqSch.emplace_back(dualHeatCoolSetpoint.HeatTempSchedIndex); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, + dualHeatCoolSetpoint.HeatTempSetptSchedName, + dualHeatCoolSetpoint.Name); + + std::tie(setPointAt11, numDays, monthAssumed) = + temperatureAndCountInSch(state, dualHeatCoolSetpoint.HeatTempSchedIndex, false, wednesday, 11); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, dualHeatCoolSetpoint.HeatTempSetptSchedName, setPointAt11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, dualHeatCoolSetpoint.HeatTempSetptSchedName, numDays); + + std::tie(setPointAt23, numDays, monthAssumed) = + temperatureAndCountInSch(state, dualHeatCoolSetpoint.HeatTempSchedIndex, false, wednesday, 23); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, dualHeatCoolSetpoint.HeatTempSetptSchedName, setPointAt23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, dualHeatCoolSetpoint.HeatTempSetptSchedName, numDays); + + PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, dualHeatCoolSetpoint.HeatTempSetptSchedName, monthAssumed); + } + if (std::find(uniqSch.begin(), uniqSch.end(), dualHeatCoolSetpoint.CoolTempSchedIndex) == uniqSch.end()) { + uniqSch.emplace_back(dualHeatCoolSetpoint.CoolTempSchedIndex); + PreDefTableEntry(state, + state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, + dualHeatCoolSetpoint.CoolTempSetptSchedName, + dualHeatCoolSetpoint.Name); + + std::tie(setPointAt11, numDays, monthAssumed) = + temperatureAndCountInSch(state, dualHeatCoolSetpoint.CoolTempSchedIndex, true, wednesday, 11); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, dualHeatCoolSetpoint.CoolTempSetptSchedName, setPointAt11); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, dualHeatCoolSetpoint.CoolTempSetptSchedName, numDays); + + std::tie(setPointAt23, numDays, monthAssumed) = + temperatureAndCountInSch(state, dualHeatCoolSetpoint.CoolTempSchedIndex, true, wednesday, 23); + PreDefTableEntry( + state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, dualHeatCoolSetpoint.CoolTempSetptSchedName, setPointAt23); + PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, dualHeatCoolSetpoint.CoolTempSetptSchedName, numDays); + + PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, dualHeatCoolSetpoint.CoolTempSetptSchedName, monthAssumed); + } + } +} + +// returns the temperature value from a schedule at a certain time for the first day of the week in either January or July +std::tuple +temperatureAndCountInSch(EnergyPlusData &state, int const scheduleIndex, bool const isSummer, int const dayOfWeek, int const hourOfDay) +{ + // J.Glazer - Aug 2017 + + // determine month to use based on hemiphere and season + int monthToUse; + if (isSummer) { + if (state.dataEnvrn->Latitude > 0.) { + monthToUse = 7; // July - summer in northern hemisphere + } else { + monthToUse = 1; // January - summer in southern hemisphere + } + } else { + if (state.dataEnvrn->Latitude > 0.) { + monthToUse = 1; // January - winter in northern hemisphere + } else { + monthToUse = 7; // July - winter in southern hemisphere + } + } + std::string monthName; + if (monthToUse == 1) { + monthName = "January"; + } else { + monthName = "July"; + } + + int jdateSelect = General::nthDayOfWeekOfMonth(state, dayOfWeek, 1, monthToUse); + + // determine number of days in year + int DaysInYear; + if (state.dataEnvrn->CurrentYearIsLeapYear) { + DaysInYear = 366; + } else { + DaysInYear = 365; + } + + // should adjust date if lands on a holiday but for now assume that it does not + + // adjust time of day for daylight savings time + int hourSelect = hourOfDay + state.dataWeatherManager->DSTIndex(jdateSelect); + + // get the value at the selected time + int constexpr firstTimeStep = 1; + int weekSchIndexSelect = state.dataScheduleMgr->Schedule(scheduleIndex).WeekSchedulePointer(jdateSelect); + int daySchIndexSelect = state.dataScheduleMgr->WeekSchedule(weekSchIndexSelect).DaySchedulePointer(dayOfWeek); + Real64 valueAtSelectTime = state.dataScheduleMgr->DaySchedule(daySchIndexSelect).TSValue(firstTimeStep, hourSelect); + int countOfSame = 0; + + // count the number of times with that same value + for (int jdateOfYear = 1; jdateOfYear <= DaysInYear; ++jdateOfYear) { + int wkSch = state.dataScheduleMgr->Schedule(scheduleIndex).WeekSchedulePointer(jdateOfYear); + if (wkSch == weekSchIndexSelect) { // if same week schedule can short circuit rest of testing and increment counter + ++countOfSame; + } else { + int daySch = state.dataScheduleMgr->WeekSchedule(wkSch).DaySchedulePointer(dayOfWeek); + if (daySch == daySchIndexSelect) { // if same day schedule can short circuit rest of testing and increment counter + ++countOfSame; + } else { + Real64 valueAt = state.dataScheduleMgr->DaySchedule(daySch).TSValue(firstTimeStep, hourSelect); + if (valueAt == valueAtSelectTime) { + ++countOfSame; + } + } + } + } + + return std::make_tuple(valueAtSelectTime, countOfSame, monthName); +} + +void ZoneSpaceHeatBalanceData::updateTemperatures(EnergyPlusData &state, + bool const ShortenTimeStepSys, + bool const UseZoneTimeStepHistory, + Real64 const PriorTimeStep, + int const zoneNum, + int const spaceNum) +{ + assert(zoneNum > 0); + if (ShortenTimeStepSys) { + // timestep has just shifted from full zone timestep to a new shorter system timestep + // throw away last updates in corrector and rewind for resimulating smaller timestep + if (spaceNum == 0) { + if (state.dataHeatBal->Zone(zoneNum).SystemZoneNodeNumber > 0) { // roll back result for zone air node, + auto &zoneNode = state.dataLoopNodes->Node(state.dataHeatBal->Zone(zoneNum).SystemZoneNodeNumber); + zoneNode.Temp = this->XMAT[0]; + state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->XMAT[0]; + zoneNode.HumRat = this->WPrevZoneTS[0]; + zoneNode.Enthalpy = Psychrometrics::PsyHFnTdbW(this->XMAT[0], this->WPrevZoneTS[0]); + } + } else { + if (state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber > 0) { // roll back result for space air node, + auto &spaceNode = state.dataLoopNodes->Node(state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber); + spaceNode.Temp = this->XMAT[0]; + state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->XMAT[0]; + spaceNode.HumRat = this->WPrevZoneTS[0]; + spaceNode.Enthalpy = Psychrometrics::PsyHFnTdbW(this->XMAT[0], this->WPrevZoneTS[0]); + } + } + + if (state.dataHVACGlobal->NumOfSysTimeSteps != + state.dataHVACGlobal->NumOfSysTimeStepsLastZoneTimeStep) { // cannot reuse existing DS data, interpolate from zone time + + this->MAT = DownInterpolate4HistoryValues(PriorTimeStep, state.dataHVACGlobal->TimeStepSys, this->XMAT, this->DSXMAT); + this->ZoneAirHumRat = + DownInterpolate4HistoryValues(PriorTimeStep, state.dataHVACGlobal->TimeStepSys, this->WPrevZoneTS, this->DSWPrevZoneTS); + + if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { + if (state.dataRoomAirMod->IsZoneDV(zoneNum) || state.dataRoomAirMod->IsZoneUI(zoneNum)) { + + DownInterpolate4HistoryValues(PriorTimeStep, + state.dataHVACGlobal->TimeStepSys, + state.dataRoomAirMod->XMATFloor(zoneNum), + state.dataRoomAirMod->XM2TFloor(zoneNum), + state.dataRoomAirMod->XM3TFloor(zoneNum), + state.dataRoomAirMod->MATFloor(zoneNum), + state.dataRoomAirMod->DSXMATFloor(zoneNum), + state.dataRoomAirMod->DSXM2TFloor(zoneNum), + state.dataRoomAirMod->DSXM3TFloor(zoneNum), + state.dataRoomAirMod->DSXM4TFloor(zoneNum)); + DownInterpolate4HistoryValues(PriorTimeStep, + state.dataHVACGlobal->TimeStepSys, + state.dataRoomAirMod->XMATOC(zoneNum), + state.dataRoomAirMod->XM2TOC(zoneNum), + state.dataRoomAirMod->XM3TOC(zoneNum), + state.dataRoomAirMod->MATOC(zoneNum), + state.dataRoomAirMod->DSXMATOC(zoneNum), + state.dataRoomAirMod->DSXM2TOC(zoneNum), + state.dataRoomAirMod->DSXM3TOC(zoneNum), + state.dataRoomAirMod->DSXM4TOC(zoneNum)); + DownInterpolate4HistoryValues(PriorTimeStep, + state.dataHVACGlobal->TimeStepSys, + state.dataRoomAirMod->XMATMX(zoneNum), + state.dataRoomAirMod->XM2TMX(zoneNum), + state.dataRoomAirMod->XM3TMX(zoneNum), + state.dataRoomAirMod->MATMX(zoneNum), + state.dataRoomAirMod->DSXMATMX(zoneNum), + state.dataRoomAirMod->DSXM2TMX(zoneNum), + state.dataRoomAirMod->DSXM3TMX(zoneNum), + state.dataRoomAirMod->DSXM4TMX(zoneNum)); + } + if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { + for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { + auto &ThisRAFNNode(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode)); + DownInterpolate4HistoryValues(PriorTimeStep, + state.dataHVACGlobal->TimeStepSys, + ThisRAFNNode.AirTempX1, + ThisRAFNNode.AirTempX2, + ThisRAFNNode.AirTempX3, + ThisRAFNNode.AirTemp, + ThisRAFNNode.AirTempDSX1, + ThisRAFNNode.AirTempDSX2, + ThisRAFNNode.AirTempDSX3, + ThisRAFNNode.AirTempDSX4); + DownInterpolate4HistoryValues(PriorTimeStep, + state.dataHVACGlobal->TimeStepSys, + ThisRAFNNode.HumRatX1, + ThisRAFNNode.HumRatX2, + ThisRAFNNode.HumRatX3, + ThisRAFNNode.HumRat, + ThisRAFNNode.HumRatDSX1, + ThisRAFNNode.HumRatDSX2, + ThisRAFNNode.HumRatDSX3, + ThisRAFNNode.HumRatDSX4); + } + } + } + } else { // reuse history data in DS terms from last zone time step to preserve information that would be lost + // do nothing because DS history would have been pushed prior and should be ready + } + } + // now update the variables actually used in the balance equations. + if (UseZoneTimeStepHistory) { + this->ZTM = this->XMAT; + this->WPrevZoneTSTemp = this->WPrevZoneTS; + } else { // use down-stepped history + this->ZTM = this->DSXMAT; + this->WPrevZoneTSTemp = this->DSWPrevZoneTS; + } +} + +void ZoneSpaceHeatBalanceData::calcPredictedSystemLoad(EnergyPlusData &state, Real64 const RAFNFrac, int const zoneNum, int const spaceNum) +{ + // Calculate the predicted system load for a time step. + + assert(zoneNum > 0); + auto const &thisZone = state.dataHeatBal->Zone(zoneNum); + Real64 const thisTempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint(zoneNum); + Real64 const thisZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(zoneNum); + Real64 const thisZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(zoneNum); + + bool thisDeadBandOrSetBack = false; + Real64 ZoneSetPoint = 0.0; + Real64 totalLoad = 0.0; + Real64 LoadToHeatingSetPoint = 0.0; + Real64 LoadToCoolingSetPoint = 0.0; + + switch (state.dataHeatBalFanSys->TempControlType(zoneNum)) { + case DataHVACGlobals::ThermostatType::Uncontrolled: + // Uncontrolled Zone + LoadToHeatingSetPoint = 0.0; + LoadToCoolingSetPoint = 0.0; + totalLoad = 0.0; + break; + case DataHVACGlobals::ThermostatType::SingleHeating: + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + LoadToHeatingSetPoint = (this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd); + break; + } + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepZnLd == 0.0) { // B=0 + LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; + } else { + Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); + LoadToHeatingSetPoint = + this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + } + break; + } + case DataHeatBalance::SolutionAlgo::EulerMethod: { + LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + + this->TempDepZnLd * (thisTempZoneThermostatSetPoint) - this->TempIndZnLd; + break; + } + default: { + assert(false); + } + } + if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; + totalLoad = LoadToHeatingSetPoint; + ZoneSetPoint = thisTempZoneThermostatSetPoint; + LoadToCoolingSetPoint = LoadToHeatingSetPoint; + // for consistency with the other cases, use LE instead of LT and don't subtract 1.0 Watt as a way of pushing the zero load + // case over the threshold + if ((totalLoad) <= 0.0) thisDeadBandOrSetBack = true; + + break; + case DataHVACGlobals::ThermostatType::SingleCooling: + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + LoadToCoolingSetPoint = this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; + break; + } + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepZnLd == 0.0) { // B=0 + LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; + } else { + Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); + LoadToCoolingSetPoint = + this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + } + break; + } + case DataHeatBalance::SolutionAlgo::EulerMethod: { + LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + + this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; + break; + } + default: { + assert(false); + } + } + if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; + if (thisZone.HasAdjustedReturnTempByITE && !(state.dataGlobal->BeginSimFlag)) { + LoadToCoolingSetPoint = this->TempDepZnLd * thisZone.AdjustedReturnTempByITE - this->TempIndZnLd; + } + totalLoad = LoadToCoolingSetPoint; + ZoneSetPoint = thisTempZoneThermostatSetPoint; + LoadToHeatingSetPoint = LoadToCoolingSetPoint; + // for consistency with the other cases, use GE instead of GT and don't add 1.0 Watt as a way of pushing the zero load + // case over the threshold + if ((totalLoad) >= 0.0) thisDeadBandOrSetBack = true; + break; + case DataHVACGlobals::ThermostatType::SingleHeatCool: + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + LoadToHeatingSetPoint = (this->TempDepZnLd * (thisTempZoneThermostatSetPoint) - this->TempIndZnLd); + LoadToCoolingSetPoint = (this->TempDepZnLd * (thisTempZoneThermostatSetPoint) - this->TempIndZnLd); + break; + } + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepZnLd == 0.0) { // B=0 + LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; + LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; + } else { + Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); + LoadToHeatingSetPoint = + this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + LoadToCoolingSetPoint = + this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + } + break; + } + case DataHeatBalance::SolutionAlgo::EulerMethod: { + LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + + this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; + LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + + this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; + break; + } + default: { + assert(false); + } + } + ZoneSetPoint = thisTempZoneThermostatSetPoint; + if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; + if (RAFNFrac > 0.0) LoadToCoolingSetPoint = LoadToCoolingSetPoint / RAFNFrac; + + if (thisZone.HasAdjustedReturnTempByITE && !(state.dataGlobal->BeginSimFlag)) { + LoadToCoolingSetPoint = this->TempDepZnLd * thisZone.AdjustedReturnTempByITE - this->TempIndZnLd; + } + + // Note that LoadToHeatingSetPoint is generally not equal to LoadToCoolingSetPoint + // when the heating and cooling set-points are equal if the zone is unmixed, + // e.g. displacement ventilation or UFAD, since the stratification is generally not the same in heating and cooling modes + + // Possible combinations: + // 1/ LoadToHeatingSetPoint > 0 & LoadToCoolingSetPoint > 0 --> Heating required + // 2/ LoadToHeatingSetPoint > LoadToCoolingSetPoint --> Possible in the unmixed case but should be trapped + // as a poor choice of set-points + // 3/ LoadToHeatingSetPoint < 0 & LoadToCoolingSetPoint < 0 --> Cooling Required + // 4/ LoadToHeatingSetPoint <=0 & LoadToCoolingSetPoint >=0 --> Dead Band Operation ! includes zero load cases + // First trap bad set-points + if (LoadToHeatingSetPoint > LoadToCoolingSetPoint) { + ShowSevereError( + state, + "DataHVACGlobals::ThermostatType::SingleHeatCool: Effective heating set-point higher than effective cooling set-point - use " + "DualSetPointWithDeadBand if using unmixed air model"); + ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); + ShowContinueError(state, + format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); + ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); + ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); + ShowContinueError(state, format("Zone ThermostatSetPoint={:.2R}", thisTempZoneThermostatSetPoint)); + ShowFatalError(state, "Program terminates due to above conditions."); + } + + if (LoadToHeatingSetPoint > 0.0 && LoadToCoolingSetPoint > 0.0) { + totalLoad = LoadToHeatingSetPoint; + } else if (LoadToHeatingSetPoint < 0.0 && LoadToCoolingSetPoint < 0.0) { + totalLoad = LoadToCoolingSetPoint; + } else if (LoadToHeatingSetPoint <= 0.0 && LoadToCoolingSetPoint >= 0.0) { // deadband includes zero loads + totalLoad = 0.0; + if (thisZone.SystemZoneNodeNumber > 0) { + ZoneSetPoint = state.dataLoopNodes->Node(thisZone.SystemZoneNodeNumber).Temp; + ZoneSetPoint = max(ZoneSetPoint, thisZoneThermostatSetPointLo); // trap out of deadband + ZoneSetPoint = min(ZoneSetPoint, thisZoneThermostatSetPointHi); // trap out of deadband + } + thisDeadBandOrSetBack = true; + } else { // this should never occur! + ShowSevereError(state, + "SingleHeatCoolSetPoint: Unanticipated combination of heating and cooling loads - report to EnergyPlus Development Team"); + ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); + ShowContinueError(state, + format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); + ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); + ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); + ShowContinueError(state, format("Zone ThermostatSetPoint={:.2R}", thisTempZoneThermostatSetPoint)); + ShowFatalError(state, "Program terminates due to above conditions."); + } + break; + case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + LoadToHeatingSetPoint = (this->TempDepZnLd * (thisZoneThermostatSetPointLo) - this->TempIndZnLd); + LoadToCoolingSetPoint = (this->TempDepZnLd * (thisZoneThermostatSetPointHi) - this->TempIndZnLd); + break; + } + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepZnLd == 0.0) { // B=0 + LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) - this->TempIndZnLd; + LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) - this->TempIndZnLd; + } else { + Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); + LoadToHeatingSetPoint = + this->TempDepZnLd * (thisZoneThermostatSetPointLo - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + LoadToCoolingSetPoint = + this->TempDepZnLd * (thisZoneThermostatSetPointHi - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + } + break; + } + case DataHeatBalance::SolutionAlgo::EulerMethod: { + LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) + + this->TempDepZnLd * thisZoneThermostatSetPointLo - this->TempIndZnLd; + LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) + + this->TempDepZnLd * thisZoneThermostatSetPointHi - this->TempIndZnLd; + break; + } + default: { + assert(false); + } + } + if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; + if (RAFNFrac > 0.0) LoadToCoolingSetPoint = LoadToCoolingSetPoint / RAFNFrac; + + if (thisZone.HasAdjustedReturnTempByITE && !(state.dataGlobal->BeginSimFlag)) { + LoadToCoolingSetPoint = this->TempDepZnLd * thisZone.AdjustedReturnTempByITE - this->TempIndZnLd; + } + + // Possible combinations: + // 1/ LoadToHeatingSetPoint > 0 & LoadToCoolingSetPoint > 0 --> Heating required + // 2/ LoadToHeatingSetPoint > LoadToCoolingSetPoint --> Possible in the unmixed case but should be trapped + // as a poor choice of set-points + // 3/ LoadToHeatingSetPoint < 0 & LoadToCoolingSetPoint < 0 --> Cooling Required + // 4/ LoadToHeatingSetPoint <=0 & LoadToCoolingSetPoint >=0 --> Dead Band Operation - includes zero load cases + // First trap bad set-points + if (LoadToHeatingSetPoint > LoadToCoolingSetPoint) { + ShowSevereError(state, + "DualSetPointWithDeadBand: Effective heating set-point higher than effective cooling set-point - increase " + "deadband if using unmixed air model"); + ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); + ShowContinueError(state, + format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); + ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); + ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); + ShowContinueError(state, format("Zone Heating ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointLo)); + ShowContinueError(state, format("Zone Cooling ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointHi)); + ShowFatalError(state, "Program terminates due to above conditions."); + } + + if (LoadToHeatingSetPoint > 0.0 && LoadToCoolingSetPoint > 0.0) { + totalLoad = LoadToHeatingSetPoint; + ZoneSetPoint = thisZoneThermostatSetPointLo; + } else if (LoadToHeatingSetPoint < 0.0 && LoadToCoolingSetPoint < 0.0) { + totalLoad = LoadToCoolingSetPoint; + ZoneSetPoint = thisZoneThermostatSetPointHi; + } else if (LoadToHeatingSetPoint <= 0.0 && LoadToCoolingSetPoint >= 0.0) { // deadband includes zero loads + // this turns out to cause instabilities sometimes? that lead to setpoint errors if predictor is off. + totalLoad = 0.0; + if (thisZone.SystemZoneNodeNumber > 0) { + ZoneSetPoint = state.dataLoopNodes->Node(thisZone.SystemZoneNodeNumber).Temp; + ZoneSetPoint = max(ZoneSetPoint, thisZoneThermostatSetPointLo); // trap out of deadband + ZoneSetPoint = min(ZoneSetPoint, thisZoneThermostatSetPointHi); // trap out of deadband + } + thisDeadBandOrSetBack = true; + } else { // this should never occur! + ShowSevereError( + state, "DualSetPointWithDeadBand: Unanticipated combination of heating and cooling loads - report to EnergyPlus Development Team"); + ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); + ShowContinueError(state, + format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); + ShowContinueError(state, format("Zone Heating Set-point={:.2R}", thisZoneThermostatSetPointLo)); + ShowContinueError(state, format("Zone Cooling Set-point={:.2R}", thisZoneThermostatSetPointHi)); + ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); + ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); + ShowContinueError(state, format("Zone ThermostatSetPoint={:.2R}", thisTempZoneThermostatSetPoint)); + + ShowFatalError(state, "Program terminates due to above conditions."); + } + break; + default: + break; + } + + int systemNodeNumber = 0; + int stageNum = 0; + if (spaceNum > 0) { + systemNodeNumber = state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber; + stageNum = state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).StageNum; + assert(stageNum == state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).StageNum); + } else { + systemNodeNumber = thisZone.SystemZoneNodeNumber; + stageNum = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).StageNum; + } + // Staged control zone + if (state.dataZoneTempPredictorCorrector->NumStageCtrZone > 0) { + if (state.dataZoneCtrls->StageZoneLogic(zoneNum)) { + if (stageNum == 0) { // No load + LoadToHeatingSetPoint = 0.0; + LoadToCoolingSetPoint = 0.0; + totalLoad = 0.0; + if (systemNodeNumber > 0) { + ZoneSetPoint = state.dataLoopNodes->Node(systemNodeNumber).Temp; + ZoneSetPoint = max(ZoneSetPoint, thisZoneThermostatSetPointLo); // trap out of deadband + ZoneSetPoint = min(ZoneSetPoint, thisZoneThermostatSetPointHi); // trap out of deadband + } + thisDeadBandOrSetBack = true; + } else if (stageNum < 0) { // Cooling load + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + LoadToCoolingSetPoint = (this->TempDepZnLd * (thisZoneThermostatSetPointHi) - this->TempIndZnLd); + break; + } + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepZnLd == 0.0) { // B=0 + LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) - this->TempIndZnLd; + } else { + Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); + LoadToCoolingSetPoint = + this->TempDepZnLd * (thisZoneThermostatSetPointHi - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + } + break; + } + case DataHeatBalance::SolutionAlgo::EulerMethod: { + LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) + + this->TempDepZnLd * thisZoneThermostatSetPointHi - this->TempIndZnLd; + break; + } + default: { + assert(false); + } + } + totalLoad = LoadToCoolingSetPoint; + ZoneSetPoint = thisZoneThermostatSetPointHi; + LoadToHeatingSetPoint = LoadToCoolingSetPoint; + if ((totalLoad) >= 0.0) thisDeadBandOrSetBack = true; + } else { // Heating load + switch (state.dataHeatBal->ZoneAirSolutionAlgo) { + case DataHeatBalance::SolutionAlgo::ThirdOrder: { + LoadToHeatingSetPoint = (this->TempDepZnLd * thisZoneThermostatSetPointLo - this->TempIndZnLd); + break; + } + case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { + if (this->TempDepZnLd == 0.0) { // B=0 + LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) - this->TempIndZnLd; + } else { + Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); + LoadToHeatingSetPoint = + this->TempDepZnLd * (thisZoneThermostatSetPointLo - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; + } + break; + } + case DataHeatBalance::SolutionAlgo::EulerMethod: { + LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) + + this->TempDepZnLd * (thisZoneThermostatSetPointLo) - this->TempIndZnLd; + break; + } + default: { + assert(false); + } + } + totalLoad = LoadToHeatingSetPoint; + ZoneSetPoint = thisZoneThermostatSetPointLo; + LoadToCoolingSetPoint = LoadToHeatingSetPoint; + if ((totalLoad) <= 0.0) thisDeadBandOrSetBack = true; + } + } + } + + // If the ZoneNodeNum has been set for a Controlled Zone, then the zone setpoint is placed on the node. + if (thisZone.SystemZoneNodeNumber > 0) { + state.dataLoopNodes->Node(thisZone.SystemZoneNodeNumber).TempSetPoint = ZoneSetPoint; + } + + state.dataZoneEnergyDemand->Setback(zoneNum) = (ZoneSetPoint > this->ZoneSetPointLast); + + this->ZoneSetPointLast = ZoneSetPoint; + state.dataHeatBalFanSys->TempZoneThermostatSetPoint(zoneNum) = ZoneSetPoint; // needed to fix Issue # 5048 + state.dataZoneEnergyDemand->DeadBandOrSetback(zoneNum) = thisDeadBandOrSetBack; + state.dataZoneEnergyDemand->CurDeadBandOrSetback(zoneNum) = thisDeadBandOrSetBack; + + // Apply the Zone Multiplier and Load Correction factor as needed + if (spaceNum > 0) { + state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).reportSensibleLoadsZoneMultiplier( + state, zoneNum, totalLoad, LoadToHeatingSetPoint, LoadToCoolingSetPoint); + } else { + state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).reportSensibleLoadsZoneMultiplier( + state, zoneNum, totalLoad, LoadToHeatingSetPoint, LoadToCoolingSetPoint); + } +} +} // namespace EnergyPlus::ZoneTempPredictorCorrector diff --git a/tst/EnergyPlus/unit/AirLoopHVACDOAS.unit.cc b/tst/EnergyPlus/unit/AirLoopHVACDOAS.unit.cc index da1bf6d43a9..618be42bb65 100644 --- a/tst/EnergyPlus/unit/AirLoopHVACDOAS.unit.cc +++ b/tst/EnergyPlus/unit/AirLoopHVACDOAS.unit.cc @@ -1622,7 +1622,7 @@ TEST_F(EnergyPlusFixture, AirLoopHVACDOASTest) " ACTIVITY_SCH, !- Activity Level Schedule Name", " , !- Carbon Dioxide Generation Rate {m3/s-W}", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " WORK_EFF_SCH, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -1644,7 +1644,7 @@ TEST_F(EnergyPlusFixture, AirLoopHVACDOASTest) " ACTIVITY_SCH, !- Activity Level Schedule Name", " , !- Carbon Dioxide Generation Rate {m3/s-W}", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " WORK_EFF_SCH, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -1666,7 +1666,7 @@ TEST_F(EnergyPlusFixture, AirLoopHVACDOASTest) " ACTIVITY_SCH, !- Activity Level Schedule Name", " , !- Carbon Dioxide Generation Rate {m3/s-W}", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " WORK_EFF_SCH, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -1688,7 +1688,7 @@ TEST_F(EnergyPlusFixture, AirLoopHVACDOASTest) " ACTIVITY_SCH, !- Activity Level Schedule Name", " , !- Carbon Dioxide Generation Rate {m3/s-W}", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " WORK_EFF_SCH, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -1710,7 +1710,7 @@ TEST_F(EnergyPlusFixture, AirLoopHVACDOASTest) " ACTIVITY_SCH, !- Activity Level Schedule Name", " , !- Carbon Dioxide Generation Rate {m3/s-W}", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " WORK_EFF_SCH, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -5975,7 +5975,7 @@ TEST_F(EnergyPlusFixture, AirLoopHVACDOAS_ReportVariableResetTest) " ACTIVITY_SCH, !- Activity Level Schedule Name", " , !- Carbon Dioxide Generation Rate {m3/s-W}", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " WORK_EFF_SCH, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -5997,7 +5997,7 @@ TEST_F(EnergyPlusFixture, AirLoopHVACDOAS_ReportVariableResetTest) " ACTIVITY_SCH, !- Activity Level Schedule Name", " , !- Carbon Dioxide Generation Rate {m3/s-W}", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " WORK_EFF_SCH, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -6019,7 +6019,7 @@ TEST_F(EnergyPlusFixture, AirLoopHVACDOAS_ReportVariableResetTest) " ACTIVITY_SCH, !- Activity Level Schedule Name", " , !- Carbon Dioxide Generation Rate {m3/s-W}", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " WORK_EFF_SCH, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -6041,7 +6041,7 @@ TEST_F(EnergyPlusFixture, AirLoopHVACDOAS_ReportVariableResetTest) " ACTIVITY_SCH, !- Activity Level Schedule Name", " , !- Carbon Dioxide Generation Rate {m3/s-W}", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " WORK_EFF_SCH, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -6063,7 +6063,7 @@ TEST_F(EnergyPlusFixture, AirLoopHVACDOAS_ReportVariableResetTest) " ACTIVITY_SCH, !- Activity Level Schedule Name", " , !- Carbon Dioxide Generation Rate {m3/s-W}", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " WORK_EFF_SCH, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", diff --git a/tst/EnergyPlus/unit/AirflowNetworkComponents.unit.cc b/tst/EnergyPlus/unit/AirflowNetworkComponents.unit.cc index ed73403d9c6..c834fa290a8 100644 --- a/tst/EnergyPlus/unit/AirflowNetworkComponents.unit.cc +++ b/tst/EnergyPlus/unit/AirflowNetworkComponents.unit.cc @@ -3484,7 +3484,7 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_TestFanModel) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", diff --git a/tst/EnergyPlus/unit/AirflowNetworkHVAC.unit.cc b/tst/EnergyPlus/unit/AirflowNetworkHVAC.unit.cc index ffba57db953..b524d37dcff 100644 --- a/tst/EnergyPlus/unit/AirflowNetworkHVAC.unit.cc +++ b/tst/EnergyPlus/unit/AirflowNetworkHVAC.unit.cc @@ -3717,7 +3717,7 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_MultiAirLoopTest) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -3739,7 +3739,7 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_MultiAirLoopTest) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -3761,7 +3761,7 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_MultiAirLoopTest) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -8999,7 +8999,7 @@ TEST_F(EnergyPlusFixture, DISABLED_AirLoopNumTest) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -9021,7 +9021,7 @@ TEST_F(EnergyPlusFixture, DISABLED_AirLoopNumTest) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -9043,7 +9043,7 @@ TEST_F(EnergyPlusFixture, DISABLED_AirLoopNumTest) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -13397,7 +13397,7 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_TestIntraZoneLinkageZoneIndex) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -15263,7 +15263,7 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_DuctSizingTest) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", diff --git a/tst/EnergyPlus/unit/ChillerAbsorption.unit.cc b/tst/EnergyPlus/unit/ChillerAbsorption.unit.cc index d5077dcee8d..0ad6a36b24b 100644 --- a/tst/EnergyPlus/unit/ChillerAbsorption.unit.cc +++ b/tst/EnergyPlus/unit/ChillerAbsorption.unit.cc @@ -406,7 +406,7 @@ TEST_F(EnergyPlusFixture, ChillerAbsorption_Calc) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", diff --git a/tst/EnergyPlus/unit/DataHeatBalance.unit.cc b/tst/EnergyPlus/unit/DataHeatBalance.unit.cc index 20629c80f27..5dc8f4f0946 100644 --- a/tst/EnergyPlus/unit/DataHeatBalance.unit.cc +++ b/tst/EnergyPlus/unit/DataHeatBalance.unit.cc @@ -462,7 +462,7 @@ TEST_F(EnergyPlusFixture, DataHeatBalance_CheckConstructLayers) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", diff --git a/tst/EnergyPlus/unit/HVACFourPipeBeam.unit.cc b/tst/EnergyPlus/unit/HVACFourPipeBeam.unit.cc index 9f259cbfba8..196eb196669 100644 --- a/tst/EnergyPlus/unit/HVACFourPipeBeam.unit.cc +++ b/tst/EnergyPlus/unit/HVACFourPipeBeam.unit.cc @@ -585,7 +585,7 @@ TEST_F(EnergyPlusFixture, Beam_sizeandSimulateOneZone) " ACTIVITY_SCH, !- Activity Level Schedule Name", " , !- Carbon Dioxide Generation Rate {m3/s-W}", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " WORK_EFF_SCH, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -2164,7 +2164,7 @@ TEST_F(EnergyPlusFixture, Beam_fatalWhenSysSizingOff) " ACTIVITY_SCH, !- Activity Level Schedule Name", " , !- Carbon Dioxide Generation Rate {m3/s-W}", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " WORK_EFF_SCH, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -3658,7 +3658,7 @@ TEST_F(EnergyPlusFixture, Beam_sizeandSimulateHighOA) " ACTIVITY_SCH, !- Activity Level Schedule Name", " , !- Carbon Dioxide Generation Rate {m3/s-W}", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " WORK_EFF_SCH, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", diff --git a/tst/EnergyPlus/unit/HeatBalanceKivaManager.unit.cc b/tst/EnergyPlus/unit/HeatBalanceKivaManager.unit.cc index ae8926c7d5e..e9acfb57713 100644 --- a/tst/EnergyPlus/unit/HeatBalanceKivaManager.unit.cc +++ b/tst/EnergyPlus/unit/HeatBalanceKivaManager.unit.cc @@ -497,7 +497,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceKiva_setupKivaInstances_ThermalComfort) " 3.82e-08, !- Carbon Dioxide Generation Rate", " Yes, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface NameAngle Factor List Name", " Work Eff Sched, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", diff --git a/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc b/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc index d3d910ee570..c7aa7b44c56 100644 --- a/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc +++ b/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc @@ -1069,7 +1069,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceSurfaceManager_TestSurfTempCalcHeatBalanceI " 3.82e-08, !- Carbon Dioxide Generation Rate", " Yes, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface NameAngle Factor List Name", " Work Eff Sched, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", diff --git a/tst/EnergyPlus/unit/InternalHeatGains.unit.cc b/tst/EnergyPlus/unit/InternalHeatGains.unit.cc index 7c2eaa82e12..2ec75f14687 100644 --- a/tst/EnergyPlus/unit/InternalHeatGains.unit.cc +++ b/tst/EnergyPlus/unit/InternalHeatGains.unit.cc @@ -273,7 +273,7 @@ TEST_F(EnergyPlusFixture, InternalHeatGains_AllowBlankFieldsForAdaptiveComfortMo "Activity Sch, !- Activity Level Schedule Name", "3.82E-8, !- Carbon Dioxide Generation Rate{ m3 / s - W }", ", !- Enable ASHRAE 55 Comfort Warnings", - "zoneaveraged, !- Mean Radiant Temperature Calculation Type", + "EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", ", !- Surface Name / Angle Factor List Name", ", !- Work Efficiency Schedule Name", ", !- Clothing Insulation Calculation Method", @@ -2579,7 +2579,7 @@ TEST_F(EnergyPlusFixture, InternalHeatGains_GetHeatColdStressTemp) " Schedule1, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate{ m3 / s - W }", " No, !- Enable ASHRAE 55 Comfort Warnings", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " , !- Work Efficiency Schedule Name", " , !- Clothing Insulation Calculation Method", diff --git a/tst/EnergyPlus/unit/OASystemHWPreheatCoil.unit.cc b/tst/EnergyPlus/unit/OASystemHWPreheatCoil.unit.cc index 15449d0435b..49930168d50 100644 --- a/tst/EnergyPlus/unit/OASystemHWPreheatCoil.unit.cc +++ b/tst/EnergyPlus/unit/OASystemHWPreheatCoil.unit.cc @@ -403,7 +403,7 @@ TEST_F(EnergyPlusFixture, OASystem_HotWaterPreheatCoilScheduledOffSim) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -1394,7 +1394,7 @@ TEST_F(EnergyPlusFixture, OASystem_HotWaterPreheatCoilScheduledOnSim) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", diff --git a/tst/EnergyPlus/unit/OutputReportTabular.unit.cc b/tst/EnergyPlus/unit/OutputReportTabular.unit.cc index 48f0f58ccf9..2ccb6068393 100644 --- a/tst/EnergyPlus/unit/OutputReportTabular.unit.cc +++ b/tst/EnergyPlus/unit/OutputReportTabular.unit.cc @@ -10133,7 +10133,7 @@ TEST_F(EnergyPlusFixture, OutputReportTabularTest_WarningMultiplePeopleObj) "ACTIVITY_SCH, !- Activity Level Schedule Name", ", !- Carbon Dioxide Generation Rate {m3/s-W}", "No, !- Enable ASHRAE 55 Comfort Warnings", - "ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + "EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", ", !- Surface Name/Angle Factor List Name", ", !- Work Efficiency Schedule Name", ", !- Clothing Insulation Calculation Method", @@ -10164,7 +10164,7 @@ TEST_F(EnergyPlusFixture, OutputReportTabularTest_WarningMultiplePeopleObj) "ACTIVITY_SCH, !- Activity Level Schedule Name", ", !- Carbon Dioxide Generation Rate {m3/s-W}", "No, !- Enable ASHRAE 55 Comfort Warnings", - "ZoneAveraged, !- Mean Radiant Temperature Calculation Type", + "EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", ", !- Surface Name/Angle Factor List Name", ", !- Work Efficiency Schedule Name", ", !- Clothing Insulation Calculation Method", diff --git a/tst/EnergyPlus/unit/ThermalComfort.unit.cc b/tst/EnergyPlus/unit/ThermalComfort.unit.cc index 3aecea23a40..b8dc82e68d5 100644 --- a/tst/EnergyPlus/unit/ThermalComfort.unit.cc +++ b/tst/EnergyPlus/unit/ThermalComfort.unit.cc @@ -214,7 +214,7 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcThermalComfortFanger) " Activity Schedule, !- Activity Level Schedule Name ", " , !- Carbon Dioxide Generation Rate {m3/s-W} ", " Yes, !- Enable ASHRAE 55 Comfort Warnings ", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type ", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type ", " , !- Surface Name/Angle Factor List Name ", " Work efficiency, !- Work Efficiency Schedule Name ", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -1007,7 +1007,7 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcThermalComfortASH55) state->dataHeatBal->People(1).CO2RateFactor = 3.82e-8; state->dataHeatBal->People(1).Show55Warning = true; state->dataHeatBal->People(1).Pierce = true; - state->dataHeatBal->People(1).MRTCalcType = DataHeatBalance::CalcMRT::ZoneAveraged; + state->dataHeatBal->People(1).MRTCalcType = DataHeatBalance::CalcMRT::EnclosureAveraged; state->dataHeatBal->People(1).WorkEffPtr = 0; state->dataHeatBal->People(1).clothingType = ClothingType::InsulationSchedule; @@ -1108,7 +1108,7 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcThermalComfortFanger_Correct_TimeSt " Activity Schedule, !- Activity Level Schedule Name ", " , !- Carbon Dioxide Generation Rate {m3/s-W} ", " Yes, !- Enable ASHRAE 55 Comfort Warnings ", - " ZoneAveraged, !- Mean Radiant Temperature Calculation Type ", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type ", " , !- Surface Name/Angle Factor List Name ", " Work efficiency, !- Work Efficiency Schedule Name ", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", @@ -1662,7 +1662,6 @@ TEST_F(EnergyPlusFixture, ThermalComfort_GetAngleFactorListTest) std::string const idf_objects = delimited_string({ "ComfortViewFactorAngles, ", " Angle Factor Lost, !- Name ", - " InTheZone, !- Zone Name ", " InTheZone:Wall1, !- Surface 1 Name ", " 0.01, !- Angle Factor 1 ", " InTheZone:Wall2, !- Surface 2 Name ", @@ -1892,11 +1891,14 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcSurfaceWeightedMRT_Enclosure_Based) state->dataThermalComforts->AngleFactorList.allocate(1); state->dataSurface->TotSurfaces = 12; state->dataGlobal->NumOfZones = 2; + state->dataGlobal->numSpaces = 2; + state->dataHeatBalSurf->SurfInsideTempHist.allocate(1); state->dataHeatBalSurf->SurfInsideTempHist(1).allocate(state->dataSurface->TotSurfaces); state->dataSurface->Surface.allocate(state->dataSurface->TotSurfaces); state->dataConstruction->Construct.allocate(state->dataSurface->TotSurfaces); state->dataHeatBal->Zone.allocate(state->dataGlobal->NumOfZones); + state->dataHeatBal->space.allocate(state->dataGlobal->numSpaces); state->dataSurface->Surface(1).Area = 10.0; state->dataSurface->Surface(2).Area = 10.0; @@ -1951,6 +1953,12 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcSurfaceWeightedMRT_Enclosure_Based) state->dataSurface->Surface(4).Zone = 1; state->dataSurface->Surface(5).Zone = 1; state->dataSurface->Surface(6).Zone = 1; + state->dataSurface->Surface(1).spaceNum = 1; + state->dataSurface->Surface(2).spaceNum = 1; + state->dataSurface->Surface(3).spaceNum = 1; + state->dataSurface->Surface(4).spaceNum = 1; + state->dataSurface->Surface(5).spaceNum = 1; + state->dataSurface->Surface(6).spaceNum = 1; state->dataSurface->Surface(7).Zone = 2; state->dataSurface->Surface(8).Zone = 2; @@ -1958,6 +1966,12 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcSurfaceWeightedMRT_Enclosure_Based) state->dataSurface->Surface(10).Zone = 2; state->dataSurface->Surface(11).Zone = 2; state->dataSurface->Surface(12).Zone = 2; + state->dataSurface->Surface(7).spaceNum = 2; + state->dataSurface->Surface(8).spaceNum = 2; + state->dataSurface->Surface(9).spaceNum = 2; + state->dataSurface->Surface(10).spaceNum = 2; + state->dataSurface->Surface(11).spaceNum = 2; + state->dataSurface->Surface(12).spaceNum = 2; state->dataHeatBal->Zone(1).spaceIndexes.allocate(1); state->dataHeatBal->Zone(1).spaceIndexes[0] = 1; diff --git a/tst/EnergyPlus/unit/UnitHeater.unit.cc b/tst/EnergyPlus/unit/UnitHeater.unit.cc index 27802ebe8e9..cf2098003bd 100644 --- a/tst/EnergyPlus/unit/UnitHeater.unit.cc +++ b/tst/EnergyPlus/unit/UnitHeater.unit.cc @@ -576,7 +576,7 @@ TEST_F(EnergyPlusFixture, UnitHeater_HWHeatingCoilUAAutoSizingTest) " Activity Sch, !- Activity Level Schedule Name", " 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W}", " , !- Enable ASHRAE 55 Comfort Warnings", - " zoneaveraged, !- Mean Radiant Temperature Calculation Type", + " EnclosureAveraged, !- Mean Radiant Temperature Calculation Type", " , !- Surface Name/Angle Factor List Name", " Work Eff Sch, !- Work Efficiency Schedule Name", " ClothingInsulationSchedule, !- Clothing Insulation Calculation Method", From cbfa45d68ed7afb5a6e3ebde8286460fb369356c Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Tue, 26 Sep 2023 15:23:24 -0500 Subject: [PATCH 05/26] EnclosureAveraged and delete ZoneName --- ...ZoneEvapCooler_ReportPeriodPowerOutage.idf | 2 +- ...er_ReportPeriodPowerOutage_naturalVent.idf | 2 +- ...Uncontrolled_Win_ASH55_Thermal_Comfort.idf | 2 +- ...ZoneUncontrolled_Win_ResilienceReports.idf | 2 +- ..._Win_ResilienceReports_ReportingPeriod.idf | 4 +- ...lienceReports_ReportingPeriod_AllTable.idf | 4 +- testfiles/2ZoneDataCenterHVAC_wEconomizer.idf | 4 +- ...neDataCenterHVAC_wEconomizer_ClassA1A2.idf | 4 +- testfiles/5ZoneAirCooledWithSpaces.idf | 2 +- testfiles/5ZoneAirCooledWithSpacesHVAC.idf | 2 +- testfiles/5ZoneCostEst.idf | 10 +- .../5ZoneVAV-ChilledWaterStorage-Mixed.idf | 10 +- ...AV-ChilledWaterStorage-Mixed_DCV_MaxZd.idf | 10 +- ...hilledWaterStorage-Mixed_DCV_MultiPath.idf | 10 +- ...ZoneVAV-ChilledWaterStorage-Stratified.idf | 10 +- testfiles/5ZoneWaterSystems.idf | 10 +- testfiles/5ZoneWaterSystems_NoSitePrec.idf | 10 +- .../ASHRAE901_Hospital_STD2019_Denver.idf | 110 ++++----- .../ASHRAE901_HotelLarge_STD2019_Denver.idf | 36 +-- .../ASHRAE901_OfficeLarge_STD2019_Denver.idf | 32 +-- ..._OfficeLarge_STD2019_Denver_Chiller205.idf | 32 +-- ...rge_STD2019_Denver_Chiller205_Detailed.idf | 32 +-- ..._OfficeLarge_STD2019_Denver_ChillerEIR.idf | 32 +-- .../ASHRAE901_OfficeMedium_STD2019_Denver.idf | 30 +-- ...01_OutPatientHealthCare_STD2019_Denver.idf | 118 ++++----- ...E901_RestaurantFastFood_STD2019_Denver.idf | 4 +- ...AE901_RestaurantSitDown_STD2019_Denver.idf | 4 +- ...RAE901_RetailStandalone_STD2019_Denver.idf | 10 +- ...HRAE901_RetailStripmall_STD2019_Denver.idf | 20 +- ...ASHRAE901_SchoolPrimary_STD2019_Denver.idf | 46 ++-- ...HRAE901_SchoolSecondary_STD2019_Denver.idf | 84 +++---- testfiles/ASIHPMixedTank.idf | 6 +- testfiles/AbsorptionChiller.idf | 6 +- testfiles/AirCooledElectricChiller.idf | 6 +- ...ults_RefBldgLargeOfficeNew2004_Chicago.idf | 32 +-- testfiles/AirflowNetwork3zVent.idf | 6 +- testfiles/AirflowNetwork3zVentAutoWPC.idf | 6 +- ...rflowNetworkOccupantVentilationControl.idf | 6 +- ...flowNetwork_MULTIZONE_House_DuctSizing.idf | 2 +- testfiles/AirflowNetwork_MultiAirLoops.idf | 6 +- testfiles/AirflowNetwork_MultiZone_House.idf | 2 +- ...irflowNetwork_MultiZone_House_FanModel.idf | 2 +- ...etwork_MultiZone_House_OvercoolDehumid.idf | 2 +- ...irflowNetwork_MultiZone_House_TwoSpeed.idf | 2 +- .../AirflowNetwork_MultiZone_LocalNode.idf | 2 +- .../AirflowNetwork_MultiZone_SmallOffice.idf | 6 +- ...MultiZone_SmallOffice_CoilHXAssistedDX.idf | 6 +- ...rk_MultiZone_SmallOffice_GenericContam.idf | 6 +- ...MultiZone_SmallOffice_HeatRecoveryHXSL.idf | 6 +- ...rflowNetwork_MultiZone_SmallOffice_VAV.idf | 6 +- ...lowNetwork_Multizone_HorizontalOpening.idf | 12 +- testfiles/AirflowNetwork_PressureControl.idf | 6 +- testfiles/AirflowNetwork_Simple_House.idf | 2 +- .../AirflowNetwork_Simple_SmallOffice.idf | 6 +- .../AirflowWindowsAndBetweenGlassBlinds.idf | 6 +- .../AirflowWindowsAndBetweenGlassShades.idf | 6 +- testfiles/BaseBoardElectric.idf | 6 +- testfiles/CVRhMinHum.idf | 6 +- ...lMRT-RefBldgLargeOfficeNew2004_Chicago.idf | 32 +-- testfiles/ChangeoverBypassVAV.idf | 6 +- testfiles/ChangeoverBypassVAV_AirToAir.idf | 6 +- .../ChangeoverBypassVAV_AirToAirHeatPump.idf | 6 +- testfiles/ChangeoverBypassVAV_MaxTemp.idf | 6 +- ...urve_RefBldgLargeOfficeNew2004_Chicago.idf | 32 +-- .../CmplxGlz_Daylighting_SouthVB45deg.idf | 2 +- ...lxGlz_Daylighting_SouthVerticalVB45deg.idf | 2 +- testfiles/CoilWaterDesuperheating.idf | 6 +- testfiles/CoilWaterDesuperheatingUnitary.idf | 6 +- .../CoilWaterDesuperheatingUnitaryCoilDX.idf | 6 +- testfiles/CompSetPtControl.idf | 6 +- .../CondFD1ZonePurchAirAutoSizeWithPCM.idf | 2 +- testfiles/Convection.idf | 6 +- testfiles/ConvectionAdaptiveSmallOffice.idf | 10 +- testfiles/CoolingCoilFreezingPrevention.idf | 6 +- testfiles/CoolingTower.idf | 6 +- testfiles/CoolingTowerNomCap.idf | 6 +- testfiles/CoolingTowerWithWBDeltaTempOp.idf | 6 +- testfiles/CoolingTower_FluidBypass.idf | 32 +-- .../CoolingTower_MerkelVariableSpeed.idf | 32 +-- .../CoolingTower_SingleSpeed_MultiCell.idf | 32 +-- testfiles/CoolingTower_TwoSpeed.idf | 6 +- ...CoolingTower_TwoSpeed_CondEntTempReset.idf | 6 +- testfiles/CoolingTower_TwoSpeed_MultiCell.idf | 32 +-- .../CoolingTower_VariableSpeed_MultiCell.idf | 32 +-- ...trum_RefBldgSmallOfficeNew2004_Chicago.idf | 10 +- testfiles/DDAutoSize.idf | 6 +- testfiles/DOASDualDuctSchool.idf | 12 +- testfiles/DOAToUnitarySystem.idf | 10 +- testfiles/DXCoilSystemAuto.idf | 6 +- testfiles/DesiccantCVRh.idf | 6 +- testfiles/DesiccantCVRhZoneRHCtrl.idf | 6 +- .../DesiccantCVRhZoneRHCtrl_AddedAutosize.idf | 6 +- testfiles/DirectIndirectEvapCoolers.idf | 8 +- testfiles/DirectIndirectEvapCoolersVSAS.idf | 8 +- ...ent_Nat_AirflowNetwork_AdaptiveComfort.idf | 2 +- testfiles/DualDuctConstVolDamper.idf | 6 +- testfiles/DualDuctConstVolGasHC.idf | 6 +- testfiles/DualDuctVarVolDamper.idf | 6 +- testfiles/DualDuctWaterCoils.idf | 6 +- ...AirflowNetworkOpeningControlByHumidity.idf | 6 +- testfiles/EMSConstantVolumePurchasedAir.idf | 6 +- ...CurveOverride_PackagedTerminalHeatPump.idf | 6 +- testfiles/EMSCustomOutputVariable.idf | 10 +- testfiles/EMSCustomSchedule.idf | 10 +- testfiles/EMSDemandManager_LargeOffice.idf | 32 +-- testfiles/EMSDiscreteAirSystemSizes.idf | 20 +- .../EMSMultiSpeedHeatPumpOverrideControl.idf | 2 +- testfiles/EMSPlantLoopOverrideControl.idf | 20 +- testfiles/EMSPlantOperation_largeOff.idf | 32 +-- ...ReplaceTraditionalManagers_LargeOffice.idf | 32 +-- testfiles/EMSTestMathAndKill.idf | 10 +- testfiles/EMSThermochromicWindow.idf | 10 +- testfiles/EMSUserDefinedWindACAuto.idf | 6 +- testfiles/EMSWindowShadeControl.idf | 6 +- testfiles/EcoroofOrlando.idf | 20 +- testfiles/EcoroofOrlando_NoSitePrec.idf | 20 +- testfiles/ElectricEIRChiller.idf | 6 +- .../ElectricEIRChillerHeatRecoveryAuto.idf | 6 +- ...ElectricEIRChiller_EvapCooledCondenser.idf | 6 +- testfiles/EngineChiller.idf | 6 +- testfiles/EvaporativeFluidCooler.idf | 6 +- testfiles/EvaporativeFluidCooler_TwoSpeed.idf | 6 +- testfiles/ExhFiredAbsorptionChiller.idf | 6 +- testfiles/FanCoilAutoSize.idf | 6 +- testfiles/FanCoilAutoSizeScalableSizing.idf | 6 +- .../FanCoilAutoSize_ASHRAE90VariableFan.idf | 6 +- testfiles/FanCoilAutoSize_MultiSpeedFan.idf | 6 +- testfiles/FanCoil_HybridVent_VentSch.idf | 6 +- ...SensorOffset_RefBldgLargeOfficeNew2004.idf | 32 +-- testfiles/Fault_CondenserSWTSensorOffset.idf | 6 +- ...ngAirFilter_RefBldgMediumOfficeNew2004.idf | 30 +-- ...hillerBoiler_RefBldgLargeOfficeNew2004.idf | 32 +-- testfiles/Fault_FoulingCoolingTower.idf | 6 +- ...lingEvapCooler_StripMallZoneEvapCooler.idf | 20 +- ...ostatOffset_RefBldgMediumOfficeNew2004.idf | 30 +-- ...ation_RefBldgSmallHotelNew2004_Chicago.idf | 84 +++---- testfiles/FluidCooler.idf | 6 +- testfiles/FluidCoolerTwoSpeed.idf | 6 +- testfiles/FourPipeBeamLargeOffice.idf | 32 +-- testfiles/FreeCoolingChiller.idf | 6 +- testfiles/Furnace.idf | 6 +- testfiles/FurnaceFuelOil.idf | 6 +- testfiles/FurnacePLRHeatingCoil.idf | 6 +- testfiles/FurnaceWithDXSystem.idf | 6 +- .../FurnaceWithDXSystemComfortControl.idf | 6 +- testfiles/FurnaceWithDXSystemRHcontrol.idf | 6 +- ...urnaceWithDXSystemRHcontrol_cyclingfan.idf | 6 +- .../FurnaceWithDXSystem_CoolingHXAssisted.idf | 6 +- ...thDXSystem_CoolingHXAssisted_NewDXCoil.idf | 6 +- testfiles/GSHPSimple-GLHE.idf | 6 +- testfiles/GasTurbChiller.idf | 6 +- testfiles/GasTurbChillerHeatRecoveryAuto.idf | 6 +- testfiles/Generators.idf | 6 +- testfiles/Generators_Transformer.idf | 6 +- testfiles/GeometryTest.idf | 4 +- .../HPAirToAir_wSolarCollectorHWCoil.idf | 6 +- testfiles/HP_wICSSolarCollector.idf | 6 +- testfiles/HVACStandAloneERV_Economizer.idf | 6 +- testfiles/HeatPump.idf | 6 +- testfiles/HeatPumpAirToAirWithRHcontrol.idf | 6 +- testfiles/HeatPumpAuto.idf | 6 +- testfiles/HeatPumpCycFanWithEcono.idf | 6 +- testfiles/HeatPumpIAQP_DCV.idf | 6 +- .../HeatPumpIAQP_GenericContamControl.idf | 6 +- testfiles/HeatPumpProportionalControl_DCV.idf | 6 +- ...tPumpProportionalControl_DCVDesignRate.idf | 6 +- testfiles/HeatPumpSecondaryCoil.idf | 6 +- testfiles/HeatPumpSimpleDCV.idf | 6 +- testfiles/HeatPumpVRP_DCV.idf | 6 +- testfiles/HeatPumpVSAS.idf | 6 +- ...mpVSAS_variableCrankcaseHeaterCapacity.idf | 6 +- ...WaterToAirWithAntifreezeAndLatentModel.idf | 6 +- ...aterToAirWithAntifreezeAndLatentModel2.idf | 6 +- ...atPump_variableCrankcaseHeaterCapacity.idf | 6 +- testfiles/HeatPumpwithBiquadraticCurves.idf | 6 +- testfiles/HeatRecoveryElectricChiller.idf | 6 +- testfiles/HeatRecoveryPlantLoop.idf | 6 +- testfiles/HeatRecoveryPlantLoopAuto.idf | 6 +- testfiles/HeatRecoverywithStorageTank.idf | 6 +- testfiles/HospitalBaseline.idf | 224 +++++++++--------- testfiles/HospitalBaselineReheatReportEMS.idf | 224 +++++++++--------- testfiles/HospitalLowEnergy.idf | 224 +++++++++--------- testfiles/House-2FurnaceAC-SequentialLoad.idf | 2 +- ...use-2FurnaceAC-SequentialLoadFractions.idf | 2 +- .../House-2FurnaceAC-SequentialUniformPLR.idf | 2 +- testfiles/House-2FurnaceAC-UniformLoad.idf | 2 +- testfiles/House-2FurnaceAC-UniformPLR.idf | 2 +- ...4Zone_Solve_Infiltration_free_floating.idf | 8 +- ...odel_4Zone_Solve_PeopleCount_with_HVAC.idf | 8 +- testfiles/HybridVentilationControl.idf | 6 +- .../HybridVentilationControlGlobalSimple.idf | 6 +- testfiles/IndEvapCoolerRTUoffice.idf | 20 +- testfiles/IndirectAbsorptionChiller.idf | 6 +- testfiles/InternalMass_wZoneList.idf | 6 +- testfiles/LookupTables.idf | 6 +- .../LrgOff_GridStorageDemandLeveling.idf | 32 +-- testfiles/LrgOff_GridStorageEMSSmoothing.idf | 32 +-- testfiles/LrgOff_GridStorageScheduled.idf | 32 +-- testfiles/MicroCogeneration.idf | 10 +- testfiles/MultiSpeedACFurnace.idf | 6 +- testfiles/MultiSpeedHP_StagedThermostat.idf | 6 +- testfiles/MultiSpeedHeatPump.idf | 6 +- .../MultiSpeedHeatPump_DirectSolution.idf | 6 +- testfiles/MultiSpeedHeatPump_MultiSolvers.idf | 6 +- ...tart_RefBldgLargeOfficeNew2004_Chicago.idf | 32 +-- testfiles/PIUAuto.idf | 6 +- testfiles/PackagedTerminalAirConditioner.idf | 6 +- .../PackagedTerminalAirConditionerVSAS.idf | 6 +- testfiles/PackagedTerminalHeatPump.idf | 6 +- testfiles/PackagedTerminalHeatPumpVSAS.idf | 6 +- ...eatPump_LatentSizing_SensibleAndLatent.idf | 6 +- ...n_ASHRAE9012016_SchoolSecondary_Denver.idf | 84 +++---- testfiles/PlantApplicationsGuide_Example2.idf | 10 +- testfiles/PlantApplicationsGuide_Example3.idf | 6 +- ...fice-2-AWHP-DedHR-AuxBoiler-Pri-Sec-HW.idf | 32 +-- ...ice-2-AWHP-AuxBoiler-Pri-Sec-4PipeBeam.idf | 32 +-- testfiles/PlateHeatExchanger.idf | 6 +- testfiles/PurchAirTables.idf | 6 +- testfiles/PurchAirTables_SQL.idf | 6 +- testfiles/PurchAirTables_wAnnual.idf | 6 +- testfiles/PurchAirWindowBlind.idf | 6 +- .../PurchAirWindowBlind_BlockBeamSolar.idf | 6 +- testfiles/PurchAirWithDaylighting.idf | 6 +- ...PurchAirWithDaylightingAndShadeControl.idf | 6 +- testfiles/PurchAirWithDaylightingAngleFac.idf | 3 - .../PurchAirWithDoubleFacadeDaylighting.idf | 6 +- ...AirflowNetworkOpeningControlByHumidity.idf | 6 +- ...PythonPluginConstantVolumePurchasedAir.idf | 6 +- ...CurveOverride_PackagedTerminalHeatPump.idf | 6 +- .../PythonPluginCustomOutputVariable.idf | 10 +- testfiles/PythonPluginCustomSchedule.idf | 10 +- testfiles/PythonPluginCustomTrendVariable.idf | 10 +- .../PythonPluginDemandManager_LargeOffice.idf | 32 +-- .../PythonPluginDiscreteAirSystemSizes.idf | 20 +- ...ythonPluginLrgOff_GridStorageSmoothing.idf | 32 +-- ...luginMultiSpeedHeatPumpOverrideControl.idf | 2 +- .../PythonPluginPlantLoopOverrideControl.idf | 20 +- .../PythonPluginPlantOperation_largeOff.idf | 32 +-- ...ReplaceTraditionalManagers_LargeOffice.idf | 32 +-- testfiles/PythonPluginTestMathAndKill.idf | 10 +- testfiles/PythonPluginThermochromicWindow.idf | 10 +- .../PythonPluginUserDefinedWindACAuto.idf | 6 +- testfiles/PythonPluginWindowShadeControl.idf | 6 +- ...se_TwoSpeed_MultiStageElectricSuppCoil.idf | 2 +- testfiles/RadHiTempElecTermReheat.idf | 6 +- testfiles/RadHiTempGasCtrlOpt.idf | 6 +- testfiles/RadHiTempGasTermReheat.idf | 6 +- testfiles/RadLoHydrHeatCoolAuto.idf | 6 +- testfiles/RadLoHydrHeatCoolAutoCondFD.idf | 6 +- testfiles/RadLoTempCFloChangeoverDelay.idf | 6 +- testfiles/RadLoTempCFloCtrlOpt2.idf | 6 +- testfiles/RadLoTempCFloCtrlOpt3.idf | 6 +- testfiles/RadLoTempCFloHeatCool.idf | 6 +- testfiles/RadLoTempCFloHeatCoolCondFD.idf | 6 +- testfiles/RadLoTempCFloHeatCoolRMT.idf | 6 +- .../RadLoTempCFloHeatCool_AddedAutosizing.idf | 6 +- testfiles/RadLoTempCFloISOPipeHT.idf | 6 +- testfiles/RadLoTempCFloTermReheat.idf | 6 +- testfiles/RadLoTempElecCtrlOpt2.idf | 6 +- testfiles/RadLoTempElecTermReheat.idf | 6 +- testfiles/RadLoTempElecTermReheatCondFD.idf | 6 +- testfiles/RadLoTempHydrChangeoverDelay.idf | 6 +- testfiles/RadLoTempHydrCoolTower.idf | 6 +- testfiles/RadLoTempHydrCoolTowerCondFD.idf | 6 +- testfiles/RadLoTempHydrCtrlOpt.idf | 6 +- testfiles/RadLoTempHydrCtrlOpt2.idf | 6 +- testfiles/RadLoTempHydrCtrlOpt3.idf | 6 +- testfiles/RadLoTempHydrHeatCool.idf | 6 +- testfiles/RadLoTempHydrHeatCool2D.idf | 6 +- testfiles/RadLoTempHydrHeatCoolDry.idf | 6 +- testfiles/RadLoTempHydrHeatCoolDryCondFD.idf | 6 +- testfiles/RadLoTempHydrHeatCoolMultiZone.idf | 6 +- testfiles/RadLoTempHydrISOPipeHT.idf | 6 +- testfiles/RadLoTempHydrInterMulti.idf | 6 +- testfiles/RadLoTempHydrTermReheat.idf | 6 +- ...dgFullServiceRestaurantNew2004_Chicago.idf | 4 +- testfiles/RefBldgHospitalNew2004_Chicago.idf | 110 ++++----- .../RefBldgLargeHotelNew2004_Chicago.idf | 42 ++-- ...LargeOfficeNew2004_Chicago-ReturnReset.idf | 32 +-- .../RefBldgLargeOfficeNew2004_Chicago.idf | 32 +-- .../RefBldgMediumOfficeNew2004_Chicago.idf | 30 +-- ...diumOfficeNew2004_Chicago_JSON_Outputs.idf | 30 +-- ...iumOfficeNew2004_Chicago_OutputControl.idf | 30 +-- ...RefBldgMidriseApartmentNew2004_Chicago.idf | 48 ++-- .../RefBldgOutPatientNew2004_Chicago.idf | 116 ++++----- .../RefBldgPrimarySchoolNew2004_Chicago.idf | 46 ++-- ...gQuickServiceRestaurantNew2004_Chicago.idf | 4 +- .../RefBldgSecondarySchoolNew2004_Chicago.idf | 84 +++---- .../RefBldgSmallHotelNew2004_Chicago.idf | 84 +++---- .../RefBldgSmallOfficeNew2004_Chicago.idf | 10 +- ...efBldgStand-aloneRetailNew2004_Chicago.idf | 10 +- testfiles/RefBldgStripMallNew2004_Chicago.idf | 20 +- .../RefBldgSuperMarketNew2004_Chicago.idf | 12 +- testfiles/RefBldgWarehouseNew2004_Chicago.idf | 2 +- testfiles/RefMedOffVAVAllDefVRP.idf | 30 +-- testfiles/ReflectiveAdjacentBuilding.idf | 6 +- testfiles/RefrigeratedWarehouse.idf | 28 +-- testfiles/ReliefIndEvapCoolerRTUoffice.idf | 20 +- testfiles/ReportDaylightFactors.idf | 30 +-- .../ReportHeatEmission_RefFSRestaurant.idf | 4 +- testfiles/RetailPackagedTESCoil.idf | 10 +- testfiles/RoomAirflowNetwork.idf | 10 +- testfiles/ShopWithBIPVT.idf | 10 +- testfiles/ShopWithPVandBattery.idf | 10 +- testfiles/ShopWithPVandLiIonBattery.idf | 10 +- testfiles/ShopWithPVandStorage.idf | 10 +- testfiles/ShopWithSimplePVT.idf | 10 +- ...FamilyHouse_TwoSpeed_CutoutTemperature.idf | 2 +- ...se_TwoSpeed_MultiStageElectricSuppCoil.idf | 2 +- ...TwoSpeed_MultiStageElectricSuppCoilEMS.idf | 2 +- ...d_MultiStageElectricSuppCoil_SPControl.idf | 2 +- ...gleFamilyHouse_TwoSpeed_ZoneAirBalance.idf | 2 +- testfiles/SmallOffice_CentralDOAS.idf | 10 +- ...tralAngularOpticalProperties_TableData.idf | 6 +- ...dard621SimplifiedProcedure_PIUterminal.idf | 6 +- testfiles/StormWindow.idf | 6 +- testfiles/StripMallZoneEvapCooler.idf | 20 +- .../StripMallZoneEvapCoolerAutosized.idf | 20 +- testfiles/StripMallZoneEvapCoolerRHcutoff.idf | 20 +- testfiles/SupplyPlenumVAV.idf | 6 +- ...atSourceTerm_RefBldgSmallOfficeNew2004.idf | 10 +- testfiles/SurfacePropGroundSurfaces_LWR.idf | 10 +- testfiles/SurfacePropTest_SurfLWR.idf | 10 +- testfiles/SurfaceTest.idf | 10 +- testfiles/SurfaceZonePropTest_LocalEnv.idf | 10 +- testfiles/TRHConstFlowChillerOneBranch.idf | 6 +- testfiles/TRHEvapCoolerOAStaged.idf | 6 +- testfiles/TRHEvapCoolerOAStagedWetCoil.idf | 6 +- testfiles/TermRHDXSystem.idf | 6 +- testfiles/TermRHGasElecCoils.idf | 6 +- testfiles/TermReheat.idf | 6 +- testfiles/TermReheatPri-SecLoop.idf | 6 +- testfiles/TermReheatScheduledPump.idf | 6 +- testfiles/TermReheatZoneExh.idf | 6 +- testfiles/TermRhDualSetpointWithDB.idf | 6 +- testfiles/TermRhGenericOAHeatRecMinExh.idf | 6 +- testfiles/TermRhGenericOAHeatRecPreheat.idf | 6 +- testfiles/TermRhSingleHeatCoolNoDB.idf | 6 +- testfiles/ThermochromicWindow.idf | 10 +- testfiles/TranspiredCollectors.idf | 20 +- testfiles/UnitHeater.idf | 6 +- testfiles/UnitHeaterAuto.idf | 6 +- testfiles/UnitHeaterGasElec.idf | 6 +- testfiles/UnitarySystem_DXCoilSystemAuto.idf | 6 +- ...arySystem_FurnaceWithDXSystemRHcontrol.idf | 6 +- testfiles/UnitarySystem_HeatPumpAuto.idf | 6 +- ...itarySystem_MultiSpeedCoils_SingleMode.idf | 6 +- testfiles/UnitarySystem_VSCoolingCoil.idf | 6 +- ...nitarySystem_WaterCoils_wMultiSpeedFan.idf | 6 +- testfiles/UnitarySystem_ZoneVSWSHP_wDOAS.idf | 2 +- testfiles/UserDefinedRoomAirPatterns.idf | 18 +- testfiles/VAVSingleDuctConstFlowBoiler.idf | 6 +- testfiles/VAVSingleDuctReheat.idf | 6 +- testfiles/VAVSingleDuctReheatBaseboard.idf | 6 +- testfiles/VAVSingleDuctReheatNoReheat.idf | 6 +- testfiles/VAVSingleDuctReheat_DualMax.idf | 6 +- ...VSingleDuctReheat_MaxSAT_ReverseActing.idf | 6 +- testfiles/VAVSingleDuctVarFlowBoiler.idf | 6 +- testfiles/VSDXCoilSystemAuto.idf | 6 +- testfiles/WWHPSimpleAuto.idf | 6 +- testfiles/WindACAirtoAir.idf | 6 +- testfiles/WindACAuto.idf | 6 +- testfiles/WindACRHControl.idf | 6 +- testfiles/ZoneCoupledKivaConvection.idf | 6 +- ...upledKivaConvectionAdaptiveSmallOffice.idf | 10 +- .../ZoneCoupledKivaRefBldgMediumOffice.idf | 30 +-- ...oneCoupledKivaRefBldgMediumOfficeNoClg.idf | 30 +-- testfiles/ZoneSysAvailManager.idf | 2 +- testfiles/ZoneVSWSHP_wDOAS.idf | 2 +- testfiles/ZoneWSHP_wDOAS.idf | 2 +- testfiles/_AllOffOpScheme.idf | 6 +- ...lDamperMultizoneAverageSetPointManager.idf | 6 +- testfiles/_ElectricASHRAE205Chiller.idf | 6 +- testfiles/_ElectricREformulatedEIRChiller.idf | 6 +- testfiles/_ExternalInterface-actuator.idf | 6 +- ...rface-functionalmockupunit-to-actuator.idf | 6 +- ...rface-functionalmockupunit-to-variable.idf | 6 +- testfiles/_ExternalInterface-variable.idf | 6 +- testfiles/_FanCoilHybridVentAFN.idf | 6 +- testfiles/_FollowSysNodeTemp.idf | 6 +- .../_HybridVentilationControlGlobalAN.idf | 6 +- .../_HybridVentilationControl_MinTime.idf | 6 +- testfiles/_MultiSpeedACElecFurnace.idf | 6 +- testfiles/_PurchAirWindowBlind2.idf | 6 +- testfiles/_PurchAirWindowBlind3.idf | 6 +- testfiles/_PurchAirWindowBlind4.idf | 6 +- ...VAVSingleDuctConstFlowBoiler_otherfuel.idf | 6 +- testfiles/gasAbsorptionChillerHeater.idf | 6 +- 388 files changed, 2635 insertions(+), 2638 deletions(-) diff --git a/testfiles/1ZoneEvapCooler_ReportPeriodPowerOutage.idf b/testfiles/1ZoneEvapCooler_ReportPeriodPowerOutage.idf index 103da87bc44..580da7a6dc1 100644 --- a/testfiles/1ZoneEvapCooler_ReportPeriodPowerOutage.idf +++ b/testfiles/1ZoneEvapCooler_ReportPeriodPowerOutage.idf @@ -353,7 +353,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/1ZoneEvapCooler_ReportPeriodPowerOutage_naturalVent.idf b/testfiles/1ZoneEvapCooler_ReportPeriodPowerOutage_naturalVent.idf index 8cda53c1803..564f4a0910b 100644 --- a/testfiles/1ZoneEvapCooler_ReportPeriodPowerOutage_naturalVent.idf +++ b/testfiles/1ZoneEvapCooler_ReportPeriodPowerOutage_naturalVent.idf @@ -394,7 +394,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/1ZoneUncontrolled_Win_ASH55_Thermal_Comfort.idf b/testfiles/1ZoneUncontrolled_Win_ASH55_Thermal_Comfort.idf index 504f0cdfd87..ed0f06fec42 100644 --- a/testfiles/1ZoneUncontrolled_Win_ASH55_Thermal_Comfort.idf +++ b/testfiles/1ZoneUncontrolled_Win_ASH55_Thermal_Comfort.idf @@ -455,7 +455,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/1ZoneUncontrolled_Win_ResilienceReports.idf b/testfiles/1ZoneUncontrolled_Win_ResilienceReports.idf index 917f546c122..1128aa8d862 100644 --- a/testfiles/1ZoneUncontrolled_Win_ResilienceReports.idf +++ b/testfiles/1ZoneUncontrolled_Win_ResilienceReports.idf @@ -455,7 +455,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/1ZoneUncontrolled_Win_ResilienceReports_ReportingPeriod.idf b/testfiles/1ZoneUncontrolled_Win_ResilienceReports_ReportingPeriod.idf index ff97b5c4789..ea1406b1fee 100644 --- a/testfiles/1ZoneUncontrolled_Win_ResilienceReports_ReportingPeriod.idf +++ b/testfiles/1ZoneUncontrolled_Win_ResilienceReports_ReportingPeriod.idf @@ -455,7 +455,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -486,7 +486,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/1ZoneUncontrolled_Win_ResilienceReports_ReportingPeriod_AllTable.idf b/testfiles/1ZoneUncontrolled_Win_ResilienceReports_ReportingPeriod_AllTable.idf index c7c840f5cf3..0dfe2e79706 100644 --- a/testfiles/1ZoneUncontrolled_Win_ResilienceReports_ReportingPeriod_AllTable.idf +++ b/testfiles/1ZoneUncontrolled_Win_ResilienceReports_ReportingPeriod_AllTable.idf @@ -455,7 +455,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -486,7 +486,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/2ZoneDataCenterHVAC_wEconomizer.idf b/testfiles/2ZoneDataCenterHVAC_wEconomizer.idf index ff23e38f2e3..75ebf78da52 100644 --- a/testfiles/2ZoneDataCenterHVAC_wEconomizer.idf +++ b/testfiles/2ZoneDataCenterHVAC_wEconomizer.idf @@ -2696,7 +2696,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2754,7 +2754,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/2ZoneDataCenterHVAC_wEconomizer_ClassA1A2.idf b/testfiles/2ZoneDataCenterHVAC_wEconomizer_ClassA1A2.idf index 0367dce074e..f1ffe3ae756 100644 --- a/testfiles/2ZoneDataCenterHVAC_wEconomizer_ClassA1A2.idf +++ b/testfiles/2ZoneDataCenterHVAC_wEconomizer_ClassA1A2.idf @@ -2696,7 +2696,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2754,7 +2754,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/5ZoneAirCooledWithSpaces.idf b/testfiles/5ZoneAirCooledWithSpaces.idf index 0551d8c2be2..fe1107f882e 100644 --- a/testfiles/5ZoneAirCooledWithSpaces.idf +++ b/testfiles/5ZoneAirCooledWithSpaces.idf @@ -1879,7 +1879,7 @@ ActSchd, !- Activity Level Schedule Name 0.0000000382, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name , !- Work Efficiency Schedule Name ClothingInsulationSchedule; !- Clothing Insulation Calculation Method diff --git a/testfiles/5ZoneAirCooledWithSpacesHVAC.idf b/testfiles/5ZoneAirCooledWithSpacesHVAC.idf index 61bf1a36eea..0311032c6f5 100644 --- a/testfiles/5ZoneAirCooledWithSpacesHVAC.idf +++ b/testfiles/5ZoneAirCooledWithSpacesHVAC.idf @@ -1884,7 +1884,7 @@ ZoneAirHeatBalanceAlgorithm, ActSchd, !- Activity Level Schedule Name 0.0000000382, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name , !- Work Efficiency Schedule Name ClothingInsulationSchedule; !- Clothing Insulation Calculation Method diff --git a/testfiles/5ZoneCostEst.idf b/testfiles/5ZoneCostEst.idf index 6c35e64f032..4f218f2dfe2 100644 --- a/testfiles/5ZoneCostEst.idf +++ b/testfiles/5ZoneCostEst.idf @@ -2391,7 +2391,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2412,7 +2412,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2433,7 +2433,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2454,7 +2454,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2475,7 +2475,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/5ZoneVAV-ChilledWaterStorage-Mixed.idf b/testfiles/5ZoneVAV-ChilledWaterStorage-Mixed.idf index 26090cb02a9..805e93633a8 100644 --- a/testfiles/5ZoneVAV-ChilledWaterStorage-Mixed.idf +++ b/testfiles/5ZoneVAV-ChilledWaterStorage-Mixed.idf @@ -1327,7 +1327,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1814,7 +1814,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2282,7 +2282,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2769,7 +2769,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3342,7 +3342,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/5ZoneVAV-ChilledWaterStorage-Mixed_DCV_MaxZd.idf b/testfiles/5ZoneVAV-ChilledWaterStorage-Mixed_DCV_MaxZd.idf index 622a6cb1137..2a5715fabf6 100644 --- a/testfiles/5ZoneVAV-ChilledWaterStorage-Mixed_DCV_MaxZd.idf +++ b/testfiles/5ZoneVAV-ChilledWaterStorage-Mixed_DCV_MaxZd.idf @@ -1306,7 +1306,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1814,7 +1814,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2282,7 +2282,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2769,7 +2769,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3342,7 +3342,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/5ZoneVAV-ChilledWaterStorage-Mixed_DCV_MultiPath.idf b/testfiles/5ZoneVAV-ChilledWaterStorage-Mixed_DCV_MultiPath.idf index c7c3f94f07e..91630897b34 100644 --- a/testfiles/5ZoneVAV-ChilledWaterStorage-Mixed_DCV_MultiPath.idf +++ b/testfiles/5ZoneVAV-ChilledWaterStorage-Mixed_DCV_MultiPath.idf @@ -1315,7 +1315,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1823,7 +1823,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2291,7 +2291,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2778,7 +2778,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3351,7 +3351,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/5ZoneVAV-ChilledWaterStorage-Stratified.idf b/testfiles/5ZoneVAV-ChilledWaterStorage-Stratified.idf index 3fb5af80082..d500dfe66a6 100644 --- a/testfiles/5ZoneVAV-ChilledWaterStorage-Stratified.idf +++ b/testfiles/5ZoneVAV-ChilledWaterStorage-Stratified.idf @@ -1318,7 +1318,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1805,7 +1805,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2273,7 +2273,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2760,7 +2760,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3333,7 +3333,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/5ZoneWaterSystems.idf b/testfiles/5ZoneWaterSystems.idf index 63a73427739..931de0b33f2 100644 --- a/testfiles/5ZoneWaterSystems.idf +++ b/testfiles/5ZoneWaterSystems.idf @@ -2564,7 +2564,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2838,7 +2838,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3077,7 +3077,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3318,7 +3318,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3535,7 +3535,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/5ZoneWaterSystems_NoSitePrec.idf b/testfiles/5ZoneWaterSystems_NoSitePrec.idf index 79b2b1327c4..66c488035b9 100644 --- a/testfiles/5ZoneWaterSystems_NoSitePrec.idf +++ b/testfiles/5ZoneWaterSystems_NoSitePrec.idf @@ -922,7 +922,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1196,7 +1196,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1435,7 +1435,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1676,7 +1676,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1893,7 +1893,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_Hospital_STD2019_Denver.idf b/testfiles/ASHRAE901_Hospital_STD2019_Denver.idf index a3dc9c283e4..a5fc6c2f8b1 100644 --- a/testfiles/ASHRAE901_Hospital_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_Hospital_STD2019_Denver.idf @@ -11629,7 +11629,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11651,7 +11651,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11673,7 +11673,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11695,7 +11695,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11717,7 +11717,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11739,7 +11739,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11761,7 +11761,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11783,7 +11783,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11805,7 +11805,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11827,7 +11827,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11849,7 +11849,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11871,7 +11871,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11893,7 +11893,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11915,7 +11915,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11937,7 +11937,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11959,7 +11959,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11981,7 +11981,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12003,7 +12003,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12025,7 +12025,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12047,7 +12047,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12069,7 +12069,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12091,7 +12091,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12113,7 +12113,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12135,7 +12135,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12157,7 +12157,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12179,7 +12179,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12201,7 +12201,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12223,7 +12223,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12245,7 +12245,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12267,7 +12267,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12289,7 +12289,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12311,7 +12311,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12333,7 +12333,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12355,7 +12355,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12377,7 +12377,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12399,7 +12399,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12421,7 +12421,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12443,7 +12443,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12465,7 +12465,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12487,7 +12487,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12509,7 +12509,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12531,7 +12531,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12553,7 +12553,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12575,7 +12575,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12597,7 +12597,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12619,7 +12619,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12641,7 +12641,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12663,7 +12663,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12685,7 +12685,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12707,7 +12707,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12729,7 +12729,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12751,7 +12751,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12773,7 +12773,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12795,7 +12795,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12817,7 +12817,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_HotelLarge_STD2019_Denver.idf b/testfiles/ASHRAE901_HotelLarge_STD2019_Denver.idf index dab039e9b7e..9a86956f156 100644 --- a/testfiles/ASHRAE901_HotelLarge_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_HotelLarge_STD2019_Denver.idf @@ -6879,7 +6879,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6901,7 +6901,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6923,7 +6923,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6945,7 +6945,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6967,7 +6967,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6989,7 +6989,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7011,7 +7011,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7033,7 +7033,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7055,7 +7055,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7077,7 +7077,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7099,7 +7099,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7121,7 +7121,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7143,7 +7143,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7165,7 +7165,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7187,7 +7187,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7209,7 +7209,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7231,7 +7231,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7253,7 +7253,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver.idf b/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver.idf index 52df9aca147..e4a8d5789fe 100644 --- a/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver.idf @@ -6534,7 +6534,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6556,7 +6556,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6578,7 +6578,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6600,7 +6600,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6622,7 +6622,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6644,7 +6644,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6666,7 +6666,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6688,7 +6688,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6710,7 +6710,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6732,7 +6732,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6754,7 +6754,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6776,7 +6776,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6798,7 +6798,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6820,7 +6820,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6842,7 +6842,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6864,7 +6864,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver_Chiller205.idf b/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver_Chiller205.idf index 5f92eaad487..33d10e2b735 100644 --- a/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver_Chiller205.idf +++ b/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver_Chiller205.idf @@ -6534,7 +6534,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6556,7 +6556,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6578,7 +6578,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6600,7 +6600,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6622,7 +6622,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6644,7 +6644,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6666,7 +6666,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6688,7 +6688,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6710,7 +6710,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6732,7 +6732,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6754,7 +6754,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6776,7 +6776,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6798,7 +6798,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6820,7 +6820,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6842,7 +6842,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6864,7 +6864,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver_Chiller205_Detailed.idf b/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver_Chiller205_Detailed.idf index 3f19be33e99..7929fd1826e 100644 --- a/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver_Chiller205_Detailed.idf +++ b/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver_Chiller205_Detailed.idf @@ -6534,7 +6534,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6556,7 +6556,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6578,7 +6578,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6600,7 +6600,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6622,7 +6622,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6644,7 +6644,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6666,7 +6666,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6688,7 +6688,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6710,7 +6710,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6732,7 +6732,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6754,7 +6754,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6776,7 +6776,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6798,7 +6798,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6820,7 +6820,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6842,7 +6842,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6864,7 +6864,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver_ChillerEIR.idf b/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver_ChillerEIR.idf index 226beb008be..403f5655d0e 100644 --- a/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver_ChillerEIR.idf +++ b/testfiles/ASHRAE901_OfficeLarge_STD2019_Denver_ChillerEIR.idf @@ -6534,7 +6534,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6556,7 +6556,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6578,7 +6578,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6600,7 +6600,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6622,7 +6622,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6644,7 +6644,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6666,7 +6666,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6688,7 +6688,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6710,7 +6710,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6732,7 +6732,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6754,7 +6754,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6776,7 +6776,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6798,7 +6798,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6820,7 +6820,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6842,7 +6842,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6864,7 +6864,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_OfficeMedium_STD2019_Denver.idf b/testfiles/ASHRAE901_OfficeMedium_STD2019_Denver.idf index 431feb628ef..e55444fc7f3 100644 --- a/testfiles/ASHRAE901_OfficeMedium_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_OfficeMedium_STD2019_Denver.idf @@ -4544,7 +4544,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4566,7 +4566,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4588,7 +4588,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4610,7 +4610,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4632,7 +4632,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4654,7 +4654,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4676,7 +4676,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4698,7 +4698,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4720,7 +4720,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4742,7 +4742,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4764,7 +4764,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4786,7 +4786,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4808,7 +4808,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4830,7 +4830,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4852,7 +4852,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_OutPatientHealthCare_STD2019_Denver.idf b/testfiles/ASHRAE901_OutPatientHealthCare_STD2019_Denver.idf index 621eeb381f5..9156b997158 100644 --- a/testfiles/ASHRAE901_OutPatientHealthCare_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_OutPatientHealthCare_STD2019_Denver.idf @@ -28272,7 +28272,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28294,7 +28294,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28316,7 +28316,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28338,7 +28338,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28360,7 +28360,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28382,7 +28382,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28404,7 +28404,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28426,7 +28426,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28448,7 +28448,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28470,7 +28470,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28492,7 +28492,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28514,7 +28514,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28536,7 +28536,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28558,7 +28558,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28580,7 +28580,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28602,7 +28602,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28624,7 +28624,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28646,7 +28646,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28668,7 +28668,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28690,7 +28690,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28712,7 +28712,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28734,7 +28734,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28756,7 +28756,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28778,7 +28778,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28800,7 +28800,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28822,7 +28822,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28844,7 +28844,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28866,7 +28866,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28888,7 +28888,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28910,7 +28910,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28932,7 +28932,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28954,7 +28954,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28976,7 +28976,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28998,7 +28998,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29020,7 +29020,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29042,7 +29042,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29064,7 +29064,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29086,7 +29086,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29108,7 +29108,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29130,7 +29130,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29152,7 +29152,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29174,7 +29174,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29196,7 +29196,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29218,7 +29218,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29240,7 +29240,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29262,7 +29262,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29284,7 +29284,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29306,7 +29306,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29328,7 +29328,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29350,7 +29350,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29372,7 +29372,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29394,7 +29394,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29416,7 +29416,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29438,7 +29438,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29460,7 +29460,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29482,7 +29482,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29504,7 +29504,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29526,7 +29526,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29548,7 +29548,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_RestaurantFastFood_STD2019_Denver.idf b/testfiles/ASHRAE901_RestaurantFastFood_STD2019_Denver.idf index fc2fad2bedb..f21ec21a6fe 100644 --- a/testfiles/ASHRAE901_RestaurantFastFood_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_RestaurantFastFood_STD2019_Denver.idf @@ -2473,7 +2473,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2495,7 +2495,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_RestaurantSitDown_STD2019_Denver.idf b/testfiles/ASHRAE901_RestaurantSitDown_STD2019_Denver.idf index 044533d13a6..c957b8fe154 100644 --- a/testfiles/ASHRAE901_RestaurantSitDown_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_RestaurantSitDown_STD2019_Denver.idf @@ -2521,7 +2521,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2543,7 +2543,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_RetailStandalone_STD2019_Denver.idf b/testfiles/ASHRAE901_RetailStandalone_STD2019_Denver.idf index fe95502bfd6..cd26acd5c3d 100644 --- a/testfiles/ASHRAE901_RetailStandalone_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_RetailStandalone_STD2019_Denver.idf @@ -3184,7 +3184,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3206,7 +3206,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3228,7 +3228,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3250,7 +3250,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3272,7 +3272,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_RetailStripmall_STD2019_Denver.idf b/testfiles/ASHRAE901_RetailStripmall_STD2019_Denver.idf index 8ba7be2ff3f..4e59aa55790 100644 --- a/testfiles/ASHRAE901_RetailStripmall_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_RetailStripmall_STD2019_Denver.idf @@ -3986,7 +3986,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4008,7 +4008,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4030,7 +4030,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4052,7 +4052,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4074,7 +4074,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4096,7 +4096,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4118,7 +4118,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4140,7 +4140,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4162,7 +4162,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4184,7 +4184,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_SchoolPrimary_STD2019_Denver.idf b/testfiles/ASHRAE901_SchoolPrimary_STD2019_Denver.idf index 031250034c9..1365257c86f 100644 --- a/testfiles/ASHRAE901_SchoolPrimary_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_SchoolPrimary_STD2019_Denver.idf @@ -8315,7 +8315,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8337,7 +8337,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8359,7 +8359,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8381,7 +8381,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8403,7 +8403,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8425,7 +8425,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8447,7 +8447,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8469,7 +8469,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8491,7 +8491,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8513,7 +8513,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8535,7 +8535,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8557,7 +8557,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8579,7 +8579,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8601,7 +8601,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8623,7 +8623,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8645,7 +8645,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8667,7 +8667,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8689,7 +8689,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8711,7 +8711,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8733,7 +8733,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8755,7 +8755,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8777,7 +8777,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8799,7 +8799,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_SchoolSecondary_STD2019_Denver.idf b/testfiles/ASHRAE901_SchoolSecondary_STD2019_Denver.idf index b0fbe9a98c2..114113b745a 100644 --- a/testfiles/ASHRAE901_SchoolSecondary_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_SchoolSecondary_STD2019_Denver.idf @@ -13378,7 +13378,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13400,7 +13400,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13422,7 +13422,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13444,7 +13444,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13466,7 +13466,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13488,7 +13488,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13510,7 +13510,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13532,7 +13532,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13554,7 +13554,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13576,7 +13576,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13598,7 +13598,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13620,7 +13620,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13642,7 +13642,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13664,7 +13664,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13686,7 +13686,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13708,7 +13708,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13730,7 +13730,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13752,7 +13752,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13774,7 +13774,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13796,7 +13796,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13818,7 +13818,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13840,7 +13840,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13862,7 +13862,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13884,7 +13884,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13906,7 +13906,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13928,7 +13928,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13950,7 +13950,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13972,7 +13972,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13994,7 +13994,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14016,7 +14016,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14038,7 +14038,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14060,7 +14060,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14082,7 +14082,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14104,7 +14104,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14126,7 +14126,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14148,7 +14148,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14170,7 +14170,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14192,7 +14192,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14214,7 +14214,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14236,7 +14236,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14258,7 +14258,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14280,7 +14280,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASIHPMixedTank.idf b/testfiles/ASIHPMixedTank.idf index 17268b0ea3c..1ac228b41c1 100644 --- a/testfiles/ASIHPMixedTank.idf +++ b/testfiles/ASIHPMixedTank.idf @@ -2323,7 +2323,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2345,7 +2345,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2367,7 +2367,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AbsorptionChiller.idf b/testfiles/AbsorptionChiller.idf index fb37992070d..ab74eb13a0b 100644 --- a/testfiles/AbsorptionChiller.idf +++ b/testfiles/AbsorptionChiller.idf @@ -530,7 +530,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -564,7 +564,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -612,7 +612,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirCooledElectricChiller.idf b/testfiles/AirCooledElectricChiller.idf index f4dfdaba847..9296ad81b34 100644 --- a/testfiles/AirCooledElectricChiller.idf +++ b/testfiles/AirCooledElectricChiller.idf @@ -524,7 +524,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -558,7 +558,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -606,7 +606,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirEconomizerFaults_RefBldgLargeOfficeNew2004_Chicago.idf b/testfiles/AirEconomizerFaults_RefBldgLargeOfficeNew2004_Chicago.idf index 87580f8a9c1..e8d2faf4f91 100644 --- a/testfiles/AirEconomizerFaults_RefBldgLargeOfficeNew2004_Chicago.idf +++ b/testfiles/AirEconomizerFaults_RefBldgLargeOfficeNew2004_Chicago.idf @@ -3305,7 +3305,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3327,7 +3327,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3349,7 +3349,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3371,7 +3371,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3393,7 +3393,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3415,7 +3415,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3437,7 +3437,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3459,7 +3459,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3481,7 +3481,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3503,7 +3503,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3525,7 +3525,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3547,7 +3547,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3569,7 +3569,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3591,7 +3591,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3613,7 +3613,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3635,7 +3635,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork3zVent.idf b/testfiles/AirflowNetwork3zVent.idf index 46df3b932e7..d4d4b9ad5fc 100644 --- a/testfiles/AirflowNetwork3zVent.idf +++ b/testfiles/AirflowNetwork3zVent.idf @@ -949,7 +949,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -971,7 +971,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -993,7 +993,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork3zVentAutoWPC.idf b/testfiles/AirflowNetwork3zVentAutoWPC.idf index 9a6d4b79298..58ea6481ba5 100644 --- a/testfiles/AirflowNetwork3zVentAutoWPC.idf +++ b/testfiles/AirflowNetwork3zVentAutoWPC.idf @@ -934,7 +934,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -956,7 +956,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -978,7 +978,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetworkOccupantVentilationControl.idf b/testfiles/AirflowNetworkOccupantVentilationControl.idf index 32d5b07004e..7c58c050453 100644 --- a/testfiles/AirflowNetworkOccupantVentilationControl.idf +++ b/testfiles/AirflowNetworkOccupantVentilationControl.idf @@ -936,7 +936,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -958,7 +958,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -980,7 +980,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_MULTIZONE_House_DuctSizing.idf b/testfiles/AirflowNetwork_MULTIZONE_House_DuctSizing.idf index 361e331d200..82c21c4d68d 100644 --- a/testfiles/AirflowNetwork_MULTIZONE_House_DuctSizing.idf +++ b/testfiles/AirflowNetwork_MULTIZONE_House_DuctSizing.idf @@ -1130,7 +1130,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_MultiAirLoops.idf b/testfiles/AirflowNetwork_MultiAirLoops.idf index c06c4b91315..03e409ec636 100644 --- a/testfiles/AirflowNetwork_MultiAirLoops.idf +++ b/testfiles/AirflowNetwork_MultiAirLoops.idf @@ -1609,7 +1609,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1631,7 +1631,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1653,7 +1653,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_MultiZone_House.idf b/testfiles/AirflowNetwork_MultiZone_House.idf index 3678653210f..5eea33b76f5 100644 --- a/testfiles/AirflowNetwork_MultiZone_House.idf +++ b/testfiles/AirflowNetwork_MultiZone_House.idf @@ -1135,7 +1135,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_MultiZone_House_FanModel.idf b/testfiles/AirflowNetwork_MultiZone_House_FanModel.idf index e0c5d774fe9..16ce9d543ad 100644 --- a/testfiles/AirflowNetwork_MultiZone_House_FanModel.idf +++ b/testfiles/AirflowNetwork_MultiZone_House_FanModel.idf @@ -1116,7 +1116,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_MultiZone_House_OvercoolDehumid.idf b/testfiles/AirflowNetwork_MultiZone_House_OvercoolDehumid.idf index 4b0a605d133..b63a1667590 100644 --- a/testfiles/AirflowNetwork_MultiZone_House_OvercoolDehumid.idf +++ b/testfiles/AirflowNetwork_MultiZone_House_OvercoolDehumid.idf @@ -1418,7 +1418,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_MultiZone_House_TwoSpeed.idf b/testfiles/AirflowNetwork_MultiZone_House_TwoSpeed.idf index 8a6f64045cf..dbf5ce8ef13 100644 --- a/testfiles/AirflowNetwork_MultiZone_House_TwoSpeed.idf +++ b/testfiles/AirflowNetwork_MultiZone_House_TwoSpeed.idf @@ -1137,7 +1137,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_MultiZone_LocalNode.idf b/testfiles/AirflowNetwork_MultiZone_LocalNode.idf index 12b604fc0f3..b0d1915244c 100644 --- a/testfiles/AirflowNetwork_MultiZone_LocalNode.idf +++ b/testfiles/AirflowNetwork_MultiZone_LocalNode.idf @@ -1120,7 +1120,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_MultiZone_SmallOffice.idf b/testfiles/AirflowNetwork_MultiZone_SmallOffice.idf index 35f25fa9c08..c81ede7bad8 100644 --- a/testfiles/AirflowNetwork_MultiZone_SmallOffice.idf +++ b/testfiles/AirflowNetwork_MultiZone_SmallOffice.idf @@ -1521,7 +1521,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1543,7 +1543,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1565,7 +1565,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_MultiZone_SmallOffice_CoilHXAssistedDX.idf b/testfiles/AirflowNetwork_MultiZone_SmallOffice_CoilHXAssistedDX.idf index 30876b44a54..a8176fc376f 100644 --- a/testfiles/AirflowNetwork_MultiZone_SmallOffice_CoilHXAssistedDX.idf +++ b/testfiles/AirflowNetwork_MultiZone_SmallOffice_CoilHXAssistedDX.idf @@ -1548,7 +1548,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1570,7 +1570,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1592,7 +1592,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_MultiZone_SmallOffice_GenericContam.idf b/testfiles/AirflowNetwork_MultiZone_SmallOffice_GenericContam.idf index 7d66c335034..2f4743fe255 100644 --- a/testfiles/AirflowNetwork_MultiZone_SmallOffice_GenericContam.idf +++ b/testfiles/AirflowNetwork_MultiZone_SmallOffice_GenericContam.idf @@ -1527,7 +1527,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1549,7 +1549,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1571,7 +1571,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_MultiZone_SmallOffice_HeatRecoveryHXSL.idf b/testfiles/AirflowNetwork_MultiZone_SmallOffice_HeatRecoveryHXSL.idf index ff9de5c32ee..aa89074e203 100644 --- a/testfiles/AirflowNetwork_MultiZone_SmallOffice_HeatRecoveryHXSL.idf +++ b/testfiles/AirflowNetwork_MultiZone_SmallOffice_HeatRecoveryHXSL.idf @@ -1523,7 +1523,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1545,7 +1545,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1567,7 +1567,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_MultiZone_SmallOffice_VAV.idf b/testfiles/AirflowNetwork_MultiZone_SmallOffice_VAV.idf index 5403a556ee6..93c1121c22b 100644 --- a/testfiles/AirflowNetwork_MultiZone_SmallOffice_VAV.idf +++ b/testfiles/AirflowNetwork_MultiZone_SmallOffice_VAV.idf @@ -1571,7 +1571,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1593,7 +1593,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1615,7 +1615,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_Multizone_HorizontalOpening.idf b/testfiles/AirflowNetwork_Multizone_HorizontalOpening.idf index b188c6f52b4..3719e2318db 100644 --- a/testfiles/AirflowNetwork_Multizone_HorizontalOpening.idf +++ b/testfiles/AirflowNetwork_Multizone_HorizontalOpening.idf @@ -1388,7 +1388,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1410,7 +1410,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1432,7 +1432,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1454,7 +1454,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1476,7 +1476,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1498,7 +1498,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_PressureControl.idf b/testfiles/AirflowNetwork_PressureControl.idf index 48ad450b235..a0bffe95398 100644 --- a/testfiles/AirflowNetwork_PressureControl.idf +++ b/testfiles/AirflowNetwork_PressureControl.idf @@ -1528,7 +1528,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1550,7 +1550,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1572,7 +1572,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_Simple_House.idf b/testfiles/AirflowNetwork_Simple_House.idf index 7472175b6be..d758aab5385 100644 --- a/testfiles/AirflowNetwork_Simple_House.idf +++ b/testfiles/AirflowNetwork_Simple_House.idf @@ -1124,7 +1124,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowNetwork_Simple_SmallOffice.idf b/testfiles/AirflowNetwork_Simple_SmallOffice.idf index f7ef349645b..987f64246de 100644 --- a/testfiles/AirflowNetwork_Simple_SmallOffice.idf +++ b/testfiles/AirflowNetwork_Simple_SmallOffice.idf @@ -1526,7 +1526,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1548,7 +1548,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1570,7 +1570,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowWindowsAndBetweenGlassBlinds.idf b/testfiles/AirflowWindowsAndBetweenGlassBlinds.idf index 629d72199a9..3b793b2c2a1 100644 --- a/testfiles/AirflowWindowsAndBetweenGlassBlinds.idf +++ b/testfiles/AirflowWindowsAndBetweenGlassBlinds.idf @@ -569,7 +569,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -603,7 +603,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -651,7 +651,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/AirflowWindowsAndBetweenGlassShades.idf b/testfiles/AirflowWindowsAndBetweenGlassShades.idf index 1e51b5f8ef5..fbbec73bb29 100644 --- a/testfiles/AirflowWindowsAndBetweenGlassShades.idf +++ b/testfiles/AirflowWindowsAndBetweenGlassShades.idf @@ -583,7 +583,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -617,7 +617,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -665,7 +665,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/BaseBoardElectric.idf b/testfiles/BaseBoardElectric.idf index 47840ae34ef..f6863c27f00 100644 --- a/testfiles/BaseBoardElectric.idf +++ b/testfiles/BaseBoardElectric.idf @@ -1056,7 +1056,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1078,7 +1078,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1100,7 +1100,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CVRhMinHum.idf b/testfiles/CVRhMinHum.idf index ae439641a3f..b4f7c23cff7 100644 --- a/testfiles/CVRhMinHum.idf +++ b/testfiles/CVRhMinHum.idf @@ -674,7 +674,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -708,7 +708,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -756,7 +756,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CarrollMRT-RefBldgLargeOfficeNew2004_Chicago.idf b/testfiles/CarrollMRT-RefBldgLargeOfficeNew2004_Chicago.idf index 4f5d7ea82b9..1f760a0184e 100644 --- a/testfiles/CarrollMRT-RefBldgLargeOfficeNew2004_Chicago.idf +++ b/testfiles/CarrollMRT-RefBldgLargeOfficeNew2004_Chicago.idf @@ -3308,7 +3308,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3330,7 +3330,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3352,7 +3352,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3374,7 +3374,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3396,7 +3396,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3418,7 +3418,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3440,7 +3440,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3462,7 +3462,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3484,7 +3484,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3506,7 +3506,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3528,7 +3528,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3550,7 +3550,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3572,7 +3572,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3594,7 +3594,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3616,7 +3616,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3638,7 +3638,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ChangeoverBypassVAV.idf b/testfiles/ChangeoverBypassVAV.idf index dcf9b227038..e2085a152d9 100644 --- a/testfiles/ChangeoverBypassVAV.idf +++ b/testfiles/ChangeoverBypassVAV.idf @@ -969,7 +969,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -991,7 +991,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1013,7 +1013,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ChangeoverBypassVAV_AirToAir.idf b/testfiles/ChangeoverBypassVAV_AirToAir.idf index d03f53bfdc1..73fa4776151 100644 --- a/testfiles/ChangeoverBypassVAV_AirToAir.idf +++ b/testfiles/ChangeoverBypassVAV_AirToAir.idf @@ -976,7 +976,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -998,7 +998,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1020,7 +1020,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ChangeoverBypassVAV_AirToAirHeatPump.idf b/testfiles/ChangeoverBypassVAV_AirToAirHeatPump.idf index b292baa21db..0a9dca37d4d 100644 --- a/testfiles/ChangeoverBypassVAV_AirToAirHeatPump.idf +++ b/testfiles/ChangeoverBypassVAV_AirToAirHeatPump.idf @@ -976,7 +976,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -998,7 +998,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1020,7 +1020,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ChangeoverBypassVAV_MaxTemp.idf b/testfiles/ChangeoverBypassVAV_MaxTemp.idf index 8838957184b..7f0827b2bea 100644 --- a/testfiles/ChangeoverBypassVAV_MaxTemp.idf +++ b/testfiles/ChangeoverBypassVAV_MaxTemp.idf @@ -978,7 +978,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1000,7 +1000,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1022,7 +1022,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ChillerPartLoadCurve_RefBldgLargeOfficeNew2004_Chicago.idf b/testfiles/ChillerPartLoadCurve_RefBldgLargeOfficeNew2004_Chicago.idf index 32b95bb46a2..4f4b392b014 100644 --- a/testfiles/ChillerPartLoadCurve_RefBldgLargeOfficeNew2004_Chicago.idf +++ b/testfiles/ChillerPartLoadCurve_RefBldgLargeOfficeNew2004_Chicago.idf @@ -3304,7 +3304,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3326,7 +3326,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3348,7 +3348,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3370,7 +3370,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3392,7 +3392,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3414,7 +3414,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3436,7 +3436,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3458,7 +3458,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3480,7 +3480,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3502,7 +3502,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3524,7 +3524,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3546,7 +3546,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3568,7 +3568,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3590,7 +3590,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3612,7 +3612,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3634,7 +3634,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CmplxGlz_Daylighting_SouthVB45deg.idf b/testfiles/CmplxGlz_Daylighting_SouthVB45deg.idf index e93a0a64bad..7c47418b1c8 100644 --- a/testfiles/CmplxGlz_Daylighting_SouthVB45deg.idf +++ b/testfiles/CmplxGlz_Daylighting_SouthVB45deg.idf @@ -85453,7 +85453,7 @@ ACTIVITY-SCHED, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF-SCHED, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CmplxGlz_Daylighting_SouthVerticalVB45deg.idf b/testfiles/CmplxGlz_Daylighting_SouthVerticalVB45deg.idf index 1172ddf821f..8240af0719d 100644 --- a/testfiles/CmplxGlz_Daylighting_SouthVerticalVB45deg.idf +++ b/testfiles/CmplxGlz_Daylighting_SouthVerticalVB45deg.idf @@ -85453,7 +85453,7 @@ ACTIVITY-SCHED, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF-SCHED, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CoilWaterDesuperheating.idf b/testfiles/CoilWaterDesuperheating.idf index 074d3d6b220..9797129bd85 100644 --- a/testfiles/CoilWaterDesuperheating.idf +++ b/testfiles/CoilWaterDesuperheating.idf @@ -987,7 +987,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1009,7 +1009,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1031,7 +1031,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CoilWaterDesuperheatingUnitary.idf b/testfiles/CoilWaterDesuperheatingUnitary.idf index 87093ae64c8..66cc6e51630 100644 --- a/testfiles/CoilWaterDesuperheatingUnitary.idf +++ b/testfiles/CoilWaterDesuperheatingUnitary.idf @@ -987,7 +987,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1009,7 +1009,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1031,7 +1031,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CoilWaterDesuperheatingUnitaryCoilDX.idf b/testfiles/CoilWaterDesuperheatingUnitaryCoilDX.idf index c6b01e6c449..bdc0683ac61 100644 --- a/testfiles/CoilWaterDesuperheatingUnitaryCoilDX.idf +++ b/testfiles/CoilWaterDesuperheatingUnitaryCoilDX.idf @@ -987,7 +987,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1009,7 +1009,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1031,7 +1031,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CompSetPtControl.idf b/testfiles/CompSetPtControl.idf index 31e28da969d..6775334e35f 100644 --- a/testfiles/CompSetPtControl.idf +++ b/testfiles/CompSetPtControl.idf @@ -1078,7 +1078,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1100,7 +1100,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1122,7 +1122,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CondFD1ZonePurchAirAutoSizeWithPCM.idf b/testfiles/CondFD1ZonePurchAirAutoSizeWithPCM.idf index 4e35779a606..06ed601e7ca 100644 --- a/testfiles/CondFD1ZonePurchAirAutoSizeWithPCM.idf +++ b/testfiles/CondFD1ZonePurchAirAutoSizeWithPCM.idf @@ -630,7 +630,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/Convection.idf b/testfiles/Convection.idf index f35b07e76f6..6e9e8e55c23 100644 --- a/testfiles/Convection.idf +++ b/testfiles/Convection.idf @@ -431,7 +431,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -465,7 +465,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -513,7 +513,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ConvectionAdaptiveSmallOffice.idf b/testfiles/ConvectionAdaptiveSmallOffice.idf index 8fb61d684bc..64980ca490f 100644 --- a/testfiles/ConvectionAdaptiveSmallOffice.idf +++ b/testfiles/ConvectionAdaptiveSmallOffice.idf @@ -1857,7 +1857,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1879,7 +1879,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1901,7 +1901,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1923,7 +1923,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1945,7 +1945,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CoolingCoilFreezingPrevention.idf b/testfiles/CoolingCoilFreezingPrevention.idf index c3c35450913..65bc83f59d7 100644 --- a/testfiles/CoolingCoilFreezingPrevention.idf +++ b/testfiles/CoolingCoilFreezingPrevention.idf @@ -968,7 +968,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -990,7 +990,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1012,7 +1012,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/CoolingTower.idf b/testfiles/CoolingTower.idf index 37b7f45f617..196a2699080 100644 --- a/testfiles/CoolingTower.idf +++ b/testfiles/CoolingTower.idf @@ -535,7 +535,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -569,7 +569,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -617,7 +617,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CoolingTowerNomCap.idf b/testfiles/CoolingTowerNomCap.idf index 9668d35d00b..be888c49e8c 100644 --- a/testfiles/CoolingTowerNomCap.idf +++ b/testfiles/CoolingTowerNomCap.idf @@ -523,7 +523,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -557,7 +557,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -605,7 +605,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CoolingTowerWithWBDeltaTempOp.idf b/testfiles/CoolingTowerWithWBDeltaTempOp.idf index 5cc1358698c..2450a0dcb3e 100644 --- a/testfiles/CoolingTowerWithWBDeltaTempOp.idf +++ b/testfiles/CoolingTowerWithWBDeltaTempOp.idf @@ -758,7 +758,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -792,7 +792,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -840,7 +840,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CoolingTower_FluidBypass.idf b/testfiles/CoolingTower_FluidBypass.idf index 5d7ec2bff19..814ba4b12fc 100644 --- a/testfiles/CoolingTower_FluidBypass.idf +++ b/testfiles/CoolingTower_FluidBypass.idf @@ -1465,7 +1465,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1799,7 +1799,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2188,7 +2188,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2606,7 +2606,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3039,7 +3039,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3417,7 +3417,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3795,7 +3795,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4173,7 +4173,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4551,7 +4551,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4929,7 +4929,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5307,7 +5307,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5685,7 +5685,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6063,7 +6063,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6441,7 +6441,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6819,7 +6819,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7197,7 +7197,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CoolingTower_MerkelVariableSpeed.idf b/testfiles/CoolingTower_MerkelVariableSpeed.idf index 349a7f1bea3..779fd02e09e 100644 --- a/testfiles/CoolingTower_MerkelVariableSpeed.idf +++ b/testfiles/CoolingTower_MerkelVariableSpeed.idf @@ -3264,7 +3264,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3286,7 +3286,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3308,7 +3308,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3330,7 +3330,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3352,7 +3352,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3374,7 +3374,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3396,7 +3396,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3418,7 +3418,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3440,7 +3440,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3462,7 +3462,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3484,7 +3484,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3506,7 +3506,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3528,7 +3528,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3550,7 +3550,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3572,7 +3572,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3594,7 +3594,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CoolingTower_SingleSpeed_MultiCell.idf b/testfiles/CoolingTower_SingleSpeed_MultiCell.idf index e58ef911e0a..33e6ad48df1 100644 --- a/testfiles/CoolingTower_SingleSpeed_MultiCell.idf +++ b/testfiles/CoolingTower_SingleSpeed_MultiCell.idf @@ -1465,7 +1465,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1799,7 +1799,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2188,7 +2188,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2606,7 +2606,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3039,7 +3039,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3417,7 +3417,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3795,7 +3795,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4173,7 +4173,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4551,7 +4551,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4929,7 +4929,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5307,7 +5307,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5685,7 +5685,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6063,7 +6063,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6441,7 +6441,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6819,7 +6819,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7197,7 +7197,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CoolingTower_TwoSpeed.idf b/testfiles/CoolingTower_TwoSpeed.idf index ef4f60f1328..30cea233c6d 100644 --- a/testfiles/CoolingTower_TwoSpeed.idf +++ b/testfiles/CoolingTower_TwoSpeed.idf @@ -527,7 +527,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -561,7 +561,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -609,7 +609,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CoolingTower_TwoSpeed_CondEntTempReset.idf b/testfiles/CoolingTower_TwoSpeed_CondEntTempReset.idf index fc31aed85f2..1b4a09e34fb 100644 --- a/testfiles/CoolingTower_TwoSpeed_CondEntTempReset.idf +++ b/testfiles/CoolingTower_TwoSpeed_CondEntTempReset.idf @@ -528,7 +528,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -562,7 +562,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -610,7 +610,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CoolingTower_TwoSpeed_MultiCell.idf b/testfiles/CoolingTower_TwoSpeed_MultiCell.idf index d2762e67690..670b3b91e72 100644 --- a/testfiles/CoolingTower_TwoSpeed_MultiCell.idf +++ b/testfiles/CoolingTower_TwoSpeed_MultiCell.idf @@ -1465,7 +1465,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1799,7 +1799,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2188,7 +2188,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2606,7 +2606,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3039,7 +3039,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3417,7 +3417,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3795,7 +3795,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4173,7 +4173,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4551,7 +4551,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4929,7 +4929,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5307,7 +5307,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5685,7 +5685,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6063,7 +6063,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6441,7 +6441,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6819,7 +6819,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7197,7 +7197,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CoolingTower_VariableSpeed_MultiCell.idf b/testfiles/CoolingTower_VariableSpeed_MultiCell.idf index ed286e0452b..71a907c58b9 100644 --- a/testfiles/CoolingTower_VariableSpeed_MultiCell.idf +++ b/testfiles/CoolingTower_VariableSpeed_MultiCell.idf @@ -1465,7 +1465,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1799,7 +1799,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2188,7 +2188,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2606,7 +2606,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3039,7 +3039,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3417,7 +3417,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3795,7 +3795,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4173,7 +4173,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4551,7 +4551,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4929,7 +4929,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5307,7 +5307,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5685,7 +5685,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6063,7 +6063,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6441,7 +6441,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6819,7 +6819,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7197,7 +7197,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/CustomSolarVisibleSpectrum_RefBldgSmallOfficeNew2004_Chicago.idf b/testfiles/CustomSolarVisibleSpectrum_RefBldgSmallOfficeNew2004_Chicago.idf index 0da19fa6bb5..5bd64fb7f65 100644 --- a/testfiles/CustomSolarVisibleSpectrum_RefBldgSmallOfficeNew2004_Chicago.idf +++ b/testfiles/CustomSolarVisibleSpectrum_RefBldgSmallOfficeNew2004_Chicago.idf @@ -1849,7 +1849,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1871,7 +1871,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1893,7 +1893,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1915,7 +1915,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1937,7 +1937,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/DDAutoSize.idf b/testfiles/DDAutoSize.idf index 519435e0d98..780daeabc53 100644 --- a/testfiles/DDAutoSize.idf +++ b/testfiles/DDAutoSize.idf @@ -682,7 +682,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -716,7 +716,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -764,7 +764,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/DOASDualDuctSchool.idf b/testfiles/DOASDualDuctSchool.idf index 7fe771b9127..282966754e1 100644 --- a/testfiles/DOASDualDuctSchool.idf +++ b/testfiles/DOASDualDuctSchool.idf @@ -1551,7 +1551,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2428,7 +2428,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3316,7 +3316,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3993,7 +3993,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6766,7 +6766,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7430,7 +7430,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/DOAToUnitarySystem.idf b/testfiles/DOAToUnitarySystem.idf index 6949755b384..d7116a5a328 100644 --- a/testfiles/DOAToUnitarySystem.idf +++ b/testfiles/DOAToUnitarySystem.idf @@ -1671,7 +1671,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1693,7 +1693,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1715,7 +1715,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1737,7 +1737,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1759,7 +1759,7 @@ ActSchd, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/DXCoilSystemAuto.idf b/testfiles/DXCoilSystemAuto.idf index 2967a274ad5..18022ab2a01 100644 --- a/testfiles/DXCoilSystemAuto.idf +++ b/testfiles/DXCoilSystemAuto.idf @@ -967,7 +967,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -989,7 +989,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1011,7 +1011,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/DesiccantCVRh.idf b/testfiles/DesiccantCVRh.idf index 9a7e55ef31b..f0703f04836 100644 --- a/testfiles/DesiccantCVRh.idf +++ b/testfiles/DesiccantCVRh.idf @@ -1018,7 +1018,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1040,7 +1040,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1062,7 +1062,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/DesiccantCVRhZoneRHCtrl.idf b/testfiles/DesiccantCVRhZoneRHCtrl.idf index 72ed574885a..b648943dc01 100644 --- a/testfiles/DesiccantCVRhZoneRHCtrl.idf +++ b/testfiles/DesiccantCVRhZoneRHCtrl.idf @@ -1040,7 +1040,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1062,7 +1062,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1084,7 +1084,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/DesiccantCVRhZoneRHCtrl_AddedAutosize.idf b/testfiles/DesiccantCVRhZoneRHCtrl_AddedAutosize.idf index ab2f704908b..d6d46458d1d 100644 --- a/testfiles/DesiccantCVRhZoneRHCtrl_AddedAutosize.idf +++ b/testfiles/DesiccantCVRhZoneRHCtrl_AddedAutosize.idf @@ -1040,7 +1040,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1062,7 +1062,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1084,7 +1084,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/DirectIndirectEvapCoolers.idf b/testfiles/DirectIndirectEvapCoolers.idf index 8c042a4bf6b..268df6bee88 100644 --- a/testfiles/DirectIndirectEvapCoolers.idf +++ b/testfiles/DirectIndirectEvapCoolers.idf @@ -2409,7 +2409,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2966,7 +2966,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3348,7 +3348,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3730,7 +3730,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/DirectIndirectEvapCoolersVSAS.idf b/testfiles/DirectIndirectEvapCoolersVSAS.idf index 29351e526cb..4db84af0f53 100644 --- a/testfiles/DirectIndirectEvapCoolersVSAS.idf +++ b/testfiles/DirectIndirectEvapCoolersVSAS.idf @@ -3082,7 +3082,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3639,7 +3639,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4021,7 +4021,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4403,7 +4403,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/DisplacementVent_Nat_AirflowNetwork_AdaptiveComfort.idf b/testfiles/DisplacementVent_Nat_AirflowNetwork_AdaptiveComfort.idf index da5e61a7587..6484a292118 100644 --- a/testfiles/DisplacementVent_Nat_AirflowNetwork_AdaptiveComfort.idf +++ b/testfiles/DisplacementVent_Nat_AirflowNetwork_AdaptiveComfort.idf @@ -571,7 +571,7 @@ Live Gang, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/DualDuctConstVolDamper.idf b/testfiles/DualDuctConstVolDamper.idf index 48749b2909f..3179c4df154 100644 --- a/testfiles/DualDuctConstVolDamper.idf +++ b/testfiles/DualDuctConstVolDamper.idf @@ -1021,7 +1021,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1043,7 +1043,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1065,7 +1065,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/DualDuctConstVolGasHC.idf b/testfiles/DualDuctConstVolGasHC.idf index 46526a8ac1d..a5b9477fefe 100644 --- a/testfiles/DualDuctConstVolGasHC.idf +++ b/testfiles/DualDuctConstVolGasHC.idf @@ -1033,7 +1033,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1055,7 +1055,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1077,7 +1077,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/DualDuctVarVolDamper.idf b/testfiles/DualDuctVarVolDamper.idf index 6cd5d23c824..749a9802382 100644 --- a/testfiles/DualDuctVarVolDamper.idf +++ b/testfiles/DualDuctVarVolDamper.idf @@ -1061,7 +1061,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1083,7 +1083,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1105,7 +1105,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/DualDuctWaterCoils.idf b/testfiles/DualDuctWaterCoils.idf index 0fedc0bd26b..e3c5786fbd4 100644 --- a/testfiles/DualDuctWaterCoils.idf +++ b/testfiles/DualDuctWaterCoils.idf @@ -1042,7 +1042,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1064,7 +1064,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1086,7 +1086,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSAirflowNetworkOpeningControlByHumidity.idf b/testfiles/EMSAirflowNetworkOpeningControlByHumidity.idf index fa382d72a83..e11c722c891 100644 --- a/testfiles/EMSAirflowNetworkOpeningControlByHumidity.idf +++ b/testfiles/EMSAirflowNetworkOpeningControlByHumidity.idf @@ -1582,7 +1582,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1604,7 +1604,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1626,7 +1626,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSConstantVolumePurchasedAir.idf b/testfiles/EMSConstantVolumePurchasedAir.idf index fa4a940ee4c..24296b14f5a 100644 --- a/testfiles/EMSConstantVolumePurchasedAir.idf +++ b/testfiles/EMSConstantVolumePurchasedAir.idf @@ -588,7 +588,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -622,7 +622,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -670,7 +670,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSCurveOverride_PackagedTerminalHeatPump.idf b/testfiles/EMSCurveOverride_PackagedTerminalHeatPump.idf index c016381ee3d..51c572d10ee 100644 --- a/testfiles/EMSCurveOverride_PackagedTerminalHeatPump.idf +++ b/testfiles/EMSCurveOverride_PackagedTerminalHeatPump.idf @@ -1217,7 +1217,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1239,7 +1239,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1261,7 +1261,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSCustomOutputVariable.idf b/testfiles/EMSCustomOutputVariable.idf index f9ce7aa3b06..5291e4b9f9d 100644 --- a/testfiles/EMSCustomOutputVariable.idf +++ b/testfiles/EMSCustomOutputVariable.idf @@ -1398,7 +1398,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1906,7 +1906,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2314,7 +2314,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2752,7 +2752,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3160,7 +3160,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSCustomSchedule.idf b/testfiles/EMSCustomSchedule.idf index 83c92e43fb6..5f1c1dd48a4 100644 --- a/testfiles/EMSCustomSchedule.idf +++ b/testfiles/EMSCustomSchedule.idf @@ -1482,7 +1482,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1990,7 +1990,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2398,7 +2398,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2836,7 +2836,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3244,7 +3244,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSDemandManager_LargeOffice.idf b/testfiles/EMSDemandManager_LargeOffice.idf index 921b522e1c9..6dee1f2c1f6 100644 --- a/testfiles/EMSDemandManager_LargeOffice.idf +++ b/testfiles/EMSDemandManager_LargeOffice.idf @@ -1493,7 +1493,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1827,7 +1827,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2216,7 +2216,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2634,7 +2634,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3067,7 +3067,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3445,7 +3445,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3823,7 +3823,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4201,7 +4201,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4579,7 +4579,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4957,7 +4957,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5335,7 +5335,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5713,7 +5713,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6091,7 +6091,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6469,7 +6469,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6847,7 +6847,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7225,7 +7225,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSDiscreteAirSystemSizes.idf b/testfiles/EMSDiscreteAirSystemSizes.idf index 19dd2df96f3..6dd7d0727ac 100644 --- a/testfiles/EMSDiscreteAirSystemSizes.idf +++ b/testfiles/EMSDiscreteAirSystemSizes.idf @@ -1408,7 +1408,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1816,7 +1816,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2224,7 +2224,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2632,7 +2632,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3040,7 +3040,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3508,7 +3508,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3916,7 +3916,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4324,7 +4324,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4732,7 +4732,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5140,7 +5140,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSMultiSpeedHeatPumpOverrideControl.idf b/testfiles/EMSMultiSpeedHeatPumpOverrideControl.idf index 8a0a0049d41..d8e8be9607a 100644 --- a/testfiles/EMSMultiSpeedHeatPumpOverrideControl.idf +++ b/testfiles/EMSMultiSpeedHeatPumpOverrideControl.idf @@ -1126,7 +1126,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSPlantLoopOverrideControl.idf b/testfiles/EMSPlantLoopOverrideControl.idf index fa42ebdb5d3..db51662e432 100644 --- a/testfiles/EMSPlantLoopOverrideControl.idf +++ b/testfiles/EMSPlantLoopOverrideControl.idf @@ -3790,7 +3790,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3812,7 +3812,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3834,7 +3834,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3856,7 +3856,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3878,7 +3878,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3900,7 +3900,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3922,7 +3922,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3944,7 +3944,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3966,7 +3966,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3988,7 +3988,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSPlantOperation_largeOff.idf b/testfiles/EMSPlantOperation_largeOff.idf index ba1d32b2f62..c878d59e4f6 100644 --- a/testfiles/EMSPlantOperation_largeOff.idf +++ b/testfiles/EMSPlantOperation_largeOff.idf @@ -3264,7 +3264,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3286,7 +3286,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3308,7 +3308,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3330,7 +3330,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3352,7 +3352,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3374,7 +3374,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3396,7 +3396,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3418,7 +3418,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3440,7 +3440,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3462,7 +3462,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3484,7 +3484,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3506,7 +3506,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3528,7 +3528,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3550,7 +3550,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3572,7 +3572,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3594,7 +3594,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSReplaceTraditionalManagers_LargeOffice.idf b/testfiles/EMSReplaceTraditionalManagers_LargeOffice.idf index f98b949b63f..d014d9d5284 100644 --- a/testfiles/EMSReplaceTraditionalManagers_LargeOffice.idf +++ b/testfiles/EMSReplaceTraditionalManagers_LargeOffice.idf @@ -1483,7 +1483,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1817,7 +1817,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2206,7 +2206,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2624,7 +2624,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3057,7 +3057,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3435,7 +3435,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3813,7 +3813,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4191,7 +4191,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4569,7 +4569,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4947,7 +4947,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5325,7 +5325,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5703,7 +5703,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6081,7 +6081,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6459,7 +6459,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6837,7 +6837,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7215,7 +7215,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSTestMathAndKill.idf b/testfiles/EMSTestMathAndKill.idf index 58d38c27de2..5a77c4485e6 100644 --- a/testfiles/EMSTestMathAndKill.idf +++ b/testfiles/EMSTestMathAndKill.idf @@ -1579,7 +1579,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2087,7 +2087,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2495,7 +2495,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2933,7 +2933,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3341,7 +3341,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSThermochromicWindow.idf b/testfiles/EMSThermochromicWindow.idf index 4aecc08d326..f2a0306e88b 100644 --- a/testfiles/EMSThermochromicWindow.idf +++ b/testfiles/EMSThermochromicWindow.idf @@ -1324,7 +1324,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1827,7 +1827,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2230,7 +2230,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2663,7 +2663,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3066,7 +3066,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSUserDefinedWindACAuto.idf b/testfiles/EMSUserDefinedWindACAuto.idf index 8e441435cce..019c591031f 100644 --- a/testfiles/EMSUserDefinedWindACAuto.idf +++ b/testfiles/EMSUserDefinedWindACAuto.idf @@ -628,7 +628,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -662,7 +662,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -710,7 +710,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EMSWindowShadeControl.idf b/testfiles/EMSWindowShadeControl.idf index ee1e21aa0bc..147a73136a3 100644 --- a/testfiles/EMSWindowShadeControl.idf +++ b/testfiles/EMSWindowShadeControl.idf @@ -580,7 +580,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -614,7 +614,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -662,7 +662,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EcoroofOrlando.idf b/testfiles/EcoroofOrlando.idf index fe82bb76316..9cde099dfca 100644 --- a/testfiles/EcoroofOrlando.idf +++ b/testfiles/EcoroofOrlando.idf @@ -3788,7 +3788,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3810,7 +3810,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3832,7 +3832,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3854,7 +3854,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3876,7 +3876,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3898,7 +3898,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3920,7 +3920,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3942,7 +3942,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3964,7 +3964,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3986,7 +3986,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EcoroofOrlando_NoSitePrec.idf b/testfiles/EcoroofOrlando_NoSitePrec.idf index e18374c1d00..e042eb74f6f 100644 --- a/testfiles/EcoroofOrlando_NoSitePrec.idf +++ b/testfiles/EcoroofOrlando_NoSitePrec.idf @@ -2282,7 +2282,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2304,7 +2304,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2326,7 +2326,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2348,7 +2348,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2370,7 +2370,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2392,7 +2392,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2414,7 +2414,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2436,7 +2436,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2458,7 +2458,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2480,7 +2480,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ElectricEIRChiller.idf b/testfiles/ElectricEIRChiller.idf index 997ccf48a90..c8fe8d93405 100644 --- a/testfiles/ElectricEIRChiller.idf +++ b/testfiles/ElectricEIRChiller.idf @@ -522,7 +522,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -556,7 +556,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -604,7 +604,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ElectricEIRChillerHeatRecoveryAuto.idf b/testfiles/ElectricEIRChillerHeatRecoveryAuto.idf index 5f37fbc557e..a6f364424b0 100644 --- a/testfiles/ElectricEIRChillerHeatRecoveryAuto.idf +++ b/testfiles/ElectricEIRChillerHeatRecoveryAuto.idf @@ -1174,7 +1174,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1196,7 +1196,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1218,7 +1218,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ElectricEIRChiller_EvapCooledCondenser.idf b/testfiles/ElectricEIRChiller_EvapCooledCondenser.idf index 56f047c0a68..be400ff5ca4 100644 --- a/testfiles/ElectricEIRChiller_EvapCooledCondenser.idf +++ b/testfiles/ElectricEIRChiller_EvapCooledCondenser.idf @@ -1043,7 +1043,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1065,7 +1065,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1087,7 +1087,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EngineChiller.idf b/testfiles/EngineChiller.idf index 5e97f731f8f..41e50051021 100644 --- a/testfiles/EngineChiller.idf +++ b/testfiles/EngineChiller.idf @@ -1037,7 +1037,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1059,7 +1059,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1081,7 +1081,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EvaporativeFluidCooler.idf b/testfiles/EvaporativeFluidCooler.idf index 88d11908789..435187fbf0d 100644 --- a/testfiles/EvaporativeFluidCooler.idf +++ b/testfiles/EvaporativeFluidCooler.idf @@ -518,7 +518,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -552,7 +552,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -600,7 +600,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/EvaporativeFluidCooler_TwoSpeed.idf b/testfiles/EvaporativeFluidCooler_TwoSpeed.idf index 12a2777704f..f3381816354 100644 --- a/testfiles/EvaporativeFluidCooler_TwoSpeed.idf +++ b/testfiles/EvaporativeFluidCooler_TwoSpeed.idf @@ -524,7 +524,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -558,7 +558,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -606,7 +606,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ExhFiredAbsorptionChiller.idf b/testfiles/ExhFiredAbsorptionChiller.idf index d378426c815..3c318716e85 100644 --- a/testfiles/ExhFiredAbsorptionChiller.idf +++ b/testfiles/ExhFiredAbsorptionChiller.idf @@ -521,7 +521,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -555,7 +555,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -603,7 +603,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FanCoilAutoSize.idf b/testfiles/FanCoilAutoSize.idf index 1a0647ff695..1464bee03ed 100644 --- a/testfiles/FanCoilAutoSize.idf +++ b/testfiles/FanCoilAutoSize.idf @@ -658,7 +658,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -692,7 +692,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -740,7 +740,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FanCoilAutoSizeScalableSizing.idf b/testfiles/FanCoilAutoSizeScalableSizing.idf index e045361fa14..6621d4409b5 100644 --- a/testfiles/FanCoilAutoSizeScalableSizing.idf +++ b/testfiles/FanCoilAutoSizeScalableSizing.idf @@ -658,7 +658,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -692,7 +692,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -740,7 +740,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FanCoilAutoSize_ASHRAE90VariableFan.idf b/testfiles/FanCoilAutoSize_ASHRAE90VariableFan.idf index 749263f6e76..767fdd32498 100644 --- a/testfiles/FanCoilAutoSize_ASHRAE90VariableFan.idf +++ b/testfiles/FanCoilAutoSize_ASHRAE90VariableFan.idf @@ -650,7 +650,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -684,7 +684,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -732,7 +732,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FanCoilAutoSize_MultiSpeedFan.idf b/testfiles/FanCoilAutoSize_MultiSpeedFan.idf index c90acb782d4..c06701452f8 100644 --- a/testfiles/FanCoilAutoSize_MultiSpeedFan.idf +++ b/testfiles/FanCoilAutoSize_MultiSpeedFan.idf @@ -665,7 +665,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -699,7 +699,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -747,7 +747,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FanCoil_HybridVent_VentSch.idf b/testfiles/FanCoil_HybridVent_VentSch.idf index ed837b3cc55..19599fbac06 100644 --- a/testfiles/FanCoil_HybridVent_VentSch.idf +++ b/testfiles/FanCoil_HybridVent_VentSch.idf @@ -774,7 +774,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -808,7 +808,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -856,7 +856,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/Fault_ChillerSWTSensorOffset_RefBldgLargeOfficeNew2004.idf b/testfiles/Fault_ChillerSWTSensorOffset_RefBldgLargeOfficeNew2004.idf index d75a25d3302..4118be43e3d 100644 --- a/testfiles/Fault_ChillerSWTSensorOffset_RefBldgLargeOfficeNew2004.idf +++ b/testfiles/Fault_ChillerSWTSensorOffset_RefBldgLargeOfficeNew2004.idf @@ -3301,7 +3301,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3323,7 +3323,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3345,7 +3345,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3367,7 +3367,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3389,7 +3389,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3411,7 +3411,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3433,7 +3433,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3455,7 +3455,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3477,7 +3477,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3499,7 +3499,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3521,7 +3521,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3543,7 +3543,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3565,7 +3565,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3587,7 +3587,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3609,7 +3609,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3631,7 +3631,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/Fault_CondenserSWTSensorOffset.idf b/testfiles/Fault_CondenserSWTSensorOffset.idf index f47fcfaa2dc..b4f37219883 100644 --- a/testfiles/Fault_CondenserSWTSensorOffset.idf +++ b/testfiles/Fault_CondenserSWTSensorOffset.idf @@ -518,7 +518,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -552,7 +552,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -600,7 +600,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/Fault_FoulingAirFilter_RefBldgMediumOfficeNew2004.idf b/testfiles/Fault_FoulingAirFilter_RefBldgMediumOfficeNew2004.idf index b0051a07b1c..c3f4591e0c6 100644 --- a/testfiles/Fault_FoulingAirFilter_RefBldgMediumOfficeNew2004.idf +++ b/testfiles/Fault_FoulingAirFilter_RefBldgMediumOfficeNew2004.idf @@ -3235,7 +3235,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3257,7 +3257,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3279,7 +3279,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3301,7 +3301,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3323,7 +3323,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3345,7 +3345,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3367,7 +3367,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3389,7 +3389,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3411,7 +3411,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3433,7 +3433,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3455,7 +3455,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3477,7 +3477,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3499,7 +3499,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3521,7 +3521,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3543,7 +3543,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/Fault_FoulingChillerBoiler_RefBldgLargeOfficeNew2004.idf b/testfiles/Fault_FoulingChillerBoiler_RefBldgLargeOfficeNew2004.idf index b2e3694d147..a3c59731f73 100644 --- a/testfiles/Fault_FoulingChillerBoiler_RefBldgLargeOfficeNew2004.idf +++ b/testfiles/Fault_FoulingChillerBoiler_RefBldgLargeOfficeNew2004.idf @@ -3316,7 +3316,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3338,7 +3338,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3360,7 +3360,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3382,7 +3382,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3404,7 +3404,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3426,7 +3426,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3448,7 +3448,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3470,7 +3470,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3492,7 +3492,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3514,7 +3514,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3536,7 +3536,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3558,7 +3558,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3580,7 +3580,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3602,7 +3602,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3624,7 +3624,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3646,7 +3646,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/Fault_FoulingCoolingTower.idf b/testfiles/Fault_FoulingCoolingTower.idf index 93c0bb60dff..c8b25432a9a 100644 --- a/testfiles/Fault_FoulingCoolingTower.idf +++ b/testfiles/Fault_FoulingCoolingTower.idf @@ -526,7 +526,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -560,7 +560,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -608,7 +608,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/Fault_FoulingEvapCooler_StripMallZoneEvapCooler.idf b/testfiles/Fault_FoulingEvapCooler_StripMallZoneEvapCooler.idf index 57c074fedce..1f4741ad0fe 100644 --- a/testfiles/Fault_FoulingEvapCooler_StripMallZoneEvapCooler.idf +++ b/testfiles/Fault_FoulingEvapCooler_StripMallZoneEvapCooler.idf @@ -2468,7 +2468,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2490,7 +2490,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2512,7 +2512,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2534,7 +2534,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2556,7 +2556,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2578,7 +2578,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2600,7 +2600,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2622,7 +2622,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2644,7 +2644,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2666,7 +2666,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/Fault_ThermostatOffset_RefBldgMediumOfficeNew2004.idf b/testfiles/Fault_ThermostatOffset_RefBldgMediumOfficeNew2004.idf index 101035b2556..10871254cf0 100644 --- a/testfiles/Fault_ThermostatOffset_RefBldgMediumOfficeNew2004.idf +++ b/testfiles/Fault_ThermostatOffset_RefBldgMediumOfficeNew2004.idf @@ -3235,7 +3235,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3257,7 +3257,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3279,7 +3279,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3301,7 +3301,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3323,7 +3323,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3345,7 +3345,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3367,7 +3367,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3389,7 +3389,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3411,7 +3411,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3433,7 +3433,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3455,7 +3455,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3477,7 +3477,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3499,7 +3499,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3521,7 +3521,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3543,7 +3543,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/Fenestration_RefBldgSmallHotelNew2004_Chicago.idf b/testfiles/Fenestration_RefBldgSmallHotelNew2004_Chicago.idf index 1c0b5a8c3b7..29c5efa10c3 100644 --- a/testfiles/Fenestration_RefBldgSmallHotelNew2004_Chicago.idf +++ b/testfiles/Fenestration_RefBldgSmallHotelNew2004_Chicago.idf @@ -12274,7 +12274,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12296,7 +12296,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12318,7 +12318,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12340,7 +12340,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12362,7 +12362,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12384,7 +12384,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12406,7 +12406,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12428,7 +12428,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12450,7 +12450,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12472,7 +12472,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12494,7 +12494,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12516,7 +12516,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12538,7 +12538,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12560,7 +12560,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12582,7 +12582,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12604,7 +12604,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12626,7 +12626,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12648,7 +12648,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12670,7 +12670,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12692,7 +12692,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12714,7 +12714,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12736,7 +12736,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12758,7 +12758,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12780,7 +12780,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12802,7 +12802,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12824,7 +12824,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12846,7 +12846,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12868,7 +12868,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12890,7 +12890,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12912,7 +12912,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12934,7 +12934,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12956,7 +12956,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12978,7 +12978,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13000,7 +13000,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13022,7 +13022,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13044,7 +13044,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13066,7 +13066,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13088,7 +13088,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13110,7 +13110,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13132,7 +13132,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13154,7 +13154,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13176,7 +13176,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FluidCooler.idf b/testfiles/FluidCooler.idf index d86daab5feb..a1826d83eec 100644 --- a/testfiles/FluidCooler.idf +++ b/testfiles/FluidCooler.idf @@ -519,7 +519,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -553,7 +553,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -601,7 +601,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FluidCoolerTwoSpeed.idf b/testfiles/FluidCoolerTwoSpeed.idf index 81a62842214..a8319946a21 100644 --- a/testfiles/FluidCoolerTwoSpeed.idf +++ b/testfiles/FluidCoolerTwoSpeed.idf @@ -533,7 +533,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -567,7 +567,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -615,7 +615,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FourPipeBeamLargeOffice.idf b/testfiles/FourPipeBeamLargeOffice.idf index c3782115c21..bc9f86f0b62 100644 --- a/testfiles/FourPipeBeamLargeOffice.idf +++ b/testfiles/FourPipeBeamLargeOffice.idf @@ -3269,7 +3269,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3291,7 +3291,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3313,7 +3313,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3335,7 +3335,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3357,7 +3357,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3379,7 +3379,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3401,7 +3401,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3423,7 +3423,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3445,7 +3445,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3467,7 +3467,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3489,7 +3489,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3511,7 +3511,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3533,7 +3533,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3555,7 +3555,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3577,7 +3577,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3599,7 +3599,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FreeCoolingChiller.idf b/testfiles/FreeCoolingChiller.idf index 4c8b8241a1b..fc3905abb80 100644 --- a/testfiles/FreeCoolingChiller.idf +++ b/testfiles/FreeCoolingChiller.idf @@ -659,7 +659,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -693,7 +693,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -741,7 +741,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/Furnace.idf b/testfiles/Furnace.idf index ecfff697533..5d7c0fa1c4a 100644 --- a/testfiles/Furnace.idf +++ b/testfiles/Furnace.idf @@ -952,7 +952,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -974,7 +974,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -996,7 +996,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FurnaceFuelOil.idf b/testfiles/FurnaceFuelOil.idf index 999bc459269..f68bec49aae 100644 --- a/testfiles/FurnaceFuelOil.idf +++ b/testfiles/FurnaceFuelOil.idf @@ -953,7 +953,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -975,7 +975,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -997,7 +997,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FurnacePLRHeatingCoil.idf b/testfiles/FurnacePLRHeatingCoil.idf index dc7d075afa5..375df9f3c8f 100644 --- a/testfiles/FurnacePLRHeatingCoil.idf +++ b/testfiles/FurnacePLRHeatingCoil.idf @@ -970,7 +970,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -992,7 +992,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1014,7 +1014,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FurnaceWithDXSystem.idf b/testfiles/FurnaceWithDXSystem.idf index dacd9d61eb9..26e7e3cd2c1 100644 --- a/testfiles/FurnaceWithDXSystem.idf +++ b/testfiles/FurnaceWithDXSystem.idf @@ -941,7 +941,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -963,7 +963,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -985,7 +985,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FurnaceWithDXSystemComfortControl.idf b/testfiles/FurnaceWithDXSystemComfortControl.idf index 30b6aa6fe3f..818ae7a320e 100644 --- a/testfiles/FurnaceWithDXSystemComfortControl.idf +++ b/testfiles/FurnaceWithDXSystemComfortControl.idf @@ -1028,7 +1028,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1050,7 +1050,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1072,7 +1072,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FurnaceWithDXSystemRHcontrol.idf b/testfiles/FurnaceWithDXSystemRHcontrol.idf index 1646dbddf71..c4f942054a1 100644 --- a/testfiles/FurnaceWithDXSystemRHcontrol.idf +++ b/testfiles/FurnaceWithDXSystemRHcontrol.idf @@ -1042,7 +1042,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1064,7 +1064,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1086,7 +1086,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FurnaceWithDXSystemRHcontrol_cyclingfan.idf b/testfiles/FurnaceWithDXSystemRHcontrol_cyclingfan.idf index 5cb6fcae275..5691cddb8a5 100644 --- a/testfiles/FurnaceWithDXSystemRHcontrol_cyclingfan.idf +++ b/testfiles/FurnaceWithDXSystemRHcontrol_cyclingfan.idf @@ -991,7 +991,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1013,7 +1013,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1035,7 +1035,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FurnaceWithDXSystem_CoolingHXAssisted.idf b/testfiles/FurnaceWithDXSystem_CoolingHXAssisted.idf index 24942fce82a..56b730f5991 100644 --- a/testfiles/FurnaceWithDXSystem_CoolingHXAssisted.idf +++ b/testfiles/FurnaceWithDXSystem_CoolingHXAssisted.idf @@ -1006,7 +1006,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1028,7 +1028,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1050,7 +1050,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/FurnaceWithDXSystem_CoolingHXAssisted_NewDXCoil.idf b/testfiles/FurnaceWithDXSystem_CoolingHXAssisted_NewDXCoil.idf index e2d76fb0e74..074c9535656 100644 --- a/testfiles/FurnaceWithDXSystem_CoolingHXAssisted_NewDXCoil.idf +++ b/testfiles/FurnaceWithDXSystem_CoolingHXAssisted_NewDXCoil.idf @@ -1006,7 +1006,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1028,7 +1028,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1050,7 +1050,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/GSHPSimple-GLHE.idf b/testfiles/GSHPSimple-GLHE.idf index de502d0590e..6fae35259b9 100644 --- a/testfiles/GSHPSimple-GLHE.idf +++ b/testfiles/GSHPSimple-GLHE.idf @@ -590,7 +590,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -624,7 +624,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -672,7 +672,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/GasTurbChiller.idf b/testfiles/GasTurbChiller.idf index 3f4c0ed7431..cad82fcc0c6 100644 --- a/testfiles/GasTurbChiller.idf +++ b/testfiles/GasTurbChiller.idf @@ -1037,7 +1037,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1059,7 +1059,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1081,7 +1081,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/GasTurbChillerHeatRecoveryAuto.idf b/testfiles/GasTurbChillerHeatRecoveryAuto.idf index 828419be855..ecdb438bc27 100644 --- a/testfiles/GasTurbChillerHeatRecoveryAuto.idf +++ b/testfiles/GasTurbChillerHeatRecoveryAuto.idf @@ -1174,7 +1174,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1196,7 +1196,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1218,7 +1218,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/Generators.idf b/testfiles/Generators.idf index 32f937a08a4..f2250e46e9a 100644 --- a/testfiles/Generators.idf +++ b/testfiles/Generators.idf @@ -1071,7 +1071,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1093,7 +1093,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1115,7 +1115,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/Generators_Transformer.idf b/testfiles/Generators_Transformer.idf index 99b9cbc86a8..507ababd908 100644 --- a/testfiles/Generators_Transformer.idf +++ b/testfiles/Generators_Transformer.idf @@ -1129,7 +1129,7 @@ Activity Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1151,7 +1151,7 @@ Activity Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1173,7 +1173,7 @@ Activity Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/GeometryTest.idf b/testfiles/GeometryTest.idf index 53836d53d38..a7b8bac2229 100644 --- a/testfiles/GeometryTest.idf +++ b/testfiles/GeometryTest.idf @@ -677,7 +677,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -776,7 +776,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HPAirToAir_wSolarCollectorHWCoil.idf b/testfiles/HPAirToAir_wSolarCollectorHWCoil.idf index 50d6d366221..9f1357430c1 100644 --- a/testfiles/HPAirToAir_wSolarCollectorHWCoil.idf +++ b/testfiles/HPAirToAir_wSolarCollectorHWCoil.idf @@ -1163,7 +1163,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1185,7 +1185,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1207,7 +1207,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HP_wICSSolarCollector.idf b/testfiles/HP_wICSSolarCollector.idf index 0dd94e2a354..f41b4240b9c 100644 --- a/testfiles/HP_wICSSolarCollector.idf +++ b/testfiles/HP_wICSSolarCollector.idf @@ -1369,7 +1369,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1391,7 +1391,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1413,7 +1413,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HVACStandAloneERV_Economizer.idf b/testfiles/HVACStandAloneERV_Economizer.idf index 0e0233fa82b..f3b4c7173b7 100644 --- a/testfiles/HVACStandAloneERV_Economizer.idf +++ b/testfiles/HVACStandAloneERV_Economizer.idf @@ -1050,7 +1050,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1072,7 +1072,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1094,7 +1094,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPump.idf b/testfiles/HeatPump.idf index 3d591da45ad..1b5ca93191d 100644 --- a/testfiles/HeatPump.idf +++ b/testfiles/HeatPump.idf @@ -962,7 +962,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -984,7 +984,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1006,7 +1006,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpAirToAirWithRHcontrol.idf b/testfiles/HeatPumpAirToAirWithRHcontrol.idf index f8c0fd47972..44167a2aa2f 100644 --- a/testfiles/HeatPumpAirToAirWithRHcontrol.idf +++ b/testfiles/HeatPumpAirToAirWithRHcontrol.idf @@ -1044,7 +1044,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1066,7 +1066,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1088,7 +1088,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpAuto.idf b/testfiles/HeatPumpAuto.idf index 057598d265a..1740ae2c7ae 100644 --- a/testfiles/HeatPumpAuto.idf +++ b/testfiles/HeatPumpAuto.idf @@ -976,7 +976,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -998,7 +998,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1020,7 +1020,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpCycFanWithEcono.idf b/testfiles/HeatPumpCycFanWithEcono.idf index b2aa6389391..2670a87ed3c 100644 --- a/testfiles/HeatPumpCycFanWithEcono.idf +++ b/testfiles/HeatPumpCycFanWithEcono.idf @@ -876,7 +876,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -898,7 +898,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -920,7 +920,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpIAQP_DCV.idf b/testfiles/HeatPumpIAQP_DCV.idf index 30288c9af39..f3e73c09e94 100644 --- a/testfiles/HeatPumpIAQP_DCV.idf +++ b/testfiles/HeatPumpIAQP_DCV.idf @@ -1017,7 +1017,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1039,7 +1039,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1061,7 +1061,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpIAQP_GenericContamControl.idf b/testfiles/HeatPumpIAQP_GenericContamControl.idf index d136da09848..783948ed84c 100644 --- a/testfiles/HeatPumpIAQP_GenericContamControl.idf +++ b/testfiles/HeatPumpIAQP_GenericContamControl.idf @@ -1055,7 +1055,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1077,7 +1077,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1099,7 +1099,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpProportionalControl_DCV.idf b/testfiles/HeatPumpProportionalControl_DCV.idf index 64c924e8f51..cd3988ab1cb 100644 --- a/testfiles/HeatPumpProportionalControl_DCV.idf +++ b/testfiles/HeatPumpProportionalControl_DCV.idf @@ -1017,7 +1017,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1039,7 +1039,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1061,7 +1061,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpProportionalControl_DCVDesignRate.idf b/testfiles/HeatPumpProportionalControl_DCVDesignRate.idf index 1c10a00c6c8..be9239fe4de 100644 --- a/testfiles/HeatPumpProportionalControl_DCVDesignRate.idf +++ b/testfiles/HeatPumpProportionalControl_DCVDesignRate.idf @@ -1038,7 +1038,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1060,7 +1060,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1082,7 +1082,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpSecondaryCoil.idf b/testfiles/HeatPumpSecondaryCoil.idf index 06578d51106..fb67fd14b5a 100644 --- a/testfiles/HeatPumpSecondaryCoil.idf +++ b/testfiles/HeatPumpSecondaryCoil.idf @@ -989,7 +989,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1011,7 +1011,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1033,7 +1033,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpSimpleDCV.idf b/testfiles/HeatPumpSimpleDCV.idf index 0b4fb14815f..0db41fc2c0d 100644 --- a/testfiles/HeatPumpSimpleDCV.idf +++ b/testfiles/HeatPumpSimpleDCV.idf @@ -989,7 +989,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1011,7 +1011,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1033,7 +1033,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpVRP_DCV.idf b/testfiles/HeatPumpVRP_DCV.idf index 5bc3966f0c0..7b3b0e64411 100644 --- a/testfiles/HeatPumpVRP_DCV.idf +++ b/testfiles/HeatPumpVRP_DCV.idf @@ -979,7 +979,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1001,7 +1001,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1023,7 +1023,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpVSAS.idf b/testfiles/HeatPumpVSAS.idf index f894ac54f6d..bba82e31ece 100644 --- a/testfiles/HeatPumpVSAS.idf +++ b/testfiles/HeatPumpVSAS.idf @@ -1282,7 +1282,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1304,7 +1304,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1326,7 +1326,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpVSAS_variableCrankcaseHeaterCapacity.idf b/testfiles/HeatPumpVSAS_variableCrankcaseHeaterCapacity.idf index 8ef53c36b2c..b4d4e010605 100644 --- a/testfiles/HeatPumpVSAS_variableCrankcaseHeaterCapacity.idf +++ b/testfiles/HeatPumpVSAS_variableCrankcaseHeaterCapacity.idf @@ -1267,7 +1267,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1289,7 +1289,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1311,7 +1311,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpWaterToAirWithAntifreezeAndLatentModel.idf b/testfiles/HeatPumpWaterToAirWithAntifreezeAndLatentModel.idf index 472969e31da..599a2b4a265 100644 --- a/testfiles/HeatPumpWaterToAirWithAntifreezeAndLatentModel.idf +++ b/testfiles/HeatPumpWaterToAirWithAntifreezeAndLatentModel.idf @@ -479,7 +479,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -513,7 +513,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -561,7 +561,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpWaterToAirWithAntifreezeAndLatentModel2.idf b/testfiles/HeatPumpWaterToAirWithAntifreezeAndLatentModel2.idf index 8d5cae502c6..80d833f444e 100644 --- a/testfiles/HeatPumpWaterToAirWithAntifreezeAndLatentModel2.idf +++ b/testfiles/HeatPumpWaterToAirWithAntifreezeAndLatentModel2.idf @@ -479,7 +479,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -513,7 +513,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -561,7 +561,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPump_variableCrankcaseHeaterCapacity.idf b/testfiles/HeatPump_variableCrankcaseHeaterCapacity.idf index 60164d0c855..e9ea0f4280e 100644 --- a/testfiles/HeatPump_variableCrankcaseHeaterCapacity.idf +++ b/testfiles/HeatPump_variableCrankcaseHeaterCapacity.idf @@ -947,7 +947,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -969,7 +969,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -991,7 +991,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatPumpwithBiquadraticCurves.idf b/testfiles/HeatPumpwithBiquadraticCurves.idf index 2bfc8598294..2b5233ce15a 100644 --- a/testfiles/HeatPumpwithBiquadraticCurves.idf +++ b/testfiles/HeatPumpwithBiquadraticCurves.idf @@ -987,7 +987,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1009,7 +1009,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1031,7 +1031,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatRecoveryElectricChiller.idf b/testfiles/HeatRecoveryElectricChiller.idf index fcabecb8679..556a2054296 100644 --- a/testfiles/HeatRecoveryElectricChiller.idf +++ b/testfiles/HeatRecoveryElectricChiller.idf @@ -1081,7 +1081,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1103,7 +1103,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1125,7 +1125,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatRecoveryPlantLoop.idf b/testfiles/HeatRecoveryPlantLoop.idf index a11483699b9..657db806549 100644 --- a/testfiles/HeatRecoveryPlantLoop.idf +++ b/testfiles/HeatRecoveryPlantLoop.idf @@ -1144,7 +1144,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1166,7 +1166,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1188,7 +1188,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatRecoveryPlantLoopAuto.idf b/testfiles/HeatRecoveryPlantLoopAuto.idf index a8c9badcd90..cc4eee391fc 100644 --- a/testfiles/HeatRecoveryPlantLoopAuto.idf +++ b/testfiles/HeatRecoveryPlantLoopAuto.idf @@ -1230,7 +1230,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1252,7 +1252,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1274,7 +1274,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HeatRecoverywithStorageTank.idf b/testfiles/HeatRecoverywithStorageTank.idf index 3d6b644588e..675a169d752 100644 --- a/testfiles/HeatRecoverywithStorageTank.idf +++ b/testfiles/HeatRecoverywithStorageTank.idf @@ -1144,7 +1144,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1166,7 +1166,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1188,7 +1188,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HospitalBaseline.idf b/testfiles/HospitalBaseline.idf index 163c3a8e776..1d228beee62 100644 --- a/testfiles/HospitalBaseline.idf +++ b/testfiles/HospitalBaseline.idf @@ -1691,7 +1691,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2435,7 +2435,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2896,7 +2896,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3340,7 +3340,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3784,7 +3784,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4228,7 +4228,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4628,7 +4628,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5690,7 +5690,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6118,7 +6118,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6629,7 +6629,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7101,7 +7101,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7573,7 +7573,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8100,7 +8100,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8500,7 +8500,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9837,7 +9837,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10281,7 +10281,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10742,7 +10742,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11186,7 +11186,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11630,7 +11630,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12089,7 +12089,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12533,7 +12533,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12933,7 +12933,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13333,7 +13333,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14199,7 +14199,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14599,7 +14599,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15354,7 +15354,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15813,7 +15813,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16213,7 +16213,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16613,7 +16613,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17481,7 +17481,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17940,7 +17940,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18340,7 +18340,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18740,7 +18740,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19157,7 +19157,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19601,7 +19601,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -20001,7 +20001,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -20490,7 +20490,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -20977,7 +20977,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -21405,7 +21405,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -21856,7 +21856,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -22284,7 +22284,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -22704,7 +22704,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -23163,7 +23163,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -23563,7 +23563,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -24052,7 +24052,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -24480,7 +24480,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -24924,7 +24924,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -25324,7 +25324,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -25783,7 +25783,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -26291,7 +26291,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -26786,7 +26786,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -27258,7 +27258,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -27658,7 +27658,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28058,7 +28058,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28486,7 +28486,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28958,7 +28958,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29402,7 +29402,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29866,7 +29866,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -30286,7 +30286,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -30678,7 +30678,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -32236,7 +32236,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -32708,7 +32708,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -33193,7 +33193,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -33593,7 +33593,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -34067,7 +34067,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -34467,7 +34467,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -34926,7 +34926,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -35404,7 +35404,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -35891,7 +35891,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -36363,7 +36363,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -36807,7 +36807,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -37251,7 +37251,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -37738,7 +37738,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -38197,7 +38197,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -38673,7 +38673,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -39132,7 +39132,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -40420,7 +40420,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -40848,7 +40848,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -41691,7 +41691,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -42161,7 +42161,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -42561,7 +42561,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -43035,7 +43035,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -43479,7 +43479,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -43951,7 +43951,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -44410,7 +44410,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -44869,7 +44869,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -45328,7 +45328,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -45787,7 +45787,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -47031,7 +47031,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -47830,7 +47830,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -48304,7 +48304,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -48748,7 +48748,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -49220,7 +49220,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -49679,7 +49679,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -50138,7 +50138,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -50597,7 +50597,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -51056,7 +51056,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -52300,7 +52300,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -53099,7 +53099,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -53543,7 +53543,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -53987,7 +53987,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -54431,7 +54431,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -54831,7 +54831,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -55275,7 +55275,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -55719,7 +55719,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -56163,7 +56163,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -56607,7 +56607,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -57007,7 +57007,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -57451,7 +57451,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -57895,7 +57895,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -58339,7 +58339,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -58783,7 +58783,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HospitalBaselineReheatReportEMS.idf b/testfiles/HospitalBaselineReheatReportEMS.idf index 4927804ee84..46094d7a714 100644 --- a/testfiles/HospitalBaselineReheatReportEMS.idf +++ b/testfiles/HospitalBaselineReheatReportEMS.idf @@ -1691,7 +1691,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2435,7 +2435,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2896,7 +2896,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3340,7 +3340,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3784,7 +3784,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4228,7 +4228,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4628,7 +4628,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5690,7 +5690,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6118,7 +6118,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6629,7 +6629,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7101,7 +7101,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7573,7 +7573,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8100,7 +8100,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8500,7 +8500,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9837,7 +9837,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10281,7 +10281,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10742,7 +10742,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11186,7 +11186,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11630,7 +11630,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12089,7 +12089,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12533,7 +12533,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12933,7 +12933,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13333,7 +13333,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14199,7 +14199,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14599,7 +14599,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15354,7 +15354,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15813,7 +15813,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16213,7 +16213,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16613,7 +16613,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17481,7 +17481,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17940,7 +17940,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18340,7 +18340,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18740,7 +18740,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19157,7 +19157,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19601,7 +19601,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -20001,7 +20001,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -20490,7 +20490,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -20977,7 +20977,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -21405,7 +21405,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -21856,7 +21856,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -22284,7 +22284,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -22704,7 +22704,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -23163,7 +23163,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -23563,7 +23563,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -24052,7 +24052,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -24480,7 +24480,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -24924,7 +24924,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -25324,7 +25324,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -25783,7 +25783,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -26291,7 +26291,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -26786,7 +26786,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -27258,7 +27258,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -27658,7 +27658,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28058,7 +28058,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28486,7 +28486,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28958,7 +28958,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29402,7 +29402,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29866,7 +29866,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -30286,7 +30286,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -30678,7 +30678,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -32236,7 +32236,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -32708,7 +32708,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -33193,7 +33193,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -33593,7 +33593,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -34067,7 +34067,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -34467,7 +34467,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -34926,7 +34926,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -35404,7 +35404,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -35891,7 +35891,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -36363,7 +36363,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -36807,7 +36807,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -37251,7 +37251,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -37738,7 +37738,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -38197,7 +38197,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -38673,7 +38673,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -39132,7 +39132,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -40420,7 +40420,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -40848,7 +40848,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -41691,7 +41691,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -42161,7 +42161,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -42561,7 +42561,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -43035,7 +43035,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -43479,7 +43479,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -43951,7 +43951,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -44410,7 +44410,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -44869,7 +44869,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -45328,7 +45328,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -45787,7 +45787,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -47031,7 +47031,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -47830,7 +47830,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -48304,7 +48304,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -48748,7 +48748,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -49220,7 +49220,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -49679,7 +49679,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -50138,7 +50138,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -50597,7 +50597,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -51056,7 +51056,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -52300,7 +52300,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -53099,7 +53099,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -53543,7 +53543,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -53987,7 +53987,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -54431,7 +54431,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -54831,7 +54831,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -55275,7 +55275,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -55719,7 +55719,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -56163,7 +56163,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -56607,7 +56607,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -57007,7 +57007,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -57451,7 +57451,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -57895,7 +57895,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -58339,7 +58339,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -58783,7 +58783,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HospitalLowEnergy.idf b/testfiles/HospitalLowEnergy.idf index 3dcfd06ad87..781a4e5127d 100644 --- a/testfiles/HospitalLowEnergy.idf +++ b/testfiles/HospitalLowEnergy.idf @@ -1834,7 +1834,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2772,7 +2772,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3383,7 +3383,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3952,7 +3952,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4546,7 +4546,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5075,7 +5075,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5560,7 +5560,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6789,7 +6789,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7302,7 +7302,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7895,7 +7895,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8452,7 +8452,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9049,7 +9049,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9698,7 +9698,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10183,7 +10183,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11815,7 +11815,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12384,7 +12384,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12970,7 +12970,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13539,7 +13539,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14108,7 +14108,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14717,7 +14717,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15246,7 +15246,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15731,7 +15731,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16216,7 +16216,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17292,7 +17292,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17777,7 +17777,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18699,7 +18699,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19268,7 +19268,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19753,7 +19753,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -20238,7 +20238,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -21381,7 +21381,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -21950,7 +21950,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -22435,7 +22435,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -22920,7 +22920,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -23422,7 +23422,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -23976,7 +23976,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -24461,7 +24461,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -25060,7 +25060,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -25632,7 +25632,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -26145,7 +26145,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -26681,7 +26681,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -27194,7 +27194,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -27696,7 +27696,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28305,7 +28305,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -28790,7 +28790,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29404,7 +29404,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -29917,7 +29917,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -30486,7 +30486,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -30971,7 +30971,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -31580,7 +31580,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -32173,7 +32173,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -32668,7 +32668,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -33225,7 +33225,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -33710,7 +33710,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -34195,7 +34195,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -34708,7 +34708,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -35330,7 +35330,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -35859,7 +35859,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -36430,7 +36430,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -36932,7 +36932,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -37406,7 +37406,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -39298,7 +39298,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -39880,7 +39880,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -40487,7 +40487,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -40972,7 +40972,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -41596,7 +41596,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -42081,7 +42081,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -42625,7 +42625,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -43228,7 +43228,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -43840,7 +43840,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -44397,7 +44397,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -44966,7 +44966,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -45495,7 +45495,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -46007,7 +46007,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -46551,7 +46551,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -47112,7 +47112,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -47681,7 +47681,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -49304,7 +49304,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -49817,7 +49817,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -50827,7 +50827,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -51419,7 +51419,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -51904,7 +51904,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -52528,7 +52528,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -53097,7 +53097,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -53694,7 +53694,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -54263,7 +54263,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -54807,7 +54807,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -55351,7 +55351,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -55920,7 +55920,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -57499,7 +57499,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -58465,7 +58465,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -59089,7 +59089,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -59658,7 +59658,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -60255,7 +60255,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -60824,7 +60824,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -61368,7 +61368,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -61912,7 +61912,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -62481,7 +62481,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -64060,7 +64060,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -65026,7 +65026,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -65595,7 +65595,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -66189,7 +66189,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -66758,7 +66758,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -67243,7 +67243,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -67812,7 +67812,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -68406,7 +68406,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -68975,7 +68975,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -69544,7 +69544,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -70029,7 +70029,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -70598,7 +70598,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -71192,7 +71192,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -71761,7 +71761,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -72330,7 +72330,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/House-2FurnaceAC-SequentialLoad.idf b/testfiles/House-2FurnaceAC-SequentialLoad.idf index 2f0e6b4416f..2b0048b8b79 100644 --- a/testfiles/House-2FurnaceAC-SequentialLoad.idf +++ b/testfiles/House-2FurnaceAC-SequentialLoad.idf @@ -1066,7 +1066,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/House-2FurnaceAC-SequentialLoadFractions.idf b/testfiles/House-2FurnaceAC-SequentialLoadFractions.idf index 5bf5d17f01d..bb479afd669 100644 --- a/testfiles/House-2FurnaceAC-SequentialLoadFractions.idf +++ b/testfiles/House-2FurnaceAC-SequentialLoadFractions.idf @@ -1067,7 +1067,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/House-2FurnaceAC-SequentialUniformPLR.idf b/testfiles/House-2FurnaceAC-SequentialUniformPLR.idf index 1c6133ab8bf..5560306b416 100644 --- a/testfiles/House-2FurnaceAC-SequentialUniformPLR.idf +++ b/testfiles/House-2FurnaceAC-SequentialUniformPLR.idf @@ -1066,7 +1066,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/House-2FurnaceAC-UniformLoad.idf b/testfiles/House-2FurnaceAC-UniformLoad.idf index 1367b98d766..d03232bd943 100644 --- a/testfiles/House-2FurnaceAC-UniformLoad.idf +++ b/testfiles/House-2FurnaceAC-UniformLoad.idf @@ -1066,7 +1066,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/House-2FurnaceAC-UniformPLR.idf b/testfiles/House-2FurnaceAC-UniformPLR.idf index 8d433e9ae98..afa95b04ff9 100644 --- a/testfiles/House-2FurnaceAC-UniformPLR.idf +++ b/testfiles/House-2FurnaceAC-UniformPLR.idf @@ -1066,7 +1066,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HybridModel_4Zone_Solve_Infiltration_free_floating.idf b/testfiles/HybridModel_4Zone_Solve_Infiltration_free_floating.idf index 9a23274578d..3e5ec88a788 100644 --- a/testfiles/HybridModel_4Zone_Solve_Infiltration_free_floating.idf +++ b/testfiles/HybridModel_4Zone_Solve_Infiltration_free_floating.idf @@ -1314,7 +1314,7 @@ 0.0000000382, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name , !- Work Efficiency Schedule Name ClothingInsulationSchedule; !- Clothing Insulation Calculation Method @@ -1333,7 +1333,7 @@ 0.0000000382, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name , !- Work Efficiency Schedule Name ClothingInsulationSchedule; !- Clothing Insulation Calculation Method @@ -1352,7 +1352,7 @@ 0.0000000382, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name , !- Work Efficiency Schedule Name ClothingInsulationSchedule; !- Clothing Insulation Calculation Method @@ -1371,7 +1371,7 @@ 0.0000000382, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name , !- Work Efficiency Schedule Name ClothingInsulationSchedule; !- Clothing Insulation Calculation Method diff --git a/testfiles/HybridModel_4Zone_Solve_PeopleCount_with_HVAC.idf b/testfiles/HybridModel_4Zone_Solve_PeopleCount_with_HVAC.idf index 90708c38b49..213a8adad09 100644 --- a/testfiles/HybridModel_4Zone_Solve_PeopleCount_with_HVAC.idf +++ b/testfiles/HybridModel_4Zone_Solve_PeopleCount_with_HVAC.idf @@ -1385,7 +1385,7 @@ OfficeSmall ACTIVITY_SCH,!- Activity Level Schedule Name 0.0000000382, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name , !- Work Efficiency Schedule Name ClothingInsulationSchedule; !- Clothing Insulation Calculation Method @@ -1403,7 +1403,7 @@ OfficeSmall ACTIVITY_SCH,!- Activity Level Schedule Name 0.0000000382, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name , !- Work Efficiency Schedule Name ClothingInsulationSchedule; !- Clothing Insulation Calculation Method @@ -1421,7 +1421,7 @@ OfficeSmall ACTIVITY_SCH,!- Activity Level Schedule Name 0.0000000382, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name , !- Work Efficiency Schedule Name ClothingInsulationSchedule; !- Clothing Insulation Calculation Method @@ -1439,7 +1439,7 @@ OfficeSmall ACTIVITY_SCH,!- Activity Level Schedule Name 0.0000000382, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name , !- Work Efficiency Schedule Name ClothingInsulationSchedule; !- Clothing Insulation Calculation Method diff --git a/testfiles/HybridVentilationControl.idf b/testfiles/HybridVentilationControl.idf index d82cd29253b..1f6fe1b55dc 100644 --- a/testfiles/HybridVentilationControl.idf +++ b/testfiles/HybridVentilationControl.idf @@ -1628,7 +1628,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1650,7 +1650,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1672,7 +1672,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/HybridVentilationControlGlobalSimple.idf b/testfiles/HybridVentilationControlGlobalSimple.idf index 5e4077fa68f..18e8b58967e 100644 --- a/testfiles/HybridVentilationControlGlobalSimple.idf +++ b/testfiles/HybridVentilationControlGlobalSimple.idf @@ -1645,7 +1645,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1667,7 +1667,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1689,7 +1689,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/IndEvapCoolerRTUoffice.idf b/testfiles/IndEvapCoolerRTUoffice.idf index 29235372407..54020fd697e 100644 --- a/testfiles/IndEvapCoolerRTUoffice.idf +++ b/testfiles/IndEvapCoolerRTUoffice.idf @@ -3049,7 +3049,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3070,7 +3070,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3091,7 +3091,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3112,7 +3112,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3133,7 +3133,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3154,7 +3154,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3175,7 +3175,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3196,7 +3196,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3217,7 +3217,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3238,7 +3238,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/IndirectAbsorptionChiller.idf b/testfiles/IndirectAbsorptionChiller.idf index 2047e95a05b..7eb18cbd9da 100644 --- a/testfiles/IndirectAbsorptionChiller.idf +++ b/testfiles/IndirectAbsorptionChiller.idf @@ -1076,7 +1076,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1098,7 +1098,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1120,7 +1120,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/InternalMass_wZoneList.idf b/testfiles/InternalMass_wZoneList.idf index ff2745d832c..d75cc7ae26f 100644 --- a/testfiles/InternalMass_wZoneList.idf +++ b/testfiles/InternalMass_wZoneList.idf @@ -987,7 +987,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1009,7 +1009,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1031,7 +1031,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/LookupTables.idf b/testfiles/LookupTables.idf index 64fc4248797..8ee0a83ac26 100644 --- a/testfiles/LookupTables.idf +++ b/testfiles/LookupTables.idf @@ -1083,7 +1083,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1105,7 +1105,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1127,7 +1127,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/LrgOff_GridStorageDemandLeveling.idf b/testfiles/LrgOff_GridStorageDemandLeveling.idf index 80fc9169773..5624df724d8 100644 --- a/testfiles/LrgOff_GridStorageDemandLeveling.idf +++ b/testfiles/LrgOff_GridStorageDemandLeveling.idf @@ -3268,7 +3268,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3290,7 +3290,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3312,7 +3312,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3334,7 +3334,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3356,7 +3356,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3378,7 +3378,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3400,7 +3400,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3422,7 +3422,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3444,7 +3444,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3466,7 +3466,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3488,7 +3488,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3510,7 +3510,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3532,7 +3532,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3554,7 +3554,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3576,7 +3576,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3598,7 +3598,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/LrgOff_GridStorageEMSSmoothing.idf b/testfiles/LrgOff_GridStorageEMSSmoothing.idf index 8364b8f92da..b9a5f5376dc 100644 --- a/testfiles/LrgOff_GridStorageEMSSmoothing.idf +++ b/testfiles/LrgOff_GridStorageEMSSmoothing.idf @@ -3268,7 +3268,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3290,7 +3290,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3312,7 +3312,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3334,7 +3334,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3356,7 +3356,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3378,7 +3378,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3400,7 +3400,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3422,7 +3422,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3444,7 +3444,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3466,7 +3466,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3488,7 +3488,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3510,7 +3510,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3532,7 +3532,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3554,7 +3554,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3576,7 +3576,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3598,7 +3598,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/LrgOff_GridStorageScheduled.idf b/testfiles/LrgOff_GridStorageScheduled.idf index ef766411564..21c470cb641 100644 --- a/testfiles/LrgOff_GridStorageScheduled.idf +++ b/testfiles/LrgOff_GridStorageScheduled.idf @@ -3268,7 +3268,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3290,7 +3290,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3312,7 +3312,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3334,7 +3334,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3356,7 +3356,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3378,7 +3378,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3400,7 +3400,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3422,7 +3422,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3444,7 +3444,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3466,7 +3466,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3488,7 +3488,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3510,7 +3510,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3532,7 +3532,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3554,7 +3554,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3576,7 +3576,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3598,7 +3598,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/MicroCogeneration.idf b/testfiles/MicroCogeneration.idf index c281a41d868..59d273f2305 100644 --- a/testfiles/MicroCogeneration.idf +++ b/testfiles/MicroCogeneration.idf @@ -1083,7 +1083,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1641,7 +1641,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2198,7 +2198,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2755,7 +2755,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3297,7 +3297,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/MultiSpeedACFurnace.idf b/testfiles/MultiSpeedACFurnace.idf index 88a771071a7..286f956d60f 100644 --- a/testfiles/MultiSpeedACFurnace.idf +++ b/testfiles/MultiSpeedACFurnace.idf @@ -518,7 +518,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -552,7 +552,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -600,7 +600,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/MultiSpeedHP_StagedThermostat.idf b/testfiles/MultiSpeedHP_StagedThermostat.idf index 726b9feea56..47a50013203 100644 --- a/testfiles/MultiSpeedHP_StagedThermostat.idf +++ b/testfiles/MultiSpeedHP_StagedThermostat.idf @@ -512,7 +512,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -546,7 +546,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -594,7 +594,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/MultiSpeedHeatPump.idf b/testfiles/MultiSpeedHeatPump.idf index 43519d26781..0a50ccf9f53 100644 --- a/testfiles/MultiSpeedHeatPump.idf +++ b/testfiles/MultiSpeedHeatPump.idf @@ -511,7 +511,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -545,7 +545,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -593,7 +593,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/MultiSpeedHeatPump_DirectSolution.idf b/testfiles/MultiSpeedHeatPump_DirectSolution.idf index fbcbe782bbc..26fd15fa554 100644 --- a/testfiles/MultiSpeedHeatPump_DirectSolution.idf +++ b/testfiles/MultiSpeedHeatPump_DirectSolution.idf @@ -514,7 +514,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -548,7 +548,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -596,7 +596,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/MultiSpeedHeatPump_MultiSolvers.idf b/testfiles/MultiSpeedHeatPump_MultiSolvers.idf index b4df0e74d6e..a3898941d52 100644 --- a/testfiles/MultiSpeedHeatPump_MultiSolvers.idf +++ b/testfiles/MultiSpeedHeatPump_MultiSolvers.idf @@ -515,7 +515,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -549,7 +549,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -597,7 +597,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/OptimalStart_RefBldgLargeOfficeNew2004_Chicago.idf b/testfiles/OptimalStart_RefBldgLargeOfficeNew2004_Chicago.idf index 8750d45f47a..0c761bceca3 100644 --- a/testfiles/OptimalStart_RefBldgLargeOfficeNew2004_Chicago.idf +++ b/testfiles/OptimalStart_RefBldgLargeOfficeNew2004_Chicago.idf @@ -3326,7 +3326,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3348,7 +3348,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3370,7 +3370,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3392,7 +3392,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3414,7 +3414,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3436,7 +3436,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3458,7 +3458,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3480,7 +3480,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3502,7 +3502,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3524,7 +3524,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3546,7 +3546,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3568,7 +3568,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3590,7 +3590,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3612,7 +3612,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3634,7 +3634,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3656,7 +3656,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/PIUAuto.idf b/testfiles/PIUAuto.idf index ee484db9d2a..8fe6621e66a 100644 --- a/testfiles/PIUAuto.idf +++ b/testfiles/PIUAuto.idf @@ -650,7 +650,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -684,7 +684,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -732,7 +732,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PackagedTerminalAirConditioner.idf b/testfiles/PackagedTerminalAirConditioner.idf index 10dc773ca46..b6521d2d724 100644 --- a/testfiles/PackagedTerminalAirConditioner.idf +++ b/testfiles/PackagedTerminalAirConditioner.idf @@ -1111,7 +1111,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1133,7 +1133,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1155,7 +1155,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PackagedTerminalAirConditionerVSAS.idf b/testfiles/PackagedTerminalAirConditionerVSAS.idf index 262f5817f8e..3feae02f24a 100644 --- a/testfiles/PackagedTerminalAirConditionerVSAS.idf +++ b/testfiles/PackagedTerminalAirConditionerVSAS.idf @@ -1622,7 +1622,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1644,7 +1644,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1666,7 +1666,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PackagedTerminalHeatPump.idf b/testfiles/PackagedTerminalHeatPump.idf index 8eabed1803d..79f42ea696c 100644 --- a/testfiles/PackagedTerminalHeatPump.idf +++ b/testfiles/PackagedTerminalHeatPump.idf @@ -1083,7 +1083,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1105,7 +1105,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1127,7 +1127,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PackagedTerminalHeatPumpVSAS.idf b/testfiles/PackagedTerminalHeatPumpVSAS.idf index 926ef3af4d9..b4c17b260a8 100644 --- a/testfiles/PackagedTerminalHeatPumpVSAS.idf +++ b/testfiles/PackagedTerminalHeatPumpVSAS.idf @@ -1985,7 +1985,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2007,7 +2007,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2029,7 +2029,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PackagedTerminalHeatPump_LatentSizing_SensibleAndLatent.idf b/testfiles/PackagedTerminalHeatPump_LatentSizing_SensibleAndLatent.idf index 1546deb509b..33c1159c482 100644 --- a/testfiles/PackagedTerminalHeatPump_LatentSizing_SensibleAndLatent.idf +++ b/testfiles/PackagedTerminalHeatPump_LatentSizing_SensibleAndLatent.idf @@ -1083,7 +1083,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1105,7 +1105,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1127,7 +1127,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PerformancePrecision_ASHRAE9012016_SchoolSecondary_Denver.idf b/testfiles/PerformancePrecision_ASHRAE9012016_SchoolSecondary_Denver.idf index f221cca48b8..9d2866dcaae 100644 --- a/testfiles/PerformancePrecision_ASHRAE9012016_SchoolSecondary_Denver.idf +++ b/testfiles/PerformancePrecision_ASHRAE9012016_SchoolSecondary_Denver.idf @@ -14137,7 +14137,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14159,7 +14159,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14181,7 +14181,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14203,7 +14203,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14225,7 +14225,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14247,7 +14247,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14269,7 +14269,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14291,7 +14291,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14313,7 +14313,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14335,7 +14335,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14357,7 +14357,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14379,7 +14379,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14401,7 +14401,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14423,7 +14423,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14445,7 +14445,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14467,7 +14467,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14489,7 +14489,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14511,7 +14511,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14533,7 +14533,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14555,7 +14555,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14577,7 +14577,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14599,7 +14599,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14621,7 +14621,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14643,7 +14643,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14665,7 +14665,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14687,7 +14687,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14709,7 +14709,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14731,7 +14731,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14753,7 +14753,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14775,7 +14775,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14797,7 +14797,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14819,7 +14819,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14841,7 +14841,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14863,7 +14863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14885,7 +14885,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14907,7 +14907,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14929,7 +14929,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14951,7 +14951,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14973,7 +14973,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14995,7 +14995,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15017,7 +15017,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15039,7 +15039,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PlantApplicationsGuide_Example2.idf b/testfiles/PlantApplicationsGuide_Example2.idf index f7da76ed571..edc2ad1c100 100644 --- a/testfiles/PlantApplicationsGuide_Example2.idf +++ b/testfiles/PlantApplicationsGuide_Example2.idf @@ -2582,7 +2582,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3069,7 +3069,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3537,7 +3537,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4024,7 +4024,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4597,7 +4597,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PlantApplicationsGuide_Example3.idf b/testfiles/PlantApplicationsGuide_Example3.idf index a8bb11f78aa..e0152f98dcf 100644 --- a/testfiles/PlantApplicationsGuide_Example3.idf +++ b/testfiles/PlantApplicationsGuide_Example3.idf @@ -615,7 +615,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -649,7 +649,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -697,7 +697,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PlantLoopHeatPump_EIR_Large-Office-2-AWHP-DedHR-AuxBoiler-Pri-Sec-HW.idf b/testfiles/PlantLoopHeatPump_EIR_Large-Office-2-AWHP-DedHR-AuxBoiler-Pri-Sec-HW.idf index 4e514770619..eee4fabb74c 100644 --- a/testfiles/PlantLoopHeatPump_EIR_Large-Office-2-AWHP-DedHR-AuxBoiler-Pri-Sec-HW.idf +++ b/testfiles/PlantLoopHeatPump_EIR_Large-Office-2-AWHP-DedHR-AuxBoiler-Pri-Sec-HW.idf @@ -3146,7 +3146,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3168,7 +3168,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3190,7 +3190,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3212,7 +3212,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3234,7 +3234,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3256,7 +3256,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3278,7 +3278,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3300,7 +3300,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3322,7 +3322,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3344,7 +3344,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3366,7 +3366,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3388,7 +3388,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3410,7 +3410,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3432,7 +3432,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3454,7 +3454,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3476,7 +3476,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PlantLoopHeatPump_EIR_LargeOffice-2-AWHP-AuxBoiler-Pri-Sec-4PipeBeam.idf b/testfiles/PlantLoopHeatPump_EIR_LargeOffice-2-AWHP-AuxBoiler-Pri-Sec-4PipeBeam.idf index 0530ea6024c..6d9a8fca288 100644 --- a/testfiles/PlantLoopHeatPump_EIR_LargeOffice-2-AWHP-AuxBoiler-Pri-Sec-4PipeBeam.idf +++ b/testfiles/PlantLoopHeatPump_EIR_LargeOffice-2-AWHP-AuxBoiler-Pri-Sec-4PipeBeam.idf @@ -3274,7 +3274,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3296,7 +3296,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3318,7 +3318,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3340,7 +3340,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3362,7 +3362,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3384,7 +3384,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3406,7 +3406,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3428,7 +3428,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3450,7 +3450,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3472,7 +3472,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3494,7 +3494,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3516,7 +3516,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3538,7 +3538,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3560,7 +3560,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3582,7 +3582,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3604,7 +3604,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PlateHeatExchanger.idf b/testfiles/PlateHeatExchanger.idf index 496fc677021..9d6c2c12cfe 100644 --- a/testfiles/PlateHeatExchanger.idf +++ b/testfiles/PlateHeatExchanger.idf @@ -540,7 +540,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -574,7 +574,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -622,7 +622,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PurchAirTables.idf b/testfiles/PurchAirTables.idf index 6ebc4cd7f20..49d094d9eb8 100644 --- a/testfiles/PurchAirTables.idf +++ b/testfiles/PurchAirTables.idf @@ -497,7 +497,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -542,7 +542,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -589,7 +589,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PurchAirTables_SQL.idf b/testfiles/PurchAirTables_SQL.idf index f93cce47299..18f32d2f18d 100644 --- a/testfiles/PurchAirTables_SQL.idf +++ b/testfiles/PurchAirTables_SQL.idf @@ -497,7 +497,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -542,7 +542,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -589,7 +589,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PurchAirTables_wAnnual.idf b/testfiles/PurchAirTables_wAnnual.idf index 8f2bbc3c97b..46311a45f2d 100644 --- a/testfiles/PurchAirTables_wAnnual.idf +++ b/testfiles/PurchAirTables_wAnnual.idf @@ -497,7 +497,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -542,7 +542,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -589,7 +589,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PurchAirWindowBlind.idf b/testfiles/PurchAirWindowBlind.idf index 63ea12a2178..a29a8637b17 100644 --- a/testfiles/PurchAirWindowBlind.idf +++ b/testfiles/PurchAirWindowBlind.idf @@ -580,7 +580,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -614,7 +614,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -662,7 +662,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PurchAirWindowBlind_BlockBeamSolar.idf b/testfiles/PurchAirWindowBlind_BlockBeamSolar.idf index 035f2ac02c3..741fcf34a24 100644 --- a/testfiles/PurchAirWindowBlind_BlockBeamSolar.idf +++ b/testfiles/PurchAirWindowBlind_BlockBeamSolar.idf @@ -583,7 +583,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -617,7 +617,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -665,7 +665,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PurchAirWithDaylighting.idf b/testfiles/PurchAirWithDaylighting.idf index 6a7376173a4..e233cd1ca04 100644 --- a/testfiles/PurchAirWithDaylighting.idf +++ b/testfiles/PurchAirWithDaylighting.idf @@ -780,7 +780,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -828,7 +828,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -876,7 +876,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PurchAirWithDaylightingAndShadeControl.idf b/testfiles/PurchAirWithDaylightingAndShadeControl.idf index 290e9d9820c..608e2d35335 100644 --- a/testfiles/PurchAirWithDaylightingAndShadeControl.idf +++ b/testfiles/PurchAirWithDaylightingAndShadeControl.idf @@ -1129,7 +1129,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1177,7 +1177,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1225,7 +1225,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PurchAirWithDaylightingAngleFac.idf b/testfiles/PurchAirWithDaylightingAngleFac.idf index 4c41feb98e0..0b095972826 100644 --- a/testfiles/PurchAirWithDaylightingAngleFac.idf +++ b/testfiles/PurchAirWithDaylightingAngleFac.idf @@ -1431,7 +1431,6 @@ ComfortViewFactorAngles, Angle Fac List 1, !- Name - West Zone, !- Zone Name Zn001:Wall001, !- Surface 1 Name 0.15, !- Angle Factor 1 Zn001:Wall002, !- Surface 2 Name @@ -1447,7 +1446,6 @@ ComfortViewFactorAngles, Angle Fac List 2, !- Name - EAST ZONE, !- Zone Name Zn002:Wall001, !- Surface 1 Name 0.15, !- Angle Factor 1 Zn002:Wall002, !- Surface 2 Name @@ -1463,7 +1461,6 @@ ComfortViewFactorAngles, Angle Fac List 3, !- Name - NORTH ZONE, !- Zone Name Zn003:Wall001, !- Surface 1 Name 0.15, !- Angle Factor 1 Zn003:Wall002, !- Surface 2 Name diff --git a/testfiles/PurchAirWithDoubleFacadeDaylighting.idf b/testfiles/PurchAirWithDoubleFacadeDaylighting.idf index 6acdadec2ba..19936cc497b 100644 --- a/testfiles/PurchAirWithDoubleFacadeDaylighting.idf +++ b/testfiles/PurchAirWithDoubleFacadeDaylighting.idf @@ -598,7 +598,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -646,7 +646,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -694,7 +694,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginAirflowNetworkOpeningControlByHumidity.idf b/testfiles/PythonPluginAirflowNetworkOpeningControlByHumidity.idf index 5a14d1d9d89..05f5cab95d8 100644 --- a/testfiles/PythonPluginAirflowNetworkOpeningControlByHumidity.idf +++ b/testfiles/PythonPluginAirflowNetworkOpeningControlByHumidity.idf @@ -1582,7 +1582,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1604,7 +1604,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1626,7 +1626,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginConstantVolumePurchasedAir.idf b/testfiles/PythonPluginConstantVolumePurchasedAir.idf index e07bd4b7f7b..540dc2f8b31 100644 --- a/testfiles/PythonPluginConstantVolumePurchasedAir.idf +++ b/testfiles/PythonPluginConstantVolumePurchasedAir.idf @@ -588,7 +588,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -622,7 +622,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -670,7 +670,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginCurveOverride_PackagedTerminalHeatPump.idf b/testfiles/PythonPluginCurveOverride_PackagedTerminalHeatPump.idf index ac5447d9d21..2d3834a27af 100644 --- a/testfiles/PythonPluginCurveOverride_PackagedTerminalHeatPump.idf +++ b/testfiles/PythonPluginCurveOverride_PackagedTerminalHeatPump.idf @@ -1124,7 +1124,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1146,7 +1146,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1168,7 +1168,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginCustomOutputVariable.idf b/testfiles/PythonPluginCustomOutputVariable.idf index 75af38b1f04..3be6bb3ed16 100644 --- a/testfiles/PythonPluginCustomOutputVariable.idf +++ b/testfiles/PythonPluginCustomOutputVariable.idf @@ -1398,7 +1398,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1906,7 +1906,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2314,7 +2314,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2752,7 +2752,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3160,7 +3160,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginCustomSchedule.idf b/testfiles/PythonPluginCustomSchedule.idf index 7c6277fab98..b1804167b3d 100644 --- a/testfiles/PythonPluginCustomSchedule.idf +++ b/testfiles/PythonPluginCustomSchedule.idf @@ -1362,7 +1362,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1870,7 +1870,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2278,7 +2278,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2716,7 +2716,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3124,7 +3124,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginCustomTrendVariable.idf b/testfiles/PythonPluginCustomTrendVariable.idf index 088fc3c07e8..b18173be133 100644 --- a/testfiles/PythonPluginCustomTrendVariable.idf +++ b/testfiles/PythonPluginCustomTrendVariable.idf @@ -1398,7 +1398,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1906,7 +1906,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2314,7 +2314,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2752,7 +2752,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3160,7 +3160,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginDemandManager_LargeOffice.idf b/testfiles/PythonPluginDemandManager_LargeOffice.idf index d11427756f0..d39dfd4dada 100644 --- a/testfiles/PythonPluginDemandManager_LargeOffice.idf +++ b/testfiles/PythonPluginDemandManager_LargeOffice.idf @@ -1493,7 +1493,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1827,7 +1827,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2216,7 +2216,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2634,7 +2634,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3067,7 +3067,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3445,7 +3445,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3823,7 +3823,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4201,7 +4201,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4579,7 +4579,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4957,7 +4957,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5335,7 +5335,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5713,7 +5713,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6091,7 +6091,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6469,7 +6469,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6847,7 +6847,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7225,7 +7225,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginDiscreteAirSystemSizes.idf b/testfiles/PythonPluginDiscreteAirSystemSizes.idf index 9258a9eac66..9768deed8b6 100644 --- a/testfiles/PythonPluginDiscreteAirSystemSizes.idf +++ b/testfiles/PythonPluginDiscreteAirSystemSizes.idf @@ -1408,7 +1408,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1816,7 +1816,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2224,7 +2224,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2632,7 +2632,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3040,7 +3040,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3508,7 +3508,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3916,7 +3916,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4324,7 +4324,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4732,7 +4732,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5140,7 +5140,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginLrgOff_GridStorageSmoothing.idf b/testfiles/PythonPluginLrgOff_GridStorageSmoothing.idf index f9e466b5dbd..629d63b5272 100644 --- a/testfiles/PythonPluginLrgOff_GridStorageSmoothing.idf +++ b/testfiles/PythonPluginLrgOff_GridStorageSmoothing.idf @@ -3268,7 +3268,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3290,7 +3290,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3312,7 +3312,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3334,7 +3334,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3356,7 +3356,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3378,7 +3378,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3400,7 +3400,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3422,7 +3422,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3444,7 +3444,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3466,7 +3466,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3488,7 +3488,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3510,7 +3510,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3532,7 +3532,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3554,7 +3554,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3576,7 +3576,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3598,7 +3598,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginMultiSpeedHeatPumpOverrideControl.idf b/testfiles/PythonPluginMultiSpeedHeatPumpOverrideControl.idf index 1c03a38eef7..2244e5248c5 100644 --- a/testfiles/PythonPluginMultiSpeedHeatPumpOverrideControl.idf +++ b/testfiles/PythonPluginMultiSpeedHeatPumpOverrideControl.idf @@ -1126,7 +1126,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginPlantLoopOverrideControl.idf b/testfiles/PythonPluginPlantLoopOverrideControl.idf index b16ab7fbe0c..16cee6dc5f8 100644 --- a/testfiles/PythonPluginPlantLoopOverrideControl.idf +++ b/testfiles/PythonPluginPlantLoopOverrideControl.idf @@ -3790,7 +3790,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3812,7 +3812,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3834,7 +3834,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3856,7 +3856,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3878,7 +3878,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3900,7 +3900,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3922,7 +3922,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3944,7 +3944,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3966,7 +3966,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3988,7 +3988,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginPlantOperation_largeOff.idf b/testfiles/PythonPluginPlantOperation_largeOff.idf index 2303c079152..610624efb0a 100644 --- a/testfiles/PythonPluginPlantOperation_largeOff.idf +++ b/testfiles/PythonPluginPlantOperation_largeOff.idf @@ -3264,7 +3264,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3286,7 +3286,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3308,7 +3308,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3330,7 +3330,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3352,7 +3352,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3374,7 +3374,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3396,7 +3396,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3418,7 +3418,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3440,7 +3440,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3462,7 +3462,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3484,7 +3484,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3506,7 +3506,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3528,7 +3528,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3550,7 +3550,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3572,7 +3572,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -3594,7 +3594,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginReplaceTraditionalManagers_LargeOffice.idf b/testfiles/PythonPluginReplaceTraditionalManagers_LargeOffice.idf index 08d2bd72c56..0c6e77c6996 100644 --- a/testfiles/PythonPluginReplaceTraditionalManagers_LargeOffice.idf +++ b/testfiles/PythonPluginReplaceTraditionalManagers_LargeOffice.idf @@ -1483,7 +1483,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1817,7 +1817,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2206,7 +2206,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2624,7 +2624,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3057,7 +3057,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3435,7 +3435,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3813,7 +3813,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4191,7 +4191,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4569,7 +4569,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4947,7 +4947,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5325,7 +5325,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5703,7 +5703,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6081,7 +6081,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6459,7 +6459,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6837,7 +6837,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7215,7 +7215,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginTestMathAndKill.idf b/testfiles/PythonPluginTestMathAndKill.idf index 4e6109988ad..41bf4246cc5 100644 --- a/testfiles/PythonPluginTestMathAndKill.idf +++ b/testfiles/PythonPluginTestMathAndKill.idf @@ -1579,7 +1579,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2087,7 +2087,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2495,7 +2495,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2933,7 +2933,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3341,7 +3341,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginThermochromicWindow.idf b/testfiles/PythonPluginThermochromicWindow.idf index ba5ded543c6..ec751248436 100644 --- a/testfiles/PythonPluginThermochromicWindow.idf +++ b/testfiles/PythonPluginThermochromicWindow.idf @@ -1324,7 +1324,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1827,7 +1827,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2230,7 +2230,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2663,7 +2663,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3066,7 +3066,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginUserDefinedWindACAuto.idf b/testfiles/PythonPluginUserDefinedWindACAuto.idf index 568e402e6b5..dc561fc4b2b 100644 --- a/testfiles/PythonPluginUserDefinedWindACAuto.idf +++ b/testfiles/PythonPluginUserDefinedWindACAuto.idf @@ -628,7 +628,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -662,7 +662,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -710,7 +710,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPluginWindowShadeControl.idf b/testfiles/PythonPluginWindowShadeControl.idf index 9cec7bb97d2..8a8a63136db 100644 --- a/testfiles/PythonPluginWindowShadeControl.idf +++ b/testfiles/PythonPluginWindowShadeControl.idf @@ -580,7 +580,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -614,7 +614,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -662,7 +662,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/PythonPlugin_SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoil.idf b/testfiles/PythonPlugin_SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoil.idf index fb286e1e4a7..be042adf8f1 100644 --- a/testfiles/PythonPlugin_SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoil.idf +++ b/testfiles/PythonPlugin_SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoil.idf @@ -1175,7 +1175,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadHiTempElecTermReheat.idf b/testfiles/RadHiTempElecTermReheat.idf index 03af3c64728..3cefd6045b2 100644 --- a/testfiles/RadHiTempElecTermReheat.idf +++ b/testfiles/RadHiTempElecTermReheat.idf @@ -509,7 +509,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -543,7 +543,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -591,7 +591,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadHiTempGasCtrlOpt.idf b/testfiles/RadHiTempGasCtrlOpt.idf index 17941ea9440..9bf80798280 100644 --- a/testfiles/RadHiTempGasCtrlOpt.idf +++ b/testfiles/RadHiTempGasCtrlOpt.idf @@ -503,7 +503,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -537,7 +537,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -585,7 +585,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadHiTempGasTermReheat.idf b/testfiles/RadHiTempGasTermReheat.idf index fcdb25c5b78..30abf03b1a0 100644 --- a/testfiles/RadHiTempGasTermReheat.idf +++ b/testfiles/RadHiTempGasTermReheat.idf @@ -509,7 +509,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -543,7 +543,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -591,7 +591,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoHydrHeatCoolAuto.idf b/testfiles/RadLoHydrHeatCoolAuto.idf index 6daca10c553..a6e7431544d 100644 --- a/testfiles/RadLoHydrHeatCoolAuto.idf +++ b/testfiles/RadLoHydrHeatCoolAuto.idf @@ -698,7 +698,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -732,7 +732,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -780,7 +780,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoHydrHeatCoolAutoCondFD.idf b/testfiles/RadLoHydrHeatCoolAutoCondFD.idf index 00c41e5c262..49a86df6a6a 100644 --- a/testfiles/RadLoHydrHeatCoolAutoCondFD.idf +++ b/testfiles/RadLoHydrHeatCoolAutoCondFD.idf @@ -1083,7 +1083,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1105,7 +1105,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1127,7 +1127,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempCFloChangeoverDelay.idf b/testfiles/RadLoTempCFloChangeoverDelay.idf index ef6b0e89d89..3fbe5c31497 100644 --- a/testfiles/RadLoTempCFloChangeoverDelay.idf +++ b/testfiles/RadLoTempCFloChangeoverDelay.idf @@ -467,7 +467,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -489,7 +489,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -511,7 +511,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempCFloCtrlOpt2.idf b/testfiles/RadLoTempCFloCtrlOpt2.idf index f8aed849ab4..7c08098ab02 100644 --- a/testfiles/RadLoTempCFloCtrlOpt2.idf +++ b/testfiles/RadLoTempCFloCtrlOpt2.idf @@ -537,7 +537,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -571,7 +571,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -619,7 +619,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempCFloCtrlOpt3.idf b/testfiles/RadLoTempCFloCtrlOpt3.idf index 72eade62fcc..1bb6777ce68 100644 --- a/testfiles/RadLoTempCFloCtrlOpt3.idf +++ b/testfiles/RadLoTempCFloCtrlOpt3.idf @@ -537,7 +537,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -571,7 +571,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -619,7 +619,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempCFloHeatCool.idf b/testfiles/RadLoTempCFloHeatCool.idf index 087b19f93db..f0f86d38c93 100644 --- a/testfiles/RadLoTempCFloHeatCool.idf +++ b/testfiles/RadLoTempCFloHeatCool.idf @@ -532,7 +532,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -566,7 +566,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -614,7 +614,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempCFloHeatCoolCondFD.idf b/testfiles/RadLoTempCFloHeatCoolCondFD.idf index 9831d9e23ec..c943c290ae9 100644 --- a/testfiles/RadLoTempCFloHeatCoolCondFD.idf +++ b/testfiles/RadLoTempCFloHeatCoolCondFD.idf @@ -1107,7 +1107,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1129,7 +1129,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1151,7 +1151,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempCFloHeatCoolRMT.idf b/testfiles/RadLoTempCFloHeatCoolRMT.idf index 8bcfededd26..319bee5880f 100644 --- a/testfiles/RadLoTempCFloHeatCoolRMT.idf +++ b/testfiles/RadLoTempCFloHeatCoolRMT.idf @@ -548,7 +548,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -582,7 +582,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -630,7 +630,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempCFloHeatCool_AddedAutosizing.idf b/testfiles/RadLoTempCFloHeatCool_AddedAutosizing.idf index 7f8491c165f..2127cca54bd 100644 --- a/testfiles/RadLoTempCFloHeatCool_AddedAutosizing.idf +++ b/testfiles/RadLoTempCFloHeatCool_AddedAutosizing.idf @@ -532,7 +532,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -566,7 +566,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -614,7 +614,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempCFloISOPipeHT.idf b/testfiles/RadLoTempCFloISOPipeHT.idf index 8c7c2a44ce7..6e9f00be5fc 100644 --- a/testfiles/RadLoTempCFloISOPipeHT.idf +++ b/testfiles/RadLoTempCFloISOPipeHT.idf @@ -532,7 +532,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -566,7 +566,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -614,7 +614,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempCFloTermReheat.idf b/testfiles/RadLoTempCFloTermReheat.idf index 373cb0ec1f5..bb702a4a4ce 100644 --- a/testfiles/RadLoTempCFloTermReheat.idf +++ b/testfiles/RadLoTempCFloTermReheat.idf @@ -509,7 +509,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -543,7 +543,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -591,7 +591,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempElecCtrlOpt2.idf b/testfiles/RadLoTempElecCtrlOpt2.idf index 8d546dbf59d..97e40cc2f4b 100644 --- a/testfiles/RadLoTempElecCtrlOpt2.idf +++ b/testfiles/RadLoTempElecCtrlOpt2.idf @@ -520,7 +520,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -554,7 +554,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -602,7 +602,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempElecTermReheat.idf b/testfiles/RadLoTempElecTermReheat.idf index 27116793b87..db94b0eb337 100644 --- a/testfiles/RadLoTempElecTermReheat.idf +++ b/testfiles/RadLoTempElecTermReheat.idf @@ -518,7 +518,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -552,7 +552,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -600,7 +600,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempElecTermReheatCondFD.idf b/testfiles/RadLoTempElecTermReheatCondFD.idf index 963cac26a75..f3a8b009514 100644 --- a/testfiles/RadLoTempElecTermReheatCondFD.idf +++ b/testfiles/RadLoTempElecTermReheatCondFD.idf @@ -1122,7 +1122,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1144,7 +1144,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1166,7 +1166,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrChangeoverDelay.idf b/testfiles/RadLoTempHydrChangeoverDelay.idf index 07200223f0c..2f9a061e6f6 100644 --- a/testfiles/RadLoTempHydrChangeoverDelay.idf +++ b/testfiles/RadLoTempHydrChangeoverDelay.idf @@ -478,7 +478,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -500,7 +500,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -522,7 +522,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrCoolTower.idf b/testfiles/RadLoTempHydrCoolTower.idf index b1be608f481..ac44ddae53d 100644 --- a/testfiles/RadLoTempHydrCoolTower.idf +++ b/testfiles/RadLoTempHydrCoolTower.idf @@ -500,7 +500,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -534,7 +534,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -582,7 +582,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrCoolTowerCondFD.idf b/testfiles/RadLoTempHydrCoolTowerCondFD.idf index 4ab424d5798..ab0d41c9e47 100644 --- a/testfiles/RadLoTempHydrCoolTowerCondFD.idf +++ b/testfiles/RadLoTempHydrCoolTowerCondFD.idf @@ -1166,7 +1166,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1188,7 +1188,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1210,7 +1210,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrCtrlOpt.idf b/testfiles/RadLoTempHydrCtrlOpt.idf index 3b31eb4fcbf..921519cd156 100644 --- a/testfiles/RadLoTempHydrCtrlOpt.idf +++ b/testfiles/RadLoTempHydrCtrlOpt.idf @@ -510,7 +510,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -544,7 +544,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -592,7 +592,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrCtrlOpt2.idf b/testfiles/RadLoTempHydrCtrlOpt2.idf index ea99bdec482..df56fa986d3 100644 --- a/testfiles/RadLoTempHydrCtrlOpt2.idf +++ b/testfiles/RadLoTempHydrCtrlOpt2.idf @@ -508,7 +508,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -542,7 +542,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -590,7 +590,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrCtrlOpt3.idf b/testfiles/RadLoTempHydrCtrlOpt3.idf index 16f1d844e93..c744ed101e8 100644 --- a/testfiles/RadLoTempHydrCtrlOpt3.idf +++ b/testfiles/RadLoTempHydrCtrlOpt3.idf @@ -513,7 +513,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -547,7 +547,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -595,7 +595,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrHeatCool.idf b/testfiles/RadLoTempHydrHeatCool.idf index 70298b247df..2def7b3b7db 100644 --- a/testfiles/RadLoTempHydrHeatCool.idf +++ b/testfiles/RadLoTempHydrHeatCool.idf @@ -500,7 +500,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -534,7 +534,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -582,7 +582,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrHeatCool2D.idf b/testfiles/RadLoTempHydrHeatCool2D.idf index 749bb6b0990..e0da8def7ae 100644 --- a/testfiles/RadLoTempHydrHeatCool2D.idf +++ b/testfiles/RadLoTempHydrHeatCool2D.idf @@ -500,7 +500,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -534,7 +534,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -582,7 +582,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrHeatCoolDry.idf b/testfiles/RadLoTempHydrHeatCoolDry.idf index d5aacc55098..397d1c273c0 100644 --- a/testfiles/RadLoTempHydrHeatCoolDry.idf +++ b/testfiles/RadLoTempHydrHeatCoolDry.idf @@ -500,7 +500,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -534,7 +534,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -582,7 +582,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrHeatCoolDryCondFD.idf b/testfiles/RadLoTempHydrHeatCoolDryCondFD.idf index d36c70ed520..478f9a450fc 100644 --- a/testfiles/RadLoTempHydrHeatCoolDryCondFD.idf +++ b/testfiles/RadLoTempHydrHeatCoolDryCondFD.idf @@ -1065,7 +1065,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1087,7 +1087,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1109,7 +1109,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrHeatCoolMultiZone.idf b/testfiles/RadLoTempHydrHeatCoolMultiZone.idf index b13561659ff..e2b8bcf0c3e 100644 --- a/testfiles/RadLoTempHydrHeatCoolMultiZone.idf +++ b/testfiles/RadLoTempHydrHeatCoolMultiZone.idf @@ -502,7 +502,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -536,7 +536,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -584,7 +584,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrISOPipeHT.idf b/testfiles/RadLoTempHydrISOPipeHT.idf index 45b3833c548..fa605f2ae95 100644 --- a/testfiles/RadLoTempHydrISOPipeHT.idf +++ b/testfiles/RadLoTempHydrISOPipeHT.idf @@ -500,7 +500,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -534,7 +534,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -582,7 +582,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrInterMulti.idf b/testfiles/RadLoTempHydrInterMulti.idf index d98bb2cfb74..13a0b7be2ca 100644 --- a/testfiles/RadLoTempHydrInterMulti.idf +++ b/testfiles/RadLoTempHydrInterMulti.idf @@ -543,7 +543,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -577,7 +577,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -625,7 +625,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RadLoTempHydrTermReheat.idf b/testfiles/RadLoTempHydrTermReheat.idf index 48a6704f8b1..be00a478603 100644 --- a/testfiles/RadLoTempHydrTermReheat.idf +++ b/testfiles/RadLoTempHydrTermReheat.idf @@ -509,7 +509,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -543,7 +543,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -591,7 +591,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgFullServiceRestaurantNew2004_Chicago.idf b/testfiles/RefBldgFullServiceRestaurantNew2004_Chicago.idf index 932ce99d582..046acb48df4 100644 --- a/testfiles/RefBldgFullServiceRestaurantNew2004_Chicago.idf +++ b/testfiles/RefBldgFullServiceRestaurantNew2004_Chicago.idf @@ -973,7 +973,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -995,7 +995,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgHospitalNew2004_Chicago.idf b/testfiles/RefBldgHospitalNew2004_Chicago.idf index 0adc51ddc3e..a0f0dc107ce 100644 --- a/testfiles/RefBldgHospitalNew2004_Chicago.idf +++ b/testfiles/RefBldgHospitalNew2004_Chicago.idf @@ -9069,7 +9069,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9091,7 +9091,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9113,7 +9113,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9135,7 +9135,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9157,7 +9157,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9179,7 +9179,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9201,7 +9201,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9223,7 +9223,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9245,7 +9245,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9267,7 +9267,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9289,7 +9289,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9311,7 +9311,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9333,7 +9333,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9355,7 +9355,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9377,7 +9377,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9399,7 +9399,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9421,7 +9421,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9443,7 +9443,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9465,7 +9465,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9487,7 +9487,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9509,7 +9509,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9531,7 +9531,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9553,7 +9553,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9575,7 +9575,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9597,7 +9597,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9619,7 +9619,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9641,7 +9641,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9663,7 +9663,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9685,7 +9685,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9707,7 +9707,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9729,7 +9729,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9751,7 +9751,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9773,7 +9773,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9795,7 +9795,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9817,7 +9817,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9839,7 +9839,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9861,7 +9861,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9883,7 +9883,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9905,7 +9905,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9927,7 +9927,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9949,7 +9949,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9971,7 +9971,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9993,7 +9993,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10015,7 +10015,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10037,7 +10037,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10059,7 +10059,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10081,7 +10081,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10103,7 +10103,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10125,7 +10125,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10147,7 +10147,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10169,7 +10169,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10191,7 +10191,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10213,7 +10213,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10235,7 +10235,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10257,7 +10257,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgLargeHotelNew2004_Chicago.idf b/testfiles/RefBldgLargeHotelNew2004_Chicago.idf index d082d261c57..16f6354994d 100644 --- a/testfiles/RefBldgLargeHotelNew2004_Chicago.idf +++ b/testfiles/RefBldgLargeHotelNew2004_Chicago.idf @@ -4505,7 +4505,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4527,7 +4527,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4549,7 +4549,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4571,7 +4571,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4593,7 +4593,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4615,7 +4615,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4637,7 +4637,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4659,7 +4659,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4681,7 +4681,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4703,7 +4703,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4725,7 +4725,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4747,7 +4747,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4769,7 +4769,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4791,7 +4791,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4813,7 +4813,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4835,7 +4835,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4857,7 +4857,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4879,7 +4879,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4901,7 +4901,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4923,7 +4923,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4945,7 +4945,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgLargeOfficeNew2004_Chicago-ReturnReset.idf b/testfiles/RefBldgLargeOfficeNew2004_Chicago-ReturnReset.idf index 55ed7567af7..90a394868e6 100644 --- a/testfiles/RefBldgLargeOfficeNew2004_Chicago-ReturnReset.idf +++ b/testfiles/RefBldgLargeOfficeNew2004_Chicago-ReturnReset.idf @@ -3304,7 +3304,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3326,7 +3326,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3348,7 +3348,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3370,7 +3370,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3392,7 +3392,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3414,7 +3414,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3436,7 +3436,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3458,7 +3458,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3480,7 +3480,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3502,7 +3502,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3524,7 +3524,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3546,7 +3546,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3568,7 +3568,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3590,7 +3590,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3612,7 +3612,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3634,7 +3634,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgLargeOfficeNew2004_Chicago.idf b/testfiles/RefBldgLargeOfficeNew2004_Chicago.idf index cb64a0d0cba..64f6ab9c595 100644 --- a/testfiles/RefBldgLargeOfficeNew2004_Chicago.idf +++ b/testfiles/RefBldgLargeOfficeNew2004_Chicago.idf @@ -3303,7 +3303,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3325,7 +3325,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3347,7 +3347,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3369,7 +3369,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3391,7 +3391,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3413,7 +3413,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3435,7 +3435,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3457,7 +3457,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3479,7 +3479,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3501,7 +3501,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3523,7 +3523,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3545,7 +3545,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3567,7 +3567,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3589,7 +3589,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3611,7 +3611,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3633,7 +3633,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgMediumOfficeNew2004_Chicago.idf b/testfiles/RefBldgMediumOfficeNew2004_Chicago.idf index e1aa7daced4..7d36bbd9070 100644 --- a/testfiles/RefBldgMediumOfficeNew2004_Chicago.idf +++ b/testfiles/RefBldgMediumOfficeNew2004_Chicago.idf @@ -3233,7 +3233,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3255,7 +3255,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3277,7 +3277,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3299,7 +3299,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3321,7 +3321,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3343,7 +3343,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3365,7 +3365,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3387,7 +3387,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3409,7 +3409,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3431,7 +3431,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3453,7 +3453,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3475,7 +3475,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3497,7 +3497,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3519,7 +3519,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3541,7 +3541,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgMediumOfficeNew2004_Chicago_JSON_Outputs.idf b/testfiles/RefBldgMediumOfficeNew2004_Chicago_JSON_Outputs.idf index 6e53c251c20..248c1536547 100644 --- a/testfiles/RefBldgMediumOfficeNew2004_Chicago_JSON_Outputs.idf +++ b/testfiles/RefBldgMediumOfficeNew2004_Chicago_JSON_Outputs.idf @@ -3233,7 +3233,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3255,7 +3255,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3277,7 +3277,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3299,7 +3299,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3321,7 +3321,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3343,7 +3343,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3365,7 +3365,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3387,7 +3387,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3409,7 +3409,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3431,7 +3431,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3453,7 +3453,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3475,7 +3475,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3497,7 +3497,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3519,7 +3519,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3541,7 +3541,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgMediumOfficeNew2004_Chicago_OutputControl.idf b/testfiles/RefBldgMediumOfficeNew2004_Chicago_OutputControl.idf index 2a3ce94079b..25ef6125b7d 100644 --- a/testfiles/RefBldgMediumOfficeNew2004_Chicago_OutputControl.idf +++ b/testfiles/RefBldgMediumOfficeNew2004_Chicago_OutputControl.idf @@ -3233,7 +3233,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3255,7 +3255,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3277,7 +3277,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3299,7 +3299,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3321,7 +3321,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3343,7 +3343,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3365,7 +3365,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3387,7 +3387,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3409,7 +3409,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3431,7 +3431,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3453,7 +3453,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3475,7 +3475,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3497,7 +3497,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3519,7 +3519,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3541,7 +3541,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgMidriseApartmentNew2004_Chicago.idf b/testfiles/RefBldgMidriseApartmentNew2004_Chicago.idf index 055efbb10ab..1d022813c6d 100644 --- a/testfiles/RefBldgMidriseApartmentNew2004_Chicago.idf +++ b/testfiles/RefBldgMidriseApartmentNew2004_Chicago.idf @@ -4813,7 +4813,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4835,7 +4835,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4857,7 +4857,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4879,7 +4879,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4901,7 +4901,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4923,7 +4923,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4945,7 +4945,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4967,7 +4967,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4989,7 +4989,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5011,7 +5011,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5033,7 +5033,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5055,7 +5055,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5077,7 +5077,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5099,7 +5099,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5121,7 +5121,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5143,7 +5143,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5165,7 +5165,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5187,7 +5187,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5209,7 +5209,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5231,7 +5231,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5253,7 +5253,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5275,7 +5275,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5297,7 +5297,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5319,7 +5319,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgOutPatientNew2004_Chicago.idf b/testfiles/RefBldgOutPatientNew2004_Chicago.idf index 0c801c26049..0c2da57f71f 100644 --- a/testfiles/RefBldgOutPatientNew2004_Chicago.idf +++ b/testfiles/RefBldgOutPatientNew2004_Chicago.idf @@ -17144,7 +17144,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17166,7 +17166,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17188,7 +17188,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17210,7 +17210,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17232,7 +17232,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17254,7 +17254,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17276,7 +17276,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17298,7 +17298,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17320,7 +17320,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17342,7 +17342,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17364,7 +17364,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17386,7 +17386,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17408,7 +17408,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17430,7 +17430,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17452,7 +17452,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17474,7 +17474,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17496,7 +17496,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17518,7 +17518,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17540,7 +17540,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17562,7 +17562,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17584,7 +17584,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17606,7 +17606,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17628,7 +17628,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17650,7 +17650,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17672,7 +17672,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17694,7 +17694,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17716,7 +17716,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17738,7 +17738,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17760,7 +17760,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17782,7 +17782,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17804,7 +17804,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17826,7 +17826,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17848,7 +17848,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17870,7 +17870,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17892,7 +17892,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17914,7 +17914,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17936,7 +17936,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17958,7 +17958,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17980,7 +17980,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18002,7 +18002,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18024,7 +18024,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18046,7 +18046,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18068,7 +18068,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18090,7 +18090,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18112,7 +18112,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18134,7 +18134,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18156,7 +18156,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18178,7 +18178,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18200,7 +18200,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18222,7 +18222,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18244,7 +18244,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18266,7 +18266,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18288,7 +18288,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18310,7 +18310,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18332,7 +18332,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18354,7 +18354,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18376,7 +18376,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18398,7 +18398,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgPrimarySchoolNew2004_Chicago.idf b/testfiles/RefBldgPrimarySchoolNew2004_Chicago.idf index eeadae34a52..a1e40039e65 100644 --- a/testfiles/RefBldgPrimarySchoolNew2004_Chicago.idf +++ b/testfiles/RefBldgPrimarySchoolNew2004_Chicago.idf @@ -4579,7 +4579,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4601,7 +4601,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4623,7 +4623,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4645,7 +4645,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4667,7 +4667,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4689,7 +4689,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4711,7 +4711,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4733,7 +4733,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4755,7 +4755,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4777,7 +4777,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4799,7 +4799,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4821,7 +4821,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4843,7 +4843,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4865,7 +4865,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4887,7 +4887,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4909,7 +4909,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4931,7 +4931,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4953,7 +4953,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4975,7 +4975,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4997,7 +4997,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5019,7 +5019,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5041,7 +5041,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5063,7 +5063,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgQuickServiceRestaurantNew2004_Chicago.idf b/testfiles/RefBldgQuickServiceRestaurantNew2004_Chicago.idf index 98cc34fafc5..35786549d08 100644 --- a/testfiles/RefBldgQuickServiceRestaurantNew2004_Chicago.idf +++ b/testfiles/RefBldgQuickServiceRestaurantNew2004_Chicago.idf @@ -978,7 +978,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1000,7 +1000,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgSecondarySchoolNew2004_Chicago.idf b/testfiles/RefBldgSecondarySchoolNew2004_Chicago.idf index 5d3f2c00c0f..f9add60298e 100644 --- a/testfiles/RefBldgSecondarySchoolNew2004_Chicago.idf +++ b/testfiles/RefBldgSecondarySchoolNew2004_Chicago.idf @@ -9255,7 +9255,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9277,7 +9277,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9299,7 +9299,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9321,7 +9321,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9343,7 +9343,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9365,7 +9365,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9387,7 +9387,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9409,7 +9409,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9431,7 +9431,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9453,7 +9453,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9475,7 +9475,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9497,7 +9497,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9519,7 +9519,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9541,7 +9541,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9563,7 +9563,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9585,7 +9585,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9607,7 +9607,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9629,7 +9629,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9651,7 +9651,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9673,7 +9673,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9695,7 +9695,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9717,7 +9717,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9739,7 +9739,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9761,7 +9761,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9783,7 +9783,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9805,7 +9805,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9827,7 +9827,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9849,7 +9849,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9871,7 +9871,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9893,7 +9893,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9915,7 +9915,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9937,7 +9937,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9959,7 +9959,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9981,7 +9981,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10003,7 +10003,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10025,7 +10025,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10047,7 +10047,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10069,7 +10069,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10091,7 +10091,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10113,7 +10113,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10135,7 +10135,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10157,7 +10157,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgSmallHotelNew2004_Chicago.idf b/testfiles/RefBldgSmallHotelNew2004_Chicago.idf index 7c26f20002c..c508ec23a2d 100644 --- a/testfiles/RefBldgSmallHotelNew2004_Chicago.idf +++ b/testfiles/RefBldgSmallHotelNew2004_Chicago.idf @@ -11506,7 +11506,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11528,7 +11528,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11550,7 +11550,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11572,7 +11572,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11594,7 +11594,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11616,7 +11616,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11638,7 +11638,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11660,7 +11660,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11682,7 +11682,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11704,7 +11704,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11726,7 +11726,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11748,7 +11748,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11770,7 +11770,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11792,7 +11792,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11814,7 +11814,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11836,7 +11836,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11858,7 +11858,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11880,7 +11880,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11902,7 +11902,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11924,7 +11924,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11946,7 +11946,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11968,7 +11968,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11990,7 +11990,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12012,7 +12012,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12034,7 +12034,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12056,7 +12056,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12078,7 +12078,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12100,7 +12100,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12122,7 +12122,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12144,7 +12144,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12166,7 +12166,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12188,7 +12188,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12210,7 +12210,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12232,7 +12232,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12254,7 +12254,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12276,7 +12276,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12298,7 +12298,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12320,7 +12320,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12342,7 +12342,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12364,7 +12364,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12386,7 +12386,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12408,7 +12408,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgSmallOfficeNew2004_Chicago.idf b/testfiles/RefBldgSmallOfficeNew2004_Chicago.idf index 14d62ad762a..468861679fe 100644 --- a/testfiles/RefBldgSmallOfficeNew2004_Chicago.idf +++ b/testfiles/RefBldgSmallOfficeNew2004_Chicago.idf @@ -1716,7 +1716,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1738,7 +1738,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1760,7 +1760,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1782,7 +1782,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1804,7 +1804,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgStand-aloneRetailNew2004_Chicago.idf b/testfiles/RefBldgStand-aloneRetailNew2004_Chicago.idf index 956992614a1..bb257055b62 100644 --- a/testfiles/RefBldgStand-aloneRetailNew2004_Chicago.idf +++ b/testfiles/RefBldgStand-aloneRetailNew2004_Chicago.idf @@ -1317,7 +1317,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1339,7 +1339,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1361,7 +1361,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1383,7 +1383,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1405,7 +1405,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgStripMallNew2004_Chicago.idf b/testfiles/RefBldgStripMallNew2004_Chicago.idf index b1b20c9f3c5..0e7b8f5e23e 100644 --- a/testfiles/RefBldgStripMallNew2004_Chicago.idf +++ b/testfiles/RefBldgStripMallNew2004_Chicago.idf @@ -2483,7 +2483,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2505,7 +2505,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2527,7 +2527,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2549,7 +2549,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2571,7 +2571,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2593,7 +2593,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2615,7 +2615,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2637,7 +2637,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2659,7 +2659,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2681,7 +2681,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgSuperMarketNew2004_Chicago.idf b/testfiles/RefBldgSuperMarketNew2004_Chicago.idf index 8d37d3f98dc..aeb758534fd 100644 --- a/testfiles/RefBldgSuperMarketNew2004_Chicago.idf +++ b/testfiles/RefBldgSuperMarketNew2004_Chicago.idf @@ -1343,7 +1343,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1365,7 +1365,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1387,7 +1387,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1409,7 +1409,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1431,7 +1431,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1453,7 +1453,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgWarehouseNew2004_Chicago.idf b/testfiles/RefBldgWarehouseNew2004_Chicago.idf index ad3d4ece6e3..8f08d11f789 100644 --- a/testfiles/RefBldgWarehouseNew2004_Chicago.idf +++ b/testfiles/RefBldgWarehouseNew2004_Chicago.idf @@ -1253,7 +1253,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefMedOffVAVAllDefVRP.idf b/testfiles/RefMedOffVAVAllDefVRP.idf index 0b51c3f6d7a..1e3a0fd2f37 100644 --- a/testfiles/RefMedOffVAVAllDefVRP.idf +++ b/testfiles/RefMedOffVAVAllDefVRP.idf @@ -3236,7 +3236,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3258,7 +3258,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3280,7 +3280,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3302,7 +3302,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3324,7 +3324,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3346,7 +3346,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3368,7 +3368,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3390,7 +3390,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3412,7 +3412,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3434,7 +3434,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3456,7 +3456,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3478,7 +3478,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3500,7 +3500,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3522,7 +3522,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3544,7 +3544,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ReflectiveAdjacentBuilding.idf b/testfiles/ReflectiveAdjacentBuilding.idf index 128a8221924..31f58caeaf9 100644 --- a/testfiles/ReflectiveAdjacentBuilding.idf +++ b/testfiles/ReflectiveAdjacentBuilding.idf @@ -558,7 +558,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -606,7 +606,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -654,7 +654,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefrigeratedWarehouse.idf b/testfiles/RefrigeratedWarehouse.idf index 363c5805d8c..6deb0ec4364 100644 --- a/testfiles/RefrigeratedWarehouse.idf +++ b/testfiles/RefrigeratedWarehouse.idf @@ -4705,7 +4705,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4727,7 +4727,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4749,7 +4749,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4771,7 +4771,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4793,7 +4793,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4815,7 +4815,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4837,7 +4837,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4859,7 +4859,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4881,7 +4881,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4903,7 +4903,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4925,7 +4925,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4947,7 +4947,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4969,7 +4969,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4991,7 +4991,7 @@ Activity Schedule, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff. Schedule, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ReliefIndEvapCoolerRTUoffice.idf b/testfiles/ReliefIndEvapCoolerRTUoffice.idf index 4d0506eb68f..4c0ef7398df 100644 --- a/testfiles/ReliefIndEvapCoolerRTUoffice.idf +++ b/testfiles/ReliefIndEvapCoolerRTUoffice.idf @@ -3053,7 +3053,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3074,7 +3074,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3095,7 +3095,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3116,7 +3116,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3137,7 +3137,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3158,7 +3158,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3179,7 +3179,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3200,7 +3200,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3221,7 +3221,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3242,7 +3242,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ReportDaylightFactors.idf b/testfiles/ReportDaylightFactors.idf index f892eda27dc..3ae5709bba1 100644 --- a/testfiles/ReportDaylightFactors.idf +++ b/testfiles/ReportDaylightFactors.idf @@ -3237,7 +3237,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3259,7 +3259,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3281,7 +3281,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3303,7 +3303,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3325,7 +3325,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3347,7 +3347,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3369,7 +3369,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3391,7 +3391,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3413,7 +3413,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3435,7 +3435,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3457,7 +3457,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3479,7 +3479,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3501,7 +3501,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3523,7 +3523,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3545,7 +3545,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ReportHeatEmission_RefFSRestaurant.idf b/testfiles/ReportHeatEmission_RefFSRestaurant.idf index bbee1505c25..4bee3b2d69e 100644 --- a/testfiles/ReportHeatEmission_RefFSRestaurant.idf +++ b/testfiles/ReportHeatEmission_RefFSRestaurant.idf @@ -975,7 +975,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -997,7 +997,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RetailPackagedTESCoil.idf b/testfiles/RetailPackagedTESCoil.idf index 8dd2f9cf701..dbe3ed3a972 100644 --- a/testfiles/RetailPackagedTESCoil.idf +++ b/testfiles/RetailPackagedTESCoil.idf @@ -1290,7 +1290,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1312,7 +1312,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1334,7 +1334,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1356,7 +1356,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1378,7 +1378,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/RoomAirflowNetwork.idf b/testfiles/RoomAirflowNetwork.idf index 34dfabfc6f5..5db918873fc 100644 --- a/testfiles/RoomAirflowNetwork.idf +++ b/testfiles/RoomAirflowNetwork.idf @@ -1344,7 +1344,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1366,7 +1366,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1388,7 +1388,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1410,7 +1410,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1432,7 +1432,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ShopWithBIPVT.idf b/testfiles/ShopWithBIPVT.idf index e00e4731831..052ec37f044 100644 --- a/testfiles/ShopWithBIPVT.idf +++ b/testfiles/ShopWithBIPVT.idf @@ -1166,7 +1166,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1579,7 +1579,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1992,7 +1992,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2405,7 +2405,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2771,7 +2771,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ShopWithPVandBattery.idf b/testfiles/ShopWithPVandBattery.idf index 093bdf3af4e..7bd040ea222 100644 --- a/testfiles/ShopWithPVandBattery.idf +++ b/testfiles/ShopWithPVandBattery.idf @@ -1187,7 +1187,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1573,7 +1573,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1959,7 +1959,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2345,7 +2345,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2716,7 +2716,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ShopWithPVandLiIonBattery.idf b/testfiles/ShopWithPVandLiIonBattery.idf index 27aa3dd5f43..d6a814f15ef 100644 --- a/testfiles/ShopWithPVandLiIonBattery.idf +++ b/testfiles/ShopWithPVandLiIonBattery.idf @@ -1187,7 +1187,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1573,7 +1573,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1959,7 +1959,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2345,7 +2345,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2716,7 +2716,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ShopWithPVandStorage.idf b/testfiles/ShopWithPVandStorage.idf index b54cd88f570..d27a0469ca9 100644 --- a/testfiles/ShopWithPVandStorage.idf +++ b/testfiles/ShopWithPVandStorage.idf @@ -1186,7 +1186,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1572,7 +1572,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1958,7 +1958,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2344,7 +2344,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2715,7 +2715,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ShopWithSimplePVT.idf b/testfiles/ShopWithSimplePVT.idf index e7f64d24977..9d6a591695a 100644 --- a/testfiles/ShopWithSimplePVT.idf +++ b/testfiles/ShopWithSimplePVT.idf @@ -1134,7 +1134,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1515,7 +1515,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1896,7 +1896,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2277,7 +2277,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2643,7 +2643,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/SingleFamilyHouse_TwoSpeed_CutoutTemperature.idf b/testfiles/SingleFamilyHouse_TwoSpeed_CutoutTemperature.idf index 1406474999f..616949ca565 100644 --- a/testfiles/SingleFamilyHouse_TwoSpeed_CutoutTemperature.idf +++ b/testfiles/SingleFamilyHouse_TwoSpeed_CutoutTemperature.idf @@ -1127,7 +1127,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoil.idf b/testfiles/SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoil.idf index c4a1a5309e0..1e90f75611c 100644 --- a/testfiles/SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoil.idf +++ b/testfiles/SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoil.idf @@ -1176,7 +1176,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoilEMS.idf b/testfiles/SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoilEMS.idf index 41060173f04..2b5e0e913bb 100644 --- a/testfiles/SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoilEMS.idf +++ b/testfiles/SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoilEMS.idf @@ -1175,7 +1175,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoil_SPControl.idf b/testfiles/SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoil_SPControl.idf index 164c969b692..a41252b34a1 100644 --- a/testfiles/SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoil_SPControl.idf +++ b/testfiles/SingleFamilyHouse_TwoSpeed_MultiStageElectricSuppCoil_SPControl.idf @@ -1177,7 +1177,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/SingleFamilyHouse_TwoSpeed_ZoneAirBalance.idf b/testfiles/SingleFamilyHouse_TwoSpeed_ZoneAirBalance.idf index b8fe401dcea..eed59e014d0 100644 --- a/testfiles/SingleFamilyHouse_TwoSpeed_ZoneAirBalance.idf +++ b/testfiles/SingleFamilyHouse_TwoSpeed_ZoneAirBalance.idf @@ -1127,7 +1127,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/SmallOffice_CentralDOAS.idf b/testfiles/SmallOffice_CentralDOAS.idf index 6bd38f377f8..3870a66b026 100644 --- a/testfiles/SmallOffice_CentralDOAS.idf +++ b/testfiles/SmallOffice_CentralDOAS.idf @@ -1686,7 +1686,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1708,7 +1708,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1730,7 +1730,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1752,7 +1752,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1774,7 +1774,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/SpectralAngularOpticalProperties_TableData.idf b/testfiles/SpectralAngularOpticalProperties_TableData.idf index e197f4356bc..d07be37eb4d 100644 --- a/testfiles/SpectralAngularOpticalProperties_TableData.idf +++ b/testfiles/SpectralAngularOpticalProperties_TableData.idf @@ -2242,7 +2242,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2264,7 +2264,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2286,7 +2286,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/Standard621SimplifiedProcedure_PIUterminal.idf b/testfiles/Standard621SimplifiedProcedure_PIUterminal.idf index 356de459694..c57eb13cad2 100644 --- a/testfiles/Standard621SimplifiedProcedure_PIUterminal.idf +++ b/testfiles/Standard621SimplifiedProcedure_PIUterminal.idf @@ -622,7 +622,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -656,7 +656,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -704,7 +704,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/StormWindow.idf b/testfiles/StormWindow.idf index 118d6dd4768..8e631266767 100644 --- a/testfiles/StormWindow.idf +++ b/testfiles/StormWindow.idf @@ -551,7 +551,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -585,7 +585,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -633,7 +633,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/StripMallZoneEvapCooler.idf b/testfiles/StripMallZoneEvapCooler.idf index 535f95cf5ef..4dc7063ebc5 100644 --- a/testfiles/StripMallZoneEvapCooler.idf +++ b/testfiles/StripMallZoneEvapCooler.idf @@ -2464,7 +2464,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2486,7 +2486,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2508,7 +2508,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2530,7 +2530,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2552,7 +2552,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2574,7 +2574,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2596,7 +2596,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2618,7 +2618,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2640,7 +2640,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2662,7 +2662,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/StripMallZoneEvapCoolerAutosized.idf b/testfiles/StripMallZoneEvapCoolerAutosized.idf index cfa9decd840..b64fabae45e 100644 --- a/testfiles/StripMallZoneEvapCoolerAutosized.idf +++ b/testfiles/StripMallZoneEvapCoolerAutosized.idf @@ -2464,7 +2464,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2486,7 +2486,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2508,7 +2508,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2530,7 +2530,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2552,7 +2552,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2574,7 +2574,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2596,7 +2596,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2618,7 +2618,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2640,7 +2640,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2662,7 +2662,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/StripMallZoneEvapCoolerRHcutoff.idf b/testfiles/StripMallZoneEvapCoolerRHcutoff.idf index c00a5ca1131..ed568051563 100644 --- a/testfiles/StripMallZoneEvapCoolerRHcutoff.idf +++ b/testfiles/StripMallZoneEvapCoolerRHcutoff.idf @@ -2464,7 +2464,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2486,7 +2486,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2508,7 +2508,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2530,7 +2530,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2552,7 +2552,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2574,7 +2574,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2596,7 +2596,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2618,7 +2618,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2640,7 +2640,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2662,7 +2662,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/SupplyPlenumVAV.idf b/testfiles/SupplyPlenumVAV.idf index 62f3e5ae850..0244aa751a7 100644 --- a/testfiles/SupplyPlenumVAV.idf +++ b/testfiles/SupplyPlenumVAV.idf @@ -452,7 +452,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -486,7 +486,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -534,7 +534,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/SurfaceHeatSourceTerm_RefBldgSmallOfficeNew2004.idf b/testfiles/SurfaceHeatSourceTerm_RefBldgSmallOfficeNew2004.idf index 3f715d1db9f..52fa786fd70 100644 --- a/testfiles/SurfaceHeatSourceTerm_RefBldgSmallOfficeNew2004.idf +++ b/testfiles/SurfaceHeatSourceTerm_RefBldgSmallOfficeNew2004.idf @@ -1774,7 +1774,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1796,7 +1796,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1818,7 +1818,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1840,7 +1840,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1862,7 +1862,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/SurfacePropGroundSurfaces_LWR.idf b/testfiles/SurfacePropGroundSurfaces_LWR.idf index c9943137452..aaf30eeaa12 100644 --- a/testfiles/SurfacePropGroundSurfaces_LWR.idf +++ b/testfiles/SurfacePropGroundSurfaces_LWR.idf @@ -564,7 +564,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -612,7 +612,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -660,7 +660,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -708,7 +708,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -756,7 +756,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/SurfacePropTest_SurfLWR.idf b/testfiles/SurfacePropTest_SurfLWR.idf index 2a78ccef5fe..6a7b94b5d6b 100644 --- a/testfiles/SurfacePropTest_SurfLWR.idf +++ b/testfiles/SurfacePropTest_SurfLWR.idf @@ -553,7 +553,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -601,7 +601,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -649,7 +649,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -697,7 +697,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -745,7 +745,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/SurfaceTest.idf b/testfiles/SurfaceTest.idf index e2f1e744372..9dc2b723a67 100644 --- a/testfiles/SurfaceTest.idf +++ b/testfiles/SurfaceTest.idf @@ -553,7 +553,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -601,7 +601,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -649,7 +649,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -697,7 +697,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -745,7 +745,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/SurfaceZonePropTest_LocalEnv.idf b/testfiles/SurfaceZonePropTest_LocalEnv.idf index 20be1ac943c..f0619fa5e1a 100644 --- a/testfiles/SurfaceZonePropTest_LocalEnv.idf +++ b/testfiles/SurfaceZonePropTest_LocalEnv.idf @@ -553,7 +553,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -601,7 +601,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -649,7 +649,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -697,7 +697,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -745,7 +745,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TRHConstFlowChillerOneBranch.idf b/testfiles/TRHConstFlowChillerOneBranch.idf index d321abd5edf..abff2de1abf 100644 --- a/testfiles/TRHConstFlowChillerOneBranch.idf +++ b/testfiles/TRHConstFlowChillerOneBranch.idf @@ -1030,7 +1030,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1052,7 +1052,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1074,7 +1074,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TRHEvapCoolerOAStaged.idf b/testfiles/TRHEvapCoolerOAStaged.idf index 46b38ec551a..010e6f223d8 100644 --- a/testfiles/TRHEvapCoolerOAStaged.idf +++ b/testfiles/TRHEvapCoolerOAStaged.idf @@ -977,7 +977,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -999,7 +999,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1021,7 +1021,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TRHEvapCoolerOAStagedWetCoil.idf b/testfiles/TRHEvapCoolerOAStagedWetCoil.idf index 0ce1d186ed0..58e50fc4296 100644 --- a/testfiles/TRHEvapCoolerOAStagedWetCoil.idf +++ b/testfiles/TRHEvapCoolerOAStagedWetCoil.idf @@ -977,7 +977,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -999,7 +999,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1021,7 +1021,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TermRHDXSystem.idf b/testfiles/TermRHDXSystem.idf index 17a37cb9d35..cf7b3bfb324 100644 --- a/testfiles/TermRHDXSystem.idf +++ b/testfiles/TermRHDXSystem.idf @@ -1005,7 +1005,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1027,7 +1027,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1049,7 +1049,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TermRHGasElecCoils.idf b/testfiles/TermRHGasElecCoils.idf index 22b0428431e..4a1e7a8043d 100644 --- a/testfiles/TermRHGasElecCoils.idf +++ b/testfiles/TermRHGasElecCoils.idf @@ -629,7 +629,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -663,7 +663,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -711,7 +711,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TermReheat.idf b/testfiles/TermReheat.idf index f8025cf431d..98f23cda347 100644 --- a/testfiles/TermReheat.idf +++ b/testfiles/TermReheat.idf @@ -635,7 +635,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -669,7 +669,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -717,7 +717,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TermReheatPri-SecLoop.idf b/testfiles/TermReheatPri-SecLoop.idf index 3758d25fb2d..e889a6ee161 100644 --- a/testfiles/TermReheatPri-SecLoop.idf +++ b/testfiles/TermReheatPri-SecLoop.idf @@ -640,7 +640,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -674,7 +674,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -722,7 +722,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TermReheatScheduledPump.idf b/testfiles/TermReheatScheduledPump.idf index 9ecdf85dbe0..8efd38603e8 100644 --- a/testfiles/TermReheatScheduledPump.idf +++ b/testfiles/TermReheatScheduledPump.idf @@ -1057,7 +1057,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1079,7 +1079,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1101,7 +1101,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TermReheatZoneExh.idf b/testfiles/TermReheatZoneExh.idf index 04c6b0554f9..8f02b094e85 100644 --- a/testfiles/TermReheatZoneExh.idf +++ b/testfiles/TermReheatZoneExh.idf @@ -648,7 +648,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -682,7 +682,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -730,7 +730,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TermRhDualSetpointWithDB.idf b/testfiles/TermRhDualSetpointWithDB.idf index dc440f7bc8c..5e762b19317 100644 --- a/testfiles/TermRhDualSetpointWithDB.idf +++ b/testfiles/TermRhDualSetpointWithDB.idf @@ -976,7 +976,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1000,7 +1000,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1023,7 +1023,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TermRhGenericOAHeatRecMinExh.idf b/testfiles/TermRhGenericOAHeatRecMinExh.idf index e0253a97479..a3a85291e55 100644 --- a/testfiles/TermRhGenericOAHeatRecMinExh.idf +++ b/testfiles/TermRhGenericOAHeatRecMinExh.idf @@ -524,7 +524,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -558,7 +558,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -606,7 +606,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TermRhGenericOAHeatRecPreheat.idf b/testfiles/TermRhGenericOAHeatRecPreheat.idf index 10a4c68b8b9..eb26f0f3b95 100644 --- a/testfiles/TermRhGenericOAHeatRecPreheat.idf +++ b/testfiles/TermRhGenericOAHeatRecPreheat.idf @@ -524,7 +524,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -558,7 +558,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -606,7 +606,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TermRhSingleHeatCoolNoDB.idf b/testfiles/TermRhSingleHeatCoolNoDB.idf index 0f7b3885564..c624fbe34f5 100644 --- a/testfiles/TermRhSingleHeatCoolNoDB.idf +++ b/testfiles/TermRhSingleHeatCoolNoDB.idf @@ -971,7 +971,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -993,7 +993,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1015,7 +1015,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ThermochromicWindow.idf b/testfiles/ThermochromicWindow.idf index a8a166b2900..d528ef433b8 100644 --- a/testfiles/ThermochromicWindow.idf +++ b/testfiles/ThermochromicWindow.idf @@ -1328,7 +1328,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1831,7 +1831,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2234,7 +2234,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2667,7 +2667,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3070,7 +3070,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/TranspiredCollectors.idf b/testfiles/TranspiredCollectors.idf index aa0ebe032b7..bcbba7f7963 100644 --- a/testfiles/TranspiredCollectors.idf +++ b/testfiles/TranspiredCollectors.idf @@ -2821,7 +2821,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2843,7 +2843,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2865,7 +2865,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2887,7 +2887,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2909,7 +2909,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2931,7 +2931,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2953,7 +2953,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2975,7 +2975,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2997,7 +2997,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3019,7 +3019,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/UnitHeater.idf b/testfiles/UnitHeater.idf index 5edba9acbd6..15dea37220f 100644 --- a/testfiles/UnitHeater.idf +++ b/testfiles/UnitHeater.idf @@ -441,7 +441,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -475,7 +475,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -523,7 +523,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/UnitHeaterAuto.idf b/testfiles/UnitHeaterAuto.idf index 9d2f4a1b656..1a26ea134ed 100644 --- a/testfiles/UnitHeaterAuto.idf +++ b/testfiles/UnitHeaterAuto.idf @@ -588,7 +588,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -622,7 +622,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -670,7 +670,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/UnitHeaterGasElec.idf b/testfiles/UnitHeaterGasElec.idf index 8126779621d..8ca6a7b569f 100644 --- a/testfiles/UnitHeaterGasElec.idf +++ b/testfiles/UnitHeaterGasElec.idf @@ -438,7 +438,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -472,7 +472,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -520,7 +520,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/UnitarySystem_DXCoilSystemAuto.idf b/testfiles/UnitarySystem_DXCoilSystemAuto.idf index fba53e635c4..092f14c7304 100644 --- a/testfiles/UnitarySystem_DXCoilSystemAuto.idf +++ b/testfiles/UnitarySystem_DXCoilSystemAuto.idf @@ -974,7 +974,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -996,7 +996,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1018,7 +1018,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/UnitarySystem_FurnaceWithDXSystemRHcontrol.idf b/testfiles/UnitarySystem_FurnaceWithDXSystemRHcontrol.idf index a607fa0cf11..53011c2dce0 100644 --- a/testfiles/UnitarySystem_FurnaceWithDXSystemRHcontrol.idf +++ b/testfiles/UnitarySystem_FurnaceWithDXSystemRHcontrol.idf @@ -1042,7 +1042,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1064,7 +1064,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1086,7 +1086,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/UnitarySystem_HeatPumpAuto.idf b/testfiles/UnitarySystem_HeatPumpAuto.idf index 366f78c2ad4..9b85414cfcf 100644 --- a/testfiles/UnitarySystem_HeatPumpAuto.idf +++ b/testfiles/UnitarySystem_HeatPumpAuto.idf @@ -976,7 +976,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -998,7 +998,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1020,7 +1020,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/UnitarySystem_MultiSpeedCoils_SingleMode.idf b/testfiles/UnitarySystem_MultiSpeedCoils_SingleMode.idf index 2cfbd528950..dc9caabf3cc 100644 --- a/testfiles/UnitarySystem_MultiSpeedCoils_SingleMode.idf +++ b/testfiles/UnitarySystem_MultiSpeedCoils_SingleMode.idf @@ -977,7 +977,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -999,7 +999,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1021,7 +1021,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/UnitarySystem_VSCoolingCoil.idf b/testfiles/UnitarySystem_VSCoolingCoil.idf index 22c6cd50975..0de5c6195d7 100644 --- a/testfiles/UnitarySystem_VSCoolingCoil.idf +++ b/testfiles/UnitarySystem_VSCoolingCoil.idf @@ -976,7 +976,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -998,7 +998,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1020,7 +1020,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/UnitarySystem_WaterCoils_wMultiSpeedFan.idf b/testfiles/UnitarySystem_WaterCoils_wMultiSpeedFan.idf index c7bd852a5f9..67b6d6eb64b 100644 --- a/testfiles/UnitarySystem_WaterCoils_wMultiSpeedFan.idf +++ b/testfiles/UnitarySystem_WaterCoils_wMultiSpeedFan.idf @@ -1107,7 +1107,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1129,7 +1129,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1151,7 +1151,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/UnitarySystem_ZoneVSWSHP_wDOAS.idf b/testfiles/UnitarySystem_ZoneVSWSHP_wDOAS.idf index 695041ea1ad..3e08a8b99dd 100644 --- a/testfiles/UnitarySystem_ZoneVSWSHP_wDOAS.idf +++ b/testfiles/UnitarySystem_ZoneVSWSHP_wDOAS.idf @@ -968,7 +968,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/UserDefinedRoomAirPatterns.idf b/testfiles/UserDefinedRoomAirPatterns.idf index 3043f750446..c4811d9e71e 100644 --- a/testfiles/UserDefinedRoomAirPatterns.idf +++ b/testfiles/UserDefinedRoomAirPatterns.idf @@ -8790,7 +8790,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8812,7 +8812,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8834,7 +8834,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8856,7 +8856,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8878,7 +8878,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8900,7 +8900,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8922,7 +8922,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8944,7 +8944,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8966,7 +8966,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/VAVSingleDuctConstFlowBoiler.idf b/testfiles/VAVSingleDuctConstFlowBoiler.idf index d93f5fac2aa..b2711c43582 100644 --- a/testfiles/VAVSingleDuctConstFlowBoiler.idf +++ b/testfiles/VAVSingleDuctConstFlowBoiler.idf @@ -1031,7 +1031,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1053,7 +1053,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1075,7 +1075,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/VAVSingleDuctReheat.idf b/testfiles/VAVSingleDuctReheat.idf index 4827b1b1cc0..eaa435395e7 100644 --- a/testfiles/VAVSingleDuctReheat.idf +++ b/testfiles/VAVSingleDuctReheat.idf @@ -636,7 +636,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -670,7 +670,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -718,7 +718,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/VAVSingleDuctReheatBaseboard.idf b/testfiles/VAVSingleDuctReheatBaseboard.idf index 39a8b7d10fc..e3e9be6db65 100644 --- a/testfiles/VAVSingleDuctReheatBaseboard.idf +++ b/testfiles/VAVSingleDuctReheatBaseboard.idf @@ -1032,7 +1032,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1054,7 +1054,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1076,7 +1076,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/VAVSingleDuctReheatNoReheat.idf b/testfiles/VAVSingleDuctReheatNoReheat.idf index 66ea76e49be..d094218af39 100644 --- a/testfiles/VAVSingleDuctReheatNoReheat.idf +++ b/testfiles/VAVSingleDuctReheatNoReheat.idf @@ -1033,7 +1033,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1055,7 +1055,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1077,7 +1077,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/VAVSingleDuctReheat_DualMax.idf b/testfiles/VAVSingleDuctReheat_DualMax.idf index 3f82675fff8..c522825f8b6 100644 --- a/testfiles/VAVSingleDuctReheat_DualMax.idf +++ b/testfiles/VAVSingleDuctReheat_DualMax.idf @@ -633,7 +633,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -667,7 +667,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -715,7 +715,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/VAVSingleDuctReheat_MaxSAT_ReverseActing.idf b/testfiles/VAVSingleDuctReheat_MaxSAT_ReverseActing.idf index 565f0bd768f..e2a667a1c19 100644 --- a/testfiles/VAVSingleDuctReheat_MaxSAT_ReverseActing.idf +++ b/testfiles/VAVSingleDuctReheat_MaxSAT_ReverseActing.idf @@ -665,7 +665,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -699,7 +699,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -747,7 +747,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/VAVSingleDuctVarFlowBoiler.idf b/testfiles/VAVSingleDuctVarFlowBoiler.idf index e45779677fb..49e96ba126f 100644 --- a/testfiles/VAVSingleDuctVarFlowBoiler.idf +++ b/testfiles/VAVSingleDuctVarFlowBoiler.idf @@ -1031,7 +1031,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1053,7 +1053,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1075,7 +1075,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/VSDXCoilSystemAuto.idf b/testfiles/VSDXCoilSystemAuto.idf index dc1f7377181..af14e37c6ee 100644 --- a/testfiles/VSDXCoilSystemAuto.idf +++ b/testfiles/VSDXCoilSystemAuto.idf @@ -1488,7 +1488,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1510,7 +1510,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1532,7 +1532,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/WWHPSimpleAuto.idf b/testfiles/WWHPSimpleAuto.idf index 4f1b9291cc3..94ab7a74aff 100644 --- a/testfiles/WWHPSimpleAuto.idf +++ b/testfiles/WWHPSimpleAuto.idf @@ -694,7 +694,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -728,7 +728,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -776,7 +776,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/WindACAirtoAir.idf b/testfiles/WindACAirtoAir.idf index 00f66bcf30c..53edc883a71 100644 --- a/testfiles/WindACAirtoAir.idf +++ b/testfiles/WindACAirtoAir.idf @@ -631,7 +631,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -665,7 +665,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -713,7 +713,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/WindACAuto.idf b/testfiles/WindACAuto.idf index 1f95ed88c9e..2042319642b 100644 --- a/testfiles/WindACAuto.idf +++ b/testfiles/WindACAuto.idf @@ -634,7 +634,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -668,7 +668,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -716,7 +716,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/WindACRHControl.idf b/testfiles/WindACRHControl.idf index ec3f86543a8..0f7eecf3f8a 100644 --- a/testfiles/WindACRHControl.idf +++ b/testfiles/WindACRHControl.idf @@ -1077,7 +1077,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1099,7 +1099,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method @@ -1121,7 +1121,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name , !- Clothing Insulation Calculation Method diff --git a/testfiles/ZoneCoupledKivaConvection.idf b/testfiles/ZoneCoupledKivaConvection.idf index e714da08ce3..46bf3dea94d 100644 --- a/testfiles/ZoneCoupledKivaConvection.idf +++ b/testfiles/ZoneCoupledKivaConvection.idf @@ -431,7 +431,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -465,7 +465,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -513,7 +513,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ZoneCoupledKivaConvectionAdaptiveSmallOffice.idf b/testfiles/ZoneCoupledKivaConvectionAdaptiveSmallOffice.idf index f55e04b1a0e..834b9df9111 100644 --- a/testfiles/ZoneCoupledKivaConvectionAdaptiveSmallOffice.idf +++ b/testfiles/ZoneCoupledKivaConvectionAdaptiveSmallOffice.idf @@ -1906,7 +1906,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1928,7 +1928,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1950,7 +1950,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1972,7 +1972,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1994,7 +1994,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ZoneCoupledKivaRefBldgMediumOffice.idf b/testfiles/ZoneCoupledKivaRefBldgMediumOffice.idf index 19fe51cc98c..ed9a73a770f 100644 --- a/testfiles/ZoneCoupledKivaRefBldgMediumOffice.idf +++ b/testfiles/ZoneCoupledKivaRefBldgMediumOffice.idf @@ -3300,7 +3300,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3322,7 +3322,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3344,7 +3344,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3366,7 +3366,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3388,7 +3388,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3410,7 +3410,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3432,7 +3432,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3454,7 +3454,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3476,7 +3476,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3498,7 +3498,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3520,7 +3520,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3542,7 +3542,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3564,7 +3564,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3586,7 +3586,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3608,7 +3608,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ZoneCoupledKivaRefBldgMediumOfficeNoClg.idf b/testfiles/ZoneCoupledKivaRefBldgMediumOfficeNoClg.idf index 094b86e3fc5..2aab10f475a 100644 --- a/testfiles/ZoneCoupledKivaRefBldgMediumOfficeNoClg.idf +++ b/testfiles/ZoneCoupledKivaRefBldgMediumOfficeNoClg.idf @@ -3300,7 +3300,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3322,7 +3322,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3344,7 +3344,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3366,7 +3366,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3388,7 +3388,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3410,7 +3410,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3432,7 +3432,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3454,7 +3454,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3476,7 +3476,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3498,7 +3498,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3520,7 +3520,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3542,7 +3542,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3564,7 +3564,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3586,7 +3586,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3608,7 +3608,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ZoneSysAvailManager.idf b/testfiles/ZoneSysAvailManager.idf index f3b1f67c6ea..eb5d9e0ee2c 100644 --- a/testfiles/ZoneSysAvailManager.idf +++ b/testfiles/ZoneSysAvailManager.idf @@ -463,7 +463,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ZoneVSWSHP_wDOAS.idf b/testfiles/ZoneVSWSHP_wDOAS.idf index 9785ed5f9a1..f3f86bc91ed 100644 --- a/testfiles/ZoneVSWSHP_wDOAS.idf +++ b/testfiles/ZoneVSWSHP_wDOAS.idf @@ -952,7 +952,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ZoneWSHP_wDOAS.idf b/testfiles/ZoneWSHP_wDOAS.idf index da9e2f26dba..67e9ab0a8d9 100644 --- a/testfiles/ZoneWSHP_wDOAS.idf +++ b/testfiles/ZoneWSHP_wDOAS.idf @@ -464,7 +464,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_AllOffOpScheme.idf b/testfiles/_AllOffOpScheme.idf index 2c55e489e38..9e4e54ec2f6 100644 --- a/testfiles/_AllOffOpScheme.idf +++ b/testfiles/_AllOffOpScheme.idf @@ -530,7 +530,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -564,7 +564,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -612,7 +612,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_DualDuctConstVolDamperMultizoneAverageSetPointManager.idf b/testfiles/_DualDuctConstVolDamperMultizoneAverageSetPointManager.idf index daad0999d19..3c40721d27d 100644 --- a/testfiles/_DualDuctConstVolDamperMultizoneAverageSetPointManager.idf +++ b/testfiles/_DualDuctConstVolDamperMultizoneAverageSetPointManager.idf @@ -1029,7 +1029,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1051,7 +1051,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1073,7 +1073,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_ElectricASHRAE205Chiller.idf b/testfiles/_ElectricASHRAE205Chiller.idf index 77b402d1680..5c579ae291c 100644 --- a/testfiles/_ElectricASHRAE205Chiller.idf +++ b/testfiles/_ElectricASHRAE205Chiller.idf @@ -527,7 +527,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -561,7 +561,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -609,7 +609,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_ElectricREformulatedEIRChiller.idf b/testfiles/_ElectricREformulatedEIRChiller.idf index 68887b0ddce..ed1ade53805 100644 --- a/testfiles/_ElectricREformulatedEIRChiller.idf +++ b/testfiles/_ElectricREformulatedEIRChiller.idf @@ -527,7 +527,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -561,7 +561,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -609,7 +609,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_ExternalInterface-actuator.idf b/testfiles/_ExternalInterface-actuator.idf index 6dc5238a3de..8877bbae6ae 100644 --- a/testfiles/_ExternalInterface-actuator.idf +++ b/testfiles/_ExternalInterface-actuator.idf @@ -605,7 +605,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -639,7 +639,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -687,7 +687,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_ExternalInterface-functionalmockupunit-to-actuator.idf b/testfiles/_ExternalInterface-functionalmockupunit-to-actuator.idf index 730ccf42d13..5f137901538 100644 --- a/testfiles/_ExternalInterface-functionalmockupunit-to-actuator.idf +++ b/testfiles/_ExternalInterface-functionalmockupunit-to-actuator.idf @@ -613,7 +613,7 @@ Activity Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -647,7 +647,7 @@ Activity Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -695,7 +695,7 @@ Activity Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_ExternalInterface-functionalmockupunit-to-variable.idf b/testfiles/_ExternalInterface-functionalmockupunit-to-variable.idf index a47bb54da1c..70f1434bba3 100644 --- a/testfiles/_ExternalInterface-functionalmockupunit-to-variable.idf +++ b/testfiles/_ExternalInterface-functionalmockupunit-to-variable.idf @@ -613,7 +613,7 @@ Activity Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -647,7 +647,7 @@ Activity Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -695,7 +695,7 @@ Activity Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_ExternalInterface-variable.idf b/testfiles/_ExternalInterface-variable.idf index 16368ec126c..2af86d691aa 100644 --- a/testfiles/_ExternalInterface-variable.idf +++ b/testfiles/_ExternalInterface-variable.idf @@ -605,7 +605,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -639,7 +639,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -687,7 +687,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_FanCoilHybridVentAFN.idf b/testfiles/_FanCoilHybridVentAFN.idf index 1e5e6ce327b..af1c8b02b53 100644 --- a/testfiles/_FanCoilHybridVentAFN.idf +++ b/testfiles/_FanCoilHybridVentAFN.idf @@ -1736,7 +1736,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1758,7 +1758,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1780,7 +1780,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_FollowSysNodeTemp.idf b/testfiles/_FollowSysNodeTemp.idf index eec0eb51144..c2a18642dc2 100644 --- a/testfiles/_FollowSysNodeTemp.idf +++ b/testfiles/_FollowSysNodeTemp.idf @@ -534,7 +534,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -568,7 +568,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -616,7 +616,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_HybridVentilationControlGlobalAN.idf b/testfiles/_HybridVentilationControlGlobalAN.idf index 9040a39802a..c2f78b0b0bb 100644 --- a/testfiles/_HybridVentilationControlGlobalAN.idf +++ b/testfiles/_HybridVentilationControlGlobalAN.idf @@ -1592,7 +1592,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1614,7 +1614,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1636,7 +1636,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_HybridVentilationControl_MinTime.idf b/testfiles/_HybridVentilationControl_MinTime.idf index 9eb157ea57b..f58b329a4a6 100644 --- a/testfiles/_HybridVentilationControl_MinTime.idf +++ b/testfiles/_HybridVentilationControl_MinTime.idf @@ -1598,7 +1598,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1620,7 +1620,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1642,7 +1642,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_MultiSpeedACElecFurnace.idf b/testfiles/_MultiSpeedACElecFurnace.idf index 6859f82b08d..693cb50a813 100644 --- a/testfiles/_MultiSpeedACElecFurnace.idf +++ b/testfiles/_MultiSpeedACElecFurnace.idf @@ -518,7 +518,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -552,7 +552,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -600,7 +600,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_PurchAirWindowBlind2.idf b/testfiles/_PurchAirWindowBlind2.idf index 7614abcd97f..1041558e029 100644 --- a/testfiles/_PurchAirWindowBlind2.idf +++ b/testfiles/_PurchAirWindowBlind2.idf @@ -577,7 +577,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -611,7 +611,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -659,7 +659,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_PurchAirWindowBlind3.idf b/testfiles/_PurchAirWindowBlind3.idf index 8f32dec0209..f6b784e440c 100644 --- a/testfiles/_PurchAirWindowBlind3.idf +++ b/testfiles/_PurchAirWindowBlind3.idf @@ -577,7 +577,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -611,7 +611,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -659,7 +659,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_PurchAirWindowBlind4.idf b/testfiles/_PurchAirWindowBlind4.idf index 553d439d2c2..615572ef733 100644 --- a/testfiles/_PurchAirWindowBlind4.idf +++ b/testfiles/_PurchAirWindowBlind4.idf @@ -577,7 +577,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -611,7 +611,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -659,7 +659,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/_VAVSingleDuctConstFlowBoiler_otherfuel.idf b/testfiles/_VAVSingleDuctConstFlowBoiler_otherfuel.idf index 1df889f3e4b..705408862e3 100644 --- a/testfiles/_VAVSingleDuctConstFlowBoiler_otherfuel.idf +++ b/testfiles/_VAVSingleDuctConstFlowBoiler_otherfuel.idf @@ -1067,7 +1067,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1089,7 +1089,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1111,7 +1111,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/gasAbsorptionChillerHeater.idf b/testfiles/gasAbsorptionChillerHeater.idf index ac25bf3953e..f7951ce9497 100644 --- a/testfiles/gasAbsorptionChillerHeater.idf +++ b/testfiles/gasAbsorptionChillerHeater.idf @@ -488,7 +488,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -522,7 +522,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -570,7 +570,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method From 62a319cba375817d338dc7ff5dc01d78eb15e6de Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Tue, 26 Sep 2023 15:40:17 -0500 Subject: [PATCH 06/26] Delete scratch files --- .../HeatBalanceAirManager.cc | 4769 ------- .../HeatBalanceManager.cc | 10278 ---------------- .../SimulationManager.cc | 2770 ----- .../ZoneTempPredictorCorrector.cc | 7506 ----------- src/EnergyPlus/MixedAir.cc.bak | 5578 --------- src/EnergyPlus/MixedAir.hh.bak | 600 - .../ZoneTempPredictorCorrector.cc.bak | 7500 ----------- 7 files changed, 39001 deletions(-) delete mode 100644 src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceAirManager.cc delete mode 100644 src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceManager.cc delete mode 100644 src/EnergyPlus/ForceSpaceHeatBalance/SimulationManager.cc delete mode 100644 src/EnergyPlus/ForceSpaceHeatBalance/ZoneTempPredictorCorrector.cc delete mode 100644 src/EnergyPlus/MixedAir.cc.bak delete mode 100644 src/EnergyPlus/MixedAir.hh.bak delete mode 100644 src/EnergyPlus/ZoneTempPredictorCorrector.cc.bak diff --git a/src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceAirManager.cc b/src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceAirManager.cc deleted file mode 100644 index 25c517b5314..00000000000 --- a/src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceAirManager.cc +++ /dev/null @@ -1,4769 +0,0 @@ -// EnergyPlus, Copyright (c) 1996-2022, The Board of Trustees of the University of Illinois, -// The Regents of the University of California, through Lawrence Berkeley National Laboratory -// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge -// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other -// contributors. All rights reserved. -// -// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the -// U.S. Government consequently retains certain rights. As such, the U.S. Government has been -// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, -// worldwide license in the Software to reproduce, distribute copies to the public, prepare -// derivative works, and perform publicly and display publicly, and to permit others to do so. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted -// provided that the following conditions are met: -// -// (1) Redistributions of source code must retain the above copyright notice, this list of -// conditions and the following disclaimer. -// -// (2) Redistributions in binary form must reproduce the above copyright notice, this list of -// conditions and the following disclaimer in the documentation and/or other materials -// provided with the distribution. -// -// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, -// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be -// used to endorse or promote products derived from this software without specific prior -// written permission. -// -// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form -// without changes from the version obtained under this License, or (ii) Licensee makes a -// reference solely to the software portion of its product, Licensee must refer to the -// software as "EnergyPlus version X" software, where "X" is the version number Licensee -// obtained under this License and may not use a different name for the software. Except as -// specifically required in this Section (4), Licensee shall not use in a company name, a -// product name, in advertising, publicity, or other promotional activities any name, trade -// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly -// similar designation, without the U.S. Department of Energy's prior written consent. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -// C++ Headers -#include - -// ObjexxFCL Headers -#include -#include -#include -#include - -// EnergyPlus Headers -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace EnergyPlus::HeatBalanceAirManager { -// Module containing the air heat balance simulation routines -// calculation (initialization) routines - -// MODULE INFORMATION: -// AUTHOR Richard J. Liesen -// DATE WRITTEN February 1998 -// MODIFIED May-July 2000 Joe Huang for Comis Link -// RE-ENGINEERED na - -// PURPOSE OF THIS MODULE: -// To encapsulate the data and algorithms required to -// manage the air simluation heat balance on the building. - -// METHODOLOGY EMPLOYED: - -// REFERENCES: -// The heat balance method is outlined in the "Tarp Alogorithms Manual" -// The methods are also summarized in many BSO Theses and papers. - -// OTHER NOTES: -// This module was created from IBLAST subroutines - -// USE STATEMENTS: -using namespace DataEnvironment; -using namespace DataHeatBalance; -using namespace DataSurfaces; - -// Use statements for access to subroutines in other modules -using Psychrometrics::PsyCpAirFnW; -using Psychrometrics::PsyHFnTdbW; -using Psychrometrics::PsyRhoAirFnPbTdbW; -using Psychrometrics::PsyTdbFnHW; - -enum class AirflowSpec -{ - Invalid = -1, - Flow, - FlowPerZone, - FlowPerArea, - FlowPerPerson, - AirChanges, - Num -}; -constexpr std::array(AirflowSpec::Num)> airflowNamesUC = { - "FLOW", "FLOW/ZONE", "FLOW/AREA", "FLOW/PERSON", "AIRCHANGES/HOUR"}; - -enum class AirflowSpecAlt -{ - Invalid = -1, - Flow, - FlowPerZone, - FlowPerArea, - FlowPerExteriorArea, - FlowPerExteriorWallArea, - AirChanges, - Num -}; -constexpr std::array(AirflowSpecAlt::Num)> airflowAltNamesUC = { - "FLOW", "FLOW/ZONE", "FLOW/AREA", "FLOW/EXTERIORAREA", "FLOW/EXTERIORWALLAREA", "AIRCHANGES/HOUR"}; - -constexpr std::array(VentilationType::Num)> ventilationTypeNamesUC = {"NATURAL", "INTAKE", "EXHAUST", "BALANCED"}; - -constexpr std::array(DataRoomAirModel::RoomAirModel::Num)> roomAirModelNamesUC = { - "USERDEFINED", - "MIXING", - "ONENODEDISPLACEMENTVENTILATION", - "THREENODEDISPLACEMENTVENTILATION", - "CROSSVENTILATION", - "UNDERFLOORAIRDISTRIBUTIONINTERIOR", - "UNDERFLOORAIRDISTRIBUTIONEXTERIOR", - "AIRFLOWNETWORK"}; - -constexpr std::array(DataRoomAirModel::CouplingScheme::Num)> couplingSchemeNamesUC = {"DIRECT", "INDIRECT"}; - -void ManageAirHeatBalance(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Richard Liesen - // DATE WRITTEN February 1998 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine manages the heat air balance method of calculating - // building thermal loads. It is called from the HeatBalanceManager - // at the time step level. This driver manages the calls to all of - // the other drivers and simulation algorithms. - - // Obtains and Allocates heat balance related parameters from input file - if (state.dataHeatBalAirMgr->ManageAirHeatBalanceGetInputFlag) { - GetAirHeatBalanceInput(state); - state.dataHeatBalAirMgr->ManageAirHeatBalanceGetInputFlag = false; - } - - InitAirHeatBalance(state); // Initialize all heat balance related parameters - - // Solve the zone heat balance 'Detailed' solution - // Call the air surface heat balances - CalcHeatBalanceAir(state); - - ReportZoneMeanAirTemp(state); -} - -void GetAirHeatBalanceInput(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Richard Liesen - // DATE WRITTEN February 1998 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine is the main routine to call other input routines - - // METHODOLOGY EMPLOYED: - // Uses the status flags to trigger events. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - bool ErrorsFound(false); - - GetAirFlowFlag(state, ErrorsFound); - - SetZoneMassConservationFlag(state); - - // get input parameters for modeling of room air flow - GetRoomAirModelParameters(state, ErrorsFound); - - if (ErrorsFound) { - ShowFatalError(state, "GetAirHeatBalanceInput: Errors found in getting Air inputs"); - } -} - -void GetAirFlowFlag(EnergyPlusData &state, bool &ErrorsFound) // Set to true if errors found -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Garrett Westmacott - // DATE WRITTEN February 2000 - // MODIFIED Oct 2003, FCW: Change "Infiltration-Air Change Rate" from Sum to State - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine calls the routine to get simple air flow input data. - - // METHODOLOGY EMPLOYED: - // Modelled after 'Modual Example' in Guide for Module Developers - - // Using/Aliasing - using ScheduleManager::GetScheduleIndex; - - state.dataHeatBal->AirFlowFlag = true; // UseSimpleAirFlow; - - GetSimpleAirModelInputs(state, ErrorsFound); - if (state.dataHeatBal->TotInfiltration + state.dataHeatBal->TotVentilation + state.dataHeatBal->TotMixing + state.dataHeatBal->TotCrossMixing + - state.dataHeatBal->TotRefDoorMixing > - 0) { - static constexpr std::string_view Format_720("! , Simple\n AirFlow Model, {}\n"); - print(state.files.eio, Format_720, "Simple"); - } -} - -void SetZoneMassConservationFlag(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION : - // AUTHOR Bereket Nigusse, FSEC - // DATE WRITTEN February 2014 - // MODIFIED - - // PURPOSE OF THIS SUBROUTINE : - // This subroutine sets the zone mass conservation flag to true. - - if (state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance && - state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment != DataHeatBalance::AdjustmentType::NoAdjustReturnAndMixing) { - for (int Loop = 1; Loop <= state.dataHeatBal->TotMixing; ++Loop) { - state.dataHeatBalFanSys->ZoneMassBalanceFlag(state.dataHeatBal->Mixing(Loop).ZonePtr) = true; - state.dataHeatBalFanSys->ZoneMassBalanceFlag(state.dataHeatBal->Mixing(Loop).FromZone) = true; - } - } -} - -void GetSimpleAirModelInputs(EnergyPlusData &state, bool &ErrorsFound) // IF errors found in input -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN July 2000 - // MODIFIED Oct 2003,FCW: change "Infiltration-Air Change Rate" from Sum to State - // MODIFIED Jan 2008,LG: Allow multiple infiltration and ventilation objects per zone - // May 2009, BG: added calls to setup for possible EMS override - // August 2011, TKS: added refrigeration door mixing - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine gets the input for the "simple" air flow model. - - // Using/Aliasing - using General::CheckCreatedZoneItemName; - using ScheduleManager::CheckScheduleValueMinMax; - using ScheduleManager::GetScheduleIndex; - using ScheduleManager::GetScheduleMinValue; - using ScheduleManager::GetScheduleName; - using ScheduleManager::GetScheduleValuesForDay; - using SystemAvailabilityManager::GetHybridVentilationControlStatus; - - // SUBROUTINE PARAMETER DEFINITIONS: - Real64 constexpr VentilTempLimit(100.0); // degrees Celsius - Real64 constexpr MixingTempLimit(100.0); // degrees Celsius - Real64 constexpr VentilWSLimit(40.0); // m/s - static constexpr std::string_view RoutineName("GetSimpleAirModelInputs: "); // include trailing blank space - // Refrigeration Door Mixing Protection types, factors used to moderate mixing flow. - Real64 constexpr RefDoorNone(0.0); - Real64 constexpr RefDoorAirCurtain(0.5); - Real64 constexpr RefDoorStripCurtain(0.9); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int NumAlpha; // Number of Alphas for each GetobjectItem call - int NumNumber; // Number of Numbers for each GetobjectItem call - int maxAlpha; // max of Alphas for allocation - int maxNumber; // max of Numbers for allocation - int NumArgs; - int IOStat; - Array1D_string cAlphaFieldNames; - Array1D_string cNumericFieldNames; - Array1D_bool lNumericFieldBlanks; - Array1D_bool lAlphaFieldBlanks; - Array1D_string cAlphaArgs; - Array1D rNumericArgs; - std::string cCurrentModuleObject; - - Array1D_bool RepVarSet; - bool IsNotOK; - - std::string StringOut; - std::string NameThisObject; - bool ControlFlag; - Array1D TotInfilVentFlow; - Array1D TotMixingFlow; - Array1D ZoneMixingNum; - int ConnectTest; - int ConnectionNumber; - int NumbNum; - int AlphaNum; - int Zone1Num; - int Zone2Num; - int ZoneNumA; - int ZoneNumB; - - // Formats - static constexpr std::string_view Format_720(" {} Airflow Stats Nominal, {},{},{},{:.2R},{:.1R},"); - static constexpr std::string_view Format_721( - "! <{} Airflow Stats Nominal>,Name,Schedule Name,Zone Name, Zone Floor Area {{m2}}, # Zone Occupants,{}\n"); - static constexpr std::string_view Format_722(" {}, {}\n"); - - RepVarSet.dimension(state.dataGlobal->NumOfZones, true); - - // Following used for reporting - state.dataHeatBal->ZnAirRpt.allocate(state.dataGlobal->NumOfZones); - //if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { - state.dataHeatBal->spaceAirRpt.allocate(state.dataGlobal->NumOfZones); - //} - - for (int Loop = 1; Loop <= state.dataGlobal->NumOfZones; ++Loop) { - std::string_view name = state.dataHeatBal->Zone(Loop).Name; - auto &thisZnAirRpt = state.dataHeatBal->ZnAirRpt(Loop); - thisZnAirRpt.setUpOutputVars(state, DataStringGlobals::zonePrefix, name); - //if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { - for (int spaceNum : state.dataHeatBal->Zone(Loop).spaceIndexes) { - state.dataHeatBal->spaceAirRpt(spaceNum).setUpOutputVars( - state, DataStringGlobals::spacePrefix, state.dataHeatBal->space(spaceNum).Name); - } - //} - - // CurrentModuleObject='Zone' - if (state.dataGlobal->DisplayAdvancedReportVariables) { - SetupOutputVariable(state, - "Zone Phase Change Material Melting Enthalpy", - OutputProcessor::Unit::J_kg, - thisZnAirRpt.SumEnthalpyM, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - name); - SetupOutputVariable(state, - "Zone Phase Change Material Freezing Enthalpy", - OutputProcessor::Unit::J_kg, - thisZnAirRpt.SumEnthalpyH, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - name); - } - - SetupOutputVariable(state, - "Zone Exfiltration Heat Transfer Rate", - OutputProcessor::Unit::W, - thisZnAirRpt.ExfilTotalLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - name); - SetupOutputVariable(state, - "Zone Exfiltration Sensible Heat Transfer Rate", - OutputProcessor::Unit::W, - thisZnAirRpt.ExfilSensiLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - name); - SetupOutputVariable(state, - "Zone Exfiltration Latent Heat Transfer Rate", - OutputProcessor::Unit::W, - thisZnAirRpt.ExfilLatentLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - name); - SetupOutputVariable(state, - "Zone Exhaust Air Heat Transfer Rate", - OutputProcessor::Unit::W, - thisZnAirRpt.ExhTotalLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - name); - SetupOutputVariable(state, - "Zone Exhaust Air Sensible Heat Transfer Rate", - OutputProcessor::Unit::W, - thisZnAirRpt.ExhSensiLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - name); - SetupOutputVariable(state, - "Zone Exhaust Air Latent Heat Transfer Rate", - OutputProcessor::Unit::W, - thisZnAirRpt.ExhLatentLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - name); - } - - SetupOutputVariable(state, - "Site Total Zone Exfiltration Heat Loss", - OutputProcessor::Unit::J, - state.dataHeatBal->ZoneTotalExfiltrationHeatLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - "Environment"); - SetupOutputVariable(state, - "Site Total Zone Exhaust Air Heat Loss", - OutputProcessor::Unit::J, - state.dataHeatBal->ZoneTotalExhaustHeatLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - "Environment"); - - cCurrentModuleObject = "ZoneAirBalance:OutdoorAir"; - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); - maxAlpha = NumAlpha; - maxNumber = NumNumber; - cCurrentModuleObject = "ZoneInfiltration:EffectiveLeakageArea"; - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); - maxAlpha = max(NumAlpha, maxAlpha); - maxNumber = max(NumNumber, maxNumber); - cCurrentModuleObject = "ZoneInfiltration:FlowCoefficient"; - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); - maxAlpha = max(NumAlpha, maxAlpha); - maxNumber = max(NumNumber, maxNumber); - cCurrentModuleObject = "ZoneInfiltration:DesignFlowRate"; - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); - maxAlpha = max(NumAlpha, maxAlpha); - maxNumber = max(NumNumber, maxNumber); - cCurrentModuleObject = "ZoneVentilation:DesignFlowRate"; - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); - maxAlpha = max(NumAlpha, maxAlpha); - maxNumber = max(NumNumber, maxNumber); - cCurrentModuleObject = "ZoneVentilation:WindandStackOpenArea"; - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); - maxAlpha = max(NumAlpha, maxAlpha); - maxNumber = max(NumNumber, maxNumber); - cCurrentModuleObject = "ZoneMixing"; - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); - maxAlpha = max(NumAlpha, maxAlpha); - maxNumber = max(NumNumber, maxNumber); - cCurrentModuleObject = "ZoneCrossMixing"; - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); - maxAlpha = max(NumAlpha, maxAlpha); - maxNumber = max(NumNumber, maxNumber); - cCurrentModuleObject = "ZoneRefrigerationDoorMixing"; - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumber); - maxAlpha = max(NumAlpha, maxAlpha); - maxNumber = max(NumNumber, maxNumber); - - cAlphaArgs.allocate(maxAlpha); - cAlphaFieldNames.allocate(maxAlpha); - cNumericFieldNames.allocate(maxNumber); - rNumericArgs.dimension(maxNumber, 0.0); - lAlphaFieldBlanks.dimension(maxAlpha, true); - lNumericFieldBlanks.dimension(maxNumber, true); - - cCurrentModuleObject = "ZoneAirBalance:OutdoorAir"; - state.dataHeatBal->TotZoneAirBalance = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - state.dataHeatBal->ZoneAirBalance.allocate(state.dataHeatBal->TotZoneAirBalance); - - for (int Loop = 1; Loop <= state.dataHeatBal->TotZoneAirBalance; ++Loop) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Loop, - cAlphaArgs, - NumAlpha, - rNumericArgs, - NumNumber, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - IsNotOK = false; - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - state.dataHeatBal->ZoneAirBalance(Loop).Name = cAlphaArgs(1); - state.dataHeatBal->ZoneAirBalance(Loop).ZoneName = cAlphaArgs(2); - state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr = UtilityRoutines::FindItemInList(cAlphaArgs(2), state.dataHeatBal->Zone); - if (state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr == 0) { - ShowSevereError(state, - format(R"({}{}="{}", invalid (not found) {}="{}".)", - RoutineName, - cCurrentModuleObject, - cAlphaArgs(1), - cAlphaFieldNames(2), - cAlphaArgs(2))); - ErrorsFound = true; - } else { - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).zoneOABalanceIndex = Loop; - } - GlobalNames::IntraObjUniquenessCheck( - state, cAlphaArgs(2), cCurrentModuleObject, cAlphaFieldNames(2), state.dataHeatBalAirMgr->UniqueZoneNames, IsNotOK); - if (IsNotOK) { - ShowSevereError(state, - format(R"({}{}="{}", a duplicated object {}="{}" is found.)", - RoutineName, - cCurrentModuleObject, - cAlphaArgs(1), - cAlphaFieldNames(2), - cAlphaArgs(2))); - ShowContinueError(state, "A zone can only have one " + cCurrentModuleObject + " object."); - ErrorsFound = true; - } - - { - state.dataHeatBal->ZoneAirBalance(Loop).BalanceMethod = static_cast( - getEnumerationValue(DataHeatBalance::AirBalanceTypeNamesUC, - UtilityRoutines::MakeUPPERCase(cAlphaArgs(3)))); // Air balance method type character input-->convert to enum - if (state.dataHeatBal->ZoneAirBalance(Loop).BalanceMethod == AirBalance::Invalid) { - state.dataHeatBal->ZoneAirBalance(Loop).BalanceMethod = AirBalance::None; - ShowWarningError(state, - format("{}{} = {} not valid choice for {}={}", - RoutineName, - cAlphaFieldNames(3), - cAlphaArgs(3), - cCurrentModuleObject, - cAlphaArgs(1))); - ShowContinueError(state, "The default choice \"NONE\" is assigned"); - } - } - - state.dataHeatBal->ZoneAirBalance(Loop).InducedAirRate = rNumericArgs(1); - if (rNumericArgs(1) < 0.0) { - ShowSevereError(state, - format("{}{}=\"{}\", invalid Induced Outdoor Air Due to Duct Leakage Unbalance specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - cAlphaArgs(1), - rNumericArgs(1))); - ErrorsFound = true; - } - - state.dataHeatBal->ZoneAirBalance(Loop).InducedAirSchedPtr = GetScheduleIndex(state, cAlphaArgs(4)); - if (state.dataHeatBal->ZoneAirBalance(Loop).InducedAirSchedPtr == 0) { - if (lAlphaFieldBlanks(4)) { - ShowSevereError( - state, - format("{}{}=\"{}\",{} is required but field is blank.", RoutineName, cCurrentModuleObject, cAlphaArgs(1), cAlphaFieldNames(4))); - } else { - ShowSevereError(state, - format(R"({}{}="{}", invalid (not found) {}="{}".)", - RoutineName, - cCurrentModuleObject, - cAlphaArgs(1), - cAlphaFieldNames(4), - cAlphaArgs(4))); - } - ErrorsFound = true; - } - if (!CheckScheduleValueMinMax(state, state.dataHeatBal->ZoneAirBalance(Loop).InducedAirSchedPtr, ">=", 0.0, "<=", 1.0)) { - ShowSevereError(state, - format("{} = {}: Error found in {} = {}", - cCurrentModuleObject, - state.dataHeatBal->ZoneAirBalance(Loop).Name, - cAlphaFieldNames(4), - cAlphaArgs(4))); - ShowContinueError(state, "Schedule values must be (>=0., <=1.)"); - ErrorsFound = true; - } - - // Check whether this zone is also controleld by hybrid ventilation object with ventilation control option or not - ControlFlag = GetHybridVentilationControlStatus(state, state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr); - if (ControlFlag && state.dataHeatBal->ZoneAirBalance(Loop).BalanceMethod == AirBalance::Quadrature) { - state.dataHeatBal->ZoneAirBalance(Loop).BalanceMethod = AirBalance::None; - ShowWarningError( - state, - format("{} = {}: This Zone ({}) is controlled by AvailabilityManager:HybridVentilation with Simple Airflow Control Type option.", - cCurrentModuleObject, - state.dataHeatBal->ZoneAirBalance(Loop).Name, - cAlphaArgs(2))); - ShowContinueError(state, - "Air balance method type QUADRATURE and Simple Airflow Control Type cannot co-exist. The NONE method is assigned"); - } - - if (state.dataHeatBal->ZoneAirBalance(Loop).BalanceMethod == AirBalance::Quadrature) { - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).zoneOAQuadratureSum = true; - SetupOutputVariable(state, - "Zone Combined Outdoor Air Sensible Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceHeatLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Combined Outdoor Air Sensible Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceHeatGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Combined Outdoor Air Latent Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceLatentLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Combined Outdoor Air Latent Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceLatentGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Combined Outdoor Air Total Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceTotalLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Combined Outdoor Air Total Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceTotalGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Combined Outdoor Air Current Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceVdotCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Combined Outdoor Air Standard Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceVdotStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Combined Outdoor Air Current Density Volume", - OutputProcessor::Unit::m3, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceVolumeCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Combined Outdoor Air Standard Density Volume", - OutputProcessor::Unit::m3, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceVolumeStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Combined Outdoor Air Mass", - OutputProcessor::Unit::kg, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceMass, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Combined Outdoor Air Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceMdot, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Combined Outdoor Air Changes per Hour", - OutputProcessor::Unit::ach, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceAirChangeRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Combined Outdoor Air Fan Electricity Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).OABalanceFanElec, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name, - _, - "Electricity", - "Fans", - "Ventilation (simple)", - "Building", - state.dataHeatBal->Zone(state.dataHeatBal->ZoneAirBalance(Loop).ZonePtr).Name); - } - } - - // Set up and process ZoneInfiltration:* inputs - - cCurrentModuleObject = "ZoneInfiltration:DesignFlowRate"; - int numDesignFlowInfiltrationObjects = 0; - int totDesignFlowInfiltration = 0; // Total ZoneInfiltration:DesignFlowRate instances after expansion to spaces - EPVector infiltrationDesignFlowRateObjects; - InternalHeatGains::setupIHGZonesAndSpaces( - state, cCurrentModuleObject, infiltrationDesignFlowRateObjects, numDesignFlowInfiltrationObjects, totDesignFlowInfiltration, ErrorsFound); - - cCurrentModuleObject = "ZoneInfiltration:EffectiveLeakageArea"; - int numLeakageAreaInfiltrationObjects = 0; - int totLeakageAreaInfiltration = 0; // Total ZoneInfiltration:EffectiveLeakageArea instances after expansion to spaces - EPVector infiltrationLeakageAreaObjects; - bool const zoneListNotAllowed = true; - InternalHeatGains::setupIHGZonesAndSpaces(state, - cCurrentModuleObject, - infiltrationLeakageAreaObjects, - numLeakageAreaInfiltrationObjects, - totLeakageAreaInfiltration, - ErrorsFound, - zoneListNotAllowed); - - cCurrentModuleObject = "ZoneInfiltration:FlowCoefficient"; - int numFlowCoefficientInfiltrationObjects = 0; - int totFlowCoefficientInfiltration = 0; // Total ZoneInfiltration:FlowCoefficient instances after expansion to spaces - EPVector infiltrationFlowCoefficientObjects; - InternalHeatGains::setupIHGZonesAndSpaces(state, - cCurrentModuleObject, - infiltrationFlowCoefficientObjects, - numFlowCoefficientInfiltrationObjects, - totFlowCoefficientInfiltration, - ErrorsFound, - zoneListNotAllowed); - - state.dataHeatBal->TotInfiltration = totDesignFlowInfiltration + totLeakageAreaInfiltration + totFlowCoefficientInfiltration; - state.dataHeatBal->Infiltration.allocate(state.dataHeatBal->TotInfiltration); - state.dataHeatBalAirMgr->UniqueInfiltrationNames.reserve(static_cast(state.dataHeatBal->TotInfiltration)); - - int infiltrationNum = 0; - if (totDesignFlowInfiltration > 0) { - cCurrentModuleObject = "ZoneInfiltration:DesignFlowRate"; - for (int infilInputNum = 1; infilInputNum <= numDesignFlowInfiltrationObjects; ++infilInputNum) { - - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - infilInputNum, - cAlphaArgs, - NumAlpha, - rNumericArgs, - NumNumber, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - - // Create one Infiltration instance for every space associated with this input object - auto &thisInfiltrationInput = infiltrationDesignFlowRateObjects(infilInputNum); - for (int Item1 = 1; Item1 <= thisInfiltrationInput.numOfSpaces; ++Item1) { - ++infiltrationNum; - auto &thisInfiltration = state.dataHeatBal->Infiltration(infiltrationNum); - thisInfiltration.Name = thisInfiltrationInput.names(Item1); - thisInfiltration.spaceIndex = thisInfiltrationInput.spaceNums(Item1); - auto &thisSpace = state.dataHeatBal->space(thisInfiltration.spaceIndex); - thisInfiltration.ZonePtr = thisSpace.zoneNum; - auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); - - thisInfiltration.ModelType = DataHeatBalance::InfiltrationModelType::DesignFlowRate; - if (lAlphaFieldBlanks(3)) { - thisInfiltration.SchedPtr = DataGlobalConstants::ScheduleAlwaysOn; - } else { - thisInfiltration.SchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); - if (thisInfiltration.SchedPtr == 0) { - if (Item1 == 1) { // avoid repeated error messages from the same input object - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + - cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); - ErrorsFound = true; - } - } - } - - // Set space flow fractions - // Infiltration equipment design level calculation method. - AirflowSpecAlt flow = - static_cast(getEnumerationValue(airflowAltNamesUC, cAlphaArgs(4))); // NOLINT(modernize-use-auto) - switch (flow) { - case AirflowSpecAlt::Flow: - case AirflowSpecAlt::FlowPerZone: - if (lNumericFieldBlanks(1)) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Infiltration will result.", - RoutineName, - cCurrentModuleObject, - thisInfiltration.Name, - cAlphaFieldNames(4), - cNumericFieldNames(1))); - } else { - Real64 spaceFrac = 1.0; - if (!thisInfiltrationInput.spaceListActive && (thisInfiltrationInput.numOfSpaces > 1)) { - Real64 const zoneVolume = thisZone.Volume; - if (zoneVolume > 0.0) { - spaceFrac = thisSpace.Volume / zoneVolume; - } else { - ShowSevereError(state, std::string(RoutineName) + "Zone volume is zero when allocating Infiltration to Spaces."); - ShowContinueError( - state, - format("Occurs for {}=\"{}\" in Zone=\"{}\".", cCurrentModuleObject, thisInfiltrationInput.Name, thisZone.Name)); - ErrorsFound = true; - } - } - - thisInfiltration.DesignLevel = rNumericArgs(1) * spaceFrac; - } - break; - - case AirflowSpecAlt::FlowPerArea: - if (thisInfiltration.ZonePtr != 0) { - if (rNumericArgs(2) >= 0.0) { - thisInfiltration.DesignLevel = rNumericArgs(2) * thisSpace.floorArea; - if (thisInfiltration.ZonePtr > 0) { - if (thisSpace.floorArea <= 0.0) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but Space Floor Area = 0. 0 Infiltration will result.", - RoutineName, - cCurrentModuleObject, - thisInfiltration.Name, - cAlphaFieldNames(4), - cNumericFieldNames(2))); - } - } - } else { - ShowSevereError(state, - format("{}{}=\"{}\", invalid flow/area specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - thisInfiltration.Name, - rNumericArgs(2))); - ErrorsFound = true; - } - } - if (lNumericFieldBlanks(2)) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Infiltration will result.", - RoutineName, - cCurrentModuleObject, - thisInfiltration.Name, - cAlphaFieldNames(4), - cNumericFieldNames(2))); - } - break; - - case AirflowSpecAlt::FlowPerExteriorArea: - if (thisInfiltration.ZonePtr != 0) { - if (rNumericArgs(3) >= 0.0) { - thisInfiltration.DesignLevel = rNumericArgs(3) * thisSpace.ExteriorTotalSurfArea; - if (thisSpace.ExteriorTotalSurfArea <= 0.0) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but Exterior Surface Area = 0. 0 Infiltration will result.", - RoutineName, - cCurrentModuleObject, - thisInfiltration.Name, - cAlphaFieldNames(4), - cNumericFieldNames(3))); - } - } else { - ShowSevereError(state, - format("{}{} = \"{}\", invalid flow/exteriorarea specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - thisInfiltration.Name, - rNumericArgs(3))); - ErrorsFound = true; - } - } - if (lNumericFieldBlanks(3)) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Infiltration will result.", - RoutineName, - cCurrentModuleObject, - thisInfiltration.Name, - cAlphaFieldNames(4), - cNumericFieldNames(3))); - } - break; - - case AirflowSpecAlt::FlowPerExteriorWallArea: - if (thisInfiltration.ZonePtr != 0) { - if (rNumericArgs(3) >= 0.0) { - thisInfiltration.DesignLevel = rNumericArgs(3) * thisSpace.ExtGrossWallArea; - if (thisSpace.ExtGrossWallArea <= 0.0) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but Exterior Wall Area = 0. 0 Infiltration will result.", - RoutineName, - cCurrentModuleObject, - thisInfiltration.Name, - cAlphaFieldNames(4), - cNumericFieldNames(3))); - } - } else { - ShowSevereError(state, - format("{}{} = \"{}\", invalid flow/exteriorwallarea specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - thisInfiltration.Name, - rNumericArgs(3))); - ErrorsFound = true; - } - } - if (lNumericFieldBlanks(3)) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Infiltration will result.", - RoutineName, - cCurrentModuleObject, - thisInfiltration.Name, - cAlphaFieldNames(4), - cNumericFieldNames(3))); - } - break; - - case AirflowSpecAlt::AirChanges: - if (thisInfiltration.spaceIndex != 0) { - if (rNumericArgs(4) >= 0.0) { - thisInfiltration.DesignLevel = rNumericArgs(4) * thisSpace.Volume / DataGlobalConstants::SecInHour; - if (thisSpace.Volume <= 0.0) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but Space Volume = 0. 0 Infiltration will result.", - RoutineName, - cCurrentModuleObject, - thisInfiltration.Name, - cAlphaFieldNames(4), - cNumericFieldNames(4))); - } - } else { - ShowSevereError(state, - format("{}In {} = \"{}\", invalid ACH (air changes per hour) specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - thisInfiltration.Name, - rNumericArgs(4))); - ErrorsFound = true; - } - } - if (lNumericFieldBlanks(4)) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Infiltration will result.", - RoutineName, - cCurrentModuleObject, - thisInfiltrationInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(4))); - } - break; - - default: - if (Item1 == 1) { - ShowSevereError( - state, - format("{}{}=\"{}\", invalid calculation method={}", RoutineName, cCurrentModuleObject, cAlphaArgs(1), cAlphaArgs(4))); - ErrorsFound = true; - } - } - - thisInfiltration.ConstantTermCoef = !lNumericFieldBlanks(5) ? rNumericArgs(5) : 1.0; - thisInfiltration.TemperatureTermCoef = !lNumericFieldBlanks(6) ? rNumericArgs(6) : 0.0; - thisInfiltration.VelocityTermCoef = !lNumericFieldBlanks(7) ? rNumericArgs(7) : 0.0; - thisInfiltration.VelocitySQTermCoef = !lNumericFieldBlanks(8) ? rNumericArgs(8) : 0.0; - - if (thisInfiltration.ConstantTermCoef == 0.0 && thisInfiltration.TemperatureTermCoef == 0.0 && - thisInfiltration.VelocityTermCoef == 0.0 && thisInfiltration.VelocitySQTermCoef == 0.0) { - if (Item1 == 1) { - ShowWarningError( - state, - format( - R"({}{}="{}", in {}="{}".)", RoutineName, cCurrentModuleObject, cAlphaArgs(1), cAlphaFieldNames(2), cAlphaArgs(2))); - ShowContinueError(state, "Infiltration Coefficients are all zero. No Infiltration will be reported."); - } - } - } - } - } - - if (totLeakageAreaInfiltration > 0) { - cCurrentModuleObject = "ZoneInfiltration:EffectiveLeakageArea"; - for (int infilInputNum = 1; infilInputNum <= numLeakageAreaInfiltrationObjects; ++infilInputNum) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - infilInputNum, - cAlphaArgs, - NumAlpha, - rNumericArgs, - NumNumber, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - // Create one Infiltration instance for every space associated with this input object - auto &thisInfiltrationInput = infiltrationLeakageAreaObjects(infilInputNum); - for (int Item1 = 1; Item1 <= thisInfiltrationInput.numOfSpaces; ++Item1) { - ++infiltrationNum; - auto &thisInfiltration = state.dataHeatBal->Infiltration(infiltrationNum); - thisInfiltration.Name = thisInfiltrationInput.names(Item1); - thisInfiltration.spaceIndex = thisInfiltrationInput.spaceNums(Item1); - auto &thisSpace = state.dataHeatBal->space(thisInfiltration.spaceIndex); - thisInfiltration.ZonePtr = thisSpace.zoneNum; - auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); - - thisInfiltration.ModelType = DataHeatBalance::InfiltrationModelType::ShermanGrimsrud; - - if (lAlphaFieldBlanks(3)) { - thisInfiltration.SchedPtr = DataGlobalConstants::ScheduleAlwaysOn; - } else { - thisInfiltration.SchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); - if (thisInfiltration.SchedPtr == 0) { - ShowSevereError(state, - format(R"({}{}="{}", invalid (not found) {}="{}".)", - RoutineName, - cCurrentModuleObject, - cAlphaArgs(1), - cAlphaFieldNames(3), - cAlphaArgs(3))); - ErrorsFound = true; - } - } - thisInfiltration.BasicStackCoefficient = rNumericArgs(2); - thisInfiltration.BasicWindCoefficient = rNumericArgs(3); - - if (lNumericFieldBlanks(1)) { - ShowWarningError(state, - format("{}{}=\"{}\", field {} is blank. 0 Infiltration will result.", - RoutineName, - cCurrentModuleObject, - thisInfiltrationInput.Name, - cNumericFieldNames(1))); - } else { - Real64 spaceFrac = 1.0; - if (!thisInfiltrationInput.spaceListActive && (thisInfiltrationInput.numOfSpaces > 1)) { - Real64 const zoneExteriorTotalSurfArea = thisZone.ExteriorTotalSurfArea; - if (zoneExteriorTotalSurfArea > 0.0) { - spaceFrac = thisSpace.ExteriorTotalSurfArea / zoneExteriorTotalSurfArea; - } else { - ShowSevereError(state, - std::string(RoutineName) + "Zone exterior surface area is zero when allocating Infiltration to Spaces."); - ShowContinueError( - state, - format("Occurs for {}=\"{}\" in Zone=\"{}\".", cCurrentModuleObject, thisInfiltrationInput.Name, thisZone.Name)); - ErrorsFound = true; - } - } - - thisInfiltration.LeakageArea = rNumericArgs(1) * spaceFrac; - } - // check if space has exterior surfaces - if (thisInfiltration.spaceIndex > 0) { - if (thisSpace.ExteriorTotalSurfArea <= 0.0) { - ShowWarningError(state, - format(R"({}{}="{}", Space="{}" does not have surfaces exposed to outdoors.)", - RoutineName, - cCurrentModuleObject, - thisInfiltrationInput.Name, - thisSpace.Name)); - ShowContinueError(state, "Infiltration model is appropriate for exterior spaces not interior spaces, simulation continues."); - } - } - } - } - } - - if (totFlowCoefficientInfiltration > 0) { - cCurrentModuleObject = "ZoneInfiltration:FlowCoefficient"; - for (int infilInputNum = 1; infilInputNum <= numFlowCoefficientInfiltrationObjects; ++infilInputNum) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - infilInputNum, - cAlphaArgs, - NumAlpha, - rNumericArgs, - NumNumber, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - // Create one Infiltration instance for every space associated with this input object - auto &thisInfiltrationInput = infiltrationFlowCoefficientObjects(infilInputNum); - for (int Item1 = 1; Item1 <= thisInfiltrationInput.numOfSpaces; ++Item1) { - ++infiltrationNum; - auto &thisInfiltration = state.dataHeatBal->Infiltration(infiltrationNum); - thisInfiltration.Name = thisInfiltrationInput.names(Item1); - thisInfiltration.spaceIndex = thisInfiltrationInput.spaceNums(Item1); - auto &thisSpace = state.dataHeatBal->space(thisInfiltration.spaceIndex); - thisInfiltration.ZonePtr = thisSpace.zoneNum; - auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); - - thisInfiltration.ModelType = DataHeatBalance::InfiltrationModelType::AIM2; - - if (lAlphaFieldBlanks(3)) { - thisInfiltration.SchedPtr = DataGlobalConstants::ScheduleAlwaysOn; - } else { - thisInfiltration.SchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); - if (thisInfiltration.SchedPtr == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + - cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); - ErrorsFound = true; - } - } - thisInfiltration.AIM2StackCoefficient = rNumericArgs(2); - thisInfiltration.PressureExponent = rNumericArgs(3); - thisInfiltration.AIM2WindCoefficient = rNumericArgs(4); - thisInfiltration.ShelterFactor = rNumericArgs(5); - - if (lNumericFieldBlanks(1)) { - ShowWarningError(state, - format("{}{}=\"{}\", field {} is blank. 0 Infiltration will result.", - RoutineName, - cCurrentModuleObject, - thisInfiltrationInput.Name, - cNumericFieldNames(1))); - } else { - Real64 spaceFrac = 1.0; - if (!thisInfiltrationInput.spaceListActive && (thisInfiltrationInput.numOfSpaces > 1)) { - Real64 const zoneExteriorTotalSurfArea = thisZone.ExteriorTotalSurfArea; - if (zoneExteriorTotalSurfArea > 0.0) { - spaceFrac = thisSpace.ExteriorTotalSurfArea / zoneExteriorTotalSurfArea; - } else { - ShowSevereError(state, - std::string(RoutineName) + "Zone exterior surface area is zero when allocating Infiltration to Spaces."); - ShowContinueError( - state, - format("Occurs for {}=\"{}\" in Zone=\"{}\".", cCurrentModuleObject, thisInfiltrationInput.Name, thisZone.Name)); - ErrorsFound = true; - } - } - - thisInfiltration.FlowCoefficient = rNumericArgs(1) * spaceFrac; - // check if space has exterior surfaces - if (thisInfiltration.spaceIndex > 0) { - if (thisSpace.ExteriorTotalSurfArea <= 0.0) { - ShowWarningError(state, - format(R"({}{}="{}", Space="{}" does not have surfaces exposed to outdoors.)", - RoutineName, - cCurrentModuleObject, - thisInfiltrationInput.Name, - thisSpace.Name)); - ShowContinueError(state, - "Infiltration model is appropriate for exterior spaces not interior spaces, simulation continues."); - } - } - } - } - } - } - - // setup zone-level infiltration reports - for (int Loop = 1; Loop <= state.dataHeatBal->TotInfiltration; ++Loop) { - if (state.dataHeatBal->Infiltration(Loop).ZonePtr > 0 && - !state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).zoneOAQuadratureSum) { - // Object report variables - SetupOutputVariable(state, - "Infiltration Sensible Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->Infiltration(Loop).InfilHeatLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Infiltration(Loop).Name); - SetupOutputVariable(state, - "Infiltration Sensible Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->Infiltration(Loop).InfilHeatGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Infiltration(Loop).Name); - SetupOutputVariable(state, - "Infiltration Latent Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->Infiltration(Loop).InfilLatentLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Infiltration(Loop).Name); - SetupOutputVariable(state, - "Infiltration Latent Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->Infiltration(Loop).InfilLatentGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Infiltration(Loop).Name); - SetupOutputVariable(state, - "Infiltration Total Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->Infiltration(Loop).InfilTotalLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Infiltration(Loop).Name); - SetupOutputVariable(state, - "Infiltration Total Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->Infiltration(Loop).InfilTotalGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Infiltration(Loop).Name); - SetupOutputVariable(state, - "Infiltration Current Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->Infiltration(Loop).InfilVdotCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Infiltration(Loop).Name); - SetupOutputVariable(state, - "Infiltration Standard Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->Infiltration(Loop).InfilVdotStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Infiltration(Loop).Name); - SetupOutputVariable(state, - "Infiltration Current Density Volume", - OutputProcessor::Unit::m3, - state.dataHeatBal->Infiltration(Loop).InfilVolumeCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Infiltration(Loop).Name); - SetupOutputVariable(state, - "Infiltration Standard Density Volume", - OutputProcessor::Unit::m3, - state.dataHeatBal->Infiltration(Loop).InfilVolumeStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Infiltration(Loop).Name); - SetupOutputVariable(state, - "Infiltration Mass", - OutputProcessor::Unit::kg, - state.dataHeatBal->Infiltration(Loop).InfilMass, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Infiltration(Loop).Name); - SetupOutputVariable(state, - "Infiltration Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->Infiltration(Loop).InfilMdot, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Infiltration(Loop).Name); - SetupOutputVariable(state, - "Infiltration Air Change Rate", - OutputProcessor::Unit::ach, - state.dataHeatBal->Infiltration(Loop).InfilAirChangeRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Infiltration(Loop).Name); - - if (RepVarSet(state.dataHeatBal->Infiltration(Loop).ZonePtr)) { - RepVarSet(state.dataHeatBal->Infiltration(Loop).ZonePtr) = false; - SetupOutputVariable(state, - "Zone Infiltration Sensible Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilHeatLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Infiltration Sensible Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilHeatGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Infiltration Latent Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilLatentLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Infiltration Latent Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilLatentGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Infiltration Total Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilTotalLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Infiltration Total Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilTotalGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Infiltration Current Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilVdotCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Infiltration Standard Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilVdotStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Infiltration Current Density Volume", - OutputProcessor::Unit::m3, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilVolumeCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Infiltration Standard Density Volume", - OutputProcessor::Unit::m3, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilVolumeStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Infiltration Mass", - OutputProcessor::Unit::kg, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilMass, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Infiltration Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilMdot, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); - SetupOutputVariable(state, - "Zone Infiltration Air Change Rate", - OutputProcessor::Unit::ach, - state.dataHeatBal->ZnAirRpt(state.dataHeatBal->Infiltration(Loop).ZonePtr).InfilAirChangeRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(state.dataHeatBal->Infiltration(Loop).ZonePtr).Name); - } - } - - if (state.dataGlobal->AnyEnergyManagementSystemInModel) { - SetupEMSActuator(state, - "Zone Infiltration", - state.dataHeatBal->Infiltration(Loop).Name, - "Air Exchange Flow Rate", - "[m3/s]", - state.dataHeatBal->Infiltration(Loop).EMSOverrideOn, - state.dataHeatBal->Infiltration(Loop).EMSAirFlowRateValue); - } - } - - // Set up and process ZoneVentilation:* inputs - - RepVarSet = true; - - cCurrentModuleObject = "ZoneVentilation:DesignFlowRate"; - int numDesignFlowVentilationObjects = 0; - int totDesignFlowVentilation = 0; // Total ZoneVentilation:DesignFlowRate instances after expansion to spaces - EPVector ventilationDesignFlowRateObjects; - InternalHeatGains::setupIHGZonesAndSpaces( - state, cCurrentModuleObject, ventilationDesignFlowRateObjects, numDesignFlowVentilationObjects, totDesignFlowVentilation, ErrorsFound); - - cCurrentModuleObject = "ZoneVentilation:WindandStackOpenArea"; - int numWindStackVentilationObjects = 0; - int totWindStackVentilation = 0; // Total ZoneVentilation:WindandStackOpenArea instances after expansion to spaces - EPVector ventilationWindStackObjects; - InternalHeatGains::setupIHGZonesAndSpaces(state, - cCurrentModuleObject, - ventilationWindStackObjects, - numWindStackVentilationObjects, - totWindStackVentilation, - ErrorsFound, - zoneListNotAllowed); - - state.dataHeatBal->TotVentilation = totDesignFlowVentilation + totWindStackVentilation; - state.dataHeatBal->Ventilation.allocate(state.dataHeatBal->TotVentilation); - - int ventilationNum = 0; - if (numDesignFlowVentilationObjects > 0) { - cCurrentModuleObject = "ZoneVentilation:DesignFlowRate"; - for (int ventInputNum = 1; ventInputNum <= numDesignFlowVentilationObjects; ++ventInputNum) { - - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - ventInputNum, - cAlphaArgs, - NumAlpha, - rNumericArgs, - NumNumber, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - - auto &thisVentilationInput = ventilationDesignFlowRateObjects(ventInputNum); - for (int Item1 = 1; Item1 <= thisVentilationInput.numOfSpaces; ++Item1) { - ++ventilationNum; - auto &thisVentilation = state.dataHeatBal->Ventilation(ventilationNum); - thisVentilation.Name = thisVentilationInput.names(Item1); - thisVentilation.spaceIndex = thisVentilationInput.spaceNums(Item1); - auto &thisSpace = state.dataHeatBal->space(thisVentilation.spaceIndex); - thisVentilation.ZonePtr = thisSpace.zoneNum; - auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); - - thisVentilation.ModelType = DataHeatBalance::VentilationModelType::DesignFlowRate; - if (lAlphaFieldBlanks(3)) { - thisVentilation.SchedPtr = DataGlobalConstants::ScheduleAlwaysOn; - } else { - thisVentilation.SchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); - if (thisVentilation.SchedPtr == 0) { - if (Item1 == 1) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + - cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); - } - ErrorsFound = true; - } - } - - // Ventilation equipment design level calculation method - AirflowSpec flow = static_cast(getEnumerationValue(airflowNamesUC, cAlphaArgs(4))); // NOLINT(modernize-use-auto) - switch (flow) { - case AirflowSpec::Flow: - case AirflowSpec::FlowPerZone: - thisVentilation.DesignLevel = rNumericArgs(1); - if (lNumericFieldBlanks(1)) { - ShowWarningError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + - cAlphaFieldNames(4) + " specifies " + cNumericFieldNames(1) + - ", but that field is blank. 0 Ventilation will result."); - } - break; - - case AirflowSpec::FlowPerArea: - if (thisVentilation.spaceIndex != 0) { - if (rNumericArgs(2) >= 0.0) { - thisVentilation.DesignLevel = rNumericArgs(2) * thisSpace.floorArea; - if (thisSpace.floorArea <= 0.0) { - ShowWarningError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + - cAlphaFieldNames(4) + " specifies " + cNumericFieldNames(2) + - ", but Space Floor Area = 0. 0 Ventilation will result."); - } - } else { - ShowSevereError(state, - format("{}{}=\"{}\", invalid flow/area specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - thisVentilation.Name, - rNumericArgs(2))); - ErrorsFound = true; - } - } - if (lNumericFieldBlanks(2)) { - ShowWarningError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + - cAlphaFieldNames(4) + " specifies " + cNumericFieldNames(2) + - ", but that field is blank. 0 Ventilation will result."); - } - break; - - case AirflowSpec::FlowPerPerson: - if (thisVentilation.spaceIndex != 0) { - if (rNumericArgs(3) >= 0.0) { - thisVentilation.DesignLevel = rNumericArgs(3) * thisSpace.totOccupants; - if (thisSpace.totOccupants <= 0.0) { - ShowWarningError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + - cAlphaFieldNames(4) + " specifies " + cNumericFieldNames(3) + - ", but Zone Total Occupants = 0. 0 Ventilation will result."); - } - } else { - ShowSevereError(state, - format("{}{}=\"{}\", invalid flow/person specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - thisVentilation.Name, - rNumericArgs(3))); - ErrorsFound = true; - } - } - if (lNumericFieldBlanks(3)) { - ShowWarningError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + - cAlphaFieldNames(4) + "specifies " + cNumericFieldNames(3) + - ", but that field is blank. 0 Ventilation will result."); - } - break; - - case AirflowSpec::AirChanges: - if (thisVentilation.spaceIndex != 0) { - if (rNumericArgs(4) >= 0.0) { - thisVentilation.DesignLevel = rNumericArgs(4) * thisSpace.Volume / DataGlobalConstants::SecInHour; - if (thisSpace.Volume <= 0.0) { - ShowWarningError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + - cAlphaFieldNames(4) + " specifies " + cNumericFieldNames(4) + - ", but Space Volume = 0. 0 Ventilation will result."); - } - } else { - ShowSevereError(state, - format("{}{}=\"{}\", invalid ACH (air changes per hour) specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - thisVentilation.Name, - rNumericArgs(5))); - ErrorsFound = true; - } - } - if (lNumericFieldBlanks(4)) { - ShowWarningError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + - cAlphaFieldNames(4) + " specifies " + cNumericFieldNames(4) + - ", but that field is blank. 0 Ventilation will result."); - } - break; - - default: - if (Item1 == 1) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + - "\", invalid calculation method=" + cAlphaArgs(4)); - ErrorsFound = true; - } - } - - if (cAlphaArgs(5).empty()) { - thisVentilation.FanType = DataHeatBalance::VentilationType::Natural; - } else { - thisVentilation.FanType = static_cast(getEnumerationValue(ventilationTypeNamesUC, cAlphaArgs(5))); - if (thisVentilation.FanType == VentilationType::Invalid) { - ShowSevereError(state, - format(R"({}{}="{}". invalid {}="{}".)", - RoutineName, - cCurrentModuleObject, - thisVentilation.Name, - cAlphaFieldNames(5), - cAlphaArgs(5))); - ErrorsFound = true; - } - } - - thisVentilation.FanPressure = rNumericArgs(5); - if (thisVentilation.FanPressure < 0.0) { - if (Item1 == 1) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\", " + - cNumericFieldNames(5) + " must be >=0"); - ErrorsFound = true; - } - } - - thisVentilation.FanEfficiency = rNumericArgs(6); - if ((thisVentilation.FanEfficiency <= 0.0) || (thisVentilation.FanEfficiency > 1.0)) { - if (Item1 == 1) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisVentilation.Name + "\"," + - cNumericFieldNames(6) + " must be in range >0 and <= 1"); - ErrorsFound = true; - } - } - - // Override any user input for cases where natural ventilation is being used - if (thisVentilation.FanType == DataHeatBalance::VentilationType::Natural) { - thisVentilation.FanPressure = 0.0; - thisVentilation.FanEfficiency = 1.0; - } - - thisVentilation.ConstantTermCoef = !lNumericFieldBlanks(7) ? rNumericArgs(7) : 1.0; - thisVentilation.TemperatureTermCoef = !lNumericFieldBlanks(8) ? rNumericArgs(8) : 0.0; - thisVentilation.VelocityTermCoef = !lNumericFieldBlanks(9) ? rNumericArgs(9) : 0.0; - thisVentilation.VelocitySQTermCoef = !lNumericFieldBlanks(10) ? rNumericArgs(10) : 0.0; - - if (thisVentilation.ConstantTermCoef == 0.0 && thisVentilation.TemperatureTermCoef == 0.0 && - thisVentilation.VelocityTermCoef == 0.0 && thisVentilation.VelocitySQTermCoef == 0.0) { - if (Item1 == 1) { - ShowWarningError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", in " + cAlphaFieldNames(2) + - "=\"" + cAlphaArgs(2) + "\"."); - ShowContinueError(state, "Ventilation Coefficients are all zero. No Ventilation will be reported."); - } - } - - if (!lNumericFieldBlanks(11)) { - thisVentilation.MinIndoorTemperature = rNumericArgs(11); - } else { - thisVentilation.MinIndoorTemperature = -VentilTempLimit; - } - // Ventilation(Loop)%MinIndoorTemperature = rNumericArgs(11) - if ((thisVentilation.MinIndoorTemperature < -VentilTempLimit) || (thisVentilation.MinIndoorTemperature > VentilTempLimit)) { - if (Item1 == 1) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" must have " + - cNumericFieldNames(11) + " between -100C and 100C."); - ShowContinueError(state, format("...value entered=[{:.2R}].", rNumericArgs(11))); - ErrorsFound = true; - } - } - - thisVentilation.MinIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(6)); - if (thisVentilation.MinIndoorTempSchedPtr > 0) { - if (Item1 == 1) { - if (!lNumericFieldBlanks(11)) - ShowWarningError(state, - std::string{RoutineName} + - "The Minimum Indoor Temperature value and schedule are provided. The scheduled temperature will " - "be used in the " + - cCurrentModuleObject + " object = " + cAlphaArgs(1)); - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisVentilation.MinIndoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + - " must have a minimum indoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(6)); - ErrorsFound = true; - } - } - } - if (thisVentilation.MinIndoorTempSchedPtr == 0 && lNumericFieldBlanks(11) && (!lAlphaFieldBlanks(6))) { - if (Item1 == 1) { - ShowWarningError( - state, - format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", - RoutineName, - cNumericFieldNames(11), - -VentilTempLimit)); - ShowContinueError(state, - "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - } - // Check Minimum indoor temperature value and schedule fields - if (!lNumericFieldBlanks(11) && (!cAlphaArgs(6).empty() && thisVentilation.MinIndoorTempSchedPtr == 0)) { - if (Item1 == 1) { - ShowWarningError(state, - format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", - RoutineName, - cAlphaFieldNames(6), - cAlphaArgs(6), - rNumericArgs(11))); - ShowContinueError(state, - "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - } - - thisVentilation.MaxIndoorTemperature = !lNumericFieldBlanks(12) ? rNumericArgs(12) : VentilTempLimit; - if ((thisVentilation.MaxIndoorTemperature < -VentilTempLimit) || (thisVentilation.MaxIndoorTemperature > VentilTempLimit)) { - if (Item1 == 1) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + - " must have a maximum indoor temperature between -100C and 100C"); - ErrorsFound = true; - } - } - - thisVentilation.MaxIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(7)); - if (thisVentilation.MaxIndoorTempSchedPtr > 0) { - if (Item1 == 1) { - if (!lNumericFieldBlanks(12)) - ShowWarningError(state, - std::string{RoutineName} + - "The Maximum Indoor Temperature value and schedule are provided. The scheduled temperature will " - "be used in the " + - cCurrentModuleObject + " object = " + cAlphaArgs(1)); - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisVentilation.MaxIndoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { - ShowSevereError( - state, - cCurrentModuleObject + " = " + cAlphaArgs(1) + - " must have a maximum indoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(7)); - ErrorsFound = true; - } - } - } - if (thisVentilation.MaxIndoorTempSchedPtr == 0 && lNumericFieldBlanks(12) && (!lAlphaFieldBlanks(7))) { - if (Item1 == 1) { - ShowWarningError( - state, - format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", - RoutineName, - cNumericFieldNames(12), - VentilTempLimit)); - ShowContinueError(state, - "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - } - // Check Maximum indoor temperature value and schedule fields - if (!lNumericFieldBlanks(12) && ((!lAlphaFieldBlanks(7)) && thisVentilation.MaxIndoorTempSchedPtr == 0)) { - if (Item1 == 1) { - ShowWarningError(state, - format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", - RoutineName, - cAlphaFieldNames(7), - cAlphaArgs(7), - rNumericArgs(12))); - ShowContinueError(state, - "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - } - - thisVentilation.DelTemperature = !lNumericFieldBlanks(13) ? rNumericArgs(13) : -VentilTempLimit; - // Ventilation(Loop)%DelTemperature = rNumericArgs(13) ! 3/12/03 Negative del temp now allowed COP - - thisVentilation.DeltaTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(8)); - if (thisVentilation.DeltaTempSchedPtr > 0) { - if (Item1 == 1) { - if (!lNumericFieldBlanks(13)) - ShowWarningError( - state, - std::string{RoutineName} + - "The Delta Temperature value and schedule are provided. The scheduled temperature will be used in the " + - cCurrentModuleObject + " object = " + cAlphaArgs(1)); - // Check min value in the schedule to ensure both values are within the range - if (GetScheduleMinValue(state, thisVentilation.DeltaTempSchedPtr) < -VentilTempLimit) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + - " must have a delta temperature equal to or above -100C defined in the schedule = " + cAlphaArgs(8)); - ErrorsFound = true; - } - } - } - if (thisVentilation.DeltaTempSchedPtr == 0 && lNumericFieldBlanks(13) && (!lAlphaFieldBlanks(8))) { - if (Item1 == 1) { - ShowWarningError( - state, - format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", - RoutineName, - cNumericFieldNames(13), - VentilTempLimit)); - ShowContinueError(state, - "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - } - - if (!lNumericFieldBlanks(13) && ((!lAlphaFieldBlanks(8)) && thisVentilation.DeltaTempSchedPtr == 0)) { - if (Item1 == 1) { - ShowWarningError(state, - format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", - RoutineName, - cAlphaFieldNames(8), - cAlphaArgs(8), - rNumericArgs(13))); - ShowContinueError(state, - "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - } - - thisVentilation.MinOutdoorTemperature = !lNumericFieldBlanks(14) ? rNumericArgs(14) : -VentilTempLimit; - if ((thisVentilation.MinOutdoorTemperature < -VentilTempLimit) || (thisVentilation.MinOutdoorTemperature > VentilTempLimit)) { - if (Item1 == 1) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + " must have " + - cNumericFieldNames(14) + " between -100C and 100C"); - ErrorsFound = true; - } - } - - thisVentilation.MinOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(9)); - if (Item1 == 1) { - if (thisVentilation.MinOutdoorTempSchedPtr > 0) { - if (!lNumericFieldBlanks(14)) - ShowWarningError(state, - std::string{RoutineName} + - "The Minimum Outdoor Temperature value and schedule are provided. The scheduled temperature will be " - "used in the " + - cCurrentModuleObject + " object = " + cAlphaArgs(1)); - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisVentilation.MinOutdoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + - " must have a minimum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(9)); - ErrorsFound = true; - } - } - if (thisVentilation.MinOutdoorTempSchedPtr == 0 && lNumericFieldBlanks(14) && (!lAlphaFieldBlanks(9))) { - ShowWarningError(state, - format("{}Minimum Outdoor Temperature: the value field is blank and schedule field is invalid. The " - "default value will be used ({:.1R}) ", - RoutineName, - -VentilTempLimit)); - ShowContinueError(state, - "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - // Check Minimum outdoor temperature value and schedule fields - if (!lNumericFieldBlanks(14) && ((!lAlphaFieldBlanks(9)) && thisVentilation.MinOutdoorTempSchedPtr == 0)) { - ShowWarningError(state, - format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", - RoutineName, - cAlphaFieldNames(9), - cAlphaArgs(9), - rNumericArgs(14))); - ShowContinueError(state, - "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - } - - thisVentilation.MaxOutdoorTemperature = !lNumericFieldBlanks(15) ? rNumericArgs(15) : VentilTempLimit; - if (Item1 == 1) { - if ((thisVentilation.MaxOutdoorTemperature < -VentilTempLimit) || (thisVentilation.MaxOutdoorTemperature > VentilTempLimit)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + " must have a " + - cNumericFieldNames(15) + " between -100C and 100C"); - ErrorsFound = true; - } - } - - thisVentilation.MaxOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(10)); - if (Item1 == 1) { - if (thisVentilation.MaxOutdoorTempSchedPtr > 0) { - if (!lNumericFieldBlanks(15)) - ShowWarningError(state, - std::string{RoutineName} + - "The Maximum Outdoor Temperature value and schedule are provided. The scheduled temperature will be " - "used in the " + - cCurrentModuleObject + " object = " + cAlphaArgs(1)); - if (!CheckScheduleValueMinMax(state, thisVentilation.MaxOutdoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + - " must have a maximum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(10)); - ErrorsFound = true; - } - } - if (thisVentilation.MaxOutdoorTempSchedPtr == 0 && lNumericFieldBlanks(15) && (!lAlphaFieldBlanks(10))) { - ShowWarningError( - state, - format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", - RoutineName, - cNumericFieldNames(15), - VentilTempLimit)); - ShowContinueError(state, - "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - // Check Maximum outdoor temperature value and schedule fields - if (!lNumericFieldBlanks(15) && ((!lAlphaFieldBlanks(10)) && thisVentilation.MaxOutdoorTempSchedPtr == 0)) { - ShowWarningError(state, - format("{}{} = {}is invalid. The constant value will be used at {:.1R} degrees C ", - RoutineName, - cAlphaFieldNames(10), - cAlphaArgs(10), - rNumericArgs(15))); - ShowContinueError(state, - "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - } - - thisVentilation.MaxWindSpeed = !lNumericFieldBlanks(16) ? rNumericArgs(16) : VentilWSLimit; - if (Item1 == 1) { - if ((thisVentilation.MaxWindSpeed < -VentilWSLimit) || (thisVentilation.MaxWindSpeed > VentilWSLimit)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + - " must have a maximum wind speed between -40 m/s and 40 m/s"); - ErrorsFound = true; - } - } - - // Report variables should be added for individual VENTILATION objects, in addition to zone totals below - - if (thisVentilation.ZonePtr > 0) { - if (RepVarSet(thisVentilation.ZonePtr) && !thisZone.zoneOAQuadratureSum) { - RepVarSet(thisVentilation.ZonePtr) = false; - SetupOutputVariable(state, - "Zone Ventilation Sensible Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilHeatLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Sensible Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilHeatGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Latent Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilLatentLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Latent Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilLatentGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Total Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilTotalLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Total Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilTotalGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Current Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVdotCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Standard Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVdotStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Current Density Volume", - OutputProcessor::Unit::m3, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVolumeCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Standard Density Volume", - OutputProcessor::Unit::m3, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVolumeStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Mass", - OutputProcessor::Unit::kg, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilMass, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilMdot, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Air Change Rate", - OutputProcessor::Unit::ach, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilAirChangeRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Fan Electricity Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilFanElec, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name, - _, - "Electricity", - "Fans", - "Ventilation (simple)", - "Building", - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Air Inlet Temperature", - OutputProcessor::Unit::C, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilAirTemp, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - } - } - - if (state.dataGlobal->AnyEnergyManagementSystemInModel) { - SetupEMSActuator(state, - "Zone Ventilation", - thisVentilation.Name, - "Air Exchange Flow Rate", - "[m3/s]", - thisVentilation.EMSSimpleVentOn, - thisVentilation.EMSimpleVentFlowRate); - } - } - } - } - - if (numWindStackVentilationObjects > 0) { - cCurrentModuleObject = "ZoneVentilation:WindandStackOpenArea"; - for (int ventInputNum = 1; ventInputNum <= numWindStackVentilationObjects; ++ventInputNum) { - - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - ventInputNum, - cAlphaArgs, - NumAlpha, - rNumericArgs, - NumNumber, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - - auto &thisVentilationInput = ventilationWindStackObjects(ventInputNum); - for (int Item1 = 1; Item1 <= thisVentilationInput.numOfSpaces; ++Item1) { - ++ventilationNum; - auto &thisVentilation = state.dataHeatBal->Ventilation(ventilationNum); - thisVentilation.Name = thisVentilationInput.names(Item1); - thisVentilation.spaceIndex = thisVentilationInput.spaceNums(Item1); - auto &thisSpace = state.dataHeatBal->space(thisVentilation.spaceIndex); - thisVentilation.ZonePtr = thisSpace.zoneNum; - auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); - - thisVentilation.ModelType = DataHeatBalance::VentilationModelType::WindAndStack; - - thisVentilation.OpenArea = rNumericArgs(1); - if (thisVentilation.OpenArea < 0.0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cNumericFieldNames(1) + - " must be positive."); - ErrorsFound = true; - } - - if (lAlphaFieldBlanks(3)) { - thisVentilation.OpenAreaSchedPtr = DataGlobalConstants::ScheduleAlwaysOn; - } else { - thisVentilation.OpenAreaSchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); - if (thisVentilation.OpenAreaSchedPtr == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + - cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); - ErrorsFound = true; - } - } - - thisVentilation.OpenEff = rNumericArgs(2); - if (thisVentilation.OpenEff != DataGlobalConstants::AutoCalculate && - (thisVentilation.OpenEff < 0.0 || thisVentilation.OpenEff > 1.0)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cNumericFieldNames(2) + - " must be between 0 and 1."); - ErrorsFound = true; - } - - thisVentilation.EffAngle = rNumericArgs(3); - if (thisVentilation.EffAngle < 0.0 || thisVentilation.EffAngle >= 360.0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cNumericFieldNames(3) + - " must be between 0 and 360."); - ErrorsFound = true; - } - - thisVentilation.DH = rNumericArgs(4); - if (thisVentilation.DH < 0.0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cNumericFieldNames(4) + - " must be positive."); - ErrorsFound = true; - } - - thisVentilation.DiscCoef = rNumericArgs(5); - if (thisVentilation.DiscCoef != DataGlobalConstants::AutoCalculate && - (thisVentilation.DiscCoef < 0.0 || thisVentilation.DiscCoef > 1.0)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cNumericFieldNames(5) + - " must be between 0 and 1."); - ErrorsFound = true; - } - - if (!lNumericFieldBlanks(6)) { - thisVentilation.MinIndoorTemperature = rNumericArgs(6); - } else { - thisVentilation.MinIndoorTemperature = -VentilTempLimit; - } - if ((thisVentilation.MinIndoorTemperature < -VentilTempLimit) || (thisVentilation.MinIndoorTemperature > VentilTempLimit)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + " must have " + - cNumericFieldNames(6) + " between -100C and 100C"); - ErrorsFound = true; - } - - thisVentilation.MinIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(4)); - if (thisVentilation.MinIndoorTempSchedPtr > 0) { - if (!lNumericFieldBlanks(6)) - ShowWarningError( - state, - std::string{RoutineName} + - "The Minimum Indoor Temperature value and schedule are provided. The scheduled temperature will be used in the " + - cCurrentModuleObject + " object = " + cAlphaArgs(1)); - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisVentilation.MinIndoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + - " must have a minimum indoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(4)); - ErrorsFound = true; - } - } - if (thisVentilation.MinIndoorTempSchedPtr == 0 && lNumericFieldBlanks(6) && (!lAlphaFieldBlanks(4))) { - ShowWarningError(state, - format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", - RoutineName, - cNumericFieldNames(6), - -VentilTempLimit)); - ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - // Check Minimum indoor temperature value and schedule fields - if (!lNumericFieldBlanks(6) && (!cAlphaArgs(4).empty() && thisVentilation.MinIndoorTempSchedPtr == 0)) { - ShowWarningError(state, - format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", - RoutineName, - cAlphaFieldNames(4), - cAlphaArgs(4), - rNumericArgs(11))); - ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - - if (!lNumericFieldBlanks(7)) { - thisVentilation.MaxIndoorTemperature = rNumericArgs(7); - } else { - thisVentilation.MaxIndoorTemperature = VentilTempLimit; - } - if ((thisVentilation.MaxIndoorTemperature < -VentilTempLimit) || (thisVentilation.MaxIndoorTemperature > VentilTempLimit)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + - "\" must have a maximum indoor temperature between -100C and 100C"); - ErrorsFound = true; - } - - thisVentilation.MaxIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(5)); - if (thisVentilation.MaxIndoorTempSchedPtr > 0) { - if (!lNumericFieldBlanks(7)) - ShowWarningError( - state, - std::string{RoutineName} + - "The Maximum Indoor Temperature value and schedule are provided. The scheduled temperature will be used in the " + - cCurrentModuleObject + " object = " + cAlphaArgs(1)); - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisVentilation.MaxIndoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { - ShowSevereError( - state, - cCurrentModuleObject + " = " + cAlphaArgs(1) + - " must have a maximum indoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(5)); - ErrorsFound = true; - } - } - if (thisVentilation.MaxIndoorTempSchedPtr == 0 && lNumericFieldBlanks(7) && (!lAlphaFieldBlanks(5))) { - ShowWarningError(state, - format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", - RoutineName, - cNumericFieldNames(7), - VentilTempLimit)); - ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - // Check Maximum indoor temperature value and schedule fields - if (!lNumericFieldBlanks(7) && ((!lAlphaFieldBlanks(5)) && thisVentilation.MaxIndoorTempSchedPtr == 0)) { - ShowWarningError(state, - format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", - RoutineName, - cAlphaFieldNames(7), - cAlphaArgs(5), - rNumericArgs(7))); - ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - - if (!lNumericFieldBlanks(8)) { - thisVentilation.DelTemperature = rNumericArgs(8); - } else { - thisVentilation.DelTemperature = -VentilTempLimit; - } - - thisVentilation.DeltaTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(6)); - if (thisVentilation.DeltaTempSchedPtr > 0) { - if (!lNumericFieldBlanks(8)) - ShowWarningError(state, - std::string{RoutineName} + - "The Delta Temperature value and schedule are provided. The scheduled temperature will be used in the " + - cCurrentModuleObject + " object = " + cAlphaArgs(1)); - // Check min value in the schedule to ensure both values are within the range - if (GetScheduleMinValue(state, thisVentilation.DeltaTempSchedPtr) < -VentilTempLimit) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + - " must have a delta temperature equal to or above -100C defined in the schedule = " + cAlphaArgs(8)); - ErrorsFound = true; - } - } - if (thisVentilation.DeltaTempSchedPtr == 0 && lNumericFieldBlanks(8) && (!lAlphaFieldBlanks(6))) { - ShowWarningError(state, - format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", - RoutineName, - cNumericFieldNames(8), - VentilTempLimit)); - ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - if (!lNumericFieldBlanks(8) && ((!lAlphaFieldBlanks(6)) && thisVentilation.DeltaTempSchedPtr == 0)) { - ShowWarningError(state, - format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", - RoutineName, - cAlphaFieldNames(6), - cAlphaArgs(6), - rNumericArgs(8))); - ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - - thisVentilation.MinOutdoorTemperature = !lNumericFieldBlanks(9) ? rNumericArgs(9) : -VentilTempLimit; - if ((thisVentilation.MinOutdoorTemperature < -VentilTempLimit) || (thisVentilation.MinOutdoorTemperature > VentilTempLimit)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + " must have " + - cNumericFieldNames(9) + " between -100C and 100C"); - ErrorsFound = true; - } - - thisVentilation.MinOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(7)); - if (thisVentilation.MinOutdoorTempSchedPtr > 0) { - if (!lNumericFieldBlanks(9)) - ShowWarningError(state, - std::string{RoutineName} + - "The Minimum Outdoor Temperature value and schedule are provided. The scheduled temperature will be " - "used in the " + - cCurrentModuleObject + " object = " + cAlphaArgs(1)); - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisVentilation.MinOutdoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + - " must have a minimum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(7)); - ErrorsFound = true; - } - } - if (thisVentilation.MinOutdoorTempSchedPtr == 0 && lNumericFieldBlanks(9) && (!lAlphaFieldBlanks(7))) { - ShowWarningError( - state, - format("{}Minimum Outdoor Temperature: the value field is blank and schedule field is invalid. The default value " - "will be used ({:.1R}) ", - RoutineName, - -VentilTempLimit)); - ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - // Check Minimum outdoor temperature value and schedule fields - if (!lNumericFieldBlanks(9) && ((!lAlphaFieldBlanks(7)) && thisVentilation.MinOutdoorTempSchedPtr == 0)) { - ShowWarningError(state, - format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", - RoutineName, - cAlphaFieldNames(7), - cAlphaArgs(7), - rNumericArgs(14))); - ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - - thisVentilation.MaxOutdoorTemperature = !lNumericFieldBlanks(10) ? rNumericArgs(10) : VentilTempLimit; - if ((thisVentilation.MaxOutdoorTemperature < -VentilTempLimit) || (thisVentilation.MaxOutdoorTemperature > VentilTempLimit)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + " must have a " + - cNumericFieldNames(10) + " between -100C and 100C"); - ErrorsFound = true; - } - - thisVentilation.MaxOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(8)); - if (thisVentilation.MaxOutdoorTempSchedPtr > 0) { - if (!lNumericFieldBlanks(10)) - ShowWarningError(state, - std::string{RoutineName} + - "The Maximum Outdoor Temperature value and schedule are provided. The scheduled temperature will be " - "used in the " + - cCurrentModuleObject + " object = " + cAlphaArgs(1)); - if (!CheckScheduleValueMinMax(state, thisVentilation.MaxOutdoorTempSchedPtr, ">=", -VentilTempLimit, "<=", VentilTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + - " must have a maximum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(8)); - ErrorsFound = true; - } - } - if (thisVentilation.MaxOutdoorTempSchedPtr == 0 && lNumericFieldBlanks(10) && (!lAlphaFieldBlanks(8))) { - ShowWarningError(state, - format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", - RoutineName, - cNumericFieldNames(10), - VentilTempLimit)); - ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - // Check Maximum outdoor temperature value and schedule fields - if (!lNumericFieldBlanks(10) && ((!lAlphaFieldBlanks(8)) && thisVentilation.MaxOutdoorTempSchedPtr == 0)) { - ShowWarningError(state, - format("{}{} = {}is invalid. The constant value will be used at {:.1R} degrees C ", - RoutineName, - cAlphaFieldNames(8), - cAlphaArgs(8), - rNumericArgs(10))); - ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - - thisVentilation.MaxWindSpeed = !lNumericFieldBlanks(11) ? rNumericArgs(11) : VentilWSLimit; - if ((thisVentilation.MaxWindSpeed < -VentilWSLimit) || (thisVentilation.MaxWindSpeed > VentilWSLimit)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + - " must have a maximum wind speed between 0 m/s and 40 m/s"); - ErrorsFound = true; - } - - // Report variables should be added for individual VENTILATION objects, in addition to zone totals below - - if (thisVentilation.ZonePtr > 0) { - if (RepVarSet(thisVentilation.ZonePtr) && !thisZone.zoneOAQuadratureSum) { - RepVarSet(thisVentilation.ZonePtr) = false; - SetupOutputVariable(state, - "Zone Ventilation Sensible Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilHeatLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Sensible Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilHeatGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Latent Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilLatentLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Latent Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilLatentGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Total Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilTotalLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Total Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilTotalGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Current Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVdotCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Standard Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVdotStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Current Density Volume", - OutputProcessor::Unit::m3, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVolumeCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Standard Density Volume", - OutputProcessor::Unit::m3, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilVolumeStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Mass", - OutputProcessor::Unit::kg, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilMass, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilMdot, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Air Change Rate", - OutputProcessor::Unit::ach, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilAirChangeRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Fan Electricity Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilFanElec, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - thisZone.Name, - _, - "Electricity", - "Fans", - "Ventilation (simple)", - "Building", - thisZone.Name); - SetupOutputVariable(state, - "Zone Ventilation Air Inlet Temperature", - OutputProcessor::Unit::C, - state.dataHeatBal->ZnAirRpt(thisVentilation.ZonePtr).VentilAirTemp, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - } - } - - if (state.dataGlobal->AnyEnergyManagementSystemInModel) { - SetupEMSActuator(state, - "Zone Ventilation", - thisVentilation.Name, - "Air Exchange Flow Rate", - "[m3/s]", - thisVentilation.EMSSimpleVentOn, - thisVentilation.EMSimpleVentFlowRate); - } - } - } - } - - // Set up and process ZoneMixing and ZoneCrossMixing inputs - - RepVarSet = true; - - cCurrentModuleObject = "ZoneMixing"; - int numZoneMixingInputObjects = 0; - EPVector zoneMixingInputObjects; - InternalHeatGains::setupIHGZonesAndSpaces(state, - cCurrentModuleObject, - zoneMixingInputObjects, - numZoneMixingInputObjects, - state.dataHeatBal->TotMixing, - ErrorsFound, - zoneListNotAllowed); - - if (state.dataHeatBal->TotMixing > 0) { - cCurrentModuleObject = "ZoneMixing"; - state.dataHeatBal->Mixing.allocate(state.dataHeatBal->TotMixing); - int mixingNum = 0; - for (int mixingInputNum = 1; mixingInputNum <= numZoneMixingInputObjects; ++mixingInputNum) { - - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - mixingInputNum, - cAlphaArgs, - NumAlpha, - rNumericArgs, - NumNumber, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - - // Create one Mixing instance for every space associated with this input object - auto const &thisMixingInput = zoneMixingInputObjects(mixingInputNum); - for (int Item1 = 1; Item1 <= thisMixingInput.numOfSpaces; ++Item1) { - ++mixingNum; - auto &thisMixing = state.dataHeatBal->Mixing(mixingNum); - thisMixing.Name = thisMixingInput.names(Item1); - thisMixing.spaceIndex = thisMixingInput.spaceNums(Item1); - auto const &thisSpace = state.dataHeatBal->space(thisMixing.spaceIndex); - thisMixing.ZonePtr = thisSpace.zoneNum; - auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); - - if (lAlphaFieldBlanks(3)) { - thisMixing.SchedPtr = DataGlobalConstants::ScheduleAlwaysOn; - } else { - thisMixing.SchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); - if (thisMixing.SchedPtr == 0) { - ShowWarningError(state, - format("{}{}=\"{}\", invalid (not found) {}=\"{}\"", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(3), - cAlphaArgs(3))); - ErrorsFound = true; - } - } - - // Mixing equipment design level calculation method - AirflowSpec flow = static_cast(getEnumerationValue(airflowNamesUC, cAlphaArgs(4))); // NOLINT(modernize-use-auto) - switch (flow) { - case AirflowSpec::Flow: - case AirflowSpec::FlowPerZone: - thisMixing.DesignLevel = rNumericArgs(1); - if (lNumericFieldBlanks(1)) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(1))); - } else { - Real64 spaceFrac = 1.0; - if (!thisMixingInput.spaceListActive && (thisMixingInput.numOfSpaces > 1)) { - Real64 const zoneVolume = thisZone.Volume; - if (zoneVolume > 0.0) { - spaceFrac = thisSpace.Volume / zoneVolume; - } else { - ShowSevereError(state, std::string(RoutineName) + "Zone volume is zero when allocating Mixing to Spaces."); - ShowContinueError( - state, format("Occurs for {}=\"{}\" in Zone=\"{}\".", cCurrentModuleObject, thisMixingInput.Name, thisZone.Name)); - ErrorsFound = true; - } - } - - thisMixing.DesignLevel = rNumericArgs(1) * spaceFrac; - } - break; - - case AirflowSpec::FlowPerArea: - if (thisMixing.spaceIndex != 0) { - if (rNumericArgs(2) >= 0.0) { - thisMixing.DesignLevel = rNumericArgs(2) * thisSpace.floorArea; - if (thisMixing.spaceIndex > 0) { - if (thisZone.FloorArea <= 0.0) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but Space Floor Area = 0. 0 Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(2))); - } - } - } else { - ShowSevereError(state, - format("{}{}=\"{}\", invalid flow/area specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - rNumericArgs(2))); - ErrorsFound = true; - } - } - if (lNumericFieldBlanks(2)) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(2))); - } - break; - - case AirflowSpec::FlowPerPerson: - if (thisMixing.spaceIndex != 0) { - if (rNumericArgs(3) >= 0.0) { - thisMixing.DesignLevel = rNumericArgs(3) * thisSpace.totOccupants; - if (thisSpace.totOccupants <= 0.0) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but Space Total Occupants = 0. 0 Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(3))); - } - } else { - ShowSevereError(state, - format("{}{}=\"{}\", invalid flow/person specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - rNumericArgs(3))); - ErrorsFound = true; - } - } - if (lNumericFieldBlanks(3)) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(3))); - } - break; - - case AirflowSpec::AirChanges: - if (thisMixing.spaceIndex != 0) { - if (rNumericArgs(4) >= 0.0) { - thisMixing.DesignLevel = rNumericArgs(4) * thisSpace.Volume / DataGlobalConstants::SecInHour; - if (thisSpace.Volume <= 0.0) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but Space Volume = 0. 0 Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(4))); - } - } else { - ShowSevereError(state, - format("{}{}=\"{}\", invalid ACH (air changes per hour) specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - rNumericArgs(4))); - ErrorsFound = true; - } - } - if (lNumericFieldBlanks(4)) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(4))); - } - break; - - default: - ShowSevereError( - state, format("{}{}=\"{}\", invalid calculation method={}", RoutineName, cCurrentModuleObject, cAlphaArgs(1), cAlphaArgs(4))); - ErrorsFound = true; - } - - thisMixing.fromSpaceIndex = UtilityRoutines::FindItemInList(cAlphaArgs(5), state.dataHeatBal->space); - if (thisMixing.fromSpaceIndex == 0) { - thisMixing.FromZone = UtilityRoutines::FindItemInList(cAlphaArgs(5), state.dataHeatBal->Zone); - } else { - thisMixing.FromZone = state.dataHeatBal->space(thisMixing.fromSpaceIndex).zoneNum; - } - if ((thisMixing.FromZone == 0) && (thisMixing.fromSpaceIndex == 0)) { - ShowSevereError(state, - std::string{RoutineName} + cAlphaFieldNames(5) + " not found=" + cAlphaArgs(5) + " for " + cCurrentModuleObject + - '=' + cAlphaArgs(1)); - ErrorsFound = true; - } - thisMixing.DeltaTemperature = rNumericArgs(5); - - if (NumAlpha > 5) { - thisMixing.DeltaTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(6)); - if (thisMixing.DeltaTempSchedPtr > 0) { - if (!lNumericFieldBlanks(5)) - ShowWarningError( - state, - std::string{RoutineName} + - "The Delta Temperature value and schedule are provided. The scheduled temperature will be used in the " + - cCurrentModuleObject + " object = " + cAlphaArgs(1)); - if (GetScheduleMinValue(state, thisMixing.DeltaTempSchedPtr) < -MixingTempLimit) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + - " must have a delta temperature equal to or above -100C defined in the schedule = " + cAlphaArgs(6)); - ErrorsFound = true; - } - } - } - if (thisMixing.DeltaTempSchedPtr == 0 && lNumericFieldBlanks(5) && (!lAlphaFieldBlanks(6))) { - ShowWarningError(state, - format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", - RoutineName, - cNumericFieldNames(5), - rNumericArgs(5))); - ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - if (!lNumericFieldBlanks(5) && ((!lAlphaFieldBlanks(6)) && thisMixing.DeltaTempSchedPtr == 0)) { - ShowWarningError(state, - format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", - RoutineName, - cAlphaFieldNames(6), - cAlphaArgs(6), - rNumericArgs(5))); - ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - - if (NumAlpha > 6) { - thisMixing.MinIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(7)); - if (thisMixing.MinIndoorTempSchedPtr == 0) { - if ((!lAlphaFieldBlanks(7))) { - ShowSevereError(state, - std::string{RoutineName} + cAlphaFieldNames(7) + " not found=" + cAlphaArgs(7) + " for " + - cCurrentModuleObject + '=' + cAlphaArgs(1)); - ErrorsFound = true; - } - } - if (thisMixing.MinIndoorTempSchedPtr > 0) { - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisMixing.MinIndoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " statement = " + cAlphaArgs(1) + - " must have a minimum zone temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(7)); - ErrorsFound = true; - } - } - } - - if (NumAlpha > 7) { - thisMixing.MaxIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(8)); - if (thisMixing.MaxIndoorTempSchedPtr == 0) { - if ((!lAlphaFieldBlanks(8))) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cAlphaFieldNames(8) + - " not found=\"" + cAlphaArgs(8) + "\"."); - ErrorsFound = true; - } - } - if (thisMixing.MaxIndoorTempSchedPtr > 0) { - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisMixing.MaxIndoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + - "\" must have a maximum zone temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(8)); - ErrorsFound = true; - } - } - } - - if (NumAlpha > 8) { - thisMixing.MinSourceTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(9)); - if (thisMixing.MinSourceTempSchedPtr == 0) { - if ((!lAlphaFieldBlanks(9))) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cAlphaFieldNames(9) + - " not found=\"" + cAlphaArgs(9) + "\"."); - ErrorsFound = true; - } - } - if (thisMixing.MinSourceTempSchedPtr > 0) { - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisMixing.MinSourceTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + - "\" must have a minimum source temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(9)); - ErrorsFound = true; - } - } - } - - if (NumAlpha > 9) { - thisMixing.MaxSourceTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(10)); - if (thisMixing.MaxSourceTempSchedPtr == 0) { - if ((!lAlphaFieldBlanks(10))) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cAlphaFieldNames(10) + - " not found=\"" + cAlphaArgs(10) + "\"."); - ErrorsFound = true; - } - } - if (thisMixing.MaxSourceTempSchedPtr > 0) { - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisMixing.MaxSourceTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " statement =\"" + cAlphaArgs(1) + - "\" must have a maximum source temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(10)); - ErrorsFound = true; - } - } - } - - if (NumAlpha > 10) { - thisMixing.MinOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(11)); - if (thisMixing.MinOutdoorTempSchedPtr == 0) { - if ((!lAlphaFieldBlanks(11))) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cAlphaFieldNames(11) + - " not found=\"" + cAlphaArgs(11) + "\"."); - ErrorsFound = true; - } - } - if (thisMixing.MinOutdoorTempSchedPtr > 0) { - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisMixing.MinOutdoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " =\"" + cAlphaArgs(1) + - "\" must have a minimum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(11)); - ErrorsFound = true; - } - } - } - - if (NumAlpha > 11) { - thisMixing.MaxOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(12)); - if (thisMixing.MaxOutdoorTempSchedPtr == 0) { - if ((!lAlphaFieldBlanks(12))) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", " + cAlphaFieldNames(12) + - " not found=\"" + cAlphaArgs(12) + "\"."); - ErrorsFound = true; - } - } - if (thisMixing.MaxOutdoorTempSchedPtr > 0) { - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisMixing.MaxOutdoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " =\"" + cAlphaArgs(1) + - "\" must have a maximum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(12)); - ErrorsFound = true; - } - } - } - - if (thisMixing.ZonePtr > 0) { - if (RepVarSet(thisMixing.ZonePtr)) { - RepVarSet(thisMixing.ZonePtr) = false; - SetupOutputVariable(state, - "Zone Mixing Volume", - OutputProcessor::Unit::m3, - state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixVolume, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); - SetupOutputVariable(state, - "Zone Mixing Current Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixVdotCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); - SetupOutputVariable(state, - "Zone Mixing Standard Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixVdotStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); - SetupOutputVariable(state, - "Zone Mixing Mass", - OutputProcessor::Unit::kg, - state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixMass, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); - SetupOutputVariable(state, - "Zone Mixing Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixMdot, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); - SetupOutputVariable(state, - "Zone Mixing Sensible Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixHeatLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); - SetupOutputVariable(state, - "Zone Mixing Sensible Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixHeatGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); - SetupOutputVariable(state, - "Zone Mixing Latent Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixLatentLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); - SetupOutputVariable(state, - "Zone Mixing Latent Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixLatentGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); - SetupOutputVariable(state, - "Zone Mixing Total Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixTotalLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); - SetupOutputVariable(state, - "Zone Mixing Total Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(thisMixing.ZonePtr).MixTotalGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(thisMixing.ZonePtr).Name); - } - } - if (state.dataGlobal->AnyEnergyManagementSystemInModel) { - SetupEMSActuator(state, - "ZoneMixing", - thisMixing.Name, - "Air Exchange Flow Rate", - "[m3/s]", - thisMixing.EMSSimpleMixingOn, - thisMixing.EMSimpleMixingFlowRate); - } - } - } - } - - // allocate MassConservation - state.dataHeatBal->MassConservation.allocate(state.dataGlobal->NumOfZones); - - // added by BAN, 02/14 - if (state.dataHeatBal->TotMixing > 0) { - ZoneMixingNum.allocate(state.dataHeatBal->TotMixing); - // get source zones mixing objects index - for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - int SourceCount = 0; - for (int Loop = 1; Loop <= state.dataHeatBal->TotMixing; ++Loop) { - if (ZoneNum == state.dataHeatBal->Mixing(Loop).FromZone) { - SourceCount += 1; - ZoneMixingNum(SourceCount) = Loop; - } - } - // save mixing objects index for zones which serve as a source zone - state.dataHeatBal->MassConservation(ZoneNum).NumSourceZonesMixingObject = SourceCount; - if (SourceCount > 0) { - state.dataHeatBal->MassConservation(ZoneNum).ZoneMixingSourcesPtr.allocate(SourceCount); - for (int Loop = 1; Loop <= SourceCount; ++Loop) { - state.dataHeatBal->MassConservation(ZoneNum).ZoneMixingSourcesPtr(Loop) = ZoneMixingNum(Loop); - } - } - } - - // check zones which are used only as a source zones - for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - for (int Loop = 1; Loop <= state.dataHeatBal->TotMixing; ++Loop) { - if (ZoneNum != state.dataHeatBal->Mixing(Loop).FromZone) continue; - state.dataHeatBal->MassConservation(ZoneNum).IsOnlySourceZone = true; - for (int Loop1 = 1; Loop1 <= state.dataHeatBal->TotMixing; ++Loop1) { - if (ZoneNum == state.dataHeatBal->Mixing(Loop1).ZonePtr) { - state.dataHeatBal->MassConservation(ZoneNum).IsOnlySourceZone = false; - break; - } - } - } - } - // get receiving zones mixing objects index - ZoneMixingNum = 0; - for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - int ReceivingCount = 0; - for (int Loop = 1; Loop <= state.dataHeatBal->TotMixing; ++Loop) { - if (ZoneNum == state.dataHeatBal->Mixing(Loop).ZonePtr) { - ReceivingCount += 1; - ZoneMixingNum(ReceivingCount) = Loop; - } - } - // save mixing objects index for zones which serve as a receiving zone - state.dataHeatBal->MassConservation(ZoneNum).NumReceivingZonesMixingObject = ReceivingCount; - if (ReceivingCount > 0) { - state.dataHeatBal->MassConservation(ZoneNum).ZoneMixingReceivingPtr.allocate(ReceivingCount); - state.dataHeatBal->MassConservation(ZoneNum).ZoneMixingReceivingFr.allocate(ReceivingCount); - for (int Loop = 1; Loop <= ReceivingCount; ++Loop) { - state.dataHeatBal->MassConservation(ZoneNum).ZoneMixingReceivingPtr(Loop) = ZoneMixingNum(Loop); - } - } - // flag zones used as both source and receiving zone - if (state.dataHeatBal->MassConservation(ZoneNum).NumSourceZonesMixingObject > 0 && - state.dataHeatBal->MassConservation(ZoneNum).NumReceivingZonesMixingObject > 0) { - state.dataHeatBal->MassConservation(ZoneNum).IsSourceAndReceivingZone = true; - } - } - if (allocated(ZoneMixingNum)) ZoneMixingNum.deallocate(); - } - - // zone mass conservation calculation order starts with receiving zones - // and then proceeds to source zones - int Loop2 = 0; - for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - if (!state.dataHeatBal->MassConservation(ZoneNum).IsOnlySourceZone && - !state.dataHeatBal->MassConservation(ZoneNum).IsSourceAndReceivingZone) { - Loop2 += 1; - state.dataHeatBalFanSys->ZoneReOrder(Loop2) = ZoneNum; - } - } - for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - if (state.dataHeatBal->MassConservation(ZoneNum).IsSourceAndReceivingZone) { - Loop2 += 1; - state.dataHeatBalFanSys->ZoneReOrder(Loop2) = ZoneNum; - } - } - for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - if (state.dataHeatBal->MassConservation(ZoneNum).IsOnlySourceZone) { - Loop2 += 1; - state.dataHeatBalFanSys->ZoneReOrder(Loop2) = ZoneNum; - } - } - - cCurrentModuleObject = "ZoneCrossMixing"; - int numZoneCrossMixingInputObjects = 0; - int totZoneCrossMixing = 0; // Total ZoneCrossMixing instances after expansion to spaces - EPVector zoneCrossMixingInputObjects; - InternalHeatGains::setupIHGZonesAndSpaces(state, - cCurrentModuleObject, - zoneCrossMixingInputObjects, - numZoneCrossMixingInputObjects, - totZoneCrossMixing, - ErrorsFound, - zoneListNotAllowed); - state.dataHeatBal->TotCrossMixing = totZoneCrossMixing + state.dataHeatBal->airBoundaryMixing.size(); - - if (state.dataHeatBal->TotCrossMixing > 0) { - cCurrentModuleObject = "ZoneCrossMixing"; - state.dataHeatBal->CrossMixing.allocate(state.dataHeatBal->TotCrossMixing); - - int mixingNum = 0; - for (int mixingInputNum = 1; mixingInputNum <= numZoneCrossMixingInputObjects; ++mixingInputNum) { - - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - mixingInputNum, - cAlphaArgs, - NumAlpha, - rNumericArgs, - NumNumber, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - // Create one Mixing instance for every space associated with this input object - auto const &thisMixingInput = zoneCrossMixingInputObjects(mixingInputNum); - for (int Item1 = 1; Item1 <= thisMixingInput.numOfSpaces; ++Item1) { - ++mixingNum; - auto &thisMixing = state.dataHeatBal->CrossMixing(mixingNum); - thisMixing.Name = thisMixingInput.names(Item1); - thisMixing.spaceIndex = thisMixingInput.spaceNums(Item1); - auto const &thisSpace = state.dataHeatBal->space(thisMixing.spaceIndex); - thisMixing.ZonePtr = thisSpace.zoneNum; - auto &thisZone = state.dataHeatBal->Zone(thisSpace.zoneNum); - - if (lAlphaFieldBlanks(3)) { - thisMixing.SchedPtr = DataGlobalConstants::ScheduleAlwaysOn; - } else { - thisMixing.SchedPtr = GetScheduleIndex(state, cAlphaArgs(3)); - if (thisMixing.SchedPtr == 0) { - ShowWarningError(state, - format("{}{}=\"{}\", invalid (not found) {}=\"{}\"", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(3), - cAlphaArgs(3))); - ErrorsFound = true; - } - } - - // Mixing equipment design level calculation method. - AirflowSpec flow = static_cast(getEnumerationValue(airflowNamesUC, cAlphaArgs(4))); // NOLINT(modernize-use-auto) - switch (flow) { - case AirflowSpec::Flow: - case AirflowSpec::FlowPerZone: - thisMixing.DesignLevel = rNumericArgs(1); - if (lNumericFieldBlanks(1)) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Cross Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(1))); - } else { - Real64 spaceFrac = 1.0; - if (!thisMixingInput.spaceListActive && (thisMixingInput.numOfSpaces > 1)) { - Real64 const zoneVolume = thisZone.Volume; - if (zoneVolume > 0.0) { - spaceFrac = thisSpace.Volume / zoneVolume; - } else { - ShowSevereError(state, std::string(RoutineName) + "Zone volume is zero when allocating Cross Mixing to Spaces."); - ShowContinueError( - state, format("Occurs for {}=\"{}\" in Zone=\"{}\".", cCurrentModuleObject, thisMixingInput.Name, thisZone.Name)); - ErrorsFound = true; - } - } - - thisMixing.DesignLevel = rNumericArgs(1) * spaceFrac; - } - break; - - case AirflowSpec::FlowPerArea: - if (thisMixing.spaceIndex != 0) { - if (rNumericArgs(2) >= 0.0) { - thisMixing.DesignLevel = rNumericArgs(2) * thisSpace.floorArea; - if (thisMixing.spaceIndex > 0) { - if (thisZone.FloorArea <= 0.0) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but Space Floor Area = 0. 0 Cross Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(2))); - } - } - } else { - ShowSevereError(state, - format("{}{}=\"{}\", invalid flow/area specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - rNumericArgs(2))); - ErrorsFound = true; - } - } - if (lNumericFieldBlanks(2)) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Cross Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(2))); - } - break; - - case AirflowSpec::FlowPerPerson: - if (thisMixing.spaceIndex != 0) { - if (rNumericArgs(3) >= 0.0) { - thisMixing.DesignLevel = rNumericArgs(3) * thisSpace.totOccupants; - if (thisSpace.totOccupants <= 0.0) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but Space Total Occupants = 0. 0 Cross Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(3))); - } - } else { - ShowSevereError(state, - format("{}{}=\"{}\", invalid flow/person specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - rNumericArgs(3))); - ErrorsFound = true; - } - } - if (lNumericFieldBlanks(3)) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Cross Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(3))); - } - break; - - case AirflowSpec::AirChanges: - if (thisMixing.spaceIndex != 0) { - if (rNumericArgs(4) >= 0.0) { - thisMixing.DesignLevel = rNumericArgs(4) * thisSpace.Volume / DataGlobalConstants::SecInHour; - if (thisSpace.Volume <= 0.0) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but Space Volume = 0. 0 Cross Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(4))); - } - } else { - ShowSevereError(state, - format("{}{}=\"{}\", invalid ACH (air changes per hour) specification [<0.0]={:.3R}", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - rNumericArgs(4))); - ErrorsFound = true; - } - } - if (lNumericFieldBlanks(4)) { - ShowWarningError(state, - format("{}{}=\"{}\", {} specifies {}, but that field is blank. 0 Cross Mixing will result.", - RoutineName, - cCurrentModuleObject, - thisMixingInput.Name, - cAlphaFieldNames(4), - cNumericFieldNames(4))); - } - break; - - default: - ShowSevereError( - state, format("{}{}=\"{}\", invalid calculation method={}", RoutineName, cCurrentModuleObject, cAlphaArgs(1), cAlphaArgs(4))); - ErrorsFound = true; - } - - thisMixing.fromSpaceIndex = UtilityRoutines::FindItemInList(cAlphaArgs(5), state.dataHeatBal->space); - if (thisMixing.fromSpaceIndex == 0) { - thisMixing.FromZone = UtilityRoutines::FindItemInList(cAlphaArgs(5), state.dataHeatBal->Zone); - } else { - thisMixing.FromZone = state.dataHeatBal->space(thisMixing.fromSpaceIndex).zoneNum; - } - if ((thisMixing.FromZone == 0) && (thisMixing.fromSpaceIndex == 0)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + - cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + "\"."); - ErrorsFound = true; - } - thisMixing.DeltaTemperature = rNumericArgs(5); - - if (NumAlpha > 5) { - thisMixing.DeltaTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(6)); - if (thisMixing.DeltaTempSchedPtr > 0) { - if (!lNumericFieldBlanks(5)) - ShowWarningError( - state, - std::string{RoutineName} + - "The Delta Temperature value and schedule are provided. The scheduled temperature will be used in the " + - cCurrentModuleObject + " object = " + cAlphaArgs(1)); - if (GetScheduleMinValue(state, thisMixing.DeltaTempSchedPtr) < 0.0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + - " must have a delta temperature equal to or above 0 C defined in the schedule = " + cAlphaArgs(6)); - ErrorsFound = true; - } - } - } - if (thisMixing.DeltaTempSchedPtr == 0 && lNumericFieldBlanks(5) && (!lAlphaFieldBlanks(6))) { - ShowWarningError(state, - format("{}{}: the value field is blank and schedule field is invalid. The default value will be used ({:.1R}) ", - RoutineName, - cNumericFieldNames(5), - rNumericArgs(5))); - ShowContinueError(state, "in " + cCurrentModuleObject + " = " + cAlphaArgs(1) + " and the simulation continues..."); - } - if (!lNumericFieldBlanks(5) && ((!lAlphaFieldBlanks(6)) && thisMixing.DeltaTempSchedPtr == 0)) { - ShowWarningError(state, - format("{}{} = {} is invalid. The constant value will be used at {:.1R} degrees C ", - RoutineName, - cAlphaFieldNames(6), - cAlphaArgs(6), - rNumericArgs(5))); - ShowContinueError(state, "in the " + cCurrentModuleObject + " object = " + cAlphaArgs(1) + " and the simulation continues..."); - } - - if (NumAlpha > 6) { - thisMixing.MinIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(7)); - if (thisMixing.MinIndoorTempSchedPtr == 0) { - if ((!lAlphaFieldBlanks(7))) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(7) + - " not found=" + cAlphaArgs(7) + "\"."); - ErrorsFound = true; - } - } - if (thisMixing.MinIndoorTempSchedPtr > 0) { - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisMixing.MinIndoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + - " must have a minimum zone temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(7)); - ErrorsFound = true; - } - } - } - - if (NumAlpha > 7) { - thisMixing.MaxIndoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(8)); - if (thisMixing.MaxIndoorTempSchedPtr == 0) { - if ((!lAlphaFieldBlanks(8))) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(8) + - " not found=\"" + cAlphaArgs(8) + "\"."); - ErrorsFound = true; - } - } - if (thisMixing.MaxIndoorTempSchedPtr > 0) { - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisMixing.MaxIndoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + - " must have a maximum zone temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(8)); - ErrorsFound = true; - } - } - } - - if (NumAlpha > 8) { - thisMixing.MinSourceTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(9)); - if (thisMixing.MinSourceTempSchedPtr == 0) { - if ((!lAlphaFieldBlanks(9))) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(9) + - " not found=\"" + cAlphaArgs(9) + "\"."); - ErrorsFound = true; - } - } - if (thisMixing.MinSourceTempSchedPtr > 0) { - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisMixing.MinSourceTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + - " must have a minimum source temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(9)); - ErrorsFound = true; - } - } - } - - if (NumAlpha > 9) { - thisMixing.MaxSourceTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(10)); - if (thisMixing.MaxSourceTempSchedPtr == 0) { - if ((!lAlphaFieldBlanks(10))) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(10) + - " not found=\"" + cAlphaArgs(9) + "\"."); - ErrorsFound = true; - } - } - if (thisMixing.MaxSourceTempSchedPtr > 0) { - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisMixing.MaxSourceTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + - " must have a maximum source temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(10)); - ErrorsFound = true; - } - } - } - - if (NumAlpha > 10) { - thisMixing.MinOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(11)); - if (thisMixing.MinOutdoorTempSchedPtr == 0) { - if ((!lAlphaFieldBlanks(11))) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(11) + - " not found=\"" + cAlphaArgs(9) + "\"."); - ErrorsFound = true; - } - } - if (thisMixing.MinOutdoorTempSchedPtr > 0) { - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisMixing.MinOutdoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + - " must have a minimum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(11)); - ErrorsFound = true; - } - } - } - - if (NumAlpha > 11) { - thisMixing.MaxOutdoorTempSchedPtr = GetScheduleIndex(state, cAlphaArgs(12)); - if (thisMixing.MaxOutdoorTempSchedPtr == 0) { - if ((!lAlphaFieldBlanks(12))) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(12) + - " not found=\"" + cAlphaArgs(9) + "\"."); - ErrorsFound = true; - } - } - if (thisMixing.MaxOutdoorTempSchedPtr > 0) { - // Check min and max values in the schedule to ensure both values are within the range - if (!CheckScheduleValueMinMax(state, thisMixing.MaxOutdoorTempSchedPtr, ">=", -MixingTempLimit, "<=", MixingTempLimit)) { - ShowSevereError( - state, - std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + - " must have a maximum outdoor temperature between -100C and 100C defined in the schedule = " + cAlphaArgs(12)); - ErrorsFound = true; - } - } - } - } - } - // Create CrossMixing objects from air boundary info - for (auto const &thisAirBoundaryMixing : state.dataHeatBal->airBoundaryMixing) { - ++mixingNum; - // Create CrossMixing object from air boundary info - int space1 = thisAirBoundaryMixing.space1; - int space2 = thisAirBoundaryMixing.space2; - int zone1 = state.dataHeatBal->space(space1).zoneNum; - int zone2 = state.dataHeatBal->space(space1).zoneNum; - auto &thisCrossMizing = state.dataHeatBal->CrossMixing(mixingNum); - thisCrossMizing.Name = fmt::format("Air Boundary Mixing Zones {} and {}", zone1, zone2); - thisCrossMizing.spaceIndex = space1; - thisCrossMizing.ZonePtr = zone1; - thisCrossMizing.SchedPtr = thisAirBoundaryMixing.scheduleIndex; - thisCrossMizing.DesignLevel = thisAirBoundaryMixing.mixingVolumeFlowRate; - thisCrossMizing.FromZone = zone2; - thisCrossMizing.fromSpaceIndex = space2; - } - assert(mixingNum == state.dataHeatBal->TotCrossMixing); - for (int mixingRepNum = 1; mixingRepNum <= state.dataHeatBal->TotMixing; ++mixingRepNum) { - int zoneNum = state.dataHeatBal->CrossMixing(mixingRepNum).ZonePtr; - if (zoneNum > 0) { - std::string const &zoneName = state.dataHeatBal->Zone(zoneNum).Name; - auto &thisZnAirRpt = state.dataHeatBal->ZnAirRpt(zoneNum); - if (RepVarSet(zoneNum)) { - RepVarSet(zoneNum) = false; - SetupOutputVariable(state, - "Zone Mixing Volume", - OutputProcessor::Unit::m3, - thisZnAirRpt.MixVolume, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zoneName); - SetupOutputVariable(state, - "Zone Mixing Current Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - thisZnAirRpt.MixVdotCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - zoneName); - SetupOutputVariable(state, - "Zone Mixing Standard Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - thisZnAirRpt.MixVdotStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - zoneName); - SetupOutputVariable(state, - "Zone Mixing Mass", - OutputProcessor::Unit::kg, - thisZnAirRpt.MixMass, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zoneName); - SetupOutputVariable(state, - "Zone Mixing Mass Flow Rate", - OutputProcessor::Unit::kg_s, - thisZnAirRpt.MixMdot, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - zoneName); - SetupOutputVariable(state, - "Zone Mixing Sensible Heat Loss Energy", - OutputProcessor::Unit::J, - thisZnAirRpt.MixHeatLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zoneName); - SetupOutputVariable(state, - "Zone Mixing Sensible Heat Gain Energy", - OutputProcessor::Unit::J, - thisZnAirRpt.MixHeatGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zoneName); - SetupOutputVariable(state, - "Zone Mixing Latent Heat Loss Energy", - OutputProcessor::Unit::J, - thisZnAirRpt.MixLatentLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zoneName); - SetupOutputVariable(state, - "Zone Mixing Latent Heat Gain Energy", - OutputProcessor::Unit::J, - thisZnAirRpt.MixLatentGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zoneName); - SetupOutputVariable(state, - "Zone Mixing Total Heat Loss Energy", - OutputProcessor::Unit::J, - thisZnAirRpt.MixTotalLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zoneName); - SetupOutputVariable(state, - "Zone Mixing Total Heat Gain Energy", - OutputProcessor::Unit::J, - thisZnAirRpt.MixTotalGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zoneName); - } - } - int fromZoneNum = state.dataHeatBal->CrossMixing(mixingRepNum).FromZone; - if (fromZoneNum > 0) { - if (RepVarSet(fromZoneNum)) { - RepVarSet(fromZoneNum) = false; - std::string const &fromZoneName = state.dataHeatBal->Zone(fromZoneNum).Name; - auto &thisZnAirRpt = state.dataHeatBal->ZnAirRpt(fromZoneNum); - SetupOutputVariable(state, - "Zone Mixing Volume", - OutputProcessor::Unit::m3, - thisZnAirRpt.MixVolume, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - fromZoneName); - SetupOutputVariable(state, - "Zone Mixing Current Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - thisZnAirRpt.MixVdotCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - fromZoneName); - SetupOutputVariable(state, - "Zone Mixing Standard Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - thisZnAirRpt.MixVdotStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - fromZoneName); - SetupOutputVariable(state, - "Zone Mixing Mass", - OutputProcessor::Unit::kg, - thisZnAirRpt.MixMass, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - fromZoneName); - SetupOutputVariable(state, - "Zone Mixing Mass Flow Rate", - OutputProcessor::Unit::kg_s, - thisZnAirRpt.MixMdot, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - fromZoneName); - SetupOutputVariable(state, - "Zone Mixing Sensible Heat Loss Energy", - OutputProcessor::Unit::J, - thisZnAirRpt.MixHeatLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - fromZoneName); - SetupOutputVariable(state, - "Zone Mixing Sensible Heat Gain Energy", - OutputProcessor::Unit::J, - thisZnAirRpt.MixHeatGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - fromZoneName); - SetupOutputVariable(state, - "Zone Mixing Latent Heat Loss Energy", - OutputProcessor::Unit::J, - thisZnAirRpt.MixLatentLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - fromZoneName); - SetupOutputVariable(state, - "Zone Mixing Latent Heat Gain Energy", - OutputProcessor::Unit::J, - thisZnAirRpt.MixLatentGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - fromZoneName); - SetupOutputVariable(state, - "Zone Mixing Total Heat Loss Energy", - OutputProcessor::Unit::J, - thisZnAirRpt.MixTotalLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - fromZoneName); - SetupOutputVariable(state, - "Zone Mixing Total Heat Gain Energy", - OutputProcessor::Unit::J, - thisZnAirRpt.MixTotalGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - fromZoneName); - } - } - - if (state.dataGlobal->AnyEnergyManagementSystemInModel) { - SetupEMSActuator(state, - "ZoneCrossMixing", - state.dataHeatBal->CrossMixing(mixingRepNum).Name, - "Air Exchange Flow Rate", - "[m3/s]", - state.dataHeatBal->CrossMixing(mixingRepNum).EMSSimpleMixingOn, - state.dataHeatBal->CrossMixing(mixingRepNum).EMSimpleMixingFlowRate); - } - } - } - - cCurrentModuleObject = "ZoneRefrigerationDoorMixing"; - state.dataHeatBal->TotRefDoorMixing = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - if (state.dataHeatBal->TotRefDoorMixing > 0) { - state.dataHeatBal->RefDoorMixing.allocate(state.dataGlobal->NumOfZones); - for (auto &e : state.dataHeatBal->RefDoorMixing) - e.NumRefDoorConnections = 0; - - for (int Loop = 1; Loop <= state.dataHeatBal->TotRefDoorMixing; ++Loop) { - - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Loop, - cAlphaArgs, - NumAlpha, - rNumericArgs, - NumNumber, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - - NameThisObject = cAlphaArgs(1); - - AlphaNum = 2; - Zone1Num = UtilityRoutines::FindItemInList(cAlphaArgs(AlphaNum), state.dataHeatBal->Zone); - if (Zone1Num == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + - cAlphaFieldNames(AlphaNum) + "=\"" + cAlphaArgs(AlphaNum) + "\"."); - ErrorsFound = true; - } - - ++AlphaNum; // 3 - Zone2Num = UtilityRoutines::FindItemInList(cAlphaArgs(AlphaNum), state.dataHeatBal->Zone); - if (Zone2Num == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + - cAlphaFieldNames(AlphaNum) + "=\"" + cAlphaArgs(AlphaNum) + "\"."); - ErrorsFound = true; - } - if (Zone1Num == Zone2Num) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + - "\", The same zone name has been entered for both sides of a refrigerated door " + cAlphaFieldNames(AlphaNum) + - "=\"" + cAlphaArgs(AlphaNum) + "\"."); - ErrorsFound = true; - } else if (Zone1Num < Zone2Num) { // zone 1 will come first in soln loop, id zone 2 as mate zone - ZoneNumA = Zone1Num; - ZoneNumB = Zone2Num; - } else if (Zone2Num < Zone1Num) { // zone 2 will come first in soln loop, id zone 1 as mate zone - ZoneNumA = Zone2Num; - ZoneNumB = Zone1Num; - } - - if (!allocated(state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr)) { - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorMixingObjectName.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumA).Protection.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumA).MateZonePtr.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorMixingOn.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorFlowRate.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumA).VolRefDoorFlowRate.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorMixingObjectName = ""; - state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr = 0; - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight = 0.0; - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea = 0.0; - state.dataHeatBal->RefDoorMixing(ZoneNumA).Protection = RefDoorNone; - state.dataHeatBal->RefDoorMixing(ZoneNumA).MateZonePtr = 0; - state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorMixingOn = false; - state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorFlowRate = 0.0; - state.dataHeatBal->RefDoorMixing(ZoneNumA).VolRefDoorFlowRate = 0.0; - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName = ""; - } // First refrigeration mixing in this zone - - if (!allocated(state.dataHeatBal->RefDoorMixing(ZoneNumB).OpenSchedPtr)) { - state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorMixingObjectName.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumB).OpenSchedPtr.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorHeight.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorArea.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumB).Protection.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumB).MateZonePtr.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumB).EMSRefDoorMixingOn.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumB).EMSRefDoorFlowRate.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumB).VolRefDoorFlowRate.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorProtTypeName.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorMixingObjectName = ""; - state.dataHeatBal->RefDoorMixing(ZoneNumB).OpenSchedPtr = 0; - state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorHeight = 0.0; - state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorArea = 0.0; - state.dataHeatBal->RefDoorMixing(ZoneNumB).Protection = RefDoorNone; - state.dataHeatBal->RefDoorMixing(ZoneNumB).MateZonePtr = 0; - state.dataHeatBal->RefDoorMixing(ZoneNumB).EMSRefDoorMixingOn = false; - state.dataHeatBal->RefDoorMixing(ZoneNumB).EMSRefDoorFlowRate = 0.0; - state.dataHeatBal->RefDoorMixing(ZoneNumB).VolRefDoorFlowRate = 0.0; - state.dataHeatBal->RefDoorMixing(ZoneNumB).DoorProtTypeName = ""; - } // First refrigeration mixing in this zone - - ConnectionNumber = state.dataHeatBal->RefDoorMixing(ZoneNumA).NumRefDoorConnections + 1; - state.dataHeatBal->RefDoorMixing(ZoneNumA).NumRefDoorConnections = ConnectionNumber; - state.dataHeatBal->RefDoorMixing(ZoneNumA).ZonePtr = ZoneNumA; - state.dataHeatBal->RefDoorMixing(ZoneNumA).MateZonePtr(ConnectionNumber) = ZoneNumB; - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorMixingObjectName(ConnectionNumber) = NameThisObject; - // need to make sure same pair of zones is only entered once. - if (state.dataHeatBal->RefDoorMixing(ZoneNumA).RefDoorMixFlag && state.dataHeatBal->RefDoorMixing(ZoneNumB).RefDoorMixFlag) { - if (state.dataHeatBal->RefDoorMixing(ZoneNumA).NumRefDoorConnections > 1) { - for (ConnectTest = 1; ConnectTest <= (ConnectionNumber - 1); ++ConnectTest) { - if (state.dataHeatBal->RefDoorMixing(ZoneNumA).MateZonePtr(ConnectTest) != - state.dataHeatBal->RefDoorMixing(ZoneNumA).MateZonePtr(ConnectionNumber)) - continue; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", and " + - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorMixingObjectName(ConnectTest)); - ShowContinueError(state, - " Share same pair of zones: \"" + state.dataHeatBal->Zone(ZoneNumA).Name + "\" and \"" + - state.dataHeatBal->Zone(ZoneNumB).Name + - "\". Only one RefrigerationDoorMixing object is allowed for any unique pair of zones."); - ErrorsFound = true; - } // ConnectTest - } // NumRefDoorconnections > 1 - } else { // Both zones need to be flagged with ref doors - state.dataHeatBal->RefDoorMixing(ZoneNumA).RefDoorMixFlag = true; - state.dataHeatBal->RefDoorMixing(ZoneNumB).RefDoorMixFlag = true; - } // Both zones already flagged with ref doors - - ++AlphaNum; // 4 - if (lAlphaFieldBlanks(AlphaNum)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(AlphaNum) + - " is required but field is blank."); - ErrorsFound = true; - } else { //(lAlphaFieldBlanks(AlphaNum)) THEN - state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr(ConnectionNumber) = GetScheduleIndex(state, cAlphaArgs(AlphaNum)); - if (state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr(ConnectionNumber) == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\", invalid (not found) " + - cAlphaFieldNames(AlphaNum) + "=\"" + cAlphaArgs(AlphaNum) + "\"."); - ErrorsFound = true; - } else { // OpenSchedPtr(ConnectionNumber) ne 0) - if (!CheckScheduleValueMinMax( - state, state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr(ConnectionNumber), ">=", 0.0, "<=", 1.0)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\"," + cAlphaFieldNames(AlphaNum) + - "=\"" + cAlphaArgs(AlphaNum) + "\" has schedule values < 0 or > 1."); - ErrorsFound = true; - } // check door opening schedule values between 0 and 1 - } // OpenSchedPtr(ConnectionNumber) == 0) - } //(lAlphaFieldBlanks(AlphaNum)) THEN - - NumbNum = 1; - if (lAlphaFieldBlanks(NumbNum)) { - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight(ConnectionNumber) = 3.0; // default height of 3 meters - ShowWarningError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + cNumericFieldNames(NumbNum) + - " is blank and the default value of 3.0 will be used."); - } else { - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight(ConnectionNumber) = rNumericArgs(NumbNum); - if ((state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight(ConnectionNumber) < 0) || - (state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight(ConnectionNumber) > 50.0)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + - " must have a door height between 0 and 50 meters. "); - ErrorsFound = true; - } - } - - ++NumbNum; // 2 - if (lAlphaFieldBlanks(NumbNum)) { - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea(ConnectionNumber) = 9.0; // default area of 9 m2 - ShowWarningError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + cNumericFieldNames(NumbNum) + - " is blank and the default value of 9 m2 will be used."); - } else { - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea(ConnectionNumber) = rNumericArgs(NumbNum); - if ((state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea(ConnectionNumber) < 0) || - (state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea(ConnectionNumber) > 400.0)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + " = " + cAlphaArgs(1) + - " must have a door height between 0 and 400 square meters. "); - ErrorsFound = true; - } - } - - ++AlphaNum; // 5 - // Door protection type. - if (lAlphaFieldBlanks(AlphaNum)) { - state.dataHeatBal->RefDoorMixing(ZoneNumA).Protection(ConnectionNumber) = RefDoorNone; // Default - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName(ConnectionNumber) = "None"; // Default - ShowWarningError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" " + cAlphaFieldNames(AlphaNum) + - " is blank. Default of no door protection will be used"); - } else { - if (cAlphaArgs(AlphaNum) == "NONE") { - state.dataHeatBal->RefDoorMixing(ZoneNumA).Protection(ConnectionNumber) = RefDoorNone; - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName(ConnectionNumber) = "None"; - } else if (cAlphaArgs(AlphaNum) == "AIRCURTAIN") { - state.dataHeatBal->RefDoorMixing(ZoneNumA).Protection(ConnectionNumber) = RefDoorAirCurtain; - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName(ConnectionNumber) = "AirCurtain"; - } else if (cAlphaArgs(AlphaNum) == "STRIPCURTAIN") { - state.dataHeatBal->RefDoorMixing(ZoneNumA).Protection(ConnectionNumber) = RefDoorStripCurtain; - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName(ConnectionNumber) = "StripCurtain"; - } else { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + cAlphaArgs(1) + - "\", invalid calculation method=" + cAlphaArgs(AlphaNum) + " with alphanum of 5: " + cAlphaArgs(5)); - ErrorsFound = true; - } // =none, etc. - } // Blank - - if (ZoneNumA > 0) { - if (RepVarSet(ZoneNumA)) { - RepVarSet(ZoneNumA) = false; - SetupOutputVariable(state, - "Zone Mixing Volume", - OutputProcessor::Unit::m3, - state.dataHeatBal->ZnAirRpt(ZoneNumA).MixVolume, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumA).Name); - SetupOutputVariable(state, - "Zone Mixing Current Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(ZoneNumA).MixVdotCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneNumA).Name); - SetupOutputVariable(state, - "Zone Mixing Standard Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(ZoneNumA).MixVdotStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneNumA).Name); - SetupOutputVariable(state, - "Zone Mixing Mass", - OutputProcessor::Unit::kg, - state.dataHeatBal->ZnAirRpt(ZoneNumA).MixMass, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumA).Name); - SetupOutputVariable(state, - "Zone Mixing Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->ZnAirRpt(ZoneNumA).MixMdot, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneNumA).Name); - SetupOutputVariable(state, - "Zone Mixing Sensible Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(ZoneNumA).MixHeatLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumA).Name); - SetupOutputVariable(state, - "Zone Mixing Sensible Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(ZoneNumA).MixHeatGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumA).Name); - SetupOutputVariable(state, - "Zone Mixing Latent Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(ZoneNumA).MixLatentLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumA).Name); - SetupOutputVariable(state, - "Zone Mixing Latent Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(ZoneNumA).MixLatentGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumA).Name); - SetupOutputVariable(state, - "Zone Mixing Total Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(ZoneNumA).MixTotalLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumA).Name); - SetupOutputVariable(state, - "Zone Mixing Total Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(ZoneNumA).MixTotalGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumA).Name); - } - } - if (state.dataGlobal->AnyEnergyManagementSystemInModel) { - SetupEMSActuator(state, - "ZoneRefDoorMixing", - state.dataHeatBal->RefDoorMixing(ZoneNumA).Name, - "Air Exchange Flow Rate", - "[m3/s]", - state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorMixingOn(ConnectionNumber), - state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorFlowRate(ConnectionNumber)); - } - - if (ZoneNumB > 0) { - if (RepVarSet(ZoneNumB)) { - RepVarSet(ZoneNumB) = false; - SetupOutputVariable(state, - "Zone Mixing Volume", - OutputProcessor::Unit::m3, - state.dataHeatBal->ZnAirRpt(ZoneNumB).MixVolume, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumB).Name); - SetupOutputVariable(state, - "Zone Mixing Current Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(ZoneNumB).MixVdotCurDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneNumB).Name); - SetupOutputVariable(state, - "Zone Mixing Standard Density Volume Flow Rate", - OutputProcessor::Unit::m3_s, - state.dataHeatBal->ZnAirRpt(ZoneNumB).MixVdotStdDensity, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneNumB).Name); - SetupOutputVariable(state, - "Zone Mixing Mass", - OutputProcessor::Unit::kg, - state.dataHeatBal->ZnAirRpt(ZoneNumB).MixMass, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumB).Name); - SetupOutputVariable(state, - "Zone Mixing Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->ZnAirRpt(ZoneNumB).MixMdot, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneNumB).Name); - SetupOutputVariable(state, - "Zone Mixing Sensible Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(ZoneNumB).MixHeatLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumB).Name); - SetupOutputVariable(state, - "Zone Mixing Sensible Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(ZoneNumB).MixHeatGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumB).Name); - SetupOutputVariable(state, - "Zone Mixing Latent Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(ZoneNumB).MixLatentLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumB).Name); - SetupOutputVariable(state, - "Zone Mixing Latent Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(ZoneNumB).MixLatentGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumB).Name); - SetupOutputVariable(state, - "Zone Mixing Total Heat Loss Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(ZoneNumB).MixTotalLoss, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumB).Name); - SetupOutputVariable(state, - "Zone Mixing Total Heat Gain Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZnAirRpt(ZoneNumB).MixTotalGain, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->Zone(ZoneNumB).Name); - } - } - if (state.dataGlobal->AnyEnergyManagementSystemInModel) { - SetupEMSActuator(state, - "ZoneRefDoorMixing", - state.dataHeatBal->RefDoorMixing(ZoneNumB).Name, - "Air Exchange Flow Rate", - "[m3/s]", - state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorMixingOn(ConnectionNumber), - state.dataHeatBal->RefDoorMixing(ZoneNumA).EMSRefDoorFlowRate(ConnectionNumber)); - } - - } // DO Loop=1,TotRefDoorMixing - } // TotRefDoorMixing > 0) - - RepVarSet.deallocate(); - cAlphaArgs.deallocate(); - cAlphaFieldNames.deallocate(); - cNumericFieldNames.deallocate(); - rNumericArgs.deallocate(); - lAlphaFieldBlanks.deallocate(); - lNumericFieldBlanks.deallocate(); - - TotInfilVentFlow.dimension(state.dataGlobal->NumOfZones, 0.0); - - auto divide_and_print_if_greater_than_zero = [&](const Real64 denominator, const Real64 numerator) { - if (denominator > 0.0) { - print(state.files.eio, "{:.3R},", numerator / denominator); - } else { - print(state.files.eio, "N/A,"); - } - }; - - for (int Loop = 1; Loop <= state.dataHeatBal->TotInfiltration; ++Loop) { - if (Loop == 1) - print(state.files.eio, - Format_721, - "ZoneInfiltration", - "Design Volume Flow Rate {m3/s},Volume Flow Rate/Floor Area {m3/s-m2},Volume Flow Rate/Exterior Surface Area {m3/s-m2},ACH - " - "Air Changes per Hour,Equation A - Constant Term Coefficient {},Equation B - Temperature Term Coefficient {1/C},Equation C - " - "Velocity Term Coefficient {s/m}, Equation D - Velocity Squared Term Coefficient {s2/m2}"); - - int ZoneNum = state.dataHeatBal->Infiltration(Loop).ZonePtr; - if (ZoneNum == 0) { - print(state.files.eio, Format_722, "Infiltration-Illegal Zone specified", state.dataHeatBal->Infiltration(Loop).Name); - continue; - } - TotInfilVentFlow(ZoneNum) += state.dataHeatBal->Infiltration(Loop).DesignLevel; - print(state.files.eio, - Format_720, - "ZoneInfiltration", - state.dataHeatBal->Infiltration(Loop).Name, - GetScheduleName(state, state.dataHeatBal->Infiltration(Loop).SchedPtr), - state.dataHeatBal->Zone(ZoneNum).Name, - state.dataHeatBal->Zone(ZoneNum).FloorArea, - state.dataHeatBal->Zone(ZoneNum).TotOccupants); - print(state.files.eio, "{:.3R},", state.dataHeatBal->Infiltration(Loop).DesignLevel); - - divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).FloorArea, state.dataHeatBal->Infiltration(Loop).DesignLevel); - divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).ExteriorTotalSurfArea, - state.dataHeatBal->Infiltration(Loop).DesignLevel); - divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).Volume, - state.dataHeatBal->Infiltration(Loop).DesignLevel * DataGlobalConstants::SecInHour); - - print(state.files.eio, "{:.3R},", state.dataHeatBal->Infiltration(Loop).ConstantTermCoef); - print(state.files.eio, "{:.3R},", state.dataHeatBal->Infiltration(Loop).TemperatureTermCoef); - print(state.files.eio, "{:.3R},", state.dataHeatBal->Infiltration(Loop).VelocityTermCoef); - print(state.files.eio, "{:.3R}\n", state.dataHeatBal->Infiltration(Loop).VelocitySQTermCoef); - } - - if (state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance) { - for (int Loop = 1; Loop <= state.dataHeatBal->TotInfiltration; ++Loop) { - int ZoneNum = state.dataHeatBal->Infiltration(Loop).ZonePtr; - state.dataHeatBal->MassConservation(ZoneNum).InfiltrationPtr = Loop; - } - } - - for (int Loop = 1; Loop <= state.dataHeatBal->TotVentilation; ++Loop) { - if (Loop == 1) { - print(state.files.eio, - Format_721, - "ZoneVentilation", - "Design Volume Flow Rate {m3/s},Volume Flow Rate/Floor Area {m3/s-m2},Volume Flow Rate/person Area {m3/s-person},ACH - Air " - "Changes per Hour,Fan Type {Exhaust;Intake;Natural},Fan Pressure Rise {Pa},Fan Efficiency {},Equation A - Constant Term " - "Coefficient {},Equation B - Temperature Term Coefficient {1/C},Equation C - Velocity Term Coefficient {s/m}, Equation D - " - "Velocity Squared Term Coefficient {s2/m2},Minimum Indoor Temperature{C}/Schedule,Maximum Indoor " - "Temperature{C}/Schedule,Delta Temperature{C}/Schedule,Minimum Outdoor Temperature{C}/Schedule,Maximum Outdoor " - "Temperature{C}/Schedule,Maximum WindSpeed{m/s}"); - } - - int ZoneNum = state.dataHeatBal->Ventilation(Loop).ZonePtr; - if (ZoneNum == 0) { - print(state.files.eio, Format_722, "Ventilation-Illegal Zone specified", state.dataHeatBal->Ventilation(Loop).Name); - continue; - } - TotInfilVentFlow(ZoneNum) += state.dataHeatBal->Ventilation(Loop).DesignLevel; - print(state.files.eio, - Format_720, - "ZoneVentilation", - state.dataHeatBal->Ventilation(Loop).Name, - GetScheduleName(state, state.dataHeatBal->Ventilation(Loop).SchedPtr), - state.dataHeatBal->Zone(ZoneNum).Name, - state.dataHeatBal->Zone(ZoneNum).FloorArea, - state.dataHeatBal->Zone(ZoneNum).TotOccupants); - - print(state.files.eio, "{:.3R},", state.dataHeatBal->Ventilation(Loop).DesignLevel); - - divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).FloorArea, state.dataHeatBal->Ventilation(Loop).DesignLevel); - divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).TotOccupants, state.dataHeatBal->Ventilation(Loop).DesignLevel); - divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).Volume, - state.dataHeatBal->Ventilation(Loop).DesignLevel * DataGlobalConstants::SecInHour); - - if (state.dataHeatBal->Ventilation(Loop).FanType == DataHeatBalance::VentilationType::Exhaust) { - print(state.files.eio, "Exhaust,"); - } else if (state.dataHeatBal->Ventilation(Loop).FanType == DataHeatBalance::VentilationType::Intake) { - print(state.files.eio, "Intake,"); - } else if (state.dataHeatBal->Ventilation(Loop).FanType == DataHeatBalance::VentilationType::Natural) { - print(state.files.eio, "Natural,"); - } else if (state.dataHeatBal->Ventilation(Loop).FanType == DataHeatBalance::VentilationType::Balanced) { - print(state.files.eio, "Balanced,"); - } else { - print(state.files.eio, "UNKNOWN,"); - } - print(state.files.eio, "{:.3R},", state.dataHeatBal->Ventilation(Loop).FanPressure); - print(state.files.eio, "{:.1R},", state.dataHeatBal->Ventilation(Loop).FanEfficiency); - print(state.files.eio, "{:.3R},", state.dataHeatBal->Ventilation(Loop).ConstantTermCoef); - print(state.files.eio, "{:.3R},", state.dataHeatBal->Ventilation(Loop).TemperatureTermCoef); - print(state.files.eio, "{:.3R},", state.dataHeatBal->Ventilation(Loop).VelocityTermCoef); - print(state.files.eio, "{:.3R},", state.dataHeatBal->Ventilation(Loop).VelocitySQTermCoef); - - // TODO Should this also be prefixed with "Schedule: " like the following ones are? - if (state.dataHeatBal->Ventilation(Loop).MinIndoorTempSchedPtr > 0) { - print(state.files.eio, "{},", GetScheduleName(state, state.dataHeatBal->Ventilation(Loop).MinIndoorTempSchedPtr)); - } else { - print(state.files.eio, "{:.2R},", state.dataHeatBal->Ventilation(Loop).MinIndoorTemperature); - } - - const auto print_temperature = [&](const int ptr, const Real64 value) { - if (ptr > 0) { - print(state.files.eio, "Schedule: {},", GetScheduleName(state, ptr)); - } else { - print(state.files.eio, "{:.2R},", value); - } - }; - - print_temperature(state.dataHeatBal->Ventilation(Loop).MaxIndoorTempSchedPtr, state.dataHeatBal->Ventilation(Loop).MaxIndoorTemperature); - print_temperature(state.dataHeatBal->Ventilation(Loop).DeltaTempSchedPtr, state.dataHeatBal->Ventilation(Loop).DelTemperature); - print_temperature(state.dataHeatBal->Ventilation(Loop).MinOutdoorTempSchedPtr, state.dataHeatBal->Ventilation(Loop).MinOutdoorTemperature); - print_temperature(state.dataHeatBal->Ventilation(Loop).MaxOutdoorTempSchedPtr, state.dataHeatBal->Ventilation(Loop).MaxOutdoorTemperature); - - print(state.files.eio, "{:.2R}\n", state.dataHeatBal->Ventilation(Loop).MaxWindSpeed); - } - - TotMixingFlow.dimension(state.dataGlobal->NumOfZones, 0.0); - for (int Loop = 1; Loop <= state.dataHeatBal->TotMixing; ++Loop) { - if (Loop == 1) - print(state.files.eio, - Format_721, - "Mixing", - "Design Volume Flow Rate {m3/s},Volume Flow Rate/Floor Area {m3/s-m2},Volume Flow Rate/person Area {m3/s-person},ACH - Air " - "Changes per Hour,From/Source Zone,Delta Temperature {C}"); - - int ZoneNum = state.dataHeatBal->Mixing(Loop).ZonePtr; - if (ZoneNum == 0) { - print(state.files.eio, Format_722, "Mixing-Illegal Zone specified", state.dataHeatBal->Mixing(Loop).Name); - continue; - } - TotMixingFlow(ZoneNum) += state.dataHeatBal->Mixing(Loop).DesignLevel; - print(state.files.eio, - Format_720, - "Mixing", - state.dataHeatBal->Mixing(Loop).Name, - GetScheduleName(state, state.dataHeatBal->Mixing(Loop).SchedPtr), - state.dataHeatBal->Zone(ZoneNum).Name, - state.dataHeatBal->Zone(ZoneNum).FloorArea, - state.dataHeatBal->Zone(ZoneNum).TotOccupants); - print(state.files.eio, "{:.3R},", state.dataHeatBal->Mixing(Loop).DesignLevel); - divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).FloorArea, state.dataHeatBal->Mixing(Loop).DesignLevel); - divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).TotOccupants, state.dataHeatBal->Mixing(Loop).DesignLevel); - divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).Volume, - state.dataHeatBal->Mixing(Loop).DesignLevel * DataGlobalConstants::SecInHour); - - print(state.files.eio, "{},", state.dataHeatBal->Zone(state.dataHeatBal->Mixing(Loop).FromZone).Name); - print(state.files.eio, "{:.2R}\n", state.dataHeatBal->Mixing(Loop).DeltaTemperature); - } - - for (int Loop = 1; Loop <= state.dataHeatBal->TotCrossMixing; ++Loop) { - if (Loop == 1) { - print(state.files.eio, - Format_721, - "CrossMixing", - "Design Volume Flow Rate {m3/s},Volume Flow Rate/Floor Area {m3/s-m2},Volume Flow Rate/person Area {m3/s-person},ACH - Air " - "Changes per Hour,From/Source Zone,Delta Temperature {C}"); - } - - int ZoneNum = state.dataHeatBal->CrossMixing(Loop).ZonePtr; - if (ZoneNum == 0) { - print(state.files.eio, Format_722, "CrossMixing-Illegal Zone specified", state.dataHeatBal->CrossMixing(Loop).Name); - continue; - } - TotMixingFlow(ZoneNum) += state.dataHeatBal->CrossMixing(Loop).DesignLevel; - print(state.files.eio, - Format_720, - "CrossMixing", - state.dataHeatBal->CrossMixing(Loop).Name, - GetScheduleName(state, state.dataHeatBal->CrossMixing(Loop).SchedPtr), - state.dataHeatBal->Zone(ZoneNum).Name, - state.dataHeatBal->Zone(ZoneNum).FloorArea, - state.dataHeatBal->Zone(ZoneNum).TotOccupants); - - print(state.files.eio, "{:.3R},", state.dataHeatBal->CrossMixing(Loop).DesignLevel); - - divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).FloorArea, state.dataHeatBal->CrossMixing(Loop).DesignLevel); - divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).TotOccupants, state.dataHeatBal->CrossMixing(Loop).DesignLevel); - divide_and_print_if_greater_than_zero(state.dataHeatBal->Zone(ZoneNum).Volume, - state.dataHeatBal->CrossMixing(Loop).DesignLevel * DataGlobalConstants::SecInHour); - - print(state.files.eio, "{},", state.dataHeatBal->Zone(state.dataHeatBal->CrossMixing(Loop).FromZone).Name); - print(state.files.eio, "{:.2R}\n", state.dataHeatBal->CrossMixing(Loop).DeltaTemperature); - } - - if (state.dataHeatBal->TotRefDoorMixing > 0) { - static constexpr std::string_view Format_724("! <{} Airflow Stats Nominal>, {}\n"); - print(state.files.eio, - Format_724, - "RefrigerationDoorMixing ", - "Name, Zone 1 Name,Zone 2 Name,Door Opening Schedule Name,Door Height {m},Door Area {m2},Door Protection Type"); - for (ZoneNumA = 1; ZoneNumA <= (state.dataGlobal->NumOfZones - 1); ++ZoneNumA) { - if (!state.dataHeatBal->RefDoorMixing(ZoneNumA).RefDoorMixFlag) continue; - for (ConnectionNumber = 1; ConnectionNumber <= state.dataHeatBal->RefDoorMixing(ZoneNumA).NumRefDoorConnections; ++ConnectionNumber) { - ZoneNumB = state.dataHeatBal->RefDoorMixing(ZoneNumA).MateZonePtr(ConnectionNumber); - // TotMixingFlow(ZoneNum)=TotMixingFlow(ZoneNum)+RefDoorMixing(Loop)%!DesignLevel - static constexpr std::string_view Format_723(" {} Airflow Stats Nominal, {},{},{},{},{:.3R},{:.3R},{}\n"); - print(state.files.eio, - Format_723, - "RefrigerationDoorMixing", - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorMixingObjectName(ConnectionNumber), - state.dataHeatBal->Zone(ZoneNumA).Name, - state.dataHeatBal->Zone(ZoneNumB).Name, - GetScheduleName(state, state.dataHeatBal->RefDoorMixing(ZoneNumA).OpenSchedPtr(ConnectionNumber)), - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorHeight(ConnectionNumber), - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorArea(ConnectionNumber), - state.dataHeatBal->RefDoorMixing(ZoneNumA).DoorProtTypeName(ConnectionNumber)); - } // ConnectionNumber - } // ZoneNumA - } //(TotRefDoorMixing .GT. 0) - - for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - state.dataHeatBal->Zone(ZoneNum).NominalInfilVent = TotInfilVentFlow(ZoneNum); - state.dataHeatBal->Zone(ZoneNum).NominalMixing = TotMixingFlow(ZoneNum); - } - - if (state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance) { - // Check for infiltration in zone which are only a mixing source zone - for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - if ((state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment != DataHeatBalance::AdjustmentType::NoAdjustReturnAndMixing && - state.dataHeatBal->MassConservation(ZoneNum).IsOnlySourceZone) && - (state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment != DataHeatBalance::InfiltrationFlow::No)) { - if (state.dataHeatBal->MassConservation(ZoneNum).InfiltrationPtr == 0) { - ShowSevereError( - state, std::string{RoutineName} + ": Infiltration object is not defined for zone = " + state.dataHeatBal->Zone(ZoneNum).Name); - ShowContinueError(state, "Zone air mass flow balance requires infiltration object for source zones of mixing objects"); - } - } - } - // Set up zone air mass balance output variables - for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - SetupOutputVariable(state, - "Zone Air Mass Balance Supply Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->MassConservation(ZoneNum).InMassFlowRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneNum).Name); - SetupOutputVariable(state, - "Zone Air Mass Balance Exhaust Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->MassConservation(ZoneNum).ExhMassFlowRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneNum).Name); - SetupOutputVariable(state, - "Zone Air Mass Balance Return Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->MassConservation(ZoneNum).RetMassFlowRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneNum).Name); - if ((state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment != DataHeatBalance::AdjustmentType::NoAdjustReturnAndMixing) && - ((state.dataHeatBal->MassConservation(ZoneNum).NumSourceZonesMixingObject + - state.dataHeatBal->MassConservation(ZoneNum).NumReceivingZonesMixingObject) > 0)) { - SetupOutputVariable(state, - "Zone Air Mass Balance Mixing Receiving Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->MassConservation(ZoneNum).MixingMassFlowRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneNum).Name); - SetupOutputVariable(state, - "Zone Air Mass Balance Mixing Source Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->MassConservation(ZoneNum).MixingSourceMassFlowRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneNum).Name); - } - if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment != DataHeatBalance::InfiltrationFlow::No) { - if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationForZones == DataHeatBalance::InfiltrationZoneType::AllZones || - (state.dataHeatBal->MassConservation(ZoneNum).NumSourceZonesMixingObject > 0)) { - if (state.dataHeatBal->MassConservation(ZoneNum).InfiltrationPtr > 0) { - SetupOutputVariable(state, - "Zone Air Mass Balance Infiltration Mass Flow Rate", - OutputProcessor::Unit::kg_s, - state.dataHeatBal->MassConservation(ZoneNum).InfiltrationMassFlowRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneNum).Name); - SetupOutputVariable(state, - "Zone Air Mass Balance Infiltration Status", - OutputProcessor::Unit::None, - state.dataHeatBal->MassConservation(ZoneNum).IncludeInfilToZoneMassBal, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneNum).Name); - } - } - } - } - } - - TotInfilVentFlow.deallocate(); - TotMixingFlow.deallocate(); - // ' Area per Occupant {m2/person}, Occupant per Area {person/m2}, Interior Lighting {W/m2}, ', & - // 'Electric Load {W/m2}, Gas Load {W/m2}, Other Load {W/m2}, Hot Water Eq {W/m2}, Outdoor Controlled Baseboard Heat') -} - -void GetRoomAirModelParameters(EnergyPlusData &state, bool &errFlag) // True if errors found during this input routine -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN August 2001 - // MODIFIED na - // RE-ENGINEERED April 2003, Weixiu Kong - // December 2003, CC - - // PURPOSE OF THIS SUBROUTINE: - // Get room air model parameters for all zones at once - - // Using/Aliasing - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int NumAlphas; // States which alpha value to read from a - // "Number" line - int NumNumbers; // Number of numbers encountered - int Status; // Notes if there was an error in processing the input - int AirModelNum; - int NumOfAirModels; - int ZoneNum; - bool ErrorsFound; - bool IsNotOK; - - // Initialize default values for air model parameters - state.dataRoomAirMod->AirModel.allocate(state.dataGlobal->NumOfZones); - - ErrorsFound = false; - auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; - - cCurrentModuleObject = "RoomAirModelType"; - NumOfAirModels = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - if (NumOfAirModels > state.dataGlobal->NumOfZones) { - ShowSevereError(state, "Too many " + cCurrentModuleObject + ". Cannot exceed the number of Zones."); - ErrorsFound = true; - } - if (NumOfAirModels > 0) { - state.dataRoomAirMod->IsZoneDV.dimension(state.dataGlobal->NumOfZones, false); - state.dataRoomAirMod->IsZoneCV.dimension(state.dataGlobal->NumOfZones, false); - state.dataRoomAirMod->IsZoneUI.dimension(state.dataGlobal->NumOfZones, false); - } - - for (AirModelNum = 1; AirModelNum <= NumOfAirModels; ++AirModelNum) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - AirModelNum, - state.dataIPShortCut->cAlphaArgs, - NumAlphas, - state.dataIPShortCut->rNumericArgs, - NumNumbers, - Status, - _, - _, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - ZoneNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataHeatBal->Zone); - if (ZoneNum != 0) { - if (!state.dataRoomAirMod->AirModel(ZoneNum).AirModelName.empty()) { - ShowSevereError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(2) + " = " + state.dataIPShortCut->cAlphaArgs(2)); - ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1)); - ShowContinueError(state, "Duplicate zone name, only one type of roomair model is allowed per zone"); - ShowContinueError(state, - "Zone " + state.dataIPShortCut->cAlphaArgs(2) + " was already assigned a roomair model by " + cCurrentModuleObject + - " = " + state.dataRoomAirMod->AirModel(ZoneNum).AirModelName); - ShowContinueError(state, - format("Air Model Type for zone already set to {}", - DataRoomAirModel::ChAirModel[static_cast(state.dataRoomAirMod->AirModel(ZoneNum).AirModelType)])); - ShowContinueError(state, "Trying to overwrite with model type = " + state.dataIPShortCut->cAlphaArgs(3)); - ErrorsFound = true; - } - state.dataRoomAirMod->AirModel(ZoneNum).AirModelName = state.dataIPShortCut->cAlphaArgs(1); - state.dataRoomAirMod->AirModel(ZoneNum).ZoneName = state.dataIPShortCut->cAlphaArgs(2); - - state.dataRoomAirMod->AirModel(ZoneNum).AirModelType = - static_cast(getEnumerationValue(roomAirModelNamesUC, state.dataIPShortCut->cAlphaArgs(3))); - switch (state.dataRoomAirMod->AirModel(ZoneNum).AirModelType) { - case DataRoomAirModel::RoomAirModel::Mixing: - // nothing to do here actually - break; - - case DataRoomAirModel::RoomAirModel::Mundt: - state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; - state.dataRoomAirMod->MundtModelUsed = true; - IsNotOK = false; - ValidateComponent(state, - "RoomAirSettings:OneNodeDisplacementVentilation", - "zone_name", - state.dataIPShortCut->cAlphaArgs(2), - IsNotOK, - "GetRoomAirModelParameters"); - if (IsNotOK) { - ShowContinueError(state, "In " + cCurrentModuleObject + '=' + state.dataIPShortCut->cAlphaArgs(1) + '.'); - ErrorsFound = true; - } - break; - - case DataRoomAirModel::RoomAirModel::UCSDDV: - state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; - state.dataRoomAirMod->UCSDModelUsed = true; - IsNotOK = false; - ValidateComponent(state, - "RoomAirSettings:ThreeNodeDisplacementVentilation", - "zone_name", - state.dataIPShortCut->cAlphaArgs(2), - IsNotOK, - "GetRoomAirModelParameters"); - if (IsNotOK) { - ShowContinueError(state, "In " + cCurrentModuleObject + '=' + state.dataIPShortCut->cAlphaArgs(1) + '.'); - ErrorsFound = true; - } - break; - - case DataRoomAirModel::RoomAirModel::UCSDCV: - state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; - state.dataRoomAirMod->UCSDModelUsed = true; - IsNotOK = false; - ValidateComponent(state, - "RoomAirSettings:CrossVentilation", - "zone_name", - state.dataIPShortCut->cAlphaArgs(2), - IsNotOK, - "GetRoomAirModelParameters"); - if (IsNotOK) { - ShowContinueError(state, "In " + cCurrentModuleObject + '=' + state.dataIPShortCut->cAlphaArgs(1) + '.'); - ErrorsFound = true; - } - break; - - case DataRoomAirModel::RoomAirModel::UCSDUFI: - state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; - state.dataRoomAirMod->UCSDModelUsed = true; - ValidateComponent(state, - "RoomAirSettings:UnderFloorAirDistributionInterior", - "zone_name", - state.dataIPShortCut->cAlphaArgs(2), - IsNotOK, - "GetRoomAirModelParameters"); - if (IsNotOK) { - ShowContinueError(state, "In " + cCurrentModuleObject + '=' + state.dataIPShortCut->cAlphaArgs(1) + '.'); - ErrorsFound = true; - } - break; - - case DataRoomAirModel::RoomAirModel::UCSDUFE: - state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; - state.dataRoomAirMod->UCSDModelUsed = true; - ValidateComponent(state, - "RoomAirSettings:UnderFloorAirDistributionExterior", - "zone_name", - state.dataIPShortCut->cAlphaArgs(2), - IsNotOK, - "GetRoomAirModelParameters"); - if (IsNotOK) { - ShowContinueError(state, "In " + cCurrentModuleObject + '=' + state.dataIPShortCut->cAlphaArgs(1) + '.'); - ErrorsFound = true; - } - break; - - case DataRoomAirModel::RoomAirModel::UserDefined: - state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; - state.dataRoomAirMod->UserDefinedUsed = true; - break; - - case DataRoomAirModel::RoomAirModel::AirflowNetwork: - state.dataRoomAirMod->AirModel(ZoneNum).SimAirModel = true; - if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "AirflowNetwork:SimulationControl") == 0) { - ShowSevereError(state, - "In " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1) + ": " + - state.dataIPShortCut->cAlphaFieldNames(3) + " = AIRFLOWNETWORK."); - ShowContinueError(state, - "This model requires AirflowNetwork:* objects to form a complete network, including " - "AirflowNetwork:Intrazone:Node and AirflowNetwork:Intrazone:Linkage."); - ShowContinueError(state, "AirflowNetwork:SimulationControl not found."); - ErrorsFound = true; - } - break; - - default: - ShowWarningError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(3) + " = " + state.dataIPShortCut->cAlphaArgs(3)); - ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1)); - ShowContinueError(state, "The mixing air model will be used for Zone =" + state.dataIPShortCut->cAlphaArgs(2)); - state.dataRoomAirMod->AirModel(ZoneNum).AirModelType = DataRoomAirModel::RoomAirModel::Mixing; - } - - state.dataRoomAirMod->AirModel(ZoneNum).TempCoupleScheme = - static_cast(getEnumerationValue(couplingSchemeNamesUC, state.dataIPShortCut->cAlphaArgs(4))); - if (state.dataRoomAirMod->AirModel(ZoneNum).TempCoupleScheme == DataRoomAirModel::CouplingScheme::Invalid) { - ShowWarningError(state, "Invalid " + state.dataIPShortCut->cAlphaFieldNames(4) + " = " + state.dataIPShortCut->cAlphaArgs(4)); - ShowContinueError(state, "Entered in " + cCurrentModuleObject + " = " + state.dataIPShortCut->cAlphaArgs(1)); - ShowContinueError(state, "The direct coupling scheme will be used for Zone =" + state.dataIPShortCut->cAlphaArgs(2)); - state.dataRoomAirMod->AirModel(ZoneNum).TempCoupleScheme = DataRoomAirModel::CouplingScheme::Direct; - } - - } else { // Zone Not Found - ShowSevereError(state, cCurrentModuleObject + ", Zone not found=" + state.dataIPShortCut->cAlphaArgs(2)); - ShowContinueError(state, "occurs in " + cCurrentModuleObject + '=' + state.dataIPShortCut->cAlphaArgs(1)); - ErrorsFound = true; - } - } // AirModel_Param_Loop - - for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - // this used to be an if (NumOfAirModels == 0) block, but both the IF and the ELSE had the same content, these two lines: - state.dataRoomAirMod->AirModel(ZoneNum).AirModelName = "MIXING AIR MODEL FOR " + state.dataHeatBal->Zone(ZoneNum).Name; - state.dataRoomAirMod->AirModel(ZoneNum).ZoneName = state.dataHeatBal->Zone(ZoneNum).Name; - // set global flag for non-mixing model - if (state.dataRoomAirMod->AirModel(ZoneNum).AirModelType != DataRoomAirModel::RoomAirModel::Mixing) { - state.dataRoomAirMod->anyNonMixingRoomAirModel = true; - } - } - - // Write RoomAir Model details onto EIO file - static constexpr std::string_view RoomAirHeader("! , Zone Name, Mixing/Mundt/UCSDDV/UCSDCV/UCSDUFI/UCSDUFE/User Defined\n"); - print(state.files.eio, RoomAirHeader); - for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - { - static constexpr std::string_view RoomAirZoneFmt("RoomAir Model,{},{}\n"); - - switch (state.dataRoomAirMod->AirModel(ZoneNum).AirModelType) { - case DataRoomAirModel::RoomAirModel::Mixing: { - print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "Mixing/Well-Stirred"); - } break; - case DataRoomAirModel::RoomAirModel::Mundt: { - print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "OneNodeDisplacementVentilation"); - } break; - case DataRoomAirModel::RoomAirModel::UCSDDV: { - print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "ThreeNodeDisplacementVentilation"); - } break; - case DataRoomAirModel::RoomAirModel::UCSDCV: { - print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "CrossVentilation"); - } break; - case DataRoomAirModel::RoomAirModel::UCSDUFI: { - print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "UnderFloorAirDistributionInterior"); - } break; - case DataRoomAirModel::RoomAirModel::UCSDUFE: { - print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "UnderFloorAirDistributionExterior"); - } break; - case DataRoomAirModel::RoomAirModel::UserDefined: { - print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "UserDefined"); - } break; - case DataRoomAirModel::RoomAirModel::AirflowNetwork: { - print(state.files.eio, RoomAirZoneFmt, state.dataHeatBal->Zone(ZoneNum).Name, "AirflowNetwork"); - } break; - default: - break; - } - } - } - - if (ErrorsFound) { - ShowSevereError(state, "Errors found in processing input for " + cCurrentModuleObject); - errFlag = true; - } -} - -void InitAirHeatBalance(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Richard J. Liesen - // DATE WRITTEN February 1998 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine is for initializations within the - // air heat balance. - - // Do the Begin Day initializations - if (state.dataGlobal->BeginDayFlag) { - } - - // Do the following initializations (every time step): - InitSimpleMixingConvectiveHeatGains(state); -} - -void InitSimpleMixingConvectiveHeatGains(EnergyPlusData &state) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Richard Liesen - // DATE WRITTEN February 1998 - // MODIFIED March 2003, FCW: allow individual window/door venting control - // DATE MODIFIED April 2000 - // May 2009, Brent Griffith added EMS override to mixing and cross mixing flows - // renamed routine and did some cleanup - // August 2011, Therese Stovall added refrigeration door mixing flows - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine sets up the mixing and cross mixing flows - - using ScheduleManager::GetCurrentScheduleValue; - using ScheduleManager::GetScheduleIndex; - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int Loop; // local loop index - int NZ; // local index for zone number - int J; // local index for second zone in refrig door pair - - int ZoneNum; // zone counter - Real64 ZoneMixingFlowSum; // sum of zone mixing flows for a zone - int NumOfMixingObjects; // number of mixing objects for a receiving zone - - // Select type of airflow calculation - if (state.dataHeatBal->AirFlowFlag) { // Simplified airflow calculation - // Process the scheduled Mixing for air heat balance - for (Loop = 1; Loop <= state.dataHeatBal->TotMixing; ++Loop) { - NZ = state.dataHeatBal->Mixing(Loop).ZonePtr; - state.dataHeatBal->Mixing(Loop).DesiredAirFlowRate = - state.dataHeatBal->Mixing(Loop).DesignLevel * GetCurrentScheduleValue(state, state.dataHeatBal->Mixing(Loop).SchedPtr); - if (state.dataHeatBal->Mixing(Loop).EMSSimpleMixingOn) - state.dataHeatBal->Mixing(Loop).DesiredAirFlowRate = state.dataHeatBal->Mixing(Loop).EMSimpleMixingFlowRate; - state.dataHeatBal->Mixing(Loop).DesiredAirFlowRateSaved = state.dataHeatBal->Mixing(Loop).DesiredAirFlowRate; - } - - // if zone air mass flow balance enforced calculate the fraction of - // contribution of each mixing object to a zone mixed flow rate, BAN Feb 2014 - if (state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance) { - for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - ZoneMixingFlowSum = 0.0; - NumOfMixingObjects = state.dataHeatBal->MassConservation(ZoneNum).NumReceivingZonesMixingObject; - for (Loop = 1; Loop <= NumOfMixingObjects; ++Loop) { - ZoneMixingFlowSum = ZoneMixingFlowSum + state.dataHeatBal->Mixing(Loop).DesignLevel; - } - if (ZoneMixingFlowSum > 0.0) { - for (Loop = 1; Loop <= NumOfMixingObjects; ++Loop) { - state.dataHeatBal->MassConservation(ZoneNum).ZoneMixingReceivingFr(Loop) = - state.dataHeatBal->Mixing(Loop).DesignLevel / ZoneMixingFlowSum; - } - } - } - } - - // Process the scheduled CrossMixing for air heat balance - for (Loop = 1; Loop <= state.dataHeatBal->TotCrossMixing; ++Loop) { - NZ = state.dataHeatBal->CrossMixing(Loop).ZonePtr; - state.dataHeatBal->CrossMixing(Loop).DesiredAirFlowRate = - state.dataHeatBal->CrossMixing(Loop).DesignLevel * GetCurrentScheduleValue(state, state.dataHeatBal->CrossMixing(Loop).SchedPtr); - if (state.dataHeatBal->CrossMixing(Loop).EMSSimpleMixingOn) - state.dataHeatBal->CrossMixing(Loop).DesiredAirFlowRate = state.dataHeatBal->CrossMixing(Loop).EMSimpleMixingFlowRate; - } - - // Note - do each Pair a Single time, so must do increment reports for both zones - // Can't have a pair that has ZoneA zone number = NumOfZones because organized - // in input with lowest zone # first no matter how input in idf - - // Process the scheduled Refrigeration Door mixing for air heat balance - if (state.dataHeatBal->TotRefDoorMixing > 0) { - for (NZ = 1; NZ <= (state.dataGlobal->NumOfZones - 1); - ++NZ) { // Can't have %ZonePtr==NumOfZones because lesser zone # of pair placed in ZonePtr in input - if (!state.dataHeatBal->RefDoorMixing(NZ).RefDoorMixFlag) continue; - if (state.dataHeatBal->RefDoorMixing(NZ).ZonePtr == NZ) { - for (J = 1; J <= state.dataHeatBal->RefDoorMixing(NZ).NumRefDoorConnections; ++J) { - state.dataHeatBal->RefDoorMixing(NZ).VolRefDoorFlowRate(J) = 0.0; - if (state.dataHeatBal->RefDoorMixing(NZ).EMSRefDoorMixingOn(J)) - state.dataHeatBal->RefDoorMixing(NZ).VolRefDoorFlowRate(J) = state.dataHeatBal->RefDoorMixing(NZ).EMSRefDoorFlowRate(J); - } - } - } - } // TotRefDoorMixing - - // Infiltration and ventilation calculations have been moved to a subroutine of CalcAirFlowSimple in HVAC Manager - } -} - -void CalcHeatBalanceAir(EnergyPlusData &state) -{ - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine calculates the air component of the heat balance. - - if (state.dataGlobal->externalHVACManager) { - if (!state.dataGlobal->externalHVACManagerInitialized) { - initializeForExternalHVACManager(state); - } - state.dataGlobal->externalHVACManager(&state); - } else { - HVACManager::ManageHVAC(state); - } -} - -// END Algorithm Section of the Module - -void initializeForExternalHVACManager(EnergyPlusData &state) -{ - // this function will ultimately provide a nice series of calls that initialize all the hvac stuff needed - // to allow an external hvac manager to play nice with E+ - EnergyPlus::ZoneTempPredictorCorrector::InitZoneAirSetPoints(state); - if (!state.dataZoneEquip->ZoneEquipInputsFilled) { - EnergyPlus::DataZoneEquipment::GetZoneEquipmentData(state); - state.dataZoneEquip->ZoneEquipInputsFilled = true; - } -} - -void ReportZoneMeanAirTemp(EnergyPlusData &state) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN July 2000 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine updates the report variables for the AirHeatBalance. - - // Using/Aliasing - using Psychrometrics::PsyTdpFnWPb; - using ScheduleManager::GetCurrentScheduleValue; - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int ZoneLoop; // Counter for the # of zones (nz) - int TempControlledZoneID; // index for zone in TempConrolled Zone structure - Real64 thisMRTFraction; // temp working value for radiative fraction/weight - - for (ZoneLoop = 1; ZoneLoop <= state.dataGlobal->NumOfZones; ++ZoneLoop) { - auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneLoop); - // The mean air temperature is actually ZTAV which is the average - // temperature of the air temperatures at the system time step for the - // entire zone time step. - state.dataHeatBal->ZnAirRpt(ZoneLoop).MeanAirTemp = thisZoneHB.ZTAV; - state.dataHeatBal->ZnAirRpt(ZoneLoop).MeanAirHumRat = thisZoneHB.ZoneAirHumRatAvg; - state.dataHeatBal->ZnAirRpt(ZoneLoop).OperativeTemp = 0.5 * (thisZoneHB.ZTAV + state.dataHeatBal->ZoneMRT(ZoneLoop)); - state.dataHeatBal->ZnAirRpt(ZoneLoop).MeanAirDewPointTemp = - PsyTdpFnWPb(state, state.dataHeatBal->ZnAirRpt(ZoneLoop).MeanAirHumRat, state.dataEnvrn->OutBaroPress); - - // if operative temperature control is being used, then radiative fraction/weighting - // might be defined by user to be something different than 0.5, even scheduled over simulation period - if (state.dataZoneCtrls->AnyOpTempControl) { // dig further... - // find TempControlledZoneID from ZoneLoop index - TempControlledZoneID = state.dataHeatBal->Zone(ZoneLoop).TempControlledZoneIndex; - if (state.dataHeatBal->Zone(ZoneLoop).IsControlled) { - if ((state.dataZoneCtrls->TempControlledZone(TempControlledZoneID).OperativeTempControl)) { - // is operative temp radiative fraction scheduled or fixed? - if (state.dataZoneCtrls->TempControlledZone(TempControlledZoneID).OpTempCntrlModeScheduled) { - thisMRTFraction = GetCurrentScheduleValue( - state, state.dataZoneCtrls->TempControlledZone(TempControlledZoneID).OpTempRadiativeFractionSched); - } else { - thisMRTFraction = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID).FixedRadiativeFraction; - } - state.dataHeatBal->ZnAirRpt(ZoneLoop).ThermOperativeTemp = - (1.0 - thisMRTFraction) * thisZoneHB.ZTAV + thisMRTFraction * state.dataHeatBal->ZoneMRT(ZoneLoop); - } - } - } - } -} - -} // namespace EnergyPlus::HeatBalanceAirManager diff --git a/src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceManager.cc b/src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceManager.cc deleted file mode 100644 index 65bf5c190c4..00000000000 --- a/src/EnergyPlus/ForceSpaceHeatBalance/HeatBalanceManager.cc +++ /dev/null @@ -1,10278 +0,0 @@ -// EnergyPlus, Copyright (c) 1996-2022, The Board of Trustees of the University of Illinois, -// The Regents of the University of California, through Lawrence Berkeley National Laboratory -// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge -// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other -// contributors. All rights reserved. -// -// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the -// U.S. Government consequently retains certain rights. As such, the U.S. Government has been -// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, -// worldwide license in the Software to reproduce, distribute copies to the public, prepare -// derivative works, and perform publicly and display publicly, and to permit others to do so. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted -// provided that the following conditions are met: -// -// (1) Redistributions of source code must retain the above copyright notice, this list of -// conditions and the following disclaimer. -// -// (2) Redistributions in binary form must reproduce the above copyright notice, this list of -// conditions and the following disclaimer in the documentation and/or other materials -// provided with the distribution. -// -// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, -// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be -// used to endorse or promote products derived from this software without specific prior -// written permission. -// -// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form -// without changes from the version obtained under this License, or (ii) Licensee makes a -// reference solely to the software portion of its product, Licensee must refer to the -// software as "EnergyPlus version X" software, where "X" is the version number Licensee -// obtained under this License and may not use a different name for the software. Except as -// specifically required in this Section (4), Licensee shall not use in a company name, a -// product name, in advertising, publicity, or other promotional activities any name, trade -// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly -// similar designation, without the U.S. Department of Energy's prior written consent. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -// C++ Headers -#include -#include -#include - -// ObjexxFCL Headers -#include -#include -#include -#include -#include - -// EnergyPlus Headers -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace EnergyPlus { - -namespace HeatBalanceManager { - - // Module containing the heat balance simulation routines - // calculation (initialization) routines - - // MODULE INFORMATION: - // AUTHOR Richard J. Liesen - // DATE WRITTEN February 1998 - // MODIFIED November 1998, FW - // MODIFIED April 1999, LKL - // MODIFIED Dec 2006 DJS of PSU for ecoroof - // Added Dec 2008 TH for thermochromic windows: - // new subroutine CreateTCConstructions called by GetHeatBalanceInput - // RE-ENGINEERED na - - // PURPOSE OF THIS MODULE: - // To encapsulate the data and algorithms required to - // manage the heat balance simulation on the building. - - // METHODOLOGY EMPLOYED: - - // REFERENCES: - // The heat balance method is outlined in the "Tarp Algorithms Manual" - // The methods are also summarized in many BSO Theses and papers. - - // OTHER NOTES: - // This module was created from IBLAST subroutines - - // USE STATEMENTS: - // Use statements for data only modules - // Using/Aliasing - using namespace DataComplexFenestration; - using namespace DataEnvironment; - using namespace DataHeatBalance; - using namespace DataHeatBalSurface; - using namespace DataRoomAirModel; - using DataSurfaces::FrameDividerProperties; - using ScheduleManager::GetCurrentScheduleValue; - using ScheduleManager::GetScheduleIndex; - using WindowComplexManager::CalculateBasisLength; - using WindowManager::W5LsqFit; - - Array1D_string const PassFail(2, {"Fail", "Pass"}); - - void ManageHeatBalance(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Rick Strand - // DATE WRITTEN January 1997 - // MODIFIED February 1998 Richard Liesen - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine manages the heat balance method of calculating - // building thermal loads. It is called from the SimulationManager - // at the time step level. This driver manages the calls to all of - // the other modules, drivers, and simulation algorithms. - - // METHODOLOGY EMPLOYED: - // The order of this routine was taken from HeatBalanceModule with routine - // and Data Structuring - - // REFERENCES: - // Legacy code from (I)BLAST, subroutine SIMZGD. - - // Using/Aliasing - using namespace HeatBalanceSurfaceManager; - using EMSManager::ManageEMS; - using EMSManager::UpdateEMSTrendVariables; - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - // na - - // SUBROUTINE PARAMETER DEFINITIONS: - // na - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - - // Get the heat balance input at the beginning of the simulation only - if (state.dataHeatBalMgr->ManageHeatBalanceGetInputFlag) { - GetHeatBalanceInput(state); // Obtains heat balance related parameters from input file - // if (state.dataGlobal->DoingSizing) state.dataHeatBal->doSpaceHeatBalance = state.dataHeatBal->doSpaceHeatBalanceSizing; - state.dataHeatBal->doSpaceHeatBalance = true; - HeatBalanceIntRadExchange::InitSolarViewFactors(state); - - // Surface octree setup - // The surface octree holds live references to surfaces so it must be updated - // if in the future surfaces are altered after this point - if (state.dataSurface->TotSurfaces >= DaylightingManager::octreeCrossover) { // Octree can be active - if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Daylighting:Controls") > 0) { // Daylighting is active - state.dataHeatBalMgr->surfaceOctree.init(state.dataSurface->Surface); // Set up surface octree - } - } - - for (auto &surface : state.dataSurface->Surface) - surface.set_computed_geometry(); // Set up extra surface geometry info for PierceSurface - - state.dataHeatBalMgr->ManageHeatBalanceGetInputFlag = false; - } - - bool anyRan; - - ManageEMS(state, - EMSManager::EMSCallFrom::BeginZoneTimestepBeforeInitHeatBalance, - anyRan, - ObjexxFCL::Optional_int_const()); // EMS calling point - - // These Inits will still have to be looked at as the routines are re-engineered further - - InitHeatBalance(state); // Initialize all heat balance related parameters - ManageEMS( - state, EMSManager::EMSCallFrom::BeginZoneTimestepAfterInitHeatBalance, anyRan, ObjexxFCL::Optional_int_const()); // EMS calling point - - // Solve the zone heat balance by first calling the Surface Heat Balance Manager - // and then the Air Heat Balance Manager is called by the Surface Heat Balance - // Manager. The order of execution is still important and the zone cannot - // go through any record keeping before the HVAC system has run because there - // may be a radiant system in the building which will require iteration between - // the HVAC system (called from the Air Heat Balance) and the zone (simulated - // in the Surface Heat Balance Manager). In the future, this may be improved. - ManageSurfaceHeatBalance(state); - ManageEMS(state, EMSManager::EMSCallFrom::EndZoneTimestepBeforeZoneReporting, anyRan, ObjexxFCL::Optional_int_const()); // EMS calling point - RecKeepHeatBalance(state); // Do any heat balance related record keeping - - // This call has been moved to the FanSystemModule and does effect the output file - // You do get a shift in the Air Handling System Summary for the building electric loads - // IF ((.NOT.WarmupFlag).AND.(DayOfSim.GT.0)) CALL RCKEEP ! Do fan system accounting (to be moved later) - - ReportHeatBalance(state); // Manage heat balance reporting until the new reporting is in place - - ManageEMS(state, EMSManager::EMSCallFrom::EndZoneTimestepAfterZoneReporting, anyRan, ObjexxFCL::Optional_int_const()); // EMS calling point - - UpdateEMSTrendVariables(state); - EnergyPlus::PluginManagement::PluginManager::updatePluginValues(state); - - if (state.dataGlobal->WarmupFlag && state.dataGlobal->EndDayFlag) { - - CheckWarmupConvergence(state); - if (!state.dataGlobal->WarmupFlag) { - state.dataGlobal->DayOfSim = 0; // Reset DayOfSim if Warmup converged - state.dataGlobal->DayOfSimChr = "0"; - - ManageEMS(state, EMSManager::EMSCallFrom::BeginNewEnvironmentAfterWarmUp, anyRan, ObjexxFCL::Optional_int_const()); // calling point - } - } - - if (!state.dataGlobal->WarmupFlag && state.dataGlobal->EndDayFlag && state.dataGlobal->DayOfSim == 1 && !state.dataGlobal->DoingSizing) { - ReportWarmupConvergence(state); - } - } - - // Get Input Section of the Module - //****************************************************************************** - - void GetHeatBalanceInput(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Rick Strand - // DATE WRITTEN September 1997 - // MODIFIED February 1998 Richard Liesen - // November 1998 FW - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine is the main driver for initializations within the - // heat balance. - - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - - // Using/Aliasing - using InternalHeatGains::ManageInternalHeatGains; - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - // na - - // SUBROUTINE PARAMETER DEFINITIONS: - // na - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - bool ErrorsFound(false); // If errors detected in input - bool ValidSimulationWithNoZones; - - GetProjectControlData(state, ErrorsFound); - - GetSiteAtmosphereData(state, ErrorsFound); - - GetWindowGlassSpectralData(state, ErrorsFound); - - GetMaterialData(state, ErrorsFound); // Read materials from input file/transfer from legacy data structure - - GetFrameAndDividerData(state, ErrorsFound); - - GetConstructData(state, ErrorsFound); // Read constructs from input file/transfer from legacy data structure - - GetBuildingData(state, ErrorsFound); // Read building data from input file - - GetIncidentSolarMultiplier(state, ErrorsFound); - - // Added SV 6/26/2013 to load scheduled surface gains - GetScheduledSurfaceGains(state, ErrorsFound); - - if (state.dataSurface->UseRepresentativeSurfaceCalculations) { - print(state.files.eio, "{}\n", "! ,Surface Name,Representative Surface Name"); - for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) { - auto &RepSurfNum = state.dataSurface->Surface(SurfNum).RepresentativeCalcSurfNum; - if (SurfNum != RepSurfNum) { - print(state.files.eio, - " Representative Surface Assignment,{},{}\n", - state.dataSurface->Surface(SurfNum).Name, - state.dataSurface->Surface(RepSurfNum).Name); - } - } - } - - // Added TH 1/9/2009 to create thermochromic window constructions - CreateTCConstructions(state, ErrorsFound); - - if (state.dataSurface->TotSurfaces > 0 && state.dataGlobal->NumOfZones == 0) { - ValidSimulationWithNoZones = CheckValidSimulationObjects(state); - if (!ValidSimulationWithNoZones) { - ShowSevereError(state, "GetHeatBalanceInput: There are surfaces in input but no zones found. Invalid simulation."); - ErrorsFound = true; - } - } - - CheckUsedConstructions(state, ErrorsFound); - - if (ErrorsFound) { - ShowFatalError(state, "Errors found in Building Input, Program Stopped"); - } - - // following is done to "get internal heat gains" input so that lights are gotten before - // daylighting input - ManageInternalHeatGains(state, true); - - // following is done so that people are gotten before for thermal comfort calculations - // Setup Kiva instances - if (state.dataHeatBal->AnyKiva) { - state.dataSurfaceGeometry->kivaManager.setupKivaInstances(state); - } - } - - void CheckUsedConstructions(EnergyPlusData &state, bool &ErrorsFound) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN August 2011 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // Counts or details unused constructions. - - // Using/Aliasing - - // SUBROUTINE PARAMETER DEFINITIONS: - int constexpr NumConstrObjects(6); - Array1D_string const ConstrObjects(NumConstrObjects, - {"Pipe:Indoor", - "Pipe:Outdoor", - "Pipe:Underground", - "GroundHeatExchanger:Surface", - "DaylightingDevice:Tubular", - "EnergyManagementSystem:ConstructionIndexVariable"}); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int Unused; - int Loop; - int NumObjects; - int NumAlphas; - int NumNumbers; - int Status; - int CNum; - int ONum; - bool InErrFlag; // Preserve (no current use) the input status of ErrorsFound - - InErrFlag = ErrorsFound; - - // Needs to account for Pipe:HeatTransfer/indoor, etc constructions. - for (ONum = 1; ONum <= NumConstrObjects; ++ONum) { - NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, ConstrObjects(ONum)); - for (Loop = 1; Loop <= NumObjects; ++Loop) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - ConstrObjects(ONum), - Loop, - state.dataIPShortCut->cAlphaArgs, - NumAlphas, - state.dataIPShortCut->rNumericArgs, - NumNumbers, - Status); - if (ONum == 5) { - CNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(4), state.dataConstruction->Construct); - } else { - CNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataConstruction->Construct); - } - if (CNum == 0) continue; - state.dataConstruction->Construct(CNum).IsUsed = true; - if (ONum == 4 || ONum == 6) { - // GroundHeatExchanger:Surface or EnergyManagementSystem:ConstructionIndexVariable - // Include all EMS constructions since they can potentially be used by a CTF surface - if (!state.dataConstruction->Construct(CNum).TypeIsWindow) { - state.dataConstruction->Construct(CNum).IsUsedCTF = true; - } - } - } - } - Unused = state.dataHeatBal->TotConstructs - std::count_if(state.dataConstruction->Construct.begin(), - state.dataConstruction->Construct.end(), - [](Construction::ConstructionProps const &e) { return e.IsUsed; }); - if (Unused > 0) { - if (!state.dataGlobal->DisplayExtraWarnings) { - ShowWarningError(state, format("CheckUsedConstructions: There are {} nominally unused constructions in input.", Unused)); - ShowContinueError(state, "For explicit details on each unused construction, use Output:Diagnostics,DisplayExtraWarnings;"); - } else { - ShowWarningError(state, format("CheckUsedConstructions: There are {} nominally unused constructions in input.", Unused)); - ShowContinueError(state, "Each Unused construction is shown."); - for (Loop = 1; Loop <= state.dataHeatBal->TotConstructs; ++Loop) { - if (state.dataConstruction->Construct(Loop).IsUsed) continue; - ShowMessage(state, "Construction=" + state.dataConstruction->Construct(Loop).Name); - } - } - } - } - - bool CheckValidSimulationObjects(EnergyPlusData &state) - { - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN July 2008 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS FUNCTION: - // If an input file presents with surfaces but no zones, there are certain objects - // that must be present for the simulation to be valid. This check was necessitated by - // an input file that was entirely detached shading surfaces but no zones (and nothing else). - // Other objects include Solar Collectors, PV arrays. - - // METHODOLOGY EMPLOYED: - // Check for specific objects that must be present for such a simulation to be valid. - - // Return value - bool ValidSimulation; // True is other objects appear to make this a valid simulation. - - ValidSimulation = false; - if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SolarCollector:FlatPlate:Water") > 0) { - ValidSimulation = true; - } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:Photovoltaic") > 0) { - ValidSimulation = true; - } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:InternalCombustionEngine") > 0) { - ValidSimulation = true; - } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:CombustionTurbine") > 0) { - ValidSimulation = true; - } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:FuelCell") > 0) { - ValidSimulation = true; - } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:MicroCHP") > 0) { - ValidSimulation = true; - } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:MicroTurbine") > 0) { - ValidSimulation = true; - } else if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Generator:WindTurbine") > 0) { - ValidSimulation = true; - } - - return ValidSimulation; - } - - void SetPreConstructionInputParameters(EnergyPlusData &state) - { - // SUBROUTINE INFORMATION: - // AUTHOR Edwin Lee - // DATE WRITTEN October 2014 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine sets parameters that need to be established before any heat balance inputs are read - - int NumAlpha; - int NumNumber; - int IOStat; - - // Get all the construction objects to determine the max layers and use this as the value for DataHeatBalance::MaxSolidWinLayers - // The variable MaxSolidWinLayers is initialized to zero to immediately catch any issues with timing of this routine - - // start by setting this to 5; it will satisfy the regular window constructions (Construction) and the Window5 files - // (Construction:WindowDataFile) - state.dataHeatBal->MaxSolidWinLayers = 7; - - // Construction:ComplexFenestrationState have a limit of 10 layers, so set it up to 10 if they are present - if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:ComplexFenestrationState") > 0) { - state.dataHeatBal->MaxSolidWinLayers = max(state.dataHeatBal->MaxSolidWinLayers, 10); - } - - // then process the rest of the relevant constructions - std::string constructName("Construction:WindowEquivalentLayer"); - int numConstructions(state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, constructName)); - for (int constructionNum = 1; constructionNum <= numConstructions; ++constructionNum) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - constructName, - constructionNum, - state.dataIPShortCut->cAlphaArgs, - NumAlpha, - state.dataIPShortCut->rNumericArgs, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - int numLayersInThisConstruct(NumAlpha - 1); - state.dataHeatBal->MaxSolidWinLayers = max(state.dataHeatBal->MaxSolidWinLayers, numLayersInThisConstruct); - } - - // construction types being ignored as they are opaque: Construction:CfactorUndergroundWall, Construction:FfactorGroundFloor, - } - - void GetProjectControlData(EnergyPlusData &state, bool &ErrorsFound) // Set to true if errors detected during getting data - { - - // SUBROUTINE INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN October 2004 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine gets the project control data before the rest of the building data (such as - // materials) is obtained. - - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // This routine gets the following objects: - // BUILDING - // INSIDE CONVECTION ALGORITHM - // OUTSIDE CONVECTION ALGORITHM - // SOLUTION ALGORITHM - // ASHRAE Handbook of Fundamentals, Chap 16, for the setting of Site Atmospheric defaults based - // on terrain. - // ZoneAirHeatBalanceAlgorithm, Added by L. Gu, 12/09 - // ZoneAirContaminantBalance, Added by L. Gu, 06/10 - - // Using/Aliasing - auto &HVACSystemRootFinding = state.dataRootFinder->HVACSystemRootFinding; - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - - // SUBROUTINE PARAMETER DEFINITIONS: - constexpr const char *RoutineName("GetProjectControlData: "); - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Array1D_string AlphaName(4); - Array1D BuildingNumbers(5); - int NumAlpha; - int NumNumber; - int IOStat; - int NumObjects; - std::string::size_type TMP; - - // Assign the values to the building data - - state.dataHeatBalMgr->CurrentModuleObject = "Building"; - NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); - - if (NumObjects > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - 1, - AlphaName, - NumAlpha, - BuildingNumbers, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - // Building Name (remove certain characters) - state.dataHeatBal->BuildingName = AlphaName(1); - TMP = index(state.dataHeatBal->BuildingName, char(1)); - while (TMP != std::string::npos) { - state.dataHeatBal->BuildingName[TMP] = ','; - TMP = index(state.dataHeatBal->BuildingName, char(1)); - } - TMP = index(state.dataHeatBal->BuildingName, char(2)); - while (TMP != std::string::npos) { - state.dataHeatBal->BuildingName[TMP] = '!'; - TMP = index(state.dataHeatBal->BuildingName, char(2)); - } - TMP = index(state.dataHeatBal->BuildingName, char(3)); - while (TMP != std::string::npos) { - state.dataHeatBal->BuildingName[TMP] = '\\'; - TMP = index(state.dataHeatBal->BuildingName, char(3)); - } - // Building Azimuth (no validation) - state.dataHeatBal->BuildingAzimuth = mod(BuildingNumbers(1), 360.0); - // Terrain - if (AlphaName(2) == "COUNTRY" || AlphaName(2) == "1") { - state.dataEnvrn->SiteWindExp = 0.14; - state.dataEnvrn->SiteWindBLHeight = 270.0; - AlphaName(2) = "Country"; - } else if (AlphaName(2) == "SUBURBS" || AlphaName(2) == "2" || AlphaName(2) == "SUBURB") { - state.dataEnvrn->SiteWindExp = 0.22; - state.dataEnvrn->SiteWindBLHeight = 370.0; - AlphaName(2) = "Suburbs"; - } else if (AlphaName(2) == "CITY" || AlphaName(2) == "3") { - state.dataEnvrn->SiteWindExp = 0.33; - state.dataEnvrn->SiteWindBLHeight = 460.0; - AlphaName(2) = "City"; - } else if (AlphaName(2) == "OCEAN") { - state.dataEnvrn->SiteWindExp = 0.10; - state.dataEnvrn->SiteWindBLHeight = 210.0; - AlphaName(2) = "Ocean"; - } else if (AlphaName(2) == "URBAN") { - state.dataEnvrn->SiteWindExp = 0.22; - state.dataEnvrn->SiteWindBLHeight = 370.0; - AlphaName(2) = "Urban"; - } else { - ShowSevereError(state, - std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + ": " + - state.dataIPShortCut->cAlphaFieldNames(2) + " invalid=" + AlphaName(2)); - state.dataEnvrn->SiteWindExp = 0.14; - state.dataEnvrn->SiteWindBLHeight = 270.0; - AlphaName(2) = AlphaName(2) + "-invalid"; - ErrorsFound = true; - } - // Loads Convergence Tolerance Value - state.dataHeatBal->LoadsConvergTol = BuildingNumbers(2); - if (state.dataHeatBal->LoadsConvergTol <= 0.0) { - ShowSevereError(state, - format("{}{}: {} value invalid, [{:.3R}]", - RoutineName, - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cNumericFieldNames(2), - state.dataHeatBal->LoadsConvergTol)); - ErrorsFound = true; - } - // Temperature Convergence Tolerance Value - state.dataHeatBal->TempConvergTol = BuildingNumbers(3); - if (state.dataHeatBal->TempConvergTol <= 0.0) { - ShowSevereError(state, - format("{}{}: {} value invalid, [{:.3R}]", - RoutineName, - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cNumericFieldNames(3), - state.dataHeatBal->TempConvergTol)); - ErrorsFound = true; - } - // Solar Distribution - if (has_prefix(AlphaName(3), "MIN") || AlphaName(3) == "-1" || state.dataSysVars->lMinimalShadowing) { - state.dataHeatBal->SolarDistribution = DataHeatBalance::Shadowing::Minimal; - AlphaName(3) = "MinimalShadowing"; - state.dataSurface->CalcSolRefl = false; - } else if (AlphaName(3) == "FULLEXTERIOR" || AlphaName(3) == "0") { - state.dataHeatBal->SolarDistribution = DataHeatBalance::Shadowing::FullExterior; - AlphaName(3) = "FullExterior"; - state.dataSurface->CalcSolRefl = false; - } else if (AlphaName(3) == "FULLINTERIORANDEXTERIOR" || AlphaName(3) == "1") { - state.dataHeatBal->SolarDistribution = DataHeatBalance::Shadowing::FullInteriorExterior; - AlphaName(3) = "FullInteriorAndExterior"; - state.dataSurface->CalcSolRefl = false; - } else if (AlphaName(3) == "FULLEXTERIORWITHREFLECTIONS") { - state.dataHeatBal->SolarDistribution = DataHeatBalance::Shadowing::FullExterior; - AlphaName(3) = "FullExteriorWithReflectionsFromExteriorSurfaces"; - state.dataSurface->CalcSolRefl = true; - } else if (AlphaName(3) == "FULLINTERIORANDEXTERIORWITHREFLECTIONS") { - state.dataHeatBal->SolarDistribution = DataHeatBalance::Shadowing::FullInteriorExterior; - AlphaName(3) = "FullInteriorAndExteriorWithReflectionsFromExteriorSurfaces"; - state.dataSurface->CalcSolRefl = true; - } else { - ShowSevereError(state, - std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + ": " + - state.dataIPShortCut->cAlphaFieldNames(3) + " invalid=" + AlphaName(3)); - ErrorsFound = true; - AlphaName(3) = AlphaName(3) + "-invalid"; - } - // Maximum Number of Warmup Days - if (!state.dataIPShortCut->lNumericFieldBlanks(4)) { - state.dataHeatBal->MaxNumberOfWarmupDays = BuildingNumbers(4); - if (state.dataHeatBal->MaxNumberOfWarmupDays <= 0) { - ShowSevereError(state, - format("{}{}: {} invalid, [{}], {} will be used", - RoutineName, - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cNumericFieldNames(4), - state.dataHeatBal->MaxNumberOfWarmupDays, - DefaultMaxNumberOfWarmupDays)); - state.dataHeatBal->MaxNumberOfWarmupDays = DefaultMaxNumberOfWarmupDays; - } - } else { - state.dataHeatBal->MaxNumberOfWarmupDays = DefaultMaxNumberOfWarmupDays; - } - // Minimum Number of Warmup Days - if (!state.dataIPShortCut->lNumericFieldBlanks(5)) { - state.dataHeatBal->MinNumberOfWarmupDays = BuildingNumbers(5); - if (state.dataHeatBal->MinNumberOfWarmupDays <= 0) { - ShowWarningError(state, - format("{}{}: {} invalid, [{}], {} will be used", - RoutineName, - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cNumericFieldNames(5), - state.dataHeatBal->MinNumberOfWarmupDays, - DefaultMinNumberOfWarmupDays)); - state.dataHeatBal->MinNumberOfWarmupDays = DefaultMinNumberOfWarmupDays; - } - } else { - state.dataHeatBal->MinNumberOfWarmupDays = DefaultMinNumberOfWarmupDays; - } - if (state.dataHeatBal->MinNumberOfWarmupDays > state.dataHeatBal->MaxNumberOfWarmupDays) { - ShowWarningError(state, - format("{}{}: {} [{}] is greater than {} [{}], {} will be used.", - RoutineName, - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cNumericFieldNames(5), - state.dataHeatBal->MinNumberOfWarmupDays, - state.dataIPShortCut->cNumericFieldNames(4), - state.dataHeatBal->MaxNumberOfWarmupDays, - state.dataHeatBal->MinNumberOfWarmupDays)); - state.dataHeatBal->MaxNumberOfWarmupDays = state.dataHeatBal->MinNumberOfWarmupDays; - } - - } else { - ShowSevereError(state, format("{} A {} Object must be entered.", RoutineName, state.dataHeatBalMgr->CurrentModuleObject)); - ErrorsFound = true; - state.dataHeatBal->BuildingName = "NOT ENTERED"; - AlphaName(2) = "NOT ENTERED"; - AlphaName(3) = "NOT ENTERED"; - state.dataHeatBal->MaxNumberOfWarmupDays = DefaultMaxNumberOfWarmupDays; - state.dataHeatBal->MinNumberOfWarmupDays = DefaultMinNumberOfWarmupDays; - } - - constexpr const char *Format_720(" Building Information,{},{:.3R},{},{:.5R},{:.5R},{},{},{}\n"); - constexpr const char *Format_721("! , Building Name,North Axis {{deg}},Terrain, Loads Convergence Tolerance " - "Value,Temperature Convergence Tolerance Value, Solar Distribution,Maximum Number of Warmup Days,Minimum " - "Number of Warmup Days\n"); - // Write Building Information to the initialization output file - print(state.files.eio, Format_721); - print(state.files.eio, - Format_720, - state.dataHeatBal->BuildingName, - state.dataHeatBal->BuildingAzimuth, - AlphaName(2), - state.dataHeatBal->LoadsConvergTol, - state.dataHeatBal->TempConvergTol, - AlphaName(3), - state.dataHeatBal->MaxNumberOfWarmupDays, - state.dataHeatBal->MinNumberOfWarmupDays); - // Above should be validated... - - state.dataHeatBalMgr->CurrentModuleObject = "SurfaceConvectionAlgorithm:Inside"; - NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); - if (NumObjects > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - 1, - AlphaName, - NumAlpha, - BuildingNumbers, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - - { - auto const SELECT_CASE_var(AlphaName(1)); - - if (SELECT_CASE_var == "SIMPLE") { - state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_ASHRAESimple; - AlphaName(1) = "Simple"; - - } else if ((SELECT_CASE_var == "TARP")) { - state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_ASHRAETARP; - AlphaName(1) = "TARP"; - - } else if (SELECT_CASE_var == "CEILINGDIFFUSER") { - state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_CeilingDiffuser; - AlphaName(1) = "CeilingDiffuser"; - - } else if (SELECT_CASE_var == "TROMBEWALL") { - state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_TrombeWall; - ShowSevereError(state, - "GetInsideConvectionAlgorithm: TrombeWall has been used as a global definition. This is a zone oriented value. " - "Will be illegal in the future."); - AlphaName(1) = "TrombeWall"; - - } else if (SELECT_CASE_var == "ADAPTIVECONVECTIONALGORITHM") { - state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_AdaptiveConvectionAlgorithm; - AlphaName(1) = "AdaptiveConvectionAlgorithm"; - - } else if (SELECT_CASE_var == "ASTMC1340") { - state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_ASTMC1340; - AlphaName(1) = "ASTMC1340"; - - } else { - ShowWarningError(state, - "GetInsideConvectionAlgorithm: Invalid value for " + state.dataHeatBalMgr->CurrentModuleObject + - ", defaulting to TARP, invalid value=" + AlphaName(1)); - state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_ASHRAETARP; - AlphaName(1) = "TARP"; - } - } - } else { - // default value, if not specified - state.dataHeatBal->DefaultInsideConvectionAlgo = ConvectionConstants::HcInt_ASHRAETARP; - AlphaName(1) = "TARP"; - } - constexpr const char *Format_722("! , Algorithm {{Simple | TARP | CeilingDiffuser | " - "AdaptiveConvectionAlgorithm}}\nInside Convection Algorithm,{}\n"); - print(state.files.eio, Format_722, AlphaName(1)); - - // Get only the first (if more were input) - state.dataHeatBalMgr->CurrentModuleObject = "SurfaceConvectionAlgorithm:Outside"; - NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); - if (NumObjects > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - "SurfaceConvectionAlgorithm:Outside", - 1, - AlphaName, - NumAlpha, - BuildingNumbers, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - { - auto const SELECT_CASE_var(AlphaName(1)); - - if ((SELECT_CASE_var == "SIMPLECOMBINED")) { - state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_ASHRAESimple; - AlphaName(1) = "SimpleCombined"; - - } else if ((SELECT_CASE_var == "TARP")) { - state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_ASHRAETARP; - AlphaName(1) = "TARP"; - - } else if (SELECT_CASE_var == "MOWITT") { - state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_MoWiTTHcOutside; - AlphaName(1) = "MoWitt"; - - } else if ((SELECT_CASE_var == "DOE-2")) { - state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_DOE2HcOutside; - AlphaName(1) = "DOE-2"; - - } else if (SELECT_CASE_var == "ADAPTIVECONVECTIONALGORITHM") { - state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_AdaptiveConvectionAlgorithm; - AlphaName(1) = "AdaptiveConvectionAlgorithm"; - - } else { - ShowWarningError(state, - "GetOutsideConvectionAlgorithm: Invalid value for " + state.dataHeatBalMgr->CurrentModuleObject + - ", defaulting to DOE-2, invalid value=" + AlphaName(1)); - state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_DOE2HcOutside; - AlphaName(1) = "DOE-2"; - } - } - } else { - // default value, if not specified - state.dataHeatBal->DefaultOutsideConvectionAlgo = ConvectionConstants::HcExt_DOE2HcOutside; - AlphaName(1) = "DOE-2"; - } - - constexpr const char *Format_723("! , Algorithm {{SimpleCombined | TARP | MoWitt | DOE-2 | " - "AdaptiveConvectionAlgorithm}}\nOutside Convection Algorithm,{}\n"); - print(state.files.eio, Format_723, AlphaName(1)); - - state.dataHeatBalMgr->CurrentModuleObject = "HeatBalanceAlgorithm"; - NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); - if (NumObjects > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - 1, - AlphaName, - NumAlpha, - BuildingNumbers, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - { - auto const SELECT_CASE_var(AlphaName(1)); - // The default is CTF - if (SELECT_CASE_var == "CONDUCTIONTRANSFERFUNCTION") { - state.dataHeatBal->OverallHeatTransferSolutionAlgo = DataSurfaces::HeatTransferModel::CTF; - state.dataHeatBal->AnyCTF = true; - - } else if (SELECT_CASE_var == "MOISTUREPENETRATIONDEPTHCONDUCTIONTRANSFERFUNCTION") { - state.dataHeatBal->OverallHeatTransferSolutionAlgo = DataSurfaces::HeatTransferModel::EMPD; - state.dataHeatBal->AnyEMPD = true; - state.dataHeatBal->AllCTF = false; - } else if (SELECT_CASE_var == "CONDUCTIONFINITEDIFFERENCE") { - state.dataHeatBal->OverallHeatTransferSolutionAlgo = DataSurfaces::HeatTransferModel::CondFD; - state.dataHeatBal->AnyCondFD = true; - state.dataHeatBal->AllCTF = false; - if (state.dataGlobal->NumOfTimeStepInHour < 20) { - ShowSevereError( - state, - format("GetSolutionAlgorithm: {} {} is Conduction Finite Difference but Number of TimeSteps in Hour < 20, Value is {}.", - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - state.dataGlobal->NumOfTimeStepInHour)); - ShowContinueError(state, - "...Suggested minimum number of time steps in hour for Conduction Finite Difference solutions is 20. " - "Errors or inaccurate calculations may occur."); - } - - } else if (SELECT_CASE_var == "COMBINEDHEATANDMOISTUREFINITEELEMENT") { - state.dataHeatBal->OverallHeatTransferSolutionAlgo = DataSurfaces::HeatTransferModel::HAMT; - state.dataHeatBal->AnyHAMT = true; - state.dataHeatBal->AllCTF = false; - if (state.dataGlobal->NumOfTimeStepInHour < 20) { - ShowSevereError(state, - format("GetSolutionAlgorithm: {} {} is Combined Heat and Moisture Finite Element but Number of TimeSteps in " - "Hour < 20, Value is {}.", - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - state.dataGlobal->NumOfTimeStepInHour)); - ShowContinueError(state, - "...Suggested minimum number of time steps in hour for Combined Heat and Moisture Finite Element solutions " - "is 20. Errors or inaccurate calculations may occur."); - ShowContinueError(state, - "...If the simulation crashes, look at material properties (esp porosity), use timestep=60, or less layers " - "in your constructions."); - } - - } else { - state.dataHeatBal->OverallHeatTransferSolutionAlgo = DataSurfaces::HeatTransferModel::CTF; - state.dataHeatBal->AnyCTF = true; - } - } - - if (NumNumber > 0) { - state.dataHeatBalSurf->MaxSurfaceTempLimit = BuildingNumbers(1); - state.dataHeatBalSurf->MaxSurfaceTempLimitBeforeFatal = state.dataHeatBalSurf->MaxSurfaceTempLimit * 2.5; - if (state.dataHeatBalSurf->MaxSurfaceTempLimit < MinSurfaceTempLimit) { - } else if (state.dataHeatBalSurf->MaxSurfaceTempLimit < 0.0) { - state.dataHeatBalSurf->MaxSurfaceTempLimit = DefaultSurfaceTempLimit; - state.dataHeatBalSurf->MaxSurfaceTempLimitBeforeFatal = state.dataHeatBalSurf->MaxSurfaceTempLimit * 2.5; - } - } - - if (!state.dataIPShortCut->lNumericFieldBlanks(2)) { - state.dataHeatBal->LowHConvLimit = BuildingNumbers(2); - } - if (!state.dataIPShortCut->lNumericFieldBlanks(3)) { - state.dataHeatBal->HighHConvLimit = BuildingNumbers(3); - } - - } else { - state.dataHeatBal->OverallHeatTransferSolutionAlgo = DataSurfaces::HeatTransferModel::CTF; - state.dataHeatBal->AnyCTF = true; - state.dataHeatBalSurf->MaxSurfaceTempLimit = DefaultSurfaceTempLimit; - state.dataHeatBalSurf->MaxSurfaceTempLimitBeforeFatal = state.dataHeatBalSurf->MaxSurfaceTempLimit * 2.5; - } - - // algorithm input checks now deferred until surface properties are read in, - // moved to SurfaceGeometry.cc routine GetSurfaceHeatTransferAlgorithmOverrides - - constexpr const char *Format_724("! , Value {{Anisotropic}}\nSky Radiance Distribution,Anisotropic\n"); - print(state.files.eio, Format_724); - - state.dataHeatBalMgr->CurrentModuleObject = "Compliance:Building"; - NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); - - if (NumObjects > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - 1, - AlphaName, - NumAlpha, - BuildingNumbers, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - // Building Rotation for Appendix G - state.dataHeatBal->BuildingRotationAppendixG = mod(BuildingNumbers(1), 360.0); - } - - // A new object is added by L. Gu, 12/09 - state.dataHeatBalMgr->CurrentModuleObject = "ZoneAirHeatBalanceAlgorithm"; - NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); - if (NumObjects > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - 1, - AlphaName, - NumAlpha, - BuildingNumbers, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (NumAlpha > 0) { - { - auto const SELECT_CASE_var(AlphaName(1)); - if (SELECT_CASE_var == "THIRDORDERBACKWARDDIFFERENCE") { - state.dataHeatBal->ZoneAirSolutionAlgo = DataHeatBalance::SolutionAlgo::ThirdOrder; - AlphaName(1) = "ThirdOrderBackwardDifference"; - } else if (SELECT_CASE_var == "ANALYTICALSOLUTION") { - state.dataHeatBal->ZoneAirSolutionAlgo = DataHeatBalance::SolutionAlgo::AnalyticalSolution; - AlphaName(1) = "AnalyticalSolution"; - } else if (SELECT_CASE_var == "EULERMETHOD") { - state.dataHeatBal->ZoneAirSolutionAlgo = DataHeatBalance::SolutionAlgo::EulerMethod; - AlphaName(1) = "EulerMethod"; - } else { - state.dataHeatBal->ZoneAirSolutionAlgo = DataHeatBalance::SolutionAlgo::ThirdOrder; - AlphaName(1) = "ThirdOrderBackwardDifference"; - ShowWarningError(state, - state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + - state.dataIPShortCut->cAlphaFieldNames(1) + ". The default choice is assigned = " + AlphaName(1)); - ShowContinueError(state, "Valid choices are: ThirdOrderBackwardDifference, AnalyticalSolution, or EulerMethod."); - } - } - } - if (!state.dataIPShortCut->lAlphaFieldBlanks(2)) { - state.dataHeatBal->doSpaceHeatBalanceSizing = static_cast(getYesNoValue(AlphaName(2))); - } - if (!state.dataIPShortCut->lAlphaFieldBlanks(3)) { - state.dataHeatBal->doSpaceHeatBalanceSimulation = static_cast(getYesNoValue(AlphaName(3))); - } - } else { - state.dataHeatBal->ZoneAirSolutionAlgo = DataHeatBalance::SolutionAlgo::ThirdOrder; - AlphaName(1) = "ThirdOrderBackwardDifference"; - } - if (state.dataHeatBal->OverrideZoneAirSolutionAlgo) { - state.dataHeatBal->ZoneAirSolutionAlgo = DataHeatBalance::SolutionAlgo::EulerMethod; - AlphaName(1) = "EulerMethod"; - } - - // Write Solution Algorithm to the initialization output file for User Verification - constexpr const char *Format_726("! , Algorithm {{ThirdOrderBackwardDifference | AnalyticalSolution | " - "EulerMethod}}, Space Heat Balance Sizing, Space Heat Balance Simulation\n"); - print(state.files.eio, Format_726); - constexpr const char *Format_727(" Zone Air Solution Algorithm, {}, {}, {}\n"); - print(state.files.eio, - Format_727, - AlphaName(1), - state.dataHeatBal->doSpaceHeatBalanceSizing ? "Yes" : "No", - state.dataHeatBal->doSpaceHeatBalanceSimulation ? "Yes" : "No"); - - // A new object is added by L. Gu, 06/10 - state.dataHeatBalMgr->CurrentModuleObject = "ZoneAirContaminantBalance"; - NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); - if (NumObjects > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - 1, - AlphaName, - NumAlpha, - BuildingNumbers, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (NumAlpha > 0) { - { - auto const SELECT_CASE_var(AlphaName(1)); - if (SELECT_CASE_var == "YES") { - state.dataContaminantBalance->Contaminant.CO2Simulation = true; - state.dataContaminantBalance->Contaminant.SimulateContaminants = true; - } else if (SELECT_CASE_var == "NO") { - state.dataContaminantBalance->Contaminant.CO2Simulation = false; - } else { - state.dataContaminantBalance->Contaminant.CO2Simulation = false; - AlphaName(1) = "NO"; - ShowWarningError(state, - state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + - state.dataIPShortCut->cAlphaFieldNames(1) + ". The default choice is assigned = NO"); - } - } - } - if (NumAlpha == 1 && state.dataContaminantBalance->Contaminant.CO2Simulation) { - if (state.dataContaminantBalance->Contaminant.CO2Simulation) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + ", " + state.dataIPShortCut->cAlphaFieldNames(2) + - " is required and not given."); - ErrorsFound = true; - } - } else if (NumAlpha > 1 && state.dataContaminantBalance->Contaminant.CO2Simulation) { - state.dataContaminantBalance->Contaminant.CO2OutdoorSchedPtr = GetScheduleIndex(state, AlphaName(2)); - if (state.dataContaminantBalance->Contaminant.CO2OutdoorSchedPtr == 0) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + ", " + state.dataIPShortCut->cAlphaFieldNames(2) + - " not found: " + AlphaName(2)); - ErrorsFound = true; - } - } - if (NumAlpha > 2) { - { - auto const SELECT_CASE_var(AlphaName(3)); - if (SELECT_CASE_var == "YES") { - state.dataContaminantBalance->Contaminant.GenericContamSimulation = true; - if (!state.dataContaminantBalance->Contaminant.CO2Simulation) - state.dataContaminantBalance->Contaminant.SimulateContaminants = true; - } else if (SELECT_CASE_var == "NO") { - state.dataContaminantBalance->Contaminant.GenericContamSimulation = false; - } else { - state.dataContaminantBalance->Contaminant.GenericContamSimulation = false; - AlphaName(3) = "NO"; - ShowWarningError(state, - state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + - state.dataIPShortCut->cAlphaFieldNames(3) + ". The default choice is assigned = NO"); - } - } - if (NumAlpha == 3 && state.dataContaminantBalance->Contaminant.GenericContamSimulation) { - if (state.dataContaminantBalance->Contaminant.GenericContamSimulation) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + ", " + state.dataIPShortCut->cAlphaFieldNames(4) + - " is required and not given."); - ErrorsFound = true; - } - } else if (NumAlpha > 3 && state.dataContaminantBalance->Contaminant.GenericContamSimulation) { - state.dataContaminantBalance->Contaminant.GenericContamOutdoorSchedPtr = GetScheduleIndex(state, AlphaName(4)); - if (state.dataContaminantBalance->Contaminant.GenericContamOutdoorSchedPtr == 0) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + ", " + state.dataIPShortCut->cAlphaFieldNames(4) + - " not found: " + AlphaName(4)); - ErrorsFound = true; - } - } - } - } else { - state.dataContaminantBalance->Contaminant.SimulateContaminants = false; - state.dataContaminantBalance->Contaminant.CO2Simulation = false; - state.dataContaminantBalance->Contaminant.GenericContamSimulation = false; - AlphaName(1) = "NO"; - AlphaName(3) = "NO"; - } - - WindowManager::initWindowModel(state); - - constexpr const char *Format_728("! , Simulation {{Yes/No}}, Carbon Dioxide Concentration\n"); - print(state.files.eio, Format_728); - constexpr const char *Format_730(" Zone Air Carbon Dioxide Balance Simulation, {},{}\n"); - if (state.dataContaminantBalance->Contaminant.SimulateContaminants && state.dataContaminantBalance->Contaminant.CO2Simulation) { - print(state.files.eio, Format_730, "Yes", AlphaName(1)); - } else { - print(state.files.eio, Format_730, "No", "N/A"); - } - - constexpr const char *Format_729( - "! , Simulation {{Yes/No}}, Generic Contaminant Concentration\n"); - constexpr const char *Format_731(" Zone Air Generic Contaminant Balance Simulation, {},{}\n"); - print(state.files.eio, Format_729); - if (state.dataContaminantBalance->Contaminant.SimulateContaminants && state.dataContaminantBalance->Contaminant.GenericContamSimulation) { - print(state.files.eio, Format_731, "Yes", AlphaName(3)); - } else { - print(state.files.eio, Format_731, "No", "N/A"); - } - - // A new object is added by B. Nigusse, 02/14 - state.dataHeatBalMgr->CurrentModuleObject = "ZoneAirMassFlowConservation"; - NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); - state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance = false; - - if (NumObjects > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - 1, - AlphaName, - NumAlpha, - BuildingNumbers, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (NumAlpha > 0) { - { - int FlowTypeNum = getEnumerationValue(AdjustmentTypeNamesUC, UtilityRoutines::MakeUPPERCase(AlphaName(1))); - state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment = static_cast(FlowTypeNum); - AlphaName(1) = AdjustmentTypeNamesCC[FlowTypeNum]; - if (BITF_TEST_ANY(BITF(state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment), - BITF(AdjustmentType::AdjustMixingOnly) | BITF(AdjustmentType::AdjustReturnOnly) | - BITF(AdjustmentType::AdjustMixingThenReturn) | BITF(AdjustmentType::AdjustReturnThenMixing))) { - state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance = true; - } - if (state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment == AdjustmentType::Invalid) { - state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment = AdjustmentType::NoAdjustReturnAndMixing; - AlphaName(1) = "None"; - ShowWarningError(state, - state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + - state.dataIPShortCut->cAlphaFieldNames(1) + ". The default choice is assigned = None"); - } - } - if (state.dataHeatBal->ZoneAirMassFlow.ZoneFlowAdjustment != DataHeatBalance::AdjustmentType::NoAdjustReturnAndMixing) - state.dataHeatBal->ZoneAirMassFlow.AdjustZoneMixingFlow = true; - } - if (NumAlpha > 1) { - { - int FlowTypeNum = getEnumerationValue(InfiltrationFlowTypeNamesUC, UtilityRoutines::MakeUPPERCase(AlphaName(2))); - state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment = static_cast(FlowTypeNum); - AlphaName(2) = InfiltrationFlowTypeNamesCC[FlowTypeNum]; - if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::InfiltrationFlow::Add || - state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::InfiltrationFlow::Adjust) { - state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance = true; - if (!state.dataContaminantBalance->Contaminant.CO2Simulation) - state.dataContaminantBalance->Contaminant.SimulateContaminants = true; - } else if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::InfiltrationFlow::Invalid) { - state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment = DataHeatBalance::InfiltrationFlow::Add; - state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance = true; - AlphaName(2) = "AddInfiltrationFlow"; - ShowWarningError(state, - state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + - state.dataIPShortCut->cAlphaFieldNames(2) + ". The default choice is assigned = AddInfiltrationFlow"); - } - } - } else { - state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment = DataHeatBalance::InfiltrationFlow::Add; - state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance = true; - AlphaName(2) = "AddInfiltrationFlow"; - } - if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment == DataHeatBalance::InfiltrationFlow::No) { - AlphaName(3) = "N/A"; - } else { - if (NumAlpha > 2) { - { - int FlowTypeNum = getEnumerationValue(InfiltrationZoneTypeNamesUC, UtilityRoutines::MakeUPPERCase(AlphaName(3))); - state.dataHeatBal->ZoneAirMassFlow.InfiltrationForZones = static_cast(FlowTypeNum); - AlphaName(3) = InfiltrationZoneTypeNamesCC[FlowTypeNum]; - if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationForZones == DataHeatBalance::InfiltrationZoneType::Invalid) { - state.dataHeatBal->ZoneAirMassFlow.InfiltrationForZones = DataHeatBalance::InfiltrationZoneType::MixingSourceZonesOnly; - AlphaName(3) = "MixingSourceZonesOnly"; - ShowWarningError(state, - state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + - state.dataIPShortCut->cAlphaFieldNames(3) + - ". The default choice is assigned = MixingSourceZonesOnly"); - } - } - } else { - state.dataHeatBal->ZoneAirMassFlow.InfiltrationForZones = DataHeatBalance::InfiltrationZoneType::MixingSourceZonesOnly; - AlphaName(3) = "MixingSourceZonesOnly"; - } - } - } else { - state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance = false; - } - if (state.dataHeatBal->ZoneAirMassFlow.InfiltrationTreatment != DataHeatBalance::InfiltrationFlow::No) - state.dataHeatBal->ZoneAirMassFlow.AdjustZoneInfiltrationFlow = true; - - constexpr const char *Format_732( - "! , Enforce Mass Balance, Adjust Zone Mixing and Return {{AdjustMixingOnly | AdjustReturnOnly | " - "AdjustMixingThenReturn | AdjustReturnThenMixing | None}}, Adjust Zone Infiltration " - "{{AddInfiltration | AdjustInfiltration | None}}, Infiltration Zones {{MixingSourceZonesOnly | AllZones}}\n"); - constexpr const char *Format_733(" Zone Air Mass Flow Balance Simulation, {},{},{},{}\n"); - - print(state.files.eio, Format_732); - if (state.dataHeatBal->ZoneAirMassFlow.EnforceZoneMassBalance) { - print(state.files.eio, Format_733, "Yes", AlphaName(1), AlphaName(2), AlphaName(3)); - } else { - print(state.files.eio, Format_733, "No", "N/A", "N/A", "N/A"); - } - - // A new object is added by L. Gu, 4/17 - state.dataHeatBalMgr->CurrentModuleObject = "HVACSystemRootFindingAlgorithm"; - NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); - if (NumObjects > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - 1, - AlphaName, - NumAlpha, - BuildingNumbers, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (NumAlpha > 0) { - HVACSystemRootFinding.Algorithm = AlphaName(1); - { - auto const SELECT_CASE_var(AlphaName(1)); - if ((SELECT_CASE_var == "REGULAFALSI")) { - HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::RegulaFalsi; - } else if (SELECT_CASE_var == "BISECTION") { - HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::Bisection; - } else if (SELECT_CASE_var == "BISECTIONTHENREGULAFALSI") { - HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::BisectionThenRegulaFalsi; - } else if (SELECT_CASE_var == "REGULAFALSITHENBISECTION") { - HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::RegulaFalsiThenBisection; - } else if (SELECT_CASE_var == "ALTERNATION") { - HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::Alternation; - } else { - HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::RegulaFalsi; - ShowWarningError(state, - state.dataHeatBalMgr->CurrentModuleObject + ": Invalid input of " + - state.dataIPShortCut->cAlphaFieldNames(1) + ". The default choice is assigned = " + AlphaName(1)); - ShowContinueError( - state, "Valid choices are: RegulaFalsi, Bisection, BisectionThenRegulaFalsi, RegulaFalsiThenBisection, or Alternation."); - } - } - } - if (NumNumber > 0) { - HVACSystemRootFinding.NumOfIter = BuildingNumbers(1); - } - } else { - HVACSystemRootFinding.Algorithm = "RegulaFalsi"; - HVACSystemRootFinding.HVACSystemRootSolver = HVACSystemRootSolverAlgorithm::RegulaFalsi; - } - - // Write Solution Algorithm to the initialization output file for User Verification - constexpr const char *Format_734( - "! , Value {{RegulaFalsi | Bisection | BisectionThenRegulaFalsi | RegulaFalsiThenBisection}}\n"); - constexpr const char *Format_735(" HVACSystemRootFindingAlgorithm, {}\n"); - print(state.files.eio, Format_734); - print(state.files.eio, Format_735, HVACSystemRootFinding.Algorithm); - } - - void GetSiteAtmosphereData(EnergyPlusData &state, bool &ErrorsFound) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Peter Graham Ellis - // DATE WRITTEN January 2006 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // Reads the input data for the SITE ATMOSPHERIC VARIATION object. - - // Using/Aliasing - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int NumObjects; - int NumAlphas; // Number of elements in the alpha array - int NumNums; // Number of elements in the numeric array - int IOStat; // IO Status when calling get input subroutine - Array1D_string AlphArray(1); // Character string data - Array1D NumArray(3); // Numeric data - - // Formats - constexpr const char *Format_720("Environment:Site Atmospheric Variation,{:.3R},{:.3R},{:.6R}\n"); - - state.dataHeatBalMgr->CurrentModuleObject = "Site:HeightVariation"; - NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); - - if (NumObjects == 1) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - 1, - AlphArray, - NumAlphas, - NumArray, - NumNums, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - - if (NumNums > 0) state.dataEnvrn->SiteWindExp = NumArray(1); - if (NumNums > 1) state.dataEnvrn->SiteWindBLHeight = NumArray(2); - if (NumNums > 2) state.dataEnvrn->SiteTempGradient = NumArray(3); - - } else if (NumObjects > 1) { - ShowSevereError(state, "Too many " + state.dataHeatBalMgr->CurrentModuleObject + " objects, only 1 allowed."); - ErrorsFound = true; - } else { // None entered - // IDD defaults would have this: - // Building object defaults use Terrain to set SiteWindExp and SiteWindBLHeight but would - // be overridden by a Site Atmospheric Variation Object. - // SiteWindExp = 0.22 - // SiteWindBLHeight = 370.0 - state.dataEnvrn->SiteTempGradient = 0.0065; - } - - // Write to the initialization output file - print(state.files.eio, - "! ,Wind Speed Profile Exponent {{}},Wind Speed Profile Boundary " - "Layer Thickness {{m}},Air Temperature Gradient Coefficient {{K/m}}\n"); - - print(state.files.eio, Format_720, state.dataEnvrn->SiteWindExp, state.dataEnvrn->SiteWindBLHeight, state.dataEnvrn->SiteTempGradient); - } - - void GetMaterialData(EnergyPlusData &state, bool &ErrorsFound) // set to true if errors found in input - { - - // SUBROUTINE INFORMATION: - // AUTHOR Richard Liesen - // DATE WRITTEN September 1997 - // MODIFIED April 1999; L.Lawrie - // Sept 1999, FCW, Window5 modifications - // Mar 2001, FCW, WindowShade mods - // Sep 2001, FCW, add Material:WindowGasMixture - // Oct 2001, FCW, add Material:WindowBlind - // Dec 2003, FCW, add glass solar/visible transmittance dirt factor - // Feb 2009, TH, added WindowMaterial:GlazingGroup:Thermochromic - - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // The purpose of this subroutine is to serve as a transfer agent - // between the input file and the material derived type. The new input - // file is working, and this file reads the material data directly - // from the input file and transfer that information to the new data - // structure. Data read in this routine is stored in a - // derived type (Material) defined in the DataHeatBalance module. - - // In April 1999, a new set of material definitions replaced the one "all-purpose" - // material definition. There are now 10 flavors of materials. Definitions from - // the IDD appear below before their counterpart "gets". - - using Curve::GetCurveIndex; - using Curve::GetCurveMinMaxValues; - - using General::ScanForReports; - - // if this has a size, then input has already been gotten - if (state.dataHeatBalMgr->UniqueMaterialNames.size()) { - return; - } - - int IOStat; // IO Status when calling get input subroutine - Array1D_string MaterialNames(7); // Number of Material Alpha names defined - int MaterNum; // Counter to keep track of the material number - int MaterialNumAlpha; // Number of material alpha names being passed - int MaterialNumProp; // Number of material properties being passed - Array1D MaterialProps(27); // Temporary array to transfer material properties - int RegMat; // Regular Materials -- full property definition - int RegRMat; // Regular Materials -- R only property definition - int AirMat; // Air space materials in opaque constructions - int IRTMat; // Infrared Transmitting Materials -- R only property definition - - int EcoRoofMat; // Materials for ecoRoof - int NumGas; // Index for loop over gap gases in a mixture - int NumGases; // Number of gasses in a mixture - int GasType; // Gas type index: 1=air, 2=argon, 3=krypton, 4=xenon - int Loop; - int ICoeff; // Gas property coefficient index - std::string TypeOfGas; // Type of window gas fill (Air, Argon, Krypton, & - // Xenon, or Custom - Real64 MinSlatAngGeom; // Minimum and maximum slat angle allowed by slat geometry (deg) - Real64 MaxSlatAngGeom; - Real64 ReflectivitySol; // Glass reflectivity, solar - Real64 ReflectivityVis; // Glass reflectivity, visible - Real64 TransmittivitySol; // Glass transmittivity, solar - Real64 TransmittivityVis; // Glass transmittivity, visible - Real64 DenomRGas; // Denominator for WindowGas calculations of NominalR - Real64 Openness; // insect screen openness fraction = (1-d/s)^2 - Real64 minAngValue; // minimum value of angle - Real64 maxAngValue; // maximum value of angle - Real64 minLamValue; // minimum value of wavelength - Real64 maxLamValue; // maximum value of wavelength - - // Added TH 1/9/2009 to read the thermochromic glazings - int iTC(0); - int iMat(0); - - // Added TH 7/27/2009 for constructions defined with F or C factor method - int TotFfactorConstructs; // Number of slabs-on-grade or underground floor constructions defined with F factors - int TotCfactorConstructs; // Number of underground wall constructions defined with C factors - - static constexpr std::string_view RoutineName("GetMaterialData: "); - - RegMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Material"); - RegRMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Material:NoMass"); - IRTMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Material:InfraredTransparent"); - AirMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Material:AirGap"); - state.dataHeatBal->W5GlsMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Glazing"); - state.dataHeatBal->W5GlsMatAlt = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Glazing:RefractionExtinctionMethod"); - state.dataHeatBal->W5GasMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Gas"); - state.dataHeatBal->W5GasMatMixture = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:GasMixture"); - state.dataHeatBal->TotShades = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Shade"); - state.dataHeatBal->TotComplexShades = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:ComplexShade"); - state.dataHeatBal->TotComplexGaps = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Gap"); - state.dataHeatBal->TotScreens = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Screen"); - state.dataHeatBal->TotBlinds = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Blind"); - EcoRoofMat = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Material:RoofVegetation"); - state.dataHeatBal->TotSimpleWindow = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:SimpleGlazingSystem"); - - state.dataHeatBal->W5GlsMatEQL = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Glazing:EquivalentLayer"); - state.dataHeatBal->TotShadesEQL = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Shade:EquivalentLayer"); - state.dataHeatBal->TotDrapesEQL = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Drape:EquivalentLayer"); - state.dataHeatBal->TotBlindsEQL = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Blind:EquivalentLayer"); - state.dataHeatBal->TotScreensEQL = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Screen:EquivalentLayer"); - state.dataHeatBal->W5GapMatEQL = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "WindowMaterial:Gap:EquivalentLayer"); - - state.dataHeatBal->TotMaterials = - RegMat + RegRMat + AirMat + state.dataHeatBal->W5GlsMat + state.dataHeatBal->W5GlsMatAlt + state.dataHeatBal->W5GasMat + - state.dataHeatBal->W5GasMatMixture + state.dataHeatBal->TotShades + state.dataHeatBal->TotScreens + state.dataHeatBal->TotBlinds + - EcoRoofMat + IRTMat + state.dataHeatBal->TotSimpleWindow + state.dataHeatBal->TotComplexShades + state.dataHeatBal->TotComplexGaps + - state.dataHeatBal->W5GlsMatEQL + state.dataHeatBal->TotShadesEQL + state.dataHeatBal->TotDrapesEQL + state.dataHeatBal->TotBlindsEQL + - state.dataHeatBal->TotScreensEQL + state.dataHeatBal->W5GapMatEQL; - - TotFfactorConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:FfactorGroundFloor"); - TotCfactorConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:CfactorUndergroundWall"); - - if (TotFfactorConstructs > 0) { - state.dataHeatBal->NoFfactorConstructionsUsed = false; - } - - if (TotCfactorConstructs > 0) { - state.dataHeatBal->NoCfactorConstructionsUsed = false; - } - - if (TotFfactorConstructs + TotCfactorConstructs >= 1) { - // Add a new fictitious insulation layer and a thermal mass layer for each F or C factor defined construction - state.dataHeatBal->TotMaterials += 1 + TotFfactorConstructs + TotCfactorConstructs; - } - - state.dataMaterial->Material.allocate(state.dataHeatBal->TotMaterials); // Allocate the array Size to the number of materials - state.dataHeatBalMgr->UniqueMaterialNames.reserve(static_cast(state.dataHeatBal->TotMaterials)); - - state.dataHeatBal->NominalR.dimension(state.dataHeatBal->TotMaterials, 0.0); - - MaterNum = 0; - - // Regular Materials - auto &ip = state.dataInputProcessing->inputProcessor; - - state.dataHeatBalMgr->CurrentModuleObject = "Material"; - auto const instances = ip->epJSON.find(state.dataHeatBalMgr->CurrentModuleObject); - if (instances != ip->epJSON.end()) { - auto const &objectSchemaProps = ip->getObjectSchemaProps(state, state.dataHeatBalMgr->CurrentModuleObject); - - int counter = 0; - auto &instancesValue = instances.value(); - for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { - auto const &objectFields = instance.value(); - auto const &thisObjectName = UtilityRoutines::MakeUPPERCase(instance.key()); - ip->markObjectAsUsed(state.dataHeatBalMgr->CurrentModuleObject, instance.key()); - std::string materialName = thisObjectName; - - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - materialName, - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - continue; - } - // For incoming idf, maintain object order - ++counter; - MaterNum = ip->getIDFObjNum(state, state.dataHeatBalMgr->CurrentModuleObject, counter); - - // Load the material derived type from the input data. - auto &thisMaterial = state.dataMaterial->Material(MaterNum); - thisMaterial.Group = DataHeatBalance::MaterialGroup::RegularMaterial; - thisMaterial.Name = materialName; - - std::string roughness = ip->getAlphaFieldValue(objectFields, objectSchemaProps, "roughness"); - ValidateMaterialRoughness(state, MaterNum, roughness, ErrorsFound); - - thisMaterial.Thickness = ip->getRealFieldValue(objectFields, objectSchemaProps, "thickness"); - thisMaterial.Conductivity = ip->getRealFieldValue(objectFields, objectSchemaProps, "conductivity"); - thisMaterial.Density = ip->getRealFieldValue(objectFields, objectSchemaProps, "density"); - thisMaterial.SpecHeat = ip->getRealFieldValue(objectFields, objectSchemaProps, "specific_heat"); - thisMaterial.AbsorpThermal = ip->getRealFieldValue(objectFields, objectSchemaProps, "thermal_absorptance"); - thisMaterial.AbsorpThermalInput = thisMaterial.AbsorpThermal; - thisMaterial.AbsorpSolar = ip->getRealFieldValue(objectFields, objectSchemaProps, "solar_absorptance"); - thisMaterial.AbsorpSolarInput = thisMaterial.AbsorpSolar; - thisMaterial.AbsorpVisible = ip->getRealFieldValue(objectFields, objectSchemaProps, "visible_absorptance"); - thisMaterial.AbsorpVisibleInput = thisMaterial.AbsorpVisible; - - if (thisMaterial.Conductivity > 0.0) { - state.dataHeatBal->NominalR(MaterNum) = thisMaterial.Thickness / thisMaterial.Conductivity; - thisMaterial.Resistance = state.dataHeatBal->NominalR(MaterNum); - } else { - ShowSevereError(state, "Positive thermal conductivity required for material " + thisMaterial.Name); - ErrorsFound = true; - } - } - MaterNum = counter; // This works here, because this is the first material type processed - } - // Add the 6" heavy concrete for constructions defined with F or C factor method - if (TotFfactorConstructs + TotCfactorConstructs >= 1) { - ++MaterNum; - - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::RegularMaterial; - state.dataMaterial->Material(MaterNum).Name = "~FC_Concrete"; - state.dataMaterial->Material(MaterNum).Thickness = 0.15; // m, 0.15m = 6 inches - state.dataMaterial->Material(MaterNum).Conductivity = 1.95; // W/mK - state.dataMaterial->Material(MaterNum).Density = 2240.0; // kg/m3 - state.dataMaterial->Material(MaterNum).SpecHeat = 900.0; // J/kgK - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; - state.dataMaterial->Material(MaterNum).AbsorpSolar = 0.7; - state.dataMaterial->Material(MaterNum).AbsorpThermal = 0.9; - state.dataMaterial->Material(MaterNum).AbsorpVisible = 0.7; - state.dataHeatBal->NominalR(MaterNum) = - state.dataMaterial->Material(MaterNum).Thickness / state.dataMaterial->Material(MaterNum).Conductivity; - state.dataMaterial->Material(MaterNum).Resistance = state.dataHeatBal->NominalR(MaterNum); - - ++RegMat; - } - - state.dataHeatBalMgr->CurrentModuleObject = "Material:NoMass"; - for (Loop = 1; Loop <= RegRMat; ++Loop) { - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - // Load the material derived type from the input data. - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::RegularMaterial; - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - - ValidateMaterialRoughness(state, MaterNum, MaterialNames(2), ErrorsFound); - - state.dataMaterial->Material(MaterNum).Resistance = MaterialProps(1); - state.dataMaterial->Material(MaterNum).ROnly = true; - if (MaterialNumProp >= 2) { - state.dataMaterial->Material(MaterNum).AbsorpThermal = MaterialProps(2); - state.dataMaterial->Material(MaterNum).AbsorpThermalInput = MaterialProps(2); - } else { - state.dataMaterial->Material(MaterNum).AbsorpThermal = 0.9; - state.dataMaterial->Material(MaterNum).AbsorpThermalInput = 0.9; - } - if (MaterialNumProp >= 3) { - state.dataMaterial->Material(MaterNum).AbsorpSolar = MaterialProps(3); - state.dataMaterial->Material(MaterNum).AbsorpSolarInput = MaterialProps(3); - } else { - state.dataMaterial->Material(MaterNum).AbsorpSolar = 0.7; - state.dataMaterial->Material(MaterNum).AbsorpSolarInput = 0.7; - } - if (MaterialNumProp >= 4) { - state.dataMaterial->Material(MaterNum).AbsorpVisible = MaterialProps(4); - state.dataMaterial->Material(MaterNum).AbsorpVisibleInput = MaterialProps(4); - } else { - state.dataMaterial->Material(MaterNum).AbsorpVisible = 0.7; - state.dataMaterial->Material(MaterNum).AbsorpVisibleInput = 0.7; - } - - state.dataHeatBal->NominalR(MaterNum) = state.dataMaterial->Material(MaterNum).Resistance; - } - - // Add a fictitious insulation layer for each construction defined with F or C factor method - if (TotFfactorConstructs + TotCfactorConstructs >= 1) { - for (Loop = 1; Loop <= TotFfactorConstructs + TotCfactorConstructs; ++Loop) { - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::RegularMaterial; - state.dataMaterial->Material(MaterNum).Name = format("~FC_Insulation_{}", Loop); - state.dataMaterial->Material(MaterNum).ROnly = true; - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; - state.dataMaterial->Material(MaterNum).AbsorpSolar = 0.0; - state.dataMaterial->Material(MaterNum).AbsorpThermal = 0.0; - state.dataMaterial->Material(MaterNum).AbsorpVisible = 0.0; - } - RegRMat += TotFfactorConstructs + TotCfactorConstructs; - } - - // Air Materials (for air spaces in opaque constructions) - state.dataHeatBalMgr->CurrentModuleObject = "Material:AirGap"; - for (Loop = 1; Loop <= AirMat; ++Loop) { - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - // Load the material derived type from the input data. - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::Air; - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; - - state.dataMaterial->Material(MaterNum).Resistance = MaterialProps(1); - state.dataMaterial->Material(MaterNum).ROnly = true; - - state.dataHeatBal->NominalR(MaterNum) = state.dataMaterial->Material(MaterNum).Resistance; - } - - state.dataHeatBalMgr->CurrentModuleObject = "Material:InfraredTransparent"; - for (Loop = 1; Loop <= IRTMat; ++Loop) { - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::IRTMaterial; - - // Load the material derived type from the input data. - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - - // Load data for other properties that need defaults - state.dataMaterial->Material(MaterNum).ROnly = true; - state.dataMaterial->Material(MaterNum).Resistance = 0.01; - state.dataMaterial->Material(MaterNum).AbsorpThermal = 0.9999; - state.dataMaterial->Material(MaterNum).AbsorpThermalInput = 0.9999; - state.dataMaterial->Material(MaterNum).AbsorpSolar = 1.0; - state.dataMaterial->Material(MaterNum).AbsorpSolarInput = 1.0; - state.dataMaterial->Material(MaterNum).AbsorpVisible = 1.0; - state.dataMaterial->Material(MaterNum).AbsorpVisibleInput = 1.0; - - state.dataHeatBal->NominalR(MaterNum) = state.dataMaterial->Material(MaterNum).Resistance; - } - - // Glass materials, regular input: transmittance and front/back reflectance - - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Glazing"; - for (Loop = 1; Loop <= state.dataHeatBal->W5GlsMat; ++Loop) { - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGlass; - - // Load the material derived type from the input data. - - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VerySmooth; - state.dataMaterial->Material(MaterNum).ROnly = true; - state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(1); - if (!UtilityRoutines::SameString(MaterialNames(2), "SpectralAndAngle")) { - state.dataMaterial->Material(MaterNum).Trans = MaterialProps(2); - state.dataMaterial->Material(MaterNum).ReflectSolBeamFront = MaterialProps(3); - state.dataMaterial->Material(MaterNum).ReflectSolBeamBack = MaterialProps(4); - state.dataMaterial->Material(MaterNum).TransVis = MaterialProps(5); - state.dataMaterial->Material(MaterNum).ReflectVisBeamFront = MaterialProps(6); - state.dataMaterial->Material(MaterNum).ReflectVisBeamBack = MaterialProps(7); - state.dataMaterial->Material(MaterNum).TransThermal = MaterialProps(8); - } - state.dataMaterial->Material(MaterNum).AbsorpThermalFront = MaterialProps(9); - state.dataMaterial->Material(MaterNum).AbsorpThermalBack = MaterialProps(10); - state.dataMaterial->Material(MaterNum).Conductivity = MaterialProps(11); - state.dataMaterial->Material(MaterNum).GlassTransDirtFactor = MaterialProps(12); - state.dataMaterial->Material(MaterNum).YoungModulus = MaterialProps(13); - state.dataMaterial->Material(MaterNum).PoissonsRatio = MaterialProps(14); - if (MaterialProps(12) == 0.0) state.dataMaterial->Material(MaterNum).GlassTransDirtFactor = 1.0; - state.dataMaterial->Material(MaterNum).AbsorpThermal = state.dataMaterial->Material(MaterNum).AbsorpThermalBack; - - if (state.dataMaterial->Material(MaterNum).Conductivity > 0.0) { - state.dataHeatBal->NominalR(MaterNum) = - state.dataMaterial->Material(MaterNum).Thickness / state.dataMaterial->Material(MaterNum).Conductivity; - state.dataMaterial->Material(MaterNum).Resistance = state.dataHeatBal->NominalR(MaterNum); - } else { - ErrorsFound = true; - ShowSevereError(state, - "Window glass material " + state.dataMaterial->Material(MaterNum).Name + - " has Conductivity = 0.0, must be >0.0, default = .9"); - } - - state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = 0; - if (state.dataHeatBal->TotSpectralData > 0 && !state.dataIPShortCut->lAlphaFieldBlanks(3)) { - state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = - UtilityRoutines::FindItemInList(MaterialNames(3), state.dataHeatBal->SpectralData); - } - if (UtilityRoutines::SameString(MaterialNames(2), "SpectralAverage")) state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = 0; - // No need for spectral data for BSDF either - if (UtilityRoutines::SameString(MaterialNames(2), "BSDF")) state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = 0; - if (UtilityRoutines::SameString(MaterialNames(2), "SpectralAndAngle")) - state.dataMaterial->Material(MaterNum).GlassSpectralAndAngle = true; - - if (state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr == 0 && UtilityRoutines::SameString(MaterialNames(2), "Spectral")) { - ErrorsFound = true; - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataMaterial->Material(MaterNum).Name + "\" has " + - state.dataIPShortCut->cAlphaFieldNames(2) + - " = Spectral but has no matching MaterialProperty:GlazingSpectralData set"); - if (state.dataIPShortCut->lAlphaFieldBlanks(3)) { - ShowContinueError(state, "..." + state.dataIPShortCut->cAlphaFieldNames(3) + " is blank."); - } else { - ShowContinueError(state, - "..." + state.dataIPShortCut->cAlphaFieldNames(3) + "=\"" + MaterialNames(3) + - "\" not found as item in MaterialProperty:GlazingSpectralData objects."); - } - } - - if (!UtilityRoutines::SameString(MaterialNames(2), "SpectralAverage") && !UtilityRoutines::SameString(MaterialNames(2), "Spectral") && - !UtilityRoutines::SameString(MaterialNames(2), "BSDF") && !UtilityRoutines::SameString(MaterialNames(2), "SpectralAndAngle")) { - ErrorsFound = true; - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataMaterial->Material(MaterNum).Name + - "\", invalid specification."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(2) + - " must be SpectralAverage, Spectral, BSDF or SpectralAndAngle, value=" + MaterialNames(2)); - } - - // TH 8/24/2011, allow glazing properties MaterialProps(2 to 10) to equal 0 or 1: 0.0 =< Prop <= 1.0 - // Fixed CR 8413 - modeling spandrel panels as glazing systems - if (UtilityRoutines::SameString(MaterialNames(2), "SpectralAverage")) { - - if (MaterialProps(2) + MaterialProps(3) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError( - state, state.dataIPShortCut->cNumericFieldNames(2) + " + " + state.dataIPShortCut->cNumericFieldNames(3) + " not <= 1.0"); - } - - if (MaterialProps(2) + MaterialProps(4) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError( - state, state.dataIPShortCut->cNumericFieldNames(2) + " + " + state.dataIPShortCut->cNumericFieldNames(4) + " not <= 1.0"); - } - - if (MaterialProps(5) + MaterialProps(6) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError( - state, state.dataIPShortCut->cNumericFieldNames(5) + " + " + state.dataIPShortCut->cNumericFieldNames(6) + " not <= 1.0"); - } - - if (MaterialProps(5) + MaterialProps(7) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError( - state, state.dataIPShortCut->cNumericFieldNames(5) + " + " + state.dataIPShortCut->cNumericFieldNames(7) + " not <= 1.0"); - } - - if (MaterialProps(8) + MaterialProps(9) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError( - state, state.dataIPShortCut->cNumericFieldNames(8) + " + " + state.dataIPShortCut->cNumericFieldNames(9) + " not <= 1.0"); - } - - if (MaterialProps(8) + MaterialProps(10) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError( - state, state.dataIPShortCut->cNumericFieldNames(8) + " + " + state.dataIPShortCut->cNumericFieldNames(10) + " not <= 1.0"); - } - - if (MaterialProps(2) < 0.0) { - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(2) + " not >= 0.0"); - ErrorsFound = true; - } - - if (MaterialProps(2) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(2) + " not <= 1.0"); - } - - if (MaterialProps(3) < 0.0 || MaterialProps(3) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(3) + " not >= 0.0 and <= 1.0"); - } - - if (MaterialProps(4) < 0.0 || MaterialProps(4) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(4) + " not >= 0.0 and <= 1.0"); - } - - if (MaterialProps(5) < 0.0) { - ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", minimal value."); - ShowWarningError(state, state.dataIPShortCut->cNumericFieldNames(5) + " not >= 0.0"); - } - - if (MaterialProps(5) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(5) + " not <= 1.0"); - } - - if (MaterialProps(6) < 0.0 || MaterialProps(6) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(6) + " not >= 0.0 and <= 1.0"); - } - - if (MaterialProps(7) < 0.0 || MaterialProps(7) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(7) + " not >= 0.0 and <= 1.0"); - } - } - - if (MaterialProps(8) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(8) + " not <= 1.0"); - } - - if (MaterialProps(9) <= 0.0 || MaterialProps(9) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(9) + " not > 0.0 and < 1.0"); - } - - if (MaterialProps(10) <= 0.0 || MaterialProps(10) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(10) + " not > 0.0 and < 1.0"); - } - - if (MaterialProps(11) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(11) + " not > 0.0"); - } - - if (MaterialProps(13) < 0.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(13) + " not > 0.0"); - } - - if (MaterialProps(14) < 0.0 || MaterialProps(14) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(14) + " not > 0.0 and < 1.0"); - } - - if (MaterialNames(4) == "") { - state.dataMaterial->Material(MaterNum).SolarDiffusing = false; - } else if (MaterialNames(4) == "YES") { - state.dataMaterial->Material(MaterNum).SolarDiffusing = true; - } else if (MaterialNames(4) == "NO") { - state.dataMaterial->Material(MaterNum).SolarDiffusing = false; - } else { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(4) + " must be Yes or No, entered value=" + MaterialNames(4)); - } - // Get SpectralAndAngle table names - if (state.dataMaterial->Material(MaterNum).GlassSpectralAndAngle) { - if (state.dataIPShortCut->lAlphaFieldBlanks(5)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", blank field."); - ShowContinueError(state, " Table name must be entered when the key SpectralAndAngle is selected as Optical Data Type."); - } else { - state.dataMaterial->Material(MaterNum).GlassSpecAngTransDataPtr = Curve::GetCurveIndex(state, MaterialNames(5)); - if (state.dataMaterial->Material(MaterNum).GlassSpecAngTransDataPtr == 0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Invalid name."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(5) + - " requires a valid table object name, entered input=" + MaterialNames(5)); - } else { - ErrorsFound |= Curve::CheckCurveDims(state, - state.dataMaterial->Material(MaterNum).GlassSpecAngTransDataPtr, // Curve index - {2}, // Valid dimensions - RoutineName, // Routine name - state.dataHeatBalMgr->CurrentModuleObject, // Object Type - state.dataMaterial->Material(MaterNum).Name, // Object Name - state.dataIPShortCut->cAlphaFieldNames(5)); // Field Name - - GetCurveMinMaxValues(state, - state.dataMaterial->Material(MaterNum).GlassSpecAngTransDataPtr, - minAngValue, - maxAngValue, - minLamValue, - maxLamValue); - if (minAngValue > 1.0e-6) { - ErrorsFound = true; - ShowSevereError(state, - format("{}=\"{}\", Invalid minimum value of angle = {:.2R}.", - state.dataHeatBalMgr->CurrentModuleObject, - MaterialNames(1), - minAngValue)); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(5) + - " requires the minumum value = 0.0 in the entered table name=" + MaterialNames(5)); - } - if (std::abs(maxAngValue - 90.0) > 1.0e-6) { - ErrorsFound = true; - ShowSevereError(state, - format("{}=\"{}\", Invalid maximum value of angle = {:.2R}.", - state.dataHeatBalMgr->CurrentModuleObject, - MaterialNames(1), - maxAngValue)); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(5) + - " requires the maximum value = 90.0 in the entered table name=" + MaterialNames(5)); - } - if (minLamValue < 0.1) { - ErrorsFound = true; - ShowSevereError(state, - format("{}=\"{}\", Invalid minimum value of wavelength = {:.2R}.", - state.dataHeatBalMgr->CurrentModuleObject, - MaterialNames(1), - minLamValue)); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(5) + - " requires the minumum value = 0.1 micron in the entered table name=" + MaterialNames(5)); - } - if (maxLamValue > 4.0) { - ErrorsFound = true; - ShowSevereError(state, - format("{}=\"{}\", Invalid maximum value of wavelength = {:.2R}.", - state.dataHeatBalMgr->CurrentModuleObject, - MaterialNames(1), - maxLamValue)); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(5) + - " requires the maximum value = 4.0 microns in the entered table name=" + MaterialNames(5)); - } - } - } - if (state.dataIPShortCut->lAlphaFieldBlanks(6)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", blank field."); - ShowContinueError(state, " Table name must be entered when the key SpectralAndAngle is selected as Optical Data Type."); - } else { - state.dataMaterial->Material(MaterNum).GlassSpecAngFRefleDataPtr = Curve::GetCurveIndex(state, MaterialNames(6)); - if (state.dataMaterial->Material(MaterNum).GlassSpecAngFRefleDataPtr == 0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Invalid name."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(6) + - " requires a valid table object name, entered input=" + MaterialNames(6)); - } else { - ErrorsFound |= Curve::CheckCurveDims(state, - state.dataMaterial->Material(MaterNum).GlassSpecAngFRefleDataPtr, // Curve index - {2}, // Valid dimensions - RoutineName, // Routine name - state.dataHeatBalMgr->CurrentModuleObject, // Object Type - state.dataMaterial->Material(MaterNum).Name, // Object Name - state.dataIPShortCut->cAlphaFieldNames(6)); // Field Name - - GetCurveMinMaxValues(state, - state.dataMaterial->Material(MaterNum).GlassSpecAngFRefleDataPtr, - minAngValue, - maxAngValue, - minLamValue, - maxLamValue); - if (minAngValue > 1.0e-6) { - ErrorsFound = true; - ShowSevereError(state, - format("{}=\"{}\", Invalid minimum value of angle = {:.2R}.", - state.dataHeatBalMgr->CurrentModuleObject, - MaterialNames(1), - minAngValue)); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(5) + - " requires the minumum value = 0.0 in the entered table name=" + MaterialNames(5)); - } - if (std::abs(maxAngValue - 90.0) > 1.0e-6) { - ErrorsFound = true; - ShowSevereError(state, - format("{}=\"{}\", Invalid maximum value of angle = {:.2R}.", - state.dataHeatBalMgr->CurrentModuleObject, - MaterialNames(1), - maxAngValue)); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(5) + - " requires the maximum value = 90.0 in the entered table name=" + MaterialNames(5)); - } - if (minLamValue < 0.1) { - ErrorsFound = true; - ShowSevereError(state, - format("{}=\"{}\", Invalid minimum value of wavelength = {:.2R}.", - state.dataHeatBalMgr->CurrentModuleObject, - MaterialNames(1), - minLamValue)); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(5) + - " requires the minumum value = 0.1 micron in the entered table name=" + MaterialNames(5)); - } - if (maxLamValue > 4.0) { - ErrorsFound = true; - ShowSevereError(state, - format("{}=\"{}\", Invalid maximum value of wavelength = {:.2R}.", - state.dataHeatBalMgr->CurrentModuleObject, - MaterialNames(1), - maxLamValue)); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(5) + - " requires the maximum value = 4.0 microns in the entered table name=" + MaterialNames(5)); - } - } - } - if (state.dataIPShortCut->lAlphaFieldBlanks(7)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", blank field."); - ShowContinueError(state, " Table name must be entered when the key SpectralAndAngle is selected as Optical Data Type."); - } else { - state.dataMaterial->Material(MaterNum).GlassSpecAngBRefleDataPtr = Curve::GetCurveIndex(state, MaterialNames(7)); - if (state.dataMaterial->Material(MaterNum).GlassSpecAngBRefleDataPtr == 0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Invalid name."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(7) + - " requires a valid table object name, entered input=" + MaterialNames(7)); - } else { - ErrorsFound |= Curve::CheckCurveDims(state, - state.dataMaterial->Material(MaterNum).GlassSpecAngBRefleDataPtr, // Curve index - {2}, // Valid dimensions - RoutineName, // Routine name - state.dataHeatBalMgr->CurrentModuleObject, // Object Type - state.dataMaterial->Material(MaterNum).Name, // Object Name - state.dataIPShortCut->cAlphaFieldNames(7)); // Field Name - - GetCurveMinMaxValues(state, - state.dataMaterial->Material(MaterNum).GlassSpecAngBRefleDataPtr, - minAngValue, - maxAngValue, - minLamValue, - maxLamValue); - if (minAngValue > 1.0e-6) { - ErrorsFound = true; - ShowSevereError(state, - format("{}=\"{}\", Invalid minimum value of angle = {:.2R}.", - state.dataHeatBalMgr->CurrentModuleObject, - MaterialNames(1), - minAngValue)); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(5) + - " requires the minumum value = 0.0 in the entered table name=" + MaterialNames(5)); - } - if (std::abs(maxAngValue - 90.0) > 1.0e-6) { - ErrorsFound = true; - ShowSevereError(state, - format("{}=\"{}\", Invalid maximum value of angle = {:.2R}.", - state.dataHeatBalMgr->CurrentModuleObject, - MaterialNames(1), - maxAngValue)); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(5) + - " requires the maximum value = 90.0 in the entered table name=" + MaterialNames(5)); - } - if (minLamValue < 0.1) { - ErrorsFound = true; - ShowSevereError(state, - format("{}=\"{}\", Invalid minimum value of wavelength = {:.2R}.", - state.dataHeatBalMgr->CurrentModuleObject, - MaterialNames(1), - minLamValue)); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(5) + - " requires the minumum value = 0.1 micron in the entered table name=" + MaterialNames(5)); - } - if (maxLamValue > 4.0) { - ErrorsFound = true; - ShowSevereError(state, - format("{}=\"{}\", Invalid maximum value of wavelength = {:.2R}.", - state.dataHeatBalMgr->CurrentModuleObject, - MaterialNames(1), - maxLamValue)); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(5) + - " requires the maximum value = 4.0 microns in the entered table name=" + MaterialNames(5)); - } - } - } - } - } - - // Glass materials, alternative input: index of refraction and extinction coefficient - - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Glazing:RefractionExtinctionMethod"; - for (Loop = 1; Loop <= state.dataHeatBal->W5GlsMatAlt; ++Loop) { - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGlass; - - // Load the material derived type from the input data. - - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VerySmooth; - state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(1); - state.dataMaterial->Material(MaterNum).ROnly = true; - - // Calculate solar and visible transmittance and reflectance at normal incidence from thickness, - // index of refraction and extinction coefficient. With the alternative input the front and back - // properties are assumed to be the same. - - ReflectivitySol = pow_2((MaterialProps(2) - 1.0) / (MaterialProps(2) + 1.0)); - ReflectivityVis = pow_2((MaterialProps(4) - 1.0) / (MaterialProps(4) + 1.0)); - TransmittivitySol = std::exp(-MaterialProps(3) * MaterialProps(1)); - TransmittivityVis = std::exp(-MaterialProps(5) * MaterialProps(1)); - state.dataMaterial->Material(MaterNum).Trans = - TransmittivitySol * pow_2(1.0 - ReflectivitySol) / (1.0 - pow_2(ReflectivitySol * TransmittivitySol)); - state.dataMaterial->Material(MaterNum).ReflectSolBeamFront = - ReflectivitySol * - (1.0 + pow_2(1.0 - ReflectivitySol) * pow_2(TransmittivitySol) / (1.0 - pow_2(ReflectivitySol * TransmittivitySol))); - state.dataMaterial->Material(MaterNum).ReflectSolBeamBack = state.dataMaterial->Material(MaterNum).ReflectSolBeamFront; - state.dataMaterial->Material(MaterNum).TransVis = - TransmittivityVis * pow_2(1.0 - ReflectivityVis) / (1.0 - pow_2(ReflectivityVis * TransmittivityVis)); - - state.dataMaterial->Material(MaterNum).ReflectVisBeamFront = - ReflectivityVis * - (1.0 + pow_2(1.0 - ReflectivityVis) * pow_2(TransmittivityVis) / (1.0 - pow_2(ReflectivityVis * TransmittivityVis))); - state.dataMaterial->Material(MaterNum).ReflectVisBeamBack = state.dataMaterial->Material(MaterNum).ReflectSolBeamFront; - state.dataMaterial->Material(MaterNum).TransThermal = MaterialProps(6); - state.dataMaterial->Material(MaterNum).AbsorpThermalFront = MaterialProps(7); - state.dataMaterial->Material(MaterNum).AbsorpThermalBack = MaterialProps(7); - state.dataMaterial->Material(MaterNum).Conductivity = MaterialProps(8); - state.dataMaterial->Material(MaterNum).GlassTransDirtFactor = MaterialProps(9); - if (MaterialProps(9) == 0.0) state.dataMaterial->Material(MaterNum).GlassTransDirtFactor = 1.0; - state.dataMaterial->Material(MaterNum).AbsorpThermal = state.dataMaterial->Material(MaterNum).AbsorpThermalBack; - - if (state.dataMaterial->Material(MaterNum).Conductivity > 0.0) { - state.dataHeatBal->NominalR(MaterNum) = - state.dataMaterial->Material(MaterNum).Thickness / state.dataMaterial->Material(MaterNum).Conductivity; - state.dataMaterial->Material(MaterNum).Resistance = state.dataHeatBal->NominalR(MaterNum); - } - - state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = 0; - - if (MaterialProps(6) + MaterialProps(7) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(6) + " + " + state.dataIPShortCut->cNumericFieldNames(7) + " not < 1.0"); - } - - if (MaterialNames(2) == "") { - state.dataMaterial->Material(MaterNum).SolarDiffusing = false; - } else if (MaterialNames(2) == "YES") { - state.dataMaterial->Material(MaterNum).SolarDiffusing = true; - } else if (MaterialNames(2) == "NO") { - state.dataMaterial->Material(MaterNum).SolarDiffusing = false; - } else { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(2) + " must be Yes or No, entered value=" + MaterialNames(4)); - } - } - - // Glass materials, equivalent layer (ASHWAT) method - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Glazing:EquivalentLayer"; - for (Loop = 1; Loop <= state.dataHeatBal->W5GlsMatEQL; ++Loop) { - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::GlassEquivalentLayer; - - // Load the material derived type from the input data. - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VerySmooth; - state.dataMaterial->Material(MaterNum).ROnly = true; - - state.dataMaterial->Material(MaterNum).TausFrontBeamBeam = MaterialProps(1); - state.dataMaterial->Material(MaterNum).TausBackBeamBeam = MaterialProps(2); - state.dataMaterial->Material(MaterNum).ReflFrontBeamBeam = MaterialProps(3); - state.dataMaterial->Material(MaterNum).ReflBackBeamBeam = MaterialProps(4); - state.dataMaterial->Material(MaterNum).TausFrontBeamBeamVis = MaterialProps(5); - state.dataMaterial->Material(MaterNum).TausBackBeamBeamVis = MaterialProps(6); - state.dataMaterial->Material(MaterNum).ReflFrontBeamBeamVis = MaterialProps(7); - state.dataMaterial->Material(MaterNum).ReflBackBeamBeamVis = MaterialProps(8); - state.dataMaterial->Material(MaterNum).TausFrontBeamDiff = MaterialProps(9); - state.dataMaterial->Material(MaterNum).TausBackBeamDiff = MaterialProps(10); - state.dataMaterial->Material(MaterNum).ReflFrontBeamDiff = MaterialProps(11); - state.dataMaterial->Material(MaterNum).ReflBackBeamDiff = MaterialProps(12); - state.dataMaterial->Material(MaterNum).TausFrontBeamDiffVis = MaterialProps(13); - state.dataMaterial->Material(MaterNum).TausBackBeamDiffVis = MaterialProps(14); - state.dataMaterial->Material(MaterNum).ReflFrontBeamDiffVis = MaterialProps(15); - state.dataMaterial->Material(MaterNum).ReflBackBeamDiffVis = MaterialProps(16); - state.dataMaterial->Material(MaterNum).TausDiffDiff = MaterialProps(17); - state.dataMaterial->Material(MaterNum).ReflFrontDiffDiff = MaterialProps(18); - state.dataMaterial->Material(MaterNum).ReflBackDiffDiff = MaterialProps(19); - state.dataMaterial->Material(MaterNum).TausDiffDiffVis = MaterialProps(20); - state.dataMaterial->Material(MaterNum).ReflFrontDiffDiffVis = MaterialProps(21); - state.dataMaterial->Material(MaterNum).ReflBackDiffDiffVis = MaterialProps(22); - state.dataMaterial->Material(MaterNum).TausThermal = MaterialProps(23); - state.dataMaterial->Material(MaterNum).EmissThermalFront = MaterialProps(24); - state.dataMaterial->Material(MaterNum).EmissThermalBack = MaterialProps(25); - state.dataMaterial->Material(MaterNum).Resistance = MaterialProps(26); - if (state.dataMaterial->Material(MaterNum).Resistance <= 0.0) - state.dataMaterial->Material(MaterNum).Resistance = 0.158; // equivalent to single pane of 1/4" inch standard glass - // Assumes thermal emissivity is the same as thermal absorptance - state.dataMaterial->Material(MaterNum).AbsorpThermalFront = state.dataMaterial->Material(MaterNum).EmissThermalFront; - state.dataMaterial->Material(MaterNum).AbsorpThermalBack = state.dataMaterial->Material(MaterNum).EmissThermalBack; - state.dataMaterial->Material(MaterNum).TransThermal = state.dataMaterial->Material(MaterNum).TausThermal; - - if (UtilityRoutines::SameString(MaterialNames(2), "SpectralAverage")) state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = 0; - - // IF(dataMaterial.Material(MaterNum)%GlassSpectralDataPtr == 0 .AND. UtilityRoutines::SameString(MaterialNames(2),'Spectral')) THEN - // ErrorsFound = .TRUE. - // CALL ShowSevereError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//'="'//Trim(dataMaterial.Material(MaterNum)%Name)// & - // '" has '//TRIM(cAlphaFieldNames(2))//' = Spectral but has no matching MaterialProperty:GlazingSpectralData set') - // if (state.dataIPShortCut->lAlphaFieldBlanks(3)) THEN - // CALL ShowContinueError(state, '...'//TRIM(cAlphaFieldNames(3))//' is blank.') - // ELSE - // CALL ShowContinueError(state, '...'//TRIM(cAlphaFieldNames(3))//'="'//TRIM(MaterialNames(3))// & - // '" not found as item in MaterialProperty:GlazingSpectralData objects.') - // END IF - // END IF - - if (!UtilityRoutines::SameString(MaterialNames(2), "SpectralAverage")) { - ErrorsFound = true; - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataMaterial->Material(MaterNum).Name + - "\", invalid specification."); - ShowContinueError(state, state.dataIPShortCut->cAlphaFieldNames(2) + " must be SpectralAverage, value=" + MaterialNames(2)); - } - - } // W5GlsMatEQL loop - - // Window gas materials (for gaps with a single gas) - - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Gas"; - for (Loop = 1; Loop <= state.dataHeatBal->W5GasMat; ++Loop) { - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGas; - state.dataMaterial->Material(MaterNum).GasType(1) = -1; - state.dataMaterial->Material(MaterNum).NumberOfGasesInMixture = 1; - state.dataMaterial->Material(MaterNum).GasFract(1) = 1.0; - - // Load the material derived type from the input data. - - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - state.dataMaterial->Material(MaterNum).NumberOfGasesInMixture = 1; - TypeOfGas = MaterialNames(2); - if (TypeOfGas == "AIR") state.dataMaterial->Material(MaterNum).GasType(1) = 1; - if (TypeOfGas == "ARGON") state.dataMaterial->Material(MaterNum).GasType(1) = 2; - if (TypeOfGas == "KRYPTON") state.dataMaterial->Material(MaterNum).GasType(1) = 3; - if (TypeOfGas == "XENON") state.dataMaterial->Material(MaterNum).GasType(1) = 4; - if (TypeOfGas == "CUSTOM") state.dataMaterial->Material(MaterNum).GasType(1) = 0; - - if (state.dataMaterial->Material(MaterNum).GasType(1) == -1) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(2) + " entered value=\"" + TypeOfGas + - "\" should be Air, Argon, Krypton, Xenon or Custom."); - } - - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; - - state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(1); - state.dataMaterial->Material(MaterNum).ROnly = true; - - GasType = state.dataMaterial->Material(MaterNum).GasType(1); - if (GasType >= 1 && GasType <= 4) { - state.dataMaterial->Material(MaterNum).GasWght(1) = GasWght[GasType - 1]; - state.dataMaterial->Material(MaterNum).GasSpecHeatRatio(1) = GasSpecificHeatRatio[GasType - 1]; - for (ICoeff = 1; ICoeff <= 3; ++ICoeff) { - state.dataMaterial->Material(MaterNum).GasCon(ICoeff, 1) = GasCoeffsCon[ICoeff - 1][GasType - 1]; - state.dataMaterial->Material(MaterNum).GasVis(ICoeff, 1) = GasCoeffsVis[ICoeff - 1][GasType - 1]; - state.dataMaterial->Material(MaterNum).GasCp(ICoeff, 1) = GasCoeffsCp[ICoeff - 1][GasType - 1]; - } - } - - // Custom gas - - if (GasType == 0) { - for (ICoeff = 1; ICoeff <= 3; ++ICoeff) { - state.dataMaterial->Material(MaterNum).GasCon(ICoeff, 1) = MaterialProps(1 + ICoeff); - state.dataMaterial->Material(MaterNum).GasVis(ICoeff, 1) = MaterialProps(4 + ICoeff); - state.dataMaterial->Material(MaterNum).GasCp(ICoeff, 1) = MaterialProps(7 + ICoeff); - } - state.dataMaterial->Material(MaterNum).GasWght(1) = MaterialProps(11); - state.dataMaterial->Material(MaterNum).GasSpecHeatRatio(1) = MaterialProps(12); - - // Check for errors in custom gas properties - // IF(dataMaterial.Material(MaterNum)%GasCon(1,1) <= 0.0) THEN - // ErrorsFound = .TRUE. - // CALL ShowSevereError(state, 'Conductivity Coefficient A for custom window gas='& - // //TRIM(MaterialNames(1))//' should be > 0.') - // END IF - - if (state.dataMaterial->Material(MaterNum).GasVis(1, 1) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(3 + ICoeff) + " not > 0.0"); - } - if (state.dataMaterial->Material(MaterNum).GasCp(1, 1) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(5 + ICoeff) + " not > 0.0"); - } - if (state.dataMaterial->Material(MaterNum).GasWght(1) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(8) + " not > 0.0"); - } - } - - // Nominal resistance of gap at room temperature - if (!ErrorsFound) { - DenomRGas = (state.dataMaterial->Material(MaterNum).GasCon(1, 1) + state.dataMaterial->Material(MaterNum).GasCon(2, 1) * 300.0 + - state.dataMaterial->Material(MaterNum).GasCon(3, 1) * 90000.0); - if (DenomRGas > 0.0) { - state.dataHeatBal->NominalR(MaterNum) = state.dataMaterial->Material(MaterNum).Thickness / DenomRGas; - } else { - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError( - state, format("Nominal resistance of gap at room temperature calculated at a negative Conductivity=[{:.3R}].", DenomRGas)); - ErrorsFound = true; - } - } - } - - // Window gap materials (for gaps with a single gas for EquivalentLayer) - - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Gap:EquivalentLayer"; - for (Loop = 1; Loop <= state.dataHeatBal->W5GapMatEQL; ++Loop) { - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::GapEquivalentLayer; - state.dataMaterial->Material(MaterNum).GasType(1) = -1; - state.dataMaterial->Material(MaterNum).NumberOfGasesInMixture = 1; - state.dataMaterial->Material(MaterNum).GasFract(1) = 1.0; - - // Load the material derived type from the input data. - - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - state.dataMaterial->Material(MaterNum).NumberOfGasesInMixture = 1; - TypeOfGas = MaterialNames(2); - state.dataMaterial->Material(MaterNum).GasName = TypeOfGas; - if (TypeOfGas == "AIR") state.dataMaterial->Material(MaterNum).GasType(1) = 1; - if (TypeOfGas == "ARGON") state.dataMaterial->Material(MaterNum).GasType(1) = 2; - if (TypeOfGas == "KRYPTON") state.dataMaterial->Material(MaterNum).GasType(1) = 3; - if (TypeOfGas == "XENON") state.dataMaterial->Material(MaterNum).GasType(1) = 4; - if (TypeOfGas == "CUSTOM") state.dataMaterial->Material(MaterNum).GasType(1) = 0; - - if (state.dataMaterial->Material(MaterNum).GasType(1) == -1) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError( - state, state.dataIPShortCut->cAlphaFieldNames(2) + " entered value=\"" + TypeOfGas + "\" should be Air, Argon, Krypton, Xenon"); - } - - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; - - state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(1); - state.dataMaterial->Material(MaterNum).ROnly = true; - - GasType = state.dataMaterial->Material(MaterNum).GasType(1); - if (GasType >= 1 && GasType <= 4) { - state.dataMaterial->Material(MaterNum).GasWght(1) = GasWght[GasType - 1]; - state.dataMaterial->Material(MaterNum).GasSpecHeatRatio(1) = GasSpecificHeatRatio[GasType - 1]; - for (ICoeff = 1; ICoeff <= 3; ++ICoeff) { - state.dataMaterial->Material(MaterNum).GasCon(ICoeff, 1) = GasCoeffsCon[ICoeff - 1][GasType - 1]; - state.dataMaterial->Material(MaterNum).GasVis(ICoeff, 1) = GasCoeffsVis[ICoeff - 1][GasType - 1]; - state.dataMaterial->Material(MaterNum).GasCp(ICoeff, 1) = GasCoeffsCp[ICoeff - 1][GasType - 1]; - } - } - - if (!state.dataIPShortCut->lAlphaFieldBlanks(2)) { - // Get gap vent type - if (UtilityRoutines::SameString(MaterialNames(3), "Sealed")) { - state.dataMaterial->Material(MaterNum).GapVentType = 1; - } else if (UtilityRoutines::SameString(MaterialNames(3), "VentedIndoor")) { - state.dataMaterial->Material(MaterNum).GapVentType = 2; - } else if (UtilityRoutines::SameString(MaterialNames(3), "VentedOutdoor")) { - state.dataMaterial->Material(MaterNum).GapVentType = 3; - } else { - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal gap vent type."); - ShowContinueError(state, - "Gap vent type allowed are Sealed, VentedIndoor, or VentedOutdoor." + - state.dataIPShortCut->cAlphaFieldNames(3) + " entered =" + MaterialNames(3)); - state.dataMaterial->Material(MaterNum).GapVentType = 1; - // ErrorsFound=.TRUE. - } - } - - if (GasType == 0) { - for (ICoeff = 1; ICoeff <= 3; ++ICoeff) { - state.dataMaterial->Material(MaterNum).GasCon(ICoeff, 1) = MaterialProps(1 + ICoeff); - state.dataMaterial->Material(MaterNum).GasVis(ICoeff, 1) = MaterialProps(4 + ICoeff); - state.dataMaterial->Material(MaterNum).GasCp(ICoeff, 1) = MaterialProps(7 + ICoeff); - } - state.dataMaterial->Material(MaterNum).GasWght(1) = MaterialProps(11); - state.dataMaterial->Material(MaterNum).GasSpecHeatRatio(1) = MaterialProps(12); - - if (state.dataMaterial->Material(MaterNum).GasVis(1, 1) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(5) + " not > 0.0"); - } - if (state.dataMaterial->Material(MaterNum).GasCp(1, 1) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(8) + " not > 0.0"); - } - if (state.dataMaterial->Material(MaterNum).GasWght(1) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(11) + " not > 0.0"); - } - } - - // Nominal resistance of gap at room temperature - if (!ErrorsFound) { - DenomRGas = (state.dataMaterial->Material(MaterNum).GasCon(1, 1) + state.dataMaterial->Material(MaterNum).GasCon(2, 1) * 300.0 + - state.dataMaterial->Material(MaterNum).GasCon(3, 1) * 90000.0); - if (DenomRGas > 0.0) { - state.dataHeatBal->NominalR(MaterNum) = state.dataMaterial->Material(MaterNum).Thickness / DenomRGas; - } else { - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError( - state, format("Nominal resistance of gap at room temperature calculated at a negative Conductivity=[{:.3R}].", DenomRGas)); - ErrorsFound = true; - } - } - } - - // Window gas mixtures (for gaps with two or more gases) - - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:GasMixture"; - for (Loop = 1; Loop <= state.dataHeatBal->W5GasMatMixture; ++Loop) { - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - state.dataIPShortCut->cAlphaArgs, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - state.dataIPShortCut->cAlphaArgs(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGasMixture; - state.dataMaterial->Material(MaterNum).GasType = -1; - - // Load the material derived type from the input data. - - state.dataMaterial->Material(MaterNum).Name = state.dataIPShortCut->cAlphaArgs(1); - NumGases = MaterialProps(2); - state.dataMaterial->Material(MaterNum).NumberOfGasesInMixture = NumGases; - for (NumGas = 1; NumGas <= NumGases; ++NumGas) { - TypeOfGas = state.dataIPShortCut->cAlphaArgs(1 + NumGas); - if (TypeOfGas == "AIR") state.dataMaterial->Material(MaterNum).GasType(NumGas) = 1; - if (TypeOfGas == "ARGON") state.dataMaterial->Material(MaterNum).GasType(NumGas) = 2; - if (TypeOfGas == "KRYPTON") state.dataMaterial->Material(MaterNum).GasType(NumGas) = 3; - if (TypeOfGas == "XENON") state.dataMaterial->Material(MaterNum).GasType(NumGas) = 4; - if (state.dataMaterial->Material(MaterNum).GasType(NumGas) == -1) { - ErrorsFound = true; - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + "\", Illegal value."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(2 + NumGas) + " entered value=\"" + TypeOfGas + - "\" should be Air, Argon, Krypton, or Xenon."); - } - } - - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; // Unused - - state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(1); - if (state.dataMaterial->Material(MaterNum).Thickness <= 0.0) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(1) + " must be greater than 0."); - } - state.dataMaterial->Material(MaterNum).ROnly = true; - - for (NumGas = 1; NumGas <= NumGases; ++NumGas) { - GasType = state.dataMaterial->Material(MaterNum).GasType(NumGas); - if (GasType >= 1 && GasType <= 4) { - state.dataMaterial->Material(MaterNum).GasWght(NumGas) = GasWght[GasType - 1]; - state.dataMaterial->Material(MaterNum).GasSpecHeatRatio(NumGas) = GasSpecificHeatRatio[GasType - 1]; - state.dataMaterial->Material(MaterNum).GasFract(NumGas) = MaterialProps(2 + NumGas); - for (ICoeff = 1; ICoeff <= 3; ++ICoeff) { - state.dataMaterial->Material(MaterNum).GasCon(ICoeff, NumGas) = GasCoeffsCon[ICoeff - 1][GasType - 1]; - state.dataMaterial->Material(MaterNum).GasVis(ICoeff, NumGas) = GasCoeffsVis[ICoeff - 1][GasType - 1]; - state.dataMaterial->Material(MaterNum).GasCp(ICoeff, NumGas) = GasCoeffsCp[ICoeff - 1][GasType - 1]; - } - } - } - - // Nominal resistance of gap at room temperature (based on first gas in mixture) - state.dataHeatBal->NominalR(MaterNum) = - state.dataMaterial->Material(MaterNum).Thickness / - (state.dataMaterial->Material(MaterNum).GasCon(1, 1) + state.dataMaterial->Material(MaterNum).GasCon(2, 1) * 300.0 + - state.dataMaterial->Material(MaterNum).GasCon(3, 1) * 90000.0); - } - - // Window Shade Materials - - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Shade"; - for (Loop = 1; Loop <= state.dataHeatBal->TotShades; ++Loop) { - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::Shade; - - // Load the material derived type from the input data. - - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; - state.dataMaterial->Material(MaterNum).Trans = MaterialProps(1); - state.dataMaterial->Material(MaterNum).ReflectShade = MaterialProps(2); - state.dataMaterial->Material(MaterNum).TransVis = MaterialProps(3); - state.dataMaterial->Material(MaterNum).ReflectShadeVis = MaterialProps(4); - state.dataMaterial->Material(MaterNum).AbsorpThermal = MaterialProps(5); - state.dataMaterial->Material(MaterNum).AbsorpThermalInput = MaterialProps(5); - state.dataMaterial->Material(MaterNum).TransThermal = MaterialProps(6); - state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(7); - state.dataMaterial->Material(MaterNum).Conductivity = MaterialProps(8); - state.dataMaterial->Material(MaterNum).AbsorpSolar = - max(0.0, 1.0 - state.dataMaterial->Material(MaterNum).Trans - state.dataMaterial->Material(MaterNum).ReflectShade); - state.dataMaterial->Material(MaterNum).AbsorpSolarInput = state.dataMaterial->Material(MaterNum).AbsorpSolar; - state.dataMaterial->Material(MaterNum).WinShadeToGlassDist = MaterialProps(9); - state.dataMaterial->Material(MaterNum).WinShadeTopOpeningMult = MaterialProps(10); - state.dataMaterial->Material(MaterNum).WinShadeBottomOpeningMult = MaterialProps(11); - state.dataMaterial->Material(MaterNum).WinShadeLeftOpeningMult = MaterialProps(12); - state.dataMaterial->Material(MaterNum).WinShadeRightOpeningMult = MaterialProps(13); - state.dataMaterial->Material(MaterNum).WinShadeAirFlowPermeability = MaterialProps(14); - state.dataMaterial->Material(MaterNum).ROnly = true; - - if (state.dataMaterial->Material(MaterNum).Conductivity > 0.0) { - state.dataHeatBal->NominalR(MaterNum) = - state.dataMaterial->Material(MaterNum).Thickness / state.dataMaterial->Material(MaterNum).Conductivity; - } else { - state.dataHeatBal->NominalR(MaterNum) = 1.0; - } - - if (MaterialProps(1) + MaterialProps(2) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(1) + " + " + state.dataIPShortCut->cNumericFieldNames(2) + " not < 1.0"); - } - - if (MaterialProps(3) + MaterialProps(4) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(3) + " + " + state.dataIPShortCut->cNumericFieldNames(4) + " not < 1.0"); - } - - if (MaterialProps(5) + MaterialProps(6) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(5) + " + " + state.dataIPShortCut->cNumericFieldNames(6) + " not < 1.0"); - } - } - - // Window Shade Materials - - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Shade:EquivalentLayer"; - for (Loop = 1; Loop <= state.dataHeatBal->TotShadesEQL; ++Loop) { - - MaterialProps = 0; - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::ShadeEquivalentLayer; - - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; - state.dataMaterial->Material(MaterNum).ROnly = true; - - // Front side and back side have the same beam-Beam Transmittance - state.dataMaterial->Material(MaterNum).TausFrontBeamBeam = MaterialProps(1); - state.dataMaterial->Material(MaterNum).TausBackBeamBeam = MaterialProps(1); - state.dataMaterial->Material(MaterNum).TausFrontBeamDiff = MaterialProps(2); - state.dataMaterial->Material(MaterNum).TausBackBeamDiff = MaterialProps(3); - state.dataMaterial->Material(MaterNum).ReflFrontBeamDiff = MaterialProps(4); - state.dataMaterial->Material(MaterNum).ReflBackBeamDiff = MaterialProps(5); - state.dataMaterial->Material(MaterNum).TausFrontBeamBeamVis = MaterialProps(6); - state.dataMaterial->Material(MaterNum).TausFrontBeamDiffVis = MaterialProps(7); - state.dataMaterial->Material(MaterNum).ReflFrontBeamDiffVis = MaterialProps(8); - state.dataMaterial->Material(MaterNum).TausThermal = MaterialProps(9); - state.dataMaterial->Material(MaterNum).EmissThermalFront = MaterialProps(10); - state.dataMaterial->Material(MaterNum).EmissThermalBack = MaterialProps(11); - // Assumes thermal emissivity is the same as thermal absorptance - state.dataMaterial->Material(MaterNum).AbsorpThermalFront = state.dataMaterial->Material(MaterNum).EmissThermalFront; - state.dataMaterial->Material(MaterNum).AbsorpThermalBack = state.dataMaterial->Material(MaterNum).EmissThermalBack; - state.dataMaterial->Material(MaterNum).TransThermal = state.dataMaterial->Material(MaterNum).TausThermal; - - if (MaterialProps(1) + MaterialProps(2) + MaterialProps(4) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(1) + " + " + state.dataIPShortCut->cNumericFieldNames(2) + " + " + - state.dataIPShortCut->cNumericFieldNames(4) + "not < 1.0"); - } - if (MaterialProps(1) + MaterialProps(3) + MaterialProps(5) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(1) + " + " + state.dataIPShortCut->cNumericFieldNames(3) + " + " + - state.dataIPShortCut->cNumericFieldNames(5) + "not < 1.0"); - } - if (MaterialProps(6) + MaterialProps(7) + MaterialProps(8) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(6) + " + " + state.dataIPShortCut->cNumericFieldNames(7) + " + " + - state.dataIPShortCut->cNumericFieldNames(8) + "not < 1.0"); - } - if (MaterialProps(9) + MaterialProps(10) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(9) + " + " + state.dataIPShortCut->cNumericFieldNames(10) + " not < 1.0"); - } - if (MaterialProps(9) + MaterialProps(11) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(9) + " + " + state.dataIPShortCut->cNumericFieldNames(11) + " not < 1.0"); - } - - } // TotShadesEQL loop - - // Window drape materials - - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Drape:EquivalentLayer"; - for (Loop = 1; Loop <= state.dataHeatBal->TotDrapesEQL; ++Loop) { - - MaterialProps = 0; - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::DrapeEquivalentLayer; - - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; - state.dataMaterial->Material(MaterNum).ROnly = true; - - // Front side and back side have the same properties - state.dataMaterial->Material(MaterNum).TausFrontBeamBeam = MaterialProps(1); - state.dataMaterial->Material(MaterNum).TausBackBeamBeam = MaterialProps(1); - - state.dataMaterial->Material(MaterNum).TausFrontBeamDiff = MaterialProps(2); - state.dataMaterial->Material(MaterNum).TausBackBeamDiff = MaterialProps(3); - - state.dataMaterial->Material(MaterNum).ReflFrontBeamDiff = MaterialProps(4); - state.dataMaterial->Material(MaterNum).ReflBackBeamDiff = MaterialProps(5); - state.dataMaterial->Material(MaterNum).TausFrontBeamBeamVis = MaterialProps(6); - state.dataMaterial->Material(MaterNum).TausFrontBeamDiffVis = MaterialProps(7); - state.dataMaterial->Material(MaterNum).ReflFrontBeamDiffVis = MaterialProps(8); - state.dataMaterial->Material(MaterNum).TausThermal = MaterialProps(9); - state.dataMaterial->Material(MaterNum).EmissThermalFront = MaterialProps(10); - state.dataMaterial->Material(MaterNum).EmissThermalBack = MaterialProps(11); - // Assumes thermal emissivity is the same as thermal absorptance - state.dataMaterial->Material(MaterNum).AbsorpThermalFront = state.dataMaterial->Material(MaterNum).EmissThermalFront; - state.dataMaterial->Material(MaterNum).AbsorpThermalBack = state.dataMaterial->Material(MaterNum).EmissThermalBack; - state.dataMaterial->Material(MaterNum).TransThermal = state.dataMaterial->Material(MaterNum).TausThermal; - - if (!state.dataIPShortCut->lNumericFieldBlanks(12) && !state.dataIPShortCut->lNumericFieldBlanks(13)) { - if (MaterialProps(12) != 0.0 && MaterialProps(13) != 0.0) { - state.dataMaterial->Material(MaterNum).PleatedDrapeWidth = MaterialProps(12); - state.dataMaterial->Material(MaterNum).PleatedDrapeLength = MaterialProps(13); - state.dataMaterial->Material(MaterNum).ISPleatedDrape = true; - } - } else { - state.dataMaterial->Material(MaterNum).ISPleatedDrape = false; - } - if (MaterialProps(1) + MaterialProps(2) + MaterialProps(4) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(1) + " + " + state.dataIPShortCut->cNumericFieldNames(2) + " + " + - state.dataIPShortCut->cNumericFieldNames(4) + "not < 1.0"); - } - if (MaterialProps(6) + MaterialProps(7) + MaterialProps(8) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(4) + " + " + state.dataIPShortCut->cNumericFieldNames(5) + " + " + - state.dataIPShortCut->cNumericFieldNames(6) + "not < 1.0"); - } - if (MaterialProps(9) + MaterialProps(10) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(9) + " + " + state.dataIPShortCut->cNumericFieldNames(10) + " not < 1.0"); - } - - } // TotDrapesEQL loop - - // Window Screen Materials - - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Screen"; - for (Loop = 1; Loop <= state.dataHeatBal->TotScreens; ++Loop) { - - // Call GetObjectItem routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::Screen; - - // Load the material derived type from the input data. - - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - state.dataMaterial->Material(MaterNum).ReflectanceModeling = MaterialNames(2); - if (!(UtilityRoutines::SameString(MaterialNames(2), "DoNotModel") || UtilityRoutines::SameString(MaterialNames(2), "ModelAsDirectBeam") || - UtilityRoutines::SameString(MaterialNames(2), "ModelAsDiffuse"))) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(2) + "=\"" + MaterialNames(2) + - "\", must be one of DoNotModel, ModelAsDirectBeam or ModelAsDiffuse."); - } - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; - state.dataMaterial->Material(MaterNum).ReflectShade = MaterialProps(1); - if (state.dataMaterial->Material(MaterNum).ReflectShade < 0.0 || state.dataMaterial->Material(MaterNum).ReflectShade > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(1) + " must be >= 0 and <= 1"); - } - state.dataMaterial->Material(MaterNum).ReflectShadeVis = MaterialProps(2); - if (state.dataMaterial->Material(MaterNum).ReflectShadeVis < 0.0 || state.dataMaterial->Material(MaterNum).ReflectShadeVis > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(2) + " must be >= 0 and <= 1 for material " + - state.dataMaterial->Material(MaterNum).Name + '.'); - } - state.dataMaterial->Material(MaterNum).AbsorpThermal = MaterialProps(3); - state.dataMaterial->Material(MaterNum).AbsorpThermalInput = MaterialProps(3); - if (state.dataMaterial->Material(MaterNum).AbsorpThermal < 0.0 || state.dataMaterial->Material(MaterNum).AbsorpThermal > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(3) + " must be >= 0 and <= 1"); - } - state.dataMaterial->Material(MaterNum).Conductivity = MaterialProps(4); - state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(6); // thickness = diameter - - if (MaterialProps(5) > 0.0) { - // SurfaceScreens(ScNum)%ScreenDiameterToSpacingRatio = MaterialProps(6)/MaterialProps(5) or - // 1-SQRT(dataMaterial.Material(MaterNum)%Trans - if (MaterialProps(6) / MaterialProps(5) >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError( - state, state.dataIPShortCut->cNumericFieldNames(6) + " must be less than " + state.dataIPShortCut->cNumericFieldNames(5)); - } else { - // Calculate direct normal transmittance (open area fraction) - state.dataMaterial->Material(MaterNum).Trans = pow_2(1.0 - MaterialProps(6) / MaterialProps(5)); - } - } else { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(5) + " must be > 0."); - MaterialProps(5) = 0.000000001; - } - - if (MaterialProps(6) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(6) + " must be > 0."); - } - - // Modify reflectance to account for the open area in the screen assembly - state.dataMaterial->Material(MaterNum).ReflectShade *= (1.0 - state.dataMaterial->Material(MaterNum).Trans); - state.dataMaterial->Material(MaterNum).ReflectShadeVis *= (1.0 - state.dataMaterial->Material(MaterNum).Trans); - - state.dataMaterial->Material(MaterNum).WinShadeToGlassDist = MaterialProps(7); - if (state.dataMaterial->Material(MaterNum).WinShadeToGlassDist < 0.001 || - state.dataMaterial->Material(MaterNum).WinShadeToGlassDist > 1.0) { - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError( - state, state.dataIPShortCut->cNumericFieldNames(7) + " must be greater than or equal to 0.001 and less than or equal to 1."); - } - - state.dataMaterial->Material(MaterNum).WinShadeTopOpeningMult = MaterialProps(8); - if (state.dataMaterial->Material(MaterNum).WinShadeTopOpeningMult < 0.0 || - state.dataMaterial->Material(MaterNum).WinShadeTopOpeningMult > 1.0) { - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(8) + " must be greater than or equal to 0 and less than or equal to 1."); - } - - state.dataMaterial->Material(MaterNum).WinShadeBottomOpeningMult = MaterialProps(9); - if (state.dataMaterial->Material(MaterNum).WinShadeBottomOpeningMult < 0.0 || - state.dataMaterial->Material(MaterNum).WinShadeBottomOpeningMult > 1.0) { - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(9) + " must be greater than or equal to 0 and less than or equal to 1."); - } - - state.dataMaterial->Material(MaterNum).WinShadeLeftOpeningMult = MaterialProps(10); - if (state.dataMaterial->Material(MaterNum).WinShadeLeftOpeningMult < 0.0 || - state.dataMaterial->Material(MaterNum).WinShadeLeftOpeningMult > 1.0) { - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(10) + " must be greater than or equal to 0 and less than or equal to 1."); - } - - state.dataMaterial->Material(MaterNum).WinShadeRightOpeningMult = MaterialProps(11); - if (state.dataMaterial->Material(MaterNum).WinShadeRightOpeningMult < 0.0 || - state.dataMaterial->Material(MaterNum).WinShadeRightOpeningMult > 1.0) { - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(11) + " must be greater than or equal to 0 and less than or equal to 1."); - } - - state.dataMaterial->Material(MaterNum).ScreenMapResolution = MaterialProps(12); - if (state.dataMaterial->Material(MaterNum).ScreenMapResolution < 0 || state.dataMaterial->Material(MaterNum).ScreenMapResolution > 5 || - state.dataMaterial->Material(MaterNum).ScreenMapResolution == 4) { - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(12) + " must be 0, 1, 2, 3, or 5."); - ErrorsFound = true; - } - - // Default air flow permeability to open area fraction - state.dataMaterial->Material(MaterNum).WinShadeAirFlowPermeability = state.dataMaterial->Material(MaterNum).Trans; - state.dataMaterial->Material(MaterNum).TransThermal = state.dataMaterial->Material(MaterNum).Trans; - state.dataMaterial->Material(MaterNum).TransVis = state.dataMaterial->Material(MaterNum).Trans; - - state.dataMaterial->Material(MaterNum).ROnly = true; - - // Calculate absorptance accounting for the open area in the screen assembly (used only in CreateShadedWindowConstruction) - state.dataMaterial->Material(MaterNum).AbsorpSolar = - max(0.0, 1.0 - state.dataMaterial->Material(MaterNum).Trans - state.dataMaterial->Material(MaterNum).ReflectShade); - state.dataMaterial->Material(MaterNum).AbsorpSolarInput = state.dataMaterial->Material(MaterNum).AbsorpSolar; - state.dataMaterial->Material(MaterNum).AbsorpVisible = - max(0.0, 1.0 - state.dataMaterial->Material(MaterNum).TransVis - state.dataMaterial->Material(MaterNum).ReflectShadeVis); - state.dataMaterial->Material(MaterNum).AbsorpVisibleInput = state.dataMaterial->Material(MaterNum).AbsorpVisible; - state.dataMaterial->Material(MaterNum).AbsorpThermal *= (1.0 - state.dataMaterial->Material(MaterNum).Trans); - state.dataMaterial->Material(MaterNum).AbsorpThermalInput = state.dataMaterial->Material(MaterNum).AbsorpThermal; - - if (state.dataMaterial->Material(MaterNum).Conductivity > 0.0) { - state.dataHeatBal->NominalR(MaterNum) = (1.0 - state.dataMaterial->Material(MaterNum).Trans) * - state.dataMaterial->Material(MaterNum).Thickness / - state.dataMaterial->Material(MaterNum).Conductivity; - } else { - state.dataHeatBal->NominalR(MaterNum) = 1.0; - ShowWarningError( - state, - "Conductivity for material=\"" + state.dataMaterial->Material(MaterNum).Name + - "\" must be greater than 0 for calculating Nominal R-value, Nominal R is defaulted to 1 and the simulation continues."); - } - - if (state.dataMaterial->Material(MaterNum).Trans + state.dataMaterial->Material(MaterNum).ReflectShade >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, "Calculated solar transmittance + solar reflectance not < 1.0"); - ShowContinueError(state, "See Engineering Reference for calculation procedure for solar transmittance."); - } - - if (state.dataMaterial->Material(MaterNum).TransVis + state.dataMaterial->Material(MaterNum).ReflectShadeVis >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, "Calculated visible transmittance + visible reflectance not < 1.0"); - ShowContinueError(state, "See Engineering Reference for calculation procedure for visible solar transmittance."); - } - - if (state.dataMaterial->Material(MaterNum).TransThermal + state.dataMaterial->Material(MaterNum).AbsorpThermal >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowSevereError(state, "Thermal hemispherical emissivity plus open area fraction (1-diameter/spacing)**2 not < 1.0"); - } - } - - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Screen:EquivalentLayer"; - for (Loop = 1; Loop <= state.dataHeatBal->TotScreensEQL; ++Loop) { - - MaterialProps = 0; - - // Call GetObjectItem routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::ScreenEquivalentLayer; - - // Load the material derived type from the input data. - // WindowMaterial:Screen:EquivalentLayer, - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; - state.dataMaterial->Material(MaterNum).ROnly = true; - state.dataMaterial->Material(MaterNum).TausFrontBeamBeam = MaterialProps(1); - state.dataMaterial->Material(MaterNum).TausBackBeamBeam = MaterialProps(1); - state.dataMaterial->Material(MaterNum).TausFrontBeamDiff = MaterialProps(2); - state.dataMaterial->Material(MaterNum).TausBackBeamDiff = MaterialProps(2); - state.dataMaterial->Material(MaterNum).ReflFrontBeamDiff = MaterialProps(3); - state.dataMaterial->Material(MaterNum).ReflBackBeamDiff = MaterialProps(3); - state.dataMaterial->Material(MaterNum).TausFrontBeamBeamVis = MaterialProps(4); - state.dataMaterial->Material(MaterNum).TausFrontBeamDiffVis = MaterialProps(5); - state.dataMaterial->Material(MaterNum).ReflFrontDiffDiffVis = MaterialProps(6); - state.dataMaterial->Material(MaterNum).TausThermal = MaterialProps(7); - state.dataMaterial->Material(MaterNum).EmissThermalFront = MaterialProps(8); - state.dataMaterial->Material(MaterNum).EmissThermalBack = MaterialProps(8); - - // Assumes thermal emissivity is the same as thermal absorptance - state.dataMaterial->Material(MaterNum).AbsorpThermalFront = state.dataMaterial->Material(MaterNum).EmissThermalFront; - state.dataMaterial->Material(MaterNum).AbsorpThermalBack = state.dataMaterial->Material(MaterNum).EmissThermalBack; - state.dataMaterial->Material(MaterNum).TransThermal = state.dataMaterial->Material(MaterNum).TausThermal; - - if (MaterialProps(3) < 0.0 || MaterialProps(3) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(3) + " must be >= 0 and <= 1"); - } - - if (MaterialProps(6) < 0.0 || MaterialProps(6) > 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(6) + " must be >= 0 and <= 1 for material " + - state.dataMaterial->Material(MaterNum).Name + '.'); - } - - if (!state.dataIPShortCut->lNumericFieldBlanks(9)) { - if (MaterialProps(9) > 0.00001) { - state.dataMaterial->Material(MaterNum).ScreenWireSpacing = MaterialProps(9); // screen wire spacing - } else { - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(9) + " must be > 0."); - ShowContinueError(state, "...Setting screen wire spacing to a default value of 0.025m and simulation continues."); - state.dataMaterial->Material(MaterNum).ScreenWireSpacing = 0.025; - } - } - - if (!state.dataIPShortCut->lNumericFieldBlanks(10)) { - if (MaterialProps(10) > 0.00001 && MaterialProps(10) < state.dataMaterial->Material(MaterNum).ScreenWireSpacing) { - state.dataMaterial->Material(MaterNum).ScreenWireDiameter = MaterialProps(10); // screen wire spacing - } else { - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(10) + " must be > 0."); - ShowContinueError(state, "...Setting screen wire diameter to a default value of 0.005m and simulation continues."); - state.dataMaterial->Material(MaterNum).ScreenWireDiameter = 0.005; - } - } - - if (state.dataMaterial->Material(MaterNum).ScreenWireSpacing > 0.0) { - if (state.dataMaterial->Material(MaterNum).ScreenWireDiameter / state.dataMaterial->Material(MaterNum).ScreenWireSpacing >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError( - state, state.dataIPShortCut->cNumericFieldNames(10) + " must be less than " + state.dataIPShortCut->cNumericFieldNames(9)); - } else { - // Calculate direct normal transmittance (open area fraction) - Openness = pow_2(1.0 - state.dataMaterial->Material(MaterNum).ScreenWireDiameter / - state.dataMaterial->Material(MaterNum).ScreenWireSpacing); - if ((state.dataMaterial->Material(MaterNum).TausFrontBeamBeam - Openness) / Openness > 0.01) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", screen openness specified."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(1) + " is > 1.0% of the value calculated from input fields:"); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(9) + " and " + (state.dataIPShortCut->cNumericFieldNames(10))); - ShowContinueError(state, " using the formula (1-diameter/spacing)**2"); - ShowContinueError(state, " ...the screen diameter is recalculated from the material openness specified "); - ShowContinueError(state, " ...and wire spacing using the formula = wire spacing * (1.0 - SQRT(Opennes))"); - state.dataMaterial->Material(MaterNum).ScreenWireDiameter = - state.dataMaterial->Material(MaterNum).ScreenWireSpacing * - (1.0 - std::sqrt(state.dataMaterial->Material(MaterNum).TausFrontBeamBeam)); - ShowContinueError(state, - format(" ...Recalculated {}={:.4R} m", - state.dataIPShortCut->cNumericFieldNames(10), - state.dataMaterial->Material(MaterNum).ScreenWireDiameter)); - } - } - } - - if (state.dataMaterial->Material(MaterNum).TausFrontBeamBeam + state.dataMaterial->Material(MaterNum).ReflFrontBeamDiff >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, "Calculated solar transmittance + solar reflectance not < 1.0"); - ShowContinueError(state, "See Engineering Reference for calculation procedure for solar transmittance."); - } - - if (state.dataMaterial->Material(MaterNum).TausFrontBeamBeamVis + state.dataMaterial->Material(MaterNum).ReflFrontDiffDiffVis >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, "Calculated visible transmittance + visible reflectance not < 1.0"); - ShowContinueError(state, "See Engineering Reference for calculation procedure for visible solar transmittance."); - } - if (state.dataMaterial->Material(MaterNum).TransThermal + state.dataMaterial->Material(MaterNum).AbsorpThermal >= 1.0) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowSevereError(state, "Thermal hemispherical emissivity plus open area fraction (1-diameter/spacing)**2 not < 1.0"); - } - - } // TotScreensEQL loop - - // Window Blind Materials - if ((state.dataHeatBal->TotBlindsEQL == 0) && (state.dataHeatBal->TotBlinds == 0)) { - state.dataSurface->actualMaxSlatAngs = 1; // first slot is used for shades - } - - if (state.dataHeatBal->TotBlinds > 0) { - state.dataHeatBal->Blind.allocate(state.dataHeatBal->TotBlinds); // Allocate the array Size to the number of blinds - } - - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Blind"; - for (Loop = 1; Loop <= state.dataHeatBal->TotBlinds; ++Loop) { - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowBlind; - - // Load the material derived type from the input data. - - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - state.dataHeatBal->Blind(Loop).Name = MaterialNames(1); - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::Rough; - state.dataMaterial->Material(MaterNum).BlindDataPtr = Loop; - state.dataMaterial->Material(MaterNum).ROnly = true; - - state.dataHeatBal->Blind(Loop).MaterialNumber = MaterNum; - if (UtilityRoutines::SameString(MaterialNames(2), "Horizontal")) { - state.dataHeatBal->Blind(Loop).SlatOrientation = DataWindowEquivalentLayer::Orientation::Horizontal; - } else if (UtilityRoutines::SameString(MaterialNames(2), "Vertical")) { - state.dataHeatBal->Blind(Loop).SlatOrientation = DataWindowEquivalentLayer::Orientation::Vertical; - } - state.dataHeatBal->Blind(Loop).SlatWidth = MaterialProps(1); - state.dataHeatBal->Blind(Loop).SlatSeparation = MaterialProps(2); - state.dataHeatBal->Blind(Loop).SlatThickness = MaterialProps(3); - state.dataHeatBal->Blind(Loop).SlatAngle = MaterialProps(4); - state.dataHeatBal->Blind(Loop).SlatConductivity = MaterialProps(5); - state.dataHeatBal->Blind(Loop).SlatTransSolBeamDiff = MaterialProps(6); - state.dataHeatBal->Blind(Loop).SlatFrontReflSolBeamDiff = MaterialProps(7); - state.dataHeatBal->Blind(Loop).SlatBackReflSolBeamDiff = MaterialProps(8); - state.dataHeatBal->Blind(Loop).SlatTransSolDiffDiff = MaterialProps(9); - state.dataHeatBal->Blind(Loop).SlatFrontReflSolDiffDiff = MaterialProps(10); - state.dataHeatBal->Blind(Loop).SlatBackReflSolDiffDiff = MaterialProps(11); - state.dataHeatBal->Blind(Loop).SlatTransVisBeamDiff = MaterialProps(12); - state.dataHeatBal->Blind(Loop).SlatFrontReflVisBeamDiff = MaterialProps(13); - state.dataHeatBal->Blind(Loop).SlatBackReflVisBeamDiff = MaterialProps(14); - state.dataHeatBal->Blind(Loop).SlatTransVisDiffDiff = MaterialProps(15); - state.dataHeatBal->Blind(Loop).SlatFrontReflVisDiffDiff = MaterialProps(16); - state.dataHeatBal->Blind(Loop).SlatBackReflVisDiffDiff = MaterialProps(17); - state.dataHeatBal->Blind(Loop).SlatTransIR = MaterialProps(18); - state.dataHeatBal->Blind(Loop).SlatFrontEmissIR = MaterialProps(19); - state.dataHeatBal->Blind(Loop).SlatBackEmissIR = MaterialProps(20); - state.dataHeatBal->Blind(Loop).BlindToGlassDist = MaterialProps(21); - state.dataHeatBal->Blind(Loop).BlindTopOpeningMult = MaterialProps(22); - state.dataHeatBal->Blind(Loop).BlindBottomOpeningMult = MaterialProps(23); - state.dataHeatBal->Blind(Loop).BlindLeftOpeningMult = MaterialProps(24); - state.dataHeatBal->Blind(Loop).BlindRightOpeningMult = MaterialProps(25); - state.dataHeatBal->Blind(Loop).MinSlatAngle = MaterialProps(26); - state.dataHeatBal->Blind(Loop).MaxSlatAngle = MaterialProps(27); - - // TH 2/11/2010. For CR 8010 - // By default all blinds have fixed slat angle, new blinds with variable slat angle are created if - // they are used with window shading controls that adjust slat angles like ScheduledSlatAngle or BlockBeamSolar - state.dataHeatBal->Blind(Loop).SlatAngleType = DataWindowEquivalentLayer::AngleType::Fixed; - - if (state.dataHeatBal->Blind(Loop).SlatWidth < state.dataHeatBal->Blind(Loop).SlatSeparation) { - ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Slat Angles/Widths"); - ShowContinueError(state, - format("{} [{:.2R}] is less than {} [{:.2R}].", - state.dataIPShortCut->cNumericFieldNames(1), - state.dataHeatBal->Blind(Loop).SlatWidth, - state.dataIPShortCut->cNumericFieldNames(2), - state.dataHeatBal->Blind(Loop).SlatSeparation)); - ShowContinueError(state, "This will allow direct beam to be transmitted when Slat angle = 0."); - } - - if (!UtilityRoutines::SameString(MaterialNames(2), "Horizontal") && !UtilityRoutines::SameString(MaterialNames(2), "Vertical")) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value"); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(2) + "=\"" + MaterialNames(2) + "\", must be Horizontal or Vertical."); - } - - if ((MaterialProps(6) + MaterialProps(7) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(6) + " + " + state.dataIPShortCut->cNumericFieldNames(7) + " not < 1.0"); - } - if ((MaterialProps(6) + MaterialProps(8) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(6) + " + " + state.dataIPShortCut->cNumericFieldNames(8) + " not < 1.0"); - } - - if ((MaterialProps(9) + MaterialProps(10) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(9) + " + " + state.dataIPShortCut->cNumericFieldNames(10) + " not < 1.0"); - } - if ((MaterialProps(9) + MaterialProps(11) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(9) + " + " + state.dataIPShortCut->cNumericFieldNames(11) + " not < 1.0"); - } - - if ((MaterialProps(12) + MaterialProps(13) >= 1.0) || (MaterialProps(12) + MaterialProps(14) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError( - state, state.dataIPShortCut->cNumericFieldNames(12) + " + " + state.dataIPShortCut->cNumericFieldNames(13) + " not < 1.0 OR"); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(12) + " + " + state.dataIPShortCut->cNumericFieldNames(14) + " not < 1.0"); - } - - if ((MaterialProps(12) + MaterialProps(13) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(12) + " + " + state.dataIPShortCut->cNumericFieldNames(13) + " not < 1.0"); - } - if ((MaterialProps(12) + MaterialProps(14) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(12) + " + " + state.dataIPShortCut->cNumericFieldNames(14) + " not < 1.0"); - } - - if ((MaterialProps(15) + MaterialProps(16) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(15) + " + " + state.dataIPShortCut->cNumericFieldNames(16) + " not < 1.0"); - } - if ((MaterialProps(15) + MaterialProps(17) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(15) + " + " + state.dataIPShortCut->cNumericFieldNames(17) + " not < 1.0"); - } - - // Require that beam and diffuse properties be the same - if (std::abs(MaterialProps(9) - MaterialProps(6)) > 1.e-5) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(6) + " must equal " + state.dataIPShortCut->cNumericFieldNames(9)); - } - - if (std::abs(MaterialProps(10) - MaterialProps(7)) > 1.e-5) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(7) + " must equal " + state.dataIPShortCut->cNumericFieldNames(10)); - } - - if (std::abs(MaterialProps(11) - MaterialProps(8)) > 1.e-5) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(8) + " must equal " + state.dataIPShortCut->cNumericFieldNames(11)); - } - - if (std::abs(MaterialProps(15) - MaterialProps(12)) > 1.e-5) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(12) + " must equal " + state.dataIPShortCut->cNumericFieldNames(15)); - } - - if (std::abs(MaterialProps(16) - MaterialProps(13)) > 1.e-5) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(13) + " must equal " + state.dataIPShortCut->cNumericFieldNames(16)); - } - - if (std::abs(MaterialProps(17) - MaterialProps(14)) > 1.e-5) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(14) + " must equal " + state.dataIPShortCut->cNumericFieldNames(17)); - } - - if ((MaterialProps(18) + MaterialProps(19) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(18) + " + " + state.dataIPShortCut->cNumericFieldNames(19) + " not < 1.0"); - } - if ((MaterialProps(18) + MaterialProps(20) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(18) + " + " + state.dataIPShortCut->cNumericFieldNames(20) + " not < 1.0"); - } - - if (state.dataHeatBal->Blind(Loop).BlindToGlassDist < 0.5 * state.dataHeatBal->Blind(Loop).SlatWidth) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError( - state, state.dataIPShortCut->cNumericFieldNames(21) + " is less than half of the " + state.dataIPShortCut->cNumericFieldNames(1)); - } - - // Minimum and maximum slat angles allowed by slat geometry - if (state.dataHeatBal->Blind(Loop).SlatWidth > state.dataHeatBal->Blind(Loop).SlatSeparation) { - MinSlatAngGeom = std::asin(state.dataHeatBal->Blind(Loop).SlatThickness / - (state.dataHeatBal->Blind(Loop).SlatThickness + state.dataHeatBal->Blind(Loop).SlatSeparation)) / - DataGlobalConstants::DegToRadians; - } else { - MinSlatAngGeom = 0.0; - } - MaxSlatAngGeom = 180.0 - MinSlatAngGeom; - - // Error if input slat angle not in range allowed by slat geometry - if ((state.dataHeatBal->Blind(Loop).SlatSeparation + state.dataHeatBal->Blind(Loop).SlatThickness) < - state.dataHeatBal->Blind(Loop).SlatWidth) { - if (state.dataHeatBal->Blind(Loop).SlatAngle < MinSlatAngGeom) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - format("{}=[{:.1R}], is less than smallest allowed by slat dimensions and spacing, [{:.1R}] deg.", - state.dataIPShortCut->cNumericFieldNames(4), - state.dataHeatBal->Blind(Loop).SlatAngle, - MinSlatAngGeom)); - } else if (state.dataHeatBal->Blind(Loop).SlatAngle > MaxSlatAngGeom) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - format("{}=[{:.1R}], is greater than largest allowed by slat dimensions and spacing, [{:.1R}] deg.", - state.dataIPShortCut->cNumericFieldNames(4), - state.dataHeatBal->Blind(Loop).SlatAngle, - MinSlatAngGeom)); - } - } - - // By default all Blinds are "fixed" slats. Only with Shading Control is one considered variable and this check - // is now done when that happens. 9.3.2009 LKL - - // IF(Blind(Loop)%SlatAngleType == VariableSlats) THEN - // ! Error if maximum slat angle less than minimum - // IF(Blind(Loop)%MaxSlatAngle < Blind(Loop)%MinSlatAngle) THEN - // ErrorsFound = .TRUE. - // CALL ShowSevereError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//'="'//TRIM(MaterialNames(1))//'", Illegal value - // combination.') CALL ShowContinueError(state, - // TRIM(cNumericFieldNames(26))//'=['//TRIM(RoundSigDigits(Blind(Loop)%MinSlatAngle,1))// & - // '], is greater than '//TRIM(cNumericFieldNames(27))//'=['// & - // TRIM(RoundSigDigits(Blind(Loop)%MaxSlatAngle,1))//'] deg.') - // END IF - // ! Error if input slat angle not in input min/max range - // IF(Blind(Loop)%MaxSlatAngle > Blind(Loop)%MinSlatAngle .AND. (Blind(Loop)%SlatAngle < Blind(Loop)%MinSlatAngle & - // .OR. Blind(Loop)%SlatAngle > Blind(Loop)%MaxSlatAngle)) THEN - // ErrorsFound = .TRUE. - // CALL ShowSevereError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//'="'//TRIM(MaterialNames(1))//'", Illegal value - // combination.') CALL ShowContinueError(state, TRIM(cNumericFieldNames(4))//'=['//TRIM(RoundSigDigits(Blind(Loop)%SlatAngle,1))// - // & - // '] is outside of the input min/max range, min=['//TRIM(RoundSigDigits(Blind(Loop)%MinSlatAngle,1))// & - // '], max=['//TRIM(RoundSigDigits(Blind(Loop)%MaxSlatAngle,1))//'] deg.') - // END IF - // ! Error if input minimum slat angle is less than that allowed by slat geometry - // IF(Blind(Loop)%MinSlatAngle < MinSlatAngGeom) THEN - // CALL ShowSevereError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//'="'//TRIM(MaterialNames(1))//'", Illegal value - // combination.') CALL ShowContinueError(state, - // TRIM(cNumericFieldNames(26))//'=['//TRIM(RoundSigDigits(Blind(Loop)%MinSlatAngle,1))// & - // '] is less than the smallest allowed by slat dimensions and spacing, min=['// & - // TRIM(RoundSigDigits(MinSlatAngGeom,1))//'] deg.') - // CALL ShowContinueError(state, 'Minimum Slat Angle will be set to '//TRIM(RoundSigDigits(MinSlatAngGeom,1))//' deg.') - // Blind(Loop)%MinSlatAngle = MinSlatAngGeom - // END IF - // ! Error if input maximum slat angle is greater than that allowed by slat geometry - // IF(Blind(Loop)%MaxSlatAngle > MaxSlatAngGeom) THEN - // CALL ShowWarningError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//'="'//TRIM(MaterialNames(1))//'", Illegal value - // combination.') CALL ShowContinueError(state, - // TRIM(cNumericFieldNames(27))//'=['//TRIM(RoundSigDigits(Blind(Loop)%MaxSlatAngle,1))// & - // '] is greater than the largest allowed by slat dimensions and spacing, ['// & - // TRIM(RoundSigDigits(MaxSlatAngGeom,1))//'] deg.') - // CALL ShowContinueError(state, 'Maximum Slat Angle will be set to '//TRIM(RoundSigDigits(MaxSlatAngGeom,1))//' deg.') - // Blind(Loop)%MaxSlatAngle = MaxSlatAngGeom - // END IF - // END IF ! End of check if slat angle is variable - } - - // Window Blind Materials for EquivalentLayer Model - - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:Blind:EquivalentLayer"; - for (Loop = 1; Loop <= state.dataHeatBal->TotBlindsEQL; ++Loop) { - - // Call Input Get routine to retrieve material data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::BlindEquivalentLayer; - - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::Rough; - state.dataMaterial->Material(MaterNum).ROnly = true; - - if (UtilityRoutines::SameString(MaterialNames(2), "Horizontal")) { - state.dataMaterial->Material(MaterNum).SlatOrientation = DataWindowEquivalentLayer::Orientation::Horizontal; - } else if (UtilityRoutines::SameString(MaterialNames(2), "Vertical")) { - state.dataMaterial->Material(MaterNum).SlatOrientation = DataWindowEquivalentLayer::Orientation::Vertical; - } - state.dataMaterial->Material(MaterNum).SlatWidth = MaterialProps(1); - state.dataMaterial->Material(MaterNum).SlatSeparation = MaterialProps(2); - state.dataMaterial->Material(MaterNum).SlatCrown = MaterialProps(3); - state.dataMaterial->Material(MaterNum).SlatAngle = MaterialProps(4); - - state.dataMaterial->Material(MaterNum).TausFrontBeamDiff = MaterialProps(5); - state.dataMaterial->Material(MaterNum).TausBackBeamDiff = MaterialProps(6); - state.dataMaterial->Material(MaterNum).ReflFrontBeamDiff = MaterialProps(7); - state.dataMaterial->Material(MaterNum).ReflBackBeamDiff = MaterialProps(8); - - if (!state.dataIPShortCut->lNumericFieldBlanks(9) && !state.dataIPShortCut->lNumericFieldBlanks(10) && - !state.dataIPShortCut->lNumericFieldBlanks(11) && !state.dataIPShortCut->lNumericFieldBlanks(12)) { - state.dataMaterial->Material(MaterNum).TausFrontBeamDiffVis = MaterialProps(9); - state.dataMaterial->Material(MaterNum).TausBackBeamDiffVis = MaterialProps(10); - state.dataMaterial->Material(MaterNum).ReflFrontBeamDiffVis = MaterialProps(11); - state.dataMaterial->Material(MaterNum).ReflBackBeamDiffVis = MaterialProps(12); - } - if (!state.dataIPShortCut->lNumericFieldBlanks(13) && !state.dataIPShortCut->lNumericFieldBlanks(14) && - !state.dataIPShortCut->lNumericFieldBlanks(15)) { - state.dataMaterial->Material(MaterNum).TausDiffDiff = MaterialProps(13); - state.dataMaterial->Material(MaterNum).ReflFrontDiffDiff = MaterialProps(14); - state.dataMaterial->Material(MaterNum).ReflBackDiffDiff = MaterialProps(15); - } - if (!state.dataIPShortCut->lNumericFieldBlanks(16) && !state.dataIPShortCut->lNumericFieldBlanks(17) && - !state.dataIPShortCut->lNumericFieldBlanks(18)) { - state.dataMaterial->Material(MaterNum).TausDiffDiffVis = MaterialProps(13); - state.dataMaterial->Material(MaterNum).ReflFrontDiffDiffVis = MaterialProps(14); - state.dataMaterial->Material(MaterNum).ReflBackDiffDiffVis = MaterialProps(15); - } - if (!state.dataIPShortCut->lNumericFieldBlanks(19)) { - state.dataMaterial->Material(MaterNum).TausThermal = MaterialProps(19); - } - if (!state.dataIPShortCut->lNumericFieldBlanks(20)) { - state.dataMaterial->Material(MaterNum).EmissThermalFront = MaterialProps(20); - } - if (!state.dataIPShortCut->lNumericFieldBlanks(21)) { - state.dataMaterial->Material(MaterNum).EmissThermalBack = MaterialProps(21); - } - // Assumes thermal emissivity is the same as thermal absorptance - state.dataMaterial->Material(MaterNum).AbsorpThermalFront = state.dataMaterial->Material(MaterNum).EmissThermalFront; - state.dataMaterial->Material(MaterNum).AbsorpThermalBack = state.dataMaterial->Material(MaterNum).EmissThermalBack; - state.dataMaterial->Material(MaterNum).TransThermal = state.dataMaterial->Material(MaterNum).TausThermal; - - // By default all blinds have fixed slat angle, - // they are used with window shading controls that adjust slat angles like MaximizeSolar or BlockBeamSolar - if (!state.dataIPShortCut->lAlphaFieldBlanks(3)) { - if (UtilityRoutines::SameString(MaterialNames(3), "FixedSlatAngle")) { - state.dataMaterial->Material(MaterNum).SlatAngleType = state.dataWindowEquivalentLayer->lscNONE; - } else if (UtilityRoutines::SameString(MaterialNames(3), "MaximizeSolar")) { - state.dataMaterial->Material(MaterNum).SlatAngleType = state.dataWindowEquivalentLayer->lscVBPROF; - } else if (UtilityRoutines::SameString(MaterialNames(3), "BlockBeamSolar")) { - state.dataMaterial->Material(MaterNum).SlatAngleType = state.dataWindowEquivalentLayer->lscVBNOBM; - } else { - state.dataMaterial->Material(MaterNum).SlatAngleType = 0; - } - } else { - state.dataMaterial->Material(MaterNum).SlatAngleType = 0; - } - if (state.dataMaterial->Material(MaterNum).SlatWidth < state.dataMaterial->Material(MaterNum).SlatSeparation) { - ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Slat Seperation/Width"); - ShowContinueError(state, - format("{} [{:.2R}] is less than {} [{:.2R}].", - state.dataIPShortCut->cNumericFieldNames(1), - state.dataMaterial->Material(MaterNum).SlatWidth, - state.dataIPShortCut->cNumericFieldNames(2), - state.dataMaterial->Material(MaterNum).SlatSeparation)); - ShowContinueError(state, "This will allow direct beam to be transmitted when Slat angle = 0."); - } - if (state.dataMaterial->Material(MaterNum).SlatSeparation < 0.001) { - ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Slat Seperation"); - ShowContinueError(state, - format("{} [{:.2R}]. Slate spacing must be > 0.0", - state.dataIPShortCut->cNumericFieldNames(2), - state.dataMaterial->Material(MaterNum).SlatSeparation)); - ShowContinueError(state, "...Setting slate spacing to default value of 0.025 m and simulation continues."); - state.dataMaterial->Material(MaterNum).SlatSeparation = 0.025; - } - if (state.dataMaterial->Material(MaterNum).SlatWidth < 0.001 || - state.dataMaterial->Material(MaterNum).SlatWidth >= 2.0 * state.dataMaterial->Material(MaterNum).SlatSeparation) { - ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Slat Width"); - ShowContinueError(state, - format("{} [{:.2R}]. Slat width range is 0 < Width <= 2*Spacing", - state.dataIPShortCut->cNumericFieldNames(1), - state.dataMaterial->Material(MaterNum).SlatWidth)); - ShowContinueError(state, "...Setting slate width equal to slate spacing and simulation continues."); - state.dataMaterial->Material(MaterNum).SlatWidth = state.dataMaterial->Material(MaterNum).SlatSeparation; - } - if (state.dataMaterial->Material(MaterNum).SlatCrown < 0.0 || - state.dataMaterial->Material(MaterNum).SlatCrown >= 0.5 * state.dataMaterial->Material(MaterNum).SlatWidth) { - ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Slat Crown"); - ShowContinueError(state, - format("{} [{:.2R}]. Slat crwon range is 0 <= crown < 0.5*Width", - state.dataIPShortCut->cNumericFieldNames(3), - state.dataMaterial->Material(MaterNum).SlatCrown)); - ShowContinueError(state, "...Setting slate crown to 0.0 and simulation continues."); - state.dataMaterial->Material(MaterNum).SlatCrown = 0.0; - } - if (state.dataMaterial->Material(MaterNum).SlatAngle < -90.0 || state.dataMaterial->Material(MaterNum).SlatAngle > 90.0) { - ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Slat Angle"); - ShowContinueError(state, - format("{} [{:.2R}]. Slat angle range is -90.0 <= Angle < 90.0", - state.dataIPShortCut->cNumericFieldNames(4), - state.dataMaterial->Material(MaterNum).SlatAngle)); - ShowContinueError(state, "...Setting slate angle to 0.0 and simulation continues."); - state.dataMaterial->Material(MaterNum).SlatAngle = 0.0; - } - - if (!UtilityRoutines::SameString(MaterialNames(2), "Horizontal") && !UtilityRoutines::SameString(MaterialNames(2), "Vertical")) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value"); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(2) + "=\"" + MaterialNames(2) + "\", must be Horizontal or Vertical."); - } - - if ((MaterialProps(5) + MaterialProps(7) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(5) + " + " + state.dataIPShortCut->cNumericFieldNames(7) + " not < 1.0"); - } - if ((MaterialProps(6) + MaterialProps(8) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(6) + " + " + state.dataIPShortCut->cNumericFieldNames(8) + " not < 1.0"); - } - if ((MaterialProps(9) + MaterialProps(11) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(9) + " + " + state.dataIPShortCut->cNumericFieldNames(11) + " not < 1.0"); - } - if ((MaterialProps(10) + MaterialProps(12) >= 1.0)) { - ErrorsFound = true; - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(10) + " + " + state.dataIPShortCut->cNumericFieldNames(12) + " not < 1.0"); - } - - } // TotBlindsEQL loop - - // EcoRoof Materials - // PSU 2006 - state.dataHeatBalMgr->CurrentModuleObject = "Material:RoofVegetation"; - for (Loop = 1; Loop <= EcoRoofMat; ++Loop) { - // Call Input Get Routine to retrieve material data from ecoroof - - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - MaterialNames, - MaterialNumAlpha, - MaterialProps, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - MaterialNames(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - // this part is similar to the regular material - // Load the material derived type from the input data. - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::EcoRoof; - - // this part is new for Ecoroof properties, - // especially for the Plant Layer of the ecoroof - state.dataMaterial->Material(MaterNum).HeightOfPlants = MaterialProps(1); - state.dataMaterial->Material(MaterNum).LAI = MaterialProps(2); - state.dataMaterial->Material(MaterNum).Lreflectivity = MaterialProps(3); // Albedo - state.dataMaterial->Material(MaterNum).LEmissitivity = MaterialProps(4); - state.dataMaterial->Material(MaterNum).RStomata = MaterialProps(5); - - state.dataMaterial->Material(MaterNum).Name = MaterialNames(1); - // need to treat the A2 with is just the name of the soil(it is - // not important) - ValidateMaterialRoughness(state, MaterNum, MaterialNames(3), ErrorsFound); - if (UtilityRoutines::SameString(MaterialNames(4), "Simple")) { - state.dataMaterial->Material(MaterNum).EcoRoofCalculationMethod = 1; - } else if (UtilityRoutines::SameString(MaterialNames(4), "Advanced") || state.dataIPShortCut->lAlphaFieldBlanks(4)) { - state.dataMaterial->Material(MaterNum).EcoRoofCalculationMethod = 2; - } else { - ShowSevereError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value"); - ShowContinueError(state, state.dataIPShortCut->cAlphaFieldNames(4) + "=\"" + MaterialNames(4) + "\"."); - ShowContinueError(state, "...Valid values are \"Simple\" or \"Advanced\"."); - ErrorsFound = true; - } - - state.dataMaterial->Material(MaterNum).Thickness = MaterialProps(6); - state.dataMaterial->Material(MaterNum).Conductivity = MaterialProps(7); - state.dataMaterial->Material(MaterNum).Density = MaterialProps(8); - state.dataMaterial->Material(MaterNum).SpecHeat = MaterialProps(9); - state.dataMaterial->Material(MaterNum).AbsorpThermal = MaterialProps(10); // emissivity - state.dataMaterial->Material(MaterNum).AbsorpSolar = MaterialProps(11); // (1 - Albedo) - state.dataMaterial->Material(MaterNum).AbsorpVisible = MaterialProps(12); - state.dataMaterial->Material(MaterNum).Porosity = MaterialProps(13); - state.dataMaterial->Material(MaterNum).MinMoisture = MaterialProps(14); - state.dataMaterial->Material(MaterNum).InitMoisture = MaterialProps(15); - - if (state.dataMaterial->Material(MaterNum).Conductivity > 0.0) { - state.dataHeatBal->NominalR(MaterNum) = - state.dataMaterial->Material(MaterNum).Thickness / state.dataMaterial->Material(MaterNum).Conductivity; - state.dataMaterial->Material(MaterNum).Resistance = state.dataHeatBal->NominalR(MaterNum); - } else { - ShowSevereError( - state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + "\" is not defined correctly."); - ShowContinueError(state, state.dataIPShortCut->cNumericFieldNames(7) + " is <=0."); - ErrorsFound = true; - } - - if (state.dataMaterial->Material(MaterNum).InitMoisture > state.dataMaterial->Material(MaterNum).Porosity) { - ShowWarningError(state, state.dataHeatBalMgr->CurrentModuleObject + "=\"" + MaterialNames(1) + "\", Illegal value combination."); - ShowContinueError(state, - state.dataIPShortCut->cNumericFieldNames(15) + " is greater than " + state.dataIPShortCut->cNumericFieldNames(13) + - ". It must be less or equal."); - ShowContinueError( - state, format("{} = {:.3T}.", state.dataIPShortCut->cNumericFieldNames(13), state.dataMaterial->Material(MaterNum).Porosity)); - ShowContinueError( - state, format("{} = {:.3T}.", state.dataIPShortCut->cNumericFieldNames(15), state.dataMaterial->Material(MaterNum).InitMoisture)); - ShowContinueError(state, - format("{} is reset to the maximum (saturation) value = {:.3T}.", - state.dataIPShortCut->cNumericFieldNames(15), - state.dataMaterial->Material(MaterNum).Porosity)); - ShowContinueError(state, "Simulation continues."); - state.dataMaterial->Material(MaterNum).InitMoisture = state.dataMaterial->Material(MaterNum).Porosity; - } - } - - // Thermochromic glazing group - // get the number of WindowMaterial:GlazingGroup:Thermochromic objects in the idf file - state.dataHeatBalMgr->CurrentModuleObject = "WindowMaterial:GlazingGroup:Thermochromic"; - state.dataHeatBal->TotTCGlazings = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); - if (state.dataHeatBal->TotTCGlazings >= 1) { - // Read TC glazings - state.dataHeatBal->TCGlazings.allocate(state.dataHeatBal->TotTCGlazings); - - for (Loop = 1; Loop <= state.dataHeatBal->TotTCGlazings; ++Loop) { - // Get each TCGlazings from the input processor - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - state.dataIPShortCut->cAlphaArgs, - MaterialNumAlpha, - state.dataIPShortCut->rNumericArgs, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - - if (UtilityRoutines::IsNameEmpty( - state, state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) { - ShowContinueError(state, "...All Thermochromic Glazing names must be unique regardless of subtype."); - continue; - } - - if (MaterialNumProp + 1 != MaterialNumAlpha) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - "\" is not defined correctly."); - ShowContinueError(state, - "Check number of " + state.dataIPShortCut->cAlphaFieldNames(2) + " compared to number of " + - state.dataIPShortCut->cNumericFieldNames(1)); - ErrorsFound = true; - continue; - } - - // Allocate arrays - state.dataHeatBal->TCGlazings(Loop).SpecTemp.allocate(MaterialNumProp); - state.dataHeatBal->TCGlazings(Loop).LayerName.allocate(MaterialNumProp); - state.dataHeatBal->TCGlazings(Loop).LayerPoint.allocate(MaterialNumProp); - state.dataHeatBal->TCGlazings(Loop).SpecTemp = 0.0; - state.dataHeatBal->TCGlazings(Loop).LayerName = ""; - state.dataHeatBal->TCGlazings(Loop).LayerPoint = 0; - - state.dataHeatBal->TCGlazings(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); - state.dataHeatBal->TCGlazings(Loop).NumGlzMat = MaterialNumProp; - - for (iTC = 1; iTC <= MaterialNumProp; ++iTC) { - state.dataHeatBal->TCGlazings(Loop).SpecTemp(iTC) = state.dataIPShortCut->rNumericArgs(iTC); - state.dataHeatBal->TCGlazings(Loop).LayerName(iTC) = state.dataIPShortCut->cAlphaArgs(1 + iTC); - - // Find this glazing material in the material list - iMat = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(1 + iTC), state.dataMaterial->Material); - if (iMat != 0) { - // TC glazing - state.dataMaterial->Material(iMat).SpecTemp = state.dataIPShortCut->rNumericArgs(iTC); - state.dataMaterial->Material(iMat).TCParent = Loop; - state.dataHeatBal->TCGlazings(Loop).LayerPoint(iTC) = iMat; - - // test that named material is of the right type - if (state.dataMaterial->Material(iMat).Group != DataHeatBalance::MaterialGroup::WindowGlass) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - "\" is not defined correctly."); - ShowContinueError(state, "Material named: " + state.dataIPShortCut->cAlphaArgs(1 + iTC) + " is not a window glazing "); - ErrorsFound = true; - } - - } else { // thow error because not found - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - "\" is not defined correctly."); - ShowContinueError(state, "Material named: " + state.dataIPShortCut->cAlphaArgs(1 + iTC) + " was not found "); - ErrorsFound = true; - } - } - } - } - auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; - cCurrentModuleObject = "WindowMaterial:SimpleGlazingSystem"; - for (Loop = 1; Loop <= state.dataHeatBal->TotSimpleWindow; ++Loop) { - - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Loop, - state.dataIPShortCut->cAlphaArgs, - MaterialNumAlpha, - state.dataIPShortCut->rNumericArgs, - MaterialNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - state.dataIPShortCut->cAlphaArgs(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowSimpleGlazing; - state.dataMaterial->Material(MaterNum).Name = state.dataIPShortCut->cAlphaArgs(1); - state.dataMaterial->Material(MaterNum).SimpleWindowUfactor = state.dataIPShortCut->rNumericArgs(1); - state.dataMaterial->Material(MaterNum).SimpleWindowSHGC = state.dataIPShortCut->rNumericArgs(2); - if (!state.dataIPShortCut->lNumericFieldBlanks(3)) { - state.dataMaterial->Material(MaterNum).SimpleWindowVisTran = state.dataIPShortCut->rNumericArgs(3); - state.dataMaterial->Material(MaterNum).SimpleWindowVTinputByUser = true; - } - - SetupSimpleWindowGlazingSystem(state, MaterNum); - } - - // Simon: Place to load materials for complex fenestrations - if ((state.dataHeatBal->TotComplexShades > 0) || (state.dataHeatBal->TotComplexGaps > 0)) { - SetupComplexFenestrationMaterialInput(state, MaterNum, ErrorsFound); - if (ErrorsFound) { - ShowSevereError(state, "Errors found in processing complex fenestration material input"); - } - } - ScanForReports(state, "Constructions", state.dataHeatBalMgr->DoReport, "Materials"); - - if (state.dataHeatBalMgr->DoReport) { - - print(state.files.eio, - "! ,Material Name,ThermalResistance {{m2-K/w}},Roughness,Thickness {{m}},Conductivity " - "{{w/m-K}},Density {{kg/m3}},Specific Heat " - "{{J/kg-K}},Absorptance:Thermal,Absorptance:Solar,Absorptance:Visible\n"); - - print(state.files.eio, "! ,Material Name,ThermalResistance {{m2-K/w}}\n"); - - // Formats - constexpr const char *Format_701(" Material Details,{},{:.4R},{},{:.4R},{:.3R},{:.3R},{:.3R},{:.4R},{:.4R},{:.4R}\n"); - constexpr const char *Format_702(" Material:Air,{},{:.4R}\n"); - - for (MaterNum = 1; MaterNum <= state.dataHeatBal->TotMaterials; ++MaterNum) { - - switch (state.dataMaterial->Material(MaterNum).Group) { - case DataHeatBalance::MaterialGroup::Air: { - print( - state.files.eio, Format_702, state.dataMaterial->Material(MaterNum).Name, state.dataMaterial->Material(MaterNum).Resistance); - } break; - default: { - print(state.files.eio, - Format_701, - state.dataMaterial->Material(MaterNum).Name, - state.dataMaterial->Material(MaterNum).Resistance, - DisplayMaterialRoughness(state.dataMaterial->Material(MaterNum).Roughness), - state.dataMaterial->Material(MaterNum).Thickness, - state.dataMaterial->Material(MaterNum).Conductivity, - state.dataMaterial->Material(MaterNum).Density, - state.dataMaterial->Material(MaterNum).SpecHeat, - state.dataMaterial->Material(MaterNum).AbsorpThermal, - state.dataMaterial->Material(MaterNum).AbsorpSolar, - state.dataMaterial->Material(MaterNum).AbsorpVisible); - } break; - } - } - } - - // FORMATS. - - if (state.dataGlobal->AnyEnergyManagementSystemInModel) { // setup surface property EMS actuators - - for (MaterNum = 1; MaterNum <= state.dataHeatBal->TotMaterials; ++MaterNum) { - if (state.dataMaterial->Material(MaterNum).Group != DataHeatBalance::MaterialGroup::RegularMaterial) continue; - SetupEMSActuator(state, - "Material", - state.dataMaterial->Material(MaterNum).Name, - "Surface Property Solar Absorptance", - "[ ]", - state.dataMaterial->Material(MaterNum).AbsorpSolarEMSOverrideOn, - state.dataMaterial->Material(MaterNum).AbsorpSolarEMSOverride); - SetupEMSActuator(state, - "Material", - state.dataMaterial->Material(MaterNum).Name, - "Surface Property Thermal Absorptance", - "[ ]", - state.dataMaterial->Material(MaterNum).AbsorpThermalEMSOverrideOn, - state.dataMaterial->Material(MaterNum).AbsorpThermalEMSOverride); - SetupEMSActuator(state, - "Material", - state.dataMaterial->Material(MaterNum).Name, - "Surface Property Visible Absorptance", - "[ ]", - state.dataMaterial->Material(MaterNum).AbsorpVisibleEMSOverrideOn, - state.dataMaterial->Material(MaterNum).AbsorpVisibleEMSOverride); - } - } - - // try assigning phase change material properties for each material, won't do anything for non pcm surfaces - for (auto &m : state.dataMaterial->Material) { - m.phaseChange = HysteresisPhaseChange::HysteresisPhaseChange::factory(state, m.Name); - } - } - - void GetWindowGlassSpectralData(EnergyPlusData &state, bool &ErrorsFound) // set to true if errors found in input - { - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Winkelmann - // DATE WRITTEN May 2000 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // Gets spectral data (transmittance, front reflectance, and back - // reflectance at normal incidence vs. wavelength) for glass - - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - - // Using/Aliasing - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - - // SUBROUTINE PARAMETER DEFINITIONS: - constexpr const char *RoutineName("GetWindowGlassSpectralData: "); - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - - int IOStat; // IO Status when calling get input subroutine - Array1D_string SpecDataNames(1); // Spectral data alpha names - int SpecDataNumAlpha; // Number of spectral data alpha names being passed - int SpecDataNumProp; // Number of spectral data properties being passed - Array1D SpecDataProps; // Temporary array to transfer spectal data properties - int Loop; - int LamNum; // Wavelength number - int TotLam; // Total wavelengths - Real64 Lam; // Wavelength (microns) - Real64 Tau; // Transmittance, front reflectance, back reflectance - Real64 RhoF; - Real64 RhoB; - - state.dataHeatBalMgr->CurrentModuleObject = "MaterialProperty:GlazingSpectralData"; - state.dataHeatBal->TotSpectralData = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); - state.dataHeatBal->SpectralData.allocate(state.dataHeatBal->TotSpectralData); - if (state.dataHeatBal->TotSpectralData > 0) SpecDataProps.allocate(Construction::MaxSpectralDataElements * 4); - - for (Loop = 1; Loop <= state.dataHeatBal->TotSpectralData; ++Loop) { - - // Call Input Get routine to retrieve spectral data - // Name is followed by up to 450 sets of normal-incidence measured values of - // [wavelength (microns), transmittance, front reflectance, back reflectance] for - // wavelengths covering the short-wave solar spectrum (from about 0.25 to 2.5 microns) - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - SpecDataNames, - SpecDataNumAlpha, - SpecDataProps, - SpecDataNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - - if (UtilityRoutines::IsNameEmpty(state, SpecDataNames(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) continue; - - // Load the spectral data derived type from the input data. - state.dataHeatBal->SpectralData(Loop).Name = SpecDataNames(1); - TotLam = SpecDataNumProp / 4; - if (mod(SpecDataNumProp, 4) != 0) { - ShowWarningError(state, - std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + "\" invalid set."); - ShowContinueError( - state, - format("... set not even multiple of 4 items (Wavelength,Trans,ReflFront,ReflBack), number of items in dataset = {}", - SpecDataNumProp)); - ShowContinueError(state, format("... remainder after div by 4 = {}, remainder items will be set to 0.0", mod(SpecDataNumProp, 4))); - SpecDataProps({SpecDataNumProp + 1, min(SpecDataNumProp + 4, Construction::MaxSpectralDataElements * 4)}) = 0.0; - } - if (TotLam > Construction::MaxSpectralDataElements) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + "\" invalid set."); - ShowContinueError( - state, - format("... More than max [{}] (Wavelength,Trans,ReflFront,ReflBack) entries in set.", Construction::MaxSpectralDataElements)); - continue; - } - state.dataHeatBal->SpectralData(Loop).NumOfWavelengths = TotLam; - - state.dataHeatBal->SpectralData(Loop).WaveLength.allocate(TotLam); // Wavelength (microns) - state.dataHeatBal->SpectralData(Loop).Trans.allocate(TotLam); // Transmittance at normal incidence - state.dataHeatBal->SpectralData(Loop).ReflFront.allocate(TotLam); // Front reflectance at normal incidence - state.dataHeatBal->SpectralData(Loop).ReflBack.allocate(TotLam); // Back reflectance at normal incidence - - for (LamNum = 1; LamNum <= TotLam; ++LamNum) { - state.dataHeatBal->SpectralData(Loop).WaveLength(LamNum) = SpecDataProps(4 * LamNum - 3); - state.dataHeatBal->SpectralData(Loop).Trans(LamNum) = SpecDataProps(4 * LamNum - 2); - // Following is needed since angular calculation in subr TransAndReflAtPhi - // fails for Trans = 0.0 - if (state.dataHeatBal->SpectralData(Loop).Trans(LamNum) < 0.001) state.dataHeatBal->SpectralData(Loop).Trans(LamNum) = 0.001; - state.dataHeatBal->SpectralData(Loop).ReflFront(LamNum) = SpecDataProps(4 * LamNum - 1); - state.dataHeatBal->SpectralData(Loop).ReflBack(LamNum) = SpecDataProps(4 * LamNum); - } - - // Check integrity of the spectral data - for (LamNum = 1; LamNum <= TotLam; ++LamNum) { - Lam = state.dataHeatBal->SpectralData(Loop).WaveLength(LamNum); - Tau = state.dataHeatBal->SpectralData(Loop).Trans(LamNum); - RhoF = state.dataHeatBal->SpectralData(Loop).ReflFront(LamNum); - RhoB = state.dataHeatBal->SpectralData(Loop).ReflBack(LamNum); - if (LamNum < TotLam) { - if (state.dataHeatBal->SpectralData(Loop).WaveLength(LamNum + 1) <= Lam) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + - "\" invalid set."); - ShowContinueError(state, - format("... Wavelengths not in increasing order. at wavelength#={}, value=[{:.4T}], next is [{:.4T}].", - LamNum, - Lam, - state.dataHeatBal->SpectralData(Loop).WaveLength(LamNum + 1))); - } - } - - if (Lam < 0.1 || Lam > 4.0) { - ErrorsFound = true; - ShowSevereError( - state, std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + "\" invalid value."); - ShowContinueError( - state, format("... A wavelength is not in the range 0.1 to 4.0 microns; at wavelength#={}, value=[{:.4T}].", LamNum, Lam)); - } - - // TH 2/15/2011. CR 8343 - // IGDB (International Glazing Database) does not meet the above strict restrictions. - // Relax rules to allow directly use of spectral data from IGDB - if (Tau > 1.01) { - ErrorsFound = true; - ShowSevereError( - state, std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + "\" invalid value."); - ShowContinueError(state, format("... A transmittance is > 1.0; at wavelength#={}, value=[{:.4T}].", LamNum, Tau)); - } - - if (RhoF < 0.0 || RhoF > 1.02 || RhoB < 0.0 || RhoB > 1.02) { - ErrorsFound = true; - ShowSevereError( - state, std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + "\" invalid value."); - ShowContinueError(state, format("... A reflectance is < 0.0 or > 1.0; at wavelength#={}, RhoF value=[{:.4T}].", LamNum, RhoF)); - ShowContinueError(state, format("... A reflectance is < 0.0 or > 1.0; at wavelength#={}, RhoB value=[{:.4T}].", LamNum, RhoB)); - } - - if ((Tau + RhoF) > 1.03 || (Tau + RhoB) > 1.03) { - ErrorsFound = true; - ShowSevereError( - state, std::string{RoutineName} + state.dataHeatBalMgr->CurrentModuleObject + "=\"" + SpecDataNames(1) + "\" invalid value."); - ShowContinueError(state, - "... Transmittance + reflectance) > 1.0 for an entry; at wavelength#=" + - format("{}, value(Tau+RhoF)=[{:.4T}], value(Tau+RhoB)=[{:.4T}].", LamNum, (Tau + RhoF), (Tau + RhoB))); - } - } - } - - if (state.dataHeatBal->TotSpectralData > 0) SpecDataProps.deallocate(); - } - - void ValidateMaterialRoughness(EnergyPlusData &state, - int const MaterNum, // Which Material number being validated. - std::string const &Roughness, // Roughness String - bool &ErrorsFound // If errors found - ) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Linda K. Lawrie - // DATE WRITTEN April 1999 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine compares the input Roughness value against the - // valid values and sets the correct value in the Material Data Structure. - - // METHODOLOGY EMPLOYED: - // Error message provided if not valid. - - // REFERENCES: - // na - - // USE STATEMENTS: - // na - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - - // SUBROUTINE PARAMETER DEFINITIONS: - // na - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - - // Select the correct Number for the associated ascii name for the roughness type - if (UtilityRoutines::SameString(Roughness, "VeryRough")) - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VeryRough; - if (UtilityRoutines::SameString(Roughness, "Rough")) state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::Rough; - if (UtilityRoutines::SameString(Roughness, "MediumRough")) - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; - if (UtilityRoutines::SameString(Roughness, "MediumSmooth")) - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumSmooth; - if (UtilityRoutines::SameString(Roughness, "Smooth")) - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::Smooth; - if (UtilityRoutines::SameString(Roughness, "VerySmooth")) - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VerySmooth; - - // Was it set? - if (state.dataMaterial->Material(MaterNum).Roughness == DataSurfaces::SurfaceRoughness::Invalid) { - ShowSevereError(state, "Material=" + state.dataMaterial->Material(MaterNum).Name + ",Illegal Roughness=" + Roughness); - ErrorsFound = true; - } - } - - void GetConstructData(EnergyPlusData &state, bool &ErrorsFound) // If errors found in input - { - - // SUBROUTINE INFORMATION: - // AUTHOR Richard Liesen - // DATE WRITTEN September 1997 - // MODIFIED January 2003, FCW: accommodate between-glass shading device - // July 2009, TH: added constructions defined with F and C factors - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This file reads the input through the input processor for Constructions. - // Data read in this routine is stored in a derived type (Construct) - // defined in the DataHeatBalance module. - // This subroutine only sets those parameters which must be obtained - // from the input file--all other portions of the Construct derived - // type are set during the initializations. - - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - - // Using/Aliasing - using namespace DataStringGlobals; - - // If UniqueConstructionNames size, then input has already been gotten - if (state.dataHeatBalMgr->UniqueConstructNames.size()) return; - - int ConstrNum; // Counter to keep track of the construction number - int Layer; // loop index for each of the construction layers - int ConstructNumAlpha; // Number of construction alpha names being passed - int DummyNumProp; // dummy variable for properties being passed - int IOStat; // IO Status when calling get input subroutine - Array1D_string ConstructAlphas({0, Construction::MaxLayersInConstruct}); // Construction Alpha names defined - Array1D DummyProps(5); // Temporary array to transfer construction properties - int Loop; - int TotRegConstructs; // Number of "regular" constructions (no embedded sources or sinks and - - int TotFfactorConstructs; // Number of slabs-on-grade or underground floor constructions defined with F factors - int TotCfactorConstructs; // Number of underground wall constructions defined with C factors - - // int TotSourceConstructs; // Number of constructions with embedded sources or sinks - int TotWindow5Constructs; // Number of constructions from Window5 data file - bool ConstructionFound; // True if input window construction name is found in the - // Window5 data file - bool EOFonW5File; // True if EOF encountered reading Window5 data file - DataHeatBalance::MaterialGroup MaterialLayerGroup; // window construction layer material group index - - int iMatGlass; // number of glass layers - Array1D_string WConstructNames; - - // Get the Total number of Constructions from the input - TotRegConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction"); - int totAirBoundaryConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:AirBoundary"); - - TotFfactorConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:FfactorGroundFloor"); - TotCfactorConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:CfactorUndergroundWall"); - - if (TotFfactorConstructs > 0) { - state.dataHeatBal->NoFfactorConstructionsUsed = false; - } - - if (TotCfactorConstructs > 0) { - state.dataHeatBal->NoCfactorConstructionsUsed = false; - } - - state.dataBSDFWindow->TotComplexFenStates = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:ComplexFenestrationState"); - TotWindow5Constructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:WindowDataFile"); - state.dataWindowEquivLayer->TotWinEquivLayerConstructs = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:WindowEquivalentLayer"); - - WConstructNames.allocate(TotWindow5Constructs); - - state.dataHeatBal->TotConstructs = TotRegConstructs + TotFfactorConstructs + TotCfactorConstructs + totAirBoundaryConstructs + - state.dataBSDFWindow->TotComplexFenStates + state.dataWindowEquivLayer->TotWinEquivLayerConstructs; - - state.dataHeatBal->NominalRforNominalUCalculation.dimension(state.dataHeatBal->TotConstructs, 0.0); - state.dataHeatBal->NominalU.dimension(state.dataHeatBal->TotConstructs, 0.0); - state.dataHeatBal->NominalUBeforeAdjusted.dimension(state.dataHeatBal->TotConstructs, 0.0); - state.dataHeatBal->CoeffAdjRatio.dimension(state.dataHeatBal->TotConstructs, 1.0); - - // Allocate the array to the number of constructions/initialize selected variables - state.dataConstruction->Construct.allocate(state.dataHeatBal->TotConstructs); - state.dataHeatBalMgr->UniqueConstructNames.reserve(state.dataHeatBal->TotConstructs); - // Note: If TotWindow5Constructs > 0, additional constructions are created in - // subr. SearchWindow5DataFile corresponding to those found on the data file. - for (auto &e : state.dataConstruction->Construct) { - // Initialize CTF and History terms - e.NumCTFTerms = 0; - e.NumHistories = 0; - - // Initialize some heat source/sink variables - e.SourceSinkPresent = false; // "default" is no source or sink present - e.SolutionDimensions = 1; // "default" is 1-D heat transfer - e.SourceAfterLayer = 0; // this has no meaning if a source/sink is not present - e.TempAfterLayer = 0; // this has no meaning if a source/sink is not present - e.ThicknessPerpend = 0.0; // this has no meaning if a source/sink is not present - - e.W5FrameDivider = 0; - e.FromWindow5DataFile = false; - - // these Construct arrays dimensioned based on MaxSolidWinLayers - e.setArraysBasedOnMaxSolidWinLayers(state); - } - - ConstrNum = 0; - - state.dataHeatBalMgr->CurrentModuleObject = "Construction"; - for (Loop = 1; Loop <= TotRegConstructs; ++Loop) { // Loop through all constructs in the input... - - // Get the object names for each construction from the input processor - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - ConstructAlphas, - ConstructNumAlpha, - DummyProps, - DummyNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueConstructNames, - ConstructAlphas(0), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - continue; - } - - // Glass layer counter - iMatGlass = 0; - - ++ConstrNum; - // Assign Construction name to the Derived Type using the zeroth position of the array - state.dataConstruction->Construct(ConstrNum).Name = ConstructAlphas(0); - - // Set the total number of layers for the construction - state.dataConstruction->Construct(ConstrNum).TotLayers = ConstructNumAlpha - 1; - - // Loop through all of the layers of the construct to match the material names. - // The loop index is the number minus 1 - for (Layer = 1; Layer <= ConstructNumAlpha - 1; ++Layer) { - - // Find the material in the list of materials - - state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) = - UtilityRoutines::FindItemInList(ConstructAlphas(Layer), state.dataMaterial->Material); - - // count number of glass layers - if (state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) > 0) { - if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)).Group == - DataHeatBalance::MaterialGroup::WindowGlass) - ++iMatGlass; - MaterialLayerGroup = state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)).Group; - if ((MaterialLayerGroup == DataHeatBalance::MaterialGroup::GlassEquivalentLayer) || - (MaterialLayerGroup == DataHeatBalance::MaterialGroup::ShadeEquivalentLayer) || - (MaterialLayerGroup == DataHeatBalance::MaterialGroup::DrapeEquivalentLayer) || - (MaterialLayerGroup == DataHeatBalance::MaterialGroup::BlindEquivalentLayer) || - (MaterialLayerGroup == DataHeatBalance::MaterialGroup::ScreenEquivalentLayer) || - (MaterialLayerGroup == DataHeatBalance::MaterialGroup::GapEquivalentLayer)) { - ShowSevereError(state, - "Invalid material layer type in window " + state.dataHeatBalMgr->CurrentModuleObject + " = " + - state.dataConstruction->Construct(ConstrNum).Name); - ShowSevereError(state, - "Equivalent Layer material type = " + ConstructAlphas(Layer) + - " is allowed only in Construction:WindowEquivalentLayer window object."); - ErrorsFound = true; - } - } - - if (state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) == 0) { - // This may be a TC GlazingGroup - state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) = - UtilityRoutines::FindItemInList(ConstructAlphas(Layer), state.dataHeatBal->TCGlazings); - - if (state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) > 0) { - // reset layer pointer to the first glazing in the TC GlazingGroup - state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) = - state.dataHeatBal->TCGlazings(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)).LayerPoint(1); - state.dataConstruction->Construct(ConstrNum).TCLayer = state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer); - if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)).Group == - DataHeatBalance::MaterialGroup::WindowGlass) - ++iMatGlass; - state.dataConstruction->Construct(ConstrNum).TCFlag = 1; - state.dataConstruction->Construct(ConstrNum).TCMasterConst = ConstrNum; - state.dataConstruction->Construct(ConstrNum).TCGlassID = iMatGlass; // the TC glass layer ID - state.dataConstruction->Construct(ConstrNum).TCLayerID = Layer; - state.dataConstruction->Construct(ConstrNum).TypeIsWindow = true; - } - } - - if (state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) == 0) { - ShowSevereError(state, - "Did not find matching material for " + state.dataHeatBalMgr->CurrentModuleObject + ' ' + - state.dataConstruction->Construct(ConstrNum).Name + ", missing material = " + ConstructAlphas(Layer)); - ErrorsFound = true; - } else { - state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) += - state.dataHeatBal->NominalR(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)); - if (state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)).Group == - DataHeatBalance::MaterialGroup::RegularMaterial && - !state.dataMaterial->Material(state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer)).ROnly) { - state.dataHeatBal->NoRegularMaterialsUsed = false; - } - } - - } // ...end of the Layer DO loop - - } // ...end of Regular Construction DO loop - - TotRegConstructs = ConstrNum; - - // Added TH 7/2009 for underground walls and floors constructions - if (TotFfactorConstructs + TotCfactorConstructs >= 1) { - CreateFCfactorConstructions(state, ConstrNum, ErrorsFound); - if (ErrorsFound) { - ShowSevereError(state, "Errors found in creating the constructions defined with Ffactor or Cfactor method"); - } - TotRegConstructs += TotFfactorConstructs + TotCfactorConstructs; - } - - if (totAirBoundaryConstructs >= 1) { - CreateAirBoundaryConstructions(state, ConstrNum, ErrorsFound); - if (ErrorsFound) { - ShowSevereError(state, "Errors found in creating the constructions defined with Construction:AirBoundary."); - } - TotRegConstructs += totAirBoundaryConstructs; - } - - // Added BG 6/2010 for complex fenestration - if (state.dataBSDFWindow->TotComplexFenStates > 0) { - SetupComplexFenestrationStateInput(state, ConstrNum, ErrorsFound); - if (ErrorsFound) { - ShowSevereError(state, "Errors found in processing complex fenestration input"); - } - TotRegConstructs += state.dataBSDFWindow->TotComplexFenStates; - } - - state.dataHeatBalMgr->CurrentModuleObject = "ConstructionProperty:InternalHeatSource"; - - auto instances = state.dataInputProcessing->inputProcessor->epJSON.find(state.dataHeatBalMgr->CurrentModuleObject); - if (instances != state.dataInputProcessing->inputProcessor->epJSON.end()) { - state.dataHeatBal->AnyInternalHeatSourceInInput = true; - auto &instancesValue = instances.value(); - for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { - auto const &fields = instance.value(); - auto const &thisObjectName = UtilityRoutines::MakeUPPERCase(instance.key()); - - std::string construction_name{UtilityRoutines::MakeUPPERCase(fields.at("construction_name").get())}; - int source_after_layer_number{fields.at("thermal_source_present_after_layer_number")}; - int calculation_after_layer_number{fields.at("temperature_calculation_requested_after_layer_number")}; - int ctf_dimensions{fields.at("dimensions_for_the_ctf_calculation")}; - if ((ctf_dimensions < 1) || (ctf_dimensions > 2)) { - ShowWarningError(state, "ConstructionProperty:InternalHeatSource must be either 1- or 2-D. Reset to 1-D solution."); - ShowContinueError(state, "Construction=" + construction_name + " is affected."); - ctf_dimensions = 1; - } - Real64 tube_spacing{fields.at("tube_spacing")}; - Real64 calculation_position{fields.at("two_dimensional_temperature_calculation_position")}; - - // Find the construction - int construction_index = UtilityRoutines::FindItemInList(construction_name, state.dataConstruction->Construct); - - if (construction_index == 0) { - ShowSevereError(state, - "Did not find matching construction for " + state.dataHeatBalMgr->CurrentModuleObject + ' ' + thisObjectName + - ", missing construction = " + construction_name); - ErrorsFound = true; - continue; - } - - state.dataInputProcessing->inputProcessor->markObjectAsUsed(state.dataHeatBalMgr->CurrentModuleObject, instance.key()); - - auto &thisConstruct(state.dataConstruction->Construct(construction_index)); - - // May need some additional validation of the construction here - if (thisConstruct.SourceSinkPresent) { - // Emulate old behavior by disallowing two sources in a single material - ShowSevereError( - state, "Construction " + construction_name + " has more than one internal heat source referencing it, which is not allowed"); - ErrorsFound = true; - continue; - } - - thisConstruct.SourceSinkPresent = true; - thisConstruct.SourceAfterLayer = source_after_layer_number; - thisConstruct.TempAfterLayer = calculation_after_layer_number; - thisConstruct.SolutionDimensions = ctf_dimensions; - thisConstruct.ThicknessPerpend = thisConstruct.setThicknessPerpendicular(state, tube_spacing); - thisConstruct.userTemperatureLocationPerpendicular = - thisConstruct.setUserTemperatureLocationPerpendicular(state, calculation_position); - - // Set the total number of layers for the construction - if ((thisConstruct.SourceAfterLayer >= thisConstruct.TotLayers) || (thisConstruct.SourceAfterLayer <= 0)) { - ShowWarningError(state, "Construction " + thisConstruct.Name + " must have a source that is between two layers"); - ShowContinueError(state, "The source after layer parameter has been set to one less than the number of layers."); - thisConstruct.SourceAfterLayer = thisConstruct.TotLayers - 1; - } - if ((thisConstruct.TempAfterLayer >= thisConstruct.TotLayers) || (thisConstruct.TempAfterLayer <= 0)) { - ShowWarningError(state, "Construction " + thisConstruct.Name + " must have a temperature calculation that is between two layers"); - ShowContinueError(state, "The temperature calculation after layer parameter has been set to one less than the number of layers."); - thisConstruct.TempAfterLayer = thisConstruct.TotLayers - 1; - } - } - } - - state.dataHeatBal->TotConstructs = TotRegConstructs; - - if (state.dataHeatBal->TotConstructs > 0 && (state.dataHeatBal->NoRegularMaterialsUsed && state.dataHeatBal->NoCfactorConstructionsUsed && - state.dataHeatBal->NoFfactorConstructionsUsed)) { - ShowWarningError(state, "This building has no thermal mass which can cause an unstable solution."); - ShowContinueError(state, "Use Material object for all opaque material definitions except very light insulation layers."); - } - - ConstrNum = 0; - state.dataHeatBalMgr->CurrentModuleObject = "Construction:WindowEquivalentLayer"; - for (Loop = 1; Loop <= state.dataWindowEquivLayer->TotWinEquivLayerConstructs; - ++Loop) { // Loop through all constructs with Window EquivalentLayer ... - - // Get the object names for each construction from the input processor - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - ConstructAlphas, - ConstructNumAlpha, - DummyProps, - DummyNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueConstructNames, - ConstructAlphas(0), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - continue; - } - - ++ConstrNum; - // Assign Construction name to the Derived Type using the zeroth position of the array - state.dataConstruction->Construct(TotRegConstructs + ConstrNum).Name = ConstructAlphas(0); - - // Set the total number of layers for the construction - state.dataConstruction->Construct(TotRegConstructs + ConstrNum).TotLayers = ConstructNumAlpha - 1; - if (state.dataConstruction->Construct(TotRegConstructs + ConstrNum).TotLayers < 1) { - ShowSevereError(state, - "Construction " + state.dataConstruction->Construct(TotRegConstructs + ConstrNum).Name + - " must have at least a single layer"); - ErrorsFound = true; - } - - // Loop through all of the layers of the construct to match the material names. - // The loop index is the number minus 1 - for (Layer = 1; Layer <= ConstructNumAlpha - 1; ++Layer) { - - // Find the material in the list of materials - state.dataConstruction->Construct(TotRegConstructs + ConstrNum).LayerPoint(Layer) = - UtilityRoutines::FindItemInList(ConstructAlphas(Layer), state.dataMaterial->Material); - - if (state.dataConstruction->Construct(TotRegConstructs + ConstrNum).LayerPoint(Layer) == 0) { - ShowSevereError(state, - "Did not find matching material for " + state.dataHeatBalMgr->CurrentModuleObject + ' ' + - state.dataConstruction->Construct(ConstrNum).Name + ", missing material = " + ConstructAlphas(Layer)); - ErrorsFound = true; - } else { - MaterialLayerGroup = - state.dataMaterial->Material(state.dataConstruction->Construct(TotRegConstructs + ConstrNum).LayerPoint(Layer)).Group; - if (!((MaterialLayerGroup == DataHeatBalance::MaterialGroup::GlassEquivalentLayer) || - (MaterialLayerGroup == DataHeatBalance::MaterialGroup::ShadeEquivalentLayer) || - (MaterialLayerGroup == DataHeatBalance::MaterialGroup::DrapeEquivalentLayer) || - (MaterialLayerGroup == DataHeatBalance::MaterialGroup::BlindEquivalentLayer) || - (MaterialLayerGroup == DataHeatBalance::MaterialGroup::ScreenEquivalentLayer) || - (MaterialLayerGroup == DataHeatBalance::MaterialGroup::GapEquivalentLayer))) { - ShowSevereError(state, - "Invalid material layer type in window " + state.dataHeatBalMgr->CurrentModuleObject + " = " + - state.dataConstruction->Construct(TotRegConstructs + ConstrNum).Name); - ShowContinueError(state, - "...Window layer = " + ConstructAlphas(Layer) + - " is not allowed in Construction:WindowEquivalentLayer window object."); - ShowContinueError(state, "Only materials of type Material:*:EquivalentLayer are allowed"); - ErrorsFound = true; - } - - if (ConstructNumAlpha <= 2) { - - } else { - state.dataHeatBal->NominalRforNominalUCalculation(TotRegConstructs + ConstrNum) += - state.dataHeatBal->NominalR(state.dataConstruction->Construct(TotRegConstructs + ConstrNum).LayerPoint(Layer)); - } - } - - } // Layer loop - state.dataConstruction->Construct(TotRegConstructs + ConstrNum).EQLConsPtr = ConstrNum; - state.dataConstruction->Construct(TotRegConstructs + ConstrNum).WindowTypeEQL = true; - } // TotWinEquivLayerConstructs loop - - state.dataWindowEquivLayer->TotWinEquivLayerConstructs = ConstrNum; - TotRegConstructs += state.dataWindowEquivLayer->TotWinEquivLayerConstructs; - state.dataHeatBal->TotConstructs = TotRegConstructs; - //------------------------------------------------------------------------------- - ConstrNum = 0; - - state.dataHeatBalMgr->CurrentModuleObject = "Construction:WindowDataFile"; - for (Loop = 1; Loop <= TotWindow5Constructs; ++Loop) { // Loop through all Window5 constructions. These constructions come - // from the Window5 data file and can be referenced only by windows - - // Get the object names for each construction from the input processor - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - ConstructAlphas, - ConstructNumAlpha, - DummyProps, - DummyNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (UtilityRoutines::IsNameEmpty(state, ConstructAlphas(0), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) continue; - - ++ConstrNum; - WConstructNames(ConstrNum) = ConstructAlphas(0); - - // Obtain the data - if (DummyNumProp != 0) { - ShowSevereError(state, "Construction From Window5 Data File: there should be no numerical inputs for " + ConstructAlphas(0)); - ErrorsFound = true; - continue; - } - - // See if this construction is in the W5DataFile produced by the WINDOW 5 program; - // if so, ConstructionFound will be set to true and the Material objects - // associated with the construction will be created in subr. SearchWindow5DataFile. - // (If the matching construction on the Window5 data file has two glazing systems, a - // second construction and its associated materials will be created in subr. - // SearchWindow5DataFile and TotConstructs WILL BE INCREMENTED BY 1 in that routine. - // A FrameAndDivider object will also be created if window on data file has a - // frame or divider.) - - fs::path window5DataFilePath; - if (ConstructAlphas(1) == "") { - window5DataFilePath = state.dataStrGlobals->CurrentWorkingFolder / "Window5DataFile.dat"; - } else { - window5DataFilePath = ConstructAlphas(1); - } - DisplayString(state, "Searching Window5 data file for Construction=" + ConstructAlphas(0)); - - SearchWindow5DataFile(state, window5DataFilePath, ConstructAlphas(0), ConstructionFound, EOFonW5File, ErrorsFound); - - if (EOFonW5File || !ConstructionFound) { - DisplayString(state, "--Construction not found"); - ErrorsFound = true; - ShowSevereError(state, "No match on WINDOW5 data file for Construction=" + ConstructAlphas(0) + ", or error in data file."); - ShowContinueError(state, "...Looking on file=" + window5DataFilePath.string()); // TODO: call getAbsolutePath maybe? - continue; - } - - } // ...end of Window5 Constructions DO loop - - WConstructNames.deallocate(); - - // set some (default) properties of the Construction Derived Type - for (ConstrNum = 1; ConstrNum <= state.dataHeatBal->TotConstructs; ++ConstrNum) { - - // For air boundaries, skip TypeIsAirBoundary - if (state.dataConstruction->Construct(ConstrNum).TypeIsAirBoundary) continue; - if (state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) != 0.0) { - state.dataHeatBal->NominalU(ConstrNum) = 1.0 / state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum); - } else { - if (!state.dataConstruction->Construct(ConstrNum).WindowTypeEQL) { - ShowSevereError(state, "Nominal U is zero, for construction=" + state.dataConstruction->Construct(ConstrNum).Name); - ErrorsFound = true; - } - } - - CheckAndSetConstructionProperties(state, ConstrNum, ErrorsFound); - - } // End of ConstrNum DO loop - } - - void GetBuildingData(EnergyPlusData &state, bool &ErrorsFound) // If errors found in input - { - - // SUBROUTINE INFORMATION: - // AUTHOR Linda K. Lawrie - // DATE WRITTEN November 1997 - // MODIFIED October 1998, FW; May 1999 FW; Oct 2004 LKL - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This routine calls other routines to get the Zone, and Surface data - // from the input file. - - // METHODOLOGY EMPLOYED: - // The GetObjectItem routines are employed to retrieve the data. - - GetZoneData(state, ErrorsFound); // Read Zone data from input file - - SurfaceGeometry::SetupZoneGeometry(state, ErrorsFound); - } - - void GetZoneData(EnergyPlusData &state, bool &ErrorsFound) // If errors found in input - { - - // SUBROUTINE INFORMATION: - // AUTHOR Linda K. Lawrie - // DATE WRITTEN November 1997 - // MODIFIED PGE: Added ZONE LIST and ZONE GROUP objects, Nov 2003 - // RJH: Added init of DElight member of ZoneDaylight object, Jan 2004 - // JG: Added Part of Total Floor Area field March 2006 - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine gets the zone data for each zone in the input file. - - // METHODOLOGY EMPLOYED: - // The GetObjectItem routines are employed to retrieve the data. - - // REFERENCES: - // IDD Definition for Zone object - - // Using/Aliasing - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - - // SUBROUTINE PARAMETER DEFINITIONS: - constexpr const char *RoutineName("GetZoneData: "); - // INTEGER, PARAMETER :: MaxZonesInList = 100 ! This is to allow DIMENSIONing below - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int NumAlphas; - int NumNumbers; - int IOStatus; - int ZoneLoop; - std::string::size_type TMP; - int Loop; - int ListNum; - int ZoneNum; - std::string ZoneName; - int GroupNum; - auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; - cCurrentModuleObject = "Zone"; - state.dataGlobal->NumOfZones = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - state.dataHeatBal->Zone.allocate(state.dataGlobal->NumOfZones); - state.dataDaylightingData->ZoneDaylight.allocate(state.dataGlobal->NumOfZones); - // always allocate as the data structure is needed in output variable Zone Heat Index, Zone Humidity Index - state.dataHeatBal->Resilience.allocate(state.dataGlobal->NumOfZones); - - ZoneLoop = 0; - - for (Loop = 1; Loop <= state.dataGlobal->NumOfZones; ++Loop) { - - state.dataIPShortCut->rNumericArgs = 0.0; // Zero out just in case - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Loop, - state.dataIPShortCut->cAlphaArgs, - NumAlphas, - state.dataIPShortCut->rNumericArgs, - NumNumbers, - IOStatus, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - TMP = index(state.dataIPShortCut->cAlphaArgs(1), char(1)); - while (TMP != std::string::npos) { - state.dataIPShortCut->cAlphaArgs(1)[TMP] = ','; - TMP = index(state.dataIPShortCut->cAlphaArgs(1), char(1)); - } - TMP = index(state.dataIPShortCut->cAlphaArgs(1), char(2)); - while (TMP != std::string::npos) { - state.dataIPShortCut->cAlphaArgs(1)[TMP] = '!'; - TMP = index(state.dataIPShortCut->cAlphaArgs(1), char(2)); - } - - if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) - continue; - - ++ZoneLoop; - ProcessZoneData(state, - cCurrentModuleObject, - ZoneLoop, - state.dataIPShortCut->cAlphaArgs, - NumAlphas, - state.dataIPShortCut->rNumericArgs, - NumNumbers, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames, - ErrorsFound); - - } // Loop - - for (Loop = 1; Loop <= state.dataGlobal->NumOfZones; ++Loop) { - // Check to see if "nominally" controlled -- Zone Name appears in Zone Equip Configuration - // relies on zone name being the "name" of the Zone Controlled Equip Configuration - if (state.dataInputProcessing->inputProcessor->getObjectItemNum( - state, "ZoneHVAC:EquipmentConnections", "zone_name", state.dataHeatBal->Zone(Loop).Name) > 0) { - state.dataHeatBal->Zone(Loop).isNominalControlled = true; - } else { - state.dataHeatBal->Zone(Loop).isNominalControlled = false; - } - } - - // Get ZONE LIST objects - cCurrentModuleObject = "ZoneList"; - state.dataHeatBal->NumOfZoneLists = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataHeatBal->NumOfZoneLists > 0) { - - state.dataHeatBal->ZoneList.allocate(state.dataHeatBal->NumOfZoneLists); - - for (ListNum = 1; ListNum <= state.dataHeatBal->NumOfZoneLists; ++ListNum) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - ListNum, - state.dataIPShortCut->cAlphaArgs, - NumAlphas, - state.dataIPShortCut->rNumericArgs, - NumNumbers, - IOStatus, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - - state.dataHeatBal->ZoneList(ListNum).Name = state.dataIPShortCut->cAlphaArgs(1); - if (UtilityRoutines::FindItemInList(state.dataHeatBal->ZoneList(ListNum).Name, state.dataHeatBal->Zone) > 0) { - ShowWarningError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - "\": is a duplicate of a zone name."); - ShowContinueError(state, "This could be a problem in places where either a Zone Name or a Zone List can be used."); - } - - // List of zones - state.dataHeatBal->ZoneList(ListNum).NumOfZones = NumAlphas - 1; - - if (state.dataHeatBal->ZoneList(ListNum).NumOfZones < 1) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - "\": No zones specified."); - ErrorsFound = true; - } else { - state.dataHeatBal->ZoneList(ListNum).Zone.allocate(state.dataHeatBal->ZoneList(ListNum).NumOfZones); - state.dataHeatBal->ZoneList(ListNum).Zone = 0; - - for (ZoneNum = 1; ZoneNum <= state.dataHeatBal->ZoneList(ListNum).NumOfZones; ++ZoneNum) { - ZoneName = state.dataIPShortCut->cAlphaArgs(ZoneNum + 1); - state.dataHeatBal->ZoneList(ListNum).MaxZoneNameLength = - max(state.dataHeatBal->ZoneList(ListNum).MaxZoneNameLength, len(ZoneName)); - state.dataHeatBal->ZoneList(ListNum).Zone(ZoneNum) = UtilityRoutines::FindItemInList(ZoneName, state.dataHeatBal->Zone); - if (state.dataHeatBal->ZoneList(ListNum).Zone(ZoneNum) == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - "\": " + state.dataIPShortCut->cAlphaFieldNames(ZoneNum + 1) + ' ' + ZoneName + " not found."); - ErrorsFound = true; - } - - // Check for duplicate zones - for (Loop = 1; Loop <= ZoneNum - 1; ++Loop) { - if (state.dataHeatBal->ZoneList(ListNum).Zone(ZoneNum) == state.dataHeatBal->ZoneList(ListNum).Zone(Loop)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - "\": " + state.dataIPShortCut->cAlphaFieldNames(ZoneNum + 1) + ' ' + ZoneName + - " appears more than once in list."); - ErrorsFound = true; - } - } // Loop - } // ZoneNum - } - - } // ListNum - } - - // Get ZONE GROUP objects - cCurrentModuleObject = "ZoneGroup"; - state.dataHeatBal->NumOfZoneGroups = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataHeatBal->NumOfZoneGroups > 0) { - state.dataHeatBal->ZoneGroup.allocate(state.dataHeatBal->NumOfZoneGroups); - - for (GroupNum = 1; GroupNum <= state.dataHeatBal->NumOfZoneGroups; ++GroupNum) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - GroupNum, - state.dataIPShortCut->cAlphaArgs, - NumAlphas, - state.dataIPShortCut->rNumericArgs, - NumNumbers, - IOStatus, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - - state.dataHeatBal->ZoneGroup(GroupNum).Name = state.dataIPShortCut->cAlphaArgs(1); - - // Multiplier - checked already by IDD rules - state.dataHeatBal->ZoneGroup(GroupNum).Multiplier = state.dataIPShortCut->rNumericArgs(1); - - // Zone list - ListNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataHeatBal->ZoneList); - state.dataHeatBal->ZoneGroup(GroupNum).ZoneList = ListNum; - - if (ListNum == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + "\": " + - state.dataIPShortCut->cAlphaFieldNames(2) + " named " + state.dataIPShortCut->cAlphaArgs(2) + " not found."); - ErrorsFound = true; - } else { - // Check to make sure list is not in use by another ZONE GROUP - for (Loop = 1; Loop <= GroupNum - 1; ++Loop) { - if (state.dataHeatBal->ZoneGroup(GroupNum).ZoneList == state.dataHeatBal->ZoneGroup(Loop).ZoneList) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - "\": " + state.dataIPShortCut->cAlphaFieldNames(2) + " already used by " + cCurrentModuleObject + - " named " + state.dataHeatBal->ZoneGroup(Loop).Name + '.'); - ErrorsFound = true; - } - } // Loop - - // Set group multiplier for each zone in the list - for (Loop = 1; Loop <= state.dataHeatBal->ZoneList(ListNum).NumOfZones; ++Loop) { - ZoneNum = state.dataHeatBal->ZoneList(ListNum).Zone(Loop); - - if (ZoneNum > 0) { - // Check to make sure group multiplier was not already set by another ZONE GROUP - if (state.dataHeatBal->Zone(ZoneNum).ListGroup == 0) { - state.dataHeatBal->Zone(ZoneNum).ListMultiplier = state.dataHeatBal->ZoneGroup(GroupNum).Multiplier; - state.dataHeatBal->Zone(ZoneNum).ListGroup = ListNum; - } else { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - "\": Zone " + state.dataHeatBal->Zone(ZoneNum).Name + - " in ZoneList already exists in ZoneList of another ZoneGroup."); - ShowContinueError( - state, "Previous ZoneList=" + state.dataHeatBal->ZoneList(state.dataHeatBal->Zone(ZoneNum).ListGroup).Name); - ErrorsFound = true; - } - } - } // Loop - } - - } // GroupNum - } - - GetZoneLocalEnvData(state, ErrorsFound); - - // allocate the array the holds the predefined report data - state.dataHeatBal->ZonePreDefRep.allocate(state.dataGlobal->NumOfZones); - - // Now get Space data after Zones are set up, because Space is optional, Zones are not - GetSpaceData(state, ErrorsFound); - } - - void GetIncidentSolarMultiplier(EnergyPlusData &state, bool &ErrorsFound) - { - auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; - cCurrentModuleObject = "SurfaceProperty:IncidentSolarMultiplier"; - - static constexpr std::string_view RoutineName("GetIncidentSolarMultiplier: "); - - state.dataSurface->TotSurfIncSolMultiplier = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataSurface->TotSurfIncSolMultiplier <= 0) return; - - if (!allocated(state.dataSurface->SurfIncSolMultiplier)) { - // could be extended to interior surfaces later - state.dataSurface->SurfIncSolMultiplier.allocate(state.dataSurface->TotSurfaces); - } - - int NumAlpha; - int NumNumeric; - int IOStat; - for (int Loop = 1; Loop <= state.dataSurface->TotSurfIncSolMultiplier; ++Loop) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Loop, - state.dataIPShortCut->cAlphaArgs, - NumAlpha, - state.dataIPShortCut->rNumericArgs, - NumNumeric, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound)) { - ShowContinueError( - state, - "...each SurfaceProperty:IncidentSolarMultiplier name must not duplicate other SurfaceProperty:IncidentSolarMultiplier name"); - continue; - } - - // Assign surface number - int SurfNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(1), state.dataSurface->Surface); - if (SurfNum == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(1) + " has been found."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(1) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(1) + - "\" no corresponding surface (ref BuildingSurface:Detailed) has been found in the input file."); - ErrorsFound = true; - continue; - } - auto &Surf = state.dataSurface->Surface(SurfNum); - if (Surf.Class != DataSurfaces::SurfaceClass::Window) { - ShowSevereError(state, "IncidentSolarMultiplier defined for non-window surfaces"); - ErrorsFound = true; - continue; - } - if (Surf.ExtBoundCond != DataSurfaces::ExternalEnvironment) { - ShowSevereError(state, "IncidentSolarMultiplier defined for interior surfaces"); - ErrorsFound = true; - continue; - } - int ConstrNum = Surf.Construction; - auto const &Constr = state.dataConstruction->Construct(ConstrNum); - int MaterNum = Constr.LayerPoint(Constr.TotLayers); - auto const &Mat = state.dataMaterial->Material(MaterNum); - bool withNoncompatibleShades = - (Mat.Group == DataHeatBalance::MaterialGroup::Shade || Mat.Group == DataHeatBalance::MaterialGroup::WindowBlind || - Mat.Group == DataHeatBalance::MaterialGroup::Screen || Mat.Group == DataHeatBalance::MaterialGroup::GlassEquivalentLayer || - Mat.Group == DataHeatBalance::MaterialGroup::GapEquivalentLayer || - Mat.Group == DataHeatBalance::MaterialGroup::ShadeEquivalentLayer || - Mat.Group == DataHeatBalance::MaterialGroup::DrapeEquivalentLayer || - Mat.Group == DataHeatBalance::MaterialGroup::ScreenEquivalentLayer || - Mat.Group == DataHeatBalance::MaterialGroup::BlindEquivalentLayer || Surf.HasShadeControl); - if (withNoncompatibleShades) { - ShowSevereError(state, "Non-compatible shades defined alongside SurfaceProperty:IncidentSolarMultiplier for the same window"); - ErrorsFound = true; - continue; - } - int ScheduleIdx = GetScheduleIndex(state, state.dataIPShortCut->cAlphaArgs(2)); - // Schedule not found but schedule field is not empty, user had the wrong schedule name - if (ScheduleIdx == 0 && !(state.dataIPShortCut->cAlphaArgs(2).empty())) { - ShowSevereError(state, "Invalid Incident Solar Multiplier Schedule Name in SurfaceProperty:IncidentSolarMultiplier"); - continue; - } - Surf.hasIncSolMultiplier = true; - auto &SurfIncSolMult = state.dataSurface->SurfIncSolMultiplier(SurfNum); - SurfIncSolMult.Name = state.dataIPShortCut->cAlphaArgs(1); - SurfIncSolMult.SurfaceIdx = SurfNum; - SurfIncSolMult.Scaler = state.dataIPShortCut->rNumericArgs(1); - SurfIncSolMult.SchedPtr = ScheduleIdx; - } - } - - void GetZoneLocalEnvData(EnergyPlusData &state, bool &ErrorsFound) // Error flag indicator (true if errors found) - { - // SUBROUTINE INFORMATION: - // AUTHOR X LUO - // DATE WRITTEN July 2017 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // load input data for Outdoor Air Node for zones - - // Using/Aliasing - using DataLoopNode::ObjectIsParent; - using NodeInputManager::GetOnlySingleNode; - using OutAirNodeManager::CheckOutAirNodeNumber; - - // SUBROUTINE PARAMETER DEFINITIONS: - constexpr const char *RoutineName("GetZoneLocalEnvData: "); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int NumAlpha; - int NumNumeric; - - int Loop; - int ZoneLoop; - int ZoneNum; // DO loop counter for zones - int TotZoneEnv; - int IOStat; - int NodeNum; - - //----------------------------------------------------------------------- - // ZoneProperty:LocalEnvironment - //----------------------------------------------------------------------- - auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; - cCurrentModuleObject = "ZoneProperty:LocalEnvironment"; - TotZoneEnv = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (TotZoneEnv > 0) { - // Check if IDD definition is correct - state.dataGlobal->AnyLocalEnvironmentsInModel = true; - - if (!allocated(state.dataHeatBal->ZoneLocalEnvironment)) { - state.dataHeatBal->ZoneLocalEnvironment.allocate(TotZoneEnv); - } - - for (Loop = 1; Loop <= TotZoneEnv; ++Loop) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Loop, - state.dataIPShortCut->cAlphaArgs, - NumAlpha, - state.dataIPShortCut->rNumericArgs, - NumNumeric, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - - state.dataHeatBal->ZoneLocalEnvironment(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); - - // Assign zone number - ZoneNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataHeatBal->Zone); - if (ZoneNum == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(2) + " has been found."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(2) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(2) + - "\" no corresponding zone has been found in the input file."); - ErrorsFound = true; - } else { - state.dataHeatBal->ZoneLocalEnvironment(Loop).ZonePtr = ZoneNum; - } - - // Assign outdoor air node number; - NodeNum = GetOnlySingleNode(state, - state.dataIPShortCut->cAlphaArgs(3), - ErrorsFound, - DataLoopNode::ConnectionObjectType::ZonePropertyLocalEnvironment, - state.dataIPShortCut->cAlphaArgs(1), - DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Inlet, - NodeInputManager::CompFluidStream::Primary, - ObjectIsParent); - if (NodeNum == 0 && CheckOutAirNodeNumber(state, NodeNum)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(3) + " has been found."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(3) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(3) + - "\" no corresponding schedule has been found in the input file."); - ErrorsFound = true; - } else { - state.dataHeatBal->ZoneLocalEnvironment(Loop).OutdoorAirNodePtr = NodeNum; - } - } - } - // Link zone properties to zone object - for (ZoneLoop = 1; ZoneLoop <= state.dataGlobal->NumOfZones; ++ZoneLoop) { - for (Loop = 1; Loop <= TotZoneEnv; ++Loop) { - if (state.dataHeatBal->ZoneLocalEnvironment(Loop).ZonePtr == ZoneLoop) { - if (state.dataHeatBal->ZoneLocalEnvironment(Loop).OutdoorAirNodePtr != 0) { - state.dataHeatBal->Zone(ZoneLoop).LinkedOutAirNode = state.dataHeatBal->ZoneLocalEnvironment(Loop).OutdoorAirNodePtr; - } - } - } - } - } - - void ProcessZoneData(EnergyPlusData &state, - std::string const &cCurrentModuleObject, - int const ZoneLoop, - Array1D_string const &cAlphaArgs, - int &NumAlphas, - Array1D const &rNumericArgs, - int &NumNumbers, - [[maybe_unused]] Array1D_bool const &lNumericFieldBlanks, // Unused - Array1D_bool const &lAlphaFieldBlanks, - Array1D_string const &cAlphaFieldNames, - [[maybe_unused]] Array1D_string const &cNumericFieldNames, // Unused - bool &ErrorsFound // If errors found in input - ) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Linda K. Lawrie - // DATE WRITTEN November 1997 - // MODIFIED PGE: Added ZONE LIST and ZONE GROUP objects, Nov 2003 - // RJH: Added init of DElight member of ZoneDaylight object, Jan 2004 - // JG: Added Part of Total Floor Area field March 2006 - // RE-ENGINEERED MJW: Split out processing zone input to facilitate unit testing, Nov 2014 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine gets the zone data for each zone in the input file. - - constexpr const char *RoutineName("ProcessZoneData: "); - - state.dataHeatBal->Zone(ZoneLoop).Name = cAlphaArgs(1); - if (NumNumbers >= 1) state.dataHeatBal->Zone(ZoneLoop).RelNorth = rNumericArgs(1); - if (NumNumbers >= 2) state.dataHeatBal->Zone(ZoneLoop).OriginX = rNumericArgs(2); - if (NumNumbers >= 3) state.dataHeatBal->Zone(ZoneLoop).OriginY = rNumericArgs(3); - if (NumNumbers >= 4) state.dataHeatBal->Zone(ZoneLoop).OriginZ = rNumericArgs(4); - if (NumNumbers >= 5) state.dataHeatBal->Zone(ZoneLoop).OfType = rNumericArgs(5); - state.dataHeatBal->Zone(ZoneLoop).OfType = StandardZone; - if (NumNumbers >= 6) state.dataHeatBal->Zone(ZoneLoop).Multiplier = rNumericArgs(6); - if (NumNumbers >= 7) state.dataHeatBal->Zone(ZoneLoop).CeilingHeight = rNumericArgs(7); - if (NumNumbers >= 8) state.dataHeatBal->Zone(ZoneLoop).Volume = rNumericArgs(8); - if (NumNumbers >= 9) state.dataHeatBal->Zone(ZoneLoop).UserEnteredFloorArea = rNumericArgs(9); - - if (NumAlphas > 1 && !state.dataIPShortCut->lAlphaFieldBlanks(2)) { - { - auto const SELECT_CASE_var(cAlphaArgs(2)); - - if (SELECT_CASE_var == "SIMPLE") { - state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = ConvectionConstants::HcInt_ASHRAESimple; - - } else if ((SELECT_CASE_var == "TARP")) { - state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = ConvectionConstants::HcInt_ASHRAETARP; - - } else if (SELECT_CASE_var == "CEILINGDIFFUSER") { - state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = ConvectionConstants::HcInt_CeilingDiffuser; - - } else if (SELECT_CASE_var == "TROMBEWALL") { - state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = ConvectionConstants::HcInt_TrombeWall; - - } else if (SELECT_CASE_var == "ADAPTIVECONVECTIONALGORITHM") { - state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = ConvectionConstants::HcInt_AdaptiveConvectionAlgorithm; - - } else if (SELECT_CASE_var == "ASTMC1340") { - state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = ConvectionConstants::HcInt_ASTMC1340; - - } else { - ShowSevereError(state, std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataHeatBal->Zone(ZoneLoop).Name + "\"."); - ShowContinueError(state, "Invalid value for " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\"."); - ErrorsFound = true; - } - } - } else { - // No zone specific algorithm specified, use default Inside Convection Algorithm - state.dataHeatBal->Zone(ZoneLoop).InsideConvectionAlgo = state.dataHeatBal->DefaultInsideConvectionAlgo; - } - - if (NumAlphas > 2 && !state.dataIPShortCut->lAlphaFieldBlanks(3)) { - { - auto const SELECT_CASE_var(cAlphaArgs(3)); - - if ((SELECT_CASE_var == "SIMPLECOMBINED")) { - state.dataHeatBal->Zone(ZoneLoop).OutsideConvectionAlgo = ConvectionConstants::HcExt_ASHRAESimple; - - } else if ((SELECT_CASE_var == "TARP")) { - state.dataHeatBal->Zone(ZoneLoop).OutsideConvectionAlgo = ConvectionConstants::HcExt_ASHRAETARP; - - } else if (SELECT_CASE_var == "MOWITT") { - state.dataHeatBal->Zone(ZoneLoop).OutsideConvectionAlgo = ConvectionConstants::HcExt_MoWiTTHcOutside; - - } else if (SELECT_CASE_var == "DOE-2") { - state.dataHeatBal->Zone(ZoneLoop).OutsideConvectionAlgo = ConvectionConstants::HcExt_DOE2HcOutside; - - } else if (SELECT_CASE_var == "ADAPTIVECONVECTIONALGORITHM") { - state.dataHeatBal->Zone(ZoneLoop).OutsideConvectionAlgo = ConvectionConstants::HcExt_AdaptiveConvectionAlgorithm; - - } else { - ShowSevereError(state, std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataHeatBal->Zone(ZoneLoop).Name + "\"."); - ShowContinueError(state, "Invalid value for " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); - ErrorsFound = true; - } - } - } else { - // No zone specific algorithm specified, use default Outside Convection Algorithm - state.dataHeatBal->Zone(ZoneLoop).OutsideConvectionAlgo = state.dataHeatBal->DefaultOutsideConvectionAlgo; - } - - // Process the input field: Part of Total Floor Area - // The default value is YES and so only NO needs to be handled - if (NumAlphas > 3) { - if (UtilityRoutines::SameString("No", cAlphaArgs(4))) { - state.dataHeatBal->Zone(ZoneLoop).isPartOfTotalArea = false; - } else if (UtilityRoutines::SameString("Yes", cAlphaArgs(4)) || lAlphaFieldBlanks(4)) { - state.dataHeatBal->Zone(ZoneLoop).isPartOfTotalArea = true; - } else { - ShowSevereError(state, std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataHeatBal->Zone(ZoneLoop).Name + "\"."); - ShowContinueError(state, "Invalid value for " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + "\"."); - ErrorsFound = true; - } - } - - // Zone outdoor environmental variables, used for zone infiltration/ventilation - SetupOutputVariable(state, - "Zone Outdoor Air Drybulb Temperature", - OutputProcessor::Unit::C, - state.dataHeatBal->Zone(ZoneLoop).OutDryBulbTemp, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneLoop).Name); - SetupOutputVariable(state, - "Zone Outdoor Air Wetbulb Temperature", - OutputProcessor::Unit::C, - state.dataHeatBal->Zone(ZoneLoop).OutWetBulbTemp, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneLoop).Name); - SetupOutputVariable(state, - "Zone Outdoor Air Wind Speed", - OutputProcessor::Unit::m_s, - state.dataHeatBal->Zone(ZoneLoop).WindSpeed, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneLoop).Name); - SetupOutputVariable(state, - "Zone Outdoor Air Wind Direction", - OutputProcessor::Unit::deg, - state.dataHeatBal->Zone(ZoneLoop).WindDir, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->Zone(ZoneLoop).Name); - } - - void GetSpaceData(EnergyPlusData &state, bool &ErrorsFound) // If errors found in input - { - constexpr const char *RoutineName("GetSpaceData: "); - std::string cCurrentModuleObject = "Space"; - auto &ip = state.dataInputProcessing->inputProcessor; - auto const instances = ip->epJSON.find(cCurrentModuleObject); - if (instances != ip->epJSON.end()) { - auto const &objectSchemaProps = ip->getObjectSchemaProps(state, cCurrentModuleObject); - auto &instancesValue = instances.value(); - int numSpaces = instancesValue.size(); - int spaceNum = 0; - // Allow for one additional Space per zone if some surfaces do not have a Space assigned in input - state.dataHeatBal->space.allocate(size_t(numSpaces + state.dataGlobal->NumOfZones)); - // Allow for one additional "General" space type for auto-generated spaces - state.dataHeatBal->spaceTypes.allocate(size_t(numSpaces + 1)); - - for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { - ++spaceNum; - auto const &objectFields = instance.value(); - auto &thisSpace = state.dataHeatBal->space(spaceNum); - thisSpace.Name = UtilityRoutines::MakeUPPERCase(instance.key()); - ip->markObjectAsUsed(cCurrentModuleObject, instance.key()); - std::string zoneName = ip->getAlphaFieldValue(objectFields, objectSchemaProps, "zone_name"); - thisSpace.CeilingHeight = ip->getRealFieldValue(objectFields, objectSchemaProps, "ceiling_height"); - thisSpace.Volume = ip->getRealFieldValue(objectFields, objectSchemaProps, "volume"); - thisSpace.userEnteredFloorArea = ip->getRealFieldValue(objectFields, objectSchemaProps, "floor_area"); - int zoneNum = UtilityRoutines::FindItemInList(zoneName, state.dataHeatBal->Zone); - if (zoneNum > 0) { - thisSpace.zoneNum = zoneNum; - state.dataHeatBal->Zone(zoneNum).spaceIndexes.emplace_back(spaceNum); - ++state.dataHeatBal->Zone(zoneNum).numSpaces; - } else { - ShowSevereError(state, RoutineName + cCurrentModuleObject + "=" + thisSpace.Name); - ShowContinueError(state, "Zone Name =" + zoneName + "not found."); - ErrorsFound = true; - } - thisSpace.spaceType = ip->getAlphaFieldValue(objectFields, objectSchemaProps, "space_type"); - bool spaceTypeFound = false; - for (int spaceTypePtr = 1; spaceTypePtr <= state.dataGlobal->numSpaceTypes; ++spaceTypePtr) { - if (UtilityRoutines::SameString(thisSpace.spaceType, state.dataHeatBal->spaceTypes(spaceTypePtr))) { - thisSpace.spaceTypeNum = spaceTypePtr; - spaceTypeFound = true; - break; - } - } - if (!spaceTypeFound) { - ++state.dataGlobal->numSpaceTypes; - state.dataHeatBal->spaceTypes(state.dataGlobal->numSpaceTypes) = thisSpace.spaceType; - thisSpace.spaceTypeNum = state.dataGlobal->numSpaceTypes; - } - - auto extensibles = objectFields.find("tags"); - auto const &extensionSchemaProps = objectSchemaProps["tags"]["items"]["properties"]; - if (extensibles != objectFields.end()) { - auto extensiblesArray = extensibles.value(); - for (auto extensibleInstance : extensiblesArray) { - thisSpace.tags.emplace_back(ip->getAlphaFieldValue(extensibleInstance, extensionSchemaProps, "tag")); - } - } - } - state.dataGlobal->numSpaces = spaceNum; - } else { - // If no Spaces are defined, then allow for one Space per zone, and one spaceType - state.dataHeatBal->space.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBal->spaceTypes.allocate(1); - } - - cCurrentModuleObject = "SpaceList"; - auto const instances2 = ip->epJSON.find(cCurrentModuleObject); - if (instances2 != ip->epJSON.end()) { - auto const &objectSchemaProps = ip->getObjectSchemaProps(state, cCurrentModuleObject); - auto &instancesValue = instances2.value(); - int numSpaceLists = instancesValue.size(); - int spaceListNum = 0; - state.dataHeatBal->spaceList.allocate(numSpaceLists); - for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { - ++spaceListNum; - auto const &objectFields = instance.value(); - auto &thisSpaceList = state.dataHeatBal->spaceList(spaceListNum); - thisSpaceList.Name = UtilityRoutines::MakeUPPERCase(instance.key()); - ip->markObjectAsUsed(cCurrentModuleObject, instance.key()); - - if (UtilityRoutines::FindItemInList(thisSpaceList.Name, state.dataHeatBal->Zone) > 0) { - ShowSevereError(state, RoutineName + cCurrentModuleObject + "=\"" + thisSpaceList.Name + "\": is a duplicate of a zone name."); - ErrorsFound = true; - } - if (UtilityRoutines::FindItemInList(thisSpaceList.Name, state.dataHeatBal->space) > 0) { - ShowSevereError(state, RoutineName + cCurrentModuleObject + "=\"" + thisSpaceList.Name + "\": is a duplicate of a space name."); - ErrorsFound = true; - } - - // List of spaces - thisSpaceList.numListSpaces = 0; - auto extensibles = objectFields.find("spaces"); - auto const &extensionSchemaProps = objectSchemaProps["spaces"]["items"]["properties"]; - if (extensibles != objectFields.end()) { - auto extensiblesArray = extensibles.value(); - for (auto extensibleInstance : extensiblesArray) { - std::string thisSpaceName = ip->getAlphaFieldValue(extensibleInstance, extensionSchemaProps, "space_name"); - int thisSpaceNum = UtilityRoutines::FindItemInList(thisSpaceName, state.dataHeatBal->space); - if (thisSpaceNum > 0) { - thisSpaceList.spaces.emplace_back(thisSpaceNum); - ++thisSpaceList.numListSpaces; - } else { - ShowSevereError(state, RoutineName + cCurrentModuleObject + "=" + thisSpaceList.Name); - ShowContinueError(state, "Space Name=" + thisSpaceName + " not found."); - ErrorsFound = true; - } - thisSpaceList.maxSpaceNameLength = max(thisSpaceList.maxSpaceNameLength, len(thisSpaceName)); - // Check for duplicate spaces - for (int loop = 1; loop <= int(thisSpaceList.spaces.size()) - 1; ++loop) { - if (thisSpaceNum == thisSpaceList.spaces(loop)) { - ShowSevereError(state, - RoutineName + cCurrentModuleObject + "=\"" + thisSpaceList.Name + "\": Space Name " + thisSpaceName + - " appears more than once in list."); - ErrorsFound = true; - } - } - } - } - } - } - - // Make sure every zone has at least one space - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - auto &thisZone = state.dataHeatBal->Zone(zoneNum); - if (thisZone.spaceIndexes.empty()) { - ++state.dataGlobal->numSpaces; - state.dataHeatBal->space(state.dataGlobal->numSpaces).zoneNum = zoneNum; - state.dataHeatBal->space(state.dataGlobal->numSpaces).Name = thisZone.Name; - state.dataHeatBal->space(state.dataGlobal->numSpaces).spaceType = "GENERAL"; - state.dataHeatBal->space(state.dataGlobal->numSpaces).spaceTypeNum = GetGeneralSpaceTypeNum(state); - // Add to zone's list of spaces - thisZone.spaceIndexes.emplace_back(state.dataGlobal->numSpaces); - ++state.dataHeatBal->Zone(zoneNum).numSpaces; - } - } - } - - int GetGeneralSpaceTypeNum(EnergyPlusData &state) - { - // If "General" exists as a space type return the index - bool generalSpaceTypeExists = false; - int generalSpaceTypeNum = 0; - for (int spaceTypePtr = 1; spaceTypePtr <= state.dataGlobal->numSpaceTypes; ++spaceTypePtr) { - if (UtilityRoutines::SameString(state.dataHeatBal->spaceTypes(spaceTypePtr), "GENERAL")) { - generalSpaceTypeNum = spaceTypePtr; - generalSpaceTypeExists = true; - break; - } - } - // Add General space type if it doesn't exist yet - if (!generalSpaceTypeExists) { - ++state.dataGlobal->numSpaceTypes; - state.dataHeatBal->spaceTypes(state.dataGlobal->numSpaceTypes) = "GENERAL"; - generalSpaceTypeNum = state.dataGlobal->numSpaceTypes; - } - return generalSpaceTypeNum; - } - // End of Get Input subroutines for the HB Module - //****************************************************************************** - - // Beginning Initialization Section of the Module - //****************************************************************************** - - void InitHeatBalance(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Rick Strand - // DATE WRITTEN April 1997 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine is the main driver for initializations within the - // heat balance. - - // METHODOLOGY EMPLOYED: - // Uses the status flags to trigger initialization events. Some of the files - // have been moved to other heat balance managers. More of these initializations - // will have to continue to be re-structured. - - // REFERENCES: - // na - - // Using/Aliasing - using namespace WindowManager; - using namespace SolarShading; - using DaylightingDevices::InitDaylightingDevices; - using OutAirNodeManager::SetOutAirNodes; - using WindowEquivalentLayer::InitEquivalentLayerWindowCalculations; - - int StormWinNum; // Number of StormWindow object - - if (state.dataGlobal->BeginSimFlag) { - AllocateHeatBalArrays(state); // Allocate the Module Arrays - if (state.dataHeatBal->AnyCTF || state.dataHeatBal->AnyEMPD) { - DisplayString(state, "Initializing Response Factors"); - InitConductionTransferFunctions(state); // Initialize the response factors - } - HeatBalanceSurfaceManager::InitSurfacePropertyViewFactors(state); - DisplayString(state, "Initializing Window Optical Properties"); - InitEquivalentLayerWindowCalculations(state); // Initialize the EQL window optical properties - // InitGlassOpticalCalculations(); // Initialize the window optical properties - InitWindowOpticalCalculations(state); - InitDaylightingDevices(state); // Initialize any daylighting devices - DisplayString(state, "Initializing Solar Calculations"); - InitSolarCalculations(state); // Initialize the shadowing calculations - } - - if (state.dataGlobal->BeginEnvrnFlag) { - state.dataHeatBalMgr->MaxHeatLoadPrevDay = 0.0; - state.dataHeatBalMgr->MaxCoolLoadPrevDay = 0.0; - state.dataHeatBalMgr->MaxTempPrevDay = 0.0; - state.dataHeatBalMgr->MinTempPrevDay = 0.0; - state.dataHeatBalMgr->MaxHeatLoadZone = -9999.0; - state.dataHeatBalMgr->MaxCoolLoadZone = -9999.0; - state.dataHeatBalMgr->MaxTempZone = -9999.0; - state.dataHeatBalMgr->MinTempZone = 1000.0; - state.dataHeatBalMgr->TempZone = -9999.0; - state.dataHeatBalMgr->LoadZone = -9999.0; - state.dataHeatBalMgr->TempZonePrevDay = 1000.0; - state.dataHeatBalMgr->LoadZonePrevDay = -9999.0; - state.dataHeatBalMgr->TempZoneSecPrevDay = 1000.0; - state.dataHeatBalMgr->TempZoneSecPrevDay = -9999.0; - state.dataHeatBalMgr->WarmupTempDiff = 0.0; - state.dataHeatBalMgr->WarmupLoadDiff = 0.0; - state.dataHeatBalMgr->TempZoneRpt = 0.0; - state.dataHeatBalMgr->LoadZoneRpt = 0.0; - state.dataHeatBalMgr->MaxLoadZoneRpt = 0.0; - state.dataHeatBalMgr->CountWarmupDayPoints = 0; - - for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; SurfNum++) { - state.dataSurface->SurfaceWindow(SurfNum).ThetaFace = 296.15; - state.dataSurface->SurfWinEffInsSurfTemp(SurfNum) = 23.0; - } - } - - if (state.dataGlobal->AnyEnergyManagementSystemInModel) { - HeatBalanceSurfaceManager::InitEMSControlledConstructions(state); - HeatBalanceSurfaceManager::InitEMSControlledSurfaceProperties(state); - } - - // Init storm window pointers - if (state.dataSurface->TotStormWin > 0) { - if (state.dataGlobal->BeginDayFlag) { - SetStormWindowControl(state); - state.dataHeatBalMgr->ChangeSet = false; - } else if (!state.dataHeatBalMgr->ChangeSet) { - state.dataHeatBal->StormWinChangeThisDay = false; - for (StormWinNum = 1; StormWinNum <= state.dataSurface->TotStormWin; ++StormWinNum) { - int SurfNum = state.dataSurface->StormWindow(StormWinNum).BaseWindowNum; - state.dataSurface->SurfWinStormWinFlagPrevDay(SurfNum) = state.dataSurface->SurfWinStormWinFlag(SurfNum); - } - state.dataHeatBalMgr->ChangeSet = true; - } - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - auto &thisSpace = state.dataHeatBal->space(spaceNum); - int const firstSurfWin = thisSpace.WindowSurfaceFirst; - int const lastSurfWin = thisSpace.WindowSurfaceLast; - for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) { - if (state.dataSurface->SurfWinStormWinFlag(SurfNum) == 1 && - state.dataSurface->SurfWinWindowModelType(SurfNum) == DataSurfaces::WindowModel::Detailed) { - state.dataSurface->SurfActiveConstruction(SurfNum) = state.dataSurface->SurfWinStormWinConstr(SurfNum); - } else { - state.dataSurface->SurfActiveConstruction(SurfNum) = state.dataSurface->Surface(SurfNum).Construction; - } - } - } - } - } - - if (state.dataGlobal->BeginSimFlag && state.dataGlobal->DoWeathSim && state.dataSysVars->ReportExtShadingSunlitFrac) { - OpenShadingFile(state); - } - - if (state.dataGlobal->BeginDayFlag) { - if (!state.dataGlobal->WarmupFlag) { - if (state.dataGlobal->DayOfSim == 1) { - state.dataHeatBalMgr->MaxHeatLoadZone = -9999.0; - state.dataHeatBalMgr->MaxCoolLoadZone = -9999.0; - state.dataHeatBalMgr->MaxTempZone = -9999.0; - state.dataHeatBalMgr->MinTempZone = 1000.0; - } - } - if (!state.dataSysVars->DetailedSolarTimestepIntegration) { - PerformSolarCalculations(state); - } - } - - if (state.dataSysVars->DetailedSolarTimestepIntegration) { // always redo solar calcs - PerformSolarCalculations(state); - } - - if (state.dataGlobal->BeginDayFlag && !state.dataGlobal->WarmupFlag && - state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::RunPeriodWeather && state.dataSysVars->ReportExtShadingSunlitFrac) { - for (int iHour = 1; iHour <= 24; ++iHour) { // Do for all hours. - for (int TS = 1; TS <= state.dataGlobal->NumOfTimeStepInHour; ++TS) { - constexpr const char *ShdFracFmt1(" {:02}/{:02} {:02}:{:02},"); - if (TS == state.dataGlobal->NumOfTimeStepInHour) { - print(state.files.shade, ShdFracFmt1, state.dataEnvrn->Month, state.dataEnvrn->DayOfMonth, iHour, 0); - } else { - print(state.files.shade, - ShdFracFmt1, - state.dataEnvrn->Month, - state.dataEnvrn->DayOfMonth, - iHour - 1, - (60 / state.dataGlobal->NumOfTimeStepInHour) * TS); - } - for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) { - constexpr const char *ShdFracFmt2("{:10.8F},"); - print(state.files.shade, ShdFracFmt2, state.dataHeatBal->SurfSunlitFrac(iHour, TS, SurfNum)); - } - print(state.files.shade, "\n"); - } - } - } - - // Initialize zone outdoor environmental variables - // Bulk Initialization for Temperatures & WindSpeed - // using the zone, modify the zone Dry/Wet BulbTemps - SetZoneOutBulbTempAt(state); - CheckZoneOutBulbTempAt(state); - - // set zone level wind dir to global value - SetZoneWindSpeedAt(state); - SetZoneWindDirAt(state); - - // Set zone data to linked air node value if defined. - if (state.dataGlobal->AnyLocalEnvironmentsInModel) { - SetOutAirNodes(state); - for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - if (state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode > 0) { - if (state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirDryBulbSchedNum > 0) { - state.dataHeatBal->Zone(ZoneNum).OutDryBulbTemp = GetCurrentScheduleValue( - state, state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirDryBulbSchedNum); - } else { - state.dataHeatBal->Zone(ZoneNum).OutDryBulbTemp = - state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirDryBulb; - } - if (state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWetBulbSchedNum > 0) { - state.dataHeatBal->Zone(ZoneNum).OutWetBulbTemp = GetCurrentScheduleValue( - state, state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWetBulbSchedNum); - } else { - state.dataHeatBal->Zone(ZoneNum).OutWetBulbTemp = - state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWetBulb; - } - if (state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWindSpeedSchedNum > 0) { - state.dataHeatBal->Zone(ZoneNum).WindSpeed = GetCurrentScheduleValue( - state, state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWindSpeedSchedNum); - } else { - state.dataHeatBal->Zone(ZoneNum).WindSpeed = - state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWindSpeed; - } - if (state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWindDirSchedNum > 0) { - state.dataHeatBal->Zone(ZoneNum).WindDir = GetCurrentScheduleValue( - state, state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWindDirSchedNum); - } else { - state.dataHeatBal->Zone(ZoneNum).WindDir = - state.dataLoopNodes->Node(state.dataHeatBal->Zone(ZoneNum).LinkedOutAirNode).OutAirWindDir; - } - } - } - } - - // Overwriting surface and zone level environmental data with EMS override value - if (state.dataGlobal->AnyEnergyManagementSystemInModel) { - for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - if (state.dataHeatBal->Zone(ZoneNum).OutDryBulbTempEMSOverrideOn) { - state.dataHeatBal->Zone(ZoneNum).OutDryBulbTemp = state.dataHeatBal->Zone(ZoneNum).OutDryBulbTempEMSOverrideValue; - } - if (state.dataHeatBal->Zone(ZoneNum).OutWetBulbTempEMSOverrideOn) { - state.dataHeatBal->Zone(ZoneNum).OutWetBulbTemp = state.dataHeatBal->Zone(ZoneNum).OutWetBulbTempEMSOverrideValue; - } - if (state.dataHeatBal->Zone(ZoneNum).WindSpeedEMSOverrideOn) { - state.dataHeatBal->Zone(ZoneNum).WindSpeed = state.dataHeatBal->Zone(ZoneNum).WindSpeedEMSOverrideValue; - } - if (state.dataHeatBal->Zone(ZoneNum).WindDirEMSOverrideOn) { - state.dataHeatBal->Zone(ZoneNum).WindDir = state.dataHeatBal->Zone(ZoneNum).WindDirEMSOverrideValue; - } - } - } - - if (state.dataGlobal->BeginSimFlag) { - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - auto &thisSpace = state.dataHeatBal->space(spaceNum); - int const firstSurfWin = thisSpace.WindowSurfaceFirst; - int const lastSurfWin = thisSpace.WindowSurfaceLast; - for (int SurfNum = firstSurfWin; SurfNum <= lastSurfWin; ++SurfNum) { - if (state.dataSurface->SurfWinWindowModelType(SurfNum) != DataSurfaces::WindowModel::BSDF && - state.dataSurface->SurfWinWindowModelType(SurfNum) != DataSurfaces::WindowModel::EQL) { - state.dataSurface->SurfWinWindowModelType(SurfNum) = DataSurfaces::WindowModel::Detailed; - } - } - } - } - } - } - - void AllocateZoneHeatBalArrays(EnergyPlusData &state) - { - // Allocate zone / encl hb arrays - - // TODO MJW: Punt for now, sometimes unit test will get here and need these to be allocated, but simulations need them sooner - if (!state.dataHeatBal->ZoneIntGain.allocated()) { - DataHeatBalance::AllocateIntGains(state); - } - state.dataHeatBal->ZoneMRT.allocate(state.dataGlobal->NumOfZones); - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - state.dataHeatBal->ZoneMRT(zoneNum) = 0.0; - } - state.dataZoneTempPredictorCorrector->zoneHeatBalance.allocate(state.dataGlobal->NumOfZones); - // Always allocate spaceHeatBalance, even if doSpaceHeatBalance is false, because it's used to gather some of the zone totals - state.dataZoneTempPredictorCorrector->spaceHeatBalance.allocate(state.dataGlobal->numSpaces); - - state.dataHeatBal->EnclSolQSDifSol.allocate(state.dataViewFactor->NumOfSolarEnclosures); - state.dataHeatBal->EnclSolQD.allocate(state.dataViewFactor->NumOfSolarEnclosures); - state.dataHeatBal->EnclSolQDforDaylight.allocate(state.dataViewFactor->NumOfSolarEnclosures); - state.dataHeatBal->EnclSolDB.allocate(state.dataViewFactor->NumOfSolarEnclosures); - state.dataHeatBal->EnclSolDBSSG.allocate(state.dataViewFactor->NumOfSolarEnclosures); - state.dataHeatBal->EnclSolDBIntWin.allocate(state.dataViewFactor->NumOfSolarEnclosures); - state.dataHeatBal->EnclSolQSWRad.allocate(state.dataViewFactor->NumOfSolarEnclosures); - state.dataHeatBal->EnclSolQSWRadLights.allocate(state.dataViewFactor->NumOfSolarEnclosures); - for (int enclosureNum = 1; enclosureNum <= state.dataViewFactor->NumOfSolarEnclosures; ++enclosureNum) { - state.dataHeatBal->EnclSolQSDifSol(enclosureNum) = 0.0; - state.dataHeatBal->EnclSolQD(enclosureNum) = 0.0; - state.dataHeatBal->EnclSolQDforDaylight(enclosureNum) = 0.0; - state.dataHeatBal->EnclSolQSWRad(enclosureNum) = 0.0; - state.dataHeatBal->EnclSolQSWRadLights(enclosureNum) = 0.0; - state.dataHeatBal->EnclSolDB(enclosureNum) = 0.0; - state.dataHeatBal->EnclSolDBSSG(enclosureNum) = 0.0; - state.dataHeatBal->EnclSolDBIntWin(enclosureNum) = 0.0; - } - } - void AllocateHeatBalArrays(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Richard Liesen - // DATE WRITTEN February 1998 - - // Use the total number of zones or surfaces to allocate variables to avoid a limit - AllocateZoneHeatBalArrays(state); - state.dataHeatBalFanSys->SumConvHTRadSys.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalFanSys->SumLatentHTRadSys.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalFanSys->SumConvPool.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalFanSys->SumLatentPool.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalFanSys->ZoneQdotRadHVACToPerson.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalFanSys->ZoneQHTRadSysToPerson.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalFanSys->ZoneQHWBaseboardToPerson.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalFanSys->ZoneQSteamBaseboardToPerson.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalFanSys->ZoneQElecBaseboardToPerson.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalFanSys->ZoneQCoolingPanelToPerson.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalFanSys->ZoneReOrder.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBalFanSys->ZoneMassBalanceFlag.dimension(state.dataGlobal->NumOfZones, false); - state.dataHeatBalFanSys->ZoneInfiltrationFlag.dimension(state.dataGlobal->NumOfZones, false); - state.dataHeatBalFanSys->ZoneReOrder = 0; - state.dataHeatBalFanSys->TempTstatAir.dimension(state.dataGlobal->NumOfZones, DataHeatBalance::ZoneInitialTemp); - if (state.dataContaminantBalance->Contaminant.CO2Simulation) { - state.dataContaminantBalance->OutdoorCO2 = GetCurrentScheduleValue(state, state.dataContaminantBalance->Contaminant.CO2OutdoorSchedPtr); - state.dataContaminantBalance->ZoneAirCO2.dimension(state.dataGlobal->NumOfZones, state.dataContaminantBalance->OutdoorCO2); - state.dataContaminantBalance->ZoneAirCO2Temp.dimension(state.dataGlobal->NumOfZones, state.dataContaminantBalance->OutdoorCO2); - state.dataContaminantBalance->ZoneAirCO2Avg.dimension(state.dataGlobal->NumOfZones, state.dataContaminantBalance->OutdoorCO2); - } - if (state.dataContaminantBalance->Contaminant.GenericContamSimulation) { - state.dataContaminantBalance->OutdoorGC = - GetCurrentScheduleValue(state, state.dataContaminantBalance->Contaminant.GenericContamOutdoorSchedPtr); - state.dataContaminantBalance->ZoneAirGC.dimension(state.dataGlobal->NumOfZones, state.dataContaminantBalance->OutdoorGC); - state.dataContaminantBalance->ZoneAirGCTemp.dimension(state.dataGlobal->NumOfZones, state.dataContaminantBalance->OutdoorGC); - state.dataContaminantBalance->ZoneAirGCAvg.dimension(state.dataGlobal->NumOfZones, state.dataContaminantBalance->OutdoorGC); - } - state.dataHeatBalMgr->MaxTempPrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalMgr->MinTempPrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalMgr->MaxHeatLoadPrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalMgr->MaxCoolLoadPrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalMgr->MaxHeatLoadZone.dimension(state.dataGlobal->NumOfZones, -9999.0); - state.dataHeatBalMgr->MaxCoolLoadZone.dimension(state.dataGlobal->NumOfZones, -9999.0); - state.dataHeatBalMgr->MaxTempZone.dimension(state.dataGlobal->NumOfZones, -9999.0); - state.dataHeatBalMgr->MinTempZone.dimension(state.dataGlobal->NumOfZones, 1000.0); - state.dataHeatBalMgr->TempZonePrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalMgr->LoadZonePrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalMgr->TempZoneSecPrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalMgr->LoadZoneSecPrevDay.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalMgr->WarmupTempDiff.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalMgr->WarmupLoadDiff.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalMgr->TempZone.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalMgr->LoadZone.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataHeatBalMgr->TempZoneRpt.dimension(state.dataGlobal->NumOfZones, state.dataGlobal->NumOfTimeStepInHour * 24, 0.0); - state.dataHeatBalMgr->LoadZoneRpt.dimension(state.dataGlobal->NumOfZones, state.dataGlobal->NumOfTimeStepInHour * 24, 0.0); - state.dataHeatBalMgr->MaxLoadZoneRpt.dimension(state.dataGlobal->NumOfZones, state.dataGlobal->NumOfTimeStepInHour * 24, 0.0); - state.dataHeatBalMgr->WarmupConvergenceValues.allocate(state.dataGlobal->NumOfZones); - state.dataHeatBalMgr->TempZoneRptStdDev.allocate(state.dataGlobal->NumOfTimeStepInHour * 24); - state.dataHeatBalMgr->LoadZoneRptStdDev.allocate(state.dataGlobal->NumOfTimeStepInHour * 24); - // MassConservation.allocate( NumOfZones ); - - state.dataHeatBalFanSys->CrossedColdThreshRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->CrossedHeatThreshRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->CrossedColdThreshRepPeriod = false; - state.dataHeatBalFanSys->CrossedHeatThreshRepPeriod = false; - if (state.dataWeatherManager->TotThermalReportPers > 0) { - state.dataHeatBalFanSys->ZoneHeatIndexHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->ZoneHeatIndexOccupiedHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->ZoneHeatIndexOccuHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->ZoneHumidexHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->ZoneHumidexOccupiedHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->ZoneHumidexOccuHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->ZoneColdHourOfSafetyBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->ZoneHeatHourOfSafetyBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->ZoneUnmetDegreeHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccuHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->ZoneDiscomfortWtExceedOccupiedHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotThermalReportPers); - } - - if (state.dataWeatherManager->TotCO2ReportPers > 0) { - state.dataHeatBalFanSys->ZoneCO2LevelHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotCO2ReportPers); - state.dataHeatBalFanSys->ZoneCO2LevelOccuHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotCO2ReportPers); - state.dataHeatBalFanSys->ZoneCO2LevelOccupiedHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotCO2ReportPers); - } - if (state.dataWeatherManager->TotVisualReportPers > 0) { - state.dataHeatBalFanSys->ZoneLightingLevelHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotVisualReportPers); - state.dataHeatBalFanSys->ZoneLightingLevelOccuHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotVisualReportPers); - state.dataHeatBalFanSys->ZoneLightingLevelOccupiedHourBinsRepPeriod.allocate(state.dataGlobal->NumOfZones, - state.dataWeatherManager->TotVisualReportPers); - } - - state.dataHeatBalFanSys->ZoneLowSETHoursRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->ZoneHighSETHoursRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->lowSETLongestHoursRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->highSETLongestHoursRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->lowSETLongestStartRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); - state.dataHeatBalFanSys->highSETLongestStartRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); - - state.dataHeatBalMgr->CountWarmupDayPoints = 0; - - for (int loop = 1; loop <= state.dataGlobal->NumOfZones; ++loop) { - // CurrentModuleObject='Zone' - SetupOutputVariable(state, - "Zone Mean Radiant Temperature", - OutputProcessor::Unit::C, - state.dataHeatBal->ZoneMRT(loop), - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::State, - state.dataHeatBal->Zone(loop).Name); - } - } - - // End Initialization Section of the Module - //****************************************************************************** - - // Beginning of Record Keeping subroutines for the HB Module - // ***************************************************************************** - - void RecKeepHeatBalance(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Rick Strand - // DATE WRITTEN April 1997 - // MODIFIED June 2011, Daeho Kang for individual zone maximums & convergence outputs - // July 2016, Rick Strand for movable insulation bug fix - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine is the main driver for record keeping within the - // heat balance. - - // Using/Aliasing - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int ZoneNum; - - // Record Maxs & Mins for individual zone - for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); - auto &thisZoneSysEnergyDemand = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneNum); - if (thisZoneHB.ZTAV > state.dataHeatBalMgr->MaxTempZone(ZoneNum)) { - state.dataHeatBalMgr->MaxTempZone(ZoneNum) = thisZoneHB.ZTAV; - } - if (thisZoneHB.ZTAV < state.dataHeatBalMgr->MinTempZone(ZoneNum)) { - state.dataHeatBalMgr->MinTempZone(ZoneNum) = thisZoneHB.ZTAV; - } - if (thisZoneSysEnergyDemand.ZoneSNLoadHeatRate > state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum)) { - state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum) = thisZoneSysEnergyDemand.ZoneSNLoadHeatRate; - } - if (thisZoneSysEnergyDemand.ZoneSNLoadCoolRate > state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum)) { - state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum) = thisZoneSysEnergyDemand.ZoneSNLoadCoolRate; - } - - // Record temperature and load for individual zone - state.dataHeatBalMgr->TempZoneSecPrevDay(ZoneNum) = state.dataHeatBalMgr->TempZonePrevDay(ZoneNum); - state.dataHeatBalMgr->LoadZoneSecPrevDay(ZoneNum) = state.dataHeatBalMgr->LoadZonePrevDay(ZoneNum); - state.dataHeatBalMgr->TempZonePrevDay(ZoneNum) = state.dataHeatBalMgr->TempZone(ZoneNum); - state.dataHeatBalMgr->LoadZonePrevDay(ZoneNum) = state.dataHeatBalMgr->LoadZone(ZoneNum); - state.dataHeatBalMgr->TempZone(ZoneNum) = thisZoneHB.ZTAV; - state.dataHeatBalMgr->LoadZone(ZoneNum) = - max(thisZoneSysEnergyDemand.ZoneSNLoadHeatRate, std::abs(thisZoneSysEnergyDemand.ZoneSNLoadCoolRate)); - - // Calculate differences in temperature and load for the last two warmup days - if (!state.dataGlobal->WarmupFlag && state.dataGlobal->DayOfSim == 1 && - (!state.dataGlobal->DoingSizing || state.dataGlobal->DoPureLoadCalc)) { - state.dataHeatBalMgr->WarmupTempDiff(ZoneNum) = - std::abs(state.dataHeatBalMgr->TempZoneSecPrevDay(ZoneNum) - state.dataHeatBalMgr->TempZonePrevDay(ZoneNum)); - state.dataHeatBalMgr->WarmupLoadDiff(ZoneNum) = - std::abs(state.dataHeatBalMgr->LoadZoneSecPrevDay(ZoneNum) - state.dataHeatBalMgr->LoadZonePrevDay(ZoneNum)); - if (ZoneNum == 1) ++state.dataHeatBalMgr->CountWarmupDayPoints; - state.dataHeatBalMgr->TempZoneRpt(ZoneNum, state.dataHeatBalMgr->CountWarmupDayPoints) = - state.dataHeatBalMgr->WarmupTempDiff(ZoneNum); - state.dataHeatBalMgr->LoadZoneRpt(ZoneNum, state.dataHeatBalMgr->CountWarmupDayPoints) = - state.dataHeatBalMgr->WarmupLoadDiff(ZoneNum); - state.dataHeatBalMgr->MaxLoadZoneRpt(ZoneNum, state.dataHeatBalMgr->CountWarmupDayPoints) = state.dataHeatBalMgr->LoadZone(ZoneNum); - - if (state.dataSysVars->ReportDetailedWarmupConvergence) { // only do this detailed thing when requested by user is on - // Write Warmup Convergence Information to the initialization output file - if (state.dataHeatBalMgr->FirstWarmupWrite) { - constexpr const char *Format_732{"! ,Zone Name,Time Step,Hour of Day,Warmup Temperature " - "Difference {{deltaC}},Warmup Load Difference {{W}}\n"}; - print(state.files.eio, Format_732); - state.dataHeatBalMgr->FirstWarmupWrite = false; - } - constexpr const char *Format_731{" Warmup Convergence Information, {},{},{},{:.10R},{:.10R}\n"}; - print(state.files.eio, - Format_731, - state.dataHeatBal->Zone(ZoneNum).Name, - state.dataGlobal->TimeStep, - state.dataGlobal->HourOfDay, - state.dataHeatBalMgr->WarmupTempDiff(ZoneNum), - state.dataHeatBalMgr->WarmupLoadDiff(ZoneNum)); - } - } - } - - // Update interior movable insulation flag--needed at the end of a zone time step so that the interior radiant - // exchange algorithm knows whether there has been a change in interior movable insulation or not. - if (state.dataSurface->AnyMovableInsulation) { - for (int surfNum : state.dataHeatBalSurf->SurfMovInsulIndexList) { - state.dataHeatBalSurf->SurfMovInsulIntPresentPrevTS(surfNum) = state.dataHeatBalSurf->SurfMovInsulIntPresent(surfNum); - } - } - - // For non-complex windows, update a report variable so this shows up in the output as something other than zero - UpdateWindowFaceTempsNonBSDFWin(state); - } - - void CheckWarmupConvergence(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Rick Strand - // DATE WRITTEN April 1997 - // MODIFIED June 2011, Daeho Kang for individual zone comparison - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine checks warmup convergence values. - - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - - // Using/Aliasing - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - // na - - // SUBROUTINE PARAMETER DEFINITIONS: - Real64 constexpr MinLoad(100.0); // Minimum loads for convergence check - // To avoid big percentage difference in low load situations - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int ZoneNum; - bool ConvergenceChecksFailed; - - // Convergence criteria for warmup days: - // Perform another warmup day unless both the % change in loads and - // absolute change in zone temp min & max are less than their criteria. - - ConvergenceChecksFailed = false; - - if (state.dataGlobal->NumOfZones <= 0) { // if there are no zones, immediate convergence - state.dataGlobal->WarmupFlag = false; - } else { - for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxTempValue = - std::abs(state.dataHeatBalMgr->MaxTempPrevDay(ZoneNum) - state.dataHeatBalMgr->MaxTempZone(ZoneNum)); - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMinTempValue = - std::abs(state.dataHeatBalMgr->MinTempPrevDay(ZoneNum) - state.dataHeatBalMgr->MinTempZone(ZoneNum)); - if (state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxTempValue <= state.dataHeatBal->TempConvergTol) { - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(1) = 2; - } else { - ConvergenceChecksFailed = true; - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(1) = 1; - } - - if (state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMinTempValue <= state.dataHeatBal->TempConvergTol) { - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(2) = 2; - } else { - ConvergenceChecksFailed = true; - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(2) = 1; - } - - if (state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum) > 1.0e-4) { // make sure load big enough to divide - state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum) = std::abs(max(state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum), MinLoad)); - state.dataHeatBalMgr->MaxHeatLoadPrevDay(ZoneNum) = std::abs(max(state.dataHeatBalMgr->MaxHeatLoadPrevDay(ZoneNum), MinLoad)); - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxHeatLoadValue = - std::abs((state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum) - state.dataHeatBalMgr->MaxHeatLoadPrevDay(ZoneNum)) / - state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum)); - if (state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxHeatLoadValue <= state.dataHeatBal->LoadsConvergTol) { - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(3) = 2; - } else { - ConvergenceChecksFailed = true; - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(3) = 1; - } - } else { - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(3) = 2; - } - - if (state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum) > 1.0e-4) { - state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum) = std::abs(max(state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum), MinLoad)); - state.dataHeatBalMgr->MaxCoolLoadPrevDay(ZoneNum) = std::abs(max(state.dataHeatBalMgr->MaxCoolLoadPrevDay(ZoneNum), MinLoad)); - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxCoolLoadValue = - std::abs((state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum) - state.dataHeatBalMgr->MaxCoolLoadPrevDay(ZoneNum)) / - state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum)); - if (state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxCoolLoadValue <= state.dataHeatBal->LoadsConvergTol) { - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(4) = 2; - } else { - ConvergenceChecksFailed = true; - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(4) = 1; - } - } else { - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(4) = 2; - } - - if (state.dataGlobal->DayOfSim >= state.dataHeatBal->MaxNumberOfWarmupDays && state.dataGlobal->WarmupFlag) { - // Check convergence for individual zone - if (sum(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag) != 8) { // pass=2 * 4 values for convergence - ShowSevereError(state, - format("CheckWarmupConvergence: Loads Initialization, Zone=\"{}\" did not converge after {} warmup days.", - state.dataHeatBal->Zone(ZoneNum).Name, - state.dataHeatBal->MaxNumberOfWarmupDays)); - if (!state.dataHeatBalMgr->WarmupConvergenceWarning && !state.dataGlobal->DoingSizing) { - ShowContinueError(state, "See Warmup Convergence Information in .eio file for details."); - state.dataHeatBalMgr->WarmupConvergenceWarning = true; - } else if (!state.dataHeatBalMgr->SizingWarmupConvergenceWarning && state.dataGlobal->DoingSizing) { - ShowContinueError(state, "Warmup Convergence failing during sizing."); - state.dataHeatBalMgr->SizingWarmupConvergenceWarning = true; - } - if (state.dataEnvrn->RunPeriodEnvironment) { - ShowContinueError(state, "...Environment(RunPeriod)=\"" + state.dataEnvrn->EnvironmentName + "\""); - } else { - ShowContinueError(state, "...Environment(SizingPeriod)=\"" + state.dataEnvrn->EnvironmentName + "\""); - } - - ShowContinueError(state, - format("..Max Temp Comparison = {:.2R} vs Temperature Convergence Tolerance={:.2R} - {} Convergence", - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxTempValue, - state.dataHeatBal->TempConvergTol, - PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(1)))); - ShowContinueError(state, - format("..Min Temp Comparison = {:.2R} vs Temperature Convergence Tolerance={:.2R} - {} Convergence", - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMinTempValue, - state.dataHeatBal->TempConvergTol, - PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(2)))); - ShowContinueError(state, - format("..Max Heat Load Comparison = {:.4R} vs Loads Convergence Tolerance={:.2R} - {} Convergence", - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxHeatLoadValue, - state.dataHeatBal->LoadsConvergTol, - PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(3)))); - ShowContinueError(state, - format("..Max Cool Load Comparison = {:.4R} vs Loads Convergence Tolerance={:.2R} - {} Convergence", - state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).TestMaxCoolLoadValue, - state.dataHeatBal->LoadsConvergTol, - PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(4)))); - } - } - - // Transfer current daily max and min loads and temperatures to the - // variables containing the last day's values - state.dataHeatBalMgr->MaxHeatLoadPrevDay(ZoneNum) = state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum); - state.dataHeatBalMgr->MaxCoolLoadPrevDay(ZoneNum) = state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum); - state.dataHeatBalMgr->MaxTempPrevDay(ZoneNum) = state.dataHeatBalMgr->MaxTempZone(ZoneNum); - state.dataHeatBalMgr->MinTempPrevDay(ZoneNum) = state.dataHeatBalMgr->MinTempZone(ZoneNum); - - state.dataHeatBalMgr->MaxHeatLoadZone(ZoneNum) = -9999.0; - state.dataHeatBalMgr->MaxCoolLoadZone(ZoneNum) = -9999.0; - state.dataHeatBalMgr->MaxTempZone(ZoneNum) = -9999.0; - state.dataHeatBalMgr->MinTempZone(ZoneNum) = 1000.0; - } - - // Limit the number of warmup days, regardless of the number of zones - // in the building, to some arbitrary value based on common sense and - // experience with the (I)BLAST program. If too many warmup days were - // required, notify the program user. - - if ((state.dataGlobal->DayOfSim >= state.dataHeatBal->MaxNumberOfWarmupDays) && state.dataGlobal->WarmupFlag && ConvergenceChecksFailed) { - if (state.dataHeatBal->MaxNumberOfWarmupDays < DefaultMaxNumberOfWarmupDays) { - ShowSevereError(state, - format("CheckWarmupConvergence: User supplied maximum warmup days={} is insufficient.", - state.dataHeatBal->MaxNumberOfWarmupDays)); - ShowContinueError(state, format("Suggest setting maximum number of warmup days to at least {}.", DefaultMaxNumberOfWarmupDays)); - } - } - - // Set warmup flag to true depending on value of ConvergenceChecksFailed (true=fail) - // and minimum number of warmup days - if (!ConvergenceChecksFailed && state.dataGlobal->DayOfSim >= state.dataHeatBal->MinNumberOfWarmupDays) { - state.dataGlobal->WarmupFlag = false; - } else if (!ConvergenceChecksFailed && state.dataGlobal->DayOfSim < state.dataHeatBal->MinNumberOfWarmupDays) { - state.dataGlobal->WarmupFlag = true; - } - - // If max warmup days reached and still WarmupFlag, then go to non-warmup state. - // prior messages will have been displayed - if ((state.dataGlobal->DayOfSim >= state.dataHeatBal->MaxNumberOfWarmupDays) && state.dataGlobal->WarmupFlag) { - state.dataGlobal->WarmupFlag = false; - } - } - } - - void ReportWarmupConvergence(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN October 2011 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // na - - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - - // Using/Aliasing - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - // na - - // SUBROUTINE PARAMETER DEFINITIONS: - // na - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int ZoneNum; - Real64 AverageZoneTemp; - Real64 AverageZoneLoad; - Real64 StdDevZoneTemp; - Real64 StdDevZoneLoad; - std::string EnvHeader; - int Num; // loop control - - // Formats - constexpr const char *Format_730("! ,Zone Name,Environment Type/Name,Average Warmup Temperature Difference " - "{{deltaC}},Std Dev Warmup Temperature Difference {{deltaC}},Max Temperature Pass/Fail Convergence,Min " - "Temperature Pass/Fail Convergence,Average Warmup Load Difference {{W}},Std Dev Warmup Load Difference " - "{{W}},Heating Load Pass/Fail Convergence,Cooling Load Pass/Fail Convergence\n"); - - if (!state.dataGlobal->WarmupFlag) { // Report out average/std dev - // Write Warmup Convervence Information to the initialization output file - if (state.dataHeatBalMgr->ReportWarmupConvergenceFirstWarmupWrite && state.dataGlobal->NumOfZones > 0) { - print(state.files.eio, Format_730); - state.dataHeatBalMgr->ReportWarmupConvergenceFirstWarmupWrite = false; - } - - state.dataHeatBalMgr->TempZoneRptStdDev = 0.0; - state.dataHeatBalMgr->LoadZoneRptStdDev = 0.0; - - if (state.dataEnvrn->RunPeriodEnvironment) { - EnvHeader = "RunPeriod:"; - } else { - EnvHeader = "SizingPeriod:"; - } - - for (ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { - AverageZoneTemp = sum(state.dataHeatBalMgr->TempZoneRpt(ZoneNum, {1, state.dataHeatBalMgr->CountWarmupDayPoints})) / - double(state.dataHeatBalMgr->CountWarmupDayPoints); - for (Num = 1; Num <= state.dataHeatBalMgr->CountWarmupDayPoints; ++Num) { - if (state.dataHeatBalMgr->MaxLoadZoneRpt(ZoneNum, Num) > 1.e-4) { - state.dataHeatBalMgr->LoadZoneRpt(ZoneNum, Num) /= state.dataHeatBalMgr->MaxLoadZoneRpt(ZoneNum, Num); - } else { - state.dataHeatBalMgr->LoadZoneRpt(ZoneNum, Num) = 0.0; - } - } - AverageZoneLoad = sum(state.dataHeatBalMgr->LoadZoneRpt(ZoneNum, {1, state.dataHeatBalMgr->CountWarmupDayPoints})) / - double(state.dataHeatBalMgr->CountWarmupDayPoints); - StdDevZoneTemp = 0.0; - StdDevZoneLoad = 0.0; - for (Num = 1; Num <= state.dataHeatBalMgr->CountWarmupDayPoints; ++Num) { - state.dataHeatBalMgr->TempZoneRptStdDev(Num) = pow_2(state.dataHeatBalMgr->TempZoneRpt(ZoneNum, Num) - AverageZoneTemp); - state.dataHeatBalMgr->LoadZoneRptStdDev(Num) = pow_2(state.dataHeatBalMgr->LoadZoneRpt(ZoneNum, Num) - AverageZoneLoad); - } - StdDevZoneTemp = std::sqrt(sum(state.dataHeatBalMgr->TempZoneRptStdDev({1, state.dataHeatBalMgr->CountWarmupDayPoints})) / - double(state.dataHeatBalMgr->CountWarmupDayPoints)); - StdDevZoneLoad = std::sqrt(sum(state.dataHeatBalMgr->LoadZoneRptStdDev({1, state.dataHeatBalMgr->CountWarmupDayPoints})) / - double(state.dataHeatBalMgr->CountWarmupDayPoints)); - - constexpr const char *Format_731(" Warmup Convergence Information,{},{},{:.10R},{:.10R},{},{},{:.10R},{:.10R},{},{}\n"); - print(state.files.eio, - Format_731, - state.dataHeatBal->Zone(ZoneNum).Name, - EnvHeader + ' ' + state.dataEnvrn->EnvironmentName, - AverageZoneTemp, - StdDevZoneTemp, - PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(1)), - PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(2)), - AverageZoneLoad, - StdDevZoneLoad, - PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(3)), - PassFail(state.dataHeatBalMgr->WarmupConvergenceValues(ZoneNum).PassFlag(4))); - } - } - } - - void UpdateWindowFaceTempsNonBSDFWin(EnergyPlusData &state) - { - for (int SurfNum : state.dataSurface->AllHTWindowSurfaceList) { - auto &thisConstruction = state.dataConstruction->Construct(state.dataSurface->Surface(SurfNum).Construction); - if (thisConstruction.WindowTypeBSDF) continue; - state.dataHeatBal->SurfWinFenLaySurfTempFront(SurfNum, 1) = state.dataHeatBalSurf->SurfOutsideTempHist(1)(SurfNum); - state.dataHeatBal->SurfWinFenLaySurfTempBack(SurfNum, thisConstruction.TotLayers) = state.dataHeatBalSurf->SurfInsideTempHist(1)(SurfNum); - } - } - - // End of Record Keeping subroutines for the HB Module - // ***************************************************************************** - - // Beginning of Reporting subroutines for the HB Module - // ***************************************************************************** - - void ReportHeatBalance(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Rick Strand - // DATE WRITTEN July 1997 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine is the main driver for reporting within the heat - // balance. - - // METHODOLOGY EMPLOYED: - // Uses the status flags to trigger record keeping events. - - // REFERENCES: - // na - - // Using/Aliasing - using EconomicTariff::UpdateUtilityBills; // added for computing annual utility costs - using NodeInputManager::CalcMoreNodeInfo; - using OutputReportTabular::UpdateTabularReports; - using ScheduleManager::ReportScheduleValues; - - ReportScheduleValues(state); - - if (!state.dataGlobal->WarmupFlag && state.dataGlobal->DoOutputReporting) { - if (!state.dataGlobal->DoingSizing) { - CalcMoreNodeInfo(state); - } - UpdateDataandReport(state, OutputProcessor::TimeStepType::Zone); - if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeDesignDay || - state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeRunPeriodDesign) { - if (state.dataHVACSizingSimMgr->hvacSizingSimulationManager) - state.dataHVACSizingSimMgr->hvacSizingSimulationManager->UpdateSizingLogsZoneStep(state); - } - - UpdateTabularReports(state, OutputProcessor::TimeStepType::Zone); - UpdateUtilityBills(state); - } else if (!state.dataGlobal->KickOffSimulation && state.dataGlobal->DoOutputReporting && state.dataSysVars->ReportDuringWarmup) { - if (state.dataGlobal->BeginDayFlag && !state.dataEnvrn->PrintEnvrnStampWarmupPrinted) { - state.dataEnvrn->PrintEnvrnStampWarmup = true; - state.dataEnvrn->PrintEnvrnStampWarmupPrinted = true; - } - if (!state.dataGlobal->BeginDayFlag) state.dataEnvrn->PrintEnvrnStampWarmupPrinted = false; - if (state.dataEnvrn->PrintEnvrnStampWarmup) { - if (state.dataReportFlag->PrintEndDataDictionary && state.dataGlobal->DoOutputReporting) { - constexpr const char *EndOfHeaderString("End of Data Dictionary"); // End of data dictionary marker - print(state.files.eso, "{}\n", EndOfHeaderString); - print(state.files.mtr, "{}\n", EndOfHeaderString); - state.dataReportFlag->PrintEndDataDictionary = false; - } - if (state.dataGlobal->DoOutputReporting) { - constexpr const char *EnvironmentStampFormatStr("{},{},{:7.2F},{:7.2F},{:7.2F},{:7.2F}\n"); // Format descriptor for environ stamp - print(state.files.eso, - EnvironmentStampFormatStr, - "1", - "Warmup {" + state.dataReportFlag->cWarmupDay + "} " + state.dataEnvrn->EnvironmentName, - state.dataEnvrn->Latitude, - state.dataEnvrn->Longitude, - state.dataEnvrn->TimeZoneNumber, - state.dataEnvrn->Elevation); - - print(state.files.mtr, - EnvironmentStampFormatStr, - "1", - "Warmup {" + state.dataReportFlag->cWarmupDay + "} " + state.dataEnvrn->EnvironmentName, - state.dataEnvrn->Latitude, - state.dataEnvrn->Longitude, - state.dataEnvrn->TimeZoneNumber, - state.dataEnvrn->Elevation); - state.dataEnvrn->PrintEnvrnStampWarmup = false; - } - } - if (!state.dataGlobal->DoingSizing) { - CalcMoreNodeInfo(state); - } - UpdateDataandReport(state, OutputProcessor::TimeStepType::Zone); - if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeDesignDay || - state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeRunPeriodDesign) { - if (state.dataHVACSizingSimMgr->hvacSizingSimulationManager) - state.dataHVACSizingSimMgr->hvacSizingSimulationManager->UpdateSizingLogsZoneStep(state); - } - - } else if (state.dataSysVars->UpdateDataDuringWarmupExternalInterface) { // added for FMI - UpdateDataandReport(state, OutputProcessor::TimeStepType::Zone); - if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeDesignDay || - state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeRunPeriodDesign) { - if (state.dataHVACSizingSimMgr->hvacSizingSimulationManager) - state.dataHVACSizingSimMgr->hvacSizingSimulationManager->UpdateSizingLogsZoneStep(state); - } - } - // There is no hourly reporting in the heat balance. - - // There is no daily reporting in the heat balance. - - // There is no simulation level record keeping in the heat balance. - } - - // End of Reporting subroutines for the HB Module - - void OpenShadingFile(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR X Luo - // DATE WRITTEN August 2017 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // Open and set up headers for a external shading fraction export file. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int SurfNum; - - state.files.shade.ensure_open(state, "OpenOutputFiles", state.files.outputControl.extshd); - print(state.files.shade, "Surface Name,"); - for (SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) { - print(state.files.shade, "{},", state.dataSurface->Surface(SurfNum).Name); - } - print(state.files.shade, "()\n"); - } - void GetFrameAndDividerData(EnergyPlusData &state, bool &ErrorsFound) // set to true if errors found in input - { - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Winkelmann - // DATE WRITTEN May 2000 - // MODIFIED April 2002 (FCW): get window reveal data - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // Gets input data for window frame and/or divider and/or window - // inside/outside reveal. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - - int IOStat; // IO Status when calling get input subroutine - Array1D_string FrameDividerAlphas(3); // Frame/Divider Alpha names - int FrameDividerNum; // Counter to keep track of the frame/divider number - int FrameDividerNumAlpha; // Number of frame/divider alpha names being passed - int FrameDividerNumProp; // Number of frame/divider properties being passed - Array1D FrameDividerProps(23); // Temporary array to transfer frame/divider properties - int Loop; - - constexpr std::array(DataSurfaces::NfrcProductOptions::Num)> NfrcProductNamesUC = { - "CASEMENTDOUBLE", "CASEMENTSINGLE", "DUALACTION", - "FIXED", "GARAGE", "GREENHOUSE", - "HINGEDESCAPE", "HORIZONTALSLIDER", "JAL", - "PIVOTED", "PROJECTINGSINGLE", "PROJECTINGDUAL", - "DOORSIDELITE", "SKYLIGHT", "SLIDINGPATIODOOR", - "CURTAINWALL", "SPANDRELPANEL", "SIDEHINGEDDOOR", - "DOORTRANSOM", "TROPICALAWNING", "TUBULARDAYLIGHTINGDEVICE", - "VERTICALSLIDER"}; - - constexpr std::array(DataSurfaces::FrameDividerType::Num)> FrameDividerTypeNamesUC = { - "DIVIDEDLITE", // 0 - "SUSPENDED" // 1 - }; - - state.dataHeatBalMgr->CurrentModuleObject = "WindowProperty:FrameAndDivider"; - state.dataHeatBal->TotFrameDivider = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); - state.dataSurface->FrameDivider.allocate(state.dataHeatBal->TotFrameDivider); - if (state.dataHeatBal->TotFrameDivider == 0) return; - - FrameDividerNum = 0; - - for (Loop = 1; Loop <= state.dataHeatBal->TotFrameDivider; ++Loop) { - - // Call Input Get routine to retrieve frame/divider data - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - FrameDividerAlphas, - FrameDividerNumAlpha, - FrameDividerProps, - FrameDividerNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (UtilityRoutines::IsNameEmpty(state, FrameDividerAlphas(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) continue; - - // Load the frame/divider derived type from the input data. - ++FrameDividerNum; - auto &frameDivider = state.dataSurface->FrameDivider(FrameDividerNum); - frameDivider.Name = FrameDividerAlphas(1); - frameDivider.FrameWidth = FrameDividerProps(1); - frameDivider.FrameProjectionOut = FrameDividerProps(2); - frameDivider.FrameProjectionIn = FrameDividerProps(3); - if (frameDivider.FrameWidth == 0.0) { - frameDivider.FrameProjectionOut = 0.0; - frameDivider.FrameProjectionIn = 0.0; - } - frameDivider.FrameConductance = FrameDividerProps(4); - frameDivider.FrEdgeToCenterGlCondRatio = FrameDividerProps(5); - frameDivider.FrameSolAbsorp = FrameDividerProps(6); - frameDivider.FrameVisAbsorp = FrameDividerProps(7); - frameDivider.FrameEmis = FrameDividerProps(8); - - DataSurfaces::FrameDividerType currentDividerType = - DataSurfaces::FrameDividerType(getEnumerationValue(FrameDividerTypeNamesUC, FrameDividerAlphas(2))); - if (currentDividerType == DataSurfaces::FrameDividerType::Invalid) { - ShowWarningError(state, - fmt::format("{}={}, Invalid {}", - state.dataHeatBalMgr->CurrentModuleObject, - std::quoted(FrameDividerAlphas(1)), - state.dataIPShortCut->cAlphaFieldNames(2))); - ShowContinueError( - state, - fmt::format("Entered={}, must be DividedLite or Suspended. Will be set to DividedLite.", std::quoted(FrameDividerAlphas(2)))); - frameDivider.DividerType = DataSurfaces::FrameDividerType::DividedLite; - } else { - frameDivider.DividerType = currentDividerType; - } - - frameDivider.DividerWidth = FrameDividerProps(9); - frameDivider.HorDividers = FrameDividerProps(10); - frameDivider.VertDividers = FrameDividerProps(11); - frameDivider.DividerProjectionOut = FrameDividerProps(12); - frameDivider.DividerProjectionIn = FrameDividerProps(13); - if (frameDivider.DividerWidth == 0.0 || frameDivider.DividerType == DataSurfaces::FrameDividerType::Suspended) { - frameDivider.DividerProjectionOut = 0.0; - frameDivider.DividerProjectionIn = 0.0; - } - frameDivider.DividerConductance = FrameDividerProps(14); - frameDivider.DivEdgeToCenterGlCondRatio = FrameDividerProps(15); - frameDivider.DividerSolAbsorp = FrameDividerProps(16); - frameDivider.DividerVisAbsorp = FrameDividerProps(17); - frameDivider.DividerEmis = FrameDividerProps(18); - - // look up the NFRC Product Type for Assembly Calculations using the DataSurfaces::NfrcProductName - frameDivider.NfrcProductType = DataSurfaces::NfrcProductOptions(getEnumerationValue(NfrcProductNamesUC, FrameDividerAlphas(3))); - if (frameDivider.NfrcProductType == DataSurfaces::NfrcProductOptions::Invalid) { - frameDivider.NfrcProductType = DataSurfaces::NfrcProductOptions::CurtainWall; - } - - frameDivider.OutsideRevealSolAbs = FrameDividerProps(19); - frameDivider.InsideSillDepth = FrameDividerProps(20); - frameDivider.InsideSillSolAbs = FrameDividerProps(21); - frameDivider.InsideReveal = FrameDividerProps(22); - frameDivider.InsideRevealSolAbs = FrameDividerProps(23); - - if (frameDivider.DividerWidth > 0.0 && (frameDivider.HorDividers == 0 && frameDivider.VertDividers == 0)) { - ShowWarningError(state, - state.dataHeatBalMgr->CurrentModuleObject + ": In FrameAndDivider " + frameDivider.Name + ' ' + - state.dataIPShortCut->cNumericFieldNames(9) + " > 0 "); - ShowContinueError(state, - "...but " + state.dataIPShortCut->cNumericFieldNames(10) + " = 0 and " + - state.dataIPShortCut->cNumericFieldNames(11) + " = 0."); - ShowContinueError(state, "..." + state.dataIPShortCut->cNumericFieldNames(9) + " set to 0."); - frameDivider.DividerWidth = 0.0; - } - // Prevent InsideSillDepth < InsideReveal - if (frameDivider.InsideSillDepth < state.dataSurface->FrameDivider(FrameDividerNum).InsideReveal) { - ShowWarningError(state, - state.dataHeatBalMgr->CurrentModuleObject + ": In FrameAndDivider " + frameDivider.Name + ' ' + - state.dataIPShortCut->cNumericFieldNames(20) + " is less than " + state.dataIPShortCut->cNumericFieldNames(22) + - "; it will be set to " + state.dataIPShortCut->cNumericFieldNames(22) + '.'); - frameDivider.InsideSillDepth = state.dataSurface->FrameDivider(FrameDividerNum).InsideReveal; - } - - // ! Warn if InsideSillDepth OR InsideReveal > 0.2meters to warn of inaccuracies - // IF(FrameDivider(FrameDividerNum)%InsideSillDepth > 0.2d0) THEN - // CALL ShowWarningError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//': In FrameAndDivider - // '//TRIM(FrameDivider(FrameDividerNum)%Name)// & - // ' '//TRIM(cNumericFieldNames(20))//' is greater than 0.2 meters, which could cause inaccuracies in zone cooling energy.') - // END IF - // IF(FrameDivider(FrameDividerNum)%InsideReveal > 0.2d0) THEN - // CALL ShowWarningError(state, TRIM(state.dataHeatBalMgr->CurrentModuleObject)//': In FrameAndDivider - // '//TRIM(FrameDivider(FrameDividerNum)%Name)// & - // ' '//TRIM(cNumericFieldNames(22))//' is greater than 0.2 meters, which could cause inaccuracies in zone cooling energy.') - // END IF - } - } - - void SearchWindow5DataFile(EnergyPlusData &state, - fs::path const &DesiredFilePath, // File path that contains the Window5 constructions. - std::string const &DesiredConstructionName, // Name that will be searched for in the Window5 data file - bool &ConstructionFound, // True if DesiredConstructionName is in the Window5 data file - bool &EOFonFile, // True if EOF during file read - bool &ErrorsFound // True if there is a problem with the entry requested from the data file - ) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Winkelmann - // DATE WRITTEN August 2001 - // MODIFIED June 2002, FW: do all reallocation here for constructions found on - // data file; 1 new construction of entry has one glazing system; - // 2 new constructions if entry has two glazing systems. - // Nov 2002, FW: skip read of mullion data line if one glazing system; - // add error messages for bad data; increase length of input line - // from 132 to 200 to handle case where Window5 puts in extra blanks - // in gas data line. - // Feb 2007, LKL: Add more checks on Window5DataFile - // Jan 2008, LKL: Change Edge/Cond ratio check. - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // Searches the WINDOW5 data file for a window with the name "DesiredConstructionName," - // which is the name of an idf Construction input using CONSTRUCTION FROM WINDOW5 DATA FILE. - // (The WINDOW5 data file contains data for one or more complete windows -- - // glazing, frame, mullion, and divider. - // WINDOW5 writes the data file for export to EnergyPlus so that an annual energy - // analysis can be done on exactly the same window without having to re-input into - // EnergyPlus.) - - // If a match is found, a Construction is created and the Material objects associated with - // the Construction are created. If there is an associated frame or - // divider in the Window5 data file for this Construction, a FrameAndDivider object will - // also be created. - - // If the window on the data file has two glazing systems, a second Construction (and its - // associated materials) corresponding to the second glazing system is created. - - // Using/Aliasing - using namespace DataStringGlobals; - using DataSystemVariables::CheckForActualFilePath; - using General::POLYF; // POLYF ! Polynomial in cosine of angle of incidence - - // SUBROUTINE PARAMETER DEFINITIONS: - Array1D_string const NumName(5, {"1", "2", "3", "4", "5"}); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int FileLineCount; // counter for number of lines read (used in some error messages) - Array1D_string DataLine(100); // Array of data lines - std::string WindowNameInW5DataFile; - std::string W5Name; - Array1D_string GasName(3); // Gas name from data file - std::string LayerName; // Layer name from data file - std::string MullionOrientation; // Horizontal, vertical or none - int LineNum; - Array1D_int NGlass(2); // Number of glass layers in glazing system - Array2D_int NumGases(4, 2); // Number of gases in each gap of a glazing system - Array2D_int MaterNumSysGlass(5, 2); // Material numbers for glazing system / glass combinations - Array2D_int MaterNumSysGap(4, 2); // Material numbers for glazing system / gap combinations - int TotMaterialsPrev; // Number of materials before adding ones from W5DataFile - int TotFrameDividerPrev; // Number of FrameAndDivider objects before adding ones from W5DataFile - Array1D_int NGaps(2); // Number of gaps in window construction - int NGlSys; // Number of glazing systems (normally 1, but 2 for mullioned window - // with two different glazing systems - int loop; // DO loop counter - int ILine; // Line counter - int ConstrNum; // Construction number - int IGlass; // Glass layer counter - int IGap; // Gap counter - int IGas; // Gas counter - // INTEGER :: ICoeff ! Gas property coefficient counter - int IGlSys; // Glazing system counter - int MaterNum; // Material number - int MatNum; - int FrDivNum; // FrameDivider number - Array1D WinHeight(2); // Height, width for glazing system (m) - Array1D WinWidth(2); - Array1D UValCenter(2); // Center of glass U-value (W/m2-K) for glazing system - Array1D SCCenter(2); // Center of glass shading coefficient for glazing system - Array1D SHGCCenter(2); // Center of glass solar heat gain coefficient for glazing system - Array1D TVisCenter(2); // Center of glass visible transmittance for glazing system - Array1D Tsol(11); // Solar transmittance vs incidence angle; diffuse trans. - Array2D AbsSol(11, 5); // Solar absorptance vs inc. angle in each glass layer - Array1D Rfsol(11); // Front solar reflectance vs inc. angle - Array1D Rbsol(11); // Back solar reflectance vs inc. angle - Array1D Tvis(11); // Visible transmittance vs inc. angle - Array1D Rfvis(11); // Front visible reflectance vs inc. angle - Array1D Rbvis(11); // Back visible reflectance vs inc. angle - Array1D CosPhiIndepVar(10); // Cosine of incidence angle from 0 to 90 deg in 10 deg increments - int IPhi; // Incidence angle counter - Real64 Phi; // Incidence angle (deg) - Array1D CosPhi(10); // Cosine of incidence angle - Array1D tsolFit(10); // Fitted solar transmittance vs incidence angle - Array1D tvisFit(10); // Fitted visible transmittance vs incidence angle - Array1D rfsolFit(10); // Fitted solar front reflectance vs incidence angle - Array2D solabsFit(5, 10); // Fitted solar absorptance vs incidence angle for each glass layer - Array1D_string DividerType(2); // Divider type: DividedLite or Suspended - Real64 FrameWidth; - Real64 MullionWidth; - Real64 FrameProjectionOut; - Real64 FrameProjectionIn; - Real64 FrameConductance; - Real64 FrEdgeToCenterGlCondRatio; - Real64 FrameSolAbsorp; - Real64 FrameVisAbsorp; - Real64 FrameEmis; - Array1D_int HorDividers(2); // For divider: number horizontal for each glazing system - Array1D_int VertDividers(2); // For divider: number vertical for each glazing system - Array1D DividerWidth(2); - Array1D DividerProjectionOut(2); - Array1D DividerProjectionIn(2); - Array1D DividerConductance(2); - Array1D DivEdgeToCenterGlCondRatio(2); - Array1D DividerSolAbsorp(2); - Array1D DividerVisAbsorp(2); - Array1D DividerEmis(2); - std::string::size_type endcol; - - // Object Data - - // In the following four gas-related data sets, the first - // index is gas type (1=air, 2=Argon, 3=Krypton, 4=Xenon) - // and the second index gives a,b,c in the expression - // property value = a + bT(K) + cT(K)**2, where T is mean - // gap temperature in deg K. - - ConstructionFound = false; - // ErrorsFound = .FALSE. - EOFonFile = false; - std::string contextString = "HeatBalanceManager::SearchWindow5DataFile: "; - - state.files.TempFullFilePath.filePath = CheckForActualFilePath(state, DesiredFilePath, contextString); - - // INQUIRE(FILE=TRIM(DesiredFileName), EXIST=exists) - if (state.files.TempFullFilePath.filePath.empty()) { - ShowFatalError(state, "Program terminates due to these conditions."); - } - - auto W5DataFile = state.files.TempFullFilePath.open(state, "SearchWindow5DataFile"); - auto NextLine = W5DataFile.readLine(); - endcol = len(NextLine.data); - if (endcol > 0) { - if (int(NextLine.data[endcol - 1]) == DataSystemVariables::iUnicode_end) { - ShowSevereError(state, - "SearchWindow5DataFile: For \"" + DesiredConstructionName + "\" in " + DesiredFilePath.string() + - " fiile, appears to be a Unicode or binary file."); - ShowContinueError(state, "...This file cannot be read by this program. Please save as PC or Unix file and try again"); - ShowFatalError(state, "Program terminates due to previous condition."); - } - } - W5DataFile.rewind(); - FileLineCount = 0; - - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - if (!has_prefixi(NextLine.data, "WINDOW5")) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Data File=" + DesiredFilePath.string()); - ShowFatalError( - state, "Error reading Window5 Data File: first word of window entry is \"" + NextLine.data.substr(0, 7) + "\", should be Window5."); - } - - Label10:; - for (LineNum = 2; LineNum <= 5; ++LineNum) { - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - DataLine(LineNum) = NextLine.data; - ++FileLineCount; - } - - // Get window name and check for match - W5Name = std::string{DataLine(4).substr(19)}; - WindowNameInW5DataFile = UtilityRoutines::MakeUPPERCase(W5Name); - if (DesiredConstructionName != WindowNameInW5DataFile) { - // Doesn't match; read through file until next window entry is found - Label20:; - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - if (!has_prefixi(NextLine.data, "WINDOW5")) goto Label20; - // Beginning of next window entry found - goto Label10; - } else { - // Match found - ConstructionFound = true; - - // Create Material:WindowGlass, Material:WindowGas, Construction - // and WindowFrameAndDividerObjects for this window - - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - bool error = false; - NGlSys = static_cast(UtilityRoutines::ProcessNumber(NextLine.data.substr(19), error)); - if (NGlSys <= 0 || NGlSys > 2 || error) { - ShowFatalError( - state, - format("Construction={} from the Window5 data file cannot be used: it has {} glazing systems; only 1 or 2 are allowed.", - DesiredConstructionName, - NGlSys)); - } - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - - const auto succeeded = readList(NextLine.data.substr(19), - WinHeight(IGlSys), - WinWidth(IGlSys), - NGlass(IGlSys), - UValCenter(IGlSys), - SCCenter(IGlSys), - SHGCCenter(IGlSys), - TVisCenter(IGlSys)); - if (!succeeded) { - ShowSevereError( - state, - format("HeatBalanceManager: SearchWindow5DataFile: Error in Read of glazing system values. For glazing system={}", IGlSys)); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount, NextLine.data.substr(0, 100))); - ErrorsFound = true; - } - if (WinHeight(IGlSys) == 0.0 || WinWidth(IGlSys) == 0.0) { - ShowSevereError(state, - format("HeatBalanceManager: SearchWindow5DataFile: Construction={} from the Window5 data file cannot be used: it " - "has window height or width = 0 for glazing system {}", - DesiredConstructionName, - IGlSys)); - ErrorsFound = true; - } - if (NGlass(IGlSys) <= 0 || NGlass(IGlSys) > 4) { - ShowSevereError(state, - format("HeatBalanceManager: SearchWindow5DataFile: Construction={} from the Window5 data file cannot be used: it " - "has 0 or more than 4 glass layers in glazing system {}", - DesiredConstructionName, - IGlSys)); - ErrorsFound = true; - } - if (UValCenter(IGlSys) <= 0.0) { - ShowSevereError(state, - format("HeatBalanceManager: SearchWindow5DataFile: Construction={} from the Window5 data file cannot be used: it " - "has Center-of-Glass U-value <= 0 in glazing system {}", - DesiredConstructionName, - IGlSys)); - ErrorsFound = true; - } - if (SCCenter(IGlSys) <= 0.0) { - ShowWarningError( - state, - format("HeatBalanceManager: SearchWindow5DataFile: Construction={} from the Window5 data file has flawed data: it " - "has a Shading Coefficient <= 0 in glazing system {}", - DesiredConstructionName, - IGlSys)); - } - if (SHGCCenter(IGlSys) <= 0.0) { - ShowWarningError( - state, - format("HeatBalanceManager: SearchWindow5DataFile: Construction={} from the Window5 data file has flawed data: it " - "has a SHGC <= 0 in glazing system {}", - DesiredConstructionName, - IGlSys)); - } - WinHeight(IGlSys) *= 0.001; - WinWidth(IGlSys) *= 0.001; - } - for (LineNum = 1; LineNum <= 11; ++LineNum) { - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - DataLine(LineNum) = NextLine.data; - } - - // Mullion width and orientation - MullionWidth = 0.0; - MullionOrientation = "Vertical"; - if (NGlSys == 2) { - error = false; - MullionWidth = UtilityRoutines::ProcessNumber(DataLine(10).substr(19), error); - if (error) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Mullion Width."); - ShowContinueError(state, - format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 10, DataLine(10).substr(0, 100))); - ErrorsFound = true; - } - MullionWidth *= 0.001; - MullionOrientation = UtilityRoutines::ProcessNumber(DataLine(10).substr(88), error); - if (error) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Mullion Orientation."); - ShowContinueError(state, - format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 10, DataLine(10).substr(0, 100))); - ErrorsFound = true; - } - } - - // Frame data; if there are two glazing systems, the frame is assumed to be - // the same for both. - FrameWidth = 0.0; - FrameProjectionOut = 0.0; - FrameProjectionIn = 0.0; - FrameConductance = 0.0; - FrEdgeToCenterGlCondRatio = 0.0; - FrameSolAbsorp = 0.0; - FrameVisAbsorp = 0.0; - FrameEmis = 0.0; - const bool succeeded = readList(DataLine(11).substr(19), - FrameWidth, - FrameProjectionOut, - FrameProjectionIn, - FrameConductance, - FrEdgeToCenterGlCondRatio, - FrameSolAbsorp, - FrameVisAbsorp, - FrameEmis); - if (!succeeded) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of frame data values."); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 11, DataLine(11).substr(0, 100))); - ErrorsFound = true; - } - if (FrameWidth > 0.0) { - if (FrameConductance <= 0.0) { - ShowSevereError(state, - "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + - " from the Window5 data file cannot be used: it has Frame Conductance <= 0.0"); - ErrorsFound = true; - } - // Relax this check for Window5 data: 1/28/2008. - // IF(FrEdgeToCenterGlCondRatio < 1.0) THEN - // CALL ShowSevereError(state, 'HeatBalanceManager: SearchWindow5DataFile: Construction='//TRIM(DesiredConstructionName)// - // & ' from the Window5 data file cannot be used: it has Frame Edge-of-Glass Conduction Ratio < 1.0') - // ErrorsFound = .TRUE. - // END IF - if (FrameSolAbsorp < 0.0 || FrameSolAbsorp > 1.0) { - ShowSevereError(state, - "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + - " from the Window5 data file cannot be used: it has Frame Solar Absorptance < 0.0 or > 1.0"); - ErrorsFound = true; - } - if (FrameEmis <= 0.0 || FrameEmis >= 1.0) { - ShowSevereError(state, - "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + - " from the Window5 data file cannot be used: it has Frame Emissivity <= 0.0 or >= 1.0"); - ErrorsFound = true; - } - } - FrameWidth *= 0.001; - FrameProjectionOut *= 0.001; - FrameProjectionIn *= 0.001; - FileLineCount += 11; - - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - - // Divider data for each glazing system - for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - - const bool dividerReadSucceeded = readList(NextLine.data.substr(19), - DividerWidth(IGlSys), - DividerProjectionOut(IGlSys), - DividerProjectionIn(IGlSys), - DividerConductance(IGlSys), - DivEdgeToCenterGlCondRatio(IGlSys), - DividerSolAbsorp(IGlSys), - DividerVisAbsorp(IGlSys), - DividerEmis(IGlSys), - DividerType(IGlSys), - HorDividers(IGlSys), - VertDividers(IGlSys)); - if (!dividerReadSucceeded) { - ShowSevereError( - state, - format("HeatBalanceManager: SearchWindow5DataFile: Error in Read of divider data values. For Glazing System={}", IGlSys)); - ShowContinueError(state, - format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 11, NextLine.data.substr(0, 100))); - ErrorsFound = true; - } - uppercase(DividerType(IGlSys)); - if (DividerWidth(IGlSys) > 0.0) { - if (HorDividers(IGlSys) == 0 && VertDividers(IGlSys) == 0) { - ShowSevereError(state, - "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + - " from the Window5 data file cannot be used:"); - ShowContinueError( - state, format("glazing system {} has a divider but number of horizontal and vertical divider elements = 0", IGlSys)); - ErrorsFound = true; - } - if (DividerConductance(IGlSys) <= 0.0) { - ShowSevereError(state, - "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + - " from the Window5 data file cannot be used:"); - ShowContinueError(state, format("glazing system {} has Divider Conductance <= 0.0", IGlSys)); - ErrorsFound = true; - } - if (DivEdgeToCenterGlCondRatio(IGlSys) < 1.0) { - ShowSevereError(state, - "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + - " from the Window5 data file cannot be used:"); - ShowContinueError(state, format("glazing system {} has Divider Edge-Of-Glass Conduction Ratio < 1.0", IGlSys)); - ErrorsFound = true; - } - if (DividerSolAbsorp(IGlSys) < 0.0 || DividerSolAbsorp(IGlSys) > 1.0) { - ShowSevereError(state, - "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + - " from the Window5 data file cannot be used:"); - ShowContinueError(state, format("glazing system {} has Divider Solar Absorptance < 0.0 or > 1.0", IGlSys)); - ErrorsFound = true; - } - if (DividerEmis(IGlSys) <= 0.0 || DividerEmis(IGlSys) >= 1.0) { - ShowSevereError(state, - "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + - " from the Window5 data file cannot be used:"); - ShowContinueError(state, format("glazing system {} has Divider Emissivity <= 0.0 or >= 1.0", IGlSys)); - ErrorsFound = true; - } - if (DividerType(IGlSys) != "DIVIDEDLITE" && DividerType(IGlSys) != "SUSPENDED") { - ShowSevereError(state, - "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + - " from the Window5 data file cannot be used:"); - ShowContinueError( - state, - format("glazing system {} has Divider Type = {}; it should be DIVIDEDLITE or SUSPENDED.", IGlSys, DividerType(IGlSys))); - ErrorsFound = true; - } - } - DividerWidth(IGlSys) *= 0.001; - if (DividerType(IGlSys) == "DIVIDEDLITE") { - DividerProjectionOut(IGlSys) *= 0.001; - DividerProjectionIn(IGlSys) *= 0.001; - } else { - DividerProjectionOut(IGlSys) = 0.0; - DividerProjectionIn(IGlSys) = 0.0; - } - } - - if (ErrorsFound) - ShowFatalError(state, - "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + - " from the Window5 data file cannot be used because of above errors"); - - TotMaterialsPrev = state.dataHeatBal->TotMaterials; - for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { - NGaps(IGlSys) = NGlass(IGlSys) - 1; - state.dataHeatBal->TotMaterials += NGlass(IGlSys) + NGaps(IGlSys); - } - - // Create Material objects - - // reallocate Material type - - state.dataMaterial->Material.redimension(state.dataHeatBal->TotMaterials); - state.dataHeatBal->NominalR.redimension(state.dataHeatBal->TotMaterials, 0.0); - - // Initialize new materials - for (loop = TotMaterialsPrev + 1; loop <= state.dataHeatBal->TotMaterials; ++loop) { - state.dataMaterial->Material(loop).Name = ""; - state.dataMaterial->Material(loop).Group = DataHeatBalance::MaterialGroup::Invalid; - state.dataMaterial->Material(loop).Roughness = DataSurfaces::SurfaceRoughness::Invalid; - state.dataMaterial->Material(loop).Conductivity = 0.0; - state.dataMaterial->Material(loop).Density = 0.0; - state.dataMaterial->Material(loop).IsoMoistCap = 0.0; - state.dataMaterial->Material(loop).Porosity = 0.0; - state.dataMaterial->Material(loop).Resistance = 0.0; - state.dataMaterial->Material(loop).SpecHeat = 0.0; - state.dataMaterial->Material(loop).ThermGradCoef = 0.0; - state.dataMaterial->Material(loop).Thickness = 0.0; - state.dataMaterial->Material(loop).VaporDiffus = 0.0; - state.dataMaterial->Material(loop).AbsorpSolar = 0.0; - state.dataMaterial->Material(loop).AbsorpThermal = 0.0; - state.dataMaterial->Material(loop).AbsorpVisible = 0.0; - state.dataMaterial->Material(loop).ReflectShade = 0.0; - state.dataMaterial->Material(loop).Trans = 0.0; - state.dataMaterial->Material(loop).ReflectShadeVis = 0.0; - state.dataMaterial->Material(loop).TransVis = 0.0; - state.dataMaterial->Material(loop).GlassTransDirtFactor = 1.0; - state.dataMaterial->Material(loop).SolarDiffusing = false; - state.dataMaterial->Material(loop).AbsorpThermalBack = 0.0; - state.dataMaterial->Material(loop).AbsorpThermalFront = 0.0; - state.dataMaterial->Material(loop).ReflectSolBeamBack = 0.0; - state.dataMaterial->Material(loop).ReflectSolBeamFront = 0.0; - state.dataMaterial->Material(loop).ReflectSolDiffBack = 0.0; - state.dataMaterial->Material(loop).ReflectSolDiffFront = 0.0; - state.dataMaterial->Material(loop).ReflectVisBeamBack = 0.0; - state.dataMaterial->Material(loop).ReflectVisBeamFront = 0.0; - state.dataMaterial->Material(loop).ReflectVisDiffBack = 0.0; - state.dataMaterial->Material(loop).ReflectVisDiffFront = 0.0; - state.dataMaterial->Material(loop).TransSolBeam = 0.0; - state.dataMaterial->Material(loop).TransThermal = 0.0; - state.dataMaterial->Material(loop).TransVisBeam = 0.0; - state.dataMaterial->Material(loop).GlassSpectralDataPtr = 0; - state.dataMaterial->Material(loop).NumberOfGasesInMixture = 0; - state.dataMaterial->Material(loop).GasCon = 0.0; - state.dataMaterial->Material(loop).GasVis = 0.0; - state.dataMaterial->Material(loop).GasCp = 0.0; - state.dataMaterial->Material(loop).GasType = 0; - state.dataMaterial->Material(loop).GasWght = 0.0; - state.dataMaterial->Material(loop).GasSpecHeatRatio = 0.0; - state.dataMaterial->Material(loop).GasFract = 0.0; - state.dataMaterial->Material(loop).WinShadeToGlassDist = 0.0; - state.dataMaterial->Material(loop).WinShadeTopOpeningMult = 0.0; - state.dataMaterial->Material(loop).WinShadeBottomOpeningMult = 0.0; - state.dataMaterial->Material(loop).WinShadeLeftOpeningMult = 0.0; - state.dataMaterial->Material(loop).WinShadeRightOpeningMult = 0.0; - state.dataMaterial->Material(loop).WinShadeAirFlowPermeability = 0.0; - state.dataMaterial->Material(loop).BlindDataPtr = 0; - state.dataMaterial->Material(loop).EMPDmu = 0.0; - state.dataMaterial->Material(loop).MoistACoeff = 0.0; - state.dataMaterial->Material(loop).MoistBCoeff = 0.0; - state.dataMaterial->Material(loop).MoistCCoeff = 0.0; - state.dataMaterial->Material(loop).MoistDCoeff = 0.0; - state.dataMaterial->Material(loop).EMPDSurfaceDepth = 0.0; - state.dataMaterial->Material(loop).EMPDDeepDepth = 0.0; - state.dataMaterial->Material(loop).EMPDmuCoating = 0.0; - state.dataMaterial->Material(loop).EMPDCoatingThickness = 0.0; - } - - // Glass objects - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - MaterNum = TotMaterialsPrev; - for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { - for (IGlass = 1; IGlass <= NGlass(IGlSys); ++IGlass) { - ++MaterNum; - MaterNumSysGlass(IGlass, IGlSys) = MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGlass; - NextLine = W5DataFile.readLine(); - ++FileLineCount; - - readList(NextLine.data.substr(25), - state.dataMaterial->Material(MaterNum).Thickness, - state.dataMaterial->Material(MaterNum).Conductivity, - state.dataMaterial->Material(MaterNum).Trans, - state.dataMaterial->Material(MaterNum).ReflectSolBeamFront, - state.dataMaterial->Material(MaterNum).ReflectSolBeamBack, - state.dataMaterial->Material(MaterNum).TransVis, - state.dataMaterial->Material(MaterNum).ReflectVisBeamFront, - state.dataMaterial->Material(MaterNum).ReflectVisBeamBack, - state.dataMaterial->Material(MaterNum).TransThermal, - state.dataMaterial->Material(MaterNum).AbsorpThermalFront, - state.dataMaterial->Material(MaterNum).AbsorpThermalBack, - LayerName); - - state.dataMaterial->Material(MaterNum).Thickness *= 0.001; - if (state.dataMaterial->Material(MaterNum).Thickness <= 0.0) { - } - if (NGlSys == 1) { - state.dataMaterial->Material(MaterNum).Name = "W5:" + DesiredConstructionName + ":GLASS" + NumName(IGlass); - } else { - state.dataMaterial->Material(MaterNum).Name = - "W5:" + DesiredConstructionName + ':' + NumName(IGlSys) + ":GLASS" + NumName(IGlass); - } - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VerySmooth; - state.dataMaterial->Material(MaterNum).AbsorpThermal = state.dataMaterial->Material(MaterNum).AbsorpThermalBack; - if (state.dataMaterial->Material(MaterNum).Thickness <= 0.0) { - ShowSevereError(state, - "SearchWindow5DataFile: Material=\"" + state.dataMaterial->Material(MaterNum).Name + - "\" has thickness of 0.0. Will be set to thickness = .001 but inaccuracies may result."); - ShowContinueError(state, "Line being read=" + NextLine.data); - ShowContinueError(state, "Thickness field starts at column 26=" + NextLine.data.substr(25)); - state.dataMaterial->Material(MaterNum).Thickness = 0.001; - } - } - } - - // Gap objects - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { - for (IGap = 1; IGap <= NGaps(IGlSys); ++IGap) { - ++MaterNum; - MaterNumSysGap(IGap, IGlSys) = MaterNum; - NextLine = W5DataFile.readLine(); - ++FileLineCount; - readList(NextLine.data.substr(23), state.dataMaterial->Material(MaterNum).Thickness, NumGases(IGap, IGlSys)); - if (NGlSys == 1) { - state.dataMaterial->Material(MaterNum).Name = "W5:" + DesiredConstructionName + ":GAP" + NumName(IGap); - } else { - state.dataMaterial->Material(MaterNum).Name = - "W5:" + DesiredConstructionName + ':' + NumName(IGlSys) + ":GAP" + NumName(IGap); - } - state.dataMaterial->Material(MaterNum).Thickness *= 0.001; - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::MediumRough; // Unused - } - } - - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { - for (IGap = 1; IGap <= NGaps(IGlSys); ++IGap) { - MaterNum = MaterNumSysGap(IGap, IGlSys); - state.dataMaterial->Material(MaterNum).NumberOfGasesInMixture = NumGases(IGap, IGlSys); - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGas; - if (NumGases(IGap, IGlSys) > 1) state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::WindowGasMixture; - for (IGas = 1; IGas <= NumGases(IGap, IGlSys); ++IGas) { - NextLine = W5DataFile.readLine(); - ++FileLineCount; - readList(NextLine.data.substr(19), - GasName(IGas), - state.dataMaterial->Material(MaterNum).GasFract(IGas), - state.dataMaterial->Material(MaterNum).GasWght(IGas), - state.dataMaterial->Material(MaterNum).GasCon(_, IGas), - state.dataMaterial->Material(MaterNum).GasVis(_, IGas), - state.dataMaterial->Material(MaterNum).GasCp(_, IGas)); - // Nominal resistance of gap at room temperature (based on first gas in mixture) - state.dataHeatBal->NominalR(MaterNum) = - state.dataMaterial->Material(MaterNum).Thickness / - (state.dataMaterial->Material(MaterNum).GasCon(1, 1) + state.dataMaterial->Material(MaterNum).GasCon(2, 1) * 300.0 + - state.dataMaterial->Material(MaterNum).GasCon(3, 1) * 90000.0); - } - } - } - - // Construction objects - - // reallocate Construct types - state.dataHeatBal->TotConstructs += NGlSys; - state.dataConstruction->Construct.redimension(state.dataHeatBal->TotConstructs); - state.dataHeatBal->NominalRforNominalUCalculation.redimension(state.dataHeatBal->TotConstructs); - state.dataHeatBal->NominalU.redimension(state.dataHeatBal->TotConstructs); - state.dataHeatBal->NominalUBeforeAdjusted.redimension(state.dataHeatBal->TotConstructs); - state.dataHeatBal->CoeffAdjRatio.redimension(state.dataHeatBal->TotConstructs) = 1.0; - - // these Construct arrays dimensioned based on MaxSolidWinLayers - for (int i = (state.dataHeatBal->TotConstructs - NGlSys + 1); i <= state.dataHeatBal->TotConstructs; ++i) { - auto &e(state.dataConstruction->Construct(i)); - e.setArraysBasedOnMaxSolidWinLayers(state); - } - - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - - // Pre-calculate constants - for (IPhi = 1; IPhi <= 10; ++IPhi) { - CosPhiIndepVar(IPhi) = std::cos((IPhi - 1) * 10.0 * DataGlobalConstants::DegToRadians); - } - - // Pre-calculate constants - for (IPhi = 1; IPhi <= 10; ++IPhi) { - Phi = double(IPhi - 1) * 10.0; - CosPhi(IPhi) = std::cos(Phi * DataGlobalConstants::DegToRadians); - if (std::abs(CosPhi(IPhi)) < 0.0001) CosPhi(IPhi) = 0.0; - } - - for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { - ConstrNum = state.dataHeatBal->TotConstructs - NGlSys + IGlSys; - if (IGlSys == 1) { - state.dataConstruction->Construct(ConstrNum).Name = DesiredConstructionName; - } else { - state.dataConstruction->Construct(ConstrNum).Name = DesiredConstructionName + ":2"; - } - for (loop = 1; loop <= Construction::MaxLayersInConstruct; ++loop) { - state.dataConstruction->Construct(ConstrNum).LayerPoint(loop) = 0; - } - state.dataConstruction->Construct(ConstrNum).InsideAbsorpSolar = 0.0; - state.dataConstruction->Construct(ConstrNum).OutsideAbsorpSolar = 0.0; - state.dataConstruction->Construct(ConstrNum).DayltPropPtr = 0; - state.dataConstruction->Construct(ConstrNum).CTFCross = 0.0; - state.dataConstruction->Construct(ConstrNum).CTFFlux = 0.0; - state.dataConstruction->Construct(ConstrNum).CTFInside = 0.0; - state.dataConstruction->Construct(ConstrNum).CTFOutside = 0.0; - state.dataConstruction->Construct(ConstrNum).CTFSourceIn = 0.0; - state.dataConstruction->Construct(ConstrNum).CTFSourceOut = 0.0; - state.dataConstruction->Construct(ConstrNum).CTFTimeStep = 0.0; - state.dataConstruction->Construct(ConstrNum).CTFTSourceOut = 0.0; - state.dataConstruction->Construct(ConstrNum).CTFTSourceIn = 0.0; - state.dataConstruction->Construct(ConstrNum).CTFTSourceQ = 0.0; - state.dataConstruction->Construct(ConstrNum).CTFTUserOut = 0.0; - state.dataConstruction->Construct(ConstrNum).CTFTUserIn = 0.0; - state.dataConstruction->Construct(ConstrNum).CTFTUserSource = 0.0; - state.dataConstruction->Construct(ConstrNum).NumHistories = 0; - state.dataConstruction->Construct(ConstrNum).NumCTFTerms = 0; - state.dataConstruction->Construct(ConstrNum).UValue = 0.0; - state.dataConstruction->Construct(ConstrNum).SourceSinkPresent = false; - state.dataConstruction->Construct(ConstrNum).SolutionDimensions = 0; - state.dataConstruction->Construct(ConstrNum).SourceAfterLayer = 0; - state.dataConstruction->Construct(ConstrNum).TempAfterLayer = 0; - state.dataConstruction->Construct(ConstrNum).ThicknessPerpend = 0.0; - state.dataConstruction->Construct(ConstrNum).AbsDiff = 0.0; - state.dataConstruction->Construct(ConstrNum).AbsDiffBack = 0.0; - state.dataConstruction->Construct(ConstrNum).AbsDiffShade = 0.0; - state.dataConstruction->Construct(ConstrNum).AbsDiffBackShade = 0.0; - state.dataConstruction->Construct(ConstrNum).ShadeAbsorpThermal = 0.0; - state.dataConstruction->Construct(ConstrNum).AbsBeamShadeCoef = 0.0; - state.dataConstruction->Construct(ConstrNum).AbsDiffIn = 0.0; - state.dataConstruction->Construct(ConstrNum).AbsDiffOut = 0.0; - state.dataConstruction->Construct(ConstrNum).TransDiff = 0.0; - state.dataConstruction->Construct(ConstrNum).TransDiffVis = 0.0; - state.dataConstruction->Construct(ConstrNum).ReflectSolDiffBack = 0.0; - state.dataConstruction->Construct(ConstrNum).ReflectSolDiffFront = 0.0; - state.dataConstruction->Construct(ConstrNum).ReflectVisDiffBack = 0.0; - state.dataConstruction->Construct(ConstrNum).ReflectVisDiffFront = 0.0; - state.dataConstruction->Construct(ConstrNum).TransSolBeamCoef = 0.0; - state.dataConstruction->Construct(ConstrNum).TransVisBeamCoef = 0.0; - state.dataConstruction->Construct(ConstrNum).ReflSolBeamFrontCoef = 0.0; - state.dataConstruction->Construct(ConstrNum).ReflSolBeamBackCoef = 0.0; - state.dataConstruction->Construct(ConstrNum).W5FrameDivider = 0; - state.dataConstruction->Construct(ConstrNum).TotLayers = NGlass(IGlSys) + NGaps(IGlSys); - state.dataConstruction->Construct(ConstrNum).TotGlassLayers = NGlass(IGlSys); - state.dataConstruction->Construct(ConstrNum).TotSolidLayers = NGlass(IGlSys); - - for (int Layer = 1; Layer <= state.dataHeatBal->MaxSolidWinLayers; ++Layer) { - for (int index = 1; index <= DataSurfaces::MaxPolyCoeff; ++index) { - state.dataConstruction->Construct(ConstrNum).AbsBeamCoef(Layer)(index) = 0.0; - state.dataConstruction->Construct(ConstrNum).AbsBeamBackCoef(Layer)(index) = 0.0; - } - } - - for (IGlass = 1; IGlass <= NGlass(IGlSys); ++IGlass) { - state.dataConstruction->Construct(ConstrNum).LayerPoint(2 * IGlass - 1) = MaterNumSysGlass(IGlass, IGlSys); - if (IGlass < NGlass(IGlSys)) state.dataConstruction->Construct(ConstrNum).LayerPoint(2 * IGlass) = MaterNumSysGap(IGlass, IGlSys); - } - - state.dataConstruction->Construct(ConstrNum).OutsideRoughness = DataSurfaces::SurfaceRoughness::VerySmooth; - state.dataConstruction->Construct(ConstrNum).InsideAbsorpThermal = - state.dataMaterial->Material(TotMaterialsPrev + NGlass(IGlSys)).AbsorpThermalBack; - state.dataConstruction->Construct(ConstrNum).OutsideAbsorpThermal = - state.dataMaterial->Material(TotMaterialsPrev + 1).AbsorpThermalFront; - state.dataConstruction->Construct(ConstrNum).TypeIsWindow = true; - state.dataConstruction->Construct(ConstrNum).FromWindow5DataFile = true; - state.dataConstruction->Construct(ConstrNum).W5FileGlazingSysHeight = WinHeight(IGlSys); - state.dataConstruction->Construct(ConstrNum).W5FileGlazingSysWidth = WinWidth(IGlSys); - if (UtilityRoutines::SameString(MullionOrientation, "Vertical")) { - state.dataConstruction->Construct(ConstrNum).W5FileMullionOrientation = DataWindowEquivalentLayer::Orientation::Vertical; - } else if (UtilityRoutines::SameString(MullionOrientation, "Horizontal")) { - state.dataConstruction->Construct(ConstrNum).W5FileMullionOrientation = DataWindowEquivalentLayer::Orientation::Horizontal; - } else { - } - state.dataConstruction->Construct(ConstrNum).W5FileMullionWidth = MullionWidth; - - // Fill Construct with system transmission, reflection and absorption properties - - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - if (IGlSys == 1) { - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - } - NextLine = W5DataFile.readLine(); - if (NextLine.eof) goto Label1000; - ++FileLineCount; - if (!readItem(NextLine.data.substr(5), Tsol)) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of TSol values."); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount, NextLine.data.substr(0, 100))); - ErrorsFound = true; - } else if (any_lt(Tsol, 0.0) || any_gt(Tsol, 1.0)) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of TSol values. (out of range [0,1])"); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount, NextLine.data.substr(0, 100))); - ErrorsFound = true; - } - for (IGlass = 1; IGlass <= NGlass(IGlSys); ++IGlass) { - NextLine = W5DataFile.readLine(); - ++FileLineCount; - if (!readItem(NextLine.data.substr(5), AbsSol(_, IGlass))) { - ShowSevereError(state, - format("HeatBalanceManager: SearchWindow5DataFile: Error in Read of AbsSol values. For Glass={}", IGlass)); - ShowContinueError(state, - format("Line (~{}) in error (first 100 characters)={}", FileLineCount, NextLine.data.substr(0, 100))); - ErrorsFound = true; - } else if (any_lt(AbsSol(_, IGlass), 0.0) || any_gt(AbsSol(_, IGlass), 1.0)) { - ShowSevereError( - state, - format("HeatBalanceManager: SearchWindow5DataFile: Error in Read of AbsSol values. (out of range [0,1]) For Glass={}", - IGlass)); - ShowContinueError(state, - format("Line (~{}) in error (first 100 characters)={}", FileLineCount, NextLine.data.substr(0, 100))); - ErrorsFound = true; - } - } - for (ILine = 1; ILine <= 5; ++ILine) { - NextLine = W5DataFile.readLine(); - DataLine(ILine) = NextLine.data; - } - - if (!readItem(DataLine(1).substr(5), Rfsol)) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of RfSol values."); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 1, DataLine(1).substr(0, 100))); - ErrorsFound = true; - } else if (any_lt(Rfsol, 0.0) || any_gt(Rfsol, 1.0)) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of RfSol values. (out of range [0,1])"); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 1, DataLine(1).substr(0, 100))); - ErrorsFound = true; - } - - if (!readItem(DataLine(2).substr(5), Rbsol)) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of RbSol values."); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 2, DataLine(2).substr(0, 100))); - ErrorsFound = true; - } else if (any_lt(Rbsol, 0.0) || any_gt(Rbsol, 1.0)) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of RbSol values. (out of range [0,1])"); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 2, DataLine(2).substr(0, 100))); - ErrorsFound = true; - } - if (!readItem(DataLine(3).substr(5), Tvis)) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Tvis values."); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 3, DataLine(3).substr(0, 100))); - ErrorsFound = true; - } else if (any_lt(Tvis, 0.0) || any_gt(Tvis, 1.0)) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Tvis values. (out of range [0,1])"); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 3, DataLine(3).substr(0, 100))); - ErrorsFound = true; - } - if (!readItem(DataLine(4).substr(5), Rfvis)) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Rfvis values."); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 4, DataLine(4).substr(0, 100))); - ErrorsFound = true; - } else if (any_lt(Rfvis, 0.0) || any_gt(Rfvis, 1.0)) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Rfvis values. (out of range [0,1])"); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 4, DataLine(4).substr(0, 100))); - ErrorsFound = true; - } - if (!readItem(DataLine(5).substr(5), Rbvis)) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Rbvis values."); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 5, DataLine(5).substr(0, 100))); - ErrorsFound = true; - } else if (any_lt(Rbvis, 0.0) || any_gt(Rbvis, 1.0)) { - ShowSevereError(state, "HeatBalanceManager: SearchWindow5DataFile: Error in Read of Rbvis values. (out of range [0,1])"); - ShowContinueError(state, format("Line (~{}) in error (first 100 characters)={}", FileLineCount + 5, DataLine(5).substr(0, 100))); - ErrorsFound = true; - } - FileLineCount += 5; - - if (ErrorsFound) - ShowFatalError(state, - "HeatBalanceManager: SearchWindow5DataFile: Construction=" + DesiredConstructionName + - " from the Window5 data file cannot be used because of above errors"); - - // Hemis - state.dataConstruction->Construct(ConstrNum).TransDiff = Tsol(11); - state.dataConstruction->Construct(ConstrNum).TransDiffVis = Tvis(11); - state.dataConstruction->Construct(ConstrNum).ReflectSolDiffFront = Rfsol(11); - state.dataConstruction->Construct(ConstrNum).ReflectSolDiffBack = Rbsol(11); - state.dataConstruction->Construct(ConstrNum).ReflectVisDiffFront = Rfvis(11); - state.dataConstruction->Construct(ConstrNum).ReflectVisDiffBack = Rbvis(11); - - W5LsqFit(CosPhiIndepVar, Tsol, 6, 1, 10, state.dataConstruction->Construct(ConstrNum).TransSolBeamCoef); - W5LsqFit(CosPhiIndepVar, Tvis, 6, 1, 10, state.dataConstruction->Construct(ConstrNum).TransVisBeamCoef); - W5LsqFit(CosPhiIndepVar, Rfsol, 6, 1, 10, state.dataConstruction->Construct(ConstrNum).ReflSolBeamFrontCoef); - for (IGlass = 1; IGlass <= NGlass(IGlSys); ++IGlass) { - W5LsqFit(CosPhiIndepVar, AbsSol(_, IGlass), 6, 1, 10, state.dataConstruction->Construct(ConstrNum).AbsBeamCoef(IGlass)); - } - - // For comparing fitted vs. input distribution in incidence angle - for (IPhi = 1; IPhi <= 10; ++IPhi) { - tsolFit(IPhi) = POLYF(CosPhi(IPhi), state.dataConstruction->Construct(ConstrNum).TransSolBeamCoef); - tvisFit(IPhi) = POLYF(CosPhi(IPhi), state.dataConstruction->Construct(ConstrNum).TransVisBeamCoef); - rfsolFit(IPhi) = POLYF(CosPhi(IPhi), state.dataConstruction->Construct(ConstrNum).ReflSolBeamFrontCoef); - for (IGlass = 1; IGlass <= NGlass(IGlSys); ++IGlass) { - solabsFit(IGlass, IPhi) = POLYF(CosPhi(IPhi), state.dataConstruction->Construct(ConstrNum).AbsBeamCoef(IGlass)); - } - } - // end - - // NominalRforNominalUCalculation of this construction (actually the total resistance of all of its layers; gas layer - // conductivity here ignores convective effects in gap.) - state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) = 0.0; - for (loop = 1; loop <= NGlass(IGlSys) + NGaps(IGlSys); ++loop) { - MatNum = state.dataConstruction->Construct(ConstrNum).LayerPoint(loop); - if (state.dataMaterial->Material(MatNum).Group == DataHeatBalance::MaterialGroup::WindowGlass) { - state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) += - state.dataMaterial->Material(MatNum).Thickness / state.dataMaterial->Material(MatNum).Conductivity; - } else if (state.dataMaterial->Material(MatNum).Group == DataHeatBalance::MaterialGroup::WindowGas || - state.dataMaterial->Material(MatNum).Group == DataHeatBalance::MaterialGroup::WindowGasMixture) { - // If mixture, use conductivity of first gas in mixture - state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) += - state.dataMaterial->Material(MatNum).Thickness / - (state.dataMaterial->Material(MatNum).GasCon(1, 1) + state.dataMaterial->Material(MatNum).GasCon(2, 1) * 300.0 + - state.dataMaterial->Material(MatNum).GasCon(3, 1) * 90000.0); - } - } - - } // End of loop over glazing systems - - // WindowFrameAndDivider objects - - TotFrameDividerPrev = state.dataHeatBal->TotFrameDivider; - for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { - if (FrameWidth > 0.0 || DividerWidth(IGlSys) > 0.0) { - ++state.dataHeatBal->TotFrameDivider; - state.dataConstruction->Construct(state.dataHeatBal->TotConstructs - NGlSys + IGlSys).W5FrameDivider = - state.dataHeatBal->TotFrameDivider; - } - } - - if (state.dataHeatBal->TotFrameDivider > TotFrameDividerPrev) { - state.dataSurface->FrameDivider.redimension(state.dataHeatBal->TotFrameDivider); - } - - for (IGlSys = 1; IGlSys <= NGlSys; ++IGlSys) { - if (FrameWidth > 0.0 || DividerWidth(IGlSys) > 0.0) { - FrDivNum = state.dataConstruction->Construct(state.dataHeatBal->TotConstructs - NGlSys + IGlSys).W5FrameDivider; - state.dataSurface->FrameDivider(FrDivNum).FrameWidth = FrameWidth; - state.dataSurface->FrameDivider(FrDivNum).FrameProjectionOut = FrameProjectionOut; - state.dataSurface->FrameDivider(FrDivNum).FrameProjectionIn = FrameProjectionIn; - state.dataSurface->FrameDivider(FrDivNum).FrameConductance = FrameConductance; - state.dataSurface->FrameDivider(FrDivNum).FrEdgeToCenterGlCondRatio = FrEdgeToCenterGlCondRatio; - state.dataSurface->FrameDivider(FrDivNum).FrameSolAbsorp = FrameSolAbsorp; - state.dataSurface->FrameDivider(FrDivNum).FrameVisAbsorp = FrameVisAbsorp; - state.dataSurface->FrameDivider(FrDivNum).FrameEmis = FrameEmis; - state.dataSurface->FrameDivider(FrDivNum).FrameEdgeWidth = 0.06355; // 2.5 in - if (UtilityRoutines::SameString(MullionOrientation, "Vertical")) { - state.dataSurface->FrameDivider(FrDivNum).MullionOrientation = DataWindowEquivalentLayer::Orientation::Vertical; - } else if (UtilityRoutines::SameString(MullionOrientation, "Horizontal")) { - state.dataSurface->FrameDivider(FrDivNum).MullionOrientation = DataWindowEquivalentLayer::Orientation::Horizontal; - } - if (UtilityRoutines::SameString(DividerType(IGlSys), "DividedLite")) { - state.dataSurface->FrameDivider(FrDivNum).DividerType = DataSurfaces::FrameDividerType::DividedLite; - } else if (UtilityRoutines::SameString(DividerType(IGlSys), "Suspended")) { - state.dataSurface->FrameDivider(FrDivNum).DividerType = DataSurfaces::FrameDividerType::Suspended; - } - state.dataSurface->FrameDivider(FrDivNum).DividerWidth = DividerWidth(IGlSys); - state.dataSurface->FrameDivider(FrDivNum).HorDividers = HorDividers(IGlSys); - state.dataSurface->FrameDivider(FrDivNum).VertDividers = VertDividers(IGlSys); - state.dataSurface->FrameDivider(FrDivNum).DividerProjectionOut = DividerProjectionOut(IGlSys); - state.dataSurface->FrameDivider(FrDivNum).DividerProjectionIn = DividerProjectionIn(IGlSys); - state.dataSurface->FrameDivider(FrDivNum).DividerConductance = DividerConductance(IGlSys); - state.dataSurface->FrameDivider(FrDivNum).DivEdgeToCenterGlCondRatio = DivEdgeToCenterGlCondRatio(IGlSys); - state.dataSurface->FrameDivider(FrDivNum).DividerSolAbsorp = DividerSolAbsorp(IGlSys); - state.dataSurface->FrameDivider(FrDivNum).DividerVisAbsorp = DividerVisAbsorp(IGlSys); - state.dataSurface->FrameDivider(FrDivNum).DividerEmis = DividerEmis(IGlSys); - state.dataSurface->FrameDivider(FrDivNum).DividerEdgeWidth = 0.06355; // 2.5 in - if (NGlSys == 1) { - state.dataSurface->FrameDivider(FrDivNum).Name = "W5:" + DesiredConstructionName; - } else { - state.dataSurface->FrameDivider(FrDivNum).Name = "W5:" + DesiredConstructionName + ':' + NumName(IGlSys); - } - } - } - - if (FrameWidth > 0.0 && DividerWidth(1) > 0.0) { - DisplayString(state, "--Construction and associated frame and divider found"); - } else if (FrameWidth > 0.0) { - DisplayString(state, "--Construction and associated frame found"); - } else if (DividerWidth(1) > 0.0) { - DisplayString(state, "--Construction and associated divider found"); - } else { - DisplayString(state, "--Construction without frame or divider found"); - } - } - - return; - - Label1000:; - EOFonFile = true; - } - - void SetStormWindowControl(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Winkelmann - // DATE WRITTEN Jan 2004 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // Sets the storm window flag for each window, which is: - // -1: if storm window is not applicable (this will always be the value for interior - // windows since storm windows can only be applied to exterior windows - // 0: if the window has a storm window but it is off - // 1: if the window has a storm window and it is on - - // A "storm window" is a single layer of exterior glass separated from the main window by air gap. - // Whether the storm window is in place is determined by the following values, which - // which are specified in the Storm Window object for the window: - // -Month that Storm Window Is Put On - // -Day of Month that Storm Window Is Put On - // -Month that Storm Window Is Taken Off - // -Day of Month that Storm Window Is Taken Off - - // Using/Aliasing - using General::BetweenDates; - - int SurfNum; // Surface number - int StormWinNum; // Number of storm window object - int StormWinFlag; // Storm window flag; this routine sets the following values: - // 0: if the storm window is off this time step - // 1: if the storm window is on this time step - int DateOff; // Date Off for calculation - - state.dataHeatBal->StormWinChangeThisDay = false; - - for (StormWinNum = 1; StormWinNum <= state.dataSurface->TotStormWin; ++StormWinNum) { - SurfNum = state.dataSurface->StormWindow(StormWinNum).BaseWindowNum; - state.dataSurface->SurfWinStormWinFlagPrevDay(SurfNum) = state.dataSurface->SurfWinStormWinFlag(SurfNum); - DateOff = state.dataSurface->StormWindow(StormWinNum).DateOff - 1; - // Note: Dateon = Dateoff is not allowed and will have produced an error in getinput. - if (DateOff == 0) DateOff = 366; - if (BetweenDates(state.dataEnvrn->DayOfYear_Schedule, state.dataSurface->StormWindow(StormWinNum).DateOn, DateOff)) { - StormWinFlag = 1; - } else { - StormWinFlag = 0; - } - state.dataSurface->SurfWinStormWinFlag(SurfNum) = StormWinFlag; - if (state.dataGlobal->BeginSimFlag) state.dataSurface->SurfWinStormWinFlagPrevDay(SurfNum) = StormWinFlag; - if (state.dataSurface->SurfWinStormWinFlag(SurfNum) != state.dataSurface->SurfWinStormWinFlagPrevDay(SurfNum)) - state.dataHeatBal->StormWinChangeThisDay = true; - } - } - - void CreateFCfactorConstructions(EnergyPlusData &state, - int &ConstrNum, // Counter for Constructions - bool &ErrorsFound // If errors found in input - ) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Tianzhen Hong - // DATE WRITTEN July 2009 - // MODIFIED - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine goes through each construction defined with Ffactor or Cfactor method, - // and creates a construction (concrete + insulation) used in the heat transfer calculation. - // This subroutine only gets called once in the GetConstructionData subroutine - - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - - // Using/Aliasing - using namespace DataStringGlobals; - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - - // SUBROUTINE PARAMETER DEFINITIONS: - - // ASHRAE Handbook Fundamental 2005 - // Thermal resistance of the inside air film, m2.K/W. Average of 0.14 (heat flow up) and 0.11 (heat flow down) - Real64 constexpr Rfilm_in(0.125); - // Thermal resistance of the outside air film used in calculating the Ffactor, m2.K/W. 0.17/5.678 - Real64 constexpr Rfilm_out(0.03); - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int ConstructNumAlpha; // Number of construction alpha names being passed - int DummyNumProp; // dummy variable for properties being passed - int IOStat; // IO Status when calling get input subroutine - Array1D_string ConstructAlphas(1); // Construction Alpha names defined - Array1D DummyProps(4); // Temporary array to transfer construction properties - int Loop; - - int TotFfactorConstructs; // Number of slabs-on-grade or underground floor constructions defined with F factors - int TotCfactorConstructs; // Number of underground wall constructions defined with C factors - - Real64 Ffactor; // Ffactor in W/m-K, applies to deltaT of outside - indoor air temperature - Real64 Cfactor; // Cfactor in W/m2-K, does not include soil or air films - Real64 Area; // floor area in m2 - Real64 PerimeterExposed; // perimeter exposed in m - Real64 Height; // Height of the underground wall in m - - Real64 Reff; // Effective thermal resistance, m2.K/W - Real64 Rcon; // Concrete layer thermal resistance, m2.K/W - Real64 Rfic; // Thermal resistance of the fictitious material, m2.K/W - int MaterNum; // Material index - Real64 Rsoilequ; // Effective R-value of soil for underground walls - int iFCConcreteLayer; // Layer pointer to the materials array - - // First get the concrete layer - iFCConcreteLayer = UtilityRoutines::FindItemInList("~FC_Concrete", state.dataMaterial->Material); - Rcon = state.dataMaterial->Material(iFCConcreteLayer).Resistance; - - // Count number of constructions defined with Ffactor or Cfactor method - TotFfactorConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:FfactorGroundFloor"); - TotCfactorConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Construction:CfactorUndergroundWall"); - - if (TotFfactorConstructs > 0) { - state.dataHeatBal->NoFfactorConstructionsUsed = false; - } - - if (TotCfactorConstructs > 0) { - state.dataHeatBal->NoCfactorConstructionsUsed = false; - } - - // First create ground floor constructions defined with F factor method if any - state.dataHeatBalMgr->CurrentModuleObject = "Construction:FfactorGroundFloor"; - - // Loop through all constructs defined with Ffactor method - for (Loop = 1; Loop <= TotFfactorConstructs; ++Loop) { - - // Get the object names for each construction from the input processor - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - ConstructAlphas, - ConstructNumAlpha, - DummyProps, - DummyNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueConstructNames, - ConstructAlphas(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - continue; - } - - ++ConstrNum; - - state.dataConstruction->Construct(ConstrNum).Name = ConstructAlphas(1); - state.dataConstruction->Construct(ConstrNum).TypeIsFfactorFloor = true; - - Ffactor = DummyProps(1); - Area = DummyProps(2); - PerimeterExposed = DummyProps(3); - - state.dataConstruction->Construct(ConstrNum).Area = Area; - state.dataConstruction->Construct(ConstrNum).PerimeterExposed = PerimeterExposed; - state.dataConstruction->Construct(ConstrNum).FFactor = Ffactor; - - if (Ffactor <= 0.0) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + ConstructAlphas(1) + "\" has " + - state.dataIPShortCut->cNumericFieldNames(1) + " <= 0.0, must be > 0.0."); - ShowContinueError(state, format("Entered value=[{:.2R}]", Ffactor)); - ErrorsFound = true; - } - - if (Area <= 0.0) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + ConstructAlphas(1) + "\" has " + - state.dataIPShortCut->cNumericFieldNames(2) + " <= 0.0, must be > 0.0."); - ShowContinueError(state, format("Entered value=[{:.2R}]", Area)); - ErrorsFound = true; - } - - if (PerimeterExposed < 0.0) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + ConstructAlphas(1) + "\" has " + - state.dataIPShortCut->cNumericFieldNames(3) + " <= 0.0, must be > 0.0."); - ShowContinueError(state, format("Entered value=[{:.2R}]", PerimeterExposed)); - ErrorsFound = true; - } - - // The construction has two layers which have been created in GetMaterialData - state.dataConstruction->Construct(ConstrNum).TotLayers = 2; - - // The concrete is the inside layer - state.dataConstruction->Construct(ConstrNum).LayerPoint(2) = iFCConcreteLayer; - - // The fictitious insulation is the outside layer - MaterNum = UtilityRoutines::FindItemInList(format("~FC_Insulation_{}", Loop), state.dataMaterial->Material); - state.dataConstruction->Construct(ConstrNum).LayerPoint(1) = MaterNum; - - // Calculate the thermal resistance of the fictitious insulation layer - // effective thermal resistance excludes inside and outside air films - if (PerimeterExposed > 0.0) { - Reff = Area / (PerimeterExposed * Ffactor) - Rfilm_in - Rfilm_out; - } else { // PerimeterExposed = 0 for underground floor, assume R-1000 (IP) - Reff = 177.0; - } - - Rfic = Reff - Rcon; - if (Rfic <= 0.0) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + ConstructAlphas(1) + - "\" has calculated R value <= 0.0, must be > 0.0."); - ShowContinueError(state, format("Calculated value=[{:.2R}] Check definition.", Rfic)); - ErrorsFound = true; - } - - state.dataMaterial->Material(MaterNum).Resistance = Rfic; - state.dataHeatBal->NominalR(MaterNum) = Rfic; - - // excluding thermal resistance of inside or outside air film - // 1/Reff gets reported as the "U-Factor no Film" in the summary report Envelope Summary | Opaque Exterior - state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) = Reff; - } - - // Then create underground wall constructions defined with C factor method if any - state.dataHeatBalMgr->CurrentModuleObject = "Construction:CfactorUndergroundWall"; - - for (Loop = 1; Loop <= TotCfactorConstructs; ++Loop) { // Loop through all constructs defined with Ffactor method - - // Get the object names for each construction from the input processor - state.dataInputProcessing->inputProcessor->getObjectItem(state, - state.dataHeatBalMgr->CurrentModuleObject, - Loop, - ConstructAlphas, - ConstructNumAlpha, - DummyProps, - DummyNumProp, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueConstructNames, - ConstructAlphas(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - continue; - } - - ++ConstrNum; - - state.dataConstruction->Construct(ConstrNum).Name = ConstructAlphas(1); - state.dataConstruction->Construct(ConstrNum).TypeIsCfactorWall = true; - - Cfactor = DummyProps(1); - Height = DummyProps(2); - - state.dataConstruction->Construct(ConstrNum).Height = Height; - state.dataConstruction->Construct(ConstrNum).CFactor = Cfactor; - - if (Cfactor <= 0.0) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + ' ' + ConstructAlphas(1) + " has " + - state.dataIPShortCut->cNumericFieldNames(1) + " <= 0.0, must be > 0.0."); - ShowContinueError(state, format("Entered value=[{:.2R}]", Cfactor)); - ErrorsFound = true; - } - - if (Height <= 0.0) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + ' ' + ConstructAlphas(1) + " has " + - state.dataIPShortCut->cNumericFieldNames(2) + " <= 0.0, must be > 0.0."); - ShowContinueError(state, format("Entered value=[{:.2R}]", Height)); - ErrorsFound = true; - } - - // The construction has two layers which have been created in GetMaterialData - state.dataConstruction->Construct(ConstrNum).TotLayers = 2; - - // The concrete is the inside layer - state.dataConstruction->Construct(ConstrNum).LayerPoint(2) = iFCConcreteLayer; - - // The fictitious insulation is the outside layer - MaterNum = UtilityRoutines::FindItemInList("~FC_Insulation_" + fmt::to_string(Loop + TotFfactorConstructs), state.dataMaterial->Material); - state.dataConstruction->Construct(ConstrNum).LayerPoint(1) = MaterNum; - - // CR 8886 Rsoil should be in SI unit. From ASHRAE 90.1-2010 SI - if (Height <= 0.25) { - Rsoilequ = 0.12; // m2K/W - } else if (Height >= 2.5) { - Rsoilequ = 0.92; - } else { // regression from ASHRAE 90.1-2010 SI TABLE C6.10.1 Effective R-Value of Soil, R2 = 0.9967 - Rsoilequ = 0.0607 + 0.3479 * Height; - } - - // effective thermal resistance excludes inside and outside air films - Reff = 1.0 / Cfactor + Rsoilequ; // Cfactor does not include air films - - Rfic = Reff - Rcon; - if (Rfic <= 0) { - ShowSevereError(state, - state.dataHeatBalMgr->CurrentModuleObject + "=\"" + ConstructAlphas(1) + - "\" has calculated R value <= 0.0, must be > 0.0."); - ShowContinueError(state, format("Calculated value=[{:.2R}] Check definition.", Rfic)); - ErrorsFound = true; - } - - state.dataMaterial->Material(MaterNum).Resistance = Rfic; - state.dataHeatBal->NominalR(MaterNum) = Rfic; - - // Reff includes the wall itself and soil, but excluding thermal resistance of inside or outside air film - // 1/Reff gets reported as the "U-Factor no Film" in the summary report Envelope Summary | Opaque Exterior - state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) = Reff; - } - } - - void CreateAirBoundaryConstructions(EnergyPlusData &state, - int &constrNum, // Counter for Constructions - bool &errorsFound // If errors found in input - ) - { - auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; - cCurrentModuleObject = "Construction:AirBoundary"; - static constexpr std::string_view RoutineName = "CreateAirBoundaryConstructions"; - int numAirBoundaryConstructs = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - if (numAirBoundaryConstructs > 0) { - auto const instances = state.dataInputProcessing->inputProcessor->epJSON.find(cCurrentModuleObject); - if (instances == state.dataInputProcessing->inputProcessor->epJSON.end()) { - // Cannot imagine how you would have numAirBoundaryConstructs > 0 and yet the instances is empty - // this would indicate a major problem in the input processor, not a problem here - // I'll still catch this with errorsFound but I cannot make a unit test for it so excluding the line from coverage - ShowSevereError(state, // LCOV_EXCL_LINE - cCurrentModuleObject + ": Somehow getNumObjectsFound was > 0 but epJSON.find found 0"); // LCOV_EXCL_LINE - errorsFound = true; // LCOV_EXCL_LINE - } - auto &instancesValue = instances.value(); - for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { - auto const &fields = instance.value(); - auto thisObjectName = instance.key(); - state.dataInputProcessing->inputProcessor->markObjectAsUsed(cCurrentModuleObject, thisObjectName); - - if (GlobalNames::VerifyUniqueInterObjectName( - state, state.dataHeatBalMgr->UniqueConstructNames, thisObjectName, cCurrentModuleObject, "Name", errorsFound)) { - continue; - } - - ++constrNum; - auto &thisConstruct = state.dataConstruction->Construct(constrNum); - - thisConstruct.Name = UtilityRoutines::MakeUPPERCase(thisObjectName); - thisConstruct.TypeIsAirBoundary = true; - thisConstruct.IsUsedCTF = false; - - // Air Exchange Method - std::string airMethod = "None"; - if (fields.find("air_exchange_method") != fields.end()) { - airMethod = fields.at("air_exchange_method").get(); - } - if (UtilityRoutines::SameString(airMethod, "SimpleMixing")) { - thisConstruct.TypeIsAirBoundaryMixing = true; - if (fields.find("simple_mixing_air_changes_per_hour") != fields.end()) { - thisConstruct.AirBoundaryACH = fields.at("simple_mixing_air_changes_per_hour").get(); - } else { - if (!state.dataInputProcessing->inputProcessor->getDefaultValue( - state, cCurrentModuleObject, "simple_mixing_air_changes_per_hour", thisConstruct.AirBoundaryACH)) { - errorsFound = true; - } - } - if (fields.find("simple_mixing_schedule_name") != fields.end()) { - const std::string &schedName = fields.at("simple_mixing_schedule_name").get(); - thisConstruct.AirBoundaryMixingSched = ScheduleManager::GetScheduleIndex(state, UtilityRoutines::MakeUPPERCase(schedName)); - if (thisConstruct.AirBoundaryMixingSched == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + thisConstruct.Name + - "\", invalid (not found) " + "Simple Mixing Schedule Name" + "=\"" + schedName + "\"."); - errorsFound = true; - } - } else { - thisConstruct.AirBoundaryMixingSched = DataGlobalConstants::ScheduleAlwaysOn; - } - } - } - } - } - - void GetScheduledSurfaceGains(EnergyPlusData &state, bool &ErrorsFound) // If errors found in input - { - - // SUBROUTINE INFORMATION: - // AUTHOR Simon Vidanovic - // DATE WRITTEN June 2013 - // MODIFIED - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // Loads scheduled surface gains for solar incident on interior side of the surfaces and absorbed solar energy in - // window layers - - // Using/Aliasing - using ScheduleManager::GetScheduleIndex; - - // SUBROUTINE PARAMETER DEFINITIONS: - constexpr const char *RoutineName("GetScheduledSurfaceGains: "); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int NumArgs; - int NumAlpha; - int NumNumeric; - int Loop; - int IOStat; - int SurfNum; - int ConstrNum; - int ScheduleNum; - int i; - int NumOfScheduledLayers; - bool NumOfLayersMatch; - int iZone; - - //----------------------------------------------------------------------- - // SurfaceProperty:SolarIncidentInside - //----------------------------------------------------------------------- - auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; - cCurrentModuleObject = "SurfaceProperty:SolarIncidentInside"; - - // Check if IDD definition is correct - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, cCurrentModuleObject, NumArgs, NumAlpha, NumNumeric); - if (NumAlpha != 4) { - ShowSevereError( - state, - format("{}{}: Object Definition indicates not = 4 Alpha Objects, Number Indicated={}", RoutineName, cCurrentModuleObject, NumAlpha)); - ErrorsFound = true; - } - - state.dataSurface->TotSurfIncSolSSG = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - if (state.dataSurface->TotSurfIncSolSSG > 0) { - if (!allocated(state.dataSurface->SurfIncSolSSG)) { - state.dataSurface->SurfIncSolSSG.allocate(state.dataSurface->TotSurfIncSolSSG); - } - - for (Loop = 1; Loop <= state.dataSurface->TotSurfIncSolSSG; ++Loop) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Loop, - state.dataIPShortCut->cAlphaArgs, - NumAlpha, - state.dataIPShortCut->rNumericArgs, - NumNumeric, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound)) { - ShowContinueError( - state, "...each SurfaceProperty:SolarIncidentInside name must not duplicate other SurfaceProperty:SolarIncidentInside name"); - continue; - } - - state.dataSurface->SurfIncSolSSG(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); - - // Assign surface number - SurfNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataSurface->Surface); - if (SurfNum == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(2) + " has been found."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(2) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(2) + - "\" no corresponding surface (ref BuildingSurface:Detailed) has been found in the input file."); - ErrorsFound = true; - } else { - state.dataSurface->SurfIncSolSSG(Loop).SurfPtr = SurfNum; - if (state.dataSurface->UseRepresentativeSurfaceCalculations) { - int repSurfNum = state.dataSurface->Surface(SurfNum).RepresentativeCalcSurfNum; - if (repSurfNum != SurfNum) { - // Do not use representative surfaces - - // remove surface from representative constituent list - auto &vec = state.dataSurface->Surface(repSurfNum).ConstituentSurfaceNums; - vec.erase(std::remove(vec.begin(), vec.end(), SurfNum), vec.end()); - - // reset representative surface number - state.dataSurface->Surface(SurfNum).RepresentativeCalcSurfNum = SurfNum; - } - } - } - - // Assign construction number - ConstrNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(3), state.dataConstruction->Construct); - if (ConstrNum == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(3) + " has been found."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(3) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(3) + - "\" no corresponding construction (ref Construction) has been found in the input file."); - ErrorsFound = true; - } else { - state.dataSurface->SurfIncSolSSG(Loop).ConstrPtr = ConstrNum; - } - - // Assign schedule number - ScheduleNum = GetScheduleIndex(state, state.dataIPShortCut->cAlphaArgs(4)); - if (ScheduleNum == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(4) + " has been found."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(4) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(4) + - "\" no corresponding schedule has been found in the input file."); - ErrorsFound = true; - } else { - state.dataSurface->SurfIncSolSSG(Loop).SchedPtr = ScheduleNum; - } - } - } - - //----------------------------------------------------------------------- - // SurfaceProperty:SolarIncidentInside - //----------------------------------------------------------------------- - cCurrentModuleObject = "ComplexFenestrationProperty:SolarAbsorbedLayers"; - - state.dataSurface->TotFenLayAbsSSG = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - if (state.dataSurface->TotFenLayAbsSSG > 0) { - if (!allocated(state.dataSurface->FenLayAbsSSG)) { - state.dataSurface->FenLayAbsSSG.allocate(state.dataSurface->TotFenLayAbsSSG); - } - - for (Loop = 1; Loop <= state.dataSurface->TotFenLayAbsSSG; ++Loop) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Loop, - state.dataIPShortCut->cAlphaArgs, - NumAlpha, - state.dataIPShortCut->rNumericArgs, - NumNumeric, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound)) { - ShowContinueError(state, - "...each ComplexFenestrationProperty:SolarAbsorbedLayers name must not duplicate other " - "ComplexFenestrationProperty:SolarAbsorbedLayers name"); - continue; - } - - state.dataSurface->FenLayAbsSSG(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); - - // Assign surface number - SurfNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataSurface->Surface); - if (SurfNum == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(2) + " has been found."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(2) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(2) + - "\" no corresponding surface (ref BuildingSurface:Detailed) has been found in the input file."); - ErrorsFound = true; - } else { - state.dataSurface->FenLayAbsSSG(Loop).SurfPtr = SurfNum; - } - - // Assign construction number - ConstrNum = UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(3), state.dataConstruction->Construct); - if (ConstrNum == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(3) + " has been found."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(3) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(3) + - "\" no corresponding construction (ref Construction) has been found in the input file."); - ErrorsFound = true; - } else { - state.dataSurface->FenLayAbsSSG(Loop).ConstrPtr = ConstrNum; - NumOfScheduledLayers = NumAlpha - 3; - NumOfLayersMatch = false; - // Check if number of layers in construction matches number of layers in schedule surface gains object - if (NumOfScheduledLayers == state.dataConstruction->Construct(ConstrNum).TotSolidLayers) { - NumOfLayersMatch = true; - } - - if (!NumOfLayersMatch) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Number of scheduled surface gains for each layer does not match number of layers in " - "referenced construction."); - ShowContinueError(state, - format("{} have {} schedule layers and {} have {} layers.", - state.dataIPShortCut->cAlphaArgs(1), - NumOfScheduledLayers, - state.dataIPShortCut->cAlphaArgs(3), - state.dataConstruction->Construct(ConstrNum).TotSolidLayers)); - ErrorsFound = true; - } - - if (!allocated(state.dataSurface->FenLayAbsSSG(Loop).SchedPtrs)) { - state.dataSurface->FenLayAbsSSG(Loop).SchedPtrs.allocate(NumOfScheduledLayers); - } - - state.dataSurface->FenLayAbsSSG(Loop).NumOfSched = NumOfScheduledLayers; - - for (i = 1; i <= NumOfScheduledLayers; ++i) { - ScheduleNum = GetScheduleIndex(state, state.dataIPShortCut->cAlphaArgs(i + 3)); - if (ScheduleNum == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(NumOfScheduledLayers + 3) + - " has been found."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(NumOfScheduledLayers + 3) + " entered value = \"" + - state.dataIPShortCut->cAlphaArgs(NumOfScheduledLayers + 3) + - "\" no corresponding schedule has been found in the input file."); - ErrorsFound = true; - } else { - state.dataSurface->FenLayAbsSSG(Loop).SchedPtrs(i) = ScheduleNum; - } - } - } - } - } - - // Check if scheduled surface gains are assigined to each surface in every zone. If not then warning message to user will be - // issued - if ((state.dataSurface->TotSurfIncSolSSG > 0) || (state.dataSurface->TotFenLayAbsSSG > 0)) { - for (iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) { - CheckScheduledSurfaceGains(state, iZone); - } - } - } - - void CheckScheduledSurfaceGains(EnergyPlusData &state, int const ZoneNum) // Zone number for which error check will be performed - { - - // SUBROUTINE INFORMATION: - // AUTHOR Simon Vidanovic - // DATE WRITTEN July 2013 - // MODIFIED - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // Check if all surfaces within zone are scheduled with surface gains. If not all surfaces within zone are scheduled, - // warning message will be issued and program will continue to execute. - - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - - // Using/Aliasing - using SolarShading::SurfaceScheduledSolarInc; - using SolarShading::WindowScheduledSolarAbs; - using namespace DataSurfaces; - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - - // SUBROUTINE PARAMETER DEFINITIONS: - // na - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int SchedPtr; // scheduled surface gains pointer - bool ZoneUnscheduled; // true if all surfaces in the zone are unscheduled - bool ZoneScheduled; // true if all surfaces in the zone are scheduled - - ZoneUnscheduled = false; - ZoneScheduled = false; - - bool firstZoneSurface = true; - for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) { - auto &thisSpace = state.dataHeatBal->space(spaceNum); - for (int iSurf = thisSpace.HTSurfaceFirst; iSurf <= thisSpace.HTSurfaceLast; ++iSurf) { - int iConst = state.dataSurface->Surface(iSurf).Construction; - if (state.dataSurface->Surface(iSurf).Class == SurfaceClass::Window) { - SchedPtr = WindowScheduledSolarAbs(state, iSurf, iConst); - } else { - SchedPtr = SurfaceScheduledSolarInc(state, iSurf, iConst); - } - if (firstZoneSurface) { - if (SchedPtr != 0) { - ZoneScheduled = true; - ZoneUnscheduled = false; - } else { - ZoneScheduled = false; - ZoneUnscheduled = true; - } - firstZoneSurface = false; - } else { - if (SchedPtr != 0) { - ZoneUnscheduled = false; - } else { - ZoneScheduled = false; - } - } - } - } - if ((!ZoneScheduled) && (!ZoneUnscheduled)) { - // zone is nor scheduled nor unscheduled - ShowWarningError(state, "Zone " + state.dataHeatBal->Zone(ZoneNum).Name + " does not have all surfaces scheduled with surface gains."); - ShowContinueError(state, - "If at least one surface in the zone is scheduled with surface gains, then all other surfaces within the same zone " - "should be scheduled as well."); - } - - if ((!ZoneScheduled) && (!ZoneUnscheduled)) { - for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) { - auto &thisSpace = state.dataHeatBal->space(spaceNum); - for (int iSurf = thisSpace.HTSurfaceFirst; iSurf <= thisSpace.HTSurfaceLast; ++iSurf) { - int iConst = state.dataSurface->Surface(iSurf).Construction; - if (state.dataSurface->Surface(iSurf).Class == SurfaceClass::Window) { - SchedPtr = WindowScheduledSolarAbs(state, iSurf, iConst); - } else { - SchedPtr = SurfaceScheduledSolarInc(state, iSurf, iConst); - } - - if (SchedPtr == 0) { - ShowContinueError(state, "Surface " + state.dataSurface->Surface(iSurf).Name + " does not have scheduled surface gains."); - } - } - } - } - } - - void CreateTCConstructions(EnergyPlusData &state, [[maybe_unused]] bool &ErrorsFound) // If errors found in input - { - - // SUBROUTINE INFORMATION: - // AUTHOR Tianzhen Hong - // DATE WRITTEN January 2009 - // MODIFIED - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine goes through each TC master construction and creates a complete series - // of the slave thermochromic constructions. - // This subroutine only gets called once in the GetHeatBalanceInput subroutine - // after materials, constructions and building geometry data are read. - - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - - // USE STATEMENTS: - - // Using/Aliasing - using namespace DataStringGlobals; - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - - // SUBROUTINE PARAMETER DEFINITIONS: - // na - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - - int Loop; - int iTC(0); - int iMat(0); - int NumNewConst(0); - int iTCG(0); - - NumNewConst = 0; - for (Loop = 1; Loop <= state.dataHeatBal->TotConstructs; ++Loop) { - if (state.dataConstruction->Construct(Loop).TCFlag == 1) { - iTCG = state.dataMaterial->Material(state.dataConstruction->Construct(Loop).TCLayer).TCParent; - if (iTCG == 0) continue; // hope this was caught already - iMat = state.dataHeatBal->TCGlazings(iTCG).NumGlzMat; - for (iTC = 1; iTC <= iMat; ++iTC) { - ++NumNewConst; - } - } - } - - if (NumNewConst == 0) return; // no need to go further - - // Increase Construct() and copy the extra constructions - state.dataConstruction->Construct.redimension(state.dataHeatBal->TotConstructs + NumNewConst); - state.dataHeatBal->NominalRforNominalUCalculation.redimension(state.dataHeatBal->TotConstructs + NumNewConst); - state.dataHeatBal->NominalU.redimension(state.dataHeatBal->TotConstructs + NumNewConst); - state.dataHeatBal->NominalUBeforeAdjusted.redimension(state.dataHeatBal->TotConstructs + NumNewConst); - state.dataHeatBal->CoeffAdjRatio.redimension(state.dataHeatBal->TotConstructs + NumNewConst) = 1.0; - - NumNewConst = state.dataHeatBal->TotConstructs; - for (Loop = 1; Loop <= state.dataHeatBal->TotConstructs; ++Loop) { - if (state.dataConstruction->Construct(Loop).TCFlag == 1) { - iTCG = state.dataMaterial->Material(state.dataConstruction->Construct(Loop).TCLayer).TCParent; - if (iTCG == 0) continue; // hope this was caught already - iMat = state.dataHeatBal->TCGlazings(iTCG).NumGlzMat; - for (iTC = 1; iTC <= iMat; ++iTC) { - ++NumNewConst; - state.dataConstruction->Construct(NumNewConst) = state.dataConstruction->Construct(Loop); // copy data - state.dataConstruction->Construct(NumNewConst).Name = - format("{}_TC_{:.0R}", state.dataConstruction->Construct(Loop).Name, state.dataHeatBal->TCGlazings(iTCG).SpecTemp(iTC)); - state.dataConstruction->Construct(NumNewConst).TCLayer = state.dataHeatBal->TCGlazings(iTCG).LayerPoint(iTC); - state.dataConstruction->Construct(NumNewConst).LayerPoint(state.dataConstruction->Construct(Loop).TCLayerID) = - state.dataConstruction->Construct(NumNewConst).TCLayer; - state.dataConstruction->Construct(NumNewConst).TCFlag = 1; - state.dataConstruction->Construct(NumNewConst).TCMasterConst = Loop; - state.dataConstruction->Construct(NumNewConst).TCLayerID = state.dataConstruction->Construct(Loop).TCLayerID; - state.dataConstruction->Construct(NumNewConst).TCGlassID = state.dataConstruction->Construct(Loop).TCGlassID; - state.dataConstruction->Construct(NumNewConst).TypeIsWindow = true; - } - } - } - state.dataHeatBal->TotConstructs = NumNewConst; - } - - void SetupSimpleWindowGlazingSystem(EnergyPlusData &state, int &MaterNum) - { - - // SUBROUTINE INFORMATION: - // AUTHOR B. Griffith - // DATE WRITTEN January 2009 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // Convert simple window performance indices into all the properties needed to - // describe a single, equivalent glass layer - - // METHODOLOGY EMPLOYED: - // The simple window indices are converted to a single materal layer using a "block model" - - // REFERENCES: - // draft paper by Arasteh, Kohler, and Griffith - - // USE STATEMENTS: - // na - - // Locals - // SUBROUTINE ARGUMENT DEFINITIONS: - - // SUBROUTINE PARAMETER DEFINITIONS: - // na - - // INTERFACE BLOCK SPECIFICATIONS: - // na - - // DERIVED TYPE DEFINITIONS: - // na - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 Riw(0.0); // thermal resistance of interior film coefficient under winter conditions (m2-K/W) - Real64 Row(0.0); // theraml resistance of exterior film coefficient under winter conditions (m2-K/W) - Real64 Rlw(0.0); // thermal resistance of block model layer (m2-K/W) - Real64 Ris(0.0); // thermal resistance of interior film coefficient under summer conditions (m2-K/W) - Real64 Ros(0.0); // theraml resistance of exterior film coefficient under summer conditions (m2-K/W) - Real64 InflowFraction(0.0); // inward flowing fraction for SHGC, intermediate value non dimensional - Real64 SolarAbsorb(0.0); // solar aborptance - bool ErrorsFound(false); - Real64 TsolLowSide(0.0); // intermediate solar transmission for interpolating - Real64 TsolHiSide(0.0); // intermediate solar transmission for interpolating - Real64 DeltaSHGCandTsol(0.0); // intermediate difference - Real64 RLowSide(0.0); - Real64 RHiSide(0.0); - - // first fill out defaults - state.dataMaterial->Material(MaterNum).GlassSpectralDataPtr = 0; - state.dataMaterial->Material(MaterNum).SolarDiffusing = false; - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::VerySmooth; - state.dataMaterial->Material(MaterNum).TransThermal = 0.0; - state.dataMaterial->Material(MaterNum).AbsorpThermalBack = 0.84; - state.dataMaterial->Material(MaterNum).AbsorpThermalFront = 0.84; - state.dataMaterial->Material(MaterNum).AbsorpThermal = state.dataMaterial->Material(MaterNum).AbsorpThermalBack; - - // step 1. Determine U-factor without film coefficients - // Simple window model has its own correlation for film coefficients (m2-K/W) under Winter conditions as function of U-factor - if (state.dataMaterial->Material(MaterNum).SimpleWindowUfactor < 5.85) { - Riw = 1.0 / (0.359073 * std::log(state.dataMaterial->Material(MaterNum).SimpleWindowUfactor) + 6.949915); - } else { - Riw = 1.0 / (1.788041 * state.dataMaterial->Material(MaterNum).SimpleWindowUfactor - 2.886625); - } - Row = 1.0 / (0.025342 * state.dataMaterial->Material(MaterNum).SimpleWindowUfactor + 29.163853); - - // determine 1/U without film coefficients - Rlw = (1.0 / state.dataMaterial->Material(MaterNum).SimpleWindowUfactor) - Riw - Row; - if (Rlw <= 0.0) { // U factor of film coefficients is better than user input. - Rlw = max(Rlw, 0.001); - ShowWarningError(state, - "WindowMaterial:SimpleGlazingSystem: " + state.dataMaterial->Material(MaterNum).Name + - " has U-factor higher than that provided by surface film resistances, Check value of U-factor"); - } - - // Step 2. determine layer thickness. - - if ((1.0 / Rlw) > 7.0) { - state.dataMaterial->Material(MaterNum).Thickness = 0.002; - } else { - state.dataMaterial->Material(MaterNum).Thickness = 0.05914 - (0.00714 / Rlw); - } - - // Step 3. determine effective conductivity - - state.dataMaterial->Material(MaterNum).Conductivity = state.dataMaterial->Material(MaterNum).Thickness / Rlw; - if (state.dataMaterial->Material(MaterNum).Conductivity > 0.0) { - state.dataHeatBal->NominalR(MaterNum) = Rlw; - state.dataMaterial->Material(MaterNum).Resistance = Rlw; - } else { - ErrorsFound = true; - ShowSevereError(state, - "WindowMaterial:SimpleGlazingSystem: " + state.dataMaterial->Material(MaterNum).Name + - " has Conductivity <= 0.0, must be >0.0, Check value of U-factor"); - } - - // step 4. determine solar transmission (revised to 10-1-2009 version from LBNL.) - - if (state.dataMaterial->Material(MaterNum).SimpleWindowUfactor > 4.5) { - - if (state.dataMaterial->Material(MaterNum).SimpleWindowSHGC < 0.7206) { - - state.dataMaterial->Material(MaterNum).Trans = 0.939998 * pow_2(state.dataMaterial->Material(MaterNum).SimpleWindowSHGC) + - 0.20332 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC; - } else { // >= 0.7206 - - state.dataMaterial->Material(MaterNum).Trans = 1.30415 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC - 0.30515; - } - - } else if (state.dataMaterial->Material(MaterNum).SimpleWindowUfactor < 3.4) { - - if (state.dataMaterial->Material(MaterNum).SimpleWindowSHGC <= 0.15) { - state.dataMaterial->Material(MaterNum).Trans = 0.41040 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC; - } else { // > 0.15 - state.dataMaterial->Material(MaterNum).Trans = 0.085775 * pow_2(state.dataMaterial->Material(MaterNum).SimpleWindowSHGC) + - 0.963954 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC - 0.084958; - } - } else { // interpolate. 3.4 <= Ufactor <= 4.5 - - if (state.dataMaterial->Material(MaterNum).SimpleWindowSHGC < 0.7206) { - TsolHiSide = 0.939998 * pow_2(state.dataMaterial->Material(MaterNum).SimpleWindowSHGC) + - 0.20332 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC; - } else { // >= 0.7206 - TsolHiSide = 1.30415 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC - 0.30515; - } - - if (state.dataMaterial->Material(MaterNum).SimpleWindowSHGC <= 0.15) { - TsolLowSide = 0.41040 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC; - } else { // > 0.15 - TsolLowSide = 0.085775 * pow_2(state.dataMaterial->Material(MaterNum).SimpleWindowSHGC) + - 0.963954 * state.dataMaterial->Material(MaterNum).SimpleWindowSHGC - 0.084958; - } - - state.dataMaterial->Material(MaterNum).Trans = - ((state.dataMaterial->Material(MaterNum).SimpleWindowUfactor - 3.4) / (4.5 - 3.4)) * (TsolHiSide - TsolLowSide) + TsolLowSide; - } - if (state.dataMaterial->Material(MaterNum).Trans < 0.0) state.dataMaterial->Material(MaterNum).Trans = 0.0; - - // step 5. determine solar reflectances - - DeltaSHGCandTsol = state.dataMaterial->Material(MaterNum).SimpleWindowSHGC - state.dataMaterial->Material(MaterNum).Trans; - - if (state.dataMaterial->Material(MaterNum).SimpleWindowUfactor > 4.5) { - - Ris = 1.0 / (29.436546 * pow_3(DeltaSHGCandTsol) - 21.943415 * pow_2(DeltaSHGCandTsol) + 9.945872 * DeltaSHGCandTsol + 7.426151); - Ros = 1.0 / (2.225824 * DeltaSHGCandTsol + 20.577080); - } else if (state.dataMaterial->Material(MaterNum).SimpleWindowUfactor < 3.4) { - - Ris = 1.0 / (199.8208128 * pow_3(DeltaSHGCandTsol) - 90.639733 * pow_2(DeltaSHGCandTsol) + 19.737055 * DeltaSHGCandTsol + 6.766575); - Ros = 1.0 / (5.763355 * DeltaSHGCandTsol + 20.541528); - } else { // interpolate. 3.4 <= Ufactor <= 4.5 - // inside first - RLowSide = 1.0 / (199.8208128 * pow_3(DeltaSHGCandTsol) - 90.639733 * pow_2(DeltaSHGCandTsol) + 19.737055 * DeltaSHGCandTsol + 6.766575); - RHiSide = 1.0 / (29.436546 * pow_3(DeltaSHGCandTsol) - 21.943415 * pow_2(DeltaSHGCandTsol) + 9.945872 * DeltaSHGCandTsol + 7.426151); - Ris = ((state.dataMaterial->Material(MaterNum).SimpleWindowUfactor - 3.4) / (4.5 - 3.4)) * (RLowSide - RHiSide) + RLowSide; - // then outside - RLowSide = 1.0 / (5.763355 * DeltaSHGCandTsol + 20.541528); - RHiSide = 1.0 / (2.225824 * DeltaSHGCandTsol + 20.577080); - Ros = ((state.dataMaterial->Material(MaterNum).SimpleWindowUfactor - 3.4) / (4.5 - 3.4)) * (RLowSide - RHiSide) + RLowSide; - } - - InflowFraction = (Ros + 0.5 * Rlw) / (Ros + Rlw + Ris); - - SolarAbsorb = (state.dataMaterial->Material(MaterNum).SimpleWindowSHGC - state.dataMaterial->Material(MaterNum).Trans) / InflowFraction; - state.dataMaterial->Material(MaterNum).ReflectSolBeamBack = 1.0 - state.dataMaterial->Material(MaterNum).Trans - SolarAbsorb; - state.dataMaterial->Material(MaterNum).ReflectSolBeamFront = state.dataMaterial->Material(MaterNum).ReflectSolBeamBack; - - // step 6. determine visible properties. - if (state.dataMaterial->Material(MaterNum).SimpleWindowVTinputByUser) { - state.dataMaterial->Material(MaterNum).TransVis = state.dataMaterial->Material(MaterNum).SimpleWindowVisTran; - state.dataMaterial->Material(MaterNum).ReflectVisBeamBack = -0.7409 * pow_3(state.dataMaterial->Material(MaterNum).TransVis) + - 1.6531 * pow_2(state.dataMaterial->Material(MaterNum).TransVis) - - 1.2299 * state.dataMaterial->Material(MaterNum).TransVis + 0.4545; - if (state.dataMaterial->Material(MaterNum).TransVis + state.dataMaterial->Material(MaterNum).ReflectVisBeamBack >= 1.0) { - state.dataMaterial->Material(MaterNum).ReflectVisBeamBack = 0.999 - state.dataMaterial->Material(MaterNum).TransVis; - } - - state.dataMaterial->Material(MaterNum).ReflectVisBeamFront = -0.0622 * pow_3(state.dataMaterial->Material(MaterNum).TransVis) + - 0.4277 * pow_2(state.dataMaterial->Material(MaterNum).TransVis) - - 0.4169 * state.dataMaterial->Material(MaterNum).TransVis + 0.2399; - if (state.dataMaterial->Material(MaterNum).TransVis + state.dataMaterial->Material(MaterNum).ReflectVisBeamFront >= 1.0) { - state.dataMaterial->Material(MaterNum).ReflectVisBeamFront = 0.999 - state.dataMaterial->Material(MaterNum).TransVis; - } - } else { - state.dataMaterial->Material(MaterNum).TransVis = state.dataMaterial->Material(MaterNum).Trans; - state.dataMaterial->Material(MaterNum).ReflectVisBeamBack = state.dataMaterial->Material(MaterNum).ReflectSolBeamBack; - state.dataMaterial->Material(MaterNum).ReflectVisBeamFront = state.dataMaterial->Material(MaterNum).ReflectSolBeamFront; - } - - // step 7. The dependence on incident angle is in subroutine TransAndReflAtPhi - - // step 8. Hemispherical terms are averaged using standard method - - if (ErrorsFound) { - ShowFatalError(state, "Program halted because of input problem(s) in WindowMaterial:SimpleGlazingSystem"); - } - } - - void SetupComplexFenestrationMaterialInput(EnergyPlusData &state, - int &MaterNum, // num of material items thus far - bool &ErrorsFound) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Simon Vidanovic - // DATE WRITTEN March 2012 - // MODIFIED May 2013 (Simon Vidanovic) - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // get input for complex fenestration materials - - // METHODOLOGY EMPLOYED: - // usual GetInput processing. - - // REFERENCES: - // na - - // Using/Aliasing - - // SUBROUTINE ARGUMENT DEFINITIONS: - - // Locals - // SUBROUTINE PARAMETER DEFINITIONS - constexpr const char *RoutineName("SetupComplexFenestrationMaterialInput: "); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Array1D_string MaterialNames(5); // Number of Material Alpha names defined - Array1D MaterialProps(27); // Temporary array to transfer material properties - int Loop; - int NumAlphas; // Number of Alphas for each GetObjectItem call - int NumNumbers; // Number of Numbers for each GetObjectItem call - int IOStatus; // Used in GetObjectItem - - // Reading WindowGap:SupportPillar - auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; - cCurrentModuleObject = "WindowGap:SupportPillar"; - state.dataHeatBal->W7SupportPillars = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - state.dataHeatBal->SupportPillar.allocate(state.dataHeatBal->W7SupportPillars); - for (Loop = 1; Loop <= state.dataHeatBal->W7SupportPillars; ++Loop) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Loop, - state.dataIPShortCut->cAlphaArgs, - NumAlphas, - state.dataIPShortCut->rNumericArgs, - NumNumbers, - IOStatus, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(1) + " has been found."); - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - state.dataHeatBal->SupportPillar(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); - state.dataHeatBal->SupportPillar(Loop).Spacing = state.dataIPShortCut->rNumericArgs(1); - state.dataHeatBal->SupportPillar(Loop).Radius = state.dataIPShortCut->rNumericArgs(2); - - if (state.dataIPShortCut->rNumericArgs(1) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(1) + " has been found."); - ShowContinueError(state, - format("{} must be > 0, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(1), - state.dataIPShortCut->rNumericArgs(1))); - } - - if (state.dataIPShortCut->rNumericArgs(2) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(2) + " has been found."); - ShowContinueError(state, - format("{} must be > 0, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(2), - state.dataIPShortCut->rNumericArgs(2))); - } - } - - // Reading WindowGap:DeflectionState - cCurrentModuleObject = "WindowGap:DeflectionState"; - state.dataHeatBal->W7DeflectionStates = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - state.dataHeatBal->DeflectionState.allocate(state.dataHeatBal->W7DeflectionStates); - for (Loop = 1; Loop <= state.dataHeatBal->W7DeflectionStates; ++Loop) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Loop, - state.dataIPShortCut->cAlphaArgs, - NumAlphas, - state.dataIPShortCut->rNumericArgs, - NumNumbers, - IOStatus, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(1) + " has been found."); - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - state.dataHeatBal->DeflectionState(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); - state.dataHeatBal->DeflectionState(Loop).DeflectedThickness = state.dataIPShortCut->rNumericArgs(1); - if (state.dataIPShortCut->rNumericArgs(1) < 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(1) + " has been found."); - ShowContinueError(state, - format("{} must be >= 0, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(1), - state.dataIPShortCut->rNumericArgs(1))); - } - } - - // Reading WindowMaterial:Gap - - cCurrentModuleObject = "WindowMaterial:Gap"; - state.dataHeatBal->W7MaterialGaps = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - // ALLOCATE(DeflectionState(W7DeflectionStates)) - for (Loop = 1; Loop <= state.dataHeatBal->W7MaterialGaps; ++Loop) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Loop, - state.dataIPShortCut->cAlphaArgs, - NumAlphas, - state.dataIPShortCut->rNumericArgs, - NumNumbers, - IOStatus, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueMaterialNames, - state.dataIPShortCut->cAlphaArgs(1), - state.dataHeatBalMgr->CurrentModuleObject, - state.dataIPShortCut->cAlphaFieldNames(1), - ErrorsFound)) { - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::ComplexWindowGap; - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::Rough; - state.dataMaterial->Material(MaterNum).ROnly = true; - - state.dataMaterial->Material(MaterNum).Name = state.dataIPShortCut->cAlphaArgs(1); - - state.dataMaterial->Material(MaterNum).Thickness = state.dataIPShortCut->rNumericArgs(1); - if (state.dataIPShortCut->rNumericArgs(1) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(1) + " has been found."); - ShowContinueError( - state, - format("{} must be > 0, entered {:.2R}", state.dataIPShortCut->cNumericFieldNames(1), state.dataIPShortCut->rNumericArgs(1))); - } - - state.dataMaterial->Material(MaterNum).Pressure = state.dataIPShortCut->rNumericArgs(2); - if (state.dataIPShortCut->rNumericArgs(2) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(2) + " has been found."); - ShowContinueError( - state, - format("{} must be > 0, entered {:.2R}", state.dataIPShortCut->cNumericFieldNames(2), state.dataIPShortCut->rNumericArgs(2))); - } - - if (!state.dataIPShortCut->lAlphaFieldBlanks(2)) { - state.dataMaterial->Material(MaterNum).GasPointer = - UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(2), state.dataMaterial->Material); - } else { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(1) + " has been found."); - ShowContinueError(state, cCurrentModuleObject + " does not have assigned WindowMaterial:Gas or WindowMaterial:GasMixutre."); - } - if (!state.dataIPShortCut->lAlphaFieldBlanks(3)) { - state.dataMaterial->Material(MaterNum).DeflectionStatePtr = - UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(3), state.dataHeatBal->DeflectionState); - } - if (!state.dataIPShortCut->lAlphaFieldBlanks(4)) { - state.dataMaterial->Material(MaterNum).SupportPillarPtr = - UtilityRoutines::FindItemInList(state.dataIPShortCut->cAlphaArgs(4), state.dataHeatBal->SupportPillar); - } - } - - // Reading WindowMaterial:ComplexShade - cCurrentModuleObject = "WindowMaterial:ComplexShade"; - state.dataHeatBal->TotComplexShades = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataHeatBal->TotComplexShades > 0) { - state.dataHeatBal->ComplexShade.allocate(state.dataHeatBal->TotComplexShades); // Allocate the array Size to the number of complex shades - } - - for (Loop = 1; Loop <= state.dataHeatBal->TotComplexShades; ++Loop) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Loop, - state.dataIPShortCut->cAlphaArgs, - NumAlphas, - state.dataIPShortCut->rNumericArgs, - NumNumbers, - IOStatus, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), state.dataHeatBalMgr->CurrentModuleObject, ErrorsFound)) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(1) + " has been found."); - ShowContinueError(state, "...All Material names must be unique regardless of subtype."); - continue; - } - - ++MaterNum; - state.dataMaterial->Material(MaterNum).Group = DataHeatBalance::MaterialGroup::ComplexWindowShade; - state.dataMaterial->Material(MaterNum).Roughness = DataSurfaces::SurfaceRoughness::Rough; - state.dataMaterial->Material(MaterNum).ROnly = true; - - // Assign pointer to ComplexShade - state.dataMaterial->Material(MaterNum).ComplexShadePtr = Loop; - - state.dataMaterial->Material(MaterNum).Name = state.dataIPShortCut->cAlphaArgs(1); - state.dataHeatBal->ComplexShade(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); - - { - auto const SELECT_CASE_var(state.dataIPShortCut->cAlphaArgs(2)); - - if (SELECT_CASE_var == "OTHERSHADINGTYPE") { - state.dataHeatBal->ComplexShade(Loop).LayerType = TARCOGParams::TARCOGLayerType::DIFFSHADE; - } else if (SELECT_CASE_var == "VENETIANHORIZONTAL") { - state.dataHeatBal->ComplexShade(Loop).LayerType = TARCOGParams::TARCOGLayerType::VENETBLIND_HORIZ; - } else if (SELECT_CASE_var == "VENETIANVERTICAL") { - state.dataHeatBal->ComplexShade(Loop).LayerType = TARCOGParams::TARCOGLayerType::VENETBLIND_VERT; - } else if (SELECT_CASE_var == "WOVEN") { - state.dataHeatBal->ComplexShade(Loop).LayerType = TARCOGParams::TARCOGLayerType::WOVSHADE; - } else if (SELECT_CASE_var == "PERFORATED") { - state.dataHeatBal->ComplexShade(Loop).LayerType = TARCOGParams::TARCOGLayerType::PERFORATED; - } else if (SELECT_CASE_var == "BSDF") { - state.dataHeatBal->ComplexShade(Loop).LayerType = TARCOGParams::TARCOGLayerType::BSDF; - } else { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(2) + " has been found."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(2) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(2) + - "\" should be OtherShadingType, Venetian, Woven, Perforated or BSDF."); - } - } - - state.dataHeatBal->ComplexShade(Loop).Thickness = state.dataIPShortCut->rNumericArgs(1); - state.dataMaterial->Material(MaterNum).Thickness = state.dataIPShortCut->rNumericArgs(1); - state.dataHeatBal->ComplexShade(Loop).Conductivity = state.dataIPShortCut->rNumericArgs(2); - state.dataMaterial->Material(MaterNum).Conductivity = state.dataIPShortCut->rNumericArgs(2); - state.dataHeatBal->ComplexShade(Loop).IRTransmittance = state.dataIPShortCut->rNumericArgs(3); - state.dataHeatBal->ComplexShade(Loop).FrontEmissivity = state.dataIPShortCut->rNumericArgs(4); - state.dataHeatBal->ComplexShade(Loop).BackEmissivity = state.dataIPShortCut->rNumericArgs(5); - - // Simon: in heat balance radiation exchange routines AbsorpThermal is used - // and program will crash if value is not assigned. Not sure if this is correct - // or some additional calculation is necessary. Simon TODO - state.dataMaterial->Material(MaterNum).AbsorpThermal = state.dataIPShortCut->rNumericArgs(5); - state.dataMaterial->Material(MaterNum).AbsorpThermalFront = state.dataIPShortCut->rNumericArgs(4); - state.dataMaterial->Material(MaterNum).AbsorpThermalBack = state.dataIPShortCut->rNumericArgs(5); - - state.dataHeatBal->ComplexShade(Loop).TopOpeningMultiplier = state.dataIPShortCut->rNumericArgs(6); - state.dataHeatBal->ComplexShade(Loop).BottomOpeningMultiplier = state.dataIPShortCut->rNumericArgs(7); - state.dataHeatBal->ComplexShade(Loop).LeftOpeningMultiplier = state.dataIPShortCut->rNumericArgs(8); - state.dataHeatBal->ComplexShade(Loop).RightOpeningMultiplier = state.dataIPShortCut->rNumericArgs(9); - state.dataHeatBal->ComplexShade(Loop).FrontOpeningMultiplier = state.dataIPShortCut->rNumericArgs(10); - - state.dataHeatBal->ComplexShade(Loop).SlatWidth = state.dataIPShortCut->rNumericArgs(11); - state.dataHeatBal->ComplexShade(Loop).SlatSpacing = state.dataIPShortCut->rNumericArgs(12); - state.dataHeatBal->ComplexShade(Loop).SlatThickness = state.dataIPShortCut->rNumericArgs(13); - state.dataHeatBal->ComplexShade(Loop).SlatAngle = state.dataIPShortCut->rNumericArgs(14); - state.dataHeatBal->ComplexShade(Loop).SlatConductivity = state.dataIPShortCut->rNumericArgs(15); - state.dataHeatBal->ComplexShade(Loop).SlatCurve = state.dataIPShortCut->rNumericArgs(16); - - // IF (dataMaterial.Material(MaterNum)%Conductivity > 0.0) THEN - // NominalR(MaterNum)=dataMaterial.Material(MaterNum)%Thickness/dataMaterial.Material(MaterNum)%Conductivity - // ELSE - // NominalR(MaterNum)=1.0 - // ENDIF - - if (state.dataIPShortCut->rNumericArgs(1) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(1) + " has been found."); - ShowContinueError(state, - format("{} must be > 0, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(1), - state.dataIPShortCut->rNumericArgs(1))); - } - - if (state.dataIPShortCut->rNumericArgs(2) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(2) + " has been found."); - ShowContinueError(state, - format("{} must be > 0, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(2), - state.dataIPShortCut->rNumericArgs(2))); - } - - if ((state.dataIPShortCut->rNumericArgs(3) < 0.0) || (state.dataIPShortCut->rNumericArgs(3) > 1.0)) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(3) + " has been found."); - ShowContinueError(state, - format("{} value must be >= 0 and <= 1, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(3), - state.dataIPShortCut->rNumericArgs(3))); - } - - if ((state.dataIPShortCut->rNumericArgs(4) <= 0.0) || (state.dataIPShortCut->rNumericArgs(4) > 1.0)) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(4) + " has been found."); - ShowContinueError(state, - format("{} value must be >= 0 and <= 1, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(4), - state.dataIPShortCut->rNumericArgs(4))); - } - - if ((state.dataIPShortCut->rNumericArgs(5) <= 0.0) || (state.dataIPShortCut->rNumericArgs(5) > 1.0)) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(5) + " has been found."); - ShowContinueError(state, - format("{} value must be >= 0 and <= 1, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(5), - state.dataIPShortCut->rNumericArgs(5))); - } - - if ((state.dataIPShortCut->rNumericArgs(6) < 0.0) || (state.dataIPShortCut->rNumericArgs(6) > 1.0)) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(6) + " has been found."); - ShowContinueError(state, - format("{} must be >= 0 or <= 1, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(6), - state.dataIPShortCut->rNumericArgs(6))); - } - - if ((state.dataIPShortCut->rNumericArgs(7) < 0.0) || (state.dataIPShortCut->rNumericArgs(7) > 1.0)) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(7) + " has been found."); - ShowContinueError(state, - format("{} must be >=0 or <=1, entered {:.2R}", - state.dataIPShortCut->cNumericFieldNames(7), - state.dataIPShortCut->rNumericArgs(7))); - } - - if ((state.dataIPShortCut->rNumericArgs(8) < 0.0) || (state.dataIPShortCut->rNumericArgs(8) > 1.0)) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(8) + " has been found."); - ShowContinueError(state, - format("{} must be >=0 or <=1, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(8), - state.dataIPShortCut->rNumericArgs(8))); - } - - if ((state.dataIPShortCut->rNumericArgs(9) < 0.0) || (state.dataIPShortCut->rNumericArgs(9) > 1.0)) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(9) + " has been found."); - ShowContinueError(state, - format("{} must be >=0 or <=1, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(9), - state.dataIPShortCut->rNumericArgs(9))); - } - - if ((state.dataIPShortCut->rNumericArgs(10) < 0.0) || (state.dataIPShortCut->rNumericArgs(10) > 1.0)) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(10) + " has been found."); - ShowContinueError(state, - format("{} must be >=0 or <=1, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(10), - state.dataIPShortCut->rNumericArgs(10))); - } - - if (BITF_TEST_ANY(BITF(state.dataHeatBal->ComplexShade(Loop).LayerType), - BITF(TARCOGParams::TARCOGLayerType::VENETBLIND_HORIZ) | BITF(TARCOGParams::TARCOGLayerType::VENETBLIND_HORIZ))) { - if (state.dataIPShortCut->rNumericArgs(11) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(11) + " has been found."); - ShowContinueError(state, - format("{} must be >0, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(11), - state.dataIPShortCut->rNumericArgs(11))); - } - - if (state.dataIPShortCut->rNumericArgs(12) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(12) + " has been found."); - ShowContinueError(state, - format("{} must be >0, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(12), - state.dataIPShortCut->rNumericArgs(12))); - } - - if (state.dataIPShortCut->rNumericArgs(13) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(13) + " has been found."); - ShowContinueError(state, - format("{} must be >0, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(13), - state.dataIPShortCut->rNumericArgs(13))); - } - - if ((state.dataIPShortCut->rNumericArgs(14) < -90.0) || (state.dataIPShortCut->rNumericArgs(14) > 90.0)) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(14) + " has been found."); - ShowContinueError(state, - format("{} must be >=-90 and <=90, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(14), - state.dataIPShortCut->rNumericArgs(14))); - } - - if (state.dataIPShortCut->rNumericArgs(15) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(15) + " has been found."); - ShowContinueError(state, - format("{} must be >0, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(15), - state.dataIPShortCut->rNumericArgs(15))); - } - - if ((state.dataIPShortCut->rNumericArgs(16) < 0.0) || - ((state.dataIPShortCut->rNumericArgs(16) > 0.0) && - (state.dataIPShortCut->rNumericArgs(16) < (state.dataIPShortCut->rNumericArgs(11) / 2)))) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(16) + " has been found."); - ShowContinueError(state, - format("{} must be =0 or greater than SlatWidth/2, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(16), - state.dataIPShortCut->rNumericArgs(16))); - } - } - - if (ErrorsFound) ShowFatalError(state, "Error in complex fenestration material input."); - } - } - - void SetupComplexFenestrationStateInput(EnergyPlusData &state, - int &ConstrNum, // num of construction items thus far - bool &ErrorsFound) - { - - // SUBROUTINE INFORMATION: - // AUTHOR B. Griffith - // DATE WRITTEN June 2010 - // MODIFIED January 2012 (Simon Vidanovic) - // MODIFIED May 2012 (Simon Vidanovic) - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // get input for complex fenestration construction - - // METHODOLOGY EMPLOYED: - // usual GetInput processing. Matrix input from MatrixDataManager - - // Using/Aliasing - using namespace MatrixDataManager; - using namespace DataBSDFWindow; - - // SUBROUTINE PARAMETER DEFINITIONS: - constexpr const char *RoutineName("SetupComlexFenestrationStateInput: "); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - // The following moved to DataBSDFWindow module: - // INTEGER :: TotComplexFenStates ! Number of complex fenestration construction definitions - int I; // do loop index - int Loop; // do loop counter - int NumAlphas; // Number of Alphas for each GetObjectItem call - int NumNumbers; // Number of Numbers for each GetObjectItem call - int TotalArgs; // Number of fields for each GetObjectItem call - int IOStatus; // Used in GetObjectItem - int iMatGlass; // number of glass layers - int NumRows; // temporary size of matrix - int NumCols; // temporary size of matrix - int NBasis; // temporary number of elements in basis - int Layer; // loop counter for material layers - int AlphaIndex; - int ThermalModelNum; // number of thermal model parameters object - int NumOfTotalLayers; // total number of layers in the construction - int NumOfOpticalLayers; // number of optical layers in the construction (excluding gasses and gas mixtures) - int currentOpticalLayer; // current optical layer number. This is important since optical structures should - // be loaded only with optical layers - - // When reading Construction:ComplexFenestrationState, there is a call of GetMatrix2D which also uses same - // variables from DataIPShortCuts. Since this can cause some errors in reading, it is important - // to declare local variables for reading Construction:ComplexFenestrationState object(s) - Array1D_string locAlphaFieldNames; - Array1D_string locNumericFieldNames; - Array1D_bool locNumericFieldBlanks; - Array1D_bool locAlphaFieldBlanks; - Array1D_string locAlphaArgs; - Array1D locNumericArgs; - std::string locCurrentModuleObject; - auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; - // Reading WindowThermalModel:Params - cCurrentModuleObject = "WindowThermalModel:Params"; - state.dataBSDFWindow->TotThermalModels = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - state.dataHeatBal->WindowThermalModel.allocate(state.dataBSDFWindow->TotThermalModels); - - for (Loop = 1; Loop <= state.dataBSDFWindow->TotThermalModels; ++Loop) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Loop, - state.dataIPShortCut->cAlphaArgs, - NumAlphas, - state.dataIPShortCut->rNumericArgs, - NumNumbers, - IOStatus, - state.dataIPShortCut->lNumericFieldBlanks, - _, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (UtilityRoutines::IsNameEmpty(state, state.dataIPShortCut->cAlphaArgs(1), cCurrentModuleObject, ErrorsFound)) continue; - - state.dataHeatBal->WindowThermalModel(Loop).Name = state.dataIPShortCut->cAlphaArgs(1); - - state.dataHeatBal->WindowThermalModel(Loop).SDScalar = state.dataIPShortCut->rNumericArgs(1); - if ((state.dataIPShortCut->rNumericArgs(1) < 0.0) || (state.dataIPShortCut->rNumericArgs(1) > 1.0)) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(1) + " has been found."); - ShowContinueError(state, - format("{} should be >= 0.0 and <= 1.0, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(1), - state.dataIPShortCut->rNumericArgs(1))); - } - - { - auto const SELECT_CASE_var(state.dataIPShortCut->cAlphaArgs(2)); - if (SELECT_CASE_var == "ISO15099") { - state.dataHeatBal->WindowThermalModel(Loop).CalculationStandard = TARCOGGassesParams::Stdrd::ISO15099; - } else if (SELECT_CASE_var == "EN673DECLARED") { - state.dataHeatBal->WindowThermalModel(Loop).CalculationStandard = TARCOGGassesParams::Stdrd::EN673; - } else if (SELECT_CASE_var == "EN673DESIGN") { - state.dataHeatBal->WindowThermalModel(Loop).CalculationStandard = TARCOGGassesParams::Stdrd::EN673Design; - } else { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(2) + " has been found."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(2) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(2) + - "\" should be ISO15099, EN673Declared or EN673Design."); - } - } - - { - auto const SELECT_CASE_var(state.dataIPShortCut->cAlphaArgs(3)); - if (SELECT_CASE_var == "ISO15099") { - state.dataHeatBal->WindowThermalModel(Loop).ThermalModel = TARCOGParams::TARCOGThermalModel::ISO15099; - } else if (SELECT_CASE_var == "SCALEDCAVITYWIDTH") { - state.dataHeatBal->WindowThermalModel(Loop).ThermalModel = TARCOGParams::TARCOGThermalModel::SCW; - } else if (SELECT_CASE_var == "CONVECTIVESCALARMODEL_NOSDTHICKNESS") { - state.dataHeatBal->WindowThermalModel(Loop).ThermalModel = TARCOGParams::TARCOGThermalModel::CSM; - } else if (SELECT_CASE_var == "CONVECTIVESCALARMODEL_WITHSDTHICKNESS") { - state.dataHeatBal->WindowThermalModel(Loop).ThermalModel = TARCOGParams::TARCOGThermalModel::CSM_WithSDThickness; - } else { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(3) + " has been found."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(3) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(3) + - "\" should be ISO15099, ScaledCavityWidth, ConvectiveScalarModel_NoSDThickness or " - "ConvectiveScalarModel_WithSDThickness."); - } - } - - { - auto const SELECT_CASE_var(state.dataIPShortCut->cAlphaArgs(4)); - if (SELECT_CASE_var == "NODEFLECTION") { - state.dataHeatBal->WindowThermalModel(Loop).DeflectionModel = TARCOGParams::DeflectionCalculation::NONE; - } else if (SELECT_CASE_var == "TEMPERATUREANDPRESSUREINPUT") { - state.dataHeatBal->WindowThermalModel(Loop).DeflectionModel = TARCOGParams::DeflectionCalculation::TEMPERATURE; - } else if (SELECT_CASE_var == "MEASUREDDEFLECTION") { - state.dataHeatBal->WindowThermalModel(Loop).DeflectionModel = TARCOGParams::DeflectionCalculation::GAP_WIDTHS; - } else { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cAlphaFieldNames(4) + " has been found."); - ShowContinueError(state, - state.dataIPShortCut->cAlphaFieldNames(4) + " entered value = \"" + state.dataIPShortCut->cAlphaArgs(4) + - "\" should be NoDeflection, TemperatureAndPressureInput or MeasuredDeflection."); - } - } - - if (state.dataHeatBal->WindowThermalModel(Loop).DeflectionModel == TARCOGParams::DeflectionCalculation::TEMPERATURE) { - state.dataHeatBal->WindowThermalModel(Loop).VacuumPressureLimit = state.dataIPShortCut->rNumericArgs(2); - if (state.dataIPShortCut->rNumericArgs(2) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(2) + " has been found."); - ShowContinueError(state, - format("{} must be > 0, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(2), - state.dataIPShortCut->rNumericArgs(2))); - } - - state.dataHeatBal->WindowThermalModel(Loop).InitialTemperature = state.dataIPShortCut->rNumericArgs(3); - if (state.dataIPShortCut->rNumericArgs(3) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(3) + " has been found."); - ShowContinueError(state, - format("{} must be > 0, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(3), - state.dataIPShortCut->rNumericArgs(3))); - } - - state.dataHeatBal->WindowThermalModel(Loop).InitialPressure = state.dataIPShortCut->rNumericArgs(4); - if (state.dataIPShortCut->rNumericArgs(4) <= 0.0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + state.dataIPShortCut->cAlphaArgs(1) + - ", object. Illegal value for " + state.dataIPShortCut->cNumericFieldNames(4) + " has been found."); - ShowContinueError(state, - format("{} must be > 0, entered value = {:.2R}", - state.dataIPShortCut->cNumericFieldNames(4), - state.dataIPShortCut->rNumericArgs(4))); - } - } - - } // DO Loop = 1, TotThermalModels - - // Reading Construction:ComplexFenestrationState - locCurrentModuleObject = "Construction:ComplexFenestrationState"; - state.dataBSDFWindow->TotComplexFenStates = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, locCurrentModuleObject); - - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs(state, locCurrentModuleObject, TotalArgs, NumAlphas, NumNumbers); - if (!allocated(locAlphaFieldNames)) locAlphaFieldNames.allocate(NumAlphas); - if (!allocated(locNumericFieldNames)) locNumericFieldNames.allocate(NumNumbers); - if (!allocated(locNumericFieldBlanks)) locNumericFieldBlanks.allocate(NumNumbers); - if (!allocated(locAlphaFieldBlanks)) locAlphaFieldBlanks.allocate(NumAlphas); - if (!allocated(locAlphaArgs)) locAlphaArgs.allocate(NumAlphas); - if (!allocated(locNumericArgs)) locNumericArgs.allocate(NumNumbers); - - state.dataBSDFWindow->FirstBSDF = ConstrNum + 1; // Location of first BSDF construction input (They will be consecutive) - for (Loop = 1; Loop <= state.dataBSDFWindow->TotComplexFenStates; ++Loop) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - locCurrentModuleObject, - Loop, - locAlphaArgs, - NumAlphas, - locNumericArgs, - NumNumbers, - IOStatus, - locNumericFieldBlanks, - _, - locAlphaFieldNames, - locNumericFieldNames); - if (GlobalNames::VerifyUniqueInterObjectName(state, - state.dataHeatBalMgr->UniqueConstructNames, - locAlphaArgs(1), - state.dataHeatBalMgr->CurrentModuleObject, - locAlphaFieldNames(1), - ErrorsFound)) { - continue; - } - ++ConstrNum; - // Glass layer counter - iMatGlass = 0; - // Simon TODO: This is to be confirmed. If this is just initial value, then we might want to make better guess - state.dataHeatBal->NominalRforNominalUCalculation(ConstrNum) = 0.1; - // Simon TODO: If I do not put this, then it is considered that surface is NOT window - state.dataConstruction->Construct(ConstrNum).TransDiff = 0.1; // This is a place holder to flag - // the construction as a window until - // the correct value is entered in WindowComplexManager - - // Now override the deraults as appropriate - state.dataConstruction->Construct(ConstrNum).Name = locAlphaArgs(1); - - // ALLOCATE(Construct(ConstrNum)%BSDFInput) - - // Construct(ConstrNum)%BSDFInput%ThermalConstruction = ThConstNum - - { - auto const SELECT_CASE_var(locAlphaArgs(2)); // Basis Type Keyword - if (SELECT_CASE_var == "LBNLWINDOW") { - state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisType = DataBSDFWindow::Basis::WINDOW; - } else if (SELECT_CASE_var == "USERDEFINED") { - state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisType = DataBSDFWindow::Basis::Custom; - } else { - // throw error - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + locAlphaArgs(1) + ", object. Illegal value for " + - locAlphaFieldNames(2) + " has been found."); - ShowContinueError(state, - locAlphaFieldNames(2) + " entered value=\"" + locAlphaArgs(2) + "\" should be LBNLWindow or UserDefined."); - } - } - - { - auto const SELECT_CASE_var(locAlphaArgs(3)); // Basis Symmetry Keyword - if (SELECT_CASE_var == "AXISYMMETRIC") { - state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisSymmetryType = DataBSDFWindow::BasisSymmetry::Axisymmetric; - } else if (SELECT_CASE_var == "NONE") { - state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisSymmetryType = DataBSDFWindow::BasisSymmetry::None; - } else { - // throw error - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + locAlphaArgs(1) + ", object. Illegal value for " + - locAlphaFieldNames(3) + " has been found."); - ShowContinueError(state, locAlphaFieldNames(3) + " entered value = \"" + locAlphaArgs(3) + "\" should be Axisymmetric or None."); - } - } - - // Simon: Assign thermal model number - ThermalModelNum = UtilityRoutines::FindItemInList(locAlphaArgs(4), state.dataHeatBal->WindowThermalModel); - if (ThermalModelNum == 0) { - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + locAlphaArgs(1) + ", object. Illegal value for " + - locAlphaFieldNames(4) + " has been found."); - ShowContinueError(state, - locAlphaFieldNames(4) + " entered value = \"" + locAlphaArgs(4) + - "\" no corresponding thermal model (WindowThermalModel:Params) found in the input file."); - } else { - state.dataConstruction->Construct(ConstrNum).BSDFInput.ThermalModel = ThermalModelNum; - } - - // *************************************************************************************** - // Basis matrix - // *************************************************************************************** - state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMatIndex = MatrixIndex(state, locAlphaArgs(5)); - Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMatIndex, NumRows, NumCols); - state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMatNrows = NumRows; - state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMatNcols = NumCols; - - if (NumCols != 2 && NumCols != 1) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + locAlphaArgs(1) + ", object. Illegal value for " + - locAlphaFieldNames(5) + " has been found."); - ShowContinueError(state, - locAlphaFieldNames(5) + " entered value=\"" + locAlphaArgs(5) + - "\" invalid matrix dimensions. Basis matrix dimension can only be 2 x 1."); - } - state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMat.allocate(NumCols, NumRows); - Get2DMatrix(state, - state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMatIndex, - state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisMat); - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisType == DataBSDFWindow::Basis::WINDOW) - CalculateBasisLength(state, - state.dataConstruction->Construct(ConstrNum).BSDFInput, - ConstrNum, - state.dataConstruction->Construct(ConstrNum).BSDFInput.NBasis); - - // determine number of layers and optical layers - NumOfTotalLayers = (NumAlphas - 9) / 3; - state.dataConstruction->Construct(ConstrNum).TotLayers = NumOfTotalLayers; - - NumOfOpticalLayers = NumOfTotalLayers / 2 + 1; - - state.dataConstruction->Construct(ConstrNum).BSDFInput.NumLayers = NumOfOpticalLayers; - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer.allocate(NumOfOpticalLayers); - - // check for incomplete field set - if (mod((NumAlphas - 9), 3) != 0) { - // throw warning if incomplete field set - ErrorsFound = true; - ShowSevereError( - state, std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + ", object. Incomplete field set found."); - ShowContinueError(state, locAlphaArgs(1) + " is missing some of the layers or/and gaps."); - } - - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisSymmetryType == DataBSDFWindow::BasisSymmetry::None) { - // Non-Symmetric basis - - NBasis = state.dataConstruction->Construct(ConstrNum).BSDFInput.NBasis; - - // ******************************************************************************* - // Solar front transmittance - // ******************************************************************************* - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex = MatrixIndex(state, locAlphaArgs(6)); - Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex, NumRows, NumCols); - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransNrows = NumRows; - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransNcols = NumCols; - - if (NumRows != NBasis) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Illegal matrix size has been found."); - ShowContinueError( - state, - "Solar front transmittance matrix \"" + locAlphaArgs(6) + - "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + - locAlphaArgs(5) + "\"."); - } - - if (NumRows != NumCols) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - "\", object. Invalid BSDF matrix dimensions."); - ShowContinueError(state, - "Solar front transmittance matrix \"" + locAlphaArgs(6) + "\" must have the same number of rows and columns."); - } - - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.BasisType == DataBSDFWindow::Basis::Custom) { - state.dataConstruction->Construct(ConstrNum).BSDFInput.NBasis = NumRows; // For custom basis, no rows in transmittance - // matrix defines the basis length - } - - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTrans.allocate(NumCols, NumRows); - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex == 0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Referenced Matrix:TwoDimension is missing from the input file."); - ShowContinueError(state, - "Solar front transmittance Matrix:TwoDimension = \"" + locAlphaArgs(6) + "\" is missing from the input file."); - } else { - Get2DMatrix(state, - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex, - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTrans); - } - - // ******************************************************************************* - // Solar back reflectance - // ******************************************************************************* - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex = MatrixIndex(state, locAlphaArgs(7)); - Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex, NumRows, NumCols); - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflNrows = NumRows; - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflNcols = NumCols; - - if (NumRows != NBasis) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Illegal matrix size has been found."); - ShowContinueError( - state, - "Solar back reflectance matrix \"" + locAlphaArgs(7) + - "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + - locAlphaArgs(5) + "\"."); - } - - if (NumRows != NumCols) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - "\", object. Invalid BSDF matrix dimensions."); - ShowContinueError(state, - "Solar bakc reflectance matrix \"" + locAlphaArgs(7) + "\" must have the same number of rows and columns."); - } - - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkRefl.allocate(NumCols, NumRows); - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex == 0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Referenced Matrix:TwoDimension is missing from the input file."); - ShowContinueError(state, - "Solar back reflectance Matrix:TwoDimension = \"" + locAlphaArgs(7) + "\" is missing from the input file."); - } else { - Get2DMatrix(state, - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex, - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkRefl); - } - - // ******************************************************************************* - // Visible front transmittance - // ******************************************************************************* - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex = MatrixIndex(state, locAlphaArgs(8)); - Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex, NumRows, NumCols); - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransNrows = NumRows; - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransNcols = NumCols; - - if (NumRows != NBasis) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Illegal matrix size has been found."); - ShowContinueError( - state, - "Visible front transmittance matrix \"" + locAlphaArgs(8) + - "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + - locAlphaArgs(5) + "\"."); - } - - if (NumRows != NumCols) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - "\", object. Invalid BSDF matrix dimensions."); - ShowContinueError( - state, "Visible front transmittance matrix \"" + locAlphaArgs(8) + "\" must have the same number of rows and columns."); - } - - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTrans.allocate(NumCols, NumRows); - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex == 0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + cCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Referenced Matrix:TwoDimension is missing from the input file."); - ShowContinueError( - state, "Visible front transmittance Matrix:TwoDimension = \"" + locAlphaArgs(8) + "\" is missing from the input file."); - } else { - Get2DMatrix(state, - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex, - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTrans); - } - - // ******************************************************************************* - // Visible back reflectance - // ******************************************************************************* - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex = MatrixIndex(state, locAlphaArgs(9)); - Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex, NumRows, NumCols); - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflNrows = NumRows; - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflNcols = NumCols; - - if (NumRows != NBasis) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Illegal matrix size has been found."); - ShowContinueError( - state, - "Visible back reflectance matrix \"" + locAlphaArgs(9) + - "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + - locAlphaArgs(5) + "\"."); - } - - if (NumRows != NumCols) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - "\", object. Invalid BSDF matrix dimensions."); - ShowContinueError(state, "Visible back reflectance \"" + locAlphaArgs(9) + "\" must have the same number of rows and columns."); - } - - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkRefl.allocate(NumCols, NumRows); - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex == 0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Referenced Matrix:TwoDimension is missing from the input file."); - ShowContinueError(state, - "Visble back reflectance Matrix:TwoDimension = \"" + locAlphaArgs(9) + "\" is missing from the input file."); - } else { - Get2DMatrix(state, - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex, - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkRefl); - } - - // ALLOCATE(Construct(ConstrNum)%BSDFInput%Layer(NumOfOpticalLayers)) - for (Layer = 1; Layer <= state.dataConstruction->Construct(ConstrNum).TotLayers; ++Layer) { - AlphaIndex = 9 + (Layer * 3) - 2; - currentOpticalLayer = int(Layer / 2) + 1; - // Material info is contained in the thermal construct - state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) = - UtilityRoutines::FindItemInList(locAlphaArgs(AlphaIndex), state.dataMaterial->Material); - - // Simon: Load only if optical layer - if (mod(Layer, 2) != 0) { - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).MaterialIndex = - state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer); - - ++AlphaIndex; - // ******************************************************************************* - // Front absorptance matrix - // ******************************************************************************* - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex = - MatrixIndex(state, locAlphaArgs(AlphaIndex)); - Get2DMatrixDimensions( - state, state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex, NumRows, NumCols); - - if (NumRows != 1) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + - "\", object. Incorrect matrix dimension."); - ShowContinueError(state, - format("Front absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have only one row.", - locAlphaArgs(AlphaIndex), - currentOpticalLayer)); - } - - if (NumCols != NBasis) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + - "\", object. Incorrect matrix dimension."); - ShowContinueError(state, - format("Front absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have same number of columns " - "as it is defined by basis matrix.", - locAlphaArgs(AlphaIndex), - currentOpticalLayer)); - ShowContinueError( - state, - format("Matrix has {} number of columns, while basis definition specifies {} number of columns.", NumCols, NBasis)); - } - - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).AbsNcols = NumCols; - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbs.allocate(NumCols, NumRows); - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex == 0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Referenced Matrix:TwoDimension is missing from the input file."); - ShowContinueError(state, - format("Front absorbtance Matrix:TwoDimension = \"{}\" for layer {} is missing from the input file.", - locAlphaArgs(AlphaIndex), - currentOpticalLayer)); - } else { - Get2DMatrix(state, - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex, - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbs); - } - - ++AlphaIndex; - // ******************************************************************************* - // Back absorptance matrix - // ******************************************************************************* - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex = - MatrixIndex(state, locAlphaArgs(AlphaIndex)); - Get2DMatrixDimensions( - state, state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex, NumRows, NumCols); - - if (NumRows != 1) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + - "\", object. Incorrect matrix dimension."); - ShowContinueError(state, - format("Back absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have only one row.", - locAlphaArgs(AlphaIndex), - currentOpticalLayer)); - } - - if (NumCols != NBasis) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + - "\", object. Incorrect matrix dimension."); - ShowContinueError(state, - format("Back absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have same number of columns as " - "it is defined by basis matrix.", - locAlphaArgs(AlphaIndex), - currentOpticalLayer)); - ShowContinueError( - state, - format("Matrix has {} number of columns, while basis definition specifies {} number of columns.", NumCols, NBasis)); - } - - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbs.allocate(NumCols, NumRows); - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex == 0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Referenced Matrix:TwoDimension is missing from the input file."); - ShowContinueError(state, - format("Back absorbtance Matrix:TwoDimension = \"{}\" for layer {} is missing from the input file.", - locAlphaArgs(AlphaIndex), - currentOpticalLayer)); - } else { - Get2DMatrix(state, - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex, - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbs); - } - } // if (Mod(Layer, 2) <> 0) then - } - } else { - // Axisymmetric basis - NBasis = state.dataConstruction->Construct(ConstrNum).BSDFInput.NBasis; // Basis length has already been calculated - state.dataBSDFWindow->BSDFTempMtrx.allocate(NBasis, 1); - - // ******************************************************************************* - // Solar front transmittance - // ******************************************************************************* - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex = MatrixIndex(state, locAlphaArgs(6)); - Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex, NumRows, NumCols); - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransNrows = NBasis; - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransNcols = NBasis; - - if (NumRows != NBasis) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Illegal matrix size has been found."); - ShowContinueError( - state, - "Solar front transmittance matrix \"" + locAlphaArgs(6) + - "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + - locAlphaArgs(5) + "\"."); - } - - if (NumRows != NumCols) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - "\", object. Invalid BSDF matrix dimensions."); - ShowContinueError(state, - "Solar front transmittance matrix \"" + locAlphaArgs(6) + "\" must have the same number of rows and columns."); - } - - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTrans.allocate(NBasis, NBasis); - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex == 0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Referenced Matrix:TwoDimension is missing from the input file."); - ShowContinueError(state, - "Solar front transmittance Matrix:TwoDimension = \"" + locAlphaArgs(6) + "\" is missing from the input file."); - } else { - Get2DMatrix(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTransIndex, state.dataBSDFWindow->BSDFTempMtrx); - - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTrans = 0.0; - for (I = 1; I <= NBasis; ++I) { - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolFrtTrans(I, I) = state.dataBSDFWindow->BSDFTempMtrx(I, 1); - } - } - - // ******************************************************************************* - // Solar back reflectance - // ******************************************************************************* - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex = MatrixIndex(state, locAlphaArgs(7)); - Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex, NumRows, NumCols); - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflNrows = NBasis; - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflNcols = NBasis; - - if (NumRows != NBasis) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Illegal matrix size has been found."); - ShowContinueError( - state, - "Solar back reflectance matrix \"" + locAlphaArgs(7) + - "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + - locAlphaArgs(5) + "\"."); - } - - if (NumRows != NumCols) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - "\", object. Invalid BSDF matrix dimensions."); - ShowContinueError(state, - "Solar back reflectance matrix \"" + locAlphaArgs(7) + "\" must have the same number of rows and columns."); - } - - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkRefl.allocate(NBasis, NBasis); - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex == 0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Referenced Matrix:TwoDimension is missing from the input file."); - ShowContinueError(state, - "Solar back reflectance Matrix:TwoDimension = \"" + locAlphaArgs(7) + "\" is missing from the input file."); - } else { - Get2DMatrix(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkReflIndex, state.dataBSDFWindow->BSDFTempMtrx); - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkRefl = 0.0; - for (I = 1; I <= NBasis; ++I) { - state.dataConstruction->Construct(ConstrNum).BSDFInput.SolBkRefl(I, I) = state.dataBSDFWindow->BSDFTempMtrx(I, 1); - } - } - - // ******************************************************************************* - // Visible front transmittance - // ******************************************************************************* - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex = MatrixIndex(state, locAlphaArgs(8)); - Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex, NumRows, NumCols); - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransNrows = NBasis; - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransNcols = NBasis; - - if (NumRows != NBasis) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Illegal matrix size has been found."); - ShowContinueError( - state, - "Visible front transmittance matrix \"" + locAlphaArgs(8) + - "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + - locAlphaArgs(5) + "\"."); - } - - if (NumRows != NumCols) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - "\", object. Invalid BSDF matrix dimensions."); - ShowContinueError( - state, "Visible front transmittance matrix \"" + locAlphaArgs(8) + "\" must have the same number of rows and columns."); - } - - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTrans.allocate(NBasis, NBasis); - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex == 0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Referenced Matrix:TwoDimension is missing from the input file."); - ShowContinueError( - state, "Visible front transmittance Matrix:TwoDimension = \"" + locAlphaArgs(8) + "\" is missing from the input file."); - } else { - Get2DMatrix(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTransIndex, state.dataBSDFWindow->BSDFTempMtrx); - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTrans = 0.0; - for (I = 1; I <= NBasis; ++I) { - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisFrtTrans(I, I) = state.dataBSDFWindow->BSDFTempMtrx(I, 1); - } - } - - // ******************************************************************************* - // Visible back reflectance - // ******************************************************************************* - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex = MatrixIndex(state, locAlphaArgs(9)); - Get2DMatrixDimensions(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex, NumRows, NumCols); - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflNrows = NBasis; - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflNcols = NBasis; - - if (NumRows != NBasis) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Illegal matrix size has been found."); - ShowContinueError( - state, - "Visible back reflectance matrix \"" + locAlphaArgs(9) + - "\" is not the same size as it is defined by basis definition. Basis size is defined by Matrix:TwoDimension = \"" + - locAlphaArgs(5) + "\"."); - } - - if (NumRows != NumCols) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - "\", object. Invalid BSDF matrix dimensions."); - ShowContinueError(state, - "Visible back reflectance matrix \"" + locAlphaArgs(9) + "\" must have the same number of rows and columns."); - } - - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkRefl.allocate(NBasis, NBasis); - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex == 0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Referenced Matrix:TwoDimension is missing from the input file."); - ShowContinueError(state, - "Visible back reflectance Matrix:TwoDimension = \"" + locAlphaArgs(9) + "\" is missing from the input file."); - } else { - Get2DMatrix(state, state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkReflIndex, state.dataBSDFWindow->BSDFTempMtrx); - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkRefl = 0.0; - for (I = 1; I <= NBasis; ++I) { - state.dataConstruction->Construct(ConstrNum).BSDFInput.VisBkRefl(I, I) = state.dataBSDFWindow->BSDFTempMtrx(I, 1); - } - } - - // determine number of layers - // Construct(ConstrNum)%TotLayers = (NumAlphas - 9)/3 - - // check for incomplete field set - // IF (Mod((NumAlphas - 9), 3) /= 0) Then - // throw warning if incomplete field set - // CALL ShowWarningError(state, 'Construction:ComplexFenestrationState: Axisymmetric properties have incomplete field & - // & set') - // ENDIF - - // ALLOCATE(Construct(ConstrNum)%BSDFInput%Layer(NumOfOpticalLayers)) - for (Layer = 1; Layer <= state.dataConstruction->Construct(ConstrNum).TotLayers; ++Layer) { - AlphaIndex = 9 + (Layer * 3) - 2; - currentOpticalLayer = int(Layer / 2) + 1; - - state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer) = - UtilityRoutines::FindItemInList(locAlphaArgs(AlphaIndex), state.dataMaterial->Material); - - if (mod(Layer, 2) != 0) { - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).MaterialIndex = - state.dataConstruction->Construct(ConstrNum).LayerPoint(Layer); - - // ******************************************************************************* - // Front absorptance matrix - // ******************************************************************************* - ++AlphaIndex; - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex = - MatrixIndex(state, locAlphaArgs(AlphaIndex)); - Get2DMatrixDimensions( - state, state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex, NumRows, NumCols); - - if (NumRows != 1) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + - "\", object. Incorrect matrix dimension."); - ShowContinueError(state, - format("Front absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have only one row.", - locAlphaArgs(AlphaIndex), - currentOpticalLayer)); - } - - if (NumCols != NBasis) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + - "\", object. Incorrect matrix dimension."); - ShowContinueError(state, - format("Front absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have same number of columns " - "as it is defined by basis matrix.", - locAlphaArgs(AlphaIndex), - currentOpticalLayer)); - ShowContinueError( - state, - format("Matrix has {} number of columns, while basis definition specifies {} number of columns.", NumCols, NBasis)); - } - - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).AbsNcols = NumCols; - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbs.allocate(NumCols, NumRows); - - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex == 0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Referenced Matrix:TwoDimension is missing from the input file."); - ShowContinueError(state, - format("Front absorbtance Matrix:TwoDimension = \"{}\" for layer {} is missing from the input file.", - locAlphaArgs(AlphaIndex), - currentOpticalLayer)); - } else { - Get2DMatrix(state, - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbsIndex, - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).FrtAbs); - } - - // ******************************************************************************* - // Back absorptance matrix - // ******************************************************************************* - ++AlphaIndex; - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex = - MatrixIndex(state, locAlphaArgs(AlphaIndex)); - Get2DMatrixDimensions( - state, state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex, NumRows, NumCols); - - if (NumRows != 1) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + - "\", object. Incorrect matrix dimension."); - ShowContinueError(state, - format("Back absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have only one row.", - locAlphaArgs(AlphaIndex), - currentOpticalLayer)); - } - - if (NumCols != NBasis) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + " = \"" + locAlphaArgs(1) + - "\", object. Incorrect matrix dimension."); - ShowContinueError(state, - format("Back absorbtance Matrix:TwoDimension = \"{}\" for layer {} must have same number of columns as " - "it is defined by basis matrix.", - locAlphaArgs(AlphaIndex), - currentOpticalLayer)); - ShowContinueError( - state, - format("Matrix has {} number of columns, while basis definition specifies {} number of columns.", NumCols, NBasis)); - } - - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbs.allocate(NumCols, NumRows); - - if (state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex == 0) { - ErrorsFound = true; - ShowSevereError(state, - std::string{RoutineName} + locCurrentModuleObject + "=\"" + locAlphaArgs(1) + - ", object. Referenced Matrix:TwoDimension is missing from the input file."); - ShowContinueError(state, - format("Back absorbtance Matrix:TwoDimension = \"{}\" for layer {} is missing from the input file.", - locAlphaArgs(AlphaIndex), - currentOpticalLayer)); - } else { - Get2DMatrix(state, - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbsIndex, - state.dataConstruction->Construct(ConstrNum).BSDFInput.Layer(currentOpticalLayer).BkAbs); - } - } // if (Mod(Layer, 2) <> 0) then - } - - state.dataBSDFWindow->BSDFTempMtrx.deallocate(); - } - state.dataConstruction->Construct(ConstrNum).TypeIsWindow = true; - state.dataConstruction->Construct(ConstrNum).WindowTypeBSDF = true; - } - - // Do not forget to deallocate localy allocated variables - if (allocated(locAlphaFieldNames)) locAlphaFieldNames.deallocate(); - if (allocated(locNumericFieldNames)) locNumericFieldNames.deallocate(); - if (allocated(locNumericFieldBlanks)) locNumericFieldBlanks.deallocate(); - if (allocated(locAlphaFieldBlanks)) locAlphaFieldBlanks.deallocate(); - if (allocated(locAlphaArgs)) locAlphaArgs.deallocate(); - if (allocated(locNumericArgs)) locNumericArgs.deallocate(); - - if (ErrorsFound) ShowFatalError(state, "Error in complex fenestration input."); - } - - void InitConductionTransferFunctions(EnergyPlusData &state) - { - bool ErrorsFound(false); // Flag for input error condition - bool DoCTFErrorReport(false); - for (auto &construction : state.dataConstruction->Construct) { - construction.calculateTransferFunction(state, ErrorsFound, DoCTFErrorReport); - if (construction.NumHistories > 1) { - state.dataHeatBal->SimpleCTFOnly = false; - } - if (construction.NumCTFTerms > state.dataHeatBal->MaxCTFTerms) { - state.dataHeatBal->MaxCTFTerms = construction.NumCTFTerms; - } - } - if (state.dataHeatBal->AnyInternalHeatSourceInInput) { - state.dataHeatBal->SimpleCTFOnly = false; - } - - bool InitCTFDoReport; - General::ScanForReports(state, "Constructions", InitCTFDoReport, "Constructions"); - if (InitCTFDoReport || DoCTFErrorReport) { - print(state.files.eio, - "! ,Construction Name,Index,#Layers,#CTFs,Time Step {{hours}},ThermalConductance " - "{{w/m2-K}},OuterThermalAbsorptance,InnerThermalAbsorptance,OuterSolarAbsorptance,InnerSolarAbsorptance,Roughness\n"); - print(state.files.eio, - "! ,Material Name,Thickness {{m}},Conductivity {{w/m-K}},Density {{kg/m3}},Specific Heat " - "{{J/kg-K}},ThermalResistance {{m2-K/w}}\n"); - print(state.files.eio, "! ,Material Name,ThermalResistance {{m2-K/w}}\n"); - print(state.files.eio, "! ,Time,Outside,Cross,Inside,Flux (except final one)\n"); - - int cCounter = 0; // just used to keep construction index in output report - for (auto &construction : state.dataConstruction->Construct) { - cCounter++; - if (!construction.IsUsedCTF) continue; - construction.reportTransferFunction(state, cCounter); - } - } - - if (ErrorsFound) { - ShowFatalError(state, "Program terminated for reasons listed (InitConductionTransferFunctions)"); - } - } - -} // namespace HeatBalanceManager - -} // namespace EnergyPlus diff --git a/src/EnergyPlus/ForceSpaceHeatBalance/SimulationManager.cc b/src/EnergyPlus/ForceSpaceHeatBalance/SimulationManager.cc deleted file mode 100644 index 65912d3f63e..00000000000 --- a/src/EnergyPlus/ForceSpaceHeatBalance/SimulationManager.cc +++ /dev/null @@ -1,2770 +0,0 @@ -// EnergyPlus, Copyright (c) 1996-2022, The Board of Trustees of the University of Illinois, -// The Regents of the University of California, through Lawrence Berkeley National Laboratory -// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge -// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other -// contributors. All rights reserved. -// -// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the -// U.S. Government consequently retains certain rights. As such, the U.S. Government has been -// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, -// worldwide license in the Software to reproduce, distribute copies to the public, prepare -// derivative works, and perform publicly and display publicly, and to permit others to do so. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted -// provided that the following conditions are met: -// -// (1) Redistributions of source code must retain the above copyright notice, this list of -// conditions and the following disclaimer. -// -// (2) Redistributions in binary form must reproduce the above copyright notice, this list of -// conditions and the following disclaimer in the documentation and/or other materials -// provided with the distribution. -// -// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, -// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be -// used to endorse or promote products derived from this software without specific prior -// written permission. -// -// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form -// without changes from the version obtained under this License, or (ii) Licensee makes a -// reference solely to the software portion of its product, Licensee must refer to the -// software as "EnergyPlus version X" software, where "X" is the version number Licensee -// obtained under this License and may not use a different name for the software. Except as -// specifically required in this Section (4), Licensee shall not use in a company name, a -// product name, in advertising, publicity, or other promotional activities any name, trade -// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly -// similar designation, without the U.S. Department of Energy's prior written consent. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -// FMI-Related Headers -extern "C" { -#include -} - -// C++ Headers -#include -#include - -// ObjexxFCL Headers -#include -#include -#include -#include -#include - -// EnergyPlus Headers -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace EnergyPlus { -namespace SimulationManager { - - // MODULE INFORMATION: - // AUTHOR Rick Strand - // DATE WRITTEN January 1997 - - // PURPOSE OF THIS MODULE: - // This module contains the main driver routine which manages the major - // control loops of the EnergyPlus simulation. This module is also - // responsible for setting the global environment flags for these - // loops. - - // METHODOLOGY EMPLOYED: - // This module was constructed from the remnants of (I)BLAST routines - // SIMBLD (Simulate Building), SIMZG (Simulate Zone Group), and SIMZGD - // (Simulate Zone Group for a Day). - - // REFERENCES: - // (I)BLAST legacy code, internal Reverse Engineering documentation, - // and internal Evolutionary Engineering documentation. - - // Using/Aliasing - using namespace DataSizing; - using namespace DataSystemVariables; - using namespace HeatBalanceManager; - using namespace WeatherManager; - using namespace ExternalInterface; - - // MODULE PARAMETER DEFINITIONS: - - void ManageSimulation(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Rick Strand - // DATE WRITTEN January 1997 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine is the main driver of the simulation manager module. - // It contains the main environment-time loops for the building - // simulation. This includes the environment loop, a day loop, an - // hour loop, and a time step loop. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - bool ErrorsFound(false); - bool TerminalError(false); - bool oneTimeUnderwaterBoundaryCheck = true; - bool AnyUnderwaterBoundaries = false; - - state.files.outputControl.getInput(state); - state.dataResultsFramework->resultsFramework->setupOutputOptions(state); - - state.files.debug.ensure_open(state, "OpenOutputFiles", state.files.outputControl.dbg); - - // CreateSQLiteDatabase(); - state.dataSQLiteProcedures->sqlite = EnergyPlus::CreateSQLiteDatabase(state); - - if (state.dataSQLiteProcedures->sqlite) { - state.dataSQLiteProcedures->sqlite->sqliteBegin(); - state.dataSQLiteProcedures->sqlite->createSQLiteSimulationsRecord( - 1, state.dataStrGlobals->VerStringVar, state.dataStrGlobals->CurrentDateTime); - state.dataSQLiteProcedures->sqlite->sqliteCommit(); - } - - PostIPProcessing(state); - - state.dataGlobal->BeginSimFlag = true; - state.dataGlobal->DoOutputReporting = false; - state.dataReportFlag->DisplayPerfSimulationFlag = false; - state.dataReportFlag->DoWeatherInitReporting = false; - state.dataSimulationManager->RunPeriodsInInput = - (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "RunPeriod") > 0 || - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "RunPeriod:CustomRange") > 0 || state.dataSysVars->FullAnnualRun); - state.dataErrTracking->AskForConnectionsReport = false; // set to false until sizing is finished - - OpenOutputFiles(state); - GetProjectData(state); - Psychrometrics::InitializePsychRoutines(state); - CheckForMisMatchedEnvironmentSpecifications(state); - CheckForRequestedReporting(state); - OutputReportPredefined::SetPredefinedTables(state); - SetPreConstructionInputParameters(state); // establish array bounds for constructions early - - OutputProcessor::SetupTimePointers( - state, OutputProcessor::SOVTimeStepType::Zone, state.dataGlobal->TimeStepZone); // Set up Time pointer for HB/Zone Simulation - OutputProcessor::SetupTimePointers(state, OutputProcessor::SOVTimeStepType::HVAC, state.dataHVACGlobal->TimeStepSys); - - createFacilityElectricPowerServiceObject(state); - createCoilSelectionReportObj(state); - // read object information early in simulation - isInputObjectUsed(state); - - BranchInputManager::ManageBranchInput(state); // just gets input and returns. - - // Create a new plugin manager which starts up the Python interpreter - state.dataPluginManager->pluginManager = std::make_unique(state); - - state.dataGlobal->DoingSizing = true; - SizingManager::ManageSizing(state); - - bool SimsDone = false; - if (state.dataGlobal->DoDesDaySim || state.dataGlobal->DoWeathSim || state.dataGlobal->DoHVACSizingSimulation) { - state.dataGlobal->DoOutputReporting = true; - } - state.dataGlobal->DoingSizing = false; - // state.dataHeatBal->doSpaceHeatBalance = state.dataHeatBal->doSpaceHeatBalanceSimulation; - state.dataHeatBal->doSpaceHeatBalance = true; - - if ((state.dataGlobal->DoZoneSizing || state.dataGlobal->DoSystemSizing || state.dataGlobal->DoPlantSizing) && - !(state.dataGlobal->DoDesDaySim || (state.dataGlobal->DoWeathSim && state.dataSimulationManager->RunPeriodsInInput))) { - ShowWarningError(state, - "ManageSimulation: Input file has requested Sizing Calculations but no Simulations are requested (in SimulationControl " - "object). Succeeding warnings/errors may be confusing."); - } - bool Available = true; // an environment is available to process - - if (state.dataGlobal->DoPureLoadCalc) { - state.dataGlobal->DoOutputReporting = true; - Available = false; - state.dataOutRptTab->WriteTabularFiles = true; - } - - if (state.dataBranchInputManager->InvalidBranchDefinitions) { - ShowFatalError(state, "Preceding error(s) in Branch Input cause termination."); - } - - DisplayString(state, "Adjusting Air System Sizing"); - SizingManager::ManageSystemSizingAdjustments(state); - - DisplayString(state, "Adjusting Standard 62.1 Ventilation Sizing"); - SizingManager::ManageSystemVentilationAdjustments(state); - - DisplayString(state, "Initializing Simulation"); - state.dataGlobal->KickOffSimulation = true; - - ResetEnvironmentCounter(state); - SetupSimulation(state, ErrorsFound); - - FaultsManager::CheckAndReadFaults(state); - - Curve::InitCurveReporting(state); - - state.dataErrTracking->AskForConnectionsReport = true; // set to true now that input processing and sizing is done. - state.dataGlobal->KickOffSimulation = false; - state.dataGlobal->WarmupFlag = false; - state.dataReportFlag->DoWeatherInitReporting = true; - - // Note: All the inputs have been 'gotten' by the time we get here. - bool ErrFound = false; - if (state.dataGlobal->DoOutputReporting) { - DisplayString(state, "Reporting Surfaces"); - - ReportSurfaces(state); - - NodeInputManager::SetupNodeVarsForReporting(state); - state.dataGlobal->MetersHaveBeenInitialized = true; - PollutionModule::SetupPollutionMeterReporting(state); - SystemReports::AllocateAndSetUpVentReports(state); - if (state.dataPluginManager->pluginManager) { - EnergyPlus::PluginManagement::PluginManager::setupOutputVariables(state); - } - UpdateMeterReporting(state); - PollutionModule::CheckPollutionMeterReporting(state); - state.dataElectPwrSvcMgr->facilityElectricServiceObj->verifyCustomMetersElecPowerMgr(state); - PollutionModule::SetupPollutionCalculations(state); - DemandManager::InitDemandManagers(state); - BranchInputManager::TestBranchIntegrity(state, ErrFound); - if (ErrFound) TerminalError = true; - TestAirPathIntegrity(state, ErrFound); - if (ErrFound) TerminalError = true; - NodeInputManager::CheckMarkedNodes(state, ErrFound); - if (ErrFound) TerminalError = true; - BranchNodeConnections::CheckNodeConnections(state, ErrFound); - if (ErrFound) TerminalError = true; - BranchNodeConnections::TestCompSetInletOutletNodes(state, ErrFound); - if (ErrFound) TerminalError = true; - MixedAir::CheckControllerLists(state, ErrFound); - if (ErrFound) TerminalError = true; - - if (state.dataGlobal->DoDesDaySim || state.dataGlobal->DoWeathSim || state.dataGlobal->DoPureLoadCalc) { - ReportLoopConnections(state); - SystemReports::ReportAirLoopConnections(state); - ReportNodeConnections(state); - } - SystemReports::CreateEnergyReportStructure(state); - bool anyEMSRan; - // point to finish setup processing EMS, sensor ready now - EMSManager::ManageEMS(state, EMSManager::EMSCallFrom::SetupSimulation, anyEMSRan, ObjexxFCL::Optional_int_const()); - ProduceRDDMDD(state); - - if (TerminalError) { - ShowFatalError(state, "Previous Conditions cause program termination."); - } - } - - // up until this point, output vars, meters, actuators, etc., may not have been registered; they are now - state.dataPluginManager->fullyReady = true; - - if (state.dataSQLiteProcedures->sqlite) { - state.dataSQLiteProcedures->sqlite->sqliteBegin(); - state.dataSQLiteProcedures->sqlite->updateSQLiteSimulationRecord(1, state.dataGlobal->NumOfTimeStepInHour); - state.dataSQLiteProcedures->sqlite->sqliteCommit(); - } - - EconomicLifeCycleCost::GetInputForLifeCycleCost(state); // must be prior to WriteTabularReports -- do here before big simulation stuff. - - // check for variable latitude/location/etc - WeatherManager::ReadVariableLocationOrientation(state); - - // if user requested HVAC Sizing Simulation, call HVAC sizing simulation manager - if (state.dataGlobal->DoHVACSizingSimulation) { - ManageHVACSizingSimulation(state, ErrorsFound); - } - - if (!state.dataGlobal->DoPureLoadCalc) { - ShowMessage(state, "Beginning Simulation"); - DisplayString(state, "Beginning Primary Simulation"); - } - ResetEnvironmentCounter(state); - - int EnvCount = 0; - state.dataGlobal->WarmupFlag = true; - - while (Available) { - if (state.dataGlobal->stopSimulation) break; - - GetNextEnvironment(state, Available, ErrorsFound); - - if (!Available) break; - if (ErrorsFound) break; - if ((!state.dataGlobal->DoDesDaySim) && (state.dataGlobal->KindOfSim != DataGlobalConstants::KindOfSim::RunPeriodWeather)) continue; - if ((!state.dataGlobal->DoWeathSim) && (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::RunPeriodWeather)) continue; - if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeDesignDay) - continue; // don't run these here, only for sizing simulations - - if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::HVACSizeRunPeriodDesign) - continue; // don't run these here, only for sizing simulations - - ++EnvCount; - - if (state.dataSQLiteProcedures->sqlite) { - state.dataSQLiteProcedures->sqlite->sqliteBegin(); - state.dataSQLiteProcedures->sqlite->createSQLiteEnvironmentPeriodRecord( - state.dataEnvrn->CurEnvirNum, state.dataEnvrn->EnvironmentName, state.dataGlobal->KindOfSim); - state.dataSQLiteProcedures->sqlite->sqliteCommit(); - } - - state.dataErrTracking->ExitDuringSimulations = true; - SimsDone = true; - DisplayString(state, "Initializing New Environment Parameters"); - - state.dataGlobal->BeginEnvrnFlag = true; - state.dataGlobal->EndEnvrnFlag = false; - state.dataEnvrn->EndMonthFlag = false; - state.dataGlobal->WarmupFlag = true; - state.dataGlobal->DayOfSim = 0; - state.dataGlobal->DayOfSimChr = "0"; - state.dataReportFlag->NumOfWarmupDays = 0; - if (state.dataEnvrn->CurrentYearIsLeapYear) { - if (state.dataGlobal->NumOfDayInEnvrn <= 366) { - state.dataOutputProcessor->isFinalYear = true; - } - } else { - if (state.dataGlobal->NumOfDayInEnvrn <= 365) { - state.dataOutputProcessor->isFinalYear = true; - } - } - - HVACManager::ResetNodeData(state); // Reset here, because some zone calcs rely on node data (e.g. ZoneITEquip) - - bool anyEMSRan; - ManageEMS(state, EMSManager::EMSCallFrom::BeginNewEnvironment, anyEMSRan, ObjexxFCL::Optional_int_const()); // calling point - - while ((state.dataGlobal->DayOfSim < state.dataGlobal->NumOfDayInEnvrn) || (state.dataGlobal->WarmupFlag)) { // Begin day loop ... - if (state.dataGlobal->stopSimulation) break; - - if (state.dataSQLiteProcedures->sqlite) state.dataSQLiteProcedures->sqlite->sqliteBegin(); // setup for one transaction per day - - ++state.dataGlobal->DayOfSim; - state.dataGlobal->DayOfSimChr = fmt::to_string(state.dataGlobal->DayOfSim); - if (!state.dataGlobal->WarmupFlag) { - ++state.dataEnvrn->CurrentOverallSimDay; - DisplaySimDaysProgress(state, state.dataEnvrn->CurrentOverallSimDay, state.dataEnvrn->TotalOverallSimDays); - } else { - state.dataGlobal->DayOfSimChr = "0"; - } - state.dataGlobal->BeginDayFlag = true; - state.dataGlobal->EndDayFlag = false; - - if (state.dataGlobal->WarmupFlag) { - ++state.dataReportFlag->NumOfWarmupDays; - state.dataReportFlag->cWarmupDay = fmt::to_string(state.dataReportFlag->NumOfWarmupDays); - DisplayString(state, "Warming up {" + state.dataReportFlag->cWarmupDay + '}'); - } else if (state.dataGlobal->DayOfSim == 1) { - if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::RunPeriodWeather) { - DisplayString(state, "Starting Simulation at " + state.dataEnvrn->CurMnDyYr + " for " + state.dataEnvrn->EnvironmentName); - } else { - DisplayString(state, "Starting Simulation at " + state.dataEnvrn->CurMnDy + " for " + state.dataEnvrn->EnvironmentName); - } - static constexpr std::string_view Format_700("Environment:WarmupDays,{:3}\n"); - print(state.files.eio, Format_700, state.dataReportFlag->NumOfWarmupDays); - OutputProcessor::ResetAccumulationWhenWarmupComplete(state); - } else if (state.dataReportFlag->DisplayPerfSimulationFlag) { - if (state.dataGlobal->KindOfSim == DataGlobalConstants::KindOfSim::RunPeriodWeather) { - DisplayString(state, "Continuing Simulation at " + state.dataEnvrn->CurMnDyYr + " for " + state.dataEnvrn->EnvironmentName); - } else { - DisplayString(state, "Continuing Simulation at " + state.dataEnvrn->CurMnDy + " for " + state.dataEnvrn->EnvironmentName); - } - state.dataReportFlag->DisplayPerfSimulationFlag = false; - } - // for simulations that last longer than a week, identify when the last year of the simulation is started - if ((state.dataGlobal->DayOfSim > 365) && ((state.dataGlobal->NumOfDayInEnvrn - state.dataGlobal->DayOfSim) == 364) && - !state.dataGlobal->WarmupFlag) { - DisplayString(state, "Starting last year of environment at: " + state.dataGlobal->DayOfSimChr); - OutputReportTabular::ResetTabularReports(state); - } - - for (state.dataGlobal->HourOfDay = 1; state.dataGlobal->HourOfDay <= 24; ++state.dataGlobal->HourOfDay) { // Begin hour loop ... - if (state.dataGlobal->stopSimulation) break; - - state.dataGlobal->BeginHourFlag = true; - state.dataGlobal->EndHourFlag = false; - - for (state.dataGlobal->TimeStep = 1; state.dataGlobal->TimeStep <= state.dataGlobal->NumOfTimeStepInHour; - ++state.dataGlobal->TimeStep) { - if (state.dataGlobal->stopSimulation) break; - - if (state.dataGlobal->AnySlabsInModel || state.dataGlobal->AnyBasementsInModel) { - PlantPipingSystemsManager::SimulateGroundDomains(state, false); - } - - if (AnyUnderwaterBoundaries) { - WeatherManager::UpdateUnderwaterBoundaries(state); - } - - if (state.dataEnvrn->varyingLocationSchedIndexLat > 0 || state.dataEnvrn->varyingLocationSchedIndexLong > 0 || - state.dataEnvrn->varyingOrientationSchedIndex > 0) { - WeatherManager::UpdateLocationAndOrientation(state); - } - - state.dataGlobal->BeginTimeStepFlag = true; - ExternalInterfaceExchangeVariables(state); - - // Set the End__Flag variables to true if necessary. Note that - // each flag builds on the previous level. EndDayFlag cannot be - // .TRUE. unless EndHourFlag is also .TRUE., etc. Note that the - // EndEnvrnFlag and the EndSimFlag cannot be set during warmup. - // Note also that BeginTimeStepFlag, EndTimeStepFlag, and the - // SubTimeStepFlags can/will be set/reset in the HVAC Manager. - - if (state.dataGlobal->TimeStep == state.dataGlobal->NumOfTimeStepInHour) { - state.dataGlobal->EndHourFlag = true; - if (state.dataGlobal->HourOfDay == 24) { - state.dataGlobal->EndDayFlag = true; - if ((!state.dataGlobal->WarmupFlag) && (state.dataGlobal->DayOfSim == state.dataGlobal->NumOfDayInEnvrn)) { - state.dataGlobal->EndEnvrnFlag = true; - } - } - } - - ManageWeather(state); - - ExteriorEnergyUse::ManageExteriorEnergyUse(state); - - ManageHeatBalance(state); - - if (oneTimeUnderwaterBoundaryCheck) { - AnyUnderwaterBoundaries = WeatherManager::CheckIfAnyUnderwaterBoundaries(state); - oneTimeUnderwaterBoundaryCheck = false; - } - - state.dataGlobal->BeginHourFlag = false; - state.dataGlobal->BeginDayFlag = false; - state.dataGlobal->BeginEnvrnFlag = false; - state.dataGlobal->BeginSimFlag = false; - } // TimeStep loop - - state.dataGlobal->PreviousHour = state.dataGlobal->HourOfDay; - - } // ... End hour loop. - - if (state.dataSQLiteProcedures->sqlite) state.dataSQLiteProcedures->sqlite->sqliteCommit(); // one transaction per day - - } // ... End day loop. - - // Need one last call to send latest states to middleware - ExternalInterfaceExchangeVariables(state); - - } // ... End environment loop. - - state.dataGlobal->WarmupFlag = false; - - if (!SimsDone && state.dataGlobal->DoDesDaySim) { - if ((state.dataEnvrn->TotDesDays + state.dataEnvrn->TotRunDesPersDays) == 0) { // if sum is 0, then there was no sizing done. - ShowWarningError(state, - "ManageSimulation: SizingPeriod:* were requested in SimulationControl but no SizingPeriod:* objects in input."); - } - } - - if (!SimsDone && state.dataGlobal->DoWeathSim) { - if (!state.dataSimulationManager->RunPeriodsInInput) { // if no run period requested, and sims not done - ShowWarningError(state, "ManageSimulation: Weather Simulation was requested in SimulationControl but no RunPeriods in input."); - } - } - - PlantManager::CheckOngoingPlantWarnings(state); - - if (state.dataSQLiteProcedures->sqlite) state.dataSQLiteProcedures->sqlite->sqliteBegin(); // for final data to write - - CostEstimateManager::SimCostEstimate(state); - - EconomicTariff::ComputeTariff(state); // Compute the utility bills - - EMSManager::checkForUnusedActuatorsAtEnd(state); - EMSManager::checkSetpointNodesAtEnd(state); - - OutputProcessor::ReportForTabularReports(state); // For Energy Meters (could have other things that need to be pushed to after simulation) - - OutputReportTabular::OpenOutputTabularFile(state); - - OutputReportTabular::WriteTabularReports(state); // Create the tabular reports at completion of each - - EconomicTariff::WriteTabularTariffReports(state); - - EconomicLifeCycleCost::ComputeLifeCycleCostAndReport(state); // must be after WriteTabularReports and WriteTabularTariffReports - - OutputReportTabular::CloseOutputTabularFile(state); - - HVACControllers::DumpAirLoopStatistics(state); // Dump runtime statistics for air loop controller simulation to csv file - - CloseOutputFiles(state); - - // state.dataSQLiteProcedures->sqlite->createZoneExtendedOutput(); - CreateSQLiteZoneExtendedOutput(state); - - if (state.dataSQLiteProcedures->sqlite) { - DisplayString(state, "Writing final SQL reports"); - state.dataSQLiteProcedures->sqlite->sqliteCommit(); // final transactions - state.dataSQLiteProcedures->sqlite->initializeIndexes(); // do not create indexes (SQL) until all is done. - } - - if (ErrorsFound) { - ShowFatalError(state, "Error condition occurred. Previous Severe Errors cause termination."); - } - } - - void GetProjectData(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Linda K. Lawrie - // DATE WRITTEN November 1997 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine gets global project data from the input file. - - // METHODOLOGY EMPLOYED: - // Use GetObjectItem from the Input Processor - - // Using/Aliasing - using DataStringGlobals::MatchVersion; - using namespace DataSystemVariables; - auto &deviationFromSetPtThresholdClg = state.dataHVACGlobal->deviationFromSetPtThresholdClg; - auto &deviationFromSetPtThresholdHtg = state.dataHVACGlobal->deviationFromSetPtThresholdHtg; - - // SUBROUTINE PARAMETER DEFINITIONS: - static constexpr std::array Div60 = {1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30, 60}; - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Array1D_string Alphas(10); - Array1D Number(4); - int NumAlpha; - int NumNumber; - int IOStat; - int NumDebugOut; - int MinInt; - int Num; - int Which; - bool ErrorsFound; - int NumRunControl; - std::string VersionID; - std::string CurrentModuleObject; - bool CondFDAlgo; - int Item; - - ErrorsFound = false; - - CurrentModuleObject = "Version"; - Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - if (Num == 1) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - 1, - Alphas, - NumAlpha, - Number, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - std::string::size_type const lenVer(len(MatchVersion)); - if ((lenVer > 0) && (MatchVersion[lenVer - 1] == '0')) { - Which = static_cast(index(Alphas(1).substr(0, lenVer - 2), MatchVersion.substr(0, lenVer - 2))); - } else { - Which = static_cast(index(Alphas(1), MatchVersion)); - } - if (Which != 0) { - ShowWarningError(state, CurrentModuleObject + ": in IDF=\"" + Alphas(1) + "\" not the same as expected=\"" + MatchVersion + "\""); - } - VersionID = Alphas(1); - } else if (Num == 0) { - ShowWarningError(state, CurrentModuleObject + ": missing in IDF, processing for EnergyPlus version=\"" + MatchVersion + "\""); - } else { - ShowSevereError(state, "Too many " + CurrentModuleObject + " Objects found."); - ErrorsFound = true; - } - - // Do Mini Gets on HB Algorithm and by-surface overrides - CurrentModuleObject = "HeatBalanceAlgorithm"; - Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - CondFDAlgo = false; - if (Num > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - 1, - Alphas, - NumAlpha, - Number, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - static constexpr std::array condFDTypes = { - "CONDUCTIONFINITEDIFFERENCE", "CONDFD", "CONDUCTIONFINITEDIFFERENCEDETAILED", "CONDUCTIONFINITEDIFFERENCESIMPLIFIED"}; - CondFDAlgo = std::find(condFDTypes.begin(), condFDTypes.end(), Alphas(1)) != condFDTypes.end(); - } - CurrentModuleObject = "SurfaceProperty:HeatTransferAlgorithm"; - Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - if (Num > 0) { - for (Item = 1; Item <= Num; ++Item) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - Item, - Alphas, - NumAlpha, - Number, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (Alphas(2) == "CONDUCTIONFINITEDIFFERENCE") CondFDAlgo = true; - } - } - CurrentModuleObject = "SurfaceProperty:HeatTransferAlgorithm:MultipleSurface"; - Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - if (Num > 0) { - for (Item = 1; Item <= Num; ++Item) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - 1, - Alphas, - NumAlpha, - Number, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (Alphas(3) == "CONDUCTIONFINITEDIFFERENCE") CondFDAlgo = true; - } - } - CurrentModuleObject = "SurfaceProperty:HeatTransferAlgorithm:SurfaceList"; - Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - if (Num > 0) { - for (Item = 1; Item <= Num; ++Item) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - 1, - state.dataIPShortCut->cAlphaArgs, - NumAlpha, - Number, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (state.dataIPShortCut->cAlphaArgs(2) == "CONDUCTIONFINITEDIFFERENCE") CondFDAlgo = true; - } - } - CurrentModuleObject = "SurfaceProperty:HeatTransferAlgorithm:Construction"; - Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - if (Num > 0) { - for (Item = 1; Item <= Num; ++Item) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - 1, - state.dataIPShortCut->cAlphaArgs, - NumAlpha, - Number, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (state.dataIPShortCut->cAlphaArgs(2) == "CONDUCTIONFINITEDIFFERENCE") CondFDAlgo = true; - } - } - - CurrentModuleObject = "Timestep"; - Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - if (Num == 1) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - 1, - Alphas, - NumAlpha, - Number, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - state.dataGlobal->NumOfTimeStepInHour = Number(1); - if (state.dataGlobal->NumOfTimeStepInHour <= 0 || state.dataGlobal->NumOfTimeStepInHour > 60) { - Alphas(1) = fmt::to_string(state.dataGlobal->NumOfTimeStepInHour); - ShowWarningError(state, CurrentModuleObject + ": Requested number (" + Alphas(1) + ") invalid, Defaulted to 4"); - state.dataGlobal->NumOfTimeStepInHour = 4; - } else if (mod(60, state.dataGlobal->NumOfTimeStepInHour) != 0) { - MinInt = 9999; - for (Num = 1; Num <= 12; ++Num) { - if (std::abs(state.dataGlobal->NumOfTimeStepInHour - Div60[Num - 1]) > MinInt) continue; - MinInt = state.dataGlobal->NumOfTimeStepInHour - Div60[Num - 1]; - Which = Num; - } - ShowWarningError(state, - format("{}: Requested number ({}) not evenly divisible into 60, defaulted to nearest ({}).", - CurrentModuleObject, - state.dataGlobal->NumOfTimeStepInHour, - Div60[Which - 1])); - state.dataGlobal->NumOfTimeStepInHour = Div60[Which - 1]; - } - if (CondFDAlgo && state.dataGlobal->NumOfTimeStepInHour < 20) { - ShowWarningError(state, - format("{}: Requested number ({}) cannot be used when Conduction Finite Difference algorithm is selected.", - CurrentModuleObject, - state.dataGlobal->NumOfTimeStepInHour)); - ShowContinueError(state, "..." + CurrentModuleObject + " is set to 20."); - state.dataGlobal->NumOfTimeStepInHour = 20; - } - if (state.dataGlobal->NumOfTimeStepInHour < 4 && state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Zone") > 0) { - ShowWarningError(state, - format("{}: Requested number ({}) is less than the suggested minimum of 4.", - CurrentModuleObject, - state.dataGlobal->NumOfTimeStepInHour)); - ShowContinueError(state, - "Please see entry for " + CurrentModuleObject + " in Input/Output Reference for discussion of considerations."); - } - } else if (Num == 0 && state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Zone") > 0 && !CondFDAlgo) { - ShowWarningError(state, "No " + CurrentModuleObject + " object found. Number of TimeSteps in Hour defaulted to 4."); - state.dataGlobal->NumOfTimeStepInHour = 4; - } else if (Num == 0 && !CondFDAlgo) { - state.dataGlobal->NumOfTimeStepInHour = 4; - } else if (Num == 0 && state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Zone") > 0 && CondFDAlgo) { - ShowWarningError(state, "No " + CurrentModuleObject + " object found. Number of TimeSteps in Hour defaulted to 20."); - ShowContinueError(state, "...Due to presence of Conduction Finite Difference Algorithm selection."); - state.dataGlobal->NumOfTimeStepInHour = 20; - } else if (Num == 0 && CondFDAlgo) { - state.dataGlobal->NumOfTimeStepInHour = 20; - } else { - ShowSevereError(state, "Too many " + CurrentModuleObject + " Objects found."); - ErrorsFound = true; - } - - state.dataGlobal->TimeStepZone = 1.0 / double(state.dataGlobal->NumOfTimeStepInHour); - state.dataGlobal->MinutesPerTimeStep = state.dataGlobal->TimeStepZone * 60; - state.dataGlobal->TimeStepZoneSec = state.dataGlobal->TimeStepZone * DataGlobalConstants::SecInHour; - - CurrentModuleObject = "ConvergenceLimits"; - Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - if (Num == 1) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - 1, - Alphas, - NumAlpha, - Number, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - MinInt = int(Number(1)); - if (MinInt > state.dataGlobal->MinutesPerTimeStep) { - MinInt = state.dataGlobal->MinutesPerTimeStep; - } - if (MinInt < 0 || MinInt > 60) { - ShowWarningError( - state, - format( - "{}: Requested {} ({}) invalid. Set to 1 minute.", CurrentModuleObject, state.dataIPShortCut->cNumericFieldNames(1), MinInt)); - state.dataConvergeParams->MinTimeStepSys = 1.0 / 60.0; - } else if (MinInt == 0) { // Set to TimeStepZone - state.dataConvergeParams->MinTimeStepSys = state.dataGlobal->TimeStepZone; - } else { - state.dataConvergeParams->MinTimeStepSys = double(MinInt) / 60.0; - } - state.dataConvergeParams->MaxIter = int(Number(2)); - if (state.dataConvergeParams->MaxIter <= 0) { - state.dataConvergeParams->MaxIter = 20; - } - if (!state.dataIPShortCut->lNumericFieldBlanks(3)) state.dataConvergeParams->MinPlantSubIterations = int(Number(3)); - if (!state.dataIPShortCut->lNumericFieldBlanks(4)) state.dataConvergeParams->MaxPlantSubIterations = int(Number(4)); - // trap bad values - if (state.dataConvergeParams->MinPlantSubIterations < 1) state.dataConvergeParams->MinPlantSubIterations = 1; - if (state.dataConvergeParams->MaxPlantSubIterations < 3) state.dataConvergeParams->MaxPlantSubIterations = 3; - if (state.dataConvergeParams->MinPlantSubIterations > state.dataConvergeParams->MaxPlantSubIterations) - state.dataConvergeParams->MaxPlantSubIterations = state.dataConvergeParams->MinPlantSubIterations + 1; - - } else if (Num == 0) { - state.dataConvergeParams->MinTimeStepSys = 1.0 / 60.0; - state.dataConvergeParams->MaxIter = 20; - state.dataConvergeParams->MinPlantSubIterations = 2; - state.dataConvergeParams->MaxPlantSubIterations = 8; - } else { - ShowSevereError(state, "Too many " + CurrentModuleObject + " Objects found."); - ErrorsFound = true; - } - - state.dataHVACGlobal->LimitNumSysSteps = int(state.dataGlobal->TimeStepZone / state.dataConvergeParams->MinTimeStepSys); - - state.dataReportFlag->DebugOutput = false; - state.dataReportFlag->EvenDuringWarmup = false; - CurrentModuleObject = "Output:DebuggingData"; - NumDebugOut = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - if (NumDebugOut > 1) { - ShowWarningError(state, CurrentModuleObject + ": More than 1 occurrence of this object found, only first will be used."); - } - if (NumDebugOut > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, CurrentModuleObject, 1, Alphas, NumAlpha, Number, NumNumber, IOStat); - if (NumAlpha >= 1) { - state.dataReportFlag->DebugOutput = UtilityRoutines::SameString(Alphas(1), "Yes"); - } - if (NumAlpha >= 2) { - state.dataReportFlag->EvenDuringWarmup = UtilityRoutines::SameString(Alphas(2), "Yes"); - } - } - - { - CurrentModuleObject = "Output:Diagnostics"; - Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - if (Num > 1) { - // Let it slide, but warn - // ErrorsFound = true; - ShowWarningError(state, CurrentModuleObject + ": More than 1 occurrence of this object found, only first will be used."); - } - auto const instances = state.dataInputProcessing->inputProcessor->epJSON.find(CurrentModuleObject); - - if (instances != state.dataInputProcessing->inputProcessor->epJSON.end()) { - auto &instancesValue = instances.value(); - for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { - auto const &fields = instance.value(); - auto const &thisObjectName = instance.key(); - state.dataInputProcessing->inputProcessor->markObjectAsUsed(CurrentModuleObject, thisObjectName); - - auto diagnosticsExtensibles = fields.find("diagnostics"); - if (diagnosticsExtensibles != fields.end()) { - auto diagnosticsExtensiblesArray = diagnosticsExtensibles.value(); - for (auto diagnosticsExtensible : diagnosticsExtensiblesArray) { - - // We want to avoid cryptic failures such as this one: "[json.exception.out_of_range.403] key 'key' not found" - // Which happens if you put an "empty" entry in the extensible portion - auto it = diagnosticsExtensible.find("key"); - if (it == diagnosticsExtensible.end()) { - ShowWarningError(state, CurrentModuleObject + ": empty key found, consider removing it to avoid this warning."); - continue; - } - std::string diagnosticName = it->get(); - - if (UtilityRoutines::SameString(diagnosticName, "DisplayExtraWarnings")) { - state.dataGlobal->DisplayExtraWarnings = true; - } else if (UtilityRoutines::SameString(diagnosticName, "DisplayAdvancedReportVariables")) { - state.dataGlobal->DisplayAdvancedReportVariables = true; - } else if (UtilityRoutines::SameString(diagnosticName, "DisplayAllWarnings")) { - state.dataGlobal->DisplayAllWarnings = true; - state.dataGlobal->DisplayExtraWarnings = true; - state.dataGlobal->DisplayUnusedObjects = true; - state.dataGlobal->DisplayUnusedSchedules = true; - } else if (UtilityRoutines::SameString(diagnosticName, "DisplayUnusedObjects")) { - state.dataGlobal->DisplayUnusedObjects = true; - } else if (UtilityRoutines::SameString(diagnosticName, "DisplayUnusedSchedules")) { - state.dataGlobal->DisplayUnusedSchedules = true; - } else if (UtilityRoutines::SameString(diagnosticName, "DisplayZoneAirHeatBalanceOffBalance")) { - state.dataGlobal->DisplayZoneAirHeatBalanceOffBalance = true; - } else if (UtilityRoutines::SameString(diagnosticName, "DoNotMirrorDetachedShading")) { - state.dataReportFlag->MakeMirroredDetachedShading = false; - } else if (UtilityRoutines::SameString(diagnosticName, "DoNotMirrorAttachedShading")) { - state.dataReportFlag->MakeMirroredAttachedShading = false; - } else if (UtilityRoutines::SameString(diagnosticName, "ReportDuringWarmup")) { - state.dataSysVars->ReportDuringWarmup = true; - } else if (UtilityRoutines::SameString(diagnosticName, "DisplayWeatherMissingDataWarnings")) { - state.dataEnvrn->DisplayWeatherMissingDataWarnings = true; - } else if (UtilityRoutines::SameString(diagnosticName, "IgnoreSolarRadiation")) { // TODO: Not a valid key choice - state.dataEnvrn->IgnoreSolarRadiation = true; - } else if (UtilityRoutines::SameString(diagnosticName, "IgnoreBeamRadiation")) { // TODO: Not a valid key choice - state.dataEnvrn->IgnoreBeamRadiation = true; - } else if (UtilityRoutines::SameString(diagnosticName, "IgnoreDiffuseRadiation")) { // TODO: Not a valid key choice - state.dataEnvrn->IgnoreDiffuseRadiation = true; - } else if (UtilityRoutines::SameString(diagnosticName, "DeveloperFlag")) { // TODO: Not a valid key choice - state.dataSysVars->DeveloperFlag = true; - } else if (UtilityRoutines::SameString(diagnosticName, "TimingFlag")) { // TODO: Not a valid key choice - state.dataSysVars->TimingFlag = true; - } else if (UtilityRoutines::SameString(diagnosticName, "ReportDetailedWarmupConvergence")) { - state.dataSysVars->ReportDetailedWarmupConvergence = true; - } else if (UtilityRoutines::SameString(diagnosticName, "ReportDuringHVACSizingSimulation")) { - state.dataSysVars->ReportDuringHVACSizingSimulation = true; - } else if (UtilityRoutines::SameString(diagnosticName, "CreateMinimalSurfaceVariables")) { // TODO: Not a valid key choice - continue; - // CreateMinimalSurfaceVariables=.TRUE. - } else if (UtilityRoutines::SameString(diagnosticName, "CreateNormalSurfaceVariables")) { // TODO: Not a valid key choice - continue; - // IF (CreateMinimalSurfaceVariables) THEN - // CALL ShowWarningError(state, 'GetProjectData: '//TRIM(CurrentModuleObject)//'=''// & - // TRIM(diagnosticName)//'', prior set=true for this condition reverts to false.') - // ENDIF - // CreateMinimalSurfaceVariables=.FALSE. - } else if (!diagnosticName.empty()) { - ShowWarningError(state, - "GetProjectData: " + CurrentModuleObject + "=\"" + diagnosticName + - "\", Invalid value for field, entered value ignored."); - } - } - } - - // Don't process the duplicate ones - break; - } - } - } - - CurrentModuleObject = "OutputControl:ReportingTolerances"; - Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - if (Num > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - 1, - Alphas, - NumAlpha, - Number, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (!state.dataIPShortCut->lNumericFieldBlanks(1)) { - deviationFromSetPtThresholdHtg = -Number(1); - } else { - deviationFromSetPtThresholdHtg = -0.2; - } - if (!state.dataIPShortCut->lNumericFieldBlanks(2)) { - deviationFromSetPtThresholdClg = Number(2); - } else { - deviationFromSetPtThresholdClg = 0.2; - } - } - - state.dataGlobal->DoZoneSizing = false; - state.dataGlobal->DoSystemSizing = false; - state.dataGlobal->DoPlantSizing = false; - state.dataGlobal->DoDesDaySim = true; - state.dataGlobal->DoWeathSim = true; - state.dataGlobal->DoHVACSizingSimulation = false; - state.dataGlobal->HVACSizingSimMaxIterations = 0; - CurrentModuleObject = "SimulationControl"; - NumRunControl = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - if (NumRunControl > 0) { - state.dataSimulationManager->RunControlInInput = true; - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - 1, - Alphas, - NumAlpha, - Number, - NumNumber, - IOStat, - state.dataIPShortCut->lNumericFieldBlanks, - state.dataIPShortCut->lAlphaFieldBlanks, - state.dataIPShortCut->cAlphaFieldNames, - state.dataIPShortCut->cNumericFieldNames); - if (Alphas(1) == "YES") state.dataGlobal->DoZoneSizing = true; - if (Alphas(2) == "YES") state.dataGlobal->DoSystemSizing = true; - if (Alphas(3) == "YES") state.dataGlobal->DoPlantSizing = true; - if (Alphas(4) == "NO") state.dataGlobal->DoDesDaySim = false; - if (Alphas(5) == "NO") state.dataGlobal->DoWeathSim = false; - if (NumAlpha > 5) { - if (Alphas(6) == "YES") state.dataGlobal->DoHVACSizingSimulation = true; - } - } - if (state.dataSysVars->DDOnly) { - state.dataGlobal->DoDesDaySim = true; - state.dataGlobal->DoWeathSim = false; - } - if (state.dataSysVars->FullAnnualRun) { - state.dataGlobal->DoDesDaySim = false; - state.dataGlobal->DoWeathSim = true; - } - - if ((!state.dataGlobal->DoDesDaySim && !state.dataGlobal->DoWeathSim && !state.dataGlobal->DoHVACSizingSimulation) && - (state.dataGlobal->DoZoneSizing || state.dataGlobal->DoSystemSizing)) { - state.dataGlobal->DoPureLoadCalc = true; - } - - CurrentModuleObject = "PerformancePrecisionTradeoffs"; - auto const instances = state.dataInputProcessing->inputProcessor->epJSON.find(CurrentModuleObject); - Num = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - if (Num > 1) { - ErrorsFound = true; - ShowFatalError(state, "GetProjectData: Only one (\"1\") " + CurrentModuleObject + " object per simulation is allowed."); - } - state.dataGlobal->createPerfLog = Num > 0; - std::string overrideModeValue = "Normal"; - if (instances != state.dataInputProcessing->inputProcessor->epJSON.end()) { - auto &instancesValue = instances.value(); - for (auto instance = instancesValue.begin(); instance != instancesValue.end(); ++instance) { - auto const &fields = instance.value(); - auto const &thisObjectName = instance.key(); - state.dataInputProcessing->inputProcessor->markObjectAsUsed(CurrentModuleObject, thisObjectName); - if (fields.find("use_coil_direct_solutions") != fields.end()) { - state.dataGlobal->DoCoilDirectSolutions = - UtilityRoutines::MakeUPPERCase(fields.at("use_coil_direct_solutions").get()) == "YES"; - } - if (fields.find("zone_radiant_exchange_algorithm") != fields.end()) { - state.dataHeatBalIntRadExchg->CarrollMethod = - UtilityRoutines::MakeUPPERCase(fields.at("zone_radiant_exchange_algorithm").get()) == "CARROLLMRT"; - } - if (fields.find("use_representative_surfaces_for_calculations") != fields.end()) { - state.dataSurface->UseRepresentativeSurfaceCalculations = - UtilityRoutines::MakeUPPERCase(fields.at("use_representative_surfaces_for_calculations").get()) == "YES"; - } - bool overrideTimestep(false); - bool overrideZoneAirHeatBalAlg(false); - bool overrideMinNumWarmupDays(false); - bool overrideBeginEnvResetSuppress(false); - bool overrideMaxZoneTempDiff(false); - bool overrideSystemTimestep(false); - bool overrideMaxAllowedDelTemp(false); - bool overridePsychTsatFnPb(false); - state.dataZoneTempPredictorCorrector->OscillationVariablesNeeded = true; - if (fields.find("override_mode") != fields.end()) { - overrideModeValue = UtilityRoutines::MakeUPPERCase(fields.at("override_mode").get()); - if (overrideModeValue == "NORMAL") { - // no overrides - } else if (overrideModeValue == "MODE01") { - // Zone Time step (TimeStep object) will be set to one timestep per hour - overrideTimestep = true; - } else if (overrideModeValue == "MODE02") { - // Mode01 plus ZoneAirHeatBalanceAlgorithm will be set to Euler - overrideTimestep = true; - overrideZoneAirHeatBalAlg = true; - } else if (overrideModeValue == "MODE03") { - // Mode02 plus Minimum Number of Warmup Days will be set to 1 - overrideTimestep = true; - overrideZoneAirHeatBalAlg = true; - overrideMinNumWarmupDays = true; - } else if (overrideModeValue == "MODE04") { - // Mode03 plus Begin Environment Reset Mode will be set to SuppressAllBeginEnvironmentResets - overrideTimestep = true; - overrideZoneAirHeatBalAlg = true; - overrideMinNumWarmupDays = true; - overrideBeginEnvResetSuppress = true; - } else if (overrideModeValue == "MODE05") { - // Mode04 plus Minimun System Timestep will be set to 1hr - overrideTimestep = true; - overrideZoneAirHeatBalAlg = true; - overrideMinNumWarmupDays = true; - overrideBeginEnvResetSuppress = true; - overrideSystemTimestep = true; - } else if (overrideModeValue == "MODE06") { - // Mode05 plus cubic spline interpolations in replacement of the original psychrometric function PsychTsatFnPb - overrideTimestep = true; - overrideZoneAirHeatBalAlg = true; - overrideMinNumWarmupDays = true; - overrideBeginEnvResetSuppress = true; - overrideSystemTimestep = true; - overridePsychTsatFnPb = true; - } else if (overrideModeValue == "MODE07") { - // Mode06 plus internal variable MaxZoneTempDiff will be set to 1.00 - overrideTimestep = true; - overrideZoneAirHeatBalAlg = true; - overrideMinNumWarmupDays = true; - overrideBeginEnvResetSuppress = true; - overrideSystemTimestep = true; - overrideMaxZoneTempDiff = true; - overridePsychTsatFnPb = true; - } else if (overrideModeValue == "MODE08") { - // Mode07 plus internal variable MaxAllowedDelTemp will be set to 0.1 - overrideTimestep = true; - overrideZoneAirHeatBalAlg = true; - overrideMinNumWarmupDays = true; - overrideBeginEnvResetSuppress = true; - overrideSystemTimestep = true; - overrideMaxZoneTempDiff = true; - overrideMaxAllowedDelTemp = true; - overridePsychTsatFnPb = true; - } else if (overrideModeValue == "ADVANCED") { - bool advancedModeUsed = false; - if (fields.find("maxzonetempdiff") != fields.end()) { // not required field, has default value - state.dataConvergeParams->MaxZoneTempDiff = fields.at("maxzonetempdiff").get(); - ShowWarningError(state, - format("PerformancePrecisionTradeoffs using the Advanced Override Mode, MaxZoneTempDiff set to: {:.4R}", - state.dataConvergeParams->MaxZoneTempDiff)); - advancedModeUsed = true; - } - if (fields.find("maxalloweddeltemp") != fields.end()) { // not required field, has default value - state.dataHeatBal->MaxAllowedDelTemp = fields.at("maxalloweddeltemp").get(); - ShowWarningError( - state, - format("PerformancePrecisionTradeoffs using the Advanced Override Mode, MaxAllowedDelTemp set to: {:.4R}", - state.dataHeatBal->MaxAllowedDelTemp)); - advancedModeUsed = true; - } - if (advancedModeUsed) { - ShowContinueError(state, - "...Care should be used when using the Advanced Override Mode. Results may be significantly different " - "than a simulation not using this mode."); - } else { - ShowWarningError( - state, "PerformancePrecisionTradeoffs using the Advanced Override Mode but no specific parameters have been set."); - } - } else { - ShowSevereError(state, "Invalid over ride mode specified in PerformancePrecisionTradeoffs object: " + overrideModeValue); - } - - if (overrideTimestep) { - ShowWarningError(state, "Due to PerformancePrecisionTradeoffs Override Mode, the Number of TimeSteps has been changed to 1."); - state.dataGlobal->NumOfTimeStepInHour = 1; - state.dataGlobal->TimeStepZone = 1.0 / double(state.dataGlobal->NumOfTimeStepInHour); - state.dataGlobal->MinutesPerTimeStep = state.dataGlobal->TimeStepZone * 60; - state.dataGlobal->TimeStepZoneSec = state.dataGlobal->TimeStepZone * DataGlobalConstants::SecInHour; - state.dataGlobal->OverrideTimestep = true; - } - if (overrideZoneAirHeatBalAlg) { - ShowWarningError( - state, - "Due to PerformancePrecisionTradeoffs Override Mode, the ZoneAirHeatBalanceAlgorithm has been changed to EulerMethod."); - state.dataHeatBal->OverrideZoneAirSolutionAlgo = true; - } - if (overrideMinNumWarmupDays) { - ShowWarningError( - state, "Due to PerformancePrecisionTradeoffs Override Mode, the Minimum Number of Warmup Days has been changed to 1."); - state.dataHeatBal->MinNumberOfWarmupDays = 1; - } - if (overrideBeginEnvResetSuppress) { - ShowWarningError(state, - "Due to PerformancePrecisionTradeoffs Override Mode, the Begin Environment Reset Mode has been changed to " - "SuppressAllBeginEnvironmentResets."); - state.dataEnvrn->forceBeginEnvResetSuppress = true; - } - if (overrideSystemTimestep) { - ShowWarningError( - state, "Due to PerformancePrecisionTradeoffs Override Mode, the minimum System TimeSteps has been changed to 1 hr."); - int MinTimeStepSysOverrideValue = 60.0; - if (MinTimeStepSysOverrideValue > state.dataGlobal->MinutesPerTimeStep) { - MinTimeStepSysOverrideValue = state.dataGlobal->MinutesPerTimeStep; - } - state.dataConvergeParams->MinTimeStepSys = MinTimeStepSysOverrideValue / 60.0; - state.dataHVACGlobal->LimitNumSysSteps = int(state.dataGlobal->TimeStepZone / state.dataConvergeParams->MinTimeStepSys); - } - if (overridePsychTsatFnPb) { - ShowWarningError(state, - "Due to PerformancePrecisionTradeoffs Override Mode, the saturated temperature will be calculated using " - "cubic spline interpolations in replacement of PsychTsatFnPb ."); - // Mode06 CSpline interpolation (64 Pa bin size + 20/16 bit) - state.dataPsychrometrics->useInterpolationPsychTsatFnPb = true; -#ifdef EP_cache_PsyTsatFnPb - state.dataPsychCache->tsatprecision_bits = 20; -#endif - } - if (overrideMaxZoneTempDiff) { - ShowWarningError( - state, "Due to PerformancePrecisionTradeoffs Override Mode, internal variable MaxZoneTempDiff will be set to 1.0 ."); - state.dataConvergeParams->MaxZoneTempDiff = 1.0; - } - if (overrideMaxAllowedDelTemp) { - ShowWarningError( - state, "Due to PerformancePrecisionTradeoffs Override Mode, internal variable MaxAllowedDelTemp will be set to 0.1 ."); - state.dataHeatBal->MaxAllowedDelTemp = 0.1; - } - } - } - } - if (ErrorsFound) { - ShowFatalError(state, "Errors found getting Project Input"); - } - - print(state.files.eio, "{}\n", "! , Version ID"); - static constexpr std::string_view Format_721(" Version, {}\n"); - print(state.files.eio, Format_721, VersionID); - - print(state.files.eio, "{}\n", "! , #TimeSteps, Minutes per TimeStep {minutes}"); - static constexpr std::string_view Format_731(" Timesteps per Hour, {:2}, {:2}\n"); - print(state.files.eio, Format_731, state.dataGlobal->NumOfTimeStepInHour, state.dataGlobal->MinutesPerTimeStep); - - print(state.files.eio, - "{}\n", - "! , Minimum System TimeStep {minutes}, Max HVAC Iterations, Minimum Plant " - "Iterations, Maximum Plant Iterations"); - MinInt = state.dataConvergeParams->MinTimeStepSys * 60.0; - static constexpr std::string_view Format_733(" System Convergence Limits, {}, {}, {}, {}\n"); - print(state.files.eio, - Format_733, - MinInt, - state.dataConvergeParams->MaxIter, - state.dataConvergeParams->MinPlantSubIterations, - state.dataConvergeParams->MaxPlantSubIterations); - - if (state.dataGlobal->DoZoneSizing) { - Alphas(1) = "Yes"; - } else { - Alphas(1) = "No"; - } - if (state.dataGlobal->DoSystemSizing) { - Alphas(2) = "Yes"; - } else { - Alphas(2) = "No"; - } - if (state.dataGlobal->DoPlantSizing) { - Alphas(3) = "Yes"; - } else { - Alphas(3) = "No"; - } - if (state.dataGlobal->DoDesDaySim) { - Alphas(4) = "Yes"; - } else { - Alphas(4) = "No"; - } - if (state.dataGlobal->DoWeathSim) { - Alphas(5) = "Yes"; - } else { - Alphas(5) = "No"; - } - if (state.dataGlobal->DoHVACSizingSimulation) { - Alphas(6) = "Yes"; - if (NumNumber >= 1) { - state.dataGlobal->HVACSizingSimMaxIterations = Number(1); - } - } else { - Alphas(6) = "No"; - } - - print(state.files.eio, - "{}\n", - "! , Do Zone Sizing, Do System Sizing, Do Plant Sizing, Do Design Days, Do Weather " - "Simulation, Do HVAC Sizing Simulation"); - print(state.files.eio, " Simulation Control"); - for (Num = 1; Num <= 6; ++Num) { - print(state.files.eio, ", {}", Alphas(Num)); - } - print(state.files.eio, "\n"); - - // Performance Precision Tradeoffs - if (state.dataGlobal->DoCoilDirectSolutions) { - Alphas(1) = "Yes"; - ShowWarningError(state, "PerformancePrecisionTradeoffs: Coil Direct Solution simulation is selected."); - } else { - Alphas(1) = "No"; - } - if (state.dataHeatBalIntRadExchg->CarrollMethod) { - Alphas(2) = "CarrollMRT"; - ShowWarningError(state, "PerformancePrecisionTradeoffs: Carroll MRT radiant exchange method is selected."); - } else { - Alphas(2) = "ScriptF"; - } - Alphas(3) = overrideModeValue; - Alphas(4) = fmt::to_string(state.dataGlobal->NumOfTimeStepInHour); - if (state.dataHeatBal->OverrideZoneAirSolutionAlgo) { - Alphas(5) = "Yes"; - } else { - Alphas(5) = "No"; - } - Alphas(6) = fmt::to_string(state.dataHeatBal->MinNumberOfWarmupDays); - if (state.dataEnvrn->forceBeginEnvResetSuppress) { - Alphas(7) = "Yes"; - } else { - Alphas(7) = "No"; - } - Alphas(8) = format("{:.1R}", state.dataConvergeParams->MinTimeStepSys * 60.0); - Alphas(9) = format("{:.3R}", state.dataConvergeParams->MaxZoneTempDiff); - Alphas(10) = format("{:.4R}", state.dataHeatBal->MaxAllowedDelTemp); - std::string pptHeader = "! , Use Coil Direct Simulation, " - "Zone Radiant Exchange Algorithm, Override Mode, Number of Timestep In Hour, " - "Force Euler Method, Minimum Number of Warmup Days, Force Suppress All Begin Environment Resets, " - "Minimum System Timestep, MaxZoneTempDiff, MaxAllowedDelTemp"; - print(state.files.eio, "{}\n", pptHeader); - print(state.files.eio, " Performance Precision Tradeoffs"); - for (Num = 1; Num <= 10; ++Num) { - print(state.files.eio, ", {}", Alphas(Num)); - } - print(state.files.eio, "\n"); - - print(state.files.eio, - "{}\n", - "! , Tolerance for Time Heating Setpoint Not Met, Tolerance for Zone Cooling Setpoint Not Met Time"); - // Formats - static constexpr std::string_view Format_751(" Output Reporting Tolerances, {:.3R}, {:.3R}, \n"); - - print(state.files.eio, Format_751, std::abs(deviationFromSetPtThresholdHtg), deviationFromSetPtThresholdClg); - - // IF (DisplayExtraWarnings) THEN - // Write(OutputFileInits,740) - // Write(OutputFileInits,741) (TRIM(Alphas(Num)),Num=1,5) - // 742 Format('! , Display Advanced Report Variables, Do Not Mirror Detached Shading') - // IF (DisplayAdvancedReportVariables) THEN - // NumOut1='Yes' - // ELSE - // NumOut2='No' - // ENDIF - // IF (.not. MakeMirroredDetachedShading) THEN - // NumOut1='Yes' - // ELSE - // NumOut2='No' - // ENDIF - // unused0909743 Format(' Display Extra Warnings',2(', ',A)) - // ENDIF - if (state.dataGlobal->createPerfLog) { - writeIntialPerfLogValues(state, overrideModeValue); - } - } - - void writeIntialPerfLogValues(EnergyPlusData &state, std::string const ¤tOverrideModeValue) - // write the input related portions of the .perflog - // J.Glazer February 2020 - { - UtilityRoutines::appendPerfLog(state, - "Program, Version, TimeStamp", - state.dataStrGlobals->VerStringVar); // this string already includes three portions and has commas - UtilityRoutines::appendPerfLog(state, "Use Coil Direct Solution", bool_to_string(state.dataGlobal->DoCoilDirectSolutions)); - if (state.dataHeatBalIntRadExchg->CarrollMethod) { - UtilityRoutines::appendPerfLog(state, "Zone Radiant Exchange Algorithm", "CarrollMRT"); - } else { - UtilityRoutines::appendPerfLog(state, "Zone Radiant Exchange Algorithm", "ScriptF"); - } - UtilityRoutines::appendPerfLog(state, "Override Mode", currentOverrideModeValue); - UtilityRoutines::appendPerfLog(state, "Number of Timesteps per Hour", fmt::to_string(state.dataGlobal->NumOfTimeStepInHour)); - UtilityRoutines::appendPerfLog(state, "Minimum Number of Warmup Days", fmt::to_string(state.dataHeatBal->MinNumberOfWarmupDays)); - UtilityRoutines::appendPerfLog(state, "SuppressAllBeginEnvironmentResets", bool_to_string(state.dataEnvrn->forceBeginEnvResetSuppress)); - UtilityRoutines::appendPerfLog(state, "Minimum System Timestep", format("{:.1R}", state.dataConvergeParams->MinTimeStepSys * 60.0)); - UtilityRoutines::appendPerfLog(state, "MaxZoneTempDiff", format("{:.2R}", state.dataConvergeParams->MaxZoneTempDiff)); - UtilityRoutines::appendPerfLog(state, "MaxAllowedDelTemp", format("{:.4R}", state.dataHeatBal->MaxAllowedDelTemp)); - } - - std::string bool_to_string(bool logical) - { - if (logical) { - return ("True"); - } else { - return ("False"); - } - } - - void CheckForMisMatchedEnvironmentSpecifications(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN August 2008 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // In response to CR 7518, this routine will check to see if a proper combination of SimulationControl, RunPeriod, - // SizingPeriod:*, etc are entered to proceed with a simulation. - - // METHODOLOGY EMPLOYED: - // For now (8/2008), the routine will query several objects in the input. And try to produce warnings or - // fatals as a result. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int NumZoneSizing; - int NumSystemSizing; - int NumPlantSizing; - int NumDesignDays; - int NumRunPeriodDesign; - int NumSizingDays; - bool WeatherFileAttached; - bool ErrorsFound; - - ErrorsFound = false; - NumZoneSizing = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Sizing:Zone"); - NumSystemSizing = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Sizing:System"); - NumPlantSizing = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Sizing:Plant"); - NumDesignDays = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SizingPeriod:DesignDay"); - NumRunPeriodDesign = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SizingPeriod:WeatherFileDays") + - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SizingPeriod:WeatherFileConditionType"); - NumSizingDays = NumDesignDays + NumRunPeriodDesign; - - WeatherFileAttached = FileSystem::fileExists(state.files.inputWeatherFilePath.filePath); - - if (state.dataSimulationManager->RunControlInInput) { - if (state.dataGlobal->DoZoneSizing) { - if (NumZoneSizing > 0 && NumSizingDays == 0) { - ErrorsFound = true; - ShowSevereError( - state, "CheckEnvironmentSpecifications: Sizing for Zones has been requested but there are no design environments specified."); - ShowContinueError(state, "...Add appropriate SizingPeriod:* objects for your simulation."); - } - if (NumZoneSizing > 0 && NumRunPeriodDesign > 0 && !WeatherFileAttached) { - ErrorsFound = true; - ShowSevereError(state, - "CheckEnvironmentSpecifications: Sizing for Zones has been requested; Design period from the weather file " - "requested; but no weather file specified."); - } - } - if (state.dataGlobal->DoSystemSizing) { - if (NumSystemSizing > 0 && NumSizingDays == 0) { - ErrorsFound = true; - ShowSevereError( - state, - "CheckEnvironmentSpecifications: Sizing for Systems has been requested but there are no design environments specified."); - ShowContinueError(state, "...Add appropriate SizingPeriod:* objects for your simulation."); - } - if (NumSystemSizing > 0 && NumRunPeriodDesign > 0 && !WeatherFileAttached) { - ErrorsFound = true; - ShowSevereError(state, - "CheckEnvironmentSpecifications: Sizing for Systems has been requested; Design period from the weather file " - "requested; but no weather file specified."); - } - } - if (state.dataGlobal->DoPlantSizing) { - if (NumPlantSizing > 0 && NumSizingDays == 0) { - ErrorsFound = true; - ShowSevereError(state, - "CheckEnvironmentSpecifications: Sizing for Equipment/Plants has been requested but there are no design " - "environments specified."); - ShowContinueError(state, "...Add appropriate SizingPeriod:* objects for your simulation."); - } - if (NumPlantSizing > 0 && NumRunPeriodDesign > 0 && !WeatherFileAttached) { - ErrorsFound = true; - ShowSevereError(state, - "CheckEnvironmentSpecifications: Sizing for Equipment/Plants has been requested; Design period from the weather " - "file requested; but no weather file specified."); - } - } - if (state.dataGlobal->DoDesDaySim && NumSizingDays == 0) { - ShowWarningError(state, - "CheckEnvironmentSpecifications: SimulationControl specified doing design day simulations, but no design " - "environments specified."); - ShowContinueError( - state, - "...No design environment results produced. For these results, add appropriate SizingPeriod:* objects for your simulation."); - } - if (state.dataGlobal->DoDesDaySim && NumRunPeriodDesign > 0 && !WeatherFileAttached) { - ErrorsFound = true; - ShowSevereError(state, - "CheckEnvironmentSpecifications: SimulationControl specified doing design day simulations; weather file design " - "environments specified; but no weather file specified."); - } - if (state.dataGlobal->DoWeathSim && !state.dataSimulationManager->RunPeriodsInInput) { - ShowWarningError(state, - "CheckEnvironmentSpecifications: SimulationControl specified doing weather simulations, but no run periods for " - "weather file specified. No annual results produced."); - } - if (state.dataGlobal->DoWeathSim && state.dataSimulationManager->RunPeriodsInInput && !WeatherFileAttached) { - ShowWarningError(state, - "CheckEnvironmentSpecifications: SimulationControl specified doing weather simulations; run periods for weather " - "file specified; but no weather file specified."); - } - } - - if (!state.dataGlobal->DoDesDaySim && !state.dataGlobal->DoWeathSim) { - // This amounts to checking: (!DoHVACSizingSimulation && !DoZoneSizing && !DoSystemSizing) - if (!state.dataGlobal->DoHVACSizingSimulation && !state.dataGlobal->DoPureLoadCalc) { - ShowSevereError(state, "All elements of SimulationControl are set to \"No\". No simulations can be done. Program terminates."); - ErrorsFound = true; - } else { - ShowWarningError(state, - "\"Run Simulation for Sizing Periods\" and \"Run Simulation for Weather File Run Periods\" are both set to \"No\". " - "No simulations will be performed, and most input will not be read."); - } - } - - if (ErrorsFound) { - ShowFatalError(state, "Program terminates due to preceding conditions."); - } - } - - void CheckForRequestedReporting(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN January 2009 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // EnergyPlus does not automatically produce any results files. Because of this, users may not request - // reports and may get confused when nothing is produced. This routine will provide a warning when - // results should be produced (either sizing periods or weather files are run) but no reports are - // requested. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - bool SimPeriods; - bool ReportingRequested; - - ReportingRequested = false; - SimPeriods = (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SizingPeriod:DesignDay") > 0 || - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SizingPeriod:WeatherFileDays") > 0 || - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "SizingPeriod:WeatherFileConditionType") > 0 || - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "RunPeriod") > 0); - - if ((state.dataGlobal->DoDesDaySim || state.dataGlobal->DoWeathSim || state.dataGlobal->DoPureLoadCalc) && SimPeriods) { - ReportingRequested = (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Table:SummaryReports") > 0 || - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Table:TimeBins") > 0 || - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Table:Monthly") > 0 || - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Table:Annual") > 0 || - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Variable") > 0 || - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Meter") > 0 || - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Meter:MeterFileOnly") > 0 || - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Meter:Cumulative") > 0 || - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "Output:Meter:Cumulative:MeterFileOnly") > 0); - // Not testing for : Output:SQLite or Output:EnvironmentalImpactFactors - if (!ReportingRequested) { - ShowWarningError(state, "No reporting elements have been requested. No simulation results produced."); - ShowContinueError(state, - "...Review requirements such as \"Output:Table:SummaryReports\", \"Output:Table:Monthly\", \"Output:Variable\", " - "\"Output:Meter\" and others."); - } - } - } - - std::unique_ptr OpenStreamFile(EnergyPlusData &state, const fs::path &filePath, std::ios_base::openmode mode) - { - auto result = std::make_unique(filePath, mode); - if (!result->good()) { - ShowFatalError(state, "OpenOutputFiles: Could not open file " + filePath.string() + " for output (write)."); - } - return result; - } - - std::unique_ptr OpenFmtStreamFile(EnergyPlusData &state, const fs::path &filePath) - { - std::unique_ptr result = nullptr; -#ifdef _WIN32 - auto filePathStr = filePath.string(); - auto path = filePathStr.c_str(); -#else - auto path = filePath.c_str(); -#endif - try { - auto f = fmt::output_file(path, fmt::buffer_size = (2 << 17)); - result = std::make_unique(std::move(f)); - } catch (const std::system_error &error) { - ShowSevereError(state, error.what()); - ShowFatalError(state, "OpenOutputFiles: Could not open file " + filePath.string() + " for output (write)."); - } - return result; - } - - void OpenOutputFiles(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Rick Strand - // DATE WRITTEN June 1997 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine opens all of the input and output files needed for - // an EnergyPlus run. - - state.dataGlobal->StdOutputRecordCount = 0; - state.files.eso.ensure_open(state, "OpenOutputFiles", state.files.outputControl.eso); - print(state.files.eso, "Program Version,{}\n", state.dataStrGlobals->VerStringVar); - - // Open the Initialization Output File - state.files.eio.ensure_open(state, "OpenOutputFiles", state.files.outputControl.eio); - print(state.files.eio, "Program Version,{}\n", state.dataStrGlobals->VerStringVar); - - // Open the Meters Output File - state.files.mtr.ensure_open(state, "OpenOutputFiles", state.files.outputControl.mtr); - print(state.files.mtr, "Program Version,{}\n", state.dataStrGlobals->VerStringVar); - - // Open the Branch-Node Details Output File - state.files.bnd.ensure_open(state, "OpenOutputFiles", state.files.outputControl.bnd); - print(state.files.bnd, "Program Version,{}\n", state.dataStrGlobals->VerStringVar); - } - - void CloseOutputFiles(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Rick Strand - // DATE WRITTEN June 1997 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine closes all of the input and output files needed for - // an EnergyPlus run. It also prints the end of data marker for each - // output file. - - // METHODOLOGY EMPLOYED: - // na - - // REFERENCES: - // na - - // Using/Aliasing - using namespace DataOutputs; - using namespace DataRuntimeLanguage; - using namespace DataSystemVariables; - - // SUBROUTINE PARAMETER DEFINITIONS: - static constexpr std::string_view EndOfDataString("End of Data"); // Signifies the end of the data block in the output file - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - std::string cEnvSetThreads; - std::string cepEnvSetThreads; - std::string cIDFSetThreads; - - state.files.audit.ensure_open(state, "CloseOutputFiles", state.files.outputControl.audit); - constexpr static auto variable_fmt{" {}={:12}\n"}; - // Record some items on the audit file - print(state.files.audit, variable_fmt, "NumOfRVariable", state.dataOutputProcessor->NumOfRVariable_Setup); - print(state.files.audit, variable_fmt, "NumOfRVariable(Total)", state.dataOutputProcessor->NumTotalRVariable); - print(state.files.audit, variable_fmt, "NumOfRVariable(Actual)", state.dataOutputProcessor->NumOfRVariable); - print(state.files.audit, variable_fmt, "NumOfRVariable(Summed)", state.dataOutputProcessor->NumOfRVariable_Sum); - print(state.files.audit, variable_fmt, "NumOfRVariable(Meter)", state.dataOutputProcessor->NumOfRVariable_Meter); - print(state.files.audit, variable_fmt, "NumOfIVariable", state.dataOutputProcessor->NumOfIVariable_Setup); - print(state.files.audit, variable_fmt, "NumOfIVariable(Total)", state.dataOutputProcessor->NumTotalIVariable); - print(state.files.audit, variable_fmt, "NumOfIVariable(Actual)", state.dataOutputProcessor->NumOfIVariable); - print(state.files.audit, variable_fmt, "NumOfIVariable(Summed)", state.dataOutputProcessor->NumOfIVariable_Sum); - print(state.files.audit, variable_fmt, "MaxRVariable", state.dataOutputProcessor->MaxRVariable); - print(state.files.audit, variable_fmt, "MaxIVariable", state.dataOutputProcessor->MaxIVariable); - print(state.files.audit, variable_fmt, "NumEnergyMeters", state.dataOutputProcessor->NumEnergyMeters); - print(state.files.audit, variable_fmt, "NumVarMeterArrays", state.dataOutputProcessor->NumVarMeterArrays); - print(state.files.audit, variable_fmt, "maxUniqueKeyCount", state.dataOutRptTab->maxUniqueKeyCount); - print(state.files.audit, variable_fmt, "maxNumberOfFigures", state.dataSolarShading->maxNumberOfFigures); - print(state.files.audit, variable_fmt, "MAXHCArrayBounds", state.dataSolarShading->MAXHCArrayBounds); - print(state.files.audit, variable_fmt, "MaxVerticesPerSurface", state.dataSurface->MaxVerticesPerSurface); - print(state.files.audit, variable_fmt, "NumReportList", state.dataOutputProcessor->NumReportList); - print(state.files.audit, variable_fmt, "InstMeterCacheSize", state.dataOutputProcessor->InstMeterCacheSize); - if (state.dataSysVars->SutherlandHodgman) { - if (state.dataSysVars->SlaterBarsky) { - print(state.files.audit, " {}\n", "ClippingAlgorithm=SlaterBarskyandSutherlandHodgman"); - } else { - print(state.files.audit, " {}\n", "ClippingAlgorithm=SutherlandHodgman"); - } - } else { - print(state.files.audit, "{}\n", "ClippingAlgorithm=ConvexWeilerAtherton"); - } - print(state.files.audit, variable_fmt, "MonthlyFieldSetInputCount", state.dataOutRptTab->MonthlyFieldSetInputCount); - print(state.files.audit, variable_fmt, "NumConsideredOutputVariables", state.dataOutput->NumConsideredOutputVariables); - print(state.files.audit, variable_fmt, "MaxConsideredOutputVariables", state.dataOutput->MaxConsideredOutputVariables); - - print(state.files.audit, variable_fmt, "numActuatorsUsed", state.dataRuntimeLang->numActuatorsUsed); - print(state.files.audit, variable_fmt, "numEMSActuatorsAvailable", state.dataRuntimeLang->numEMSActuatorsAvailable); - print(state.files.audit, variable_fmt, "maxEMSActuatorsAvailable", state.dataRuntimeLang->maxEMSActuatorsAvailable); - print(state.files.audit, variable_fmt, "numInternalVariablesUsed", state.dataRuntimeLang->NumInternalVariablesUsed); - print(state.files.audit, variable_fmt, "numEMSInternalVarsAvailable", state.dataRuntimeLang->numEMSInternalVarsAvailable); - print(state.files.audit, variable_fmt, "maxEMSInternalVarsAvailable", state.dataRuntimeLang->maxEMSInternalVarsAvailable); - - print(state.files.audit, variable_fmt, "NumOfNodeConnections", state.dataBranchNodeConnections->NumOfNodeConnections); - print(state.files.audit, variable_fmt, "MaxNumOfNodeConnections", state.dataBranchNodeConnections->MaxNumOfNodeConnections); -#ifdef EP_Count_Calls - print(state.files.audit, variable_fmt, "NumShadow_Calls", state.dataTimingsData->NumShadow_Calls); - print(state.files.audit, variable_fmt, "NumShadowAtTS_Calls", state.dataTimingsData->NumShadowAtTS_Calls); - print(state.files.audit, variable_fmt, "NumClipPoly_Calls", state.dataTimingsData->NumClipPoly_Calls); - print(state.files.audit, variable_fmt, "NumInitSolar_Calls", state.dataTimingsData->NumInitSolar_Calls); - print(state.files.audit, variable_fmt, "NumAnisoSky_Calls", state.dataTimingsData->NumAnisoSky_Calls); - print(state.files.audit, variable_fmt, "NumDetPolyOverlap_Calls", state.dataTimingsData->NumDetPolyOverlap_Calls); - print(state.files.audit, variable_fmt, "NumCalcPerSolBeam_Calls", state.dataTimingsData->NumCalcPerSolBeam_Calls); - print(state.files.audit, variable_fmt, "NumDetShadowCombs_Calls", state.dataTimingsData->NumDetShadowCombs_Calls); - print(state.files.audit, variable_fmt, "NumIntSolarDist_Calls", state.dataTimingsData->NumIntSolarDist_Calls); - print(state.files.audit, variable_fmt, "NumIntRadExchange_Calls", state.dataTimingsData->NumIntRadExchange_Calls); - print(state.files.audit, variable_fmt, "NumIntRadExchangeZ_Calls", state.dataTimingsData->NumIntRadExchangeZ_Calls); - print(state.files.audit, variable_fmt, "NumIntRadExchangeMain_Calls", state.dataTimingsData->NumIntRadExchangeMain_Calls); - print(state.files.audit, variable_fmt, "NumIntRadExchangeOSurf_Calls", state.dataTimingsData->NumIntRadExchangeOSurf_Calls); - print(state.files.audit, variable_fmt, "NumIntRadExchangeISurf_Calls", state.dataTimingsData->NumIntRadExchangeISurf_Calls); - print(state.files.audit, variable_fmt, "NumMaxInsideSurfIterations", state.dataTimingsData->NumMaxInsideSurfIterations); - print(state.files.audit, variable_fmt, "NumCalcScriptF_Calls", state.dataTimingsData->NumCalcScriptF_Calls); -#endif - - print(state.files.eso, "{}\n", EndOfDataString); - if (state.dataGlobal->StdOutputRecordCount > 0) { - print(state.files.eso, variable_fmt, "Number of Records Written", state.dataGlobal->StdOutputRecordCount); - state.files.eso.close(); - } else { - state.files.eso.del(); - } - - if (state.dataHeatBal->AnyCondFD) { // echo out relaxation factor, it may have been changed by the program - print( - state.files.eio, "{}\n", "! , Starting Relaxation Factor, Final Relaxation Factor"); - print(state.files.eio, - "ConductionFiniteDifference Numerical Parameters, {:.3R}, {:.3R}\n", - state.dataHeatBal->CondFDRelaxFactorInput, - state.dataHeatBal->CondFDRelaxFactor); - } - // Report number of threads to eio file - static constexpr std::string_view ThreadingHeader( - "! , Threading Supported,Maximum Number of " - "Threads, Env Set Threads (OMP_NUM_THREADS), EP Env Set Threads (EP_OMP_NUM_THREADS), IDF Set " - "Threads, Number of Threads Used (Interior Radiant Exchange), Number Nominal Surfaces, Number " - "Parallel Sims"); - print(state.files.eio, "{}\n", ThreadingHeader); - static constexpr std::string_view ThreadReport("Program Control:Threads/Parallel Sims, {},{}, {}, {}, {}, {}, {}, {}\n"); - if (state.dataSysVars->Threading) { - if (state.dataSysVars->iEnvSetThreads == 0) { - cEnvSetThreads = "Not Set"; - } else { - cEnvSetThreads = fmt::to_string(state.dataSysVars->iEnvSetThreads); - } - if (state.dataSysVars->iepEnvSetThreads == 0) { - cepEnvSetThreads = "Not Set"; - } else { - cepEnvSetThreads = fmt::to_string(state.dataSysVars->iepEnvSetThreads); - } - if (state.dataSysVars->iIDFSetThreads == 0) { - cIDFSetThreads = "Not Set"; - } else { - cIDFSetThreads = fmt::to_string(state.dataSysVars->iIDFSetThreads); - } - if (state.dataSysVars->lnumActiveSims) { - print(state.files.eio, - ThreadReport, - "Yes", - state.dataSysVars->MaxNumberOfThreads, - cEnvSetThreads, - cepEnvSetThreads, - cIDFSetThreads, - state.dataSysVars->NumberIntRadThreads, - state.dataSysVars->iNominalTotSurfaces, - state.dataSysVars->inumActiveSims); - } else { - print(state.files.eio, - ThreadReport, - "Yes", - state.dataSysVars->MaxNumberOfThreads, - cEnvSetThreads, - cepEnvSetThreads, - cIDFSetThreads, - state.dataSysVars->NumberIntRadThreads, - state.dataSysVars->iNominalTotSurfaces, - "N/A"); - } - } else { // no threading - if (state.dataSysVars->lnumActiveSims) { - print(state.files.eio, - ThreadReport, - "No", - state.dataSysVars->MaxNumberOfThreads, - "N/A", - "N/A", - "N/A", - "N/A", - "N/A", - state.dataSysVars->inumActiveSims); - } else { - print(state.files.eio, ThreadReport, "No", state.dataSysVars->MaxNumberOfThreads, "N/A", "N/A", "N/A", "N/A", "N/A", "N/A"); - } - } - - // Close the Initialization Output File - print(state.files.eio, "{}\n", EndOfDataString); - state.files.eio.close(); - - // Close the Meters Output File - print(state.files.mtr, "{}\n", EndOfDataString); - print(state.files.mtr, " Number of Records Written={:12}\n", state.dataGlobal->StdMeterRecordCount); - if (state.dataGlobal->StdMeterRecordCount > 0) { - state.files.mtr.close(); - } else { - state.files.mtr.del(); - } - - // Close the External Shading Output File - state.files.shade.close(); - } - - void SetupSimulation(EnergyPlusData &state, bool &ErrorsFound) - { - - // SUBROUTINE INFORMATION: - // AUTHOR B. Griffith/L. Lawrie - // DATE WRITTEN May 2008 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // execute a few time steps of a simulation to facilitate setting up model - // developed to resolve reverse DD problems caused be the differences - // that stem from setup and information gathering that occurs during the first pass. - - // METHODOLOGY EMPLOYED: - // Using global flag (kickoff simulation), only a few time steps are executed. - // global flag is used in other parts of simulation to terminate quickly. - - // Using/Aliasing - using CostEstimateManager::SimCostEstimate; - using ExteriorEnergyUse::ManageExteriorEnergyUse; - - bool Available = true; - - while (Available) { // do for each environment - - GetNextEnvironment(state, Available, ErrorsFound); - - if (!Available) break; - if (ErrorsFound) break; - - state.dataGlobal->BeginEnvrnFlag = true; - state.dataGlobal->EndEnvrnFlag = false; - state.dataEnvrn->EndMonthFlag = false; - state.dataGlobal->WarmupFlag = true; - state.dataGlobal->DayOfSim = 0; - - ++state.dataGlobal->DayOfSim; - state.dataGlobal->BeginDayFlag = true; - state.dataGlobal->EndDayFlag = false; - - state.dataGlobal->HourOfDay = 1; - - state.dataGlobal->BeginHourFlag = true; - state.dataGlobal->EndHourFlag = false; - - state.dataGlobal->TimeStep = 1; - - if (state.dataSysVars->DeveloperFlag) DisplayString(state, "Initializing Simulation - timestep 1:" + state.dataEnvrn->EnvironmentName); - - state.dataGlobal->BeginTimeStepFlag = true; - - ManageWeather(state); - - ManageExteriorEnergyUse(state); - - ManageHeatBalance(state); - - state.dataGlobal->BeginHourFlag = false; - state.dataGlobal->BeginDayFlag = false; - state.dataGlobal->BeginEnvrnFlag = false; - state.dataGlobal->BeginSimFlag = false; - - // ! do another timestep=1 - if (state.dataSysVars->DeveloperFlag) - DisplayString(state, "Initializing Simulation - 2nd timestep 1:" + state.dataEnvrn->EnvironmentName); - - ManageWeather(state); - - ManageExteriorEnergyUse(state); - - ManageHeatBalance(state); - - // do an end of day, end of environment time step - - state.dataGlobal->HourOfDay = 24; - state.dataGlobal->TimeStep = state.dataGlobal->NumOfTimeStepInHour; - state.dataGlobal->EndEnvrnFlag = true; - - if (state.dataSysVars->DeveloperFlag) - DisplayString(state, "Initializing Simulation - hour 24 timestep 1:" + state.dataEnvrn->EnvironmentName); - ManageWeather(state); - - ManageExteriorEnergyUse(state); - - ManageHeatBalance(state); - - } // ... End environment loop. - - if (state.dataGlobal->AnySlabsInModel || state.dataGlobal->AnyBasementsInModel) { - PlantPipingSystemsManager::SimulateGroundDomains(state, true); - } - - if (!ErrorsFound) SimCostEstimate(state); // basically will get and check input - if (ErrorsFound) ShowFatalError(state, "Previous conditions cause program termination."); - } - - void ReportNodeConnections(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN February 2004 - // MODIFIED na - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine 'reports' the NodeConnection data structure. It groups the - // report/dump by parent, non-parent objects. - - // Using/Aliasing - using namespace DataBranchNodeConnections; - - // Formats - static constexpr std::string_view Format_702("! <#{0} Node Connections>,\n"); - static constexpr std::string_view Format_703( - "! <{} Node Connection>,,,,,\n"); - - state.dataBranchNodeConnections->NonConnectedNodes.dimension(state.dataLoopNodes->NumOfNodes, true); - - int NumNonParents = 0; - for (int Loop = 1; Loop <= state.dataBranchNodeConnections->NumOfNodeConnections; ++Loop) { - if (state.dataBranchNodeConnections->NodeConnections(Loop).ObjectIsParent) continue; - ++NumNonParents; - } - const auto NumParents = state.dataBranchNodeConnections->NumOfNodeConnections - NumNonParents; - state.dataBranchNodeConnections->ParentNodeList.allocate(NumParents); - - // Do Parent Objects - print(state.files.bnd, "{}\n", "! ==============================================================="); - print(state.files.bnd, Format_702, "Parent"); - print(state.files.bnd, " #Parent Node Connections,{}\n", NumParents); - print(state.files.bnd, Format_703, "Parent"); - - for (int Loop = 1; Loop <= state.dataBranchNodeConnections->NumOfNodeConnections; ++Loop) { - if (!state.dataBranchNodeConnections->NodeConnections(Loop).ObjectIsParent) continue; - state.dataBranchNodeConnections->NonConnectedNodes(state.dataBranchNodeConnections->NodeConnections(Loop).NodeNumber) = false; - print(state.files.bnd, - " Parent Node Connection,{},{},{},{},{}\n", - state.dataBranchNodeConnections->NodeConnections(Loop).NodeName, - BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( - state.dataBranchNodeConnections->NodeConnections(Loop).ObjectType)], - state.dataBranchNodeConnections->NodeConnections(Loop).ObjectName, - DataLoopNode::ConnectionTypeNames[static_cast(state.dataBranchNodeConnections->NodeConnections(Loop).ConnectionType)], - state.dataBranchNodeConnections->NodeConnections(Loop).FluidStream); - // Build ParentNodeLists - if ((state.dataBranchNodeConnections->NodeConnections(Loop).ConnectionType == DataLoopNode::ConnectionType::Inlet) || - (state.dataBranchNodeConnections->NodeConnections(Loop).ConnectionType == DataLoopNode::ConnectionType::Outlet)) { - bool ParentComponentFound = false; - for (int Loop1 = 1; Loop1 <= state.dataBranchNodeConnections->NumOfActualParents; ++Loop1) { - if (state.dataBranchNodeConnections->ParentNodeList(Loop1).ComponentType != - state.dataBranchNodeConnections->NodeConnections(Loop).ObjectType || - state.dataBranchNodeConnections->ParentNodeList(Loop1).ComponentName != - state.dataBranchNodeConnections->NodeConnections(Loop).ObjectName) - continue; - ParentComponentFound = true; - - switch (state.dataBranchNodeConnections->NodeConnections(Loop).ConnectionType) { - case DataLoopNode::ConnectionType::Inlet: - state.dataBranchNodeConnections->ParentNodeList(Loop1).InletNodeName = - state.dataBranchNodeConnections->NodeConnections(Loop).NodeName; - break; - case DataLoopNode::ConnectionType::Outlet: - state.dataBranchNodeConnections->ParentNodeList(Loop1).OutletNodeName = - state.dataBranchNodeConnections->NodeConnections(Loop).NodeName; - default: - break; - } - } - if (!ParentComponentFound) { - ++state.dataBranchNodeConnections->NumOfActualParents; - state.dataBranchNodeConnections->ParentNodeList(state.dataBranchNodeConnections->NumOfActualParents).ComponentType = - state.dataBranchNodeConnections->NodeConnections(Loop).ObjectType; - state.dataBranchNodeConnections->ParentNodeList(state.dataBranchNodeConnections->NumOfActualParents).ComponentName = - state.dataBranchNodeConnections->NodeConnections(Loop).ObjectName; - - switch (state.dataBranchNodeConnections->NodeConnections(Loop).ConnectionType) { - case DataLoopNode::ConnectionType::Inlet: - state.dataBranchNodeConnections->ParentNodeList(state.dataBranchNodeConnections->NumOfActualParents).InletNodeName = - state.dataBranchNodeConnections->NodeConnections(Loop).NodeName; - break; - case DataLoopNode::ConnectionType::Outlet: - state.dataBranchNodeConnections->ParentNodeList(state.dataBranchNodeConnections->NumOfActualParents).OutletNodeName = - state.dataBranchNodeConnections->NodeConnections(Loop).NodeName; - break; - default: - break; - } - } - } - } - - // Do non-Parent Objects - print(state.files.bnd, "{}\n", "! ==============================================================="); - print(state.files.bnd, Format_702, "Non-Parent"); - print(state.files.bnd, " #Non-Parent Node Connections,{}\n", NumNonParents); - print(state.files.bnd, Format_703, "Non-Parent"); - - for (int Loop = 1; Loop <= state.dataBranchNodeConnections->NumOfNodeConnections; ++Loop) { - if (state.dataBranchNodeConnections->NodeConnections(Loop).ObjectIsParent) continue; - state.dataBranchNodeConnections->NonConnectedNodes(state.dataBranchNodeConnections->NodeConnections(Loop).NodeNumber) = false; - print(state.files.bnd, - " Non-Parent Node Connection,{},{},{},{},{}\n", - state.dataBranchNodeConnections->NodeConnections(Loop).NodeName, - BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( - state.dataBranchNodeConnections->NodeConnections(Loop).ObjectType)], - state.dataBranchNodeConnections->NodeConnections(Loop).ObjectName, - DataLoopNode::ConnectionTypeNames[static_cast(state.dataBranchNodeConnections->NodeConnections(Loop).ConnectionType)], - state.dataBranchNodeConnections->NodeConnections(Loop).FluidStream); - } - - int NumNonConnected = 0; - for (int Loop = 1; Loop <= state.dataLoopNodes->NumOfNodes; ++Loop) { - if (state.dataBranchNodeConnections->NonConnectedNodes(Loop)) ++NumNonConnected; - } - - if (NumNonConnected > 0) { - print(state.files.bnd, "{}\n", "! ==============================================================="); - static constexpr std::string_view Format_705("! <#NonConnected Nodes>,\n #NonConnected Nodes,{}\n"); - print(state.files.bnd, Format_705, NumNonConnected); - static constexpr std::string_view Format_706("! ,,"); - print(state.files.bnd, "{}\n", Format_706); - for (int Loop = 1; Loop <= state.dataLoopNodes->NumOfNodes; ++Loop) { - if (!state.dataBranchNodeConnections->NonConnectedNodes(Loop)) continue; - print(state.files.bnd, " NonConnected Node,{},{}\n", Loop, state.dataLoopNodes->NodeID(Loop)); - } - } - - state.dataBranchNodeConnections->NonConnectedNodes.deallocate(); - } - - void ReportLoopConnections(EnergyPlusData &state) - { - - // SUBROUTINE INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN December 2001 - // MODIFIED March 2003; added other reporting - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine reports on the node connections in various parts of the - // HVAC system: Component Sets, Air Loop, Plant and Condenser Loop, Supply and - // return air paths, controlled zones. - // This information should be useful in diagnosing node connection input errors. - - constexpr static auto errstring("**error**"); - - // Formats - static constexpr std::string_view Format_700("! <#Component Sets>,"); - static constexpr std::string_view Format_702("! ,,,,,,,,"); - static constexpr std::string_view Format_720("! <#Zone Equipment Lists>,"); - static constexpr std::string_view Format_722( - "! ,,,,"); - static constexpr std::string_view Format_723( - "! ,,,,,,"); - - // Report outside air node names on the Branch-Node Details file - print(state.files.bnd, "{}\n", "! ==============================================================="); - print(state.files.bnd, "{}\n", "! #Outdoor Air Nodes,"); - print(state.files.bnd, " #Outdoor Air Nodes,{}\n", state.dataOutAirNodeMgr->NumOutsideAirNodes); - if (state.dataOutAirNodeMgr->NumOutsideAirNodes > 0) { - print(state.files.bnd, "{}\n", "! ,,"); - } - for (int Count = 1; Count <= state.dataOutAirNodeMgr->NumOutsideAirNodes; ++Count) { - print(state.files.bnd, - " Outdoor Air Node,{},{}\n", - state.dataOutAirNodeMgr->OutsideAirNodeList(Count), - state.dataLoopNodes->NodeID(state.dataOutAirNodeMgr->OutsideAirNodeList(Count))); - } - // Component Sets - print(state.files.bnd, "{}\n", "! ==============================================================="); - print(state.files.bnd, "{}\n", Format_700); - print(state.files.bnd, " #Component Sets,{}\n", state.dataBranchNodeConnections->NumCompSets); - print(state.files.bnd, "{}\n", Format_702); - - for (int Count = 1; Count <= state.dataBranchNodeConnections->NumCompSets; ++Count) { - print(state.files.bnd, - " Component Set,{},{},{},{},{},{},{},{}\n", - Count, - BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( - state.dataBranchNodeConnections->CompSets(Count).ParentObjectType)], - state.dataBranchNodeConnections->CompSets(Count).ParentCName, - BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( - state.dataBranchNodeConnections->CompSets(Count).ComponentObjectType)], - state.dataBranchNodeConnections->CompSets(Count).CName, - state.dataBranchNodeConnections->CompSets(Count).InletNodeName, - state.dataBranchNodeConnections->CompSets(Count).OutletNodeName, - state.dataBranchNodeConnections->CompSets(Count).Description); - - std::string_view const CType = BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( - state.dataBranchNodeConnections->CompSets(Count).ComponentObjectType)]; - if (state.dataBranchNodeConnections->CompSets(Count).ParentObjectType == DataLoopNode::ConnectionObjectType::Undefined || - state.dataBranchNodeConnections->CompSets(Count).InletNodeName == "UNDEFINED" || - state.dataBranchNodeConnections->CompSets(Count).OutletNodeName == "UNDEFINED") { - if (state.dataErrTracking->AbortProcessing && state.dataSimulationManager->WarningOut) { - ShowWarningError(state, - "Node Connection errors shown during \"fatal error\" processing may be false because not all inputs may have " - "been retrieved."); - state.dataSimulationManager->WarningOut = false; - } - ShowWarningError(state, - format("Node Connection Error for object {}={}", CType, state.dataBranchNodeConnections->CompSets(Count).CName)); - ShowContinueError(state, - format(" {} not on any Branch or Parent Object", state.dataBranchNodeConnections->CompSets(Count).Description)); - ShowContinueError(state, format(" Inlet Node : {}", state.dataBranchNodeConnections->CompSets(Count).InletNodeName)); - ShowContinueError(state, format(" Outlet Node: {}", state.dataBranchNodeConnections->CompSets(Count).OutletNodeName)); - ++state.dataBranchNodeConnections->NumNodeConnectionErrors; - if (state.dataBranchNodeConnections->CompSets(Count).ComponentObjectType == - DataLoopNode::ConnectionObjectType::SolarCollectorUnglazedTranspired) { - ShowContinueError(state, "This report does not necessarily indicate a problem for a MultiSystem Transpired Collector"); - } - } - if (state.dataBranchNodeConnections->CompSets(Count).Description == "UNDEFINED") { - if (state.dataErrTracking->AbortProcessing && state.dataSimulationManager->WarningOut) { - ShowWarningError(state, - "Node Connection errors shown during \"fatal error\" processing may be false because not all inputs may have " - "been retrieved."); - state.dataSimulationManager->WarningOut = false; - } - ShowWarningError( - state, - format("Potential Node Connection Error for object {}, name={}", CType, state.dataBranchNodeConnections->CompSets(Count).CName)); - ShowContinueError(state, " Node Types are still UNDEFINED -- See Branch/Node Details file for further information"); - ShowContinueError(state, " Inlet Node : " + state.dataBranchNodeConnections->CompSets(Count).InletNodeName); - ShowContinueError(state, " Outlet Node: " + state.dataBranchNodeConnections->CompSets(Count).OutletNodeName); - ++state.dataBranchNodeConnections->NumNodeConnectionErrors; - } - } - - for (int Count = 1; Count <= state.dataBranchNodeConnections->NumCompSets; ++Count) { - for (int Count1 = Count + 1; Count1 <= state.dataBranchNodeConnections->NumCompSets; ++Count1) { - if (state.dataBranchNodeConnections->CompSets(Count).ComponentObjectType != - state.dataBranchNodeConnections->CompSets(Count1).ComponentObjectType) - continue; - if (state.dataBranchNodeConnections->CompSets(Count).CName != state.dataBranchNodeConnections->CompSets(Count1).CName) continue; - if (state.dataBranchNodeConnections->CompSets(Count).InletNodeName != state.dataBranchNodeConnections->CompSets(Count1).InletNodeName) - continue; - if (state.dataBranchNodeConnections->CompSets(Count).OutletNodeName != - state.dataBranchNodeConnections->CompSets(Count1).OutletNodeName) - continue; - if (state.dataErrTracking->AbortProcessing && state.dataSimulationManager->WarningOut) { - ShowWarningError(state, - "Node Connection errors shown during \"fatal error\" processing may be false because not all inputs may have " - "been retrieved."); - state.dataSimulationManager->WarningOut = false; - } - std::string_view const CType = BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( - state.dataBranchNodeConnections->CompSets(Count).ComponentObjectType)]; - std::string_view const ParentCType = BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( - state.dataBranchNodeConnections->CompSets(Count1).ParentObjectType)]; - std::string_view const ParentCType1 = BranchNodeConnections::ConnectionObjectTypeNamesUC[static_cast( - state.dataBranchNodeConnections->CompSets(Count).ParentObjectType)]; - ShowWarningError(state, "Component plus inlet/outlet node pair used more than once:"); - ShowContinueError(state, format(" Component : {}={}", CType, state.dataBranchNodeConnections->CompSets(Count).CName)); - ShowContinueError(state, format(" Inlet Node : {}", state.dataBranchNodeConnections->CompSets(Count).InletNodeName)); - ShowContinueError(state, format(" Outlet Node: {}", state.dataBranchNodeConnections->CompSets(Count).OutletNodeName)); - ShowContinueError(state, format(" Used by : {}={}", ParentCType, state.dataBranchNodeConnections->CompSets(Count).ParentCName)); - ShowContinueError(state, format(" and by : {}={}", ParentCType1, state.dataBranchNodeConnections->CompSets(Count1).ParentCName)); - ++state.dataBranchNodeConnections->NumNodeConnectionErrors; - } - } - // Plant Loops - print(state.files.bnd, "{}\n", "! ==============================================================="); - print(state.files.bnd, "{}\n", "! <# Plant Loops>,"); - print(state.files.bnd, " #Plant Loops,{}\n", state.dataHVACGlobal->NumPlantLoops); - print(state.files.bnd, - "{}\n", - "! ,,,,,,"); - print( - state.files.bnd, "{}\n", "! ,,,,,"); - print(state.files.bnd, - "{}\n", - "! ,,,,,,,"); - print(state.files.bnd, - "{}\n", - "! ,,,,,,,"); - print(state.files.bnd, - "{}\n", - "! ,,,"); - print(state.files.bnd, - "{}\n", - "! ,,,"); - for (int Count = 1; Count <= state.dataHVACGlobal->NumPlantLoops; ++Count) { - for (DataPlant::LoopSideLocation LoopSideNum : DataPlant::LoopSideKeys) { - // Plant Supply Side Loop - // LoopSideLocation::Demand and LoopSideLocation::Supply is parametrized in DataPlant - std::string_view const LoopString = DataPlant::DemandSupplyNames[static_cast(LoopSideNum)]; - - print(state.files.bnd, - " Plant Loop,{},{},{},{},{},{}\n", - state.dataPlnt->PlantLoop(Count).Name, - LoopString, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).NodeNameIn, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).NodeNameOut, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).BranchList, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).ConnectList); - // Plant Supply Side Splitter - if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Exists) { - print(state.files.bnd, - " Plant Loop Connector,Splitter,{},{},{},{}\n", - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Name, - state.dataPlnt->PlantLoop(Count).Name, - LoopString, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.TotalOutletNodes); - for (int Count1 = 1; Count1 <= state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.TotalOutletNodes; ++Count1) { - print(state.files.bnd, - " Plant Loop Connector Branches,{},Splitter,{},", - Count1, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Name); - - if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumIn <= 0) { - print(state.files.bnd, "{},\n", errstring); - } else { - print(state.files.bnd, - "{},", - state.dataPlnt->PlantLoop(Count) - .LoopSide(LoopSideNum) - .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumIn) - .Name); - } - - if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumOut(Count1) <= 0) { - print(state.files.bnd, "{},{},{}\n", errstring, state.dataPlnt->PlantLoop(Count).Name, LoopString); - } else { - print(state.files.bnd, - "{},{},{}\n", - state.dataPlnt->PlantLoop(Count) - .LoopSide(LoopSideNum) - .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumOut(Count1)) - .Name, - state.dataPlnt->PlantLoop(Count).Name, - LoopString); - } - - print(state.files.bnd, - " Plant Loop Connector Nodes, {},Splitter,{},{},{},{},{}\n", - Count1, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Name, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.NodeNameIn, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.NodeNameOut(Count1), - state.dataPlnt->PlantLoop(Count).Name, - LoopString); - } - } - - // Plant Supply Side Mixer - if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Exists) { - print(state.files.bnd, - " Plant Loop Connector,Mixer,{},{},{},{}\n", - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Name, - state.dataPlnt->PlantLoop(Count).Name, - LoopString, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.TotalInletNodes); //',Supply,'// & - - for (int Count1 = 1; Count1 <= state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.TotalInletNodes; ++Count1) { - print(state.files.bnd, - " Plant Loop Connector Branches,{},Mixer,{},", - Count1, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Name); - if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumIn(Count1) <= 0) { - print(state.files.bnd, "{},", errstring); - } else { - print(state.files.bnd, - "{},", - state.dataPlnt->PlantLoop(Count) - .LoopSide(LoopSideNum) - .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumIn(Count1)) - .Name); - } - if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumOut <= 0) { - print(state.files.bnd, "{},{},Supply\n", errstring, state.dataPlnt->PlantLoop(Count).Name); - } else { - print(state.files.bnd, - "{},{},{}\n", - state.dataPlnt->PlantLoop(Count) - .LoopSide(LoopSideNum) - .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumOut) - .Name, - state.dataPlnt->PlantLoop(Count).Name, - LoopString); - } - print(state.files.bnd, - " Plant Loop Connector Nodes, {},Mixer,{},{},{},{},{}\n", - Count1, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Name, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.NodeNameIn(Count1), - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.NodeNameOut, - state.dataPlnt->PlantLoop(Count).Name, - LoopString); - } - } - } - print(state.files.bnd, - " Plant Loop Supply Connection,{},{},{}\n", - state.dataPlnt->PlantLoop(Count).Name, - state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Supply).NodeNameOut, - state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Demand).NodeNameIn); - print(state.files.bnd, - " Plant Loop Return Connection,{},{},{}\n", - state.dataPlnt->PlantLoop(Count).Name, - state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Demand).NodeNameOut, - state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Supply).NodeNameIn); - - } // Plant Demand Side Loop - - // Condenser Loops - print(state.files.bnd, "{}\n", "! ==============================================================="); - print(state.files.bnd, "{}\n", "! <# Condenser Loops>,"); - print(state.files.bnd, " #Condenser Loops,{}\n", state.dataHVACGlobal->NumCondLoops); - print(state.files.bnd, - "{}\n", - "! ,,,,,,"); - print(state.files.bnd, - "{}\n", - "! ,,,,,"); - print(state.files.bnd, - "{}\n", - "! ,,,,,,,"); - print(state.files.bnd, - "{}\n", - "! ,,,,,,,"); - print(state.files.bnd, - "{}\n", - "! ,,,"); - print(state.files.bnd, - "{}\n", - "! ,,,"); - - for (int Count = state.dataHVACGlobal->NumPlantLoops + 1; Count <= state.dataPlnt->TotNumLoops; ++Count) { - for (DataPlant::LoopSideLocation LoopSideNum : DataPlant::LoopSideKeys) { - // Plant Supply Side Loop - // LoopSideLocation::Demand and LoopSideLocation::Supply is parametrized in DataPlant - const auto LoopString = [&]() { - if (LoopSideNum == DataPlant::LoopSideLocation::Demand) { - return "Demand"; - } else if (LoopSideNum == DataPlant::LoopSideLocation::Supply) { - return "Supply"; - } else { - return ""; - } - }(); - - print(state.files.bnd, - " Plant Loop,{},{},{},{},{},{}\n", - state.dataPlnt->PlantLoop(Count).Name, - LoopString, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).NodeNameIn, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).NodeNameOut, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).BranchList, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).ConnectList); - // Plant Supply Side Splitter - if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Exists) { - print(state.files.bnd, - " Plant Loop Connector,Splitter,{},{},{},{}\n", - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Name, - state.dataPlnt->PlantLoop(Count).Name, - LoopString, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.TotalOutletNodes); - for (int Count1 = 1; Count1 <= state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.TotalOutletNodes; ++Count1) { - print(state.files.bnd, - " Plant Loop Connector Branches,{},Splitter,{},", - Count1, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Name); - - if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumIn <= 0) { - print(state.files.bnd, "{},", errstring); - } else { - print(state.files.bnd, - "{},", - state.dataPlnt->PlantLoop(Count) - .LoopSide(LoopSideNum) - .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumIn) - .Name); - } - if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumOut(Count1) <= 0) { - print(state.files.bnd, "{},{},{}\n", errstring, state.dataPlnt->PlantLoop(Count).Name, LoopString); - } else { - - print(state.files.bnd, - "{},{},{}\n", - state.dataPlnt->PlantLoop(Count) - .LoopSide(LoopSideNum) - .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.BranchNumOut(Count1)) - .Name, - state.dataPlnt->PlantLoop(Count).Name, - LoopString); - } - - print(state.files.bnd, - " Plant Loop Connector Nodes, {},Splitter,{},{},{},{},{}\n", - Count1, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.Name, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.NodeNameIn, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Splitter.NodeNameOut(Count1), - state.dataPlnt->PlantLoop(Count).Name, - LoopString); - } - } - - // Plant Supply Side Mixer - if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Exists) { - const auto totalInletNodes = state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.TotalInletNodes; - print(state.files.bnd, - " Plant Loop Connector,Mixer,{},{},{},{}\n", - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Name, - state.dataPlnt->PlantLoop(Count).Name, - LoopString, - totalInletNodes); //',Supply,'// & - - for (int Count1 = 1; Count1 <= totalInletNodes; ++Count1) { - print(state.files.bnd, - " Plant Loop Connector Branches,{},Mixer,{},", - Count1, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Name); - - if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumIn(Count1) <= 0) { - print(state.files.bnd, "{},", errstring); - } else { - print(state.files.bnd, - "{},", - state.dataPlnt->PlantLoop(Count) - .LoopSide(LoopSideNum) - .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumIn(Count1)) - .Name); - } - if (state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumOut <= 0) { - print(state.files.bnd, "{},{},{}\n", errstring, state.dataPlnt->PlantLoop(Count).Name, LoopString); - } else { - print(state.files.bnd, - "{},{},{}\n", - state.dataPlnt->PlantLoop(Count) - .LoopSide(LoopSideNum) - .Branch(state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.BranchNumOut) - .Name, - state.dataPlnt->PlantLoop(Count).Name, - LoopString); - } - print(state.files.bnd, - " Plant Loop Connector Nodes, {},Mixer,{},{},{},{},{}\n", - Count1, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.Name, - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.NodeNameIn(Count1), - state.dataPlnt->PlantLoop(Count).LoopSide(LoopSideNum).Mixer.NodeNameOut, - state.dataPlnt->PlantLoop(Count).Name, - LoopString); - } - } - } - print(state.files.bnd, - " Plant Loop Supply Connection,{},{},{}\n", - state.dataPlnt->PlantLoop(Count).Name, - state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Supply).NodeNameOut, - state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Demand).NodeNameIn); - print(state.files.bnd, - " Plant Loop Return Connection,{},{},{}\n", - state.dataPlnt->PlantLoop(Count).Name, - state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Demand).NodeNameOut, - state.dataPlnt->PlantLoop(Count).LoopSide(DataPlant::LoopSideLocation::Supply).NodeNameIn); - - } // Plant Demand Side Loop - - print(state.files.bnd, "{}\n", "! ==============================================================="); - int NumOfControlledZones = 0; - for (int Count = 1; Count <= state.dataGlobal->NumOfZones; ++Count) { - if (!allocated(state.dataZoneEquip->ZoneEquipConfig)) continue; - if (state.dataZoneEquip->ZoneEquipConfig(Count).IsControlled) ++NumOfControlledZones; - } - - if (NumOfControlledZones > 0) { - print(state.files.bnd, "{}\n", "! <# Controlled Zones>,"); - print(state.files.bnd, " #Controlled Zones,{}\n", NumOfControlledZones); - print(state.files.bnd, - "{}\n", - "! ,,,,,<# Inlet Nodes>,<# Exhaust " - "Nodes>,<# Return Nodes>"); - print(state.files.bnd, - "{}\n", - "! ,,,,,
"); - print(state.files.bnd, "{}\n", "! ,,,"); - - for (int Count = 1; Count <= state.dataGlobal->NumOfZones; ++Count) { - if (!state.dataZoneEquip->ZoneEquipConfig(Count).IsControlled) continue; - - print(state.files.bnd, - " Controlled Zone,{},{},{},{},{},{},{}\n", - state.dataZoneEquip->ZoneEquipConfig(Count).ZoneName, - state.dataZoneEquip->ZoneEquipConfig(Count).EquipListName, - state.dataZoneEquip->ZoneEquipConfig(Count).ControlListName, - state.dataLoopNodes->NodeID(state.dataZoneEquip->ZoneEquipConfig(Count).ZoneNode), - state.dataZoneEquip->ZoneEquipConfig(Count).NumInletNodes, - state.dataZoneEquip->ZoneEquipConfig(Count).NumExhaustNodes, - state.dataZoneEquip->ZoneEquipConfig(Count).NumReturnNodes); - for (int Count1 = 1; Count1 <= state.dataZoneEquip->ZoneEquipConfig(Count).NumInletNodes; ++Count1) { - auto ChrName = state.dataLoopNodes->NodeID(state.dataZoneEquip->ZoneEquipConfig(Count).AirDistUnitHeat(Count1).InNode); - if (ChrName == "Undefined") ChrName = "N/A"; - print(state.files.bnd, - " Controlled Zone Inlet,{},{},{},{},{}\n", - Count1, - state.dataZoneEquip->ZoneEquipConfig(Count).ZoneName, - state.dataLoopNodes->NodeID(state.dataZoneEquip->ZoneEquipConfig(Count).InletNode(Count1)), - state.dataLoopNodes->NodeID(state.dataZoneEquip->ZoneEquipConfig(Count).AirDistUnitCool(Count1).InNode), - ChrName); - } - for (int Count1 = 1; Count1 <= state.dataZoneEquip->ZoneEquipConfig(Count).NumExhaustNodes; ++Count1) { - print(state.files.bnd, - " Controlled Zone Exhaust,{},{},{}\n", - Count1, - state.dataZoneEquip->ZoneEquipConfig(Count).ZoneName, - state.dataLoopNodes->NodeID(state.dataZoneEquip->ZoneEquipConfig(Count).ExhaustNode(Count1))); - } - for (int Count1 = 1; Count1 <= state.dataZoneEquip->ZoneEquipConfig(Count).NumReturnNodes; ++Count1) { - print(state.files.bnd, - " Controlled Zone Return,{},{},{}\n", - Count1, - state.dataZoneEquip->ZoneEquipConfig(Count).ZoneName, - state.dataLoopNodes->NodeID(state.dataZoneEquip->ZoneEquipConfig(Count).ReturnNode(Count1))); - } - } - - // Report Zone Equipment Lists to BND File - print(state.files.bnd, "{}\n", "! ==============================================================="); - print(state.files.bnd, "{}\n", Format_720); - print(state.files.bnd, " #Zone Equipment Lists,{}\n", NumOfControlledZones); - print(state.files.bnd, "{}\n", Format_722); - print(state.files.bnd, "{}\n", Format_723); - - for (int Count = 1; Count <= state.dataGlobal->NumOfZones; ++Count) { - // Zone equipment list array parallels controlled zone equipment array, so - // same index finds corresponding data from both arrays - if (!state.dataZoneEquip->ZoneEquipConfig(Count).IsControlled) continue; - - print(state.files.bnd, - " Zone Equipment List,{},{},{},{}\n", - Count, - state.dataZoneEquip->ZoneEquipList(Count).Name, - state.dataZoneEquip->ZoneEquipConfig(Count).ZoneName, - state.dataZoneEquip->ZoneEquipList(Count).NumOfEquipTypes); - - for (int Count1 = 1; Count1 <= state.dataZoneEquip->ZoneEquipList(Count).NumOfEquipTypes; ++Count1) { - print(state.files.bnd, - " Zone Equipment Component,{},{},{},{},{},{}\n", - Count1, - state.dataZoneEquip->ZoneEquipList(Count).EquipType(Count1), - state.dataZoneEquip->ZoneEquipList(Count).EquipName(Count1), - state.dataZoneEquip->ZoneEquipConfig(Count).ZoneName, - state.dataZoneEquip->ZoneEquipList(Count).CoolingPriority(Count1), - state.dataZoneEquip->ZoneEquipList(Count).HeatingPriority(Count1)); - } - } - } - - // Report Dual Duct Dampers to BND File - DualDuct::ReportDualDuctConnections(state); - - if (state.dataBranchNodeConnections->NumNodeConnectionErrors == 0) { - ShowMessage(state, "No node connection errors were found."); - } else { - if (state.dataBranchNodeConnections->NumNodeConnectionErrors > 1) { - ShowMessage(state, format("There were {} node connection errors noted.", state.dataBranchNodeConnections->NumNodeConnectionErrors)); - } else { - ShowMessage(state, format("There was {} node connection error noted.", state.dataBranchNodeConnections->NumNodeConnectionErrors)); - } - } - - state.dataErrTracking->AskForConnectionsReport = false; - } - - void PostIPProcessing(EnergyPlusData &state) - { - // SUBROUTINE INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN August 2010 - - // PURPOSE OF THIS SUBROUTINE: - // This provides post processing (for errors, etc) directly after the InputProcessor - // finishes. Code originally in the Input Processor. - - // Using/Aliasing - // using SQLiteProcedures::CreateSQLiteDatabase; - using FluidProperties::FindGlycol; - - state.dataGlobal->DoingInputProcessing = false; - - state.dataInputProcessing->inputProcessor->preProcessorCheck( - state, state.dataSimulationManager->PreP_Fatal); // Check Preprocessor objects for warning, severe, etc errors. - - if (state.dataSimulationManager->PreP_Fatal) { - ShowFatalError(state, "Preprocessor condition(s) cause termination."); - } - - state.dataInputProcessing->inputProcessor->preScanReportingVariables(state); - } - - void isInputObjectUsed(EnergyPlusData &state) - { - // there is a need to know if certain object are used in the simulation - // this may not be the best place to do this but it's a start at early reading of input data - // this concept could grow to include reading all inputs prior to the start of the simulation so all data is available - // once inputs are processed, read in all getInputs. They will be read early and will not be read again so there is no duplication - - // for example, AirLoopHVAC:DOAS systems autosize on weather data, and WeatherManager processes that data - // there is no need to process that data if there are no DOAS used in the simulation - state.dataGlobal->AirLoopHVACDOASUsedInSim = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "AirLoopHVAC:DedicatedOutdoorAirSystem") > 0; - EMSManager::CheckIfAnyEMS(state); - PlantManager::CheckIfAnyPlant(state); - PlantPipingSystemsManager::CheckIfAnySlabs(state); - PlantPipingSystemsManager::CheckIfAnyBasements(state); - SetPointManager::CheckIfAnyIdealCondEntSetPoint(state); - } - -} // namespace SimulationManager - -// EXTERNAL SUBROUTINES: - -void Resimulate(EnergyPlusData &state, - bool &ResimExt, // Flag to resimulate the exterior energy use simulation - bool &ResimHB, // Flag to resimulate the heat balance simulation (including HVAC) - bool &ResimHVAC // Flag to resimulate the HVAC simulation -) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Peter Graham Ellis - // DATE WRITTEN August 2005 - // MODIFIED Sep 2011 LKL/BG - resimulate only zones needing it for Radiant systems - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine is called as necessary by the Demand Manager to resimulate some of the modules that have - // already been simulated for the current timestep. For example, if LIGHTS are demand limited, the lighting - // power is reduced which also impacts the zone internal heat gains and therefore requires that the entire - // zone heat balance must be resimulated. - - // METHODOLOGY EMPLOYED: - // If the zone heat balance must be resimulated, all the major subroutines are called sequentially in order - // to recalculate the impacts of demand limiting. This routine is called from ManageHVAC _before_ any variables - // are reported or histories are updated. This routine can be called multiple times without the overall - // simulation moving forward in time. - // If only HVAC components are demand limited, then the HVAC system is resimulated, not the entire heat balance. - // Similarly, if ony exterior lights and equipment are demand limited, it is only necessary to resimulate the - // exterior energy use, not the entire heat balance, nor the HVAC system. - // Below is the hierarchy of subroutine calls. The calls marked with an asterisk are resimulated here. - // ManageSimulation - // ManageWeather - // ManageDemand - // * ManageExteriorEnergyUse - // ManageHeatBalance - // * InitHeatBalance - // PerformSolarCalculations - // ManageSurfaceHeatBalance - // * InitSurfaceHeatBalance - // ManageInternalHeatGains - // * CalcHeatBalanceOutsideSurf - // * CalcHeatBalanceInsideSurf - // ManageAirHeatBalance - // *InitAirHeatBalance - // CalcHeatBalanceAir - // * CalcAirFlow - // * ManageRefrigeratedCaseRacks - // ManageHVAC - // * ManageZoneAirUpdates 'GET ZONE SETPOINTS' - // * ManageZoneAirUpdates 'PREDICT' - // * SimHVAC - // UpdateDataandReport - // ReportAirHeatBalance - // UpdateFinalSurfaceHeatBalance - // UpdateThermalHistories - // UpdateMoistureHistories - // ManageThermalComfort - // ReportSurfaceHeatBalance - // RecKeepHeatBalance - // ReportHeatBalance - - // Using/Aliasing - using ExteriorEnergyUse::ManageExteriorEnergyUse; - using HeatBalanceAirManager::InitAirHeatBalance; - using HeatBalanceSurfaceManager::InitSurfaceHeatBalance; - using HVACManager::SimHVAC; - using RefrigeratedCase::ManageRefrigeratedCaseRacks; - using ZoneContaminantPredictorCorrector::ManageZoneContaminanUpdates; - using ZoneTempPredictorCorrector::ManageZoneAirUpdates; - using namespace ZoneEquipmentManager; - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 ZoneTempChange(0.0); // Dummy variable needed for calling ManageZoneAirUpdates - - if (ResimExt) { - ManageExteriorEnergyUse(state); - - ++state.dataDemandManager->DemandManagerExtIterations; - } - - if (ResimHB) { - // Surface simulation - InitSurfaceHeatBalance(state); - HeatBalanceSurfaceManager::CalcHeatBalanceOutsideSurf(state); - HeatBalanceSurfaceManager::CalcHeatBalanceInsideSurf(state); - - // Air simulation - InitAirHeatBalance(state); - ManageRefrigeratedCaseRacks(state); - - ++state.dataDemandManager->DemandManagerHBIterations; - ResimHVAC = true; // Make sure HVAC is resimulated too - } - - if (ResimHVAC) { - // HVAC simulation - ManageZoneAirUpdates(state, - DataHeatBalFanSys::PredictorCorrectorCtrl::GetZoneSetPoints, - ZoneTempChange, - false, - state.dataHVACGlobal->UseZoneTimeStepHistory, - 0.0); - if (state.dataContaminantBalance->Contaminant.SimulateContaminants) - ManageZoneContaminanUpdates( - state, DataHeatBalFanSys::PredictorCorrectorCtrl::GetZoneSetPoints, false, state.dataHVACGlobal->UseZoneTimeStepHistory, 0.0); - CalcAirFlowSimple( - state, 0, state.dataHeatBal->ZoneAirMassFlow.AdjustZoneMixingFlow, state.dataHeatBal->ZoneAirMassFlow.AdjustZoneInfiltrationFlow); - ManageZoneAirUpdates( - state, DataHeatBalFanSys::PredictorCorrectorCtrl::PredictStep, ZoneTempChange, false, state.dataHVACGlobal->UseZoneTimeStepHistory, 0.0); - if (state.dataContaminantBalance->Contaminant.SimulateContaminants) - ManageZoneContaminanUpdates( - state, DataHeatBalFanSys::PredictorCorrectorCtrl::PredictStep, false, state.dataHVACGlobal->UseZoneTimeStepHistory, 0.0); - SimHVAC(state); - - ++state.dataDemandManager->DemandManagerHVACIterations; - } -} - -} // namespace EnergyPlus diff --git a/src/EnergyPlus/ForceSpaceHeatBalance/ZoneTempPredictorCorrector.cc b/src/EnergyPlus/ForceSpaceHeatBalance/ZoneTempPredictorCorrector.cc deleted file mode 100644 index 8cab95c97b8..00000000000 --- a/src/EnergyPlus/ForceSpaceHeatBalance/ZoneTempPredictorCorrector.cc +++ /dev/null @@ -1,7506 +0,0 @@ -// EnergyPlus, Copyright (c) 1996-2022, The Board of Trustees of the University of Illinois, -// The Regents of the University of California, through Lawrence Berkeley National Laboratory -// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge -// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other -// contributors. All rights reserved. -// -// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the -// U.S. Government consequently retains certain rights. As such, the U.S. Government has been -// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, -// worldwide license in the Software to reproduce, distribute copies to the public, prepare -// derivative works, and perform publicly and display publicly, and to permit others to do so. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted -// provided that the following conditions are met: -// -// (1) Redistributions of source code must retain the above copyright notice, this list of -// conditions and the following disclaimer. -// -// (2) Redistributions in binary form must reproduce the above copyright notice, this list of -// conditions and the following disclaimer in the documentation and/or other materials -// provided with the distribution. -// -// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, -// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be -// used to endorse or promote products derived from this software without specific prior -// written permission. -// -// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form -// without changes from the version obtained under this License, or (ii) Licensee makes a -// reference solely to the software portion of its product, Licensee must refer to the -// software as "EnergyPlus version X" software, where "X" is the version number Licensee -// obtained under this License and may not use a different name for the software. Except as -// specifically required in this Section (4), Licensee shall not use in a company name, a -// product name, in advertising, publicity, or other promotional activities any name, trade -// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly -// similar designation, without the U.S. Department of Energy's prior written consent. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -// C++ Headers -#include -#include - -// ObjexxFCL Headers -#include -#include - -// EnergyPlus Headers -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace EnergyPlus::ZoneTempPredictorCorrector { - -// MODULE INFORMATION: -// AUTHOR Russell D. Taylor -// DATE WRITTEN 1997 -// MODIFIED Aug 2001(FW): make SNLoadHeatRate public -// Nov 2010 BN(FSEC) added TemperatureAndHumidity Control -// RE-ENGINEERED July 2003 (Peter Graham Ellis) -// July 2006 (BG) added operative temp control -// February 2008 (BG) reworked zone air temp histories - -// PURPOSE OF THIS MODULE: -// This module contains routines to predict and correct zone temperatures. -// also includes zone thermostatic controlling -// Model the "Air Heat Balance" part of the the "Zone Heat Balance Method." - -// METHODOLOGY EMPLOYED: -// apply model equations for air heat balance solved for zone air temp. -// sum up values for the terms (e.g SUMHAT, SUMHA etc. ) -// "Predict" step is used to get zone loads for HVAC equipment -// "correct" step determines zone air temp with available HVAC - -enum class ZoneControlTypes -{ - Invalid = -1, - TStat = 1, - TCTStat = 2, - OTTStat = 3, - HStat = 4, - TandHStat = 5, - StagedDual = 6, - Num -}; - -enum class AdaptiveComfortModel -{ - Invalid = -1, - ADAP_NONE = 1, - ASH55_CENTRAL = 2, - ASH55_UPPER_90 = 3, - ASH55_UPPER_80 = 4, - CEN15251_CENTRAL = 5, - CEN15251_UPPER_I = 6, - CEN15251_UPPER_II = 7, - CEN15251_UPPER_III = 8, - Num -}; - -static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidControlTypes = { - "Uncontrolled", - "ThermostatSetpoint:SingleHeating", - "ThermostatSetpoint:SingleCooling", - "ThermostatSetpoint:SingleHeatingOrCooling", - "ThermostatSetpoint:DualSetpoint"}; - -static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidControlTypesUC = { - "UNCONTROLLED", - "THERMOSTATSETPOINT:SINGLEHEATING", - "THERMOSTATSETPOINT:SINGLECOOLING", - "THERMOSTATSETPOINT:SINGLEHEATINGORCOOLING", - "THERMOSTATSETPOINT:DUALSETPOINT"}; - -static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidComfortControlTypes = { - "Uncontrolled", - "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeating", - "ThermostatSetpoint:ThermalComfort:Fanger:SingleCooling", - "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeatingOrCooling", - "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint"}; - -static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidComfortControlTypesUC = { - "UNCONTROLLED", - "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:SINGLEHEATING", - "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:SINGLECOOLING", - "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:SINGLEHEATINGORCOOLING", - "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:DUALSETPOINT"}; - -Array1D_string const cZControlTypes(6, - {"ZoneControl:Thermostat", - "ZoneControl:Thermostat:ThermalComfort", - "ZoneControl:Thermostat:OperativeTemperature", - "ZoneControl:Humidistat", - "ZoneControl:Thermostat:TemperatureAndHumidity", - "ZoneControl:Thermostat:StagedDualSetpoint"}); - -Array1D_string const AdaptiveComfortModelTypes(8, - {"None", - "AdaptiveASH55CentralLine", - "AdaptiveASH5590PercentUpperLine", - "AdaptiveASH5580PercentUpperLine", - "AdaptiveCEN15251CentralLine", - "AdaptiveCEN15251CategoryIUpperLine", - "AdaptiveCEN15251CategoryIIUpperLine", - "AdaptiveCEN15251CategoryIIIUpperLine"}); - -// Functions -void ManageZoneAirUpdates(EnergyPlusData &state, - DataHeatBalFanSys::PredictorCorrectorCtrl const UpdateType, // Can be iGetZoneSetPoints, iPredictStep, iCorrectStep - Real64 &ZoneTempChange, // Temp change in zone air btw previous and current timestep - bool const ShortenTimeStepSys, - bool const UseZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step - Real64 const PriorTimeStep // the old value for timestep length is passed for possible use in interpolating -) -{ - - // SUBROUTINE INFORMATION - // AUTHOR Russ Taylor - // DATE WRITTEN September 1998 - // MODIFIED na - // RE-ENGINEERED Brent Griffith Feb. 2008, added arguments - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine predicts or corrects the zone air temperature - // depending on the simulation status and determines the correct - // temperature setpoint for each zone from the schedule manager. - - if (state.dataZoneCtrls->GetZoneAirStatsInputFlag) { - GetZoneAirSetPoints(state); - state.dataZoneCtrls->GetZoneAirStatsInputFlag = false; - } - - InitZoneAirSetPoints(state); - - switch (UpdateType) { - case DataHeatBalFanSys::PredictorCorrectorCtrl::GetZoneSetPoints: { - CalcZoneAirTempSetPoints(state); - } break; - case DataHeatBalFanSys::PredictorCorrectorCtrl::PredictStep: { - PredictSystemLoads(state, ShortenTimeStepSys, UseZoneTimeStepHistory, PriorTimeStep); - } break; - case DataHeatBalFanSys::PredictorCorrectorCtrl::CorrectStep: { - ZoneTempChange = correctZoneAirTemps(state, UseZoneTimeStepHistory); - } break; - case DataHeatBalFanSys::PredictorCorrectorCtrl::RevertZoneTimestepHistories: { - RevertZoneTimestepHistories(state); - } break; - case DataHeatBalFanSys::PredictorCorrectorCtrl::PushZoneTimestepHistories: { - PushZoneTimestepHistories(state); - } break; - case DataHeatBalFanSys::PredictorCorrectorCtrl::PushSystemTimestepHistories: { - PushSystemTimestepHistories(state); - } break; - default: - break; - } -} - -void GetZoneAirSetPoints(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Russell Taylor - // DATE WRITTEN September 1998 - // MODIFIED L.Gu, May 2006, B. Griffith June 2006 - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine gets the inputs related to thermostatic control. - - // METHODOLOGY EMPLOYED: - // Uses the status flags to trigger events. - - // Using/Aliasing - using General::CheckCreatedZoneItemName; - using General::FindNumberInList; - - using ScheduleManager::CheckScheduleValue; - using ScheduleManager::CheckScheduleValueMinMax; - using ScheduleManager::GetScheduleIndex; - using ScheduleManager::GetScheduleMaxValue; - using ScheduleManager::GetScheduleMinValue; - - // SUBROUTINE PARAMETER DEFINITIONS: - static constexpr std::string_view RoutineName("GetZoneAirSetpoints: "); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int TempControlledZoneNum; // The Splitter that you are currently loading input into - int NumAlphas; - int NumNums; - int ControlTypeNum; - int IOStat; - bool ErrorsFound(false); - bool errFlag; - int CTIndex; - int HumidControlledZoneNum; // The Humidity Controller that information is being loaded into - bool ValidScheduleControlType; - bool ValidRadFractSched; // check for if radiative fraction schedule has valid numbers - bool ValidZoneOvercoolRangeSched; // check for if Zone Overcool range schedule has valid numbers - int SchedMin; - int SchedMax; - int ActualZoneNum; - int SchedTypeIndex; - - int ComfortControlledZoneNum; // The Splitter that you are currently loading input into - int i; - int IZoneCount; - int found; - int NumStageControlledZones; // Number of staged controlled objects - int StageControlledZoneNum; // Index for staged controlled zones - - Array1D_int CTSchedMapToControlledZone; - Array1D_int CCmSchedMapToControlledZone; - int Item; - int Item1; - int ZLItem; - - struct NeededControlTypes - { - // Members 4= the four control types + uncontrolled - std::array(DataHVACGlobals::ThermostatType::Num)> MustHave = {false, false, false, false, false}; - std::array(DataHVACGlobals::ThermostatType::Num)> DidHave = {false, false, false, false, false}; - }; - - struct NeededComfortControlTypes - { - // Members 4= the four control types + uncontrolled - std::array(DataHVACGlobals::ThermostatType::Num)> MustHave = {false, false, false, false, false}; - std::array(DataHVACGlobals::ThermostatType::Num)> DidHave = {false, false, false, false, false}; - }; - - // Object Data - Array1D TStatControlTypes; - Array1D TComfortControlTypes; - - // Formats - static constexpr std::string_view Header( - "! , Sensible Heat Capacity Multiplier, Moisture Capacity Multiplier, Carbon " - "Dioxide Capacity Multiplier, Generic Contaminant Capacity Multiplier\n"); - static constexpr std::string_view Format_701("Zone Volume Capacitance Multiplier,{:8.3F} ,{:8.3F},{:8.3F},{:8.3F}\n"); - - auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; - auto &TStatObjects = state.dataZoneCtrls->TStatObjects; - auto &NumTStatStatements = state.dataZoneCtrls->NumTStatStatements; - auto &NumTempControlledZones = state.dataZoneCtrls->NumTempControlledZones; - auto &Zone = state.dataHeatBal->Zone; - auto &ZoneList = state.dataHeatBal->ZoneList; - auto &TempControlledZone = state.dataZoneCtrls->TempControlledZone; - auto &HumidityControlZone = state.dataZoneCtrls->HumidityControlZone; - auto &ComfortTStatObjects = state.dataZoneCtrls->ComfortTStatObjects; - auto &ComfortControlledZone = state.dataZoneCtrls->ComfortControlledZone; - auto &NumOfZones = state.dataGlobal->NumOfZones; - auto &StageControlledZone = state.dataZoneCtrls->StageControlledZone; - auto &SetPointSingleHeating = state.dataZoneTempPredictorCorrector->SetPointSingleHeating; - auto &SetPointSingleCooling = state.dataZoneTempPredictorCorrector->SetPointSingleCooling; - auto &cAlphaArgs = state.dataIPShortCut->cAlphaArgs; - auto &rNumericArgs = state.dataIPShortCut->rNumericArgs; - auto &lNumericFieldBlanks = state.dataIPShortCut->lNumericFieldBlanks; - auto &lAlphaFieldBlanks = state.dataIPShortCut->lAlphaFieldBlanks; - auto &cAlphaFieldNames = state.dataIPShortCut->cAlphaFieldNames; - auto &cNumericFieldNames = state.dataIPShortCut->cNumericFieldNames; - auto &inputProcessor = state.dataInputProcessing->inputProcessor; - auto &SetPointDualHeatCool = state.dataZoneTempPredictorCorrector->SetPointDualHeatCool; - - cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::TStat)); - NumTStatStatements = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - TStatObjects.allocate(NumTStatStatements); - - // Pre-scan for use of Zone lists in TStat statements (i.e. Global application of TStat) - NumTempControlledZones = 0; - for (Item = 1; Item <= NumTStatStatements; ++Item) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Item, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - - TStatObjects(Item).Name = cAlphaArgs(1); - Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - ZLItem = 0; - if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); - if (Item1 > 0) { - TStatObjects(Item).TempControlledZoneStartPtr = NumTempControlledZones + 1; - ++NumTempControlledZones; - TStatObjects(Item).NumOfZones = 1; - TStatObjects(Item).ZoneListActive = false; - TStatObjects(Item).ZoneOrZoneListPtr = Item1; - } else if (ZLItem > 0) { - TStatObjects(Item).TempControlledZoneStartPtr = NumTempControlledZones + 1; - NumTempControlledZones += ZoneList(ZLItem).NumOfZones; - TStatObjects(Item).NumOfZones = ZoneList(ZLItem).NumOfZones; - TStatObjects(Item).ZoneListActive = true; - TStatObjects(Item).ZoneOrZoneListPtr = ZLItem; - } else { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - } - - if (ErrorsFound) { - ShowSevereError(state, "GetZoneAirSetpoints: Errors with invalid names in " + cCurrentModuleObject + " objects."); - ShowContinueError(state, "...These will not be read in. Other errors may occur."); - NumTempControlledZones = 0; - } - - if (NumTempControlledZones > 0) { - TempControlledZone.allocate(NumTempControlledZones); - TStatControlTypes.allocate(NumTempControlledZones); // Number of set point types - CTSchedMapToControlledZone.dimension(NumTempControlledZones, 0); - - TempControlledZoneNum = 0; - state.dataZoneTempPredictorCorrector->NumOnOffCtrZone = 0; - for (Item = 1; Item <= NumTStatStatements; ++Item) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Item, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - for (Item1 = 1; Item1 <= TStatObjects(Item).NumOfZones; ++Item1) { - ++TempControlledZoneNum; - if (TStatObjects(Item).ZoneListActive) { - cAlphaArgs(2) = Zone(ZoneList(TStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name; - } - int ZoneAssigned = UtilityRoutines::FindItemInList( - cAlphaArgs(2), TempControlledZone, &DataZoneControls::ZoneTempControls::ZoneName, TempControlledZoneNum - 1); - if (ZoneAssigned == 0) { - TempControlledZone(TempControlledZoneNum).ZoneName = cAlphaArgs(2); - TempControlledZone(TempControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - if (TempControlledZone(TempControlledZoneNum).ActualZoneNum == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" not found."); - ErrorsFound = true; - } else { - Zone(TempControlledZone(TempControlledZoneNum).ActualZoneNum).TempControlledZoneIndex = TempControlledZoneNum; - } - } else { - TempControlledZone(TempControlledZoneNum).ZoneName = cAlphaArgs(2); // for continuity - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" zone previously assigned."); - ShowContinueError(state, "...Zone was previously assigned to Thermostat=\"" + TempControlledZone(ZoneAssigned).Name + "\"."); - ErrorsFound = true; - continue; - } - - if (!TStatObjects(Item).ZoneListActive) { - TempControlledZone(TempControlledZoneNum).Name = cAlphaArgs(1); - } else { - CheckCreatedZoneItemName(state, - RoutineName, - cCurrentModuleObject, - Zone(ZoneList(TStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name, - ZoneList(TStatObjects(Item).ZoneOrZoneListPtr).MaxZoneNameLength, - TStatObjects(Item).Name, - TempControlledZone, - TempControlledZoneNum - 1, - TempControlledZone(TempControlledZoneNum).Name, - errFlag); - if (errFlag) ErrorsFound = true; - } - - TempControlledZone(TempControlledZoneNum).ControlTypeSchedName = cAlphaArgs(3); - TempControlledZone(TempControlledZoneNum).CTSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); - if (Item1 == 1) { // only show error on first of several if zone list - if (TempControlledZone(TempControlledZoneNum).CTSchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + - "\" not found."); - ErrorsFound = true; - } else { - // Check validity of control types. - ValidScheduleControlType = - CheckScheduleValueMinMax(state, TempControlledZone(TempControlledZoneNum).CTSchedIndex, ">=", 0.0, "<=", 4.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid range " + cAlphaFieldNames(2) + "=\"" + - cAlphaArgs(2) + "\""); - ShowContinueError(state, "..contains values outside of range [0,4]."); - ErrorsFound = true; - } - } - } - - if (lAlphaFieldBlanks(7)) { - NumAlphas = 5; - } else if (lAlphaFieldBlanks(9)) { - NumAlphas = 7; - } else if (lAlphaFieldBlanks(11)) { - NumAlphas = 9; - } - - TempControlledZone(TempControlledZoneNum).NumControlTypes = nint((NumAlphas - 3.0) / 2.0); - TempControlledZone(TempControlledZoneNum).ControlType.allocate(TempControlledZone(TempControlledZoneNum).NumControlTypes); - TempControlledZone(TempControlledZoneNum).ControlTypeName.allocate(TempControlledZone(TempControlledZoneNum).NumControlTypes); - TempControlledZone(TempControlledZoneNum).ControlTypeEnum.allocate(TempControlledZone(TempControlledZoneNum).NumControlTypes); - - for (ControlTypeNum = 1; ControlTypeNum <= TempControlledZone(TempControlledZoneNum).NumControlTypes; ++ControlTypeNum) { - - TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 3)); - TempControlledZone(TempControlledZoneNum).ControlTypeName(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum + 3)); - - if (!TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum).empty()) { - auto ctrlType = static_cast( - getEnumerationValue(ValidControlTypesUC, TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum))); - TempControlledZone(TempControlledZoneNum).ControlTypeEnum(ControlTypeNum) = ctrlType; - if (ctrlType == DataHVACGlobals::ThermostatType::Invalid) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + - cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 3)) + "=\"" + - cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 3)) + "\""); - ErrorsFound = true; - } - } else { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + - cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 3)) + "=\"\""); - ErrorsFound = true; - } - } - if (NumNums > 0) { - if (rNumericArgs(1) >= 0.0) { - TempControlledZone(TempControlledZoneNum).DeltaTCutSet = rNumericArgs(1); - if (rNumericArgs(1) > 0.0) state.dataZoneTempPredictorCorrector->NumOnOffCtrZone++; - } else { - ShowSevereError( - state, - format("{}=\"{} invalid {}=[{:.0T}].", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(1), rNumericArgs(1))); - ShowContinueError(state, "..Allowable values must be greater or equal to 0"); - ErrorsFound = true; - } - } - if (TempControlledZone(TempControlledZoneNum).DeltaTCutSet > 0.0) { - for (ControlTypeNum = 1; ControlTypeNum <= TempControlledZone(TempControlledZoneNum).NumControlTypes; ++ControlTypeNum) { - if (UtilityRoutines::SameString(TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum), - "ThermostatSetpoint:SingleHeatingOrCooling")) { - ShowWarningError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + - ": The choice of Temperature Difference Between Cutout And Setpoint will not be applied to " - "ThermostatSetpoint:SingleHeatingOrCooling."); - } - } - } - } - } // NumTStatStatements - } // Check on number of TempControlledZones - - cCurrentModuleObject = ValidControlTypesUC[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)]; - state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls > 0) - SetPointSingleHeating.allocate(state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &singleHtgSetpoint = SetPointSingleHeating(idx); - singleHtgSetpoint.Name = cAlphaArgs(1); - singleHtgSetpoint.TempSchedName = cAlphaArgs(2); - singleHtgSetpoint.TempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (singleHtgSetpoint.TempSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - - } // SingleTempHeatingControlNum - - cCurrentModuleObject = ValidControlTypesUC[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)]; - state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls > 0) - SetPointSingleCooling.allocate(state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &singleClgSetpoint = SetPointSingleCooling(idx); - singleClgSetpoint.Name = cAlphaArgs(1); - singleClgSetpoint.TempSchedName = cAlphaArgs(2); - singleClgSetpoint.TempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (singleClgSetpoint.TempSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - - } // SingleTempCoolingControlNum - - cCurrentModuleObject = ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)]; - state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls > 0) - state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool.allocate(state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - auto &singleHeatCoolSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool(idx); - singleHeatCoolSetpoint.Name = cAlphaArgs(1); - singleHeatCoolSetpoint.TempSchedName = cAlphaArgs(2); - singleHeatCoolSetpoint.TempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (singleHeatCoolSetpoint.TempSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - - } // SingleTempHeatCoolControlNum - - cCurrentModuleObject = ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)]; - state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls > 0) - SetPointDualHeatCool.allocate(state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &dualHeatCoolSetpoint = SetPointDualHeatCool(idx); - dualHeatCoolSetpoint.Name = cAlphaArgs(1); - dualHeatCoolSetpoint.HeatTempSetptSchedName = cAlphaArgs(2); - dualHeatCoolSetpoint.HeatTempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (dualHeatCoolSetpoint.HeatTempSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - dualHeatCoolSetpoint.CoolTempSetptSchedName = cAlphaArgs(3); - dualHeatCoolSetpoint.CoolTempSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); - if (dualHeatCoolSetpoint.CoolTempSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" not found."); - ErrorsFound = true; - } - - } // DualTempHeatCoolControlNum - - // Finish filling in Schedule pointing indexes - int setPointObjectArrayIndex; - for (TempControlledZoneNum = 1; TempControlledZoneNum <= NumTempControlledZones; ++TempControlledZoneNum) { - for (int ct = 1; ct <= state.dataZoneCtrls->TempControlledZone(TempControlledZoneNum).NumControlTypes; ct++) { - switch (state.dataZoneCtrls->TempControlledZone(TempControlledZoneNum).ControlTypeEnum(ct)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - setPointObjectArrayIndex = - UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), SetPointSingleHeating); - TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatSetPoint = - state.dataZoneTempPredictorCorrector->SetPointSingleHeating(setPointObjectArrayIndex).TempSchedIndex; - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - setPointObjectArrayIndex = - UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), SetPointSingleCooling); - TempControlledZone(TempControlledZoneNum).SchIndx_SingleCoolSetPoint = - state.dataZoneTempPredictorCorrector->SetPointSingleCooling(setPointObjectArrayIndex).TempSchedIndex; - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - setPointObjectArrayIndex = UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), - state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool); - TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatCoolSetPoint = - state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool(setPointObjectArrayIndex).TempSchedIndex; - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - setPointObjectArrayIndex = UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), - state.dataZoneTempPredictorCorrector->SetPointDualHeatCool); - TempControlledZone(TempControlledZoneNum).SchIndx_DualSetPointWDeadBandHeat = - state.dataZoneTempPredictorCorrector->SetPointDualHeatCool(setPointObjectArrayIndex).HeatTempSchedIndex; - TempControlledZone(TempControlledZoneNum).SchIndx_DualSetPointWDeadBandCool = - state.dataZoneTempPredictorCorrector->SetPointDualHeatCool(setPointObjectArrayIndex).CoolTempSchedIndex; - break; - default: - assert(false); - } - } - } - - // Now, Check the schedule values/indices for validity - - for (TempControlledZoneNum = 1; TempControlledZoneNum <= NumTempControlledZones; ++TempControlledZoneNum) { - - ActualZoneNum = TempControlledZone(TempControlledZoneNum).ActualZoneNum; - CTIndex = TempControlledZone(TempControlledZoneNum).CTSchedIndex; - if (CTIndex == 0) continue; // error will be caught elsewhere - SchedMin = GetScheduleMinValue(state, CTIndex); - SchedMax = GetScheduleMaxValue(state, CTIndex); - - if (SchedMin == 0 && SchedMax == 0) { - if (FindNumberInList(CTIndex, CTSchedMapToControlledZone, NumTempControlledZones) == 0) { - ShowSevereError(state, "Control Type Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, "..specifies control type 0 for all entries."); - ShowContinueError(state, "All zones using this Control Type Schedule have no heating or cooling available."); - } - CTSchedMapToControlledZone(TempControlledZoneNum) = CTIndex; - } - - for (ControlTypeNum = SchedMin; ControlTypeNum <= SchedMax; ++ControlTypeNum) { - - int TempIndex = 0; - switch (static_cast(ControlTypeNum)) { - case DataHVACGlobals::ThermostatType::Uncontrolled: - break; - case DataHVACGlobals::ThermostatType::SingleHeating: - TempIndex = TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatSetPoint; - if (TempIndex == 0) { - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeating))) { - ShowSevereError(state, "Control Type Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies control type 1 ({}) as the control type. Not valid for this zone.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - TempIndex = TempControlledZone(TempControlledZoneNum).SchIndx_SingleCoolSetPoint; - if (TempIndex == 0) { - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleCooling))) { - ShowSevereError(state, "Control Type Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies control type 2 ({}) as the control type. Not valid for this zone.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - TempIndex = TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatCoolSetPoint; - if (TempIndex == 0) { - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool))) { - ShowSevereError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies control type 3 ({}) as the control type. Not valid for this zone.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - TempIndex = TempControlledZone(TempControlledZoneNum) - .SchIndx_DualSetPointWDeadBandHeat; // using "Heat" as a sentinel that dualsetpoint is on this zone control object - if (TempIndex == 0) { - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand))) { - ShowSevereError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies control type 4 ({}) as the control type. Not valid for this zone.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - default: - ShowSevereError(state, - format("GetZoneAirSetpoints: Illegal control type for Zone={}, Found value={}, in Schedule={}", - Zone(ActualZoneNum).Name, - ControlTypeNum, - TempControlledZone(TempControlledZoneNum).ControlTypeSchedName)); - ShowContinueError(state, "..valid range values are [0,4]."); - ErrorsFound = true; - } - } - } - - for (TempControlledZoneNum = 1; TempControlledZoneNum <= NumTempControlledZones; ++TempControlledZoneNum) { - - ActualZoneNum = TempControlledZone(TempControlledZoneNum).ActualZoneNum; - CTIndex = TempControlledZone(TempControlledZoneNum).CTSchedIndex; - if (CTIndex == 0) continue; // error caught elsewhere -- would just be confusing here - - for (ControlTypeNum = 1; ControlTypeNum <= 4; ++ControlTypeNum) { - if (TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum] && TStatControlTypes(TempControlledZoneNum).DidHave[ControlTypeNum]) - continue; - - switch (static_cast(ControlTypeNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 1 ({}) but does not.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 2 ({}) but does not.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 3 ({}) but does not.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 4 ({}) but does not.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - break; - default: - break; - } - } - } - - if (allocated(TStatControlTypes)) TStatControlTypes.deallocate(); - // This starts the Humidity Control Get Input section - cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::HStat)); - state.dataZoneCtrls->NumHumidityControlZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneCtrls->NumHumidityControlZones > 0) { - HumidityControlZone.allocate(state.dataZoneCtrls->NumHumidityControlZones); - state.dataZoneTempPredictorCorrector->HumidityControlZoneUniqueNames.reserve( - static_cast(state.dataZoneCtrls->NumHumidityControlZones)); - } - - for (HumidControlledZoneNum = 1; HumidControlledZoneNum <= state.dataZoneCtrls->NumHumidityControlZones; ++HumidControlledZoneNum) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - HumidControlledZoneNum, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - - HumidityControlZone(HumidControlledZoneNum).ControlName = cAlphaArgs(1); - GlobalNames::IntraObjUniquenessCheck(state, - cAlphaArgs(2), - cCurrentModuleObject, - cAlphaFieldNames(2), - state.dataZoneTempPredictorCorrector->HumidityControlZoneUniqueNames, - ErrorsFound); - - HumidityControlZone(HumidControlledZoneNum).ZoneName = cAlphaArgs(2); - HumidityControlZone(HumidControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItem(cAlphaArgs(2), Zone); - if (HumidityControlZone(HumidControlledZoneNum).ActualZoneNum == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } else { - state.dataHeatBal->Zone(HumidityControlZone(HumidControlledZoneNum).ActualZoneNum).humidityControlZoneIndex = HumidControlledZoneNum; - } - HumidityControlZone(HumidControlledZoneNum).HumidifyingSched = cAlphaArgs(3); - HumidityControlZone(HumidControlledZoneNum).HumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); - if (HumidityControlZone(HumidControlledZoneNum).HumidifyingSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" not found."); - ErrorsFound = true; - } - if (NumAlphas == 4) { - HumidityControlZone(HumidControlledZoneNum).DehumidifyingSched = cAlphaArgs(4); - HumidityControlZone(HumidControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(4)); - if (HumidityControlZone(HumidControlledZoneNum).DehumidifyingSchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + - "\" not found."); - ErrorsFound = true; - } - } else { - HumidityControlZone(HumidControlledZoneNum).DehumidifyingSched = cAlphaArgs(3); - HumidityControlZone(HumidControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); - } - - } // HumidControlledZoneNum - - // Start to read Thermal comfort control objects - cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::TCTStat)); - state.dataZoneCtrls->NumComfortTStatStatements = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - ComfortTStatObjects.allocate(state.dataZoneCtrls->NumComfortTStatStatements); - - // Pre-scan for use of Zone lists in TStat statements (i.e. Global application of TStat) - state.dataZoneCtrls->NumComfortControlledZones = 0; - errFlag = false; - for (Item = 1; Item <= state.dataZoneCtrls->NumComfortTStatStatements; ++Item) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Item, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - - Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - ZLItem = 0; - if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); - ComfortTStatObjects(Item).Name = cAlphaArgs(1); - if (Item1 > 0) { - ComfortTStatObjects(Item).ComfortControlledZoneStartPtr = state.dataZoneCtrls->NumComfortControlledZones + 1; - ++state.dataZoneCtrls->NumComfortControlledZones; - ComfortTStatObjects(Item).NumOfZones = 1; - ComfortTStatObjects(Item).ZoneListActive = false; - ComfortTStatObjects(Item).ZoneOrZoneListPtr = Item1; - } else if (ZLItem > 0) { - ComfortTStatObjects(Item).ComfortControlledZoneStartPtr = state.dataZoneCtrls->NumComfortControlledZones + 1; - state.dataZoneCtrls->NumComfortControlledZones += ZoneList(ZLItem).NumOfZones; - ComfortTStatObjects(Item).NumOfZones = ZoneList(ZLItem).NumOfZones; - ComfortTStatObjects(Item).ZoneListActive = true; - ComfortTStatObjects(Item).ZoneOrZoneListPtr = ZLItem; - } else { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - errFlag = true; - ErrorsFound = true; - } - } - - if (errFlag) { - ShowSevereError(state, "GetZoneAirSetpoints: Errors with invalid names in " + cCurrentModuleObject + " objects."); - ShowContinueError(state, "...These will not be read in. Other errors may occur."); - state.dataZoneCtrls->NumComfortControlledZones = 0; - } - - if (state.dataZoneCtrls->NumComfortControlledZones > 0) { - ComfortControlledZone.allocate(state.dataZoneCtrls->NumComfortControlledZones); - TComfortControlTypes.allocate(state.dataZoneCtrls->NumComfortControlledZones); // Number of set point types - CCmSchedMapToControlledZone.dimension(state.dataZoneCtrls->NumComfortControlledZones, 0); - - ComfortControlledZoneNum = 0; - for (Item = 1; Item <= state.dataZoneCtrls->NumComfortTStatStatements; ++Item) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Item, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - for (Item1 = 1; Item1 <= ComfortTStatObjects(Item).NumOfZones; ++Item1) { - ++ComfortControlledZoneNum; - if (ComfortTStatObjects(Item).ZoneListActive) { - cAlphaArgs(2) = state.dataHeatBal->Zone(ZoneList(ComfortTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name; - } - int ZoneAssigned = UtilityRoutines::FindItemInList( - cAlphaArgs(2), ComfortControlledZone, &DataZoneControls::ZoneComfortControls::ZoneName, ComfortControlledZoneNum - 1); - if (ZoneAssigned == 0) { - ComfortControlledZone(ComfortControlledZoneNum).ZoneName = cAlphaArgs(2); - ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" not found."); - ErrorsFound = true; - } - } else { - ComfortControlledZone(ComfortControlledZoneNum).ZoneName = cAlphaArgs(2); // for continuity - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" zone previously assigned."); - ShowContinueError(state, "...Zone was previously assigned to Thermostat=\"" + ComfortControlledZone(ZoneAssigned).Name + "\"."); - ErrorsFound = true; - continue; - } - - if (!ComfortTStatObjects(Item).ZoneListActive) { - ComfortControlledZone(ComfortControlledZoneNum).Name = cAlphaArgs(1); - } else { - ComfortControlledZone(ComfortControlledZoneNum).Name = - state.dataHeatBal->Zone(ZoneList(ComfortTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name + ' ' + - ComfortTStatObjects(Item).Name; - } - - // Read Fields A3 and A4 for averaging method - IZoneCount = 0; - for (i = 1; i <= state.dataHeatBal->TotPeople; ++i) { - if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == state.dataHeatBal->People(i).ZonePtr) { - ++IZoneCount; - } - } - // Could not find a people object for this particular zone - if (IZoneCount == 0 && ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum > 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " no PEOPLE in " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" - cannot use Comfort Control."); - ErrorsFound = true; - } - ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::NO; - if (IZoneCount > 1) { - ComfortControlledZone(ComfortControlledZoneNum).AverageMethodName = cAlphaArgs(3); - if (UtilityRoutines::SameString(cAlphaArgs(3), "SpecificObject")) { - ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::SPE; - } - if (UtilityRoutines::SameString(cAlphaArgs(3), "ObjectAverage")) { - ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::OBJ; - } - if (UtilityRoutines::SameString(cAlphaArgs(3), "PeopleAverage")) { - ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::PEO; - } - if (ComfortControlledZone(ComfortControlledZoneNum).AverageMethod == DataZoneControls::AverageMethod::NO) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); - ShowContinueError(state, "Allowed keys are SpecificObject, ObjectAverage, or PeopleAverage"); - ErrorsFound = true; - } - if (ComfortControlledZone(ComfortControlledZoneNum).AverageMethod == DataZoneControls::AverageMethod::SPE) { - ComfortControlledZone(ComfortControlledZoneNum).AverageObjectName = cAlphaArgs(4); - if (UtilityRoutines::FindItem(cAlphaArgs(4), state.dataHeatBal->People) == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + - "\"."); - ErrorsFound = true; - } else { - ComfortControlledZone(ComfortControlledZoneNum).SpecificObjectNum = - UtilityRoutines::FindItem(cAlphaArgs(4), state.dataHeatBal->People); - } - } - } else { - for (i = 1; i <= state.dataHeatBal->TotPeople; ++i) { - if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == state.dataHeatBal->People(i).ZonePtr) break; - } - ComfortControlledZone(ComfortControlledZoneNum).SpecificObjectNum = i; - } - // Check values used for thermal comfort calculation - for (i = 1; i <= state.dataHeatBal->TotPeople; ++i) { - if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == state.dataHeatBal->People(i).ZonePtr) { - // Check activity level - if (state.dataHeatBal->People(i).ActivityLevelPtr > 0) { - ValidScheduleControlType = - CheckScheduleValueMinMax(state, state.dataHeatBal->People(i).ActivityLevelPtr, ">=", 72.0, "<=", 909.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - "GetPeople Activity Level: Invalid activity level values entered for thermal comfort calculation"); - ShowContinueError(state, "Outside of range values [72,909], Reference object=" + state.dataHeatBal->People(i).Name); - ErrorsFound = true; - } - } else { - ShowSevereError(state, - "GetPeople Activity Level: Activity level schedule is not found=" + state.dataHeatBal->People(i).Name); - ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); - ErrorsFound = true; - } - // Check Work Efficiency - if (state.dataHeatBal->People(i).WorkEffPtr > 0) { - ValidScheduleControlType = CheckScheduleValueMinMax(state, state.dataHeatBal->People(i).WorkEffPtr, ">=", 0.0, "<=", 1.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - "GetPeople work efficiency: Invalid work efficiency values entered for thermal comfort calculation"); - ShowContinueError(state, "Outside of range values [0,1], Reference object=" + state.dataHeatBal->People(i).Name); - ErrorsFound = true; - } - } else { - ShowSevereError(state, - "GetPeople work efficiency: Work efficiency schedule is not found=" + state.dataHeatBal->People(i).Name); - ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); - ErrorsFound = true; - } - // Check Clothing Insulation - if (state.dataHeatBal->People(i).ClothingPtr > 0) { - ValidScheduleControlType = CheckScheduleValueMinMax(state, state.dataHeatBal->People(i).ClothingPtr, ">", 0.0, "<=", 2.0); - if (!ValidScheduleControlType) { - ShowSevereError( - state, - "GetPeople Clothing Insulation: Invalid Clothing Insulation values entered for thermal comfort calculation"); - ShowContinueError(state, "Outside of range values [0.0,2.0], Reference object=" + state.dataHeatBal->People(i).Name); - ErrorsFound = true; - } - } else { - ShowSevereError(state, - "GetPeople Clothing Insulation: Clothing Insulation schedule is not found=" + - state.dataHeatBal->People(i).Name); - ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); - ErrorsFound = true; - } - // Check Air velocity - if (state.dataHeatBal->People(i).AirVelocityPtr <= 0) { - ShowSevereError(state, "GetPeople Air Velocity: Air velocity schedule is not found=" + state.dataHeatBal->People(i).Name); - ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); - ErrorsFound = true; - } - } - } - - // Read Max and Min temperature setpoint - if (NumNums > 0) { - ComfortControlledZone(ComfortControlledZoneNum).TdbMinSetPoint = rNumericArgs(1); - if (rNumericArgs(1) > 50 || rNumericArgs(1) < 0) { - ShowSevereError( - state, - format("{}=\"{} invalid {}=[{:.0T}].", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(1), rNumericArgs(1))); - ShowContinueError(state, "..Allowable values must be between 0 C and 50 C"); - ErrorsFound = true; - } - } - if (NumNums > 1) { - ComfortControlledZone(ComfortControlledZoneNum).TdbMaxSetPoint = rNumericArgs(2); - if (rNumericArgs(2) > 50 || rNumericArgs(2) < 0) { - ShowSevereError( - state, - format("{}=\"{} invalid {}=[{:.0T}].", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(2), rNumericArgs(2))); - ShowContinueError(state, "..Allowable values must be between 0 C and 50 C"); - ErrorsFound = true; - } - } - // Ensure MaxTemp >= MinTemp - if (ComfortControlledZone(ComfortControlledZoneNum).TdbMinSetPoint > ComfortControlledZone(ComfortControlledZoneNum).TdbMaxSetPoint) { - ShowSevereError(state, cCurrentModuleObject + "=\"" + cAlphaArgs(1)); - ShowContinueError(state, ".." + cNumericFieldNames(1) + " > " + cNumericFieldNames(2)); - ShowContinueError(state, format("..[{:.0T}] > [{:.0T}].", rNumericArgs(1), rNumericArgs(2))); - ErrorsFound = true; - } - // If MaxTemp = MinTemp, no thermal comfort control - if (ComfortControlledZone(ComfortControlledZoneNum).TdbMinSetPoint == - ComfortControlledZone(ComfortControlledZoneNum).TdbMaxSetPoint) { - ShowSevereError(state, cCurrentModuleObject + "=\"" + cAlphaArgs(1)); - ShowContinueError(state, ".." + cNumericFieldNames(1) + " = " + cNumericFieldNames(2)); - ShowContinueError(state, "The zone will be controlled using this dry-bulb temperature setpoint."); - } - // read Thermal comfort type schedule name - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName = cAlphaArgs(5); - ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex = GetScheduleIndex(state, cAlphaArgs(5)); - if (ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + - "\" not found."); - ErrorsFound = true; - } else { - // Check validity of control types. - ValidScheduleControlType = - CheckScheduleValueMinMax(state, ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex, ">=", 0.0, "<=", 4.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid range " + cAlphaFieldNames(5) + "=\"" + - cAlphaArgs(5) + "\""); - ShowContinueError(state, "..contains values outside of range [0,4]."); - ErrorsFound = true; - } - } - ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes = nint((NumAlphas - 5.0) / 2.0); - ComfortControlledZone(ComfortControlledZoneNum).ControlType.allocate(ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - ComfortControlledZone(ComfortControlledZoneNum) - .ControlTypeName.allocate(ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - ComfortControlledZone(ComfortControlledZoneNum) - .ControlTypeSchIndx.allocate(ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - - for (ControlTypeNum = 1; ControlTypeNum <= ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes; ++ControlTypeNum) { - ComfortControlledZone(ComfortControlledZoneNum).ControlType(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 5)); - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum + 5)); - if (ComfortControlledZone(ComfortControlledZoneNum).ControlType(ControlTypeNum) != "") { - CTIndex = getEnumerationValue( - ValidComfortControlTypesUC, - UtilityRoutines::MakeUPPERCase(ComfortControlledZone(ComfortControlledZoneNum).ControlType(ControlTypeNum))); - if (CTIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + - cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 5)) + "=\"" + - cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 5)) + "\""); - ErrorsFound = true; - } - if (CTIndex > 4) { // For Fanger control only for the time being - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + - cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 5)) + "=\"" + - cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 5)) + "\""); - ShowContinueError(state, "..Fanger is the only valid model."); - ErrorsFound = true; - } - } else { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + - cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 5)) + "=\"\""); - ErrorsFound = true; - } - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ControlTypeNum) = 0; - } - } - } // NumComfortTStatStatements - } - // End of Thermal comfort control reading and checking - - cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)]; - state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls > 0) - state.dataZoneTempPredictorCorrector->SetPointSingleHeatingFanger.allocate( - state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &singleSetpointHtgFanger = state.dataZoneTempPredictorCorrector->SetPointSingleHeatingFanger(idx); - singleSetpointHtgFanger.Name = cAlphaArgs(1); - singleSetpointHtgFanger.PMVSchedName = cAlphaArgs(2); - singleSetpointHtgFanger.PMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (singleSetpointHtgFanger.PMVSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } else { - ValidScheduleControlType = CheckScheduleValueMinMax(state, singleSetpointHtgFanger.PMVSchedIndex, ">=", -3.0, "<=", 3.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + - cAlphaArgs(2) + "\" entered."); - ShowContinueError(state, "..Values outside of range [-3,+3]."); - ErrorsFound = true; - } - } - } // SingleFangerHeatingControlNum - - cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)]; - state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls > 0) { - state.dataZoneTempPredictorCorrector->SetPointSingleCoolingFanger.allocate( - state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls); - } - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &singleSetpointClgFanger = state.dataZoneTempPredictorCorrector->SetPointSingleCoolingFanger(idx); - singleSetpointClgFanger.Name = cAlphaArgs(1); - singleSetpointClgFanger.PMVSchedName = cAlphaArgs(2); - singleSetpointClgFanger.PMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (singleSetpointClgFanger.PMVSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } else { - ValidScheduleControlType = CheckScheduleValueMinMax(state, singleSetpointClgFanger.PMVSchedIndex, ">=", -3.0, "<=", 3.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + - cAlphaArgs(2) + "\" entered."); - ShowContinueError(state, "..Values outside of range [-3,+3]."); - ErrorsFound = true; - } - } - - } // SingleFangerCoolingControlNum - - cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)]; - state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls > 0) - state.dataZoneTempPredictorCorrector->SetPointSingleHeatCoolFanger.allocate( - state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &singleSetpointHeatCoolFanger = state.dataZoneTempPredictorCorrector->SetPointSingleHeatCoolFanger(idx); - singleSetpointHeatCoolFanger.Name = cAlphaArgs(1); - singleSetpointHeatCoolFanger.PMVSchedName = cAlphaArgs(2); - singleSetpointHeatCoolFanger.PMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (singleSetpointHeatCoolFanger.PMVSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } else { - ValidScheduleControlType = CheckScheduleValueMinMax(state, singleSetpointHeatCoolFanger.PMVSchedIndex, ">=", -3.0, "<=", 3.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + - cAlphaArgs(2) + "\" entered."); - ShowContinueError(state, "..Values outside of range [-3,+3]."); - ErrorsFound = true; - } - } - - } // SingleFangerHeatCoolControlNum - - cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)]; - state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls > 0) - state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger.allocate( - state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &dualSetpointHeatCoolFanger = state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(idx); - dualSetpointHeatCoolFanger.Name = cAlphaArgs(1); - dualSetpointHeatCoolFanger.HeatPMVSetptSchedName = cAlphaArgs(2); - dualSetpointHeatCoolFanger.HeatPMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (dualSetpointHeatCoolFanger.HeatPMVSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - dualSetpointHeatCoolFanger.CoolPMVSetptSchedName = cAlphaArgs(3); - dualSetpointHeatCoolFanger.CoolPMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); - if (dualSetpointHeatCoolFanger.CoolPMVSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" not found."); - ErrorsFound = true; - } else { - ValidScheduleControlType = CheckScheduleValueMinMax(state, dualSetpointHeatCoolFanger.HeatPMVSchedIndex, ">=", -3.0, "<=", 3.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + - cAlphaArgs(2) + "\" entered."); - ShowContinueError(state, "..Values outside of range [-3,+3]."); - ErrorsFound = true; - } - ValidScheduleControlType = CheckScheduleValueMinMax(state, dualSetpointHeatCoolFanger.CoolPMVSchedIndex, ">=", -3.0, "<=", 3.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(3) + "=\"" + - cAlphaArgs(3) + "\" entered."); - ShowContinueError(state, "..Values outside of range [-3,+3]."); - ErrorsFound = true; - } - } - - } // DualFangerHeatCoolControlNum - - // Finish filling in Schedule pointing indexes for Thermal Comfort Control - for (ComfortControlledZoneNum = 1; ComfortControlledZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++ComfortControlledZoneNum) { - - int ComfortIndex = UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)], - ComfortControlledZone(ComfortControlledZoneNum).ControlType, - ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeating = ComfortIndex; - if (ComfortIndex > 0) { - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = - UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), - state.dataZoneTempPredictorCorrector->SetPointSingleHeatingFanger); - TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)] = true; - } - - ComfortIndex = UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)], - ComfortControlledZone(ComfortControlledZoneNum).ControlType, - ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleCooling = ComfortIndex; - if (ComfortIndex > 0) { - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = - UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), - state.dataZoneTempPredictorCorrector->SetPointSingleCoolingFanger); - TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)] = true; - } - - ComfortIndex = UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)], - ComfortControlledZone(ComfortControlledZoneNum).ControlType, - ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeatCool = ComfortIndex; - if (ComfortIndex > 0) { - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = - UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), - state.dataZoneTempPredictorCorrector->SetPointSingleHeatCoolFanger); - TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)] = true; - } - - ComfortIndex = - UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)], - ComfortControlledZone(ComfortControlledZoneNum).ControlType, - ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - ComfortControlledZone(ComfortControlledZoneNum).SchIndx_DualSetPointWithDeadBand = ComfortIndex; - if (ComfortIndex > 0) { - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = - UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), - state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger); - TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)] = - true; - } - } - - // Now, Check the schedule values/indices for validity for Thermal Comfort Control - - for (ComfortControlledZoneNum = 1; ComfortControlledZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++ComfortControlledZoneNum) { - - ActualZoneNum = ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum; - CTIndex = ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex; - if (CTIndex == 0) continue; // error will be caught elsewhere - SchedMin = GetScheduleMinValue(state, CTIndex); - SchedMax = GetScheduleMaxValue(state, CTIndex); - - if (SchedMin == 0 && SchedMax == 0) { - if (FindNumberInList(CTIndex, CCmSchedMapToControlledZone, state.dataZoneCtrls->NumComfortControlledZones) == 0) { - ShowWarningError(state, "Control Type Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, "..specifies control type 0 for all entries."); - ShowContinueError(state, "All zones using this Control Type Schedule have no thermal comfort control."); - } - CCmSchedMapToControlledZone(ComfortControlledZoneNum) = CTIndex; - } - - for (ControlTypeNum = SchedMin; ControlTypeNum <= SchedMax; ++ControlTypeNum) { - - int ComfortIndex; - switch (static_cast(ControlTypeNum)) { - case DataHVACGlobals::ThermostatType::Uncontrolled: - break; - case DataHVACGlobals::ThermostatType::SingleHeating: - ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeating; - TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)] = true; - if (ComfortIndex != 0) { - SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); - if (SchedTypeIndex == 0) { - ShowSevereError(state, - format("GetZoneAirSetpoints: Could not find {} Schedule={}", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)], - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); - ErrorsFound = true; - } - } else { // ComfortIndex = 0 - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeating))) { - ShowSevereError(state, "Control Type Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies thermal control type 1 ({}) as the control type. Not valid for this zone.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleCooling; - TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)] = true; - if (ComfortIndex != 0) { - SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); - if (SchedTypeIndex == 0) { - ShowSevereError(state, - format("GetZoneAirSetpoints: Could not find {} Schedule={}", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)], - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); - ErrorsFound = true; - } - } else { // ComfortIndex = 0 - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleCooling))) { - ShowSevereError(state, "Control Type Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies thermal control type 2 ({}) as the control type. Not valid for this zone.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeatCool; - TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)] = true; - if (ComfortIndex != 0) { - SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); - if (SchedTypeIndex == 0) { - ShowSevereError(state, - format("GetZoneAirSetpoints: Could not find {} Schedule={}", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)], - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); - ErrorsFound = true; - } - } else { // ComfortIndex = 0 - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool))) { - ShowSevereError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies thermal control type 3 ({}) as the control type. Not valid for this zone.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_DualSetPointWithDeadBand; - TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)] = - true; - if (ComfortIndex != 0) { - SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); - if (SchedTypeIndex == 0) { - ShowSevereError(state, - format("GetZoneAirSetpoints: Could not find {} Schedule={}", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)], - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); - ErrorsFound = true; - } - } else { // ComfortIndex = 0 - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand))) { - ShowSevereError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError( - state, - format("..specifies thermal control type 4 ({}) as the control type. Not valid for this zone.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - default: - ShowSevereError(state, - format("GetZoneAirSetpoints: Illegal control type for Zone={}, Found value={}, in Schedule={}", - Zone(ActualZoneNum).Name, - ControlTypeNum, - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName)); - ShowContinueError(state, "..valid range values are [0,4]."); - ErrorsFound = true; - break; - } - } - } - - for (ComfortControlledZoneNum = 1; ComfortControlledZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++ComfortControlledZoneNum) { - - ActualZoneNum = ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum; - CTIndex = ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex; - if (CTIndex == 0) continue; // error caught elsewhere -- would just be confusing here - - for (ControlTypeNum = 1; ControlTypeNum <= 4; ++ControlTypeNum) { - if (TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum] && - TComfortControlTypes(ComfortControlledZoneNum).DidHave[ControlTypeNum]) - continue; - - switch (static_cast(ControlTypeNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 1 ({}) but does not.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 2 ({}) but does not.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 3 ({}) but does not.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 4 ({}) but does not.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - break; - default: - break; - } - } - } - - if (allocated(TComfortControlTypes)) TComfortControlTypes.deallocate(); - - // Get the Hybrid Model setting inputs - HybridModel::GetHybridModelZone(state); - - // Default multiplier values - Real64 ZoneVolCapMultpSens = 1.0; - Real64 ZoneVolCapMultpMoist = 1.0; - Real64 ZoneVolCapMultpCO2 = 1.0; - Real64 ZoneVolCapMultpGenContam = 1.0; - - // Get the Zone Air Capacitance Multiplier for use in the Predictor-Corrector Procedure - cCurrentModuleObject = "ZoneCapacitanceMultiplier:ResearchSpecial"; - int NumZoneCapaMultiplier = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); // Number of ZonesCapacityMultiplier object - if (NumZoneCapaMultiplier == 0) { - // Assign default multiplier values to all zones - for (int ZoneNum = 1; ZoneNum <= NumOfZones; ZoneNum++) { - Zone(ZoneNum).ZoneVolCapMultpSens = ZoneVolCapMultpSens; - Zone(ZoneNum).ZoneVolCapMultpMoist = ZoneVolCapMultpMoist; - Zone(ZoneNum).ZoneVolCapMultpCO2 = ZoneVolCapMultpCO2; - Zone(ZoneNum).ZoneVolCapMultpGenContam = ZoneVolCapMultpGenContam; - } - - } else { - - // Allow user to specify ZoneCapacitanceMultiplier:ResearchSpecial at zone level - // Added by S. Lee and R. Zhang in Oct. 2016. - // Assign the user inputted multipliers to specified zones - for (int ZoneCapNum = 1; ZoneCapNum <= NumZoneCapaMultiplier; ZoneCapNum++) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - ZoneCapNum, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - - if (lAlphaFieldBlanks(2)) { - // default multiplier values for all the zones not specified (zone or zonelist name field is empty) - ZoneVolCapMultpSens = rNumericArgs(1); - ZoneVolCapMultpMoist = rNumericArgs(2); - ZoneVolCapMultpCO2 = rNumericArgs(3); - ZoneVolCapMultpGenContam = rNumericArgs(4); - } else { - // multiplier values for the specified zone(s) - int ZoneNum = 0; - ZLItem = 0; - Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); - if (Item1 > 0) { - ZoneNum = Item1; - Zone(ZoneNum).FlagCustomizedZoneCap = true; - Zone(ZoneNum).ZoneVolCapMultpSens = rNumericArgs(1); - Zone(ZoneNum).ZoneVolCapMultpMoist = rNumericArgs(2); - Zone(ZoneNum).ZoneVolCapMultpCO2 = rNumericArgs(3); - Zone(ZoneNum).ZoneVolCapMultpGenContam = rNumericArgs(4); - } else if (ZLItem > 0) { - for (int ZonePtrNum = 1; ZonePtrNum < ZoneList(ZLItem).NumOfZones; ZonePtrNum++) { - ZoneNum = ZoneList(ZLItem).Zone(ZonePtrNum); - Zone(ZoneNum).FlagCustomizedZoneCap = true; - Zone(ZoneNum).ZoneVolCapMultpSens = rNumericArgs(1); - Zone(ZoneNum).ZoneVolCapMultpMoist = rNumericArgs(2); - Zone(ZoneNum).ZoneVolCapMultpCO2 = rNumericArgs(3); - Zone(ZoneNum).ZoneVolCapMultpGenContam = rNumericArgs(4); - } - - } else { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" not found."); - ErrorsFound = true; - } - } - } - - // Assign default multiplier values to all the other zones - for (int ZoneNum = 1; ZoneNum <= NumOfZones; ZoneNum++) { - if (!Zone(ZoneNum).FlagCustomizedZoneCap) { - Zone(ZoneNum).ZoneVolCapMultpSens = ZoneVolCapMultpSens; - Zone(ZoneNum).ZoneVolCapMultpMoist = ZoneVolCapMultpMoist; - Zone(ZoneNum).ZoneVolCapMultpCO2 = ZoneVolCapMultpCO2; - Zone(ZoneNum).ZoneVolCapMultpGenContam = ZoneVolCapMultpGenContam; - } - } - - // Calculate the average multiplier value from all zones - { - Real64 ZoneVolCapMultpSens_temp = 0.0; - Real64 ZoneVolCapMultpMoist_temp = 0.0; - Real64 ZoneVolCapMultpCO2_temp = 0.0; - Real64 ZoneVolCapMultpGenContam_temp = 0.0; - - for (int ZoneNum = 1; ZoneNum <= NumOfZones; ZoneNum++) { - ZoneVolCapMultpSens_temp += Zone(ZoneNum).ZoneVolCapMultpSens; - ZoneVolCapMultpMoist_temp += Zone(ZoneNum).ZoneVolCapMultpMoist; - ZoneVolCapMultpCO2_temp += Zone(ZoneNum).ZoneVolCapMultpCO2; - ZoneVolCapMultpGenContam_temp += Zone(ZoneNum).ZoneVolCapMultpGenContam; - } - - if (NumOfZones > 0) { - ZoneVolCapMultpSens = ZoneVolCapMultpSens_temp / NumOfZones; - ZoneVolCapMultpMoist = ZoneVolCapMultpMoist_temp / NumOfZones; - ZoneVolCapMultpCO2 = ZoneVolCapMultpCO2_temp / NumOfZones; - ZoneVolCapMultpGenContam = ZoneVolCapMultpGenContam_temp / NumOfZones; - } - } - } - - print(state.files.eio, Header); - print(state.files.eio, Format_701, ZoneVolCapMultpSens, ZoneVolCapMultpMoist, ZoneVolCapMultpCO2, ZoneVolCapMultpGenContam); - - cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::OTTStat)); - state.dataZoneCtrls->NumOpTempControlledZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneCtrls->NumOpTempControlledZones > 0) { - state.dataZoneCtrls->AnyOpTempControl = true; - - for (int idx = 1; idx <= state.dataZoneCtrls->NumOpTempControlledZones; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - // find matching name of ZONECONTROL:THERMOSTAT object - found = UtilityRoutines::FindItem(cAlphaArgs(1), TStatObjects); - if (found == 0) { - // It might be in the TempControlledZones - found = UtilityRoutines::FindItem(cAlphaArgs(1), TempControlledZone); - if (found == 0) { // throw error - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + - cZControlTypes(static_cast(ZoneControlTypes::TStat)) + " reference not found."); - ErrorsFound = true; - } else { - TempControlledZoneNum = found; - TempControlledZone(TempControlledZoneNum).OperativeTempControl = true; - if (UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled")) { - TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled = true; - } - if ((!(UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled"))) && (!(UtilityRoutines::SameString(cAlphaArgs(2), "Constant")))) { - ShowSevereError( - state, cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\"."); - ErrorsFound = true; - } - - TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction = rNumericArgs(1); - TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched = GetScheduleIndex(state, cAlphaArgs(3)); - if ((TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched == 0) && - (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled)) { // throw error - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + - "\" not found."); - ErrorsFound = true; - } - - // check validity of fixed radiative fraction - if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction < 0.0) && - (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be negative.", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction >= 0.9) && - (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot >= .9.", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - - // check schedule min max. - if (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled) { - ValidRadFractSched = CheckScheduleValueMinMax( - state, TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched, ">=", 0.0, "<", 0.9); - if (!ValidRadFractSched) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(3) + "=[" + - cAlphaArgs(3) + "\"."); - ShowContinueError(state, "..Values outside of range [0.0,0.9)."); - ErrorsFound = true; - } - } - - // added Jan, 2017 - Xuan Luo - // read adaptive comfort model and calculate adaptive thermal comfort setpoint - if (TempControlledZone(TempControlledZoneNum).OperativeTempControl) { - if (NumAlphas >= 4 && !lAlphaFieldBlanks(4)) { - int adaptiveComfortModelTypeIndex = - UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); - if (!adaptiveComfortModelTypeIndex) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + - cAlphaArgs(4) + "\" not found."); - ErrorsFound = true; - } else if (adaptiveComfortModelTypeIndex != static_cast(AdaptiveComfortModel::ADAP_NONE)) { - TempControlledZone(TempControlledZoneNum).AdaptiveComfortTempControl = true; - TempControlledZone(TempControlledZoneNum).AdaptiveComfortModelTypeIndex = - UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); - if (!state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule.initialized) { - Array1D runningAverageASH(state.dataWeatherManager->NumDaysInYear, 0.0); - Array1D runningAverageCEN(state.dataWeatherManager->NumDaysInYear, 0.0); - CalculateMonthlyRunningAverageDryBulb(state, runningAverageASH, runningAverageCEN); - CalculateAdaptiveComfortSetPointSchl(state, runningAverageASH, runningAverageCEN); - } - } - } - } - - // CurrentModuleObject='ZoneControl:Thermostat:OperativeTemperature' - SetupOutputVariable(state, - "Zone Thermostat Operative Temperature", - OutputProcessor::Unit::C, - state.dataHeatBal->ZnAirRpt(TempControlledZone(TempControlledZoneNum).ActualZoneNum).ThermOperativeTemp, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - Zone(TempControlledZone(TempControlledZoneNum).ActualZoneNum).Name); - } - } else { - for (Item = 1; Item <= TStatObjects(found).NumOfZones; ++Item) { - TempControlledZoneNum = TStatObjects(found).TempControlledZoneStartPtr + Item - 1; - if (NumTempControlledZones == 0) continue; - TempControlledZone(TempControlledZoneNum).OperativeTempControl = true; - if (UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled")) { - TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled = true; - } - if (Item == 1) { - if ((!(UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled"))) && - (!(UtilityRoutines::SameString(cAlphaArgs(2), "Constant")))) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\"."); - ErrorsFound = true; - } - } - - TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction = rNumericArgs(1); - TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched = GetScheduleIndex(state, cAlphaArgs(3)); - if (Item == 1) { - if ((TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched == 0) && - (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled)) { // throw error - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + - "\" not found."); - ErrorsFound = true; - } - } - - // check validity of fixed radiative fraction - if (Item == 1) { - if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction < 0.0) && - (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be negative.", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - } - if (Item == 1) { - if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction >= 0.9) && - (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot >= .9.", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - } - - // check schedule min max. - if (Item == 1) { - if (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled) { - ValidRadFractSched = CheckScheduleValueMinMax( - state, TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched, ">=", 0.0, "<", 0.9); - if (!ValidRadFractSched) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(3) + "=[" + - cAlphaArgs(3) + "\"."); - ShowContinueError(state, "..Values outside of range [0.0,0.9)."); - ErrorsFound = true; - } - } - } - - // added Jan, 2017 - Xuan Luo - // read adaptive comfort model and calculate adaptive thermal comfort setpoint - if (TempControlledZone(TempControlledZoneNum).OperativeTempControl) { - if (NumAlphas >= 4 && !lAlphaFieldBlanks(4)) { - int adaptiveComfortModelTypeIndex = - UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); - if (!adaptiveComfortModelTypeIndex) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + - cAlphaArgs(4) + "\" not found."); - ErrorsFound = true; - } else if (adaptiveComfortModelTypeIndex != static_cast(AdaptiveComfortModel::ADAP_NONE)) { - TempControlledZone(TempControlledZoneNum).AdaptiveComfortTempControl = true; - TempControlledZone(TempControlledZoneNum).AdaptiveComfortModelTypeIndex = - UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); - if (!state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule.initialized) { - Array1D runningAverageASH(state.dataWeatherManager->NumDaysInYear, 0.0); - Array1D runningAverageCEN(state.dataWeatherManager->NumDaysInYear, 0.0); - CalculateMonthlyRunningAverageDryBulb(state, runningAverageASH, runningAverageCEN); - CalculateAdaptiveComfortSetPointSchl(state, runningAverageASH, runningAverageCEN); - } - } - } - } - - // CurrentModuleObject='ZoneControl:Thermostat:OperativeTemperature' - SetupOutputVariable(state, - "Zone Thermostat Operative Temperature", - OutputProcessor::Unit::C, - state.dataHeatBal->ZnAirRpt(TempControlledZone(TempControlledZoneNum).ActualZoneNum).ThermOperativeTemp, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - Zone(TempControlledZone(TempControlledZoneNum).ActualZoneNum).Name); - } // TStat Objects Loop - } // found thermostat referene - } // loop over NumOpTempControlledZones - } // NumOpTempControlledZones > 0 - - // Overcool dehumidificaton GetInput starts here - cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::TandHStat)); - state.dataZoneCtrls->NumTempAndHumidityControlledZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneCtrls->NumTempAndHumidityControlledZones > 0) { - state.dataZoneCtrls->AnyZoneTempAndHumidityControl = true; - - for (int idx = 1; idx <= state.dataZoneCtrls->NumTempAndHumidityControlledZones; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - // find matching name of ZONECONTROL:THERMOSTAT object - found = UtilityRoutines::FindItem(cAlphaArgs(1), TStatObjects); - if (found == 0) { - // It might be in the TempControlledZones - found = UtilityRoutines::FindItem(cAlphaArgs(1), TempControlledZone); - if (found == 0) { // throw error - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + - cZControlTypes(static_cast(ZoneControlTypes::TStat)) + " reference not found."); - ErrorsFound = true; - } else { - TempControlledZoneNum = found; - TempControlledZone(TempControlledZoneNum).DehumidifyingSched = cAlphaArgs(2); - TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" not found."); - ErrorsFound = true; - } - TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = true; - if ((UtilityRoutines::SameString(cAlphaArgs(3), "None"))) { - TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = false; - } - if (UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled")) { - TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled = true; - } - if ((!(UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled"))) && (!(UtilityRoutines::SameString(cAlphaArgs(4), "Constant")))) { - ShowSevereError( - state, cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + "\"."); - ErrorsFound = true; - } - - TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange = rNumericArgs(1); - TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex = GetScheduleIndex(state, cAlphaArgs(4)); - if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex == 0) && - (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled)) { // throw error - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + - "\" not found."); - ErrorsFound = true; - } - - // check validity of zone Overcool constant range - if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange < 0.0) && - (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be negative.", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange > 3.0) && - (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be > 3.0", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - - // check zone Overcool range schedule min/max values. - if (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled) { - ValidZoneOvercoolRangeSched = CheckScheduleValueMinMax( - state, TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex, ">=", 0.0, "<=", 3.0); - if (!ValidZoneOvercoolRangeSched) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(5) + "=[" + - cAlphaArgs(5) + "\"."); - ShowContinueError(state, "..Values outside of range [0.0,3.0]."); - ErrorsFound = true; - } - } - // check Overcool Control Ratio limits - TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio = rNumericArgs(2); - if (TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio < 0.0) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be negative.", - cCurrentModuleObject, - cAlphaArgs(2), - cNumericFieldNames(2), - rNumericArgs(2))); - ErrorsFound = true; - } - } - } else { - for (Item = 1; Item <= TStatObjects(found).NumOfZones; ++Item) { - TempControlledZoneNum = TStatObjects(found).TempControlledZoneStartPtr + Item - 1; - TempControlledZone(TempControlledZoneNum).DehumidifyingSched = cAlphaArgs(2); - TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" not found."); - ErrorsFound = true; - } - TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = true; - if ((UtilityRoutines::SameString(cAlphaArgs(3), "None"))) { - TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = false; - } - if (UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled")) { - TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled = false; - } - if (Item == 1) { - if ((!(UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled"))) && - (!(UtilityRoutines::SameString(cAlphaArgs(4), "Constant")))) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + - "\"."); - ErrorsFound = true; - } - } - TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange = rNumericArgs(1); - TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex = GetScheduleIndex(state, cAlphaArgs(6)); - if (Item == 1) { - if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex == 0) && - (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled)) { // throw error - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + - "\" not found."); - ErrorsFound = true; - } - } - // check validity of zone Overcool constant range - if (Item == 1) { - if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange < 0.0) && - (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be negative.", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - } - if (Item == 1) { - if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange > 3.0) && - (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot > 3.0", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - } - // check zone Overcool range schedule min/max values. - if (Item == 1) { - if (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled) { - ValidZoneOvercoolRangeSched = CheckScheduleValueMinMax( - state, TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex, ">=", 0.0, "<=", 3.0); - if (!ValidZoneOvercoolRangeSched) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(5) + "=[" + - cAlphaArgs(5) + "\"."); - ShowContinueError(state, "..Values outside of range [0.0,3.0]."); - ErrorsFound = true; - } - } - } - TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio = rNumericArgs(2); - // check Overcool Control Ratio limits - if (Item == 1) { - if (TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio < 0.0) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be negative.", - cCurrentModuleObject, - cAlphaArgs(2), - cNumericFieldNames(2), - rNumericArgs(2))); - ErrorsFound = true; - } - } - - } // TStat Objects Loop - } // found thermostat reference - } // loop over NumTempAndHumidityControlledZones - } // NumTempAndHumidityControlledZones > 0 - - // Staged thermostat control inputs start - cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::StagedDual)); - NumStageControlledZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - if (NumStageControlledZones > 0) state.dataZoneCtrls->StagedTStatObjects.allocate(NumStageControlledZones); - - // Pre-scan for use of Zone lists in TStat statements (i.e. Global application of TStat) - state.dataZoneTempPredictorCorrector->NumStageCtrZone = 0; - for (Item = 1; Item <= NumStageControlledZones; ++Item) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Item, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - - state.dataZoneCtrls->StagedTStatObjects(Item).Name = cAlphaArgs(1); - Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - ZLItem = 0; - if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); - if (Item1 > 0) { - state.dataZoneCtrls->StagedTStatObjects(Item).StageControlledZoneStartPtr = state.dataZoneTempPredictorCorrector->NumStageCtrZone + 1; - ++state.dataZoneTempPredictorCorrector->NumStageCtrZone; - state.dataZoneCtrls->StagedTStatObjects(Item).NumOfZones = 1; - state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive = false; - state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr = Item1; - } else if (ZLItem > 0) { - state.dataZoneCtrls->StagedTStatObjects(Item).TempControlledZoneStartPtr = state.dataZoneTempPredictorCorrector->NumStageCtrZone + 1; - state.dataZoneTempPredictorCorrector->NumStageCtrZone += ZoneList(ZLItem).NumOfZones; - state.dataZoneCtrls->StagedTStatObjects(Item).NumOfZones = ZoneList(ZLItem).NumOfZones; - state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive = true; - state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr = ZLItem; - } else { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - } - - if (ErrorsFound) { - ShowSevereError(state, "GetStagedDualSetpoint: Errors with invalid names in " + cCurrentModuleObject + " objects."); - ShowContinueError(state, "...These will not be read in. Other errors may occur."); - state.dataZoneTempPredictorCorrector->NumStageCtrZone = 0; - } - - if (state.dataZoneTempPredictorCorrector->NumStageCtrZone > 0) { - StageControlledZone.allocate(state.dataZoneTempPredictorCorrector->NumStageCtrZone); - state.dataZoneCtrls->StageZoneLogic.dimension(NumOfZones, false); - - StageControlledZoneNum = 0; - for (Item = 1; Item <= NumStageControlledZones; ++Item) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Item, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - for (Item1 = 1; Item1 <= state.dataZoneCtrls->StagedTStatObjects(Item).NumOfZones; ++Item1) { - ++StageControlledZoneNum; - if (state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive) { - cAlphaArgs(2) = - state.dataHeatBal->Zone(ZoneList(state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name; - } - int ZoneAssigned = UtilityRoutines::FindItemInList( - cAlphaArgs(2), StageControlledZone, &DataZoneControls::ZoneStagedControls::ZoneName, StageControlledZoneNum - 1); - if (ZoneAssigned == 0) { - StageControlledZone(StageControlledZoneNum).ZoneName = cAlphaArgs(2); - StageControlledZone(StageControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - if (StageControlledZone(StageControlledZoneNum).ActualZoneNum == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" not found."); - ErrorsFound = true; - } else { - // Zone(StageControlledZone(StageControlledZoneNum)%ActualZoneNum)%StageControlledZoneIndex = - // StageControlledZoneNum - } - state.dataZoneCtrls->StageZoneLogic(StageControlledZone(StageControlledZoneNum).ActualZoneNum) = true; - } else { - StageControlledZone(StageControlledZoneNum).ZoneName = cAlphaArgs(2); // for continuity - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" zone previously assigned."); - ShowContinueError(state, "...Zone was previously assigned to Thermostat=\"" + StageControlledZone(ZoneAssigned).Name + "\"."); - ErrorsFound = true; - continue; - } - - if (!state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive) { - StageControlledZone(StageControlledZoneNum).Name = cAlphaArgs(1); - } else { - CheckCreatedZoneItemName( - state, - RoutineName, - cCurrentModuleObject, - state.dataHeatBal->Zone(ZoneList(state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name, - ZoneList(state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr).MaxZoneNameLength, - state.dataZoneCtrls->StagedTStatObjects(Item).Name, - StageControlledZone, - StageControlledZoneNum - 1, - StageControlledZone(StageControlledZoneNum).Name, - errFlag); - if (errFlag) ErrorsFound = true; - } - - StageControlledZone(StageControlledZoneNum).NumOfHeatStages = rNumericArgs(1); - if (rNumericArgs(1) < 1 || rNumericArgs(1) > 4) { - ShowSevereError( - state, - format("{}=\"{}\" invalid range {}=\"{:.0R}\"", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(1), rNumericArgs(1))); - ShowContinueError(state, "..contains values outside of range [1,4]."); - ErrorsFound = true; - } - - StageControlledZone(StageControlledZoneNum).HeatSetBaseSchedName = cAlphaArgs(3); - StageControlledZone(StageControlledZoneNum).HSBchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); - if (Item1 == 1) { // only show error on first of several if zone list - if (StageControlledZone(StageControlledZoneNum).HSBchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + - "\" not found."); - ErrorsFound = true; - } - } - - StageControlledZone(StageControlledZoneNum).HeatThroRange = rNumericArgs(2); - if (rNumericArgs(1) < 0.0) { - ShowSevereError(state, - format("{}=\"{}\" negative value is found at {}=\"{:.1R}\"", - cAlphaArgs(1), - cCurrentModuleObject, - cNumericFieldNames(2), - rNumericArgs(2))); - ShowContinueError(state, ".. The minimum value is 0."); - ErrorsFound = true; - } - - if (StageControlledZone(StageControlledZoneNum).NumOfHeatStages > 0) { - StageControlledZone(StageControlledZoneNum).HeatTOffset.allocate(StageControlledZone(StageControlledZoneNum).NumOfHeatStages); - for (i = 1; i <= StageControlledZone(StageControlledZoneNum).NumOfHeatStages; ++i) { - StageControlledZone(StageControlledZoneNum).HeatTOffset(i) = rNumericArgs(2 + i); - if (rNumericArgs(2 + i) > 0.0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" positive value is found at " + - format("{}=\"{:.1R}\"", cNumericFieldNames(2 + i), rNumericArgs(2 + i))); - ShowContinueError(state, ".. The maximum value is 0."); - ErrorsFound = true; - } - if (lNumericFieldBlanks(2 + i)) { - ShowSevereError(state, - cCurrentModuleObject + " object =" + cAlphaArgs(1) + ". The input of " + cNumericFieldNames(2 + i) + - " is required, but a blank is found."); - ErrorsFound = true; - } - if (i > 1) { - if (rNumericArgs(2 + i) >= rNumericArgs(1 + i)) { - ShowSevereError(state, - format(R"({}="{}" The value at {}="{:.1R}" has to be less than )", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(2 + i), - rNumericArgs(2 + i))); - ShowContinueError(state, format("{}=\"{:.1R}", cNumericFieldNames(1 + i), rNumericArgs(1 + i))); - ErrorsFound = true; - } - } - } - } - - StageControlledZone(StageControlledZoneNum).NumOfCoolStages = rNumericArgs(7); - if (rNumericArgs(7) < 1 || rNumericArgs(7) > 4) { - ShowSevereError( - state, - format("{}=\"{}\" invalid range {}=\"{:.0R}\"", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(7), rNumericArgs(7))); - ShowContinueError(state, "..contains values outside of range [1,4]."); - ErrorsFound = true; - } - - StageControlledZone(StageControlledZoneNum).CoolSetBaseSchedName = cAlphaArgs(4); - StageControlledZone(StageControlledZoneNum).CSBchedIndex = GetScheduleIndex(state, cAlphaArgs(4)); - if (Item1 == 1) { // only show error on first of several if zone list - if (StageControlledZone(StageControlledZoneNum).CSBchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + - "\" not found."); - ErrorsFound = true; - } - } - - StageControlledZone(StageControlledZoneNum).CoolThroRange = rNumericArgs(8); - if (rNumericArgs(8) < 0.0) { - ShowSevereError(state, - format("{}=\"{}\" negative value is found at {}=\"{:.1R}\"", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(8), - rNumericArgs(8))); - ShowContinueError(state, ".. The minumum value is 0."); - ErrorsFound = true; - } - - if (StageControlledZone(StageControlledZoneNum).NumOfCoolStages > 0) { - StageControlledZone(StageControlledZoneNum).CoolTOffset.allocate(StageControlledZone(StageControlledZoneNum).NumOfCoolStages); - for (i = 1; i <= StageControlledZone(StageControlledZoneNum).NumOfCoolStages; ++i) { - StageControlledZone(StageControlledZoneNum).CoolTOffset(i) = rNumericArgs(8 + i); - if (rNumericArgs(8 + i) < 0.0) { - ShowSevereError(state, - format("{}=\"{}\" negative value is found at {}=\"{:.1R}\"", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(8 + i), - rNumericArgs(8 + i))); - ShowContinueError(state, ".. The minimum value is 0."); - ErrorsFound = true; - } - if (lNumericFieldBlanks(8 + i)) { - ShowSevereError(state, - cCurrentModuleObject + " object =" + cAlphaArgs(1) + ". The input of " + cNumericFieldNames(8 + i) + - " is required, but a blank is found."); - ErrorsFound = true; - } - if (i > 1) { - if (rNumericArgs(8 + i) <= rNumericArgs(7 + i)) { - ShowSevereError(state, - format("{}=\"{}\" The value at {}=\"{:.1R}\" has to be greater than ", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(8 + i), - rNumericArgs(8 + i))); - ShowContinueError(state, format("{}=\"{:.1R}", cNumericFieldNames(7 + i), rNumericArgs(7 + i))); - ErrorsFound = true; - } - } - } - } - } - } // loop over NumStageControlledZones - if ((inputProcessor->getNumObjectsFound(state, "AirLoopHVAC:UnitaryHeatPump:AirToAir:MultiSpeed") == 0) && - (inputProcessor->getNumObjectsFound(state, "AirLoopHVAC:UnitarySystem") == 0) && - (inputProcessor->getNumObjectsFound(state, "SetpointManager:SingleZone:OneStageCooling") == 0) && - (inputProcessor->getNumObjectsFound(state, "SetpointManager:SingleZone:OneStageHeating") == 0)) { - ShowWarningError(state, cCurrentModuleObject + " is applicable to only selected HVAC objects which are missing from input."); - ShowContinueError(state, "Model should include one or more of the following objects: "); - ShowContinueError(state, "AirLoopHVAC:UnitaryHeatPump:AirToAir:MultiSpeed, AirLoopHVAC:UnitarySystem, "); - ShowContinueError( - state, "SetpointManager:SingleZone:OneStageCooling, and/or SetpointManager:SingleZone:OneStageHeating. The simulation continues..."); - } - } // NumStageControlledZones > 0 - - if (ErrorsFound) { - ShowFatalError(state, "Errors getting Zone Control input data. Preceding condition(s) cause termination."); - } -} - -void CalculateMonthlyRunningAverageDryBulb(EnergyPlusData &state, Array1D &runningAverageASH, Array1D &runningAverageCEN) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Xuan Luo - // DATE WRITTEN January 2017 - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine calculate the monthly running average dry bulb temperature; - - // Using/Aliasing - - using OutputReportTabular::GetColumnUsingTabs; - using OutputReportTabular::StrToReal; - - // SUBROUTINE PARAMETER DEFINITIONS: - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - - std::string lineIn; - std::string lineAvg; - std::string epwLine; - - Real64 dryBulb; - Real64 avgDryBulb; - - int readStat; - int calcEndDay; - int calcStartDayASH; - int calcStartDayCEN; - - std::string::size_type pos; - int ind, i, j; - - Array1D adaptiveTemp(state.dataWeatherManager->NumDaysInYear, 0.0); - Array1D dailyDryTemp(state.dataWeatherManager->NumDaysInYear, 0.0); - - readStat = 0; - if (FileSystem::fileExists(state.files.inputWeatherFilePath.filePath)) { - // Read hourly dry bulb temperature first - auto epwFile = state.files.inputWeatherFilePath.open(state, "CalcThermalComfortAdaptive"); - for (i = 1; i <= 9; ++i) { // Headers - epwFile.readLine(); - } - for (i = 1; i <= state.dataWeatherManager->NumDaysInYear; ++i) { - avgDryBulb = 0.0; - for (j = 1; j <= 24; ++j) { - epwLine = epwFile.readLine().data; - for (ind = 1; ind <= 6; ++ind) { - pos = index(epwLine, ','); - epwLine.erase(0, pos + 1); - } - pos = index(epwLine, ','); - dryBulb = StrToReal(epwLine.substr(0, pos)); - avgDryBulb += (dryBulb / 24.0); - } - dailyDryTemp(i) = avgDryBulb; - } - epwFile.close(); - - // Calculate monthly running average dry bulb temperature. - int dayOfYear = 0; - while (dayOfYear < state.dataWeatherManager->NumDaysInYear) { - dayOfYear++; - calcEndDay = dayOfYear - 1; - calcStartDayASH = calcEndDay - 30; - calcStartDayCEN = calcEndDay - 7; - - if (calcStartDayASH > 0) { - for (i = calcStartDayASH; i <= calcStartDayASH + 30; i++) { - avgDryBulb = dailyDryTemp(i); - runningAverageASH(dayOfYear) = runningAverageASH(dayOfYear) + avgDryBulb; - } - runningAverageASH(dayOfYear) /= 30; - } else { // Do special things for wrapping the epw - calcStartDayASH += state.dataWeatherManager->NumDaysInYear; - for (i = 1; i <= calcEndDay; i++) { - avgDryBulb = dailyDryTemp(i); - runningAverageASH(dayOfYear) = runningAverageASH(dayOfYear) + avgDryBulb; - } - for (i = calcStartDayASH; i < state.dataWeatherManager->NumDaysInYear; i++) { - avgDryBulb = dailyDryTemp(i); - runningAverageASH(dayOfYear) = runningAverageASH(dayOfYear) + avgDryBulb; - } - runningAverageASH(dayOfYear) /= 30; - } - - if (calcStartDayCEN > 0) { - for (i = calcStartDayCEN; i <= calcStartDayCEN + 7; i++) { - avgDryBulb = dailyDryTemp(i); - runningAverageCEN(dayOfYear) = runningAverageCEN(dayOfYear) + avgDryBulb; - } - runningAverageCEN(dayOfYear) /= 7; - } else { // Do special things for wrapping the epw - calcStartDayCEN += state.dataWeatherManager->NumDaysInYear; - for (i = 1; i <= calcEndDay; i++) { - avgDryBulb = dailyDryTemp(i); - runningAverageCEN(dayOfYear) = runningAverageCEN(dayOfYear) + avgDryBulb; - } - for (i = calcStartDayCEN; i < state.dataWeatherManager->NumDaysInYear; i++) { - avgDryBulb = dailyDryTemp(i); - runningAverageCEN(dayOfYear) = runningAverageCEN(dayOfYear) + avgDryBulb; - } - runningAverageCEN(dayOfYear) /= 7; - } - } - } else { - ShowFatalError(state, - "CalcThermalComfortAdaptive: Could not open file " + state.files.inputWeatherFilePath.filePath.string() + - " for input (read). (File does not exist)"); - } -} - -void CalculateAdaptiveComfortSetPointSchl(EnergyPlusData &state, Array1D const &runningAverageASH, Array1D const &runningAverageCEN) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Xuan Luo - // DATE WRITTEN January 2017 - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine calculates the zone operative temperature setpoint using adaptive comfort model. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int constexpr summerDesignDayTypeIndex(9); - Real64 GrossApproxAvgDryBulbDesignDay(0.0); - - auto &AdapComfortDailySetPointSchedule = state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule; - auto &AdapComfortSetPointSummerDesDay = state.dataZoneTempPredictorCorrector->AdapComfortSetPointSummerDesDay; - - for (size_t i = 1; i <= state.dataWeatherManager->DesDayInput.size(); i++) { - // Summer design day - if (state.dataWeatherManager->DesDayInput(i).DayType == summerDesignDayTypeIndex) { - GrossApproxAvgDryBulbDesignDay = - (state.dataWeatherManager->DesDayInput(i).MaxDryBulb + - (state.dataWeatherManager->DesDayInput(i).MaxDryBulb - state.dataWeatherManager->DesDayInput(i).DailyDBRange)) / - 2.0; - if (GrossApproxAvgDryBulbDesignDay > 10 && GrossApproxAvgDryBulbDesignDay < 33.5) { - AdapComfortSetPointSummerDesDay[0] = 0.31 * GrossApproxAvgDryBulbDesignDay + 17.8; - AdapComfortSetPointSummerDesDay[1] = 0.31 * GrossApproxAvgDryBulbDesignDay + 20.3; - AdapComfortSetPointSummerDesDay[2] = 0.31 * GrossApproxAvgDryBulbDesignDay + 21.3; - } - if (GrossApproxAvgDryBulbDesignDay > 10 && GrossApproxAvgDryBulbDesignDay < 30) { - AdapComfortSetPointSummerDesDay[3] = 0.33 * GrossApproxAvgDryBulbDesignDay + 18.8; - AdapComfortSetPointSummerDesDay[4] = 0.33 * GrossApproxAvgDryBulbDesignDay + 20.8; - ; - AdapComfortSetPointSummerDesDay[5] = 0.33 * GrossApproxAvgDryBulbDesignDay + 21.8; - ; - AdapComfortSetPointSummerDesDay[6] = 0.33 * GrossApproxAvgDryBulbDesignDay + 22.8; - ; - } - } - } - - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central.allocate(state.dataWeatherManager->NumDaysInYear); - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90.allocate(state.dataWeatherManager->NumDaysInYear); - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80.allocate(state.dataWeatherManager->NumDaysInYear); - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central.allocate(state.dataWeatherManager->NumDaysInYear); - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I.allocate(state.dataWeatherManager->NumDaysInYear); - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II.allocate(state.dataWeatherManager->NumDaysInYear); - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III.allocate(state.dataWeatherManager->NumDaysInYear); - - // Calculate the set points based on different models, set flag as -1 when running average temperature is not in the range. - for (int day = 1; day <= state.dataWeatherManager->NumDaysInYear; day++) { - if (runningAverageASH(day) > 10 && runningAverageASH(day) < 33.5) { - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central(day) = 0.31 * runningAverageASH(day) + 17.8; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90(day) = 0.31 * runningAverageASH(day) + 20.3; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80(day) = 0.31 * runningAverageASH(day) + 21.3; - } else { - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central(day) = -1; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90(day) = -1; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80(day) = -1; - } - if (runningAverageCEN(day) > 10 && runningAverageCEN(day) < 30) { - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central(day) = 0.33 * runningAverageCEN(day) + 18.8; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I(day) = 0.33 * runningAverageCEN(day) + 20.8; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II(day) = 0.33 * runningAverageCEN(day) + 21.8; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III(day) = 0.33 * runningAverageCEN(day) + 22.8; - } else { - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central(day) = -1; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I(day) = -1; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II(day) = -1; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III(day) = -1; - } - } - AdapComfortDailySetPointSchedule.initialized = true; -} - -void InitZoneAirSetPoints(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Russell Taylor - // DATE WRITTEN September 1998 - // MODIFIED November 2004, M. J. Witte additional report variables - // MODIFIED L.Gu, May 2006 - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine initializes the data for the zone air setpoints. - - // METHODOLOGY EMPLOYED: - // Uses the status flags to trigger events. - - // SUBROUTINE PARAMETER DEFINITIONS: - static constexpr std::string_view RoutineName("InitZoneAirSetpoints: "); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - bool FirstSurfFlag; - int TRefFlag; // Flag for Reference Temperature process in Zones - - auto &ZoneList = state.dataHeatBal->ZoneList; - auto &TempControlledZone = state.dataZoneCtrls->TempControlledZone; - auto &TempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint; - auto &TempControlType = state.dataHeatBalFanSys->TempControlType; - auto &TempControlTypeRpt = state.dataHeatBalFanSys->TempControlTypeRpt; - auto &ComfortControlledZone = state.dataZoneCtrls->ComfortControlledZone; - auto &ZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo; - auto &ZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi; - auto &NumOfZones = state.dataGlobal->NumOfZones; - - if (state.dataZoneTempPredictorCorrector->InitZoneAirSetPointsOneTimeFlag) { - TempZoneThermostatSetPoint.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->AdapComfortCoolingSetPoint.dimension(NumOfZones, 0.0); - ZoneThermostatSetPointHi.dimension(NumOfZones, 0.0); - ZoneThermostatSetPointLo.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->ZoneThermostatSetPointHiAver.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->ZoneThermostatSetPointLoAver.dimension(NumOfZones, 0.0); - - state.dataHeatBalFanSys->LoadCorrectionFactor.dimension(NumOfZones, 0.0); - TempControlType.dimension(NumOfZones, DataHVACGlobals::ThermostatType::Uncontrolled); - TempControlTypeRpt.dimension(NumOfZones, 0); - if (state.dataZoneCtrls->NumComfortControlledZones > 0) { - state.dataHeatBalFanSys->ComfortControlType.dimension(NumOfZones, DataHVACGlobals::ThermostatType::Uncontrolled); - state.dataHeatBalFanSys->ComfortControlTypeRpt.dimension(NumOfZones, 0); - state.dataHeatBalFanSys->ZoneComfortControlsFanger.allocate(NumOfZones); - } - state.dataZoneEnergyDemand->Setback.dimension(NumOfZones, false); - state.dataZoneEnergyDemand->DeadBandOrSetback.dimension(NumOfZones, false); - state.dataZoneEnergyDemand->CurDeadBandOrSetback.dimension(NumOfZones, false); - - state.dataHeatBal->ZoneListSNLoadHeatEnergy.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); - state.dataHeatBal->ZoneListSNLoadCoolEnergy.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); - state.dataHeatBal->ZoneListSNLoadHeatRate.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); - state.dataHeatBal->ZoneListSNLoadCoolRate.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); - - state.dataHeatBal->ZoneGroupSNLoadHeatEnergy.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); - state.dataHeatBal->ZoneGroupSNLoadCoolEnergy.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); - state.dataHeatBal->ZoneGroupSNLoadHeatRate.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); - state.dataHeatBal->ZoneGroupSNLoadCoolRate.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); - - // Hybrid modeling - state.dataHeatBalFanSys->PreviousMeasuredZT1.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->PreviousMeasuredZT2.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->PreviousMeasuredZT3.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->PreviousMeasuredHumRat1.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->PreviousMeasuredHumRat2.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->PreviousMeasuredHumRat3.dimension(NumOfZones, 0.0); - - // Allocate Derived Types - state.dataZoneEnergyDemand->ZoneSysEnergyDemand.allocate(NumOfZones); - state.dataZoneEnergyDemand->ZoneSysMoistureDemand.allocate(NumOfZones); - state.dataHeatBal->doSpaceHeatBalanceSimulation = true; - state.dataHeatBal->doSpaceHeatBalanceSizing = true; - if (state.dataHeatBal->doSpaceHeatBalanceSimulation || state.dataHeatBal->doSpaceHeatBalanceSizing) { - state.dataZoneEnergyDemand->spaceSysEnergyDemand.allocate(state.dataGlobal->numSpaces); - state.dataZoneEnergyDemand->spaceSysMoistureDemand.allocate(state.dataGlobal->numSpaces); - } - - for (int zoneNum = 1; zoneNum <= NumOfZones; ++zoneNum) { - FirstSurfFlag = true; - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - auto &thisSpace = state.dataHeatBal->space(spaceNum); - for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { - if (FirstSurfFlag) { - TRefFlag = state.dataSurface->SurfTAirRef(SurfNum); - FirstSurfFlag = false; - } - // for each particular zone, the reference air temperature(s) should be the same - // (either mean air, bulk air, or supply air temp). - if (state.dataSurface->SurfTAirRef(SurfNum) != TRefFlag) { - ShowWarningError(state, - "Different reference air temperatures for difference surfaces encountered in zone " + - state.dataHeatBal->Zone(zoneNum).Name); - } - } - } - } - - // CurrentModuleObject='Zone' - for (int zoneNum = 1; zoneNum <= NumOfZones; ++zoneNum) { - auto &thisZone = state.dataHeatBal->Zone(zoneNum); - state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).setUpOutputVars(state, DataStringGlobals::zonePrefix, thisZone.Name); - if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).setUpOutputVars( - state, DataStringGlobals::spacePrefix, state.dataHeatBal->space(spaceNum).Name); - } - } - bool staged = false; - if (allocated(state.dataZoneCtrls->StageZoneLogic)) { - staged = state.dataZoneCtrls->StageZoneLogic(zoneNum); - } - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).setUpOutputVars( - state, DataStringGlobals::zonePrefix, thisZone.Name, thisZone.Multiplier, thisZone.ListMultiplier, staged); - if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).setUpOutputVars(state, - DataStringGlobals::spacePrefix, - state.dataHeatBal->space(spaceNum).Name, - thisZone.Multiplier, - thisZone.ListMultiplier, - staged); - } - } - state.dataZoneEnergyDemand->ZoneSysMoistureDemand(zoneNum).setUpOutputVars( - state, DataStringGlobals::zonePrefix, thisZone.Name, thisZone.Multiplier, thisZone.ListMultiplier, staged); - if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneEnergyDemand->spaceSysMoistureDemand(spaceNum).setUpOutputVars(state, - DataStringGlobals::spacePrefix, - state.dataHeatBal->space(spaceNum).Name, - thisZone.Multiplier, - thisZone.ListMultiplier, - staged); - } - } - SetupOutputVariable(state, - "Zone Thermostat Air Temperature", - OutputProcessor::Unit::C, - state.dataHeatBalFanSys->TempTstatAir(zoneNum), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Thermostat Control Type", - OutputProcessor::Unit::None, - TempControlTypeRpt(zoneNum), - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Thermostat Heating Setpoint Temperature", - OutputProcessor::Unit::C, - ZoneThermostatSetPointLo(zoneNum), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Thermostat Cooling Setpoint Temperature", - OutputProcessor::Unit::C, - ZoneThermostatSetPointHi(zoneNum), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Adaptive Comfort Operative Temperature Set Point", - OutputProcessor::Unit::C, - state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(zoneNum), - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Predicted Sensible Load Room Air Correction Factor", - OutputProcessor::Unit::None, - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - } // zoneNum - - // Thermal comfort control output - if (state.dataZoneCtrls->NumComfortControlledZones > 0) { - // CurrentModuleObject='ZoneControl:Thermostat:ThermalComfort' - for (int Loop = 1; Loop <= state.dataZoneCtrls->NumComfortControlledZones; ++Loop) { - int zoneNum = ComfortControlledZone(Loop).ActualZoneNum; - auto &thisZone = state.dataHeatBal->Zone(zoneNum); - SetupOutputVariable(state, - "Zone Thermal Comfort Control Type", - OutputProcessor::Unit::None, - state.dataHeatBalFanSys->ComfortControlTypeRpt(zoneNum), - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Thermal Comfort Control Fanger Low Setpoint PMV", - OutputProcessor::Unit::None, - state.dataHeatBalFanSys->ZoneComfortControlsFanger(zoneNum).LowPMV, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Thermal Comfort Control Fanger High Setpoint PMV", - OutputProcessor::Unit::None, - state.dataHeatBalFanSys->ZoneComfortControlsFanger(zoneNum).HighPMV, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - } - } - - // CurrentModuleObject='ZoneList' - for (int Loop = 1; Loop <= state.dataHeatBal->NumOfZoneLists; ++Loop) { - SetupOutputVariable(state, - "Zone List Sensible Heating Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZoneListSNLoadHeatEnergy(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - ZoneList(Loop).Name); - SetupOutputVariable(state, - "Zone List Sensible Cooling Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZoneListSNLoadCoolEnergy(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - ZoneList(Loop).Name); - SetupOutputVariable(state, - "Zone List Sensible Heating Rate", - OutputProcessor::Unit::W, - state.dataHeatBal->ZoneListSNLoadHeatRate(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - ZoneList(Loop).Name); - SetupOutputVariable(state, - "Zone List Sensible Cooling Rate", - OutputProcessor::Unit::W, - state.dataHeatBal->ZoneListSNLoadCoolRate(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - ZoneList(Loop).Name); - } // Loop - - // CurrentModuleObject='ZoneGroup' - for (int Loop = 1; Loop <= state.dataHeatBal->NumOfZoneGroups; ++Loop) { - SetupOutputVariable(state, - "Zone Group Sensible Heating Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZoneGroupSNLoadHeatEnergy(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->ZoneGroup(Loop).Name); - SetupOutputVariable(state, - "Zone Group Sensible Cooling Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZoneGroupSNLoadCoolEnergy(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->ZoneGroup(Loop).Name); - SetupOutputVariable(state, - "Zone Group Sensible Heating Rate", - OutputProcessor::Unit::W, - state.dataHeatBal->ZoneGroupSNLoadHeatRate(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->ZoneGroup(Loop).Name); - SetupOutputVariable(state, - "Zone Group Sensible Cooling Rate", - OutputProcessor::Unit::W, - state.dataHeatBal->ZoneGroupSNLoadCoolRate(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->ZoneGroup(Loop).Name); - } // Loop - - state.dataZoneTempPredictorCorrector->InitZoneAirSetPointsOneTimeFlag = false; - } - - // Do the Begin Environment initializations - if (state.dataZoneTempPredictorCorrector->MyEnvrnFlag && state.dataGlobal->BeginEnvrnFlag) { - for (auto &thisZoneHB : state.dataZoneTempPredictorCorrector->zoneHeatBalance) { - thisZoneHB.beginEnvironmentInit(state); - } - if (state.dataHeatBal->doSpaceHeatBalance) { - for (auto &thisSpaceHB : state.dataZoneTempPredictorCorrector->spaceHeatBalance) { - thisSpaceHB.beginEnvironmentInit(state); - } - } - TempZoneThermostatSetPoint = 0.0; - state.dataHeatBalFanSys->AdapComfortCoolingSetPoint = 0.0; - ZoneThermostatSetPointHi = 0.0; - ZoneThermostatSetPointLo = 0.0; - - state.dataHeatBalFanSys->LoadCorrectionFactor = 1.0; - TempControlType = DataHVACGlobals::ThermostatType::Uncontrolled; - for (auto &e : state.dataZoneEnergyDemand->ZoneSysEnergyDemand) { - e.beginEnvironmentInit(); - } - for (auto &e : state.dataZoneEnergyDemand->ZoneSysMoistureDemand) { - e.beginEnvironmentInit(); - } - if (state.dataHeatBal->doSpaceHeatBalance) { - for (auto &e : state.dataZoneEnergyDemand->spaceSysEnergyDemand) { - e.beginEnvironmentInit(); - } - for (auto &e : state.dataZoneEnergyDemand->spaceSysMoistureDemand) { - e.beginEnvironmentInit(); - } - } - - state.dataZoneEnergyDemand->DeadBandOrSetback = false; - - for (auto &e : state.dataHeatBal->Zone) - e.NoHeatToReturnAir = false; - state.dataHeatBalFanSys->PreviousMeasuredZT1 = 0.0; // Hybrid modeling - state.dataHeatBalFanSys->PreviousMeasuredZT2 = 0.0; // Hybrid modeling - state.dataHeatBalFanSys->PreviousMeasuredZT3 = 0.0; // Hybrid modeling - state.dataHeatBalFanSys->PreviousMeasuredHumRat1 = 0.0; // Hybrid modeling - state.dataHeatBalFanSys->PreviousMeasuredHumRat2 = 0.0; // Hybrid modeling - state.dataHeatBalFanSys->PreviousMeasuredHumRat3 = 0.0; // Hybrid modeling - - state.dataZoneTempPredictorCorrector->MyEnvrnFlag = false; - } - - if (!state.dataGlobal->BeginEnvrnFlag) { - state.dataZoneTempPredictorCorrector->MyEnvrnFlag = true; - } - - // Do the Begin Day initializations - if (state.dataZoneTempPredictorCorrector->MyDayFlag && state.dataGlobal->BeginDayFlag) { - state.dataZoneTempPredictorCorrector->MyDayFlag = false; - } - - if (!state.dataGlobal->BeginDayFlag) { - state.dataZoneTempPredictorCorrector->MyDayFlag = true; - } - - for (int Loop = 1; Loop <= state.dataZoneCtrls->NumTempControlledZones; ++Loop) { - if (state.dataZoneEquip->ZoneEquipInputsFilled && !state.dataZoneTempPredictorCorrector->ControlledZonesChecked) { - if (!VerifyControlledZoneForThermostat(state, TempControlledZone(Loop).ZoneName)) { - ShowSevereError(state, - format("{}Zone=\"{}\" has specified a Thermostatic control but is not a controlled zone.", - RoutineName, - TempControlledZone(Loop).ZoneName)); - ShowContinueError(state, "...must have a ZoneHVAC:EquipmentConnections specification for this zone."); - state.dataZoneTempPredictorCorrector->ErrorsFound = true; - } - } - - if (TempControlledZone(Loop).ManageDemand) { - int ZoneNum = TempControlledZone(Loop).ActualZoneNum; - - switch (TempControlType(ZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - if (TempZoneThermostatSetPoint(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) { - TempZoneThermostatSetPoint(ZoneNum) = TempControlledZone(Loop).HeatingResetLimit; - ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - } - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - if (TempZoneThermostatSetPoint(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit) { - TempZoneThermostatSetPoint(ZoneNum) = TempControlledZone(Loop).CoolingResetLimit; - ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - } - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - if ((TempZoneThermostatSetPoint(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) || - (TempZoneThermostatSetPoint(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit)) { - - TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; - TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); - ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - - if (ZoneThermostatSetPointLo(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) - ZoneThermostatSetPointLo(ZoneNum) = TempControlledZone(Loop).HeatingResetLimit; - if (ZoneThermostatSetPointHi(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit) - ZoneThermostatSetPointHi(ZoneNum) = TempControlledZone(Loop).CoolingResetLimit; - } - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - if (ZoneThermostatSetPointLo(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) - ZoneThermostatSetPointLo(ZoneNum) = TempControlledZone(Loop).HeatingResetLimit; - if (ZoneThermostatSetPointHi(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit) - ZoneThermostatSetPointHi(ZoneNum) = TempControlledZone(Loop).CoolingResetLimit; - break; - default: - break; - } - } - } - - for (int Loop = 1; Loop <= state.dataZoneCtrls->NumComfortControlledZones; ++Loop) { - if (state.dataZoneEquip->ZoneEquipInputsFilled && !state.dataZoneTempPredictorCorrector->ControlledZonesChecked) { - if (!VerifyControlledZoneForThermostat(state, ComfortControlledZone(Loop).ZoneName)) { - ShowSevereError(state, - format("{}Zone=\"{}\" has specified a Comfort control but is not a controlled zone.", - RoutineName, - ComfortControlledZone(Loop).ZoneName)); - ShowContinueError(state, "...must have a ZoneHVAC:EquipmentConnections specification for this zone."); - state.dataZoneTempPredictorCorrector->ErrorsFound = true; - } - } - if (ComfortControlledZone(Loop).ManageDemand) { - int ZoneNum = ComfortControlledZone(Loop).ActualZoneNum; - - switch (state.dataHeatBalFanSys->ComfortControlType(ZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - if (TempZoneThermostatSetPoint(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) { - TempZoneThermostatSetPoint(ZoneNum) = ComfortControlledZone(Loop).HeatingResetLimit; - ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::SingleHeating; - TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); - } - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - if (TempZoneThermostatSetPoint(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit) { - TempZoneThermostatSetPoint(ZoneNum) = ComfortControlledZone(Loop).CoolingResetLimit; - ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::SingleCooling; - TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); - } - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - if ((TempZoneThermostatSetPoint(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) || - (TempZoneThermostatSetPoint(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit)) { - - TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; - TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); - ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - - if (ZoneThermostatSetPointLo(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) - ZoneThermostatSetPointLo(ZoneNum) = ComfortControlledZone(Loop).HeatingResetLimit; - if (ZoneThermostatSetPointHi(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit) - ZoneThermostatSetPointHi(ZoneNum) = ComfortControlledZone(Loop).CoolingResetLimit; - } - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; - TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); - if (ZoneThermostatSetPointLo(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) - ZoneThermostatSetPointLo(ZoneNum) = ComfortControlledZone(Loop).HeatingResetLimit; - if (ZoneThermostatSetPointHi(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit) - ZoneThermostatSetPointHi(ZoneNum) = ComfortControlledZone(Loop).CoolingResetLimit; - break; - default: - break; - } - } // Demand manager - } - - if (state.dataZoneTempPredictorCorrector->ErrorsFound) { - ShowFatalError(state, "InitZoneAirSetpoints - program terminates due to previous condition."); - } - - if (state.dataZoneEquip->ZoneEquipInputsFilled) { - state.dataZoneTempPredictorCorrector->ControlledZonesChecked = true; - } -} - -void ZoneSpaceHeatBalanceData::beginEnvironmentInit(EnergyPlusData &state) -{ - for (int i = 0; i <= 3; ++i) { - this->ZTM[i] = 0.0; - this->WPrevZoneTS[i] = state.dataEnvrn->OutHumRat; - this->DSWPrevZoneTS[i] = state.dataEnvrn->OutHumRat; - this->WPrevZoneTSTemp[i] = 0.0; - } - this->WZoneTimeMinusP = state.dataEnvrn->OutHumRat; - this->ZoneW1 = state.dataEnvrn->OutHumRat; - this->ZoneWMX = state.dataEnvrn->OutHumRat; - this->ZoneWM2 = state.dataEnvrn->OutHumRat; - this->ZoneAirHumRatTemp = 0.0; - this->TempIndZnLd = 0.0; - this->TempDepZnLd = 0.0; - this->ZoneAirRelHum = 0.0; - this->AirPowerCap = 0.0; - this->ZoneT1 = 0.0; -} - -void ZoneSpaceHeatBalanceData::setUpOutputVars(EnergyPlusData &state, std::string_view prefix, std::string_view name) -{ - SetupOutputVariable(state, - format("{} Air Temperature", prefix), - OutputProcessor::Unit::C, - this->ZT, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - name); - SetupOutputVariable(state, - format("{} Air Humidity Ratio", prefix), - OutputProcessor::Unit::None, - this->ZoneAirHumRat, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - name); - SetupOutputVariable(state, - format("{} Air Relative Humidity", prefix), - OutputProcessor::Unit::Perc, - this->ZoneAirRelHum, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - name); -} - -void PredictSystemLoads(EnergyPlusData &state, - bool const ShortenTimeStepSys, - bool const UseZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step - Real64 const PriorTimeStep // the old value for timestep length is passed for possible use in interpolating -) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Russ Taylor - // DATE WRITTEN May 1997 - // MODIFIED na - // RE-ENGINEERED July 2003 (Peter Graham Ellis) - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine is responsible for determining - // how much of each type of energy every zone requires. - // In effect, this subroutine defines and simulates all - // the system types and in the case of hybrid systems - // which use more than one type of energy must determine - // how to apportion the load. An example of a hybrid system - // is a water loop heat pump with supplemental air. In - // this case, a zone will require water from the loop and - // cooled or heated air from the air system. A simpler - // example would be a VAV system with baseboard heaters. - - // Basic Air System Types - // 1) Constant Volume Single Duct - // 2) Variable Volume Single Duct - // 3) Constant Volume Dual Duct - // 4) Variable Volume Dual Duct - - // METHODOLOGY EMPLOYED: - // 0. Determine if simulation has downstepped and readjust history and revert node results - // 1. Determine zone load - this is zone temperature dependent - // 2. Determine balance point - the temperature at which the - // zone load is balanced by the system output. The way the - // balance point is determined will be different depending on - // the type of system being simulated. - // 3. Calculate zone energy requirements - - // Staged thermostat setpoint - if (state.dataZoneTempPredictorCorrector->NumStageCtrZone > 0) { - for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneTempPredictorCorrector->NumStageCtrZone; ++RelativeZoneNum) { - auto &thisStageControlZone = state.dataZoneCtrls->StageControlledZone(RelativeZoneNum); - int ActualZoneNum = thisStageControlZone.ActualZoneNum; - auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ActualZoneNum); - auto &thisZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum); - auto &thisZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum); - Real64 ZoneT = thisZoneHB.MAT; // Zone temperature at previous time step - if (ShortenTimeStepSys) ZoneT = thisZoneHB.XMPT; - thisStageControlZone.HeatSetPoint = ScheduleManager::GetCurrentScheduleValue(state, thisStageControlZone.HSBchedIndex); - thisStageControlZone.CoolSetPoint = ScheduleManager::GetCurrentScheduleValue(state, thisStageControlZone.CSBchedIndex); - if (thisStageControlZone.HeatSetPoint >= thisStageControlZone.CoolSetPoint) { - ++thisStageControlZone.StageErrCount; - if (thisStageControlZone.StageErrCount < 2) { - ShowWarningError(state, - "ZoneControl:Thermostat:StagedDualSetpoint: The heating setpoint is equal to or above the cooling setpoint in " + - thisStageControlZone.Name); - ShowContinueError(state, "The zone heating setpoint is set to the cooling setpoint - 0.1C."); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } else { - ShowRecurringWarningErrorAtEnd(state, - "The heating setpoint is still above the cooling setpoint", - thisStageControlZone.StageErrIndex, - thisStageControlZone.HeatSetPoint, - thisStageControlZone.HeatSetPoint); - } - thisStageControlZone.HeatSetPoint = thisStageControlZone.CoolSetPoint - 0.1; //??????????? - } - // Determine either cooling or heating - if (thisStageControlZone.CoolSetPoint < ZoneT) { // Cooling - Real64 SetpointOffset = ZoneT - thisStageControlZone.CoolSetPoint; - int Itemp = 0; - for (int I = 1; I <= thisStageControlZone.NumOfCoolStages; ++I) { - if (SetpointOffset >= thisStageControlZone.CoolTOffset(I)) { - Itemp = -I; - } - } - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum = Itemp; - if (SetpointOffset >= 0.5 * thisStageControlZone.CoolThroRange) { - thisZoneThermostatSetPointHi = thisStageControlZone.CoolSetPoint - 0.5 * thisStageControlZone.CoolThroRange; - } else { - thisZoneThermostatSetPointHi = thisStageControlZone.CoolSetPoint + 0.5 * thisStageControlZone.CoolThroRange; - } - thisZoneThermostatSetPointLo = thisZoneThermostatSetPointHi; - } else if (thisStageControlZone.HeatSetPoint > ZoneT) { // heating - Real64 SetpointOffset = ZoneT - thisStageControlZone.HeatSetPoint; - int Itemp = 0; - for (int I = 1; I <= thisStageControlZone.NumOfHeatStages; ++I) { - if (std::abs(SetpointOffset) >= std::abs(thisStageControlZone.HeatTOffset(I))) { - Itemp = I; - } - } - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum = Itemp; - if (std::abs(SetpointOffset) >= 0.5 * thisStageControlZone.CoolThroRange) { - thisZoneThermostatSetPointLo = thisStageControlZone.HeatSetPoint + 0.5 * thisStageControlZone.HeatThroRange; - } else { - thisZoneThermostatSetPointLo = thisStageControlZone.HeatSetPoint - 0.5 * thisStageControlZone.HeatThroRange; - } - thisZoneThermostatSetPointHi = thisZoneThermostatSetPointLo; - } else { - thisZoneThermostatSetPointHi = thisStageControlZone.CoolSetPoint + 0.5 * thisStageControlZone.CoolThroRange; - thisZoneThermostatSetPointLo = thisStageControlZone.HeatSetPoint - 0.5 * thisStageControlZone.HeatThroRange; - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum = 0; - } - // SpaceHB TODO: For now, set space stagenum to zone stagenum - later need to see what space the thermostat is in - if (state.dataHeatBal->doSpaceHeatBalance) { - for (int spaceNum : state.dataHeatBal->Zone(ActualZoneNum).spaceIndexes) { - state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).StageNum = - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum; - } - } - } - } - - // Setpoint revision for onoff thermostat - if (state.dataZoneTempPredictorCorrector->NumOnOffCtrZone > 0) { - Real64 TempTole = 0.02; - Real64 Tprev; - for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumTempControlledZones; ++RelativeZoneNum) { - auto &thisTempControlledZone = state.dataZoneCtrls->TempControlledZone(RelativeZoneNum); - if (thisTempControlledZone.DeltaTCutSet > 0.0) { - if (ShortenTimeStepSys) { - thisTempControlledZone.HeatModeLast = thisTempControlledZone.HeatModeLastSave; - thisTempControlledZone.CoolModeLast = thisTempControlledZone.CoolModeLastSave; - } else { - thisTempControlledZone.HeatModeLastSave = thisTempControlledZone.HeatModeLast; - thisTempControlledZone.CoolModeLastSave = thisTempControlledZone.CoolModeLast; - } - auto &thisTempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint(thisTempControlledZone.ActualZoneNum); - auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(thisTempControlledZone.ActualZoneNum); - auto &thisZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(thisTempControlledZone.ActualZoneNum); - auto &thisZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(thisTempControlledZone.ActualZoneNum); - - thisTempControlledZone.CoolOffFlag = false; - thisTempControlledZone.HeatOffFlag = false; - if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::ThirdOrder) { - Tprev = thisZoneHB.MAT; - if (ShortenTimeStepSys) Tprev = thisZoneHB.XMPT; - } else { - Tprev = thisZoneHB.ZoneT1; - } - - switch (state.dataHeatBalFanSys->TempControlType(thisTempControlledZone.ActualZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo; - thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; - if (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + TempTole) { - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; - thisZoneThermostatSetPointLo = thisTempZoneThermostatSetPoint; - } else if (Tprev > thisTempControlledZone.ZoneThermostatSetPointLo && - (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet - TempTole)) { - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; - thisZoneThermostatSetPointLo = thisTempZoneThermostatSetPoint; - } else { - thisTempControlledZone.HeatOffFlag = true; - } - if (thisTempControlledZone.HeatModeLast && Tprev > thisTempControlledZone.ZoneThermostatSetPointLo) { - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo; - thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; - thisTempControlledZone.HeatOffFlag = true; - } - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi; - thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; - if (Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - TempTole) { - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; - thisZoneThermostatSetPointHi = thisTempZoneThermostatSetPoint; - } else if (Tprev < thisTempControlledZone.ZoneThermostatSetPointHi && - Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet + TempTole) { - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; - thisZoneThermostatSetPointHi = thisTempZoneThermostatSetPoint; - } else { - thisTempControlledZone.CoolOffFlag = true; - } - if (thisTempControlledZone.CoolModeLast && Tprev < thisTempControlledZone.ZoneThermostatSetPointHi) { - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi; - thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; - thisTempControlledZone.CoolOffFlag = true; - } - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; - thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; - if (Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - TempTole) { - thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; - } else if (Tprev < thisTempControlledZone.ZoneThermostatSetPointHi && - Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet + TempTole) { - thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; - } else { - thisTempControlledZone.CoolOffFlag = true; - } - if (thisTempControlledZone.CoolModeLast && Tprev < thisTempControlledZone.ZoneThermostatSetPointHi) { - thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; - thisTempControlledZone.CoolOffFlag = true; - } - - if (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + TempTole) { - thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; - } else if (Tprev > thisTempControlledZone.ZoneThermostatSetPointLo && - (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet - TempTole)) { - thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; - } else { - thisTempControlledZone.HeatOffFlag = true; - } - if (thisTempControlledZone.HeatModeLast && Tprev > thisTempControlledZone.ZoneThermostatSetPointLo) { - thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; - thisTempControlledZone.HeatOffFlag = true; - } - // check setpoint for both and provde an error message - if (thisZoneThermostatSetPointLo >= thisZoneThermostatSetPointHi) { - ShowSevereError(state, - "DualSetPointWithDeadBand: When Temperature Difference Between Cutout And Setpoint is applied, the heating " - "setpoint is greater than the cooling setpoint. "); - ShowContinueErrorTimeStamp(state, "occurs in Zone=" + state.dataHeatBal->Zone(thisTempControlledZone.ActualZoneNum).Name); - ShowContinueError(state, format("Zone Heating ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointLo)); - ShowContinueError(state, format("Zone Cooling ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointHi)); - ShowFatalError(state, "Program terminates due to above conditions."); - } - break; - default: - break; - } - } - } - } - - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).predictSystemLoad( - state, ShortenTimeStepSys, UseZoneTimeStepHistory, PriorTimeStep, zoneNum); - if (state.dataHeatBal->doSpaceHeatBalance) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).predictSystemLoad( - state, ShortenTimeStepSys, UseZoneTimeStepHistory, PriorTimeStep, zoneNum, spaceNum); - } - } - } - if (state.dataZoneTempPredictorCorrector->NumOnOffCtrZone > 0) { - for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumTempControlledZones; ++RelativeZoneNum) { - auto &thisTempControlledZone = state.dataZoneCtrls->TempControlledZone(RelativeZoneNum); - if (thisTempControlledZone.DeltaTCutSet > 0.0) { - int ZoneNum = thisTempControlledZone.ActualZoneNum; - if (thisTempControlledZone.CoolOffFlag && state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneNum).TotalOutputRequired >= 0.0) { - thisTempControlledZone.CoolModeLast = true; - } else { - thisTempControlledZone.CoolModeLast = false; - } - if (thisTempControlledZone.HeatOffFlag && state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneNum).TotalOutputRequired <= 0.0) { - thisTempControlledZone.HeatModeLast = true; - } else { - thisTempControlledZone.HeatModeLast = false; - } - } - } - } -} -void ZoneSpaceHeatBalanceData::predictSystemLoad( - EnergyPlusData &state, - bool const shortenTimeStepSys, - bool const useZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step - Real64 const priorTimeStep, // the old value for timestep length is passed for possible use in interpolating - int zoneNum, - int spaceNum) -{ - assert(zoneNum > 0); - this->updateTemperatures(state, shortenTimeStepSys, useZoneTimeStepHistory, priorTimeStep, zoneNum, spaceNum); - - Real64 volume = 0.0; - if (spaceNum > 0) { - volume = state.dataHeatBal->space(spaceNum).Volume; - } else { - volume = state.dataHeatBal->Zone(zoneNum).Volume; - } - this->AirPowerCap = volume * state.dataHeatBal->Zone(zoneNum).ZoneVolCapMultpSens * - Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->MAT, this->ZoneAirHumRat) * - Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat) / (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); - Real64 RAFNFrac = 0.0; - - // Calculate the various heat balance sums - - // NOTE: SumSysMCp and SumSysMCpT are not used in the predict step - this->calcZoneOrSpaceSums(state, false, zoneNum, spaceNum); - - // Sum all convective internal gains except for people: SumIntGainExceptPeople - if (spaceNum == 0 && state.dataHybridModel->FlagHybridModel_PC) { - this->SumIntGainExceptPeople = 0.0; - this->SumIntGainExceptPeople = InternalHeatGains::SumAllInternalConvectionGainsExceptPeople(state, zoneNum); - } - - this->TempDepCoef = this->SumHA + this->SumMCp; - this->TempIndCoef = this->SumIntGain + this->SumHATsurf - this->SumHATref + this->SumMCpT + this->SysDepZoneLoadsLagged; - this->TempHistoryTerm = this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2]); - this->TempDepZnLd = (11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef; - this->TempIndZnLd = this->TempHistoryTerm + this->TempIndCoef; - if (state.dataRoomAirMod->anyNonMixingRoomAirModel) { - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - // RoomAirflowNetworkModel - make dynamic term independent of TimeStepSys - auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); - if (thisRoomAirflowNetworkZoneInfo.IsUsed) { - int RoomAirNode = thisRoomAirflowNetworkZoneInfo.ControlAirNodeID; - RoomAirModelAirflowNetwork::LoadPredictionRoomAirModelAirflowNetwork(state, zoneNum, RoomAirNode); - this->TempDepCoef = - thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumHA + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumLinkMCp; - this->TempIndCoef = thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumIntSensibleGain + - thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumHATsurf - - thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumHATref + - thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumLinkMCpT + - thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SysDepZoneLoadsLagged; - this->AirPowerCap = thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).AirVolume * - state.dataHeatBal->Zone(zoneNum).ZoneVolCapMultpSens * thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).RhoAir * - thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).CpAir / - (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); - this->TempHistoryTerm = this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2]); - this->TempDepZnLd = (11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef; - this->TempIndZnLd = this->TempHistoryTerm + this->TempIndCoef; - if (thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).HasHVACAssigned) - RAFNFrac = thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).HVAC(1).SupplyFraction; - } - } - } - - // Exact solution or Euler method - state.dataHVACGlobal->ShortenTimeStepSysRoomAir = false; - if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) { - if (shortenTimeStepSys && state.dataHVACGlobal->TimeStepSys < state.dataGlobal->TimeStepZone) { - if (state.dataHVACGlobal->PreviousTimeStep < state.dataGlobal->TimeStepZone) { - this->ZoneT1 = this->ZoneTM2; - this->ZoneW1 = this->ZoneWM2; - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); - for (int LoopNode = 1; LoopNode <= thisRoomAirflowNetworkZoneInfo.NumOfAirNodes; ++LoopNode) { - thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempT1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempTM2; - thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatW1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatWM2; - } - } - } else { - this->ZoneT1 = this->ZoneTMX; - this->ZoneW1 = this->ZoneWMX; - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); - for (int LoopNode = 1; LoopNode <= thisRoomAirflowNetworkZoneInfo.NumOfAirNodes; ++LoopNode) { - thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempT1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempTMX; - thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatW1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatWMX; - } - } - } - state.dataHVACGlobal->ShortenTimeStepSysRoomAir = true; - } else { - this->ZoneT1 = this->ZT; - this->ZoneW1 = this->ZoneAirHumRat; - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); - for (int LoopNode = 1; LoopNode <= thisRoomAirflowNetworkZoneInfo.NumOfAirNodes; ++LoopNode) { - thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempT1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTemp; - thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatW1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRat; - } - } - } - this->TempDepZnLd = this->TempDepCoef; - this->TempIndZnLd = this->TempIndCoef; - } - - // Calculate the predicted zone load to be provided by the system with the given desired zone air temperature - this->calcPredictedSystemLoad(state, RAFNFrac, zoneNum, spaceNum); - - // Calculate the predicted zone load to be provided by the system with the given desired humidity ratio - this->calcPredictedHumidityRatio(state, RAFNFrac, zoneNum, spaceNum); -} - -void CalcZoneAirTempSetPoints(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Russ Taylor - // DATE WRITTEN Nov 1997 - // MODIFIED Aug 2013, Xiufeng Pang (XP) - Added code for updating set points during - // optimum start period - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This routine sets what the setpoints for each controlled zone should be based on schedules. - // This is called each time step. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int RelativeZoneNum; - int ActualZoneNum; - int TempControlSchedIndex; - int SetPointTempSchedIndexHot; - int SetPointTempSchedIndexCold; - int SchedNameIndex; - Array2D DaySPValues; // Day room temp setpoint values - for optimum start - int OccStartTime; // Occupancy start time - for optimum start - Real64 DeltaT; // Temperature difference between cutout and setpoint - - auto &Zone = state.dataHeatBal->Zone; - auto &TempControlledZone = state.dataZoneCtrls->TempControlledZone; - auto &TempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint; - auto &TempControlType = state.dataHeatBalFanSys->TempControlType; - auto &TempControlTypeRpt = state.dataHeatBalFanSys->TempControlTypeRpt; - auto &ZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo; - auto &ZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi; - auto &NumOfZones = state.dataGlobal->NumOfZones; - - TempControlType = DataHVACGlobals::ThermostatType::Uncontrolled; // Default - - // Place holder for occupied heating and cooling set points - for optimum start - if (!allocated(state.dataZoneCtrls->OccRoomTSetPointHeat)) { - state.dataZoneCtrls->OccRoomTSetPointHeat.allocate(NumOfZones); - } - if (!allocated(state.dataZoneCtrls->OccRoomTSetPointCool)) { - state.dataZoneCtrls->OccRoomTSetPointCool.allocate(NumOfZones); - } - state.dataZoneCtrls->OccRoomTSetPointHeat = 0.0; - state.dataZoneCtrls->OccRoomTSetPointCool = 100.0; - DeltaT = 0.0; - - for (RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumTempControlledZones; ++RelativeZoneNum) { - - // What if this zone not controlled??? - ActualZoneNum = TempControlledZone(RelativeZoneNum).ActualZoneNum; - TempControlSchedIndex = TempControlledZone(RelativeZoneNum).CTSchedIndex; - TempControlType(ActualZoneNum) = - static_cast(ScheduleManager::GetCurrentScheduleValue(state, TempControlSchedIndex)); - TempControlTypeRpt(ActualZoneNum) = static_cast(TempControlType(ActualZoneNum)); - // Error detection for these values is done in the Get routine - - switch (TempControlType(ActualZoneNum)) { - case DataHVACGlobals::ThermostatType::Uncontrolled: - break; - case DataHVACGlobals::ThermostatType::SingleHeating: - SchedNameIndex = TempControlledZone(RelativeZoneNum).SchIndx_SingleHeatSetPoint; - TempZoneThermostatSetPoint(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SchedNameIndex); - TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointLo = TempZoneThermostatSetPoint(ActualZoneNum); - - AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); - ZoneThermostatSetPointLo(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - SchedNameIndex = TempControlledZone(RelativeZoneNum).SchIndx_SingleCoolSetPoint; - TempZoneThermostatSetPoint(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SchedNameIndex); - TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointHi = TempZoneThermostatSetPoint(ActualZoneNum); - - // Added Jan 17 (X. Luo) - // Adjust operative temperature based on adaptive comfort model - if ((TempControlledZone(RelativeZoneNum).AdaptiveComfortTempControl)) { - AdjustOperativeSetPointsforAdapComfort(state, RelativeZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); - state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - } - - AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); - ZoneThermostatSetPointHi(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - - AdjustCoolingSetPointforTempAndHumidityControl(state, RelativeZoneNum, ActualZoneNum); - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - - SchedNameIndex = TempControlledZone(RelativeZoneNum).SchIndx_SingleHeatCoolSetPoint; - - TempZoneThermostatSetPoint(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SchedNameIndex); - - // Added Jan 17 (X. Luo) - // Adjust operative temperature based on adaptive comfort model - if ((TempControlledZone(RelativeZoneNum).AdaptiveComfortTempControl)) { - AdjustOperativeSetPointsforAdapComfort(state, RelativeZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); - state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - } - - AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); - - ZoneThermostatSetPointHi(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - ZoneThermostatSetPointLo(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - - // Change the room set point to occupied set point during optimum start period-------------- - - if (allocated(state.dataHVACGlobal->OptStartData.OptStartFlag)) { - if (!allocated(DaySPValues)) { - DaySPValues.allocate(state.dataGlobal->NumOfTimeStepInHour, 24); - } - if (state.dataHVACGlobal->OptStartData.ActualZoneNum(ActualZoneNum) == ActualZoneNum) { - ScheduleManager::GetScheduleValuesForDay(state, SetPointTempSchedIndexCold, DaySPValues); - OccStartTime = CEILING(state.dataHVACGlobal->OptStartData.OccStartTime(ActualZoneNum)) + 1; - TempZoneThermostatSetPoint(ActualZoneNum) = DaySPValues(1, OccStartTime); - } - - if (state.dataHVACGlobal->OptStartData.OptStartFlag(ActualZoneNum)) { - ZoneThermostatSetPointHi(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - ZoneThermostatSetPointLo(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - } - } - //-------------------------------------------------------------------------------------------- - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - SetPointTempSchedIndexHot = TempControlledZone(RelativeZoneNum).SchIndx_DualSetPointWDeadBandHeat; - SetPointTempSchedIndexCold = TempControlledZone(RelativeZoneNum).SchIndx_DualSetPointWDeadBandCool; - - ZoneThermostatSetPointHi(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SetPointTempSchedIndexCold); - TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointHi = ZoneThermostatSetPointHi(ActualZoneNum); - - // Added Jan 17 (X. Luo) - // Adjust operative temperature based on adaptive comfort model - if ((TempControlledZone(RelativeZoneNum).AdaptiveComfortTempControl)) { - AdjustOperativeSetPointsforAdapComfort(state, RelativeZoneNum, ZoneThermostatSetPointHi(ActualZoneNum)); - state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(ActualZoneNum) = ZoneThermostatSetPointHi(ActualZoneNum); - } - - AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, ZoneThermostatSetPointHi(ActualZoneNum)); - - ZoneThermostatSetPointLo(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SetPointTempSchedIndexHot); - TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointLo = ZoneThermostatSetPointLo(ActualZoneNum); - AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, ZoneThermostatSetPointLo(ActualZoneNum)); - - // Change the room set point to occupied set point during optimum start period-------------- - - if (allocated(state.dataHVACGlobal->OptStartData.OptStartFlag)) { - if (!allocated(DaySPValues)) { - DaySPValues.allocate(state.dataGlobal->NumOfTimeStepInHour, 24); - } - if (state.dataHVACGlobal->OptStartData.ActualZoneNum(ActualZoneNum) == ActualZoneNum) { - ScheduleManager::GetScheduleValuesForDay(state, SetPointTempSchedIndexCold, DaySPValues); - OccStartTime = CEILING(state.dataHVACGlobal->OptStartData.OccStartTime(ActualZoneNum)) + 1; - state.dataZoneCtrls->OccRoomTSetPointCool(ActualZoneNum) = DaySPValues(1, OccStartTime); - ScheduleManager::GetScheduleValuesForDay(state, SetPointTempSchedIndexHot, DaySPValues); - state.dataZoneCtrls->OccRoomTSetPointHeat(ActualZoneNum) = DaySPValues(1, OccStartTime); - } - - if (state.dataHVACGlobal->OptStartData.OptStartFlag(ActualZoneNum)) { - ZoneThermostatSetPointHi(ActualZoneNum) = state.dataZoneCtrls->OccRoomTSetPointCool(ActualZoneNum); - ZoneThermostatSetPointLo(ActualZoneNum) = state.dataZoneCtrls->OccRoomTSetPointHeat(ActualZoneNum); - } - } - //-------------------------------------------------------------------------------------------- - - AdjustCoolingSetPointforTempAndHumidityControl(state, RelativeZoneNum, ActualZoneNum); - break; - default: - ShowSevereError(state, - format("CalcZoneAirTempSetpoints: Illegal control type for Zone={}, Found value={}, in Schedule={}", - Zone(ActualZoneNum).Name, - TempControlType(ActualZoneNum), - TempControlledZone(RelativeZoneNum).ControlTypeSchedName)); - - break; - } - - // Apply offset for faulty therostats - if ((state.dataFaultsMgr->NumFaultyThermostat > 0) && (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing) && - (!state.dataGlobal->KickOffSimulation)) { - // loop through the FaultsThermostatOffset objects to find the one for the zone - for (int iFault = 1; iFault <= state.dataFaultsMgr->NumFaultyThermostat; ++iFault) { - - if (UtilityRoutines::SameString(TempControlledZone(RelativeZoneNum).Name, - state.dataFaultsMgr->FaultsThermostatOffset(iFault).FaultyThermostatName)) { - - // Check fault availability schedules - if (ScheduleManager::GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsThermostatOffset(iFault).AvaiSchedPtr) > 0.0) { - - // Check fault severity schedules to update the reference thermostat offset - double rSchVal = 1.0; - double offsetUpdated; - if (state.dataFaultsMgr->FaultsThermostatOffset(iFault).SeveritySchedPtr >= 0) { - rSchVal = - ScheduleManager::GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsThermostatOffset(iFault).SeveritySchedPtr); - } - offsetUpdated = rSchVal * state.dataFaultsMgr->FaultsThermostatOffset(iFault).Offset; - - // Positive offset means the sensor reading is higher than the actual value - TempZoneThermostatSetPoint(ActualZoneNum) -= offsetUpdated; - ZoneThermostatSetPointLo(ActualZoneNum) -= offsetUpdated; - ZoneThermostatSetPointHi(ActualZoneNum) -= offsetUpdated; - } - - // Stop searching the FaultsThermostatOffset object for the zone - break; - } - } - } - } - - if (state.dataZoneCtrls->NumComfortControlledZones > 0) CalcZoneAirComfortSetPoints(state); - OverrideAirSetPointsforEMSCntrl(state); -} - -void ZoneSpaceHeatBalanceData::calcPredictedHumidityRatio(EnergyPlusData &state, Real64 const RAFNFrac, int const zoneNum, int const spaceNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Richard J. Liesen - // DATE WRITTEN May 2001 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine does the prediction step for humidity control - - // METHODOLOGY EMPLOYED: - // This solves for the required system moisture required to try and achieve the desired - // Humidity Ratio in the Zone - - // REFERENCES: - // Routine FinalZnCalcs - FINAL ZONE CALCULATIONS, authored by Dale Herron - // for BLAST. - - static constexpr std::string_view RoutineName("calcPredictedHumidityRatio"); - - Real64 ZoneRHHumidifyingSetPoint = 0.0; // Zone humidifying set point (%) - Real64 ZoneRHDehumidifyingSetPoint = 0.0; // Zone dehumidifying set point (%) - - auto &thisZone = state.dataHeatBal->Zone(zoneNum); - bool SingleSetPoint = false; // This determines whether both setpoint are equal or not - - // Check to see if this is a "humidity controlled zone" - bool ControlledHumidZoneFlag = false; - // Check all the controlled zones to see if it matches the zone simulated - if (thisZone.humidityControlZoneIndex > 0) { - auto &humidityControlZone = state.dataZoneCtrls->HumidityControlZone(thisZone.humidityControlZoneIndex); - assert(humidityControlZone.ActualZoneNum == zoneNum); - ZoneRHHumidifyingSetPoint = ScheduleManager::GetCurrentScheduleValue(state, humidityControlZone.HumidifyingSchedIndex); - ZoneRHDehumidifyingSetPoint = ScheduleManager::GetCurrentScheduleValue(state, humidityControlZone.DehumidifyingSchedIndex); - - // Apply EMS values to overwrite the humidistat values - if (humidityControlZone.EMSOverrideHumidifySetPointOn) { - ZoneRHHumidifyingSetPoint = humidityControlZone.EMSOverrideHumidifySetPointValue; - } - if (humidityControlZone.EMSOverrideDehumidifySetPointOn) { - ZoneRHDehumidifyingSetPoint = humidityControlZone.EMSOverrideDehumidifySetPointValue; - } - - // Apply offsets for faulty humidistats - if ((state.dataFaultsMgr->NumFaultyHumidistat > 0) && (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing) && - (!state.dataGlobal->KickOffSimulation)) { - - // loop through the FaultsHumidistatOffset objects to find the one for the zone - for (int iFault = 1; iFault <= state.dataFaultsMgr->NumFaultyHumidistat; ++iFault) { - - if (UtilityRoutines::SameString(humidityControlZone.ControlName, - state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyHumidistatName)) { - - if (UtilityRoutines::SameString(state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyHumidistatType, - "ThermostatOffsetDependent")) { - // For Humidistat Offset Type I: ThermostatOffsetDependent - - bool IsThermostatFound = false; - double offsetThermostat = 0.0; - double offsetZoneRHHumidifyingSetPoint = 0.0; - double offsetZoneRHDehumidifyingSetPoint = 0.0; - double faultZoneWHumidifyingSetPoint; - double faultZoneWDehumidifyingSetPoint; - - // Get the offset value of the corresponding thermostat fault object - if (state.dataFaultsMgr->NumFaultyThermostat > 0) { - - // loop through the FaultsThermostatOffset objects to find the one causes the Humidistat Offset - for (int iFaultThermo = 1; iFaultThermo <= state.dataFaultsMgr->NumFaultyThermostat; ++iFaultThermo) { - - if (UtilityRoutines::SameString(state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyThermostatName, - state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).Name)) { - IsThermostatFound = true; - - // Check fault availability schedules - if (ScheduleManager::GetCurrentScheduleValue( - state, state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).AvaiSchedPtr) > 0.0) { - - // Check fault severity schedules to update the reference thermostat offset - double rSchVal = 1.0; - if (state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).SeveritySchedPtr >= 0) { - rSchVal = ScheduleManager::GetCurrentScheduleValue( - state, state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).SeveritySchedPtr); - } - offsetThermostat = rSchVal * state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).Offset; - } - - // Stop searching the FaultsThermostatOffset object for the Humidistat Offset - break; - } - } - } - - // The FaultsThermostatOffset specified in the FaultHumidistatOffset is not found - if (!IsThermostatFound) { - ShowSevereError(state, - "FaultModel:HumidistatOffset = \"" + state.dataFaultsMgr->FaultsHumidistatOffset(iFault).Name + - "\" invalid Reference Humidistat Offset Name = \"" + - state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyThermostatName + "\" not found."); - ShowFatalError(state, "Errors getting FaultModel input data. Preceding condition(s) cause termination."); - } - - if (offsetThermostat != 0.0) { - // Calculate the humidistat offset value from the thermostat offset value - faultZoneWHumidifyingSetPoint = Psychrometrics::PsyWFnTdbRhPb( - state, (this->MAT + offsetThermostat), (ZoneRHHumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress); - faultZoneWDehumidifyingSetPoint = Psychrometrics::PsyWFnTdbRhPb( - state, (this->MAT + offsetThermostat), (ZoneRHDehumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress); - offsetZoneRHHumidifyingSetPoint = - ZoneRHHumidifyingSetPoint - - Psychrometrics::PsyRhFnTdbWPb(state, this->MAT, faultZoneWHumidifyingSetPoint, state.dataEnvrn->OutBaroPress) * 100.0; - offsetZoneRHDehumidifyingSetPoint = - ZoneRHDehumidifyingSetPoint - - Psychrometrics::PsyRhFnTdbWPb(state, this->MAT, faultZoneWDehumidifyingSetPoint, state.dataEnvrn->OutBaroPress) * - 100.0; - - // Apply the calculated humidistat offset value - // Positive offset means the sensor reading is higher than the actual value - ZoneRHHumidifyingSetPoint -= offsetZoneRHHumidifyingSetPoint; - ZoneRHDehumidifyingSetPoint -= offsetZoneRHDehumidifyingSetPoint; - - // constrain value to something reasonable - ZoneRHHumidifyingSetPoint = min(100.0, max(0.0, ZoneRHHumidifyingSetPoint)); - ZoneRHDehumidifyingSetPoint = min(100.0, max(0.0, ZoneRHDehumidifyingSetPoint)); - } - - } else { - // For Humidistat Offset Type II: ThermostatOffsetIndependent - - // Check fault availability schedules - if (ScheduleManager::GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsHumidistatOffset(iFault).AvaiSchedPtr) > 0.0) { - - // Check fault severity schedules to update the reference humidistat offset - double rSchVal = 1.0; - double offsetUpdated; - if (state.dataFaultsMgr->FaultsHumidistatOffset(iFault).SeveritySchedPtr >= 0) { - rSchVal = ScheduleManager::GetCurrentScheduleValue( - state, state.dataFaultsMgr->FaultsHumidistatOffset(iFault).SeveritySchedPtr); - } - offsetUpdated = rSchVal * state.dataFaultsMgr->FaultsHumidistatOffset(iFault).Offset; - - // Positive offset means the sensor reading is higher than the actual value - ZoneRHHumidifyingSetPoint -= offsetUpdated; - ZoneRHDehumidifyingSetPoint -= offsetUpdated; - - // constrain value to something reasonable - ZoneRHHumidifyingSetPoint = min(100.0, max(0.0, ZoneRHHumidifyingSetPoint)); - ZoneRHDehumidifyingSetPoint = min(100.0, max(0.0, ZoneRHDehumidifyingSetPoint)); - } - } - break; - } - } - } - - // Run-time error check - if (ZoneRHHumidifyingSetPoint > ZoneRHDehumidifyingSetPoint) { - if (humidityControlZone.ErrorIndex == 0) { - ShowWarningMessage(state, - "HUMIDISTAT: The humidifying setpoint is above the dehumidifying setpoint in " + humidityControlZone.ControlName); - ShowContinueError(state, "The zone humidifying setpoint is set to the dehumidifying setpoint."); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "The humidifying setpoint is still above the dehumidifying setpoint", - humidityControlZone.ErrorIndex, - ZoneRHHumidifyingSetPoint, - ZoneRHHumidifyingSetPoint); - ZoneRHHumidifyingSetPoint = ZoneRHDehumidifyingSetPoint; - } - if (ZoneRHHumidifyingSetPoint == ZoneRHDehumidifyingSetPoint) SingleSetPoint = true; - ControlledHumidZoneFlag = true; - - } // HumidControlledZoneNum - - // if zone latent sizing is requested but no humidistat exists - if (state.dataGlobal->DoingSizing && !ControlledHumidZoneFlag && state.dataHeatBal->DoLatentSizing) { - for (size_t zoneEqConfigNum = 1; zoneEqConfigNum <= state.dataZoneEquip->ZoneEquipConfig.size(); ++zoneEqConfigNum) { - auto &zoneEqConfig = state.dataZoneEquip->ZoneEquipConfig(zoneEqConfigNum); - if (!zoneEqConfig.IsControlled) continue; - int ZoneSizNum = - UtilityRoutines::FindItemInList(zoneEqConfig.ZoneName, state.dataSize->ZoneSizingInput, &DataSizing::ZoneSizingInputData::ZoneName); - // should use the first Sizing:Zone object if not found - if (ZoneSizNum == 0 && !state.dataSize->ZoneSizingInput.empty()) ZoneSizNum = 1; - if (ZoneSizNum > 0) { - auto &zoneSizingInput = state.dataSize->ZoneSizingInput(ZoneSizNum); - if (zoneSizingInput.zoneLatentSizing) { - ZoneRHDehumidifyingSetPoint = (zoneSizingInput.zoneRHDehumidifySchIndex) - ? ScheduleManager::GetCurrentScheduleValue(state, zoneSizingInput.zoneRHDehumidifySchIndex) - : zoneSizingInput.zoneRHDehumidifySetPoint; - ZoneRHHumidifyingSetPoint = (zoneSizingInput.zoneRHHumidifySchIndex) - ? ScheduleManager::GetCurrentScheduleValue(state, zoneSizingInput.zoneRHHumidifySchIndex) - : zoneSizingInput.zoneRHHumidifySetPoint; - if (ZoneRHHumidifyingSetPoint > ZoneRHDehumidifyingSetPoint) ZoneRHHumidifyingSetPoint = ZoneRHDehumidifyingSetPoint; - if (ZoneRHHumidifyingSetPoint == ZoneRHDehumidifyingSetPoint) SingleSetPoint = true; - ControlledHumidZoneFlag = true; - } - } - break; - } - } - - Real64 LoadToHumidifySetPoint = 0.0; // Moisture load at humidifying set point - Real64 LoadToDehumidifySetPoint = 0.0; // Moisture load at dehumidifying set point - Real64 totalOutputRequired = 0.0; - if (ControlledHumidZoneFlag) { - - // Calculate hourly humidity ratio from infiltration + humidity added from latent load - // to determine system added/subtracted moisture. - Real64 LatentGain = - this->ZoneLatentGain + state.dataHeatBalFanSys->SumLatentHTRadSys(zoneNum) + state.dataHeatBalFanSys->SumLatentPool(zoneNum); - - Real64 SysTimeStepInSeconds = DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys; - - // Calculate the coefficients for the 3rd Order derivative for final - // zone humidity ratio. The A, B, C coefficients are analogous to the heat balance. - // SumHmARaW and SumHmARa will be used with the Moisture Balance on the building elements and - // are currently set to zero when the CTF only version is used. - - // The density of air and latent heat of vaporization are calculated as functions. - Real64 RhoAir = Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->ZT, this->ZoneAirHumRat, RoutineName); - Real64 H2OHtOfVap = Psychrometrics::PsyHgAirFnWTdb(this->ZoneAirHumRat, this->ZT); - - // Assume that the system will have flow - Real64 A = 0.0; - Real64 B = 0.0; - Real64 C = 0.0; - if (state.afn->multizone_always_simulated || - (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && - state.afn->AirflowNetworkFanActivated)) { - // Multizone airflow calculated in AirflowNetwork - B = (LatentGain / H2OHtOfVap) + state.afn->exchangeData(zoneNum).SumMHrW + state.afn->exchangeData(zoneNum).SumMMHrW + this->SumHmARaW; - A = state.afn->exchangeData(zoneNum).SumMHr + state.afn->exchangeData(zoneNum).SumMMHr + this->SumHmARa; - } else { - B = (LatentGain / H2OHtOfVap) + ((this->OAMFL + this->VAMFL + this->CTMFL) * state.dataEnvrn->OutHumRat) + this->EAMFLxHumRat + - this->SumHmARaW + this->MixingMassFlowXHumRat + this->MDotOA * state.dataEnvrn->OutHumRat; - A = this->OAMFL + this->VAMFL + this->EAMFL + this->CTMFL + this->SumHmARa + this->MixingMassFlowZone + this->MDotOA; - } - Real64 volume = 0.0; - if (spaceNum > 0) { - volume = state.dataHeatBal->space(spaceNum).Volume; - } else { - volume = thisZone.Volume; - } - C = RhoAir * volume * thisZone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; - - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - auto &roomAFNInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); - int RoomAirNode = roomAFNInfo.ControlAirNodeID; - H2OHtOfVap = Psychrometrics::PsyHgAirFnWTdb(roomAFNInfo.Node(RoomAirNode).HumRat, roomAFNInfo.Node(RoomAirNode).AirTemp); - A = roomAFNInfo.Node(RoomAirNode).SumLinkM + roomAFNInfo.Node(RoomAirNode).SumHmARa; - B = (roomAFNInfo.Node(RoomAirNode).SumIntLatentGain / H2OHtOfVap) + roomAFNInfo.Node(RoomAirNode).SumLinkMW + - roomAFNInfo.Node(RoomAirNode).SumHmARaW; - C = roomAFNInfo.Node(RoomAirNode).RhoAir * roomAFNInfo.Node(RoomAirNode).AirVolume * thisZone.ZoneVolCapMultpMoist / - (DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys); - } - - // Use a 3rd Order derivative to predict zone moisture addition or removal and - // smooth the changes using the zone air capacitance. Positive values of Moist Load means that - // this amount of moisture must be added to the zone to reach the setpoint. Negative values represent - // the amount of moisture that must be removed by the system. - // MoistLoadHumidSetPoint = massflow * HumRat = kgDryAir/s * kgWater/kgDryAir = kgWater/s - Real64 WZoneSetPoint = - Psychrometrics::PsyWFnTdbRhPb(state, this->ZT, (ZoneRHHumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress, RoutineName); - Real64 exp_700_A_C(0.0); - if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::ThirdOrder) { - LoadToHumidifySetPoint = - ((11.0 / 6.0) * C + A) * WZoneSetPoint - - (B + C * (3.0 * this->WPrevZoneTSTemp[0] - (3.0 / 2.0) * this->WPrevZoneTSTemp[1] + (1.0 / 3.0) * this->WPrevZoneTSTemp[2])); - // Exact solution - } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::AnalyticalSolution) { - if (A == 0.0) { // B=0 - LoadToHumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) - B; - } else { - exp_700_A_C = std::exp(min(700.0, -A / C)); // Tuned Save expensive value - LoadToHumidifySetPoint = A * (WZoneSetPoint - this->ZoneW1 * exp_700_A_C) / (1.0 - exp_700_A_C) - B; - } - } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::EulerMethod) { - LoadToHumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) + A * WZoneSetPoint - B; - } - if (RAFNFrac > 0.0) LoadToHumidifySetPoint = LoadToHumidifySetPoint / RAFNFrac; - WZoneSetPoint = - Psychrometrics::PsyWFnTdbRhPb(state, this->ZT, (ZoneRHDehumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress, RoutineName); - if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::ThirdOrder) { - LoadToDehumidifySetPoint = - ((11.0 / 6.0) * C + A) * WZoneSetPoint - - (B + C * (3.0 * this->WPrevZoneTSTemp[0] - (3.0 / 2.0) * this->WPrevZoneTSTemp[1] + (1.0 / 3.0) * this->WPrevZoneTSTemp[2])); - // Exact solution - } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::AnalyticalSolution) { - if (A == 0.0) { // B=0 - LoadToDehumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) - B; - } else { - LoadToDehumidifySetPoint = A * (WZoneSetPoint - this->ZoneW1 * exp_700_A_C) / (1.0 - exp_700_A_C) - B; // exp_700_A_C set above - } - } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::EulerMethod) { - LoadToDehumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) + A * WZoneSetPoint - B; - } - if (RAFNFrac > 0.0) LoadToDehumidifySetPoint = LoadToDehumidifySetPoint / RAFNFrac; - - // The load is added to the TotalOutputRequired as in the Temperature Predictor. There is also the remaining - // output variable for those who will use this for humidity control and stored in DataZoneEnergyDemands with the - // analogous temperature terms. - - if (SingleSetPoint) { - totalOutputRequired = LoadToHumidifySetPoint; - } else { - if (LoadToHumidifySetPoint > 0.0 && LoadToDehumidifySetPoint > 0.0) { - totalOutputRequired = LoadToHumidifySetPoint; - } else if (LoadToHumidifySetPoint < 0.0 && LoadToDehumidifySetPoint < 0.0) { - totalOutputRequired = LoadToDehumidifySetPoint; - } else if (LoadToHumidifySetPoint <= 0.0 && LoadToDehumidifySetPoint >= 0.0) { // deadband includes zero loads - totalOutputRequired = 0.0; - } else { // this should never occur! - ShowSevereError( - state, "Humidistat: Unanticipated combination of humidifying and dehumidifying loads - report to EnergyPlus Development Team"); - ShowContinueErrorTimeStamp(state, format("occurs in Zone = {}", thisZone.Name)); - ShowContinueError( - state, - format("LoadToHumidifySetPoint={:.5R}, LoadToDehumidifySetPoint={:.5R}", LoadToHumidifySetPoint, LoadToDehumidifySetPoint)); - ShowContinueError(state, format("Zone RH Humidifying Set-point={:.1R}", ZoneRHHumidifyingSetPoint)); - ShowContinueError(state, format("Zone RH Dehumidifying Set-point={:.2R}", ZoneRHDehumidifyingSetPoint)); - ShowFatalError(state, "Program terminates due to above conditions."); - } - } - } - - // Apply zone multipliers as needed or set to zero - if (spaceNum > 0) { - auto &thisspaceSysMoistureDemand = state.dataZoneEnergyDemand->spaceSysMoistureDemand(spaceNum); - if (ControlledHumidZoneFlag) { - thisspaceSysMoistureDemand.reportMoistLoadsZoneMultiplier( - state, zoneNum, totalOutputRequired, LoadToHumidifySetPoint, LoadToDehumidifySetPoint); - } else { - thisspaceSysMoistureDemand.TotalOutputRequired = 0.0; - thisspaceSysMoistureDemand.OutputRequiredToDehumidifyingSP = 0.0; - thisspaceSysMoistureDemand.OutputRequiredToHumidifyingSP = 0.0; - } - } else { - auto &thisZoneSysMoistureDemand = state.dataZoneEnergyDemand->ZoneSysMoistureDemand(zoneNum); - if (ControlledHumidZoneFlag) { - thisZoneSysMoistureDemand.reportMoistLoadsZoneMultiplier( - state, zoneNum, totalOutputRequired, LoadToHumidifySetPoint, LoadToDehumidifySetPoint); - } else { - thisZoneSysMoistureDemand.TotalOutputRequired = 0.0; - thisZoneSysMoistureDemand.OutputRequiredToDehumidifyingSP = 0.0; - thisZoneSysMoistureDemand.OutputRequiredToHumidifyingSP = 0.0; - } - } -} - -Real64 correctZoneAirTemps(EnergyPlusData &state, - bool useZoneTimeStepHistory // if true then use zone timestep history, if false use system time step history -) -{ - Real64 maxTempChange = DataPrecisionGlobals::constant_zero; // Max absolute air temperature change between previous and current timestep - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - Real64 zoneTempChange = state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).correctAirTemp(state, useZoneTimeStepHistory, zoneNum); - if (state.dataHeatBal->doSpaceHeatBalance) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - Real64 spaceTempChange = - state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).correctAirTemp(state, useZoneTimeStepHistory, zoneNum, spaceNum); - maxTempChange = max(maxTempChange, spaceTempChange); - } - } - maxTempChange = max(maxTempChange, zoneTempChange); - } - return maxTempChange; -} - -Real64 ZoneSpaceHeatBalanceData::correctAirTemp( - EnergyPlusData &state, - bool const useZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step history - int const zoneNum, - int const spaceNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Russell Taylor - // MODIFIED November 1999, LKL; November 2016 Sang Hoon Lee, Tianzhen Hong, Rongpeng Zhang; - // RE-ENGINEERED July 2003 (Peter Graham Ellis) - // February 2008 (Brent Griffith reworked history ) - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine updates the zone air temperature and modifies the system - // time step. - - static constexpr std::string_view RoutineName("correctAirTemp"); - - Real64 tempChange = DataPrecisionGlobals::constant_zero; // Zone or space air temperature change between previous and current timestep - - assert(zoneNum > 0); - auto &thisZone = state.dataHeatBal->Zone(zoneNum); - - // Update zone temperatures - - Real64 ZoneMult = thisZone.Multiplier * thisZone.ListMultiplier; - - // update the variables actually used in the balance equations. - if (!useZoneTimeStepHistory) { - this->ZTM = this->DSXMAT; - this->WPrevZoneTSTemp = this->DSWPrevZoneTS; - } else { - this->ZTM = this->XMAT; - this->WPrevZoneTSTemp = this->WPrevZoneTS; - } - - Real64 volume = 0.0; - if (spaceNum > 0) { - volume = state.dataHeatBal->space(spaceNum).Volume; - } else { - volume = thisZone.Volume; - } - this->AirPowerCap = volume * thisZone.ZoneVolCapMultpSens * - Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->MAT, this->ZoneAirHumRat, RoutineName) * - Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat) / (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); - - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0) { - RoomAirModelManager::ManageAirModel(state, zoneNum); - } - - // Calculate the various heat balance sums - this->calcZoneOrSpaceSums(state, true, zoneNum, spaceNum); - - // Sum all convective internal gains except for people: SumIntGainExceptPeople - if (state.dataHybridModel->FlagHybridModel_PC) { - // TODO: For now, don't do space heat balance with hybrid model - this->SumIntGainExceptPeople = InternalHeatGains::SumAllInternalConvectionGainsExceptPeople(state, zoneNum); - } - - // ZoneTempHistoryTerm = (3.0D0 * ZTM1(zoneNum) - (3.0D0/2.0D0) * ZTM2(zoneNum) + (1.0D0/3.0D0) * ZTM3(zoneNum)) - int ZoneNodeNum = thisZone.SystemZoneNodeNumber; - if (spaceNum > 0) { - ZoneNodeNum = state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber; - } - - Real64 SNLoad = 0.0; - - if (ZoneNodeNum > 0) { // This zone is controlled by a zone equipment configuration or zone plenum - auto &thisSystemNode = state.dataLoopNodes->Node(ZoneNodeNum); - - // Heat balance coefficients for controlled zone, i.e. with system air flow - this->TempDepCoef = this->SumHA + this->SumMCp + this->SumSysMCp; - this->TempIndCoef = this->SumIntGain + this->SumHATsurf - this->SumHATref + this->SumMCpT + this->SumSysMCpT + - (this->NonAirSystemResponse / ZoneMult + this->SysDepZoneLoadsLagged); - - if (state.afn->distribution_simulated) { - this->TempIndCoef += state.afn->exchangeData(zoneNum).TotalSen; - } - - // Solve for zone air temperature - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - this->ZT = (this->TempIndCoef + this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2])) / - ((11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef); - } break; - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepCoef == 0.0) { // B=0 - this->ZT = this->ZoneT1 + this->TempIndCoef / this->AirPowerCap; - } else { - this->ZT = (this->ZoneT1 - this->TempIndCoef / this->TempDepCoef) * std::exp(min(700.0, -this->TempDepCoef / this->AirPowerCap)) + - this->TempIndCoef / this->TempDepCoef; - } - } break; - case DataHeatBalance::SolutionAlgo::EulerMethod: { - this->ZT = (this->AirPowerCap * this->ZoneT1 + this->TempIndCoef) / (this->AirPowerCap + this->TempDepCoef); - } break; - default: - break; - } - // Update zone node temperature and thermostat temperature unless already updated in Room Air Model, - // calculate load correction factor - if (!state.dataRoomAirMod->anyNonMixingRoomAirModel) { - // Fully mixed - thisSystemNode.Temp = this->ZT; - // SpaceHB TODO: What to do here if this is for space - if (spaceNum == 0) { - state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; - } - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; - } else { - auto &thisAirModel = state.dataRoomAirMod->AirModel(zoneNum); - if ((thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::Mixing) || (!thisAirModel.SimAirModel)) { - // Fully mixed - thisSystemNode.Temp = this->ZT; - // SpaceHB TODO: What to do here if this is for space - if (spaceNum == 0) { - state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; - } - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; - } else if (state.dataRoomAirMod->IsZoneDV(zoneNum) || state.dataRoomAirMod->IsZoneUI(zoneNum)) { - // UCSDDV: Not fully mixed - calculate factor to correct load for fully mixed assumption - // Space HB TODO: Space HB doesn't mix with DV etc. - if (this->SumSysMCp > DataHVACGlobals::SmallMassFlow) { - Real64 TempSupplyAir = this->SumSysMCpT / this->SumSysMCp; // Non-negligible flow, calculate supply air temperature - if (std::abs(TempSupplyAir - this->ZT) > state.dataHeatBal->TempConvergTol) { - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = (TempSupplyAir - thisSystemNode.Temp) / (TempSupplyAir - this->ZT); - // constrain value to something reasonable - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = max(-3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = min(3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); - - } else { - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; // Indeterminate - } - } else { - // Negligible flow, assume mixed - reasonable lagged starting value for first step time with significant flow - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; - } - } else if (thisAirModel.SimAirModel && ((thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UserDefined) || - (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::Mundt))) { - if (this->SumSysMCp > DataHVACGlobals::SmallMassFlow) { - Real64 TempSupplyAir = this->SumSysMCpT / this->SumSysMCp; // Non-negligible flow, calculate supply air temperature - if (std::abs(TempSupplyAir - this->ZT) > state.dataHeatBal->TempConvergTol) { - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = (TempSupplyAir - thisSystemNode.Temp) / (TempSupplyAir - this->ZT); - // constrain value - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = max(-3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = min(3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); - - } else { - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; // Indeterminate - } - } else { - // Negligible flow, assume mixed - reasonable lagged starting value for first step time with significant flow - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; - } - } else if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - // Zone node used in the RoomAirflowNetwork model - this->ZT = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum) - .Node(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).ControlAirNodeID) - .AirTemp; - thisSystemNode.Temp = this->ZT; - // SpaceHB TODO: What to do here if this is for space - if (spaceNum == 0) { - state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; - } - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; - } else { - thisSystemNode.Temp = this->ZT; - // SpaceHB TODO: What to do here if this is for space - if (spaceNum == 0) { - state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; - } - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; - } - } - - // Sensible load is the enthalpy into the zone minus the enthalpy that leaves the zone. - Real64 CpAir = Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat); - Real64 ZoneEnthalpyIn = this->SumSysMCpT; - - // SNLOAD is the single zone load, without Zone Multiplier or Zone List Multiplier - SNLoad = ZoneEnthalpyIn - (thisSystemNode.MassFlowRate / ZoneMult) * CpAir * thisSystemNode.Temp + this->NonAirSystemResponse / ZoneMult + - this->SysDepZoneLoadsLagged; - - } else { - - // Heat balance coefficients for uncontrolled zone, i.e. without system air flow - this->TempDepCoef = this->SumHA + this->SumMCp; - this->TempIndCoef = this->SumIntGain + this->SumHATsurf - this->SumHATref + this->SumMCpT; - - if (state.afn->distribution_simulated) { - this->TempIndCoef += state.afn->exchangeData(zoneNum).TotalSen; - } - - // Solve for zone air temperature - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - this->ZT = (this->TempIndCoef + this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2])) / - ((11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef); - // Exact solution - } break; - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepCoef == 0.0) { // B=0 - this->ZT = this->ZoneT1 + this->TempIndCoef / this->AirPowerCap; - } else { - this->ZT = (this->ZoneT1 - this->TempIndCoef / this->TempDepCoef) * std::exp(min(700.0, -this->TempDepCoef / this->AirPowerCap)) + - this->TempIndCoef / this->TempDepCoef; - } - } break; - case DataHeatBalance::SolutionAlgo::EulerMethod: { - this->ZT = (this->AirPowerCap * this->ZoneT1 + this->TempIndCoef) / (this->AirPowerCap + this->TempDepCoef); - } break; - default: - break; - } - - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - this->ZT = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum) - .Node(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).ControlAirNodeID) - .AirTemp; - } - } - - // No sensible load - SNLoad = 0.0; - } - - // Hybrid modeling start - // SpaceHB TODO: For now, hybrid model is only for zones - if (spaceNum == 0 && state.dataHybridModel->FlagHybridModel) { - if ((state.dataHybridModel->HybridModelZone(zoneNum).InfiltrationCalc_T || - state.dataHybridModel->HybridModelZone(zoneNum).InternalThermalMassCalc_T || - state.dataHybridModel->HybridModelZone(zoneNum).PeopleCountCalc_T) && - (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing)) { - InverseModelTemperature(state, - zoneNum, - this->SumIntGain, - this->SumIntGainExceptPeople, - this->SumHA, - this->SumHATsurf, - this->SumHATref, - this->SumMCp, - this->SumMCpT, - this->SumSysMCp, - this->SumSysMCpT, - this->AirPowerCap); - } - } - - this->MAT = this->ZT; - - // Determine sensible load heating/cooling rate and energy - if (spaceNum > 0) { - state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).reportZoneAirSystemSensibleLoads(state, SNLoad); - } else { - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).reportZoneAirSystemSensibleLoads(state, SNLoad); - } - - // Final humidity calcs - this->correctHumRat(state, zoneNum, spaceNum); - - this->ZoneAirHumRat = this->ZoneAirHumRatTemp; - this->ZoneAirRelHum = 100.0 * Psychrometrics::PsyRhFnTdbWPb(state, this->ZT, this->ZoneAirHumRat, state.dataEnvrn->OutBaroPress, RoutineName); - - // tempChange is used by HVACManager to determine if the timestep needs to be shortened. - bool isMixed = true; - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { - isMixed = !((state.dataRoomAirMod->IsZoneDV(zoneNum) && !state.dataRoomAirMod->ZoneDVMixedFlag(zoneNum)) || - (state.dataRoomAirMod->IsZoneUI(zoneNum) && !state.dataRoomAirMod->ZoneUFMixedFlag(zoneNum))); - } - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - if (isMixed) { - tempChange = max(tempChange, std::abs(this->ZT - this->ZTM[0])); - } else { - tempChange = max(tempChange, - max(std::abs(state.dataRoomAirMod->ZTOC(zoneNum) - state.dataRoomAirMod->ZTM1OC(zoneNum)), - std::abs(state.dataRoomAirMod->ZTMX(zoneNum) - state.dataRoomAirMod->ZTM1MX(zoneNum)))); - } - } break; - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: - case DataHeatBalance::SolutionAlgo::EulerMethod: { - if (isMixed) { - tempChange = max(tempChange, std::abs(this->ZT - this->ZoneT1)); - } else { - tempChange = max(tempChange, - max(std::abs(state.dataRoomAirMod->ZTOC(zoneNum) - state.dataRoomAirMod->Zone1OC(zoneNum)), - std::abs(state.dataRoomAirMod->ZTMX(zoneNum) - state.dataRoomAirMod->Zone1MX(zoneNum)))); - } - } break; - default: - break; - } - - CalcZoneComponentLoadSums(state, - zoneNum, - this->TempDepCoef, - this->TempIndCoef, - state.dataHeatBal->ZnAirRpt(zoneNum).SumIntGains, - state.dataHeatBal->ZnAirRpt(zoneNum).SumHADTsurfs, - state.dataHeatBal->ZnAirRpt(zoneNum).SumMCpDTzones, - state.dataHeatBal->ZnAirRpt(zoneNum).SumMCpDtInfil, - state.dataHeatBal->ZnAirRpt(zoneNum).SumMCpDTsystem, - state.dataHeatBal->ZnAirRpt(zoneNum).SumNonAirSystem, - state.dataHeatBal->ZnAirRpt(zoneNum).CzdTdt, - state.dataHeatBal->ZnAirRpt(zoneNum).imBalance, - state.dataHeatBal->ZnAirRpt(zoneNum).SumEnthalpyM, - state.dataHeatBal->ZnAirRpt(zoneNum).SumEnthalpyH); - return tempChange; -} - -void PushZoneTimestepHistories(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN February 2008 - - // PURPOSE OF THIS SUBROUTINE: - // push histories for timestep advancing - - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).pushZoneTimestepHistory(state, zoneNum); - if (state.dataHeatBal->doSpaceHeatBalance) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).pushZoneTimestepHistory(state, zoneNum, spaceNum); - } - } - } -} - -void ZoneSpaceHeatBalanceData::pushZoneTimestepHistory(EnergyPlusData &state, int const zoneNum, int const spaceNum) -{ - - constexpr std::string_view routineName("pushTimestepHistories"); - assert(zoneNum > 0); - - auto &thisAirModel = state.dataRoomAirMod->AirModel(zoneNum); - - // Push the temperature and humidity ratio histories - - for (int iHistory = 3; iHistory >= 1; --iHistory) { - this->XMAT[iHistory] = this->XMAT[iHistory - 1]; - this->WPrevZoneTS[iHistory] = this->WPrevZoneTS[iHistory - 1]; - } - this->XMAT[0] = this->ZTAV; // using average for whole zone time step. - this->XMPT = this->ZT; - this->WPrevZoneTS[0] = this->ZoneAirHumRatAvg; // using average for whole zone time step. - this->ZoneAirHumRat = this->ZoneAirHumRatTemp; - this->WZoneTimeMinusP = this->ZoneAirHumRatTemp; - this->ZoneAirRelHum = 100.0 * Psychrometrics::PsyRhFnTdbWPb(state, this->ZT, this->ZoneAirHumRat, state.dataEnvrn->OutBaroPress, routineName); - - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0) { - if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || - thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || - thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { - state.dataRoomAirMod->XM4TFloor(zoneNum) = state.dataRoomAirMod->XM3TFloor(zoneNum); - state.dataRoomAirMod->XM3TFloor(zoneNum) = state.dataRoomAirMod->XM2TFloor(zoneNum); - state.dataRoomAirMod->XM2TFloor(zoneNum) = state.dataRoomAirMod->XMATFloor(zoneNum); - state.dataRoomAirMod->XMATFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); - state.dataRoomAirMod->MATFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); - - state.dataRoomAirMod->XM4TOC(zoneNum) = state.dataRoomAirMod->XM3TOC(zoneNum); - state.dataRoomAirMod->XM3TOC(zoneNum) = state.dataRoomAirMod->XM2TOC(zoneNum); - state.dataRoomAirMod->XM2TOC(zoneNum) = state.dataRoomAirMod->XMATOC(zoneNum); - state.dataRoomAirMod->XMATOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); - state.dataRoomAirMod->MATOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); - - state.dataRoomAirMod->XM4TMX(zoneNum) = state.dataRoomAirMod->XM3TMX(zoneNum); - state.dataRoomAirMod->XM3TMX(zoneNum) = state.dataRoomAirMod->XM2TMX(zoneNum); - state.dataRoomAirMod->XM2TMX(zoneNum) = state.dataRoomAirMod->XMATMX(zoneNum); - state.dataRoomAirMod->XMATMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); - state.dataRoomAirMod->MATMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); - } - - // for RoomAirflowNetwork model - if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { - auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); - roomAirflowNetworkZoneInfo.AirTempX4 = roomAirflowNetworkZoneInfo.AirTempX3; - roomAirflowNetworkZoneInfo.AirTempX3 = roomAirflowNetworkZoneInfo.AirTempX2; - roomAirflowNetworkZoneInfo.AirTempX2 = roomAirflowNetworkZoneInfo.AirTempX1; - roomAirflowNetworkZoneInfo.AirTempX1 = roomAirflowNetworkZoneInfo.AirTemp; - - roomAirflowNetworkZoneInfo.HumRatX4 = roomAirflowNetworkZoneInfo.HumRatX3; - roomAirflowNetworkZoneInfo.HumRatX3 = roomAirflowNetworkZoneInfo.HumRatX2; - roomAirflowNetworkZoneInfo.HumRatX2 = roomAirflowNetworkZoneInfo.HumRatX1; - roomAirflowNetworkZoneInfo.HumRatX1 = roomAirflowNetworkZoneInfo.HumRat; - } - } - } - - if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) { - this->ZoneTM2 = this->ZoneTMX; - this->ZoneTMX = this->ZTAV; // using average for whole zone time step. - this->ZoneWM2 = this->ZoneWMX; - this->ZoneWMX = this->ZoneAirHumRatAvg; // using average for whole zone time step. - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0) { - if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || - thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || - thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { - state.dataRoomAirMod->ZoneM2Floor(zoneNum) = state.dataRoomAirMod->ZoneMXFloor(zoneNum); - state.dataRoomAirMod->ZoneMXFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); // using average for whole zone time step. - state.dataRoomAirMod->ZoneM2OC(zoneNum) = state.dataRoomAirMod->ZoneMXOC(zoneNum); - state.dataRoomAirMod->ZoneMXOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); // using average for whole zone time step. - state.dataRoomAirMod->ZoneM2MX(zoneNum) = state.dataRoomAirMod->ZoneMXMX(zoneNum); - state.dataRoomAirMod->ZoneMXMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); // using average for whole zone time step. - } - - if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { - auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); - roomAirflowNetworkZoneInfo.AirTempTM2 = roomAirflowNetworkZoneInfo.AirTempTMX; - roomAirflowNetworkZoneInfo.AirTempTMX = roomAirflowNetworkZoneInfo.AirTemp; - - roomAirflowNetworkZoneInfo.HumRatWM2 = roomAirflowNetworkZoneInfo.HumRatWMX; - roomAirflowNetworkZoneInfo.HumRatWMX = roomAirflowNetworkZoneInfo.HumRat; - } - } - } - } -} - -void PushSystemTimestepHistories(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN April 2008 - - // PURPOSE OF THIS SUBROUTINE: - // Push the temperature and humidity ratio histories back in time - - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).pushSystemTimestepHistory(state, zoneNum); - if (state.dataHeatBal->doSpaceHeatBalance) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).pushSystemTimestepHistory(state, zoneNum, spaceNum); - } - } - } -} - -void ZoneSpaceHeatBalanceData::pushSystemTimestepHistory(EnergyPlusData &state, int const zoneNum, int const spaceNum) -{ - assert(zoneNum > 0); - for (int iHistory = 3; iHistory >= 1; --iHistory) { - this->DSXMAT[iHistory] = this->DSXMAT[iHistory - 1]; - this->DSWPrevZoneTS[iHistory] = this->DSWPrevZoneTS[iHistory - 1]; - } - this->DSXMAT[0] = this->MAT; - this->DSWPrevZoneTS[0] = this->ZoneAirHumRat; - - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { - if (state.dataRoomAirMod->IsZoneDV(zoneNum) || state.dataRoomAirMod->IsZoneUI(zoneNum)) { - state.dataRoomAirMod->DSXM4TFloor(zoneNum) = state.dataRoomAirMod->DSXM3TFloor(zoneNum); - state.dataRoomAirMod->DSXM3TFloor(zoneNum) = state.dataRoomAirMod->DSXM2TFloor(zoneNum); - state.dataRoomAirMod->DSXM2TFloor(zoneNum) = state.dataRoomAirMod->DSXMATFloor(zoneNum); - state.dataRoomAirMod->DSXMATFloor(zoneNum) = state.dataRoomAirMod->MATFloor(zoneNum); - - state.dataRoomAirMod->DSXM4TOC(zoneNum) = state.dataRoomAirMod->DSXM3TOC(zoneNum); - state.dataRoomAirMod->DSXM3TOC(zoneNum) = state.dataRoomAirMod->DSXM2TOC(zoneNum); - state.dataRoomAirMod->DSXM2TOC(zoneNum) = state.dataRoomAirMod->DSXMATOC(zoneNum); - state.dataRoomAirMod->DSXMATOC(zoneNum) = state.dataRoomAirMod->MATOC(zoneNum); - - state.dataRoomAirMod->DSXM4TMX(zoneNum) = state.dataRoomAirMod->DSXM3TMX(zoneNum); - state.dataRoomAirMod->DSXM3TMX(zoneNum) = state.dataRoomAirMod->DSXM2TMX(zoneNum); - state.dataRoomAirMod->DSXM2TMX(zoneNum) = state.dataRoomAirMod->DSXMATMX(zoneNum); - state.dataRoomAirMod->DSXMATMX(zoneNum) = state.dataRoomAirMod->MATMX(zoneNum); - } - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { - auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); - roomAirflowNetworkZoneInfo.AirTempDSX4 = roomAirflowNetworkZoneInfo.AirTempDSX3; - roomAirflowNetworkZoneInfo.AirTempDSX3 = roomAirflowNetworkZoneInfo.AirTempDSX2; - roomAirflowNetworkZoneInfo.AirTempDSX2 = roomAirflowNetworkZoneInfo.AirTempDSX1; - roomAirflowNetworkZoneInfo.AirTempDSX1 = roomAirflowNetworkZoneInfo.AirTemp; - - roomAirflowNetworkZoneInfo.HumRatDSX4 = roomAirflowNetworkZoneInfo.HumRatDSX3; - roomAirflowNetworkZoneInfo.HumRatDSX3 = roomAirflowNetworkZoneInfo.HumRatDSX2; - roomAirflowNetworkZoneInfo.HumRatDSX2 = roomAirflowNetworkZoneInfo.HumRatDSX1; - roomAirflowNetworkZoneInfo.HumRatDSX1 = roomAirflowNetworkZoneInfo.HumRat; - } - } - } - - if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) { - this->ZoneTM2 = this->ZoneTMX; - this->ZoneTMX = this->MAT; // using average for whole zone time step. - this->ZoneWM2 = this->ZoneWMX; - this->ZoneWMX = this->ZoneAirHumRatTemp; // using average for whole zone time step. - - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0) { - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || - state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || - state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { - state.dataRoomAirMod->ZoneM2Floor(zoneNum) = state.dataRoomAirMod->ZoneMXFloor(zoneNum); - state.dataRoomAirMod->ZoneMXFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); // using average for whole zone time step. - state.dataRoomAirMod->ZoneM2OC(zoneNum) = state.dataRoomAirMod->ZoneMXOC(zoneNum); - state.dataRoomAirMod->ZoneMXOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); // using average for whole zone time step. - state.dataRoomAirMod->ZoneM2MX(zoneNum) = state.dataRoomAirMod->ZoneMXMX(zoneNum); - state.dataRoomAirMod->ZoneMXMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); // using average for whole zone time step. - } - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { - auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); - roomAirflowNetworkZoneInfo.AirTempTM2 = roomAirflowNetworkZoneInfo.AirTempTMX; - roomAirflowNetworkZoneInfo.AirTempTMX = roomAirflowNetworkZoneInfo.AirTemp; - - roomAirflowNetworkZoneInfo.HumRatWM2 = roomAirflowNetworkZoneInfo.HumRatWMX; - roomAirflowNetworkZoneInfo.HumRatWMX = roomAirflowNetworkZoneInfo.HumRat; - } - } - } - } -} - -void RevertZoneTimestepHistories(EnergyPlusData &state) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN February 2008 - - // PURPOSE OF THIS SUBROUTINE: - // Revert the temperature and humidity ratio histories - - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).revertZoneTimestepHistory(state, zoneNum); - if (state.dataHeatBal->doSpaceHeatBalance) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).revertZoneTimestepHistory(state, zoneNum, spaceNum); - } - } - } -} - -void ZoneSpaceHeatBalanceData::revertZoneTimestepHistory(EnergyPlusData &state, int const zoneNum, int const spaceNum) -{ - assert(zoneNum > 0); - - for (int iHistory = 0; iHistory <= 2; ++iHistory) { - this->XMAT[iHistory] = this->XMAT[iHistory + 1]; - this->WPrevZoneTS[iHistory] = this->WPrevZoneTS[iHistory + 1]; - } - - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0) { - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || - state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || - state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { - - state.dataRoomAirMod->XMATFloor(zoneNum) = state.dataRoomAirMod->XM2TFloor(zoneNum); - state.dataRoomAirMod->XM2TFloor(zoneNum) = state.dataRoomAirMod->XM3TFloor(zoneNum); - state.dataRoomAirMod->XM3TFloor(zoneNum) = state.dataRoomAirMod->XM4TFloor(zoneNum); - - state.dataRoomAirMod->XMATOC(zoneNum) = state.dataRoomAirMod->XM2TOC(zoneNum); - state.dataRoomAirMod->XM2TOC(zoneNum) = state.dataRoomAirMod->XM3TOC(zoneNum); - state.dataRoomAirMod->XM3TOC(zoneNum) = state.dataRoomAirMod->XM4TOC(zoneNum); - - state.dataRoomAirMod->XMATMX(zoneNum) = state.dataRoomAirMod->XM2TMX(zoneNum); - state.dataRoomAirMod->XM2TMX(zoneNum) = state.dataRoomAirMod->XM3TMX(zoneNum); - state.dataRoomAirMod->XM3TMX(zoneNum) = state.dataRoomAirMod->XM4TMX(zoneNum); - } - - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { - auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); - roomAirflowNetworkZoneInfo.AirTempX1 = roomAirflowNetworkZoneInfo.AirTempX2; - roomAirflowNetworkZoneInfo.AirTempX2 = roomAirflowNetworkZoneInfo.AirTempX3; - roomAirflowNetworkZoneInfo.AirTempX3 = roomAirflowNetworkZoneInfo.AirTempX4; - - roomAirflowNetworkZoneInfo.HumRatX1 = roomAirflowNetworkZoneInfo.HumRatX2; - roomAirflowNetworkZoneInfo.HumRatX2 = roomAirflowNetworkZoneInfo.HumRatX3; - roomAirflowNetworkZoneInfo.HumRatX3 = roomAirflowNetworkZoneInfo.HumRatX4; - } - } - } -} - -void ZoneSpaceHeatBalanceData::correctHumRat(EnergyPlusData &state, int const zoneNum, int const spaceNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Richard Liesen - // DATE WRITTEN 2000 - // REFERENCES: Routine FinalZnCalcs - FINAL ZONE CALCULATIONS, authored by Dale Herron for BLAST. - - assert(zoneNum > 0); - static constexpr std::string_view RoutineName("correctHumRat"); - - Real64 MoistureMassFlowRate = 0.0; - Real64 ZoneMassFlowRate = 0.0; - auto &zone = state.dataHeatBal->Zone(zoneNum); - int ZoneMult = zone.Multiplier * zone.ListMultiplier; - bool ControlledZoneAirFlag = zone.IsControlled; - bool ZoneRetPlenumAirFlag = zone.IsReturnPlenum; - bool ZoneSupPlenumAirFlag = zone.IsSupplyPlenum; - - if (ControlledZoneAirFlag) { // If there is system flow then calculate the flow rates - auto &zoneEquipConfig = state.dataZoneEquip->ZoneEquipConfig(zoneNum); - // Calculate moisture flow rate into each zone - for (int NodeNum = 1; NodeNum <= zoneEquipConfig.NumInletNodes; ++NodeNum) { - auto &inletNode = state.dataLoopNodes->Node(zoneEquipConfig.InletNode(NodeNum)); - MoistureMassFlowRate += (inletNode.MassFlowRate * inletNode.HumRat) / ZoneMult; - ZoneMassFlowRate += inletNode.MassFlowRate / ZoneMult; - } - - // Do the calculations for the plenum zone - } else if (ZoneRetPlenumAirFlag) { - int ZoneRetPlenumNum = zone.PlenumCondNum; - auto &zoneRetPlenCond = state.dataZonePlenum->ZoneRetPlenCond(ZoneRetPlenumNum); - for (int NodeNum = 1; NodeNum <= zoneRetPlenCond.NumInletNodes; ++NodeNum) { - auto &inletNode = state.dataLoopNodes->Node(zoneRetPlenCond.InletNode(NodeNum)); - MoistureMassFlowRate += (inletNode.MassFlowRate * inletNode.HumRat) / ZoneMult; - ZoneMassFlowRate += inletNode.MassFlowRate / ZoneMult; - } - // add in the leak flow - for (int ADUListIndex = 1; ADUListIndex <= zoneRetPlenCond.NumADUs; ++ADUListIndex) { - int ADUNum = zoneRetPlenCond.ADUIndex(ADUListIndex); - auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(ADUNum); - if (airDistUnit.UpStreamLeak) { - int ADUInNode = airDistUnit.InletNodeNum; - MoistureMassFlowRate += (airDistUnit.MassFlowRateUpStrLk * state.dataLoopNodes->Node(ADUInNode).HumRat) / ZoneMult; - ZoneMassFlowRate += airDistUnit.MassFlowRateUpStrLk / ZoneMult; - } - if (airDistUnit.DownStreamLeak) { - int ADUOutNode = airDistUnit.OutletNodeNum; - MoistureMassFlowRate += (airDistUnit.MassFlowRateDnStrLk * state.dataLoopNodes->Node(ADUOutNode).HumRat) / ZoneMult; - ZoneMassFlowRate += airDistUnit.MassFlowRateDnStrLk / ZoneMult; - } - } - - } else if (ZoneSupPlenumAirFlag) { - int ZoneSupPlenumNum = zone.PlenumCondNum; - auto &inletNode = state.dataLoopNodes->Node(state.dataZonePlenum->ZoneSupPlenCond(ZoneSupPlenumNum).InletNode); - MoistureMassFlowRate += (inletNode.MassFlowRate * inletNode.HumRat) / ZoneMult; - ZoneMassFlowRate += inletNode.MassFlowRate / ZoneMult; - } - - // Calculate hourly humidity ratio from infiltration + humidity added from latent load + system added moisture - Real64 LatentGain = this->ZoneLatentGain + state.dataHeatBalFanSys->SumLatentHTRadSys(zoneNum) + state.dataHeatBalFanSys->SumLatentPool(zoneNum); - - Real64 SysTimeStepInSeconds = DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys; - - // Calculate the coefficients for the 3rd order derivative for final - // zone humidity ratio. The A, B, C coefficients are analogous to the - // heat balance. There are 2 cases that should be considered, system - // operating and system shutdown. - - Real64 const RhoAir = Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->ZT, this->ZoneAirHumRat, RoutineName); - Real64 const H2OHtOfVap = Psychrometrics::PsyHgAirFnWTdb(this->ZoneAirHumRat, this->ZT); - - Real64 B = (LatentGain / H2OHtOfVap) + ((this->OAMFL + this->VAMFL + this->CTMFL) * state.dataEnvrn->OutHumRat) + this->EAMFLxHumRat + - (MoistureMassFlowRate) + this->SumHmARaW + this->MixingMassFlowXHumRat + this->MDotOA * state.dataEnvrn->OutHumRat; - Real64 A = ZoneMassFlowRate + this->OAMFL + this->VAMFL + this->EAMFL + this->CTMFL + this->SumHmARa + this->MixingMassFlowZone + this->MDotOA; - - if (state.afn->multizone_always_simulated || - (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && - state.afn->AirflowNetworkFanActivated)) { - auto &exchangeData = state.afn->exchangeData(zoneNum); - // Multizone airflow calculated in AirflowNetwork - B = (LatentGain / H2OHtOfVap) + (exchangeData.SumMHrW + exchangeData.SumMMHrW) + (MoistureMassFlowRate) + this->SumHmARaW; - A = ZoneMassFlowRate + exchangeData.SumMHr + exchangeData.SumMMHr + this->SumHmARa; - } - Real64 C = RhoAir * zone.Volume * zone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; - - if (state.afn->distribution_simulated) { - B += state.afn->exchangeData(zoneNum).TotalLat; - } - - // Use a 3rd order derivative to predict final zone humidity ratio and - // smooth the changes using the zone air capacitance. - // auto &zoneAirHumRatTemp = this->ZoneAirHumRatTemp; - // auto &zoneW1 = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).ZoneW1; - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - this->ZoneAirHumRatTemp = - (B + C * (3.0 * this->WPrevZoneTSTemp[0] - (3.0 / 2.0) * this->WPrevZoneTSTemp[1] + (1.0 / 3.0) * this->WPrevZoneTSTemp[2])) / - ((11.0 / 6.0) * C + A); - // Exact solution - } break; - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (A == 0.0) { // B=0 - this->ZoneAirHumRatTemp = this->ZoneW1 + B / C; - } else { - this->ZoneAirHumRatTemp = (this->ZoneW1 - B / A) * std::exp(min(700.0, -A / C)) + B / A; - } - } break; - case DataHeatBalance::SolutionAlgo::EulerMethod: { - this->ZoneAirHumRatTemp = (C * this->ZoneW1 + B) / (C + A); - } break; - default: - break; - } - - // Set the humidity ratio to zero if the zone has been dried out - if (this->ZoneAirHumRatTemp < 0.0) this->ZoneAirHumRatTemp = 0.0; - - // Check to make sure that is saturated there is condensation in the zone - // by resetting to saturation conditions. - Real64 const WZSat = Psychrometrics::PsyWFnTdbRhPb(state, this->ZT, 1.0, state.dataEnvrn->OutBaroPress, RoutineName); - - if (this->ZoneAirHumRatTemp > WZSat) this->ZoneAirHumRatTemp = WZSat; - - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - this->ZoneAirHumRatTemp = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum) - .Node(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).ControlAirNodeID) - .HumRat; - } - - // HybridModel with measured humidity ratio begins - // SpaceHB TODO: For now, hybrid model is only for zones - if (spaceNum == 0 && state.dataHybridModel->FlagHybridModel) { - if ((state.dataHybridModel->HybridModelZone(zoneNum).InfiltrationCalc_H || - state.dataHybridModel->HybridModelZone(zoneNum).PeopleCountCalc_H) && - (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing)) { - Real64 LatentGainExceptPeople = 0.0; - if (state.dataHybridModel->HybridModelZone(zoneNum).PeopleCountCalc_H) { - LatentGainExceptPeople = this->ZoneLatentGainExceptPeople + state.dataHeatBalFanSys->SumLatentHTRadSys(zoneNum) + - state.dataHeatBalFanSys->SumLatentPool(zoneNum); - } - - InverseModelHumidity(state, zoneNum, LatentGain, LatentGainExceptPeople, ZoneMassFlowRate, MoistureMassFlowRate, H2OHtOfVap, RhoAir); - } - } - - // Now put the calculated info into the actual zone nodes; ONLY if there is zone air flow, i.e. controlled zone or plenum zone - int ZoneNodeNum = zone.SystemZoneNodeNumber; - if (spaceNum > 0) { - ZoneNodeNum = state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber; - } - if (ZoneNodeNum > 0) { - state.dataLoopNodes->Node(ZoneNodeNum).HumRat = this->ZoneAirHumRatTemp; - state.dataLoopNodes->Node(ZoneNodeNum).Enthalpy = Psychrometrics::PsyHFnTdbW(this->ZT, this->ZoneAirHumRatTemp); - } - if (state.dataHeatBal->DoLatentSizing) { - Real64 sensibleLoad = 0.0; - Real64 pSat = Psychrometrics::PsyPsatFnTemp(state, this->ZT, RoutineName); - Real64 Tdp = Psychrometrics::PsyTdpFnWPb(state, this->ZoneAirHumRatTemp, state.dataEnvrn->StdBaroPress); - Real64 vaporPressureDiff = pSat - Psychrometrics::PsyPsatFnTemp(state, Tdp, RoutineName); - if (spaceNum > 0) { - sensibleLoad = state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).ZoneSNLoadHeatRate + - state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).ZoneSNLoadCoolRate; - state.dataZoneEnergyDemand->spaceSysMoistureDemand(spaceNum).reportZoneAirSystemMoistureLoads( - state, LatentGain, sensibleLoad, vaporPressureDiff); - } else { - sensibleLoad = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).ZoneSNLoadHeatRate + - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).ZoneSNLoadCoolRate; - state.dataZoneEnergyDemand->ZoneSysMoistureDemand(zoneNum).reportZoneAirSystemMoistureLoads( - state, LatentGain, sensibleLoad, vaporPressureDiff); - } - } -} - -void DownInterpolate4HistoryValues(Real64 const OldTimeStep, - Real64 const NewTimeStep, - Real64 const oldVal0, - Real64 const oldVal1, - Real64 const oldVal2, - Real64 &newVal0, - Real64 &newVal1, - Real64 &newVal2, - Real64 &newVal3, - Real64 &newVal4) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN Feb 2008 - - // PURPOSE OF THIS SUBROUTINE: - // provide a reusable routine for the various places that need to - // interpolate a new set of history values on a different time scale - // Once the systemtimestep has shortened, the new history terms need to be interpolated - - // METHODOLOGY EMPLOYED: - // This routine assumes that the direction is to a shorter timestep. - // The down step ratio, DSRatio = OldTimeStep/ NewTimeStep - // is expected to be roughly integer-valued and near 2.0 or 3.0 or 4.0 or more. - - // first construct data on timestamps for interpolating with later - Real64 const oldTime0 = 0.0; - Real64 const oldTime1 = oldTime0 - OldTimeStep; - - Real64 const newTime0 = 0.0; - Real64 const newTime1 = newTime0 - NewTimeStep; - Real64 const newTime2 = newTime1 - NewTimeStep; - Real64 const newTime3 = newTime2 - NewTimeStep; - Real64 const newTime4 = newTime3 - NewTimeStep; - - Real64 const DSRatio = OldTimeStep / NewTimeStep; // should pretty much be an integer value 2, 3, 4, etc. - - newVal0 = oldVal0; - - if (std::abs(DSRatio - 2.0) < 0.01) { // DSRatio = 2 - // first two points lie between oldVal0 and oldVal1 - newVal1 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime1) / (OldTimeStep)); - newVal2 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime2) / (OldTimeStep)); - // last two points lie between oldVal1 and oldVal2 - newVal3 = oldVal1 + (oldVal2 - oldVal1) * ((oldTime1 - newTime3) / (OldTimeStep)); - newVal4 = oldVal1 + (oldVal2 - oldVal1) * ((oldTime1 - newTime4) / (OldTimeStep)); - } else if (std::abs(DSRatio - 3.0) < 0.01) { // DSRatio = 3 - // first three points lie between oldVal0 and oldVal1 - newVal1 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime1) / (OldTimeStep)); - newVal2 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime2) / (OldTimeStep)); - newVal3 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime3) / (OldTimeStep)); - // last point lie between oldVal1 and oldVal2 - newVal4 = oldVal1 + (oldVal2 - oldVal1) * ((oldTime1 - newTime4) / (OldTimeStep)); - - } else { // DSRatio = 4 or more - // all new points lie between oldVal0 and oldVal1 - newVal1 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime1) / (OldTimeStep)); - newVal2 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime2) / (OldTimeStep)); - newVal3 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime3) / (OldTimeStep)); - newVal4 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime4) / (OldTimeStep)); - } -} - -Real64 DownInterpolate4HistoryValues(Real64 OldTimeStep, Real64 NewTimeStep, std::array const &oldVals, std::array &newVals) -{ - // first construct data on timestamps for interpolating with later - Real64 const oldTime0 = 0.0; - Real64 const oldTime1 = oldTime0 - OldTimeStep; - - Real64 const newTime0 = 0.0; - Real64 const newTime1 = newTime0 - NewTimeStep; - Real64 const newTime2 = newTime1 - NewTimeStep; - Real64 const newTime3 = newTime2 - NewTimeStep; - Real64 const newTime4 = newTime3 - NewTimeStep; - - Real64 const DSRatio = OldTimeStep / NewTimeStep; // should pretty much be an integer value 2, 3, 4, etc. - - if (std::abs(DSRatio - 2.0) < 0.01) { // DSRatio = 2 - // first two points lie between oldVals[0] and oldVals[1] - Real64 delta10 = oldVals[1] - oldVals[0]; - newVals[0] = oldVals[0] + delta10 * ((oldTime0 - newTime1) / OldTimeStep); - newVals[1] = oldVals[0] + delta10 * ((oldTime0 - newTime2) / OldTimeStep); - // last two points lie between oldVals[1] and oldVals[2] - Real64 delta21 = oldVals[2] - oldVals[1]; - newVals[2] = oldVals[1] + delta21 * ((oldTime1 - newTime3) / OldTimeStep); - newVals[3] = oldVals[1] + delta21 * ((oldTime1 - newTime4) / OldTimeStep); - } else if (std::abs(DSRatio - 3.0) < 0.01) { // DSRatio = 3 - // first three points lie between oldVals[0] and oldVals[1] - Real64 delta10 = oldVals[1] - oldVals[0]; - newVals[0] = oldVals[0] + delta10 * ((oldTime0 - newTime1) / OldTimeStep); - newVals[1] = oldVals[0] + delta10 * ((oldTime0 - newTime2) / OldTimeStep); - newVals[2] = oldVals[0] + delta10 * ((oldTime0 - newTime3) / OldTimeStep); - // last point lie between oldVals[1] and oldVals[2] - Real64 delta21 = (oldVals[2] - oldVals[1]) / OldTimeStep; - newVals[3] = oldVals[1] + delta21 * ((oldTime1 - newTime4) / OldTimeStep); - - } else { // DSRatio = 4 or more - // all new points lie between oldVals[0] and oldVals[1] - Real64 delta10 = oldVals[1] - oldVals[0]; - newVals[0] = oldVals[0] + delta10 * ((oldTime0 - newTime1) / OldTimeStep); - newVals[1] = oldVals[0] + delta10 * ((oldTime0 - newTime2) / OldTimeStep); - newVals[2] = oldVals[0] + delta10 * ((oldTime0 - newTime3) / OldTimeStep); - newVals[3] = oldVals[0] + delta10 * ((oldTime0 - newTime4) / OldTimeStep); - } - return oldVals[0]; - - // if (std::abs(DSRatio - 2.0) < 0.01) { // DSRatio = 2 - // // first two points lie between oldVals[0] and oldVals[1] - // Real64 ratio10 = (oldVals[1] - oldVals[0]) / OldTimeStep; - // newVals[0] = oldVals[0] + ratio10 * (oldTime0 - newTime1); - // newVals[1] = oldVals[0] + ratio10 * (oldTime0 - newTime2); - // // last two points lie between oldVals[1] and oldVals[2] - // Real64 ratio21 = (oldVals[2] - oldVals[1]) / OldTimeStep; - // newVals[2] = oldVals[1] + ratio21 * (oldTime1 - newTime3); - // newVals[3] = oldVals[1] + ratio21 * (oldTime1 - newTime4); - // } else if (std::abs(DSRatio - 3.0) < 0.01) { // DSRatio = 3 - // // first three points lie between oldVals[0] and oldVals[1] - // Real64 ratio10 = (oldVals[1] - oldVals[0]) / OldTimeStep; - // newVals[0] = oldVals[0] + ratio10 * (oldTime0 - newTime1); - // newVals[1] = oldVals[0] + ratio10 * (oldTime0 - newTime2); - // newVals[2] = oldVals[0] + ratio10 * (oldTime0 - newTime3); - // // last point lie between oldVals[1] and oldVals[2] - // Real64 ratio21 = (oldVals[2] - oldVals[1]) / OldTimeStep; - // newVals[3] = oldVals[1] + ratio21 * (oldTime1 - newTime4); - - //} else { // DSRatio = 4 or more - // // all new points lie between oldVals[0] and oldVals[1] - // Real64 ratio10 = (oldVals[1] - oldVals[0]) / OldTimeStep; - // newVals[0] = oldVals[0] + ratio10 * (oldTime0 - newTime1); - // newVals[1] = oldVals[0] + ratio10 * (oldTime0 - newTime2); - // newVals[2] = oldVals[0] + ratio10 * (oldTime0 - newTime3); - // newVals[3] = oldVals[0] + ratio10 * (oldTime0 - newTime4); - //} -} -void InverseModelTemperature(EnergyPlusData &state, - int const ZoneNum, // Zone number - Real64 const SumIntGain, // Zone sum of convective internal gains - Real64 const SumIntGainExceptPeople, // Zone sum of convective internal gains except for people - Real64 const SumHA, // Zone sum of Hc*Area - Real64 const SumHATsurf, // Zone sum of Hc*Area*Tsurf - Real64 const SumHATref, // Zone sum of Hc*Area*Tref, for ceiling diffuser convection correlation - Real64 const SumMCp, // Zone sum of MassFlowRate*Cp - Real64 const SumMCpT, // Zone sum of MassFlowRate*Cp*T - Real64 const SumSysMCp, // Zone sum of air system MassFlowRate*Cp - Real64 const SumSysMCpT, // Zone sum of air system MassFlowRate*Cp*T - Real64 const AirCap // Formerly CoefAirrat, coef in zone temp eqn with dim of "air power capacity"rd -) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Han Li - // DATE WRITTEN February 2019 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine inversely solve infiltration airflow rate or people count with zone air temperatures measurements. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 AirCapHM(0.0); // Air power capacity for hybrid modeling - Real64 AA(0.0); - Real64 BB(0.0); - Real64 FractionConvection(0.0); // Default convection portion of the sensible heat from people - - auto &zone = state.dataHeatBal->Zone(ZoneNum); - auto &hybridModelZone = state.dataHybridModel->HybridModelZone(ZoneNum); - auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); - - int ZoneMult = zone.Multiplier * zone.ListMultiplier; - zone.ZoneMeasuredTemperature = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneMeasuredTemperatureSchedulePtr); - - // HM calculation only HM calculation period start - if (state.dataEnvrn->DayOfYear >= hybridModelZone.HybridStartDayOfYear && state.dataEnvrn->DayOfYear <= hybridModelZone.HybridEndDayOfYear) { - Real64 HMMultiplierAverage(1.0); - Real64 MultpHM(1.0); - - thisZoneHB.ZT = zone.ZoneMeasuredTemperature; // Array1D ZT -- Zone - // Air Temperature Averaged over - // the System Time Increment - if (hybridModelZone.InfiltrationCalc_T && state.dataHVACGlobal->UseZoneTimeStepHistory) { - static constexpr std::string_view RoutineNameInfiltration("CalcAirFlowSimple:Infiltration"); - - if (hybridModelZone.IncludeSystemSupplyParameters) { - zone.ZoneMeasuredSupplyAirTemperature = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirTemperatureSchedulePtr); - zone.ZoneMeasuredSupplyAirFlowRate = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); - zone.ZoneMeasuredSupplyAirHumidityRatio = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); - // Calculate the air humidity ratio at supply air inlet. - Real64 CpAirInlet(0.0); - CpAirInlet = Psychrometrics::PsyCpAirFnW(zone.ZoneMeasuredSupplyAirHumidityRatio); - - Real64 SumSysMCp_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet; - Real64 SumSysMCpT_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet * zone.ZoneMeasuredSupplyAirTemperature; - - AA = SumSysMCp_HM + SumHA + thisZoneHB.MCPV + thisZoneHB.MCPM + thisZoneHB.MCPE + thisZoneHB.MCPC + thisZoneHB.MDotCPOA; - BB = SumSysMCpT_HM + SumIntGain + SumHATsurf - SumHATref + thisZoneHB.MCPTV + thisZoneHB.MCPTM + thisZoneHB.MCPTE + thisZoneHB.MCPTC + - thisZoneHB.MDotCPOA * zone.OutDryBulbTemp + (thisZoneHB.NonAirSystemResponse / ZoneMult + thisZoneHB.SysDepZoneLoadsLagged); - } else { - AA = SumHA + thisZoneHB.MCPV + thisZoneHB.MCPM + thisZoneHB.MCPE + thisZoneHB.MCPC + thisZoneHB.MDotCPOA; - BB = SumIntGain + SumHATsurf - SumHATref + thisZoneHB.MCPTV + thisZoneHB.MCPTM + thisZoneHB.MCPTE + thisZoneHB.MCPTC + - thisZoneHB.MDotCPOA * zone.OutDryBulbTemp; - } - Real64 CC = AirCap; - Real64 DD = - (3.0 * state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) - (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum) + - (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredZT3(ZoneNum)); - - Real64 delta_T = (zone.ZoneMeasuredTemperature - zone.OutDryBulbTemp); - Real64 CpAir = Psychrometrics::PsyCpAirFnW(state.dataEnvrn->OutHumRat); - Real64 AirDensity = Psychrometrics::PsyRhoAirFnPbTdbW( - state, state.dataEnvrn->OutBaroPress, zone.OutDryBulbTemp, state.dataEnvrn->OutHumRat, RoutineNameInfiltration); - zone.delta_T = delta_T; - - // s4 - Set ACH to 0 when delta_T <= 0.5, add max and min limits to ach - Real64 M_inf = 0.0; - if (std::abs(delta_T) > 0.5) { - M_inf = (BB + CC * DD - ((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredTemperature) / (CpAir * delta_T); - } - Real64 ACH_inf = max(0.0, min(10.0, (M_inf / AirDensity) / zone.Volume * DataGlobalConstants::SecInHour)); - M_inf = (ACH_inf / DataGlobalConstants::SecInHour) * zone.Volume * AirDensity; - - // Overwrite variable with inverse solution - zone.MCPIHM = M_inf; - zone.InfilOAAirChangeRateHM = ACH_inf; - - } // Hybrid model infiltration calculation end - - // Hybrid modeling internal thermal mass calculation start - if (hybridModelZone.InternalThermalMassCalc_T && SumSysMCpT == 0 && thisZoneHB.ZT != state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) && - state.dataHVACGlobal->UseZoneTimeStepHistory) { // HM calculation only when SumSysMCpT =0, - // TimeStepZone (not @ TimeStepSys) - Real64 TempDepCoef = SumHA + SumMCp + SumSysMCp; - Real64 TempIndCoef = SumIntGain + SumHATsurf - SumHATref + SumMCpT + SumSysMCpT + - (thisZoneHB.NonAirSystemResponse / ZoneMult + thisZoneHB.SysDepZoneLoadsLagged); - // TempHistoryTerm = AirCap * (3.0 * ZTM1(ZoneNum) - (3.0/2.0) * ZTM2(ZoneNum) + (1.0/3.0) * ZTM3(ZoneNum)) !debug only - - if (state.afn->distribution_simulated) { - TempIndCoef += state.afn->exchangeData(ZoneNum).TotalSen; - } - // Calculate air capacity using DataHeatBalance::SolutionAlgo::AnalyticalSolution - if (TempDepCoef == 0.0) { - // Is this correct? Shouldn't we use log?? What if thisZT == - // PreviousMeasuredZT1(ZoneNum)?? - AirCapHM = TempIndCoef / (thisZoneHB.ZT - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)); // Inverse equation - } else { - Real64 AirCapHM_temp = 0.0; - if (TempIndCoef == TempDepCoef * thisZoneHB.ZT) { - AirCapHM_temp = 0.0; // This is the denominator. - } else { - AirCapHM_temp = (TempIndCoef - TempDepCoef * state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)) / - (TempIndCoef - TempDepCoef * thisZoneHB.ZT); - } - - if ((AirCapHM_temp > 0) && (AirCapHM_temp != 1)) { // Avoide IND - AirCapHM = TempDepCoef / std::log(AirCapHM_temp); // Inverse equation - } else { - AirCapHM = TempIndCoef / (thisZoneHB.ZT - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)); - } - } - - // Calculate multiplier - if (std::abs(thisZoneHB.ZT - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)) > 0.05) { // Filter - MultpHM = AirCapHM / - (zone.Volume * - Psychrometrics::PsyRhoAirFnPbTdbW(state, - state.dataEnvrn->OutBaroPress, - thisZoneHB.ZT, - thisZoneHB.ZoneAirHumRat) * - Psychrometrics::PsyCpAirFnW(thisZoneHB.ZoneAirHumRat)) * - (state.dataGlobal->TimeStepZone * DataGlobalConstants::SecInHour); // Inverse equation - if ((MultpHM < 1.0) || (MultpHM > 30.0)) { // Temperature capacity multiplier greater than - // 1 and less than 30 - MultpHM = 1.0; // Default value 1.0 - } - } else { - MultpHM = 1.0; // Default value 1.0 - } - - zone.ZoneVolCapMultpSensHM = MultpHM; // For timestep output - - // Calculate the average multiplier of the zone for the whole running period - { - // count for hybrid model calculations - if (MultpHM > 1.0) { - zone.ZoneVolCapMultpSensHMSum += MultpHM; - zone.ZoneVolCapMultpSensHMCountSum++; - } - - // Calculate and store the multiplier average at the end of HM - // simulations - if (state.dataEnvrn->DayOfYear == hybridModelZone.HybridEndDayOfYear && state.dataGlobal->EndDayFlag) { - HMMultiplierAverage = zone.ZoneVolCapMultpSensHMSum / zone.ZoneVolCapMultpSensHMCountSum; - zone.ZoneVolCapMultpSensHMAverage = HMMultiplierAverage; - } - } - } // Hybrid model internal thermal mass calcualtion end - - // Hybrid model people count calculation - if (hybridModelZone.PeopleCountCalc_T && state.dataHVACGlobal->UseZoneTimeStepHistory) { - zone.ZoneMeasuredTemperature = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneMeasuredTemperatureSchedulePtr); - zone.ZonePeopleActivityLevel = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleActivityLevelSchedulePtr); - zone.ZonePeopleSensibleHeatFraction = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleSensibleFractionSchedulePtr); - zone.ZonePeopleRadiantHeatFraction = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleRadiationFractionSchedulePtr); - - Real64 FractionSensible = zone.ZonePeopleSensibleHeatFraction; - Real64 FractionRadiation = zone.ZonePeopleRadiantHeatFraction; - Real64 ActivityLevel = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleActivityLevelSchedulePtr); - - if (FractionSensible <= 0.0) { - FractionSensible = 0.6; - } - - if (FractionRadiation <= 0.0) { - FractionConvection = 0.7; - } else { - FractionConvection = 1.0 - FractionRadiation; - } - - if (ActivityLevel <= 0.0) { - ActivityLevel = 130.0; - } - - if (hybridModelZone.IncludeSystemSupplyParameters) { - zone.ZoneMeasuredSupplyAirTemperature = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirTemperatureSchedulePtr); - zone.ZoneMeasuredSupplyAirFlowRate = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); - zone.ZoneMeasuredSupplyAirHumidityRatio = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); - - // Calculate the air humidity ratio at supply air inlet. - Real64 CpAirInlet = Psychrometrics::PsyCpAirFnW(zone.ZoneMeasuredSupplyAirHumidityRatio); - - Real64 SumSysMCp_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet; - Real64 SumSysMCpT_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet * zone.ZoneMeasuredSupplyAirTemperature; - - AA = SumSysMCp_HM + SumHA + SumMCp; - BB = SumSysMCpT_HM + SumIntGainExceptPeople + SumHATsurf - SumHATref + SumMCpT + - (thisZoneHB.NonAirSystemResponse / ZoneMult + thisZoneHB.SysDepZoneLoadsLagged); - } else { - AA = SumHA + SumMCp; - BB = SumIntGainExceptPeople + SumHATsurf - SumHATref + SumMCpT; - } - - Real64 CC = AirCap; - Real64 DD = - (3.0 * state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) - (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum) + - (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredZT3(ZoneNum)); - - Real64 SumIntGainPeople = ((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredTemperature - BB - CC * DD; - Real64 UpperBound = max(0.0, SumIntGain / (ActivityLevel * FractionSensible * FractionConvection)); - Real64 NumPeople = min(UpperBound, max(0.0, SumIntGainPeople / (ActivityLevel * FractionSensible * FractionConvection))); - - if (NumPeople < 0.05) { - NumPeople = 0; - } - zone.NumOccHM = NumPeople; - } - } - - // Update zone temperatures in the previous steps - state.dataHeatBalFanSys->PreviousMeasuredZT3(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum); - state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum); - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) = thisZoneHB.ZT; -} - -void InverseModelHumidity(EnergyPlusData &state, - int const ZoneNum, // Zone number - Real64 const LatentGain, // Zone sum of latent gain - Real64 const LatentGainExceptPeople, // Zone sum of latent gain except for people - Real64 const ZoneMassFlowRate, // Zone air mass flow rate - Real64 const MoistureMassFlowRate, // Zone moisture mass flow rate - Real64 const H2OHtOfVap, // Heat of vaporization of air - Real64 const RhoAir // Air density -) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Han Li - // DATE WRITTEN February 2019 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine inversely solve infiltration airflow rate or people count with zone air humidity measurements. - - // SUBROUTINE PARAMETER DEFINITIONS: - static constexpr std::string_view RoutineName("InverseModelHumidity"); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 AA(0.0); - Real64 BB(0.0); - Real64 ActivityLevel(0.0); - Real64 SysTimeStepInSeconds = DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys; - - auto &zone = state.dataHeatBal->Zone(ZoneNum); - auto &hybridModelZone = state.dataHybridModel->HybridModelZone(ZoneNum); - auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); - - // Get measured zone humidity ratio - zone.ZoneMeasuredHumidityRatio = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneMeasuredHumidityRatioSchedulePtr); - - if (state.dataEnvrn->DayOfYear >= hybridModelZone.HybridStartDayOfYear && state.dataEnvrn->DayOfYear <= hybridModelZone.HybridEndDayOfYear) { - thisZoneHB.ZoneAirHumRat = zone.ZoneMeasuredHumidityRatio; - - // Hybrid Model calculate air infiltration rate - if (hybridModelZone.InfiltrationCalc_H && state.dataHVACGlobal->UseZoneTimeStepHistory) { - // Conditionally calculate the time dependent and time independent terms - if (hybridModelZone.IncludeSystemSupplyParameters) { - zone.ZoneMeasuredSupplyAirFlowRate = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); - zone.ZoneMeasuredSupplyAirHumidityRatio = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); - - Real64 SumSysM_HM = zone.ZoneMeasuredSupplyAirFlowRate; - Real64 SumSysMHumRat_HM = zone.ZoneMeasuredSupplyAirFlowRate * zone.ZoneMeasuredSupplyAirHumidityRatio; - - AA = SumSysM_HM + thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + thisZoneHB.MixingMassFlowZone + - thisZoneHB.MDotOA; - BB = SumSysMHumRat_HM + (LatentGain / H2OHtOfVap) + ((thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + - thisZoneHB.EAMFLxHumRat + thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + - thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; - } else { - AA = thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + thisZoneHB.MixingMassFlowZone + thisZoneHB.MDotOA; - BB = (LatentGain / H2OHtOfVap) + ((thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + thisZoneHB.EAMFLxHumRat + - thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; - } - - Real64 CC = RhoAir * zone.Volume * zone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; - Real64 DD = (3.0 * state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum) - - (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum) + - (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat3(ZoneNum)); - - Real64 delta_HR = (zone.ZoneMeasuredHumidityRatio - state.dataEnvrn->OutHumRat); - - Real64 AirDensity = - Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, zone.OutDryBulbTemp, state.dataEnvrn->OutHumRat, RoutineName); - - Real64 M_inf = 0.0; - if (std::abs(zone.ZoneMeasuredHumidityRatio - state.dataEnvrn->OutHumRat) > 0.0000001) { - M_inf = (CC * DD + BB - ((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredHumidityRatio) / delta_HR; - } - - // Add threshold for air change rate - Real64 ACH_inf = max(0.0, min(10.0, (M_inf / AirDensity) / zone.Volume * DataGlobalConstants::SecInHour)); - M_inf = (ACH_inf / DataGlobalConstants::SecInHour) * zone.Volume * AirDensity; - zone.MCPIHM = M_inf; - zone.InfilOAAirChangeRateHM = ACH_inf; - } - - // Hybrid Model calculate people count - if (hybridModelZone.PeopleCountCalc_H && state.dataHVACGlobal->UseZoneTimeStepHistory) { - zone.ZonePeopleActivityLevel = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleActivityLevelSchedulePtr); - zone.ZonePeopleSensibleHeatFraction = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleSensibleFractionSchedulePtr); - zone.ZonePeopleRadiantHeatFraction = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleRadiationFractionSchedulePtr); - - Real64 FractionSensible = zone.ZonePeopleSensibleHeatFraction; - - if (FractionSensible <= 0.0) { - FractionSensible = 0.6; - } - - if (ActivityLevel <= 0.0) { - ActivityLevel = 130.0; - } - - // Conditionally calculate the humidity-dependent and humidity-independent - // terms. - if (hybridModelZone.IncludeSystemSupplyParameters) { - zone.ZoneMeasuredSupplyAirFlowRate = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); - zone.ZoneMeasuredSupplyAirHumidityRatio = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); - - Real64 SumSysM_HM = zone.ZoneMeasuredSupplyAirFlowRate; - Real64 SumSysMHumRat_HM = zone.ZoneMeasuredSupplyAirFlowRate * zone.ZoneMeasuredSupplyAirHumidityRatio; - - AA = SumSysM_HM + thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + - thisZoneHB.MixingMassFlowZone + thisZoneHB.MDotOA; - BB = SumSysMHumRat_HM + (LatentGainExceptPeople / H2OHtOfVap) + - ((thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + thisZoneHB.EAMFLxHumRat + - thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; - } else { - AA = ZoneMassFlowRate + thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + - thisZoneHB.MixingMassFlowZone + thisZoneHB.MDotOA; - BB = (LatentGainExceptPeople / H2OHtOfVap) + ((thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + - thisZoneHB.EAMFLxHumRat + (MoistureMassFlowRate) + thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + - thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; - } - - Real64 CC = RhoAir * zone.Volume * zone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; - Real64 DD = (3.0 * state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum) - - (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum) + - (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat3(ZoneNum)); - - Real64 LatentGainPeople = (((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredHumidityRatio - BB - CC * DD) * H2OHtOfVap; - Real64 UpperBound = max(0.0, LatentGain / (ActivityLevel * (1.0 - FractionSensible))); - Real64 NumPeople = min(UpperBound, max(0.0, LatentGainPeople / (ActivityLevel * (1.0 - FractionSensible)))); - NumPeople = floor(NumPeople * 100.00 + 0.5) / 100.00; - if (NumPeople < 0.05) { - NumPeople = 0; - } - zone.NumOccHM = NumPeople; - } - } - - // Update zone humidity ratio in the previous steps - state.dataHeatBalFanSys->PreviousMeasuredHumRat3(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum); - state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum); - state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum) = zone.ZoneMeasuredHumidityRatio; -} - -void ZoneSpaceHeatBalanceData::calcZoneOrSpaceSums(EnergyPlusData &state, - bool const CorrectorFlag, // Corrector call flag - int const zoneNum, - int const spaceNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Peter Graham Ellis - // DATE WRITTEN July 2003 - // MODIFIED Aug 2003, FCW: add this->SumHA contributions from window frame and divider - // Aug 2003, CC: change how the reference temperatures are used - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine calculates the various sums that go into the zone heat balance - // equation. This replaces the SUMC, SumHA, and SumHAT calculations that were - // previously done in various places throughout the program. - // The SumHAT portion of the code is reproduced in RadiantSystemHighTemp and - // RadiantSystemLowTemp and should be updated accordingly. - // A reference temperature (Tref) is specified for use with the ceiling diffuser - // convection correlation. A bogus value of Tref = -999.9 defaults to using - // the zone air (i.e. outlet) temperature for the reference temperature. - // If Tref is applied to all surfaces, SumHA = 0, and SumHATref /= 0. - // If Tref is not used at all, SumHATref = 0, and SumHA /= 0. - // For future implementations, Tref can be easily converted into an array to - // allow a different reference temperature to be specified for each surface. - assert(zoneNum > 0); - - this->SumHA = 0.0; - this->SumHATsurf = 0.0; - this->SumHATref = 0.0; - this->SumSysMCp = 0.0; - this->SumSysMCpT = 0.0; - // Sum all convective internal gains: this->SumIntGain - if (spaceNum == 0) { - this->SumIntGain = InternalHeatGains::zoneSumAllInternalConvectionGains(state, zoneNum); - } else { - this->SumIntGain = InternalHeatGains::spaceSumAllInternalConvectionGains(state, spaceNum); - } - this->SumIntGain += state.dataHeatBalFanSys->SumConvHTRadSys(zoneNum) + state.dataHeatBalFanSys->SumConvPool(zoneNum); - - // Add heat to return air if zonal system (no return air) or cycling system (return air frequently very low or zero) - assert(zoneNum > 0); - auto &thisZone = state.dataHeatBal->Zone(zoneNum); - if (thisZone.NoHeatToReturnAir) { - if (spaceNum == 0) { - this->SumIntGain += InternalHeatGains::zoneSumAllReturnAirConvectionGains(state, zoneNum, 0); - } else { - this->SumIntGain += InternalHeatGains::spaceSumAllReturnAirConvectionGains(state, spaceNum, 0); - } - } - - // Sum all non-system air flow, i.e. infiltration, simple ventilation, mixing, earth tube: this->SumMCp, this->SumMCpT - this->SumMCp = this->MCPI + this->MCPV + this->MCPM + this->MCPE + this->MCPC + this->MDotCPOA; - this->SumMCpT = this->MCPTI + this->MCPTV + this->MCPTM + this->MCPTE + this->MCPTC + this->MDotCPOA * thisZone.OutDryBulbTemp; - - // Sum all multizone air flow calculated from AirflowNetwork by assuming no simple air infiltration model - if (state.afn->multizone_always_simulated || - (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && - state.afn->AirflowNetworkFanActivated)) { - auto &exchangeData = state.afn->exchangeData(zoneNum); - this->SumMCp = exchangeData.SumMCp + exchangeData.SumMVCp + exchangeData.SumMMCp; - this->SumMCpT = exchangeData.SumMCpT + exchangeData.SumMVCpT + exchangeData.SumMMCpT; - } - - // Sum all system air flow: this->SumSysMCp, this->SumSysMCpT and check to see if this is a controlled zone - if (CorrectorFlag) { - // Plenum and controlled zones have a different set of inlet nodes which must be calculated. - if (thisZone.IsControlled) { - auto const &zec(state.dataZoneEquip->ZoneEquipConfig(zoneNum)); - for (int NodeNum = 1, NodeNum_end = zec.NumInletNodes; NodeNum <= NodeNum_end; ++NodeNum) { - // Get node conditions, this next block is of interest to irratic system loads... maybe nodes are not accurate at time of call? - // how can we tell? predict step must be lagged ? correct step, systems have run. - auto const &node(state.dataLoopNodes->Node(zec.InletNode(NodeNum))); - Real64 CpAir = Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat); - Real64 const MassFlowRate_CpAir(node.MassFlowRate * CpAir); - this->SumSysMCp += MassFlowRate_CpAir; - this->SumSysMCpT += MassFlowRate_CpAir * node.Temp; - } - - } else if (thisZone.IsReturnPlenum) { - auto const &zrpc(state.dataZonePlenum->ZoneRetPlenCond(thisZone.PlenumCondNum)); - Real64 const air_hum_rat(this->ZoneAirHumRat); - for (int NodeNum = 1, NodeNum_end = zrpc.NumInletNodes; NodeNum <= NodeNum_end; ++NodeNum) { - auto const &node(state.dataLoopNodes->Node(zrpc.InletNode(NodeNum))); - Real64 const MassFlowRate_CpAir(node.MassFlowRate * Psychrometrics::PsyCpAirFnW(air_hum_rat)); - this->SumSysMCp += MassFlowRate_CpAir; - this->SumSysMCpT += MassFlowRate_CpAir * node.Temp; - } - // add in the leaks - for (int ADUListIndex = 1, ADUListIndex_end = zrpc.NumADUs; ADUListIndex <= ADUListIndex_end; ++ADUListIndex) { - auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(zrpc.ADUIndex(ADUListIndex)); - if (airDistUnit.UpStreamLeak) { - Real64 const MassFlowRate_CpAir(airDistUnit.MassFlowRateUpStrLk * Psychrometrics::PsyCpAirFnW(air_hum_rat)); - this->SumSysMCp += MassFlowRate_CpAir; - this->SumSysMCpT += MassFlowRate_CpAir * state.dataLoopNodes->Node(airDistUnit.InletNodeNum).Temp; - } - if (airDistUnit.DownStreamLeak) { - Real64 const MassFlowRate_CpAir(airDistUnit.MassFlowRateDnStrLk * Psychrometrics::PsyCpAirFnW(air_hum_rat)); - this->SumSysMCp += MassFlowRate_CpAir; - this->SumSysMCpT += MassFlowRate_CpAir * state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).Temp; - } - } - - } else if (thisZone.IsSupplyPlenum) { - Real64 MassFlowRate = state.dataLoopNodes->Node(state.dataZonePlenum->ZoneSupPlenCond(thisZone.PlenumCondNum).InletNode).MassFlowRate; - Real64 CpAir = Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat); - this->SumSysMCp += MassFlowRate * CpAir; - this->SumSysMCpT += - MassFlowRate * CpAir * state.dataLoopNodes->Node(state.dataZonePlenum->ZoneSupPlenCond(thisZone.PlenumCondNum).InletNode).Temp; - } - - int ZoneMult = thisZone.Multiplier * thisZone.ListMultiplier; - - this->SumSysMCp /= ZoneMult; - this->SumSysMCpT /= ZoneMult; - } - - if (spaceNum > 0) { - Real64 spaceFrac = state.dataHeatBal->space(spaceNum).fracZoneVolume; - this->SumSysMCp *= spaceFrac; - this->SumSysMCpT *= spaceFrac; - } - - // Sum all surface convection: this->SumHA, this->SumHATsurf, this->SumHATref (and additional contributions to this->SumIntGain) - SumHATOutput sumHATResults; // space or zone return values - sumHATResults = this->calcSumHAT(state, zoneNum, spaceNum); - this->SumIntGain += sumHATResults.sumIntGain; - this->SumHA = sumHATResults.sumHA; - this->SumHATsurf = sumHATResults.sumHATsurf; - this->SumHATref = sumHATResults.sumHATref; -} - -SumHATOutput ZoneHeatBalanceData::calcSumHAT(EnergyPlusData &state, int const zoneNum, [[maybe_unused]] int const spaceNum) -{ - assert(zoneNum > 0); - assert(spaceNum == 0); - SumHATOutput zoneResults; // zone-level return values - for (int zoneSpaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - SumHATOutput spaceResults; // temporary return value from space-level calcSumHAT - spaceResults = state.dataZoneTempPredictorCorrector->spaceHeatBalance(zoneSpaceNum).calcSumHAT(state, zoneNum, zoneSpaceNum); - zoneResults.sumIntGain += spaceResults.sumIntGain; - zoneResults.sumHA += spaceResults.sumHA; - zoneResults.sumHATsurf += spaceResults.sumHATsurf; - zoneResults.sumHATref += spaceResults.sumHATref; - } - return zoneResults; -} - -SumHATOutput SpaceHeatBalanceData::calcSumHAT(EnergyPlusData &state, int const zoneNum, int const spaceNum) -{ - assert(zoneNum > 0); - assert(spaceNum > 0); - auto &thisZone = state.dataHeatBal->Zone(zoneNum); - auto &thisSpace = state.dataHeatBal->space(spaceNum); - SumHATOutput results; // space-level return values - - for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { - Real64 HA = 0.0; - Real64 Area = state.dataSurface->Surface(SurfNum).Area; // For windows, this is the glazing area - - if (state.dataSurface->Surface(SurfNum).Class == DataSurfaces::SurfaceClass::Window) { - DataSurfaces::WinShadingType const shading_flag = state.dataSurface->SurfWinShadingFlag(SurfNum); - - // Add to the convective internal gains - if (ANY_INTERIOR_SHADE_BLIND(shading_flag)) { - // The shade area covers the area of the glazing plus the area of the dividers. - Area += state.dataSurface->SurfWinDividerArea(SurfNum); - // If interior shade or blind is present it is assumed that both the convective and IR radiative gain - // from the inside surface of the divider goes directly into the zone air -- i.e., the IR radiative - // interaction between divider and shade or blind is ignored due to the difficulty of calculating this interaction - // at the same time that the interaction between glass and shade is calculated. - results.sumIntGain += state.dataSurface->SurfWinDividerHeatGain(SurfNum); - } - - // Other convection term is applicable to equivalent layer window (ASHWAT) model - if (state.dataConstruction->Construct(state.dataSurface->Surface(SurfNum).Construction).WindowTypeEQL) - results.sumIntGain += state.dataSurface->SurfWinOtherConvHeatGain(SurfNum); - - // Convective heat gain from natural convection in gap between glass and interior shade or blind - if (ANY_INTERIOR_SHADE_BLIND(shading_flag)) results.sumIntGain += state.dataSurface->SurfWinConvHeatFlowNatural(SurfNum); - - // Convective heat gain from airflow window - if (state.dataSurface->SurfWinAirflowThisTS(SurfNum) > 0.0) { - results.sumIntGain += state.dataSurface->SurfWinConvHeatGainToZoneAir(SurfNum); - if (thisZone.NoHeatToReturnAir) { - results.sumIntGain += state.dataSurface->SurfWinRetHeatGainToZoneAir(SurfNum); - state.dataSurface->SurfWinHeatGain(SurfNum) += state.dataSurface->SurfWinRetHeatGainToZoneAir(SurfNum); - if (state.dataSurface->SurfWinHeatGain(SurfNum) >= 0.0) { - state.dataSurface->SurfWinHeatGainRep(SurfNum) = state.dataSurface->SurfWinHeatGain(SurfNum); - state.dataSurface->SurfWinHeatGainRepEnergy(SurfNum) = - state.dataSurface->SurfWinHeatGainRep(SurfNum) * state.dataGlobal->TimeStepZoneSec; - } else { - state.dataSurface->SurfWinHeatLossRep(SurfNum) = -state.dataSurface->SurfWinHeatGain(SurfNum); - state.dataSurface->SurfWinHeatLossRepEnergy(SurfNum) = - state.dataSurface->SurfWinHeatLossRep(SurfNum) * state.dataGlobal->TimeStepZoneSec; - } - state.dataSurface->SurfWinHeatTransferRepEnergy(SurfNum) = - state.dataSurface->SurfWinHeatGain(SurfNum) * state.dataGlobal->TimeStepZoneSec; - } - } - - // Add to the surface convection sums - if (state.dataSurface->SurfWinFrameArea(SurfNum) > 0.0) { - // Window frame contribution - Real64 const HA_surf(state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinFrameArea(SurfNum) * - (1.0 + state.dataSurface->SurfWinProjCorrFrIn(SurfNum))); - results.sumHATsurf += HA_surf * state.dataSurface->SurfWinFrameTempIn(SurfNum); - HA += HA_surf; - } - - if (state.dataSurface->SurfWinDividerArea(SurfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(shading_flag)) { - // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) - Real64 const HA_surf(state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinDividerArea(SurfNum) * - (1.0 + 2.0 * state.dataSurface->SurfWinProjCorrDivIn(SurfNum))); - results.sumHATsurf += HA_surf * state.dataSurface->SurfWinDividerTempIn(SurfNum); - HA += HA_surf; - } - - } // End of check if window - - HA += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * Area; - results.sumHATsurf += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * Area * state.dataHeatBalSurf->SurfTempInTmp(SurfNum); - - // determine reference air temperature for this surface - switch (state.dataSurface->SurfTAirRef(SurfNum)) { - case DataSurfaces::RefAirTemp::ZoneMeanAirTemp: - // The zone air is the reference temperature (which is to be solved for in CorrectZoneAirTemp). - results.sumHA += HA; - break; - case DataSurfaces::RefAirTemp::AdjacentAirTemp: - results.sumHATref += HA * state.dataHeatBal->SurfTempEffBulkAir(SurfNum); - break; - case DataSurfaces::RefAirTemp::ZoneSupplyAirTemp: - // check whether this zone is a controlled zone or not - if (!thisZone.IsControlled) { - ShowFatalError(state, "Zones must be controlled for Ceiling-Diffuser Convection model. No system serves zone " + thisZone.Name); - return results; - } - // determine supply air temperature as a weighted average of the inlet temperatures. - // TODO: For now, use zone-level values for system flow - if (state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).SumSysMCp > 0.0) { - results.sumHATref += HA * state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).SumSysMCpT / - state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).SumSysMCp; - } else { - // no system flow (yet) so just use zone air temperature #5906 - results.sumHA += HA; - } - break; - default: - // currently set to mean air temp but should add error warning here - results.sumHA += HA; - break; - } - - } // SurfNum - return results; -} -void CalcZoneComponentLoadSums(EnergyPlusData &state, - int const ZoneNum, // Zone number - Real64 const TempDepCoef, // Dependent coefficient - Real64 const TempIndCoef, // Independent coefficient - Real64 &SumIntGains, // Zone sum of convective internal gains - Real64 &SumHADTsurfs, // Zone sum of Hc*Area*(Tsurf - Tz) - Real64 &SumMCpDTzones, // zone sum of MassFlowRate*cp*(TremotZone - Tz) transfer air from other zone, Mixing - Real64 &SumMCpDtInfil, // Zone sum of MassFlowRate*Cp*(Tout - Tz) transfer from outside, ventil, earth tube - Real64 &SumMCpDTsystem, // Zone sum of air system MassFlowRate*Cp*(Tsup - Tz) - Real64 &SumNonAirSystem, // Zone sum of non air system convective heat gains - Real64 &CzdTdt, // Zone air energy storage term. - Real64 &imBalance, // put all terms in eq. 5 on RHS , should be zero - Real64 &SumEnthalpyM, // Zone sum of phase change material melting enthlpy - Real64 &SumEnthalpyH // Zone sum of phase change material freezing enthalpy -) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN Feb 2008 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine calculates the various sums that go into the zone heat balance - // equation for reporting (and diagnostic) purposes only. - // It was derived from CalcZoneSums but differs in that that routine - // breaks up the component's dependence on zone air temp in order to *solve* for zone air temp, - // but here we *use* the result for zone air temp and calculate the terms of the heat balance - // Go back and calculate each of the 6 terms in Equation 5 and fill report variables. - // notes on these raw terms for zone air heat balance model : - // these are state variables at the end of the last system timestep. - // they are not necessarily proper averages for what happened over entire zone time step - // these are not multiplied by zone multipliers. - // The values are all Watts. - - // REFERENCES: - // Equation 5 in Engineering Reference. - - SumIntGains = 0.0; // Zone sum of convective internal gains - SumHADTsurfs = 0.0; // Zone sum of Hc*Area*(Tsurf - Tz) - SumMCpDTzones = 0.0; // zone sum of MassFlowRate*cp*(TremotZone - Tz) transfer air from other zone, Mixing - SumMCpDtInfil = 0.0; // Zone sum of MassFlowRate*Cp*(Tout - Tz) - SumMCpDTsystem = 0.0; // Zone sum of air system MassFlowRate*Cp*(Tsup - Tz) - SumNonAirSystem = 0.0; - CzdTdt = 0.0; - imBalance = 0.0; - SumEnthalpyM = 0.0; - SumEnthalpyH = 0.0; - - auto &thisZone = state.dataHeatBal->Zone(ZoneNum); - auto const &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); - - // Sum all convective internal gains: SumIntGain - SumIntGains = InternalHeatGains::zoneSumAllInternalConvectionGains(state, ZoneNum); - - // Add heat to return air if zonal system (no return air) or cycling system (return air frequently very - // low or zero) - if (thisZone.NoHeatToReturnAir) { - SumIntGains += InternalHeatGains::zoneSumAllReturnAirConvectionGains(state, ZoneNum, 0); - } - - // sum non-system air flow transfers between zones - SumMCpDTzones = thisZoneHB.MCPTM - thisZoneHB.MCPM * thisZoneHB.MAT; // but maybe it should be ZTAV(ZoneNum) - - // Sum non-system air flow, i.e. infiltration, simple ventilation, earth tube - // reuse SumMCp, SumMCpT from CalcZoneSum but use MAT (or maybe ZTAV?) to complete - SumMCpDtInfil = (thisZoneHB.MCPTI - thisZoneHB.MCPI * thisZoneHB.MAT) + (thisZoneHB.MCPTV - thisZoneHB.MCPV * thisZoneHB.MAT) + - (thisZoneHB.MCPTE - thisZoneHB.MCPE * thisZoneHB.MAT) + (thisZoneHB.MCPTC - thisZoneHB.MCPC * thisZoneHB.MAT) + - (thisZoneHB.MDotCPOA * thisZone.OutDryBulbTemp - - thisZoneHB.MDotCPOA * thisZoneHB.MAT); // infiltration | Ventilation (simple) | Earth tube. | Cooltower | combined OA flow - - // Sum all multizone air flow calculated from AirflowNetwork by assuming no simple air infiltration model (if used) - if (state.afn->multizone_always_simulated || - (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && - state.afn->AirflowNetworkFanActivated)) { - // Multizone airflow calculated in AirflowNetwork - SumMCpDtInfil = state.afn->exchangeData(ZoneNum).SumMCpT + state.afn->exchangeData(ZoneNum).SumMVCpT - - (state.afn->exchangeData(ZoneNum).SumMCp + state.afn->exchangeData(ZoneNum).SumMVCp) * thisZoneHB.MAT; - SumMCpDTzones = state.afn->exchangeData(ZoneNum).SumMMCpT - state.afn->exchangeData(ZoneNum).SumMMCp * thisZoneHB.MAT; - } - - // Sum all system air flow: reusing how SumSysMCp, SumSysMCpT are calculated in CalcZoneSums - // Plenum and controlled zones have a different set of inlet nodes which must be calculated. - Real64 QSensRate = 0.0; - if (thisZone.IsControlled) { - auto &zoneEquipConfig = state.dataZoneEquip->ZoneEquipConfig(ZoneNum); - for (int NodeNum = 1; NodeNum <= zoneEquipConfig.NumInletNodes; ++NodeNum) { - // Get node conditions - Real64 const NodeTemp = state.dataLoopNodes->Node(zoneEquipConfig.InletNode(NodeNum)).Temp; - Real64 const MassFlowRate = state.dataLoopNodes->Node(zoneEquipConfig.InletNode(NodeNum)).MassFlowRate; - QSensRate = calcZoneSensibleOutput(MassFlowRate, NodeTemp, thisZoneHB.MAT, thisZoneHB.ZoneAirHumRat); - SumMCpDTsystem += QSensRate; - - if (zoneEquipConfig.InletNodeADUNum(NodeNum) > 0) { - auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(zoneEquipConfig.InletNodeADUNum(NodeNum)); - Real64 ADUHeatAddRate = calcZoneSensibleOutput(state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).MassFlowRate, - state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).Temp, - thisZoneHB.MAT, - thisZoneHB.ZoneAirHumRat); - airDistUnit.HeatRate = max(0.0, ADUHeatAddRate); - airDistUnit.CoolRate = std::abs(min(0.0, ADUHeatAddRate)); - airDistUnit.HeatGain = airDistUnit.HeatRate * state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour; - airDistUnit.CoolGain = airDistUnit.CoolRate * state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour; - } - } - - } else if (thisZone.IsReturnPlenum) { - auto &zoneRetPlenCond = state.dataZonePlenum->ZoneRetPlenCond(thisZone.PlenumCondNum); - for (int NodeNum = 1; NodeNum <= zoneRetPlenCond.NumInletNodes; ++NodeNum) { - QSensRate = calcZoneSensibleOutput(state.dataLoopNodes->Node(zoneRetPlenCond.InletNode(NodeNum)).MassFlowRate, - state.dataLoopNodes->Node(zoneRetPlenCond.InletNode(NodeNum)).Temp, - thisZoneHB.MAT, - thisZoneHB.ZoneAirHumRat); - SumMCpDTsystem += QSensRate; - } - // add in the leaks - for (int ADUListIndex = 1; ADUListIndex <= zoneRetPlenCond.NumADUs; ++ADUListIndex) { - auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(zoneRetPlenCond.ADUIndex(ADUListIndex)); - if (airDistUnit.UpStreamLeak) { - QSensRate = calcZoneSensibleOutput(airDistUnit.MassFlowRateUpStrLk, - state.dataLoopNodes->Node(airDistUnit.InletNodeNum).Temp, - thisZoneHB.MAT, - thisZoneHB.ZoneAirHumRat); - SumMCpDTsystem += QSensRate; - } - if (airDistUnit.DownStreamLeak) { - QSensRate = calcZoneSensibleOutput(airDistUnit.MassFlowRateDnStrLk, - state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).Temp, - thisZoneHB.MAT, - thisZoneHB.ZoneAirHumRat); - SumMCpDTsystem += QSensRate; - } - } - - } else if (thisZone.IsSupplyPlenum) { - auto &zoneSupPlenCond = state.dataZonePlenum->ZoneSupPlenCond(thisZone.PlenumCondNum); - QSensRate = calcZoneSensibleOutput(state.dataLoopNodes->Node(zoneSupPlenCond.InletNode).MassFlowRate, - state.dataLoopNodes->Node(zoneSupPlenCond.InletNode).Temp, - thisZoneHB.MAT, - thisZoneHB.ZoneAirHumRat); - SumMCpDTsystem += QSensRate; - } - - // non air system response. - SumNonAirSystem = - thisZoneHB.NonAirSystemResponse + state.dataHeatBalFanSys->SumConvHTRadSys(ZoneNum) + state.dataHeatBalFanSys->SumConvPool(ZoneNum); - - // Sum all surface convection: SumHA, SumHATsurf, SumHATref (and additional contributions to SumIntGain) - for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) { - auto &thisSpace = state.dataHeatBal->space(spaceNum); - for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { - - Real64 Area = state.dataSurface->Surface(SurfNum).Area; // For windows, this is the glazing area - Real64 RefAirTemp = state.dataSurface->Surface(SurfNum).getInsideAirTemperature(state, SurfNum); - - if (state.dataSurface->Surface(SurfNum).Class == DataSurfaces::SurfaceClass::Window) { - - // Add to the convective internal gains - if (ANY_INTERIOR_SHADE_BLIND(state.dataSurface->SurfWinShadingFlag(SurfNum))) { - // The shade area covers the area of the glazing plus the area of the dividers. - Area += state.dataSurface->SurfWinDividerArea(SurfNum); - // If interior shade or blind is present it is assumed that both the convective and IR radiative gain - // from the inside surface of the divider goes directly into the zone air -- i.e., the IR radiative - // interaction between divider and shade or blind is ignored due to the difficulty of calculating this interaction - // at the same time that the interaction between glass and shade is calculated. - SumIntGains += state.dataSurface->SurfWinDividerHeatGain(SurfNum); - } - - // Other convection term is applicable to equivalent layer window (ASHWAT) model - if (state.dataConstruction->Construct(state.dataSurface->Surface(SurfNum).Construction).WindowTypeEQL) - SumIntGains += state.dataSurface->SurfWinOtherConvHeatGain(SurfNum); - - // Convective heat gain from natural convection in gap between glass and interior shade or blind - if (ANY_INTERIOR_SHADE_BLIND(state.dataSurface->SurfWinShadingFlag(SurfNum))) - SumIntGains += state.dataSurface->SurfWinConvHeatFlowNatural(SurfNum); - - // Convective heat gain from airflow window - if (state.dataSurface->SurfWinAirflowThisTS(SurfNum) > 0.0) { - SumIntGains += state.dataSurface->SurfWinConvHeatGainToZoneAir(SurfNum); - if (thisZone.NoHeatToReturnAir) { - SumIntGains += state.dataSurface->SurfWinRetHeatGainToZoneAir(SurfNum); - } - } - - // Add to the surface convection sums - if (state.dataSurface->SurfWinFrameArea(SurfNum) > 0.0) { - // Window frame contribution - SumHADTsurfs += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinFrameArea(SurfNum) * - (1.0 + state.dataSurface->SurfWinProjCorrFrIn(SurfNum)) * - (state.dataSurface->SurfWinFrameTempIn(SurfNum) - RefAirTemp); - } - - if (state.dataSurface->SurfWinDividerArea(SurfNum) > 0.0 && - !ANY_INTERIOR_SHADE_BLIND(state.dataSurface->SurfWinShadingFlag(SurfNum))) { - // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) - SumHADTsurfs += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinDividerArea(SurfNum) * - (1.0 + 2.0 * state.dataSurface->SurfWinProjCorrDivIn(SurfNum)) * - (state.dataSurface->SurfWinDividerTempIn(SurfNum) - RefAirTemp); - } - - } // End of check if window - - SumHADTsurfs += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * Area * (state.dataHeatBalSurf->SurfTempInTmp(SurfNum) - RefAirTemp); - - // Accumulate Zone Phase Change Material Melting/Freezing Enthalpy output variables - if (state.dataSurface->Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD) { - state.dataHeatBal->ZnAirRpt(ZoneNum).SumEnthalpyM += state.dataHeatBalFiniteDiffMgr->SurfaceFD(SurfNum).EnthalpyM; - state.dataHeatBal->ZnAirRpt(ZoneNum).SumEnthalpyH += state.dataHeatBalFiniteDiffMgr->SurfaceFD(SurfNum).EnthalpyF; - } - } - } - // now calculate air energy storage source term. - // capacitance is volume * density * heat capacity - Real64 CpAir = Psychrometrics::PsyCpAirFnW(thisZoneHB.ZoneAirHumRat); - Real64 RhoAir = Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, thisZoneHB.MAT, thisZoneHB.ZoneAirHumRat); - - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - CzdTdt = RhoAir * CpAir * thisZone.Volume * thisZone.ZoneVolCapMultpSens * (thisZoneHB.MAT - thisZoneHB.ZTM[0]) / - (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); - // Exact solution - } break; - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - CzdTdt = TempIndCoef - TempDepCoef * thisZoneHB.MAT; - } break; - case DataHeatBalance::SolutionAlgo::EulerMethod: { - CzdTdt = thisZoneHB.AirPowerCap * (thisZoneHB.MAT - thisZoneHB.ZoneT1); - } break; - default: - break; - } - - if (state.dataGlobal->DisplayZoneAirHeatBalanceOffBalance) { - imBalance = SumIntGains + SumHADTsurfs + SumMCpDTzones + SumMCpDtInfil + SumMCpDTsystem + SumNonAirSystem - CzdTdt; - - // throw warning if seriously out of balance (this may need to be removed if too noisy... ) - // formulate dynamic threshold value based on 20% of quadrature sum of components - Real64 Threshold = 0.2 * std::sqrt(pow_2(SumIntGains) + pow_2(SumHADTsurfs) + pow_2(SumMCpDTzones) + pow_2(SumMCpDtInfil) + - pow_2(SumMCpDTsystem) + pow_2(SumNonAirSystem) + pow_2(CzdTdt)); - if ((std::abs(imBalance) > Threshold) && (!state.dataGlobal->WarmupFlag) && - (!state.dataGlobal->DoingSizing)) { // air balance is out by more than threshold - if (thisZone.AirHBimBalanceErrIndex == 0) { - ShowWarningMessage(state, format("Zone Air Heat Balance is out of balance for zone named {}", thisZone.Name)); - ShowContinueError(state, format("Zone Air Heat Balance Deviation Rate is more than {:.1R} {{W}}", Threshold)); - if (state.dataHVACGlobal->TurnFansOn) { - ShowContinueError(state, "Night cycle fan operation may be causing above error"); - } - - ShowContinueErrorTimeStamp(state, " Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - format("Zone Air Heat Balance is out of balance ... zone named {}", thisZone.Name), - thisZone.AirHBimBalanceErrIndex, - std::abs(imBalance) - Threshold, - std::abs(imBalance) - Threshold, - _, - "{W}", - "{W}"); - } - } -} - -bool VerifyThermostatInZone(EnergyPlusData &state, std::string const &ZoneName) // Zone to verify -{ - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN Feb 2005 - - // PURPOSE OF THIS FUNCTION: - // This function verifies that a zone (by name) has a Zone Control:Thermostatic object entered. - - if (state.dataZoneCtrls->GetZoneAirStatsInputFlag) { - GetZoneAirSetPoints(state); - state.dataZoneCtrls->GetZoneAirStatsInputFlag = false; - } - if (state.dataZoneCtrls->NumTempControlledZones > 0) { - if (UtilityRoutines::FindItemInList(ZoneName, state.dataZoneCtrls->TempControlledZone, &DataZoneControls::ZoneTempControls::ZoneName) > 0) { - return true; - } else { - return false; - } - } - return false; -} - -bool VerifyControlledZoneForThermostat(EnergyPlusData &state, std::string const &ZoneName) // Zone to verify -{ - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN Mar 2007 - - // PURPOSE OF THIS FUNCTION: - // This function verifies that a zone (by name) has a ZoneHVAC:EquipmentConnections object entered. - - return (UtilityRoutines::FindItemInList(ZoneName, state.dataZoneEquip->ZoneEquipConfig, &DataZoneEquipment::EquipConfiguration::ZoneName) > 0); -} - -void DetectOscillatingZoneTemp(EnergyPlusData &state) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Jason Glazer - // DATE WRITTEN August 2005 - - // PURPOSE OF THIS SUBROUTINE: - // Oscillating temperatures between HVAC timesteps indicate that the - // simulation may be poor. Code is trying to be fast since the purpose - // is to see the impact on oscillating by trying longer time steps in - // an attempt to speed up the simulation. - // Note that the OscillateMagnitude threshold must be less than - // MaxZoneTempDiff since ManageHVAC keeps shortening the timestep - // until that is reached unless it goes to less than the - // MinTimeStepSys. - - // first time run allocate arrays and setup output variable - if (state.dataZoneTempPredictorCorrector->SetupOscillationOutputFlag) { - state.dataZoneTempPredictorCorrector->ZoneTempHist.allocate(4, state.dataGlobal->NumOfZones); - state.dataZoneTempPredictorCorrector->ZoneTempHist = 0.0; - state.dataZoneTempPredictorCorrector->ZoneTempOscillate.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband.dimension(state.dataGlobal->NumOfZones, 0.0); - // set up zone by zone variables, CurrentModuleObject='Zone' - for (int iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) { - auto &zone = state.dataHeatBal->Zone(iZone); - SetupOutputVariable(state, - "Zone Oscillating Temperatures Time", - OutputProcessor::Unit::hr, - state.dataZoneTempPredictorCorrector->ZoneTempOscillate(iZone), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zone.Name); - SetupOutputVariable(state, - "Zone Oscillating Temperatures During Occupancy Time", - OutputProcessor::Unit::hr, - state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy(iZone), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zone.Name); - SetupOutputVariable(state, - "Zone Oscillating Temperatures in Deadband Time", - OutputProcessor::Unit::hr, - state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband(iZone), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zone.Name); - } - // set up a variable covering all zones - SetupOutputVariable(state, - "Facility Any Zone Oscillating Temperatures Time", - OutputProcessor::Unit::hr, - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - "Facility"); - SetupOutputVariable(state, - "Facility Any Zone Oscillating Temperatures During Occupancy Time", - OutputProcessor::Unit::hr, - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateDuringOccupancy, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - "Facility"); - SetupOutputVariable(state, - "Facility Any Zone Oscillating Temperatures in Deadband Time", - OutputProcessor::Unit::hr, - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateInDeadband, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - "Facility"); - // test if the oscillation variables are even used - if (ReportingThisVariable(state, "Zone Oscillating Temperatures Time") || - ReportingThisVariable(state, "Zone Oscillating Temperatures During Occupancy Time") || - ReportingThisVariable(state, "Zone Oscillating Temperatures in Deadband Time") || - ReportingThisVariable(state, "Facility Any Zone Oscillating Temperatures Time") || - ReportingThisVariable(state, "Facility Any Zone Oscillating Temperatures During Occupancy Time") || - ReportingThisVariable(state, "Facility Any Zone Oscillating Temperatures in Deadband Time")) { - state.dataZoneTempPredictorCorrector->OscillationVariablesNeeded = true; - } - state.dataZoneTempPredictorCorrector->SetupOscillationOutputFlag = false; - } - - auto &TimeStepSys = state.dataHVACGlobal->TimeStepSys; - if (state.dataZoneTempPredictorCorrector->OscillationVariablesNeeded) { - // precalc the negative value for performance - Real64 NegOscillateMagnitude = -DataHVACGlobals::OscillateMagnitude; - // assume no zone is oscillating - bool isAnyZoneOscillating = false; - bool isAnyZoneOscillatingDuringOccupancy = false; - bool isAnyZoneOscillatingInDeadband = false; - - for (int iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) { - bool isOscillate = false; - state.dataZoneTempPredictorCorrector->ZoneTempHist(4, iZone) = state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone); - state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone) = state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone); - state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone) = state.dataZoneTempPredictorCorrector->ZoneTempHist(1, iZone); - state.dataZoneTempPredictorCorrector->ZoneTempHist(1, iZone) = state.dataZoneTempPredictorCorrector->zoneHeatBalance(iZone).ZT; - Real64 Diff34 = - state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone) - state.dataZoneTempPredictorCorrector->ZoneTempHist(4, iZone); - Real64 Diff23 = - state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone) - state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone); - Real64 Diff12 = - state.dataZoneTempPredictorCorrector->ZoneTempHist(1, iZone) - state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone); - // roll out the conditionals for increased performance - if (Diff12 > DataHVACGlobals::OscillateMagnitude) { - if (Diff23 < NegOscillateMagnitude) { - if (Diff34 > DataHVACGlobals::OscillateMagnitude) { - isOscillate = true; - } - } - } - // now try the opposite sequence of swings - if (Diff12 < NegOscillateMagnitude) { - if (Diff23 > DataHVACGlobals::OscillateMagnitude) { - if (Diff34 < NegOscillateMagnitude) { - isOscillate = true; - } - } - } - state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy(iZone) = 0.0; - state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband(iZone) = 0.0; - if (isOscillate) { - state.dataZoneTempPredictorCorrector->ZoneTempOscillate(iZone) = TimeStepSys; - isAnyZoneOscillating = true; - if (allocated(state.dataThermalComforts->ThermalComfortInASH55)) { - if (state.dataThermalComforts->ThermalComfortInASH55(iZone).ZoneIsOccupied) { - state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy(iZone) = TimeStepSys; - isAnyZoneOscillatingDuringOccupancy = true; - } - } - if (state.dataZoneEnergyDemand->CurDeadBandOrSetback(iZone)) { - state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband(iZone) = TimeStepSys; - isAnyZoneOscillatingInDeadband = true; - } - } else { - state.dataZoneTempPredictorCorrector->ZoneTempOscillate(iZone) = 0.0; - } - } - // any zone variable - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillate = (isAnyZoneOscillating) ? TimeStepSys : 0.0; - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateDuringOccupancy = (isAnyZoneOscillatingDuringOccupancy) ? TimeStepSys : 0.0; - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateInDeadband = (isAnyZoneOscillatingInDeadband) ? TimeStepSys : 0.0; - - // annual/runperiod sum for _perflog.csv file - state.dataZoneTempPredictorCorrector->AnnualAnyZoneTempOscillate += state.dataZoneTempPredictorCorrector->AnyZoneTempOscillate; - state.dataZoneTempPredictorCorrector->AnnualAnyZoneTempOscillateDuringOccupancy += - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateDuringOccupancy; - state.dataZoneTempPredictorCorrector->AnnualAnyZoneTempOscillateInDeadband += - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateInDeadband; - } -} - -void AdjustAirSetPointsforOpTempCntrl(EnergyPlusData &state, int const TempControlledZoneID, int const ActualZoneNum, Real64 &ZoneAirSetPoint) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR B. Griffith - // DATE WRITTEN June 2006 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine modifies the air temperature setpoint to effect operative temperature control - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 thisMRTFraction; // local variable for fraction that MRT is in Op Temp definition - - if (!(state.dataZoneCtrls->AnyOpTempControl)) return; // do nothing to setpoint - - auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID); - if (!(tempControlledZone.OperativeTempControl)) return; // do nothing to setpoint - - // is operative temp radiative fraction scheduled or fixed? - thisMRTFraction = (tempControlledZone.OpTempCntrlModeScheduled) - ? ScheduleManager::GetCurrentScheduleValue(state, tempControlledZone.OpTempRadiativeFractionSched) - : tempControlledZone.FixedRadiativeFraction; - - // get mean radiant temperature for zone - Real64 thisMRT = state.dataHeatBal->ZoneMRT(ActualZoneNum); - - // modify setpoint for operative temperature control - // traping for MRT fractions between 0.0 and 0.9 during get input, so shouldn't be able to divide by zero here. - ZoneAirSetPoint = (ZoneAirSetPoint - thisMRTFraction * thisMRT) / (1.0 - thisMRTFraction); -} - -void AdjustOperativeSetPointsforAdapComfort(EnergyPlusData &state, int const TempControlledZoneID, Real64 &ZoneAirSetPoint) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Xuan Luo - // DATE WRITTEN Jan 2017 - - // PURPOSE OF THIS SUBROUTINE: - // This routine adjust the operative setpoints for each controlled adaptive thermal comfort models. - - auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID); - auto &AdapComfortDailySetPointSchedule = state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule; - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int originZoneAirSetPoint = ZoneAirSetPoint; - int AdaptiveComfortModelTypeIndex = tempControlledZone.AdaptiveComfortModelTypeIndex; - - // adjust zone operative setpoint - if (!(tempControlledZone.AdaptiveComfortTempControl)) return; // do nothing to setpoint - if ((state.dataWeatherManager->Environment(state.dataWeatherManager->Envrn).KindOfEnvrn != DataGlobalConstants::KindOfSim::DesignDay) && - (state.dataWeatherManager->Environment(state.dataWeatherManager->Envrn).KindOfEnvrn != DataGlobalConstants::KindOfSim::HVACSizeDesignDay)) { - // Adjust run period cooling set point - switch (AdaptiveComfortModelTypeIndex) { - case static_cast(AdaptiveComfortModel::ASH55_CENTRAL): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central(state.dataEnvrn->DayOfYear); - break; - case static_cast(AdaptiveComfortModel::ASH55_UPPER_90): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90(state.dataEnvrn->DayOfYear); - break; - case static_cast(AdaptiveComfortModel::ASH55_UPPER_80): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80(state.dataEnvrn->DayOfYear); - break; - case static_cast(AdaptiveComfortModel::CEN15251_CENTRAL): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central(state.dataEnvrn->DayOfYear); - break; - case static_cast(AdaptiveComfortModel::CEN15251_UPPER_I): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I(state.dataEnvrn->DayOfYear); - break; - case static_cast(AdaptiveComfortModel::CEN15251_UPPER_II): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II(state.dataEnvrn->DayOfYear); - break; - case static_cast(AdaptiveComfortModel::CEN15251_UPPER_III): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III(state.dataEnvrn->DayOfYear); - break; - default: - break; - } - } else { - int const envrnDayNum(state.dataWeatherManager->Environment(state.dataWeatherManager->Envrn).DesignDayNum); - int constexpr summerDesignDayTypeIndex(9); - // Adjust summer design day set point - if (state.dataWeatherManager->DesDayInput(envrnDayNum).DayType == summerDesignDayTypeIndex) { - ZoneAirSetPoint = state.dataZoneTempPredictorCorrector->AdapComfortSetPointSummerDesDay[AdaptiveComfortModelTypeIndex - 2]; - } - } - // If adaptive operative temperature not applicable, set back - if (ZoneAirSetPoint < originZoneAirSetPoint) { - ZoneAirSetPoint = originZoneAirSetPoint; - } - // If meet fault flag, set back - if (ZoneAirSetPoint == -1) { - ZoneAirSetPoint = originZoneAirSetPoint; - } -} - -void CalcZoneAirComfortSetPoints(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Lixing Gu - // DATE WRITTEN May 2006 - - // PURPOSE OF THIS SUBROUTINE: - // This routine sets the thermal comfort setpoints for each controlled zone based on air tempeature obtained from thermal comfort models. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 SetPointLo = 0.0; - Real64 SetPointHi = 0.0; - Real64 Tset = 0.0; - int PeopleNum = 0; - int ObjectCount = 0; - Real64 PeopleCount = 0.0; - int SetPointComfortSchedIndex = 0; - int SchedTypeIndex = 0; - - // Call thermal comfort module to read zone control comfort object - if (state.dataZoneTempPredictorCorrector->CalcZoneAirComfortSetPointsFirstTimeFlag) { - ThermalComfort::ManageThermalComfort(state, true); - state.dataZoneTempPredictorCorrector->CalcZoneAirComfortSetPointsFirstTimeFlag = false; - } - - state.dataHeatBalFanSys->ComfortControlType = DataHVACGlobals::ThermostatType::Uncontrolled; // Default - - for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++RelativeZoneNum) { - - auto &comfortControlledZone = state.dataZoneCtrls->ComfortControlledZone(RelativeZoneNum); - int ActualZoneNum = comfortControlledZone.ActualZoneNum; - auto &zone = state.dataHeatBal->Zone(ActualZoneNum); - auto &comfortControlType = state.dataHeatBalFanSys->ComfortControlType(ActualZoneNum); - auto &comfortControlTypeRpt = state.dataHeatBalFanSys->ComfortControlTypeRpt(ActualZoneNum); - auto &tempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ActualZoneNum); - auto &zoneComfortControlsFanger = state.dataHeatBalFanSys->ZoneComfortControlsFanger(ActualZoneNum); - comfortControlType = - static_cast(ScheduleManager::GetCurrentScheduleValue(state, comfortControlledZone.ComfortSchedIndex)); - comfortControlTypeRpt = static_cast(comfortControlType); - - // Get PMV values - switch (comfortControlType) { - case DataHVACGlobals::ThermostatType::Uncontrolled: - zoneComfortControlsFanger.LowPMV = -999.0; - zoneComfortControlsFanger.HighPMV = -999.0; - break; - case DataHVACGlobals::ThermostatType::SingleHeating: - zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::SingleHeating); - zoneComfortControlsFanger.LowPMV = ScheduleManager::GetCurrentScheduleValue( - state, - state.dataZoneTempPredictorCorrector - ->SetPointSingleHeatingFanger(comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_SingleHeating)) - .PMVSchedIndex); - zoneComfortControlsFanger.HighPMV = -999.0; - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::SingleCooling); - zoneComfortControlsFanger.LowPMV = -999.0; - zoneComfortControlsFanger.HighPMV = ScheduleManager::GetCurrentScheduleValue( - state, - state.dataZoneTempPredictorCorrector - ->SetPointSingleCoolingFanger(comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_SingleCooling)) - .PMVSchedIndex); - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - SetPointComfortSchedIndex = - state.dataZoneTempPredictorCorrector - ->SetPointSingleHeatCoolFanger(comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_SingleHeatCool)) - .PMVSchedIndex; - zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool); - zoneComfortControlsFanger.LowPMV = ScheduleManager::GetCurrentScheduleValue(state, SetPointComfortSchedIndex); - zoneComfortControlsFanger.HighPMV = ScheduleManager::GetCurrentScheduleValue(state, SetPointComfortSchedIndex); - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - SchedTypeIndex = comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_DualSetPointWithDeadBand); - zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand); - zoneComfortControlsFanger.LowPMV = ScheduleManager::GetCurrentScheduleValue( - state, state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(SchedTypeIndex).HeatPMVSchedIndex); - zoneComfortControlsFanger.HighPMV = ScheduleManager::GetCurrentScheduleValue( - state, state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(SchedTypeIndex).CoolPMVSchedIndex); - if (zoneComfortControlsFanger.LowPMV > zoneComfortControlsFanger.HighPMV) { - ++zoneComfortControlsFanger.DualPMVErrCount; - if (zoneComfortControlsFanger.DualPMVErrCount < 2) { - ShowWarningError(state, - "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint: The heating PMV setpoint is above the cooling " - "PMV setpoint in " + - state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(SchedTypeIndex).Name); - ShowContinueError(state, "The zone dual heating PMV setpoint is set to the dual cooling PMV setpoint."); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } else { - ShowRecurringWarningErrorAtEnd(state, - "The heating PMV setpoint is still above the cooling PMV setpoint", - zoneComfortControlsFanger.DualPMVErrIndex, - zoneComfortControlsFanger.LowPMV, - zoneComfortControlsFanger.LowPMV); - } - zoneComfortControlsFanger.LowPMV = zoneComfortControlsFanger.HighPMV; - } - break; - default: - ShowSevereError(state, - format("CalcZoneAirTempSetpoints: Illegal thermal control control type for Zone={}, Found value={}, in Schedule={}", - zone.Name, - comfortControlTypeRpt, - comfortControlledZone.ControlTypeSchedName)); - break; - } - - // Check Average method - switch (comfortControlledZone.AverageMethod) { - case DataZoneControls::AverageMethod::NO: - PeopleNum = comfortControlledZone.SpecificObjectNum; - if (comfortControlType == DataHVACGlobals::ThermostatType::SingleCooling) { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointLo); - } else { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, SetPointLo); - } - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointHi); - break; - case DataZoneControls::AverageMethod::SPE: - PeopleNum = comfortControlledZone.SpecificObjectNum; - if (comfortControlType == DataHVACGlobals::ThermostatType::SingleCooling) { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointLo); - } else { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, SetPointLo); - } - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointHi); - break; - case DataZoneControls::AverageMethod::OBJ: - SetPointLo = 0.0; - SetPointHi = 0.0; - for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { - if (ActualZoneNum == state.dataHeatBal->People(PeopleNum).ZonePtr) { - ++ObjectCount; - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, Tset); - SetPointLo += Tset; - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, Tset); - SetPointHi += Tset; - } - } - } - SetPointLo /= ObjectCount; - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) SetPointHi /= ObjectCount; - break; - case DataZoneControls::AverageMethod::PEO: - SetPointLo = 0.0; - SetPointHi = 0.0; - for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { - if (ActualZoneNum == state.dataHeatBal->People(PeopleNum).ZonePtr) { - int NumberOccupants = state.dataHeatBal->People(PeopleNum).NumberOfPeople * - ScheduleManager::GetCurrentScheduleValue(state, state.dataHeatBal->People(PeopleNum).NumberOfPeoplePtr); - PeopleCount += NumberOccupants; - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, Tset); - SetPointLo += Tset * NumberOccupants; - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, Tset); - SetPointHi += Tset * NumberOccupants; - } - } - } - if (PeopleCount > 0) { - SetPointLo /= PeopleCount; - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) SetPointHi /= PeopleCount; - } else { - if (comfortControlledZone.PeopleAverageErrIndex == 0) { - ShowWarningMessage(state, - "ZoneControl:Thermostat:ThermalComfort: The total number of people in Zone = " + zone.Name + - " is zero. The People Average option is not used."); - ShowContinueError(state, "The Object Average option is used instead. Simulation continues ....."); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "ZoneControl:Thermostat:ThermalComfort: The total number of people in Zone = " + zone.Name + - " is still zero. The People Average option is not used", - comfortControlledZone.PeopleAverageErrIndex, - PeopleCount, - PeopleCount); - SetPointLo = 0.0; - SetPointHi = 0.0; - for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { - if (ActualZoneNum == state.dataHeatBal->People(PeopleNum).ZonePtr) { - ++ObjectCount; - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, Tset); - SetPointLo += Tset; - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, Tset); - SetPointHi += Tset; - } - } - } - SetPointLo /= ObjectCount; - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) SetPointHi /= ObjectCount; - } - break; - default: - break; - } - - // Assign setpoint - switch (comfortControlType) { - case DataHVACGlobals::ThermostatType::Uncontrolled: - switch (state.dataHeatBalFanSys->TempControlType(ActualZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = 0.0; - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = 0.0; - break; - default: - break; - } - break; - case DataHVACGlobals::ThermostatType::SingleHeating: - if (SetPointLo < comfortControlledZone.TdbMinSetPoint) { - SetPointLo = comfortControlledZone.TdbMinSetPoint; - if (comfortControlledZone.TdbMinErrIndex < 2) { - ShowWarningMessage(state, - "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeating temperature is below the Minimum dry-bulb " - "temperature setpoint " + - comfortControlledZone.Name); - ShowContinueError(state, "The zone heating setpoint is set to the Minimum dry-bulb temperature setpoint"); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeating temperature is still below the " - "Minimum dry-bulb temperature setpoint ...", - comfortControlledZone.TdbMinErrIndex, - SetPointLo, - SetPointLo); - } - tempZoneThermostatSetPoint = SetPointLo; - state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = tempZoneThermostatSetPoint; - state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::SingleHeating; - state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - if (SetPointLo > comfortControlledZone.TdbMaxSetPoint) { - SetPointLo = comfortControlledZone.TdbMaxSetPoint; - if (comfortControlledZone.TdbMaxErrIndex == 0) { - ShowWarningMessage(state, - "ThermostatSetpoint:ThermalComfort:Fanger:SingleCooling temperature is above the Maximum dry-bulb " - "temperature setpoint " + - comfortControlledZone.Name); - ShowContinueError(state, "The zone cooling setpoint is set to the Maximum dry-bulb temperature setpoint"); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "ThermostatSetpoint:ThermalComfort:Fanger:SingleCooling temperature is still above the " - "Maximum dry-bulb temperature setpoint ...", - comfortControlledZone.TdbMaxErrIndex, - SetPointLo, - SetPointLo); - } - tempZoneThermostatSetPoint = SetPointLo; - state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = tempZoneThermostatSetPoint; - state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::SingleCooling; - state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - if (comfortControlledZone.TdbMaxSetPoint == comfortControlledZone.TdbMinSetPoint) { - SetPointLo = comfortControlledZone.TdbMaxSetPoint; - } - if (SetPointLo > comfortControlledZone.TdbMaxSetPoint) SetPointLo = comfortControlledZone.TdbMaxSetPoint; - if (SetPointLo < comfortControlledZone.TdbMinSetPoint) SetPointLo = comfortControlledZone.TdbMinSetPoint; - if (SetPointLo < comfortControlledZone.TdbMinSetPoint || SetPointLo > comfortControlledZone.TdbMaxSetPoint) { - if (comfortControlledZone.TdbHCErrIndex == 0) { - ShowWarningMessage(state, - "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeatingOrCooling temperature is above the Maximum or " - "below the Minimum dry-bulb temperature setpoint " + - comfortControlledZone.Name); - ShowContinueError(state, - "The zone setpoint is set to the Maximum dry-bulb temperature setpoint if above or the Minimum " - "dry-bulb temperature setpoint if below"); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeatingOrCooling temperature is still beyond " - "the range between Maximum and Minimum dry-bulb temperature setpoint ...", - comfortControlledZone.TdbHCErrIndex, - SetPointLo, - SetPointLo); - } - tempZoneThermostatSetPoint = SetPointLo; - state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = tempZoneThermostatSetPoint; - state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = tempZoneThermostatSetPoint; - state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::SingleHeatCool; - state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - if (SetPointLo < comfortControlledZone.TdbMinSetPoint) { - SetPointLo = comfortControlledZone.TdbMinSetPoint; - - if (comfortControlledZone.TdbDualMinErrIndex == 0) { - ShowWarningMessage(state, - "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is below the Minimum dry-bulb " - "temperature setpoint " + - comfortControlledZone.Name); - ShowContinueError(state, "The zone dual heating setpoint is set to the Minimum dry-bulb temperature setpoint"); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is still below the Minimum " - "dry-bulb temperature setpoint ...", - comfortControlledZone.TdbDualMinErrIndex, - SetPointLo, - SetPointLo); - } - if (SetPointHi > comfortControlledZone.TdbMaxSetPoint) { - SetPointHi = comfortControlledZone.TdbMaxSetPoint; - if (comfortControlledZone.TdbDualMaxErrIndex == 0) { - ShowWarningMessage(state, - format("ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is above the Maximum dry-bulb " - "temperature setpoint in zone = {}", - comfortControlledZone.Name)); - ShowContinueError(state, "The zone dual cooling setpoint is set to the Maximum dry-bulb temperature setpoint"); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is still above the Maximum " - "dry-bulb temperature setpoint ...", - comfortControlledZone.TdbDualMaxErrIndex, - SetPointLo, - SetPointLo); - } - - state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = SetPointLo; - state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = SetPointHi; - state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; - state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); - break; - default: - ShowSevereError(state, - format("CalcZoneAirComfortSetpoints: Illegal thermal control control type for Zone={}, Found value={}, in Schedule={}", - zone.Name, - comfortControlTypeRpt, - comfortControlledZone.ControlTypeSchedName)); - } - } -} - -void GetComfortSetPoints(EnergyPlusData &state, - int const PeopleNum, - int const ComfortControlNum, - Real64 const PMVSet, - Real64 &Tset // drybulb setpoint temperature for a given PMV value -) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Lixing Gu - // DATE WRITTEN May, 2006 - // PURPOSE OF THIS SUBROUTINE: - // This routine sets what the thermal comfort setpoints for each controlled zone should be based on air temperature - // obtained from thermal comfort models. This is called each time step. - - // SUBROUTINE ARGUMENT DEFINITIONS: - // 0 = Solution; 1 = Set to Min; 2 Set to Max - - // SUBROUTINE PARAMETER DEFINITIONS: - Real64 constexpr Acc(0.001); // accuracy control for SolveRoot - int constexpr MaxIter(500); // iteration control for SolveRoot - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 PMVResult = 0.0; // Calculated PMV value - int SolFla = 0; // feed back flag from SolveRoot - - auto &comfortControlledZone = state.dataZoneCtrls->ComfortControlledZone(ComfortControlNum); - Real64 Tmin = comfortControlledZone.TdbMinSetPoint; - Real64 Tmax = comfortControlledZone.TdbMaxSetPoint; - - ThermalComfort::CalcThermalComfortFanger(state, PeopleNum, Tmin, PMVResult); - Real64 PMVMin = PMVResult; - ThermalComfort::CalcThermalComfortFanger(state, PeopleNum, Tmax, PMVResult); - Real64 PMVMax = PMVResult; - if (PMVSet > PMVMin && PMVSet < PMVMax) { - - auto f = [&state, PMVSet, PeopleNum](Real64 Tset) { - Real64 PMVresult = 0.0; // resulting PMV values - ThermalComfort::CalcThermalComfortFanger(state, PeopleNum, Tset, PMVresult); - return (PMVSet - PMVresult); - }; - - General::SolveRoot(state, Acc, MaxIter, SolFla, Tset, f, Tmin, Tmax); - if (SolFla == -1) { - if (!state.dataGlobal->WarmupFlag) { - ++state.dataZoneTempPredictorCorrector->IterLimitExceededNum1; - if (state.dataZoneTempPredictorCorrector->IterLimitExceededNum1 == 1) { - ShowWarningError(state, - comfortControlledZone.Name + - ": Iteration limit exceeded calculating thermal comfort Fanger setpoint and non-converged setpoint is used"); - } else { - ShowRecurringWarningErrorAtEnd(state, - comfortControlledZone.Name + ": Iteration limit exceeded calculating thermal comfort setpoint.", - state.dataZoneTempPredictorCorrector->IterLimitErrIndex1, - Tset, - Tset); - } - } - } else if (SolFla == -2) { - if (!state.dataGlobal->WarmupFlag) { - ++state.dataZoneTempPredictorCorrector->IterLimitExceededNum2; - if (state.dataZoneTempPredictorCorrector->IterLimitExceededNum2 == 1) { - ShowWarningError( - state, - format("{}: Solution is not found in calculating thermal comfort Fanger setpoint and the minimum setpoint is used", - comfortControlledZone.Name)); - } else { - ShowRecurringWarningErrorAtEnd( - state, - format("{}: Solution is not found in calculating thermal comfort Fanger setpoint.", comfortControlledZone.Name), - state.dataZoneTempPredictorCorrector->IterLimitErrIndex2, - Tset, - Tset); - } - } - } - } else if (PMVSet < PMVMin) { - Tset = Tmin; - } else if (PMVSet > PMVMax) { - Tset = Tmax; - } -} - -void AdjustCoolingSetPointforTempAndHumidityControl(EnergyPlusData &state, - int const TempControlledZoneID, - int const ActualZoneNum // controlled zone actual zone number -) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Bereket A Nigusse, FSEC/UCF - // DATE WRITTEN Nov 2010 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine modifies the air cooling setpoint temperature to effect zone air Temperature and humidity control - // Alter the zone air cooling setpoint if the zone air relative humidity value exceeds the the zone dehumidifying relative humidity setpoint. - - Real64 ZoneOvercoolRange = 0.0; - auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID); - - if (!(state.dataZoneCtrls->AnyZoneTempAndHumidityControl)) return; // do nothing to setpoint - if (!(tempControlledZone.ZoneOvercoolControl)) return; // do nothing to setpoint - - if (tempControlledZone.OvercoolCntrlModeScheduled) { - ZoneOvercoolRange = ScheduleManager::GetCurrentScheduleValue(state, tempControlledZone.ZoneOvercoolRangeSchedIndex); - } else { - ZoneOvercoolRange = tempControlledZone.ZoneOvercoolConstRange; - } - Real64 ZoneOvercoolControlRatio = tempControlledZone.ZoneOvercoolControlRatio; - - // For Dual Setpoint thermostat the overcool range is limited by the temperature difference between cooling and heating setpoints - Real64 MaxAllowedOvercoolRange = - state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) - state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum); - if (MaxAllowedOvercoolRange > 0.0) { - ZoneOvercoolRange = min(ZoneOvercoolRange, MaxAllowedOvercoolRange); - } - // Calculate difference between zone air relative humidity and the dehumidifying setpoint - Real64 RelativeHumidityDiff = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ActualZoneNum).ZoneAirRelHum - - ScheduleManager::GetCurrentScheduleValue(state, tempControlledZone.DehumidifyingSchedIndex); - if (RelativeHumidityDiff > 0.0 && ZoneOvercoolControlRatio > 0.0) { - // proportionally reset the cooling setpoint temperature downward (zone Overcool) - ZoneOvercoolRange = min(ZoneOvercoolRange, RelativeHumidityDiff / ZoneOvercoolControlRatio); - state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) -= ZoneOvercoolRange; - } -} - -void OverrideAirSetPointsforEMSCntrl(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR L. Gu - // DATE WRITTEN June 2017 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine overrides the air temperature setpoint based on EMS - - auto &ZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo; - auto &ZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi; - - for (int Loop = 1; Loop <= state.dataZoneCtrls->NumTempControlledZones; ++Loop) { - auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(Loop); - if (tempControlledZone.EMSOverrideHeatingSetPointOn) { - int ZoneNum = tempControlledZone.ActualZoneNum; - - switch (state.dataHeatBalFanSys->TempControlType(ZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; - ZoneThermostatSetPointLo(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; - ZoneThermostatSetPointLo(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - ZoneThermostatSetPointLo(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; - break; - default: - break; - } - } - if (tempControlledZone.EMSOverrideCoolingSetPointOn) { - int ZoneNum = tempControlledZone.ActualZoneNum; - - switch (state.dataHeatBalFanSys->TempControlType(ZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleCooling: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; - ZoneThermostatSetPointHi(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; - ZoneThermostatSetPointHi(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - ZoneThermostatSetPointHi(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; - break; - default: - break; - } - } - } - - for (int Loop = 1; Loop <= state.dataZoneCtrls->NumComfortControlledZones; ++Loop) { - auto &comfortControlledZone = state.dataZoneCtrls->ComfortControlledZone(Loop); - if (comfortControlledZone.EMSOverrideHeatingSetPointOn) { - int ZoneNum = comfortControlledZone.ActualZoneNum; - switch (state.dataHeatBalFanSys->ComfortControlType(ZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; - ZoneThermostatSetPointLo(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; - ZoneThermostatSetPointLo(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - ZoneThermostatSetPointLo(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; - break; - default: - break; - } - } - - if (comfortControlledZone.EMSOverrideCoolingSetPointOn) { - int ZoneNum = comfortControlledZone.ActualZoneNum; - switch (static_cast(state.dataHeatBalFanSys->ComfortControlType(ZoneNum))) { - case DataHVACGlobals::ThermostatType::SingleCooling: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; - ZoneThermostatSetPointHi(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; - ZoneThermostatSetPointHi(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - ZoneThermostatSetPointHi(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; - break; - default: - break; - } - } - } -} - -// add values to the LEED tabular report related to schedules used by the thermostat objects -void FillPredefinedTableOnThermostatSetpoints(EnergyPlusData &state) -{ - // J.Glazer - Aug 2017 - using namespace OutputReportPredefined; - std::vector uniqSch; - uniqSch.reserve( - state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls + state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls + - state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls + state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls * 2); - Real64 setPointAt11; - Real64 setPointAt23; - int numDays; - std::string monthAssumed; - std::string monthAssumed2; - constexpr int wednesday = 4; - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls; ++idx) { - auto &singleHtgSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleHeating(idx); - if (std::find(uniqSch.begin(), uniqSch.end(), singleHtgSetpoint.TempSchedIndex) == uniqSch.end()) { - uniqSch.emplace_back(singleHtgSetpoint.TempSchedIndex); - PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, singleHtgSetpoint.TempSchedName, singleHtgSetpoint.Name); - - std::tie(setPointAt11, numDays, monthAssumed) = temperatureAndCountInSch(state, singleHtgSetpoint.TempSchedIndex, false, wednesday, 11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, singleHtgSetpoint.TempSchedName, setPointAt11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, singleHtgSetpoint.TempSchedName, numDays); - - std::tie(setPointAt23, numDays, monthAssumed) = temperatureAndCountInSch(state, singleHtgSetpoint.TempSchedIndex, false, wednesday, 23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, singleHtgSetpoint.TempSchedName, setPointAt23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, singleHtgSetpoint.TempSchedName, numDays); - - PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, singleHtgSetpoint.TempSchedName, monthAssumed); - } - } - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls; ++idx) { - auto &singleClgSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleCooling(idx); - if (std::find(uniqSch.begin(), uniqSch.end(), singleClgSetpoint.TempSchedIndex) == uniqSch.end()) { - uniqSch.emplace_back(singleClgSetpoint.TempSchedIndex); - PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, singleClgSetpoint.TempSchedName, singleClgSetpoint.Name); - - std::tie(setPointAt11, numDays, monthAssumed) = temperatureAndCountInSch(state, singleClgSetpoint.TempSchedIndex, true, wednesday, 11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, singleClgSetpoint.TempSchedName, setPointAt11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, singleClgSetpoint.TempSchedName, numDays); - - std::tie(setPointAt23, numDays, monthAssumed) = temperatureAndCountInSch(state, singleClgSetpoint.TempSchedIndex, true, wednesday, 23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, singleClgSetpoint.TempSchedName, setPointAt23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, singleClgSetpoint.TempSchedName, numDays); - - PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, singleClgSetpoint.TempSchedName, monthAssumed); - } - } - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls; ++idx) { - auto &singleHeatCoolSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool(idx); - if (std::find(uniqSch.begin(), uniqSch.end(), singleHeatCoolSetpoint.TempSchedIndex) == uniqSch.end()) { - uniqSch.emplace_back(singleHeatCoolSetpoint.TempSchedIndex); - PreDefTableEntry( - state, state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, singleHeatCoolSetpoint.TempSchedName, singleHeatCoolSetpoint.Name); - - std::string schNm = singleHeatCoolSetpoint.TempSchedName + " (summer)"; - std::tie(setPointAt11, numDays, monthAssumed) = - temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, true, wednesday, 11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, schNm, setPointAt11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, schNm, numDays); - - std::tie(setPointAt23, numDays, monthAssumed) = - temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, true, wednesday, 23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, schNm, setPointAt23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, schNm, numDays); - - schNm = singleHeatCoolSetpoint.TempSchedName + " (winter)"; - std::tie(setPointAt11, numDays, monthAssumed2) = - temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, false, wednesday, 11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, schNm, setPointAt11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, schNm, numDays); - - std::tie(setPointAt23, numDays, monthAssumed2) = - temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, false, wednesday, 23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, schNm, setPointAt23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, schNm, numDays); - - PreDefTableEntry(state, - state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, - singleHeatCoolSetpoint.TempSchedName, - monthAssumed + " and " + monthAssumed2); - } - } - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls; ++idx) { - auto &dualHeatCoolSetpoint = state.dataZoneTempPredictorCorrector->SetPointDualHeatCool(idx); - if (std::find(uniqSch.begin(), uniqSch.end(), dualHeatCoolSetpoint.HeatTempSchedIndex) == uniqSch.end()) { - uniqSch.emplace_back(dualHeatCoolSetpoint.HeatTempSchedIndex); - PreDefTableEntry(state, - state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, - dualHeatCoolSetpoint.HeatTempSetptSchedName, - dualHeatCoolSetpoint.Name); - - std::tie(setPointAt11, numDays, monthAssumed) = - temperatureAndCountInSch(state, dualHeatCoolSetpoint.HeatTempSchedIndex, false, wednesday, 11); - PreDefTableEntry( - state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, dualHeatCoolSetpoint.HeatTempSetptSchedName, setPointAt11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, dualHeatCoolSetpoint.HeatTempSetptSchedName, numDays); - - std::tie(setPointAt23, numDays, monthAssumed) = - temperatureAndCountInSch(state, dualHeatCoolSetpoint.HeatTempSchedIndex, false, wednesday, 23); - PreDefTableEntry( - state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, dualHeatCoolSetpoint.HeatTempSetptSchedName, setPointAt23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, dualHeatCoolSetpoint.HeatTempSetptSchedName, numDays); - - PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, dualHeatCoolSetpoint.HeatTempSetptSchedName, monthAssumed); - } - if (std::find(uniqSch.begin(), uniqSch.end(), dualHeatCoolSetpoint.CoolTempSchedIndex) == uniqSch.end()) { - uniqSch.emplace_back(dualHeatCoolSetpoint.CoolTempSchedIndex); - PreDefTableEntry(state, - state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, - dualHeatCoolSetpoint.CoolTempSetptSchedName, - dualHeatCoolSetpoint.Name); - - std::tie(setPointAt11, numDays, monthAssumed) = - temperatureAndCountInSch(state, dualHeatCoolSetpoint.CoolTempSchedIndex, true, wednesday, 11); - PreDefTableEntry( - state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, dualHeatCoolSetpoint.CoolTempSetptSchedName, setPointAt11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, dualHeatCoolSetpoint.CoolTempSetptSchedName, numDays); - - std::tie(setPointAt23, numDays, monthAssumed) = - temperatureAndCountInSch(state, dualHeatCoolSetpoint.CoolTempSchedIndex, true, wednesday, 23); - PreDefTableEntry( - state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, dualHeatCoolSetpoint.CoolTempSetptSchedName, setPointAt23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, dualHeatCoolSetpoint.CoolTempSetptSchedName, numDays); - - PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, dualHeatCoolSetpoint.CoolTempSetptSchedName, monthAssumed); - } - } -} - -// returns the temperature value from a schedule at a certain time for the first day of the week in either January or July -std::tuple -temperatureAndCountInSch(EnergyPlusData &state, int const scheduleIndex, bool const isSummer, int const dayOfWeek, int const hourOfDay) -{ - // J.Glazer - Aug 2017 - - // determine month to use based on hemiphere and season - int monthToUse; - if (isSummer) { - if (state.dataEnvrn->Latitude > 0.) { - monthToUse = 7; // July - summer in northern hemisphere - } else { - monthToUse = 1; // January - summer in southern hemisphere - } - } else { - if (state.dataEnvrn->Latitude > 0.) { - monthToUse = 1; // January - winter in northern hemisphere - } else { - monthToUse = 7; // July - winter in southern hemisphere - } - } - std::string monthName; - if (monthToUse == 1) { - monthName = "January"; - } else { - monthName = "July"; - } - - int jdateSelect = General::nthDayOfWeekOfMonth(state, dayOfWeek, 1, monthToUse); - - // determine number of days in year - int DaysInYear; - if (state.dataEnvrn->CurrentYearIsLeapYear) { - DaysInYear = 366; - } else { - DaysInYear = 365; - } - - // should adjust date if lands on a holiday but for now assume that it does not - - // adjust time of day for daylight savings time - int hourSelect = hourOfDay + state.dataWeatherManager->DSTIndex(jdateSelect); - - // get the value at the selected time - int constexpr firstTimeStep = 1; - int weekSchIndexSelect = state.dataScheduleMgr->Schedule(scheduleIndex).WeekSchedulePointer(jdateSelect); - int daySchIndexSelect = state.dataScheduleMgr->WeekSchedule(weekSchIndexSelect).DaySchedulePointer(dayOfWeek); - Real64 valueAtSelectTime = state.dataScheduleMgr->DaySchedule(daySchIndexSelect).TSValue(firstTimeStep, hourSelect); - int countOfSame = 0; - - // count the number of times with that same value - for (int jdateOfYear = 1; jdateOfYear <= DaysInYear; ++jdateOfYear) { - int wkSch = state.dataScheduleMgr->Schedule(scheduleIndex).WeekSchedulePointer(jdateOfYear); - if (wkSch == weekSchIndexSelect) { // if same week schedule can short circuit rest of testing and increment counter - ++countOfSame; - } else { - int daySch = state.dataScheduleMgr->WeekSchedule(wkSch).DaySchedulePointer(dayOfWeek); - if (daySch == daySchIndexSelect) { // if same day schedule can short circuit rest of testing and increment counter - ++countOfSame; - } else { - Real64 valueAt = state.dataScheduleMgr->DaySchedule(daySch).TSValue(firstTimeStep, hourSelect); - if (valueAt == valueAtSelectTime) { - ++countOfSame; - } - } - } - } - - return std::make_tuple(valueAtSelectTime, countOfSame, monthName); -} - -void ZoneSpaceHeatBalanceData::updateTemperatures(EnergyPlusData &state, - bool const ShortenTimeStepSys, - bool const UseZoneTimeStepHistory, - Real64 const PriorTimeStep, - int const zoneNum, - int const spaceNum) -{ - assert(zoneNum > 0); - if (ShortenTimeStepSys) { - // timestep has just shifted from full zone timestep to a new shorter system timestep - // throw away last updates in corrector and rewind for resimulating smaller timestep - if (spaceNum == 0) { - if (state.dataHeatBal->Zone(zoneNum).SystemZoneNodeNumber > 0) { // roll back result for zone air node, - auto &zoneNode = state.dataLoopNodes->Node(state.dataHeatBal->Zone(zoneNum).SystemZoneNodeNumber); - zoneNode.Temp = this->XMAT[0]; - state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->XMAT[0]; - zoneNode.HumRat = this->WPrevZoneTS[0]; - zoneNode.Enthalpy = Psychrometrics::PsyHFnTdbW(this->XMAT[0], this->WPrevZoneTS[0]); - } - } else { - if (state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber > 0) { // roll back result for space air node, - auto &spaceNode = state.dataLoopNodes->Node(state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber); - spaceNode.Temp = this->XMAT[0]; - state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->XMAT[0]; - spaceNode.HumRat = this->WPrevZoneTS[0]; - spaceNode.Enthalpy = Psychrometrics::PsyHFnTdbW(this->XMAT[0], this->WPrevZoneTS[0]); - } - } - - if (state.dataHVACGlobal->NumOfSysTimeSteps != - state.dataHVACGlobal->NumOfSysTimeStepsLastZoneTimeStep) { // cannot reuse existing DS data, interpolate from zone time - - this->MAT = DownInterpolate4HistoryValues(PriorTimeStep, state.dataHVACGlobal->TimeStepSys, this->XMAT, this->DSXMAT); - this->ZoneAirHumRat = - DownInterpolate4HistoryValues(PriorTimeStep, state.dataHVACGlobal->TimeStepSys, this->WPrevZoneTS, this->DSWPrevZoneTS); - - if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { - if (state.dataRoomAirMod->IsZoneDV(zoneNum) || state.dataRoomAirMod->IsZoneUI(zoneNum)) { - - DownInterpolate4HistoryValues(PriorTimeStep, - state.dataHVACGlobal->TimeStepSys, - state.dataRoomAirMod->XMATFloor(zoneNum), - state.dataRoomAirMod->XM2TFloor(zoneNum), - state.dataRoomAirMod->XM3TFloor(zoneNum), - state.dataRoomAirMod->MATFloor(zoneNum), - state.dataRoomAirMod->DSXMATFloor(zoneNum), - state.dataRoomAirMod->DSXM2TFloor(zoneNum), - state.dataRoomAirMod->DSXM3TFloor(zoneNum), - state.dataRoomAirMod->DSXM4TFloor(zoneNum)); - DownInterpolate4HistoryValues(PriorTimeStep, - state.dataHVACGlobal->TimeStepSys, - state.dataRoomAirMod->XMATOC(zoneNum), - state.dataRoomAirMod->XM2TOC(zoneNum), - state.dataRoomAirMod->XM3TOC(zoneNum), - state.dataRoomAirMod->MATOC(zoneNum), - state.dataRoomAirMod->DSXMATOC(zoneNum), - state.dataRoomAirMod->DSXM2TOC(zoneNum), - state.dataRoomAirMod->DSXM3TOC(zoneNum), - state.dataRoomAirMod->DSXM4TOC(zoneNum)); - DownInterpolate4HistoryValues(PriorTimeStep, - state.dataHVACGlobal->TimeStepSys, - state.dataRoomAirMod->XMATMX(zoneNum), - state.dataRoomAirMod->XM2TMX(zoneNum), - state.dataRoomAirMod->XM3TMX(zoneNum), - state.dataRoomAirMod->MATMX(zoneNum), - state.dataRoomAirMod->DSXMATMX(zoneNum), - state.dataRoomAirMod->DSXM2TMX(zoneNum), - state.dataRoomAirMod->DSXM3TMX(zoneNum), - state.dataRoomAirMod->DSXM4TMX(zoneNum)); - } - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { - auto &ThisRAFNNode(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode)); - DownInterpolate4HistoryValues(PriorTimeStep, - state.dataHVACGlobal->TimeStepSys, - ThisRAFNNode.AirTempX1, - ThisRAFNNode.AirTempX2, - ThisRAFNNode.AirTempX3, - ThisRAFNNode.AirTemp, - ThisRAFNNode.AirTempDSX1, - ThisRAFNNode.AirTempDSX2, - ThisRAFNNode.AirTempDSX3, - ThisRAFNNode.AirTempDSX4); - DownInterpolate4HistoryValues(PriorTimeStep, - state.dataHVACGlobal->TimeStepSys, - ThisRAFNNode.HumRatX1, - ThisRAFNNode.HumRatX2, - ThisRAFNNode.HumRatX3, - ThisRAFNNode.HumRat, - ThisRAFNNode.HumRatDSX1, - ThisRAFNNode.HumRatDSX2, - ThisRAFNNode.HumRatDSX3, - ThisRAFNNode.HumRatDSX4); - } - } - } - } else { // reuse history data in DS terms from last zone time step to preserve information that would be lost - // do nothing because DS history would have been pushed prior and should be ready - } - } - // now update the variables actually used in the balance equations. - if (UseZoneTimeStepHistory) { - this->ZTM = this->XMAT; - this->WPrevZoneTSTemp = this->WPrevZoneTS; - } else { // use down-stepped history - this->ZTM = this->DSXMAT; - this->WPrevZoneTSTemp = this->DSWPrevZoneTS; - } -} - -void ZoneSpaceHeatBalanceData::calcPredictedSystemLoad(EnergyPlusData &state, Real64 const RAFNFrac, int const zoneNum, int const spaceNum) -{ - // Calculate the predicted system load for a time step. - - assert(zoneNum > 0); - auto const &thisZone = state.dataHeatBal->Zone(zoneNum); - Real64 &thisTempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint(zoneNum); - Real64 const thisZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(zoneNum); - Real64 const thisZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(zoneNum); - bool &thisDeadBandOrSetBack = state.dataZoneEnergyDemand->DeadBandOrSetback(zoneNum); - - thisDeadBandOrSetBack = false; - Real64 ZoneSetPoint = 0.0; - Real64 totalLoad = 0.0; - Real64 LoadToHeatingSetPoint = 0.0; - Real64 LoadToCoolingSetPoint = 0.0; - - switch (state.dataHeatBalFanSys->TempControlType(zoneNum)) { - case DataHVACGlobals::ThermostatType::Uncontrolled: - // Uncontrolled Zone - LoadToHeatingSetPoint = 0.0; - LoadToCoolingSetPoint = 0.0; - totalLoad = 0.0; - break; - case DataHVACGlobals::ThermostatType::SingleHeating: - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - LoadToHeatingSetPoint = (this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd); - break; - } - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepZnLd == 0.0) { // B=0 - LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; - } else { - Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); - LoadToHeatingSetPoint = - this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - } - break; - } - case DataHeatBalance::SolutionAlgo::EulerMethod: { - LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + - this->TempDepZnLd * (thisTempZoneThermostatSetPoint) - this->TempIndZnLd; - break; - } - default: { - assert(false); - } - } - if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; - totalLoad = LoadToHeatingSetPoint; - ZoneSetPoint = thisTempZoneThermostatSetPoint; - LoadToCoolingSetPoint = LoadToHeatingSetPoint; - // for consistency with the other cases, use LE instead of LT and don't subtract 1.0 Watt as a way of pushing the zero load - // case over the threshold - if ((totalLoad) <= 0.0) thisDeadBandOrSetBack = true; - - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - LoadToCoolingSetPoint = this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; - break; - } - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepZnLd == 0.0) { // B=0 - LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; - } else { - Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); - LoadToCoolingSetPoint = - this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - } - break; - } - case DataHeatBalance::SolutionAlgo::EulerMethod: { - LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + - this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; - break; - } - default: { - assert(false); - } - } - if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; - if (thisZone.HasAdjustedReturnTempByITE && !(state.dataGlobal->BeginSimFlag)) { - LoadToCoolingSetPoint = this->TempDepZnLd * thisZone.AdjustedReturnTempByITE - this->TempIndZnLd; - } - totalLoad = LoadToCoolingSetPoint; - ZoneSetPoint = thisTempZoneThermostatSetPoint; - LoadToHeatingSetPoint = LoadToCoolingSetPoint; - // for consistency with the other cases, use GE instead of GT and don't add 1.0 Watt as a way of pushing the zero load - // case over the threshold - if ((totalLoad) >= 0.0) thisDeadBandOrSetBack = true; - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - LoadToHeatingSetPoint = (this->TempDepZnLd * (thisTempZoneThermostatSetPoint) - this->TempIndZnLd); - LoadToCoolingSetPoint = (this->TempDepZnLd * (thisTempZoneThermostatSetPoint) - this->TempIndZnLd); - break; - } - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepZnLd == 0.0) { // B=0 - LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; - LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; - } else { - Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); - LoadToHeatingSetPoint = - this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - LoadToCoolingSetPoint = - this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - } - break; - } - case DataHeatBalance::SolutionAlgo::EulerMethod: { - LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + - this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; - LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + - this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; - break; - } - default: { - assert(false); - } - } - ZoneSetPoint = thisTempZoneThermostatSetPoint; - if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; - if (RAFNFrac > 0.0) LoadToCoolingSetPoint = LoadToCoolingSetPoint / RAFNFrac; - - if (thisZone.HasAdjustedReturnTempByITE && !(state.dataGlobal->BeginSimFlag)) { - LoadToCoolingSetPoint = this->TempDepZnLd * thisZone.AdjustedReturnTempByITE - this->TempIndZnLd; - } - - // Note that LoadToHeatingSetPoint is generally not equal to LoadToCoolingSetPoint - // when the heating and cooling set-points are equal if the zone is unmixed, - // e.g. displacement ventilation or UFAD, since the stratification is generally not the same in heating and cooling modes - - // Possible combinations: - // 1/ LoadToHeatingSetPoint > 0 & LoadToCoolingSetPoint > 0 --> Heating required - // 2/ LoadToHeatingSetPoint > LoadToCoolingSetPoint --> Possible in the unmixed case but should be trapped - // as a poor choice of set-points - // 3/ LoadToHeatingSetPoint < 0 & LoadToCoolingSetPoint < 0 --> Cooling Required - // 4/ LoadToHeatingSetPoint <=0 & LoadToCoolingSetPoint >=0 --> Dead Band Operation ! includes zero load cases - // First trap bad set-points - if (LoadToHeatingSetPoint > LoadToCoolingSetPoint) { - ShowSevereError( - state, - "DataHVACGlobals::ThermostatType::SingleHeatCool: Effective heating set-point higher than effective cooling set-point - use " - "DualSetPointWithDeadBand if using unmixed air model"); - ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); - ShowContinueError(state, - format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); - ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); - ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); - ShowContinueError(state, format("Zone ThermostatSetPoint={:.2R}", thisTempZoneThermostatSetPoint)); - ShowFatalError(state, "Program terminates due to above conditions."); - } - - if (LoadToHeatingSetPoint > 0.0 && LoadToCoolingSetPoint > 0.0) { - totalLoad = LoadToHeatingSetPoint; - } else if (LoadToHeatingSetPoint < 0.0 && LoadToCoolingSetPoint < 0.0) { - totalLoad = LoadToCoolingSetPoint; - } else if (LoadToHeatingSetPoint <= 0.0 && LoadToCoolingSetPoint >= 0.0) { // deadband includes zero loads - totalLoad = 0.0; - if (thisZone.SystemZoneNodeNumber > 0) { - ZoneSetPoint = state.dataLoopNodes->Node(thisZone.SystemZoneNodeNumber).Temp; - ZoneSetPoint = max(ZoneSetPoint, thisZoneThermostatSetPointLo); // trap out of deadband - ZoneSetPoint = min(ZoneSetPoint, thisZoneThermostatSetPointHi); // trap out of deadband - } - thisDeadBandOrSetBack = true; - } else { // this should never occur! - ShowSevereError(state, - "SingleHeatCoolSetPoint: Unanticipated combination of heating and cooling loads - report to EnergyPlus Development Team"); - ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); - ShowContinueError(state, - format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); - ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); - ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); - ShowContinueError(state, format("Zone ThermostatSetPoint={:.2R}", thisTempZoneThermostatSetPoint)); - ShowFatalError(state, "Program terminates due to above conditions."); - } - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - LoadToHeatingSetPoint = (this->TempDepZnLd * (thisZoneThermostatSetPointLo) - this->TempIndZnLd); - LoadToCoolingSetPoint = (this->TempDepZnLd * (thisZoneThermostatSetPointHi) - this->TempIndZnLd); - break; - } - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepZnLd == 0.0) { // B=0 - LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) - this->TempIndZnLd; - LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) - this->TempIndZnLd; - } else { - Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); - LoadToHeatingSetPoint = - this->TempDepZnLd * (thisZoneThermostatSetPointLo - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - LoadToCoolingSetPoint = - this->TempDepZnLd * (thisZoneThermostatSetPointHi - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - } - break; - } - case DataHeatBalance::SolutionAlgo::EulerMethod: { - LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) + - this->TempDepZnLd * thisZoneThermostatSetPointLo - this->TempIndZnLd; - LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) + - this->TempDepZnLd * thisZoneThermostatSetPointHi - this->TempIndZnLd; - break; - } - default: { - assert(false); - } - } - if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; - if (RAFNFrac > 0.0) LoadToCoolingSetPoint = LoadToCoolingSetPoint / RAFNFrac; - - if (thisZone.HasAdjustedReturnTempByITE && !(state.dataGlobal->BeginSimFlag)) { - LoadToCoolingSetPoint = this->TempDepZnLd * thisZone.AdjustedReturnTempByITE - this->TempIndZnLd; - } - - // Possible combinations: - // 1/ LoadToHeatingSetPoint > 0 & LoadToCoolingSetPoint > 0 --> Heating required - // 2/ LoadToHeatingSetPoint > LoadToCoolingSetPoint --> Possible in the unmixed case but should be trapped - // as a poor choice of set-points - // 3/ LoadToHeatingSetPoint < 0 & LoadToCoolingSetPoint < 0 --> Cooling Required - // 4/ LoadToHeatingSetPoint <=0 & LoadToCoolingSetPoint >=0 --> Dead Band Operation - includes zero load cases - // First trap bad set-points - if (LoadToHeatingSetPoint > LoadToCoolingSetPoint) { - ShowSevereError(state, - "DualSetPointWithDeadBand: Effective heating set-point higher than effective cooling set-point - increase " - "deadband if using unmixed air model"); - ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); - ShowContinueError(state, - format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); - ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); - ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); - ShowContinueError(state, format("Zone Heating ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointLo)); - ShowContinueError(state, format("Zone Cooling ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointHi)); - ShowFatalError(state, "Program terminates due to above conditions."); - } - - if (LoadToHeatingSetPoint > 0.0 && LoadToCoolingSetPoint > 0.0) { - totalLoad = LoadToHeatingSetPoint; - ZoneSetPoint = thisZoneThermostatSetPointLo; - } else if (LoadToHeatingSetPoint < 0.0 && LoadToCoolingSetPoint < 0.0) { - totalLoad = LoadToCoolingSetPoint; - ZoneSetPoint = thisZoneThermostatSetPointHi; - } else if (LoadToHeatingSetPoint <= 0.0 && LoadToCoolingSetPoint >= 0.0) { // deadband includes zero loads - // this turns out to cause instabilities sometimes? that lead to setpoint errors if predictor is off. - totalLoad = 0.0; - if (thisZone.SystemZoneNodeNumber > 0) { - ZoneSetPoint = state.dataLoopNodes->Node(thisZone.SystemZoneNodeNumber).Temp; - ZoneSetPoint = max(ZoneSetPoint, thisZoneThermostatSetPointLo); // trap out of deadband - ZoneSetPoint = min(ZoneSetPoint, thisZoneThermostatSetPointHi); // trap out of deadband - } - thisDeadBandOrSetBack = true; - } else { // this should never occur! - ShowSevereError( - state, "DualSetPointWithDeadBand: Unanticipated combination of heating and cooling loads - report to EnergyPlus Development Team"); - ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); - ShowContinueError(state, - format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); - ShowContinueError(state, format("Zone Heating Set-point={:.2R}", thisZoneThermostatSetPointLo)); - ShowContinueError(state, format("Zone Cooling Set-point={:.2R}", thisZoneThermostatSetPointHi)); - ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); - ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); - ShowContinueError(state, format("Zone ThermostatSetPoint={:.2R}", thisTempZoneThermostatSetPoint)); - - ShowFatalError(state, "Program terminates due to above conditions."); - } - break; - default: - break; - } - - int systemNodeNumber = 0; - int stageNum = 0; - if (spaceNum > 0) { - systemNodeNumber = state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber; - stageNum = state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).StageNum; - assert(stageNum == state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).StageNum); - } else { - systemNodeNumber = thisZone.SystemZoneNodeNumber; - stageNum = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).StageNum; - } - // Staged control zone - if (state.dataZoneTempPredictorCorrector->NumStageCtrZone > 0) { - if (state.dataZoneCtrls->StageZoneLogic(zoneNum)) { - if (stageNum == 0) { // No load - LoadToHeatingSetPoint = 0.0; - LoadToCoolingSetPoint = 0.0; - totalLoad = 0.0; - if (systemNodeNumber > 0) { - ZoneSetPoint = state.dataLoopNodes->Node(systemNodeNumber).Temp; - ZoneSetPoint = max(ZoneSetPoint, thisZoneThermostatSetPointLo); // trap out of deadband - ZoneSetPoint = min(ZoneSetPoint, thisZoneThermostatSetPointHi); // trap out of deadband - } - thisDeadBandOrSetBack = true; - } else if (stageNum < 0) { // Cooling load - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - LoadToCoolingSetPoint = (this->TempDepZnLd * (thisZoneThermostatSetPointHi) - this->TempIndZnLd); - break; - } - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepZnLd == 0.0) { // B=0 - LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) - this->TempIndZnLd; - } else { - Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); - LoadToCoolingSetPoint = - this->TempDepZnLd * (thisZoneThermostatSetPointHi - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - } - break; - } - case DataHeatBalance::SolutionAlgo::EulerMethod: { - LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) + - this->TempDepZnLd * thisZoneThermostatSetPointHi - this->TempIndZnLd; - break; - } - default: { - assert(false); - } - } - totalLoad = LoadToCoolingSetPoint; - ZoneSetPoint = thisZoneThermostatSetPointHi; - LoadToHeatingSetPoint = LoadToCoolingSetPoint; - if ((totalLoad) >= 0.0) thisDeadBandOrSetBack = true; - } else { // Heating load - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - LoadToHeatingSetPoint = (this->TempDepZnLd * thisZoneThermostatSetPointLo - this->TempIndZnLd); - break; - } - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepZnLd == 0.0) { // B=0 - LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) - this->TempIndZnLd; - } else { - Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); - LoadToHeatingSetPoint = - this->TempDepZnLd * (thisZoneThermostatSetPointLo - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - } - break; - } - case DataHeatBalance::SolutionAlgo::EulerMethod: { - LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) + - this->TempDepZnLd * (thisZoneThermostatSetPointLo) - this->TempIndZnLd; - break; - } - default: { - assert(false); - } - } - totalLoad = LoadToHeatingSetPoint; - ZoneSetPoint = thisZoneThermostatSetPointLo; - LoadToCoolingSetPoint = LoadToHeatingSetPoint; - if ((totalLoad) <= 0.0) thisDeadBandOrSetBack = true; - } - } - } - - // If the ZoneNodeNum has been set for a Controlled Zone, then the zone setpoint is placed on the node. - if (thisZone.SystemZoneNodeNumber > 0) { - state.dataLoopNodes->Node(thisZone.SystemZoneNodeNumber).TempSetPoint = ZoneSetPoint; - } - - if (ZoneSetPoint > this->ZoneSetPointLast) { - state.dataZoneEnergyDemand->Setback(zoneNum) = true; - } else { - state.dataZoneEnergyDemand->Setback(zoneNum) = false; - } - - this->ZoneSetPointLast = ZoneSetPoint; - thisTempZoneThermostatSetPoint = ZoneSetPoint; // needed to fix Issue # 5048 - state.dataZoneEnergyDemand->CurDeadBandOrSetback(zoneNum) = thisDeadBandOrSetBack; - - // Apply the Zone Multiplier and Load Correction factor as needed - if (spaceNum > 0) { - state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).reportSensibleLoadsZoneMultiplier( - state, zoneNum, totalLoad, LoadToHeatingSetPoint, LoadToCoolingSetPoint); - } else { - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).reportSensibleLoadsZoneMultiplier( - state, zoneNum, totalLoad, LoadToHeatingSetPoint, LoadToCoolingSetPoint); - } -} -} // namespace EnergyPlus::ZoneTempPredictorCorrector diff --git a/src/EnergyPlus/MixedAir.cc.bak b/src/EnergyPlus/MixedAir.cc.bak deleted file mode 100644 index f4763c74b34..00000000000 --- a/src/EnergyPlus/MixedAir.cc.bak +++ /dev/null @@ -1,5578 +0,0 @@ -// EnergyPlus, Copyright (c) 1996-2023, The Board of Trustees of the University of Illinois, -// The Regents of the University of California, through Lawrence Berkeley National Laboratory -// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge -// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other -// contributors. All rights reserved. -// -// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the -// U.S. Government consequently retains certain rights. As such, the U.S. Government has been -// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, -// worldwide license in the Software to reproduce, distribute copies to the public, prepare -// derivative works, and perform publicly and display publicly, and to permit others to do so. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted -// provided that the following conditions are met: -// -// (1) Redistributions of source code must retain the above copyright notice, this list of -// conditions and the following disclaimer. -// -// (2) Redistributions in binary form must reproduce the above copyright notice, this list of -// conditions and the following disclaimer in the documentation and/or other materials -// provided with the distribution. -// -// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, -// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be -// used to endorse or promote products derived from this software without specific prior -// written permission. -// -// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form -// without changes from the version obtained under this License, or (ii) Licensee makes a -// reference solely to the software portion of its product, Licensee must refer to the -// software as "EnergyPlus version X" software, where "X" is the version number Licensee -// obtained under this License and may not use a different name for the software. Except as -// specifically required in this Section (4), Licensee shall not use in a company name, a -// product name, in advertising, publicity, or other promotional activities any name, trade -// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly -// similar designation, without the U.S. Department of Energy's prior written consent. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -// C++ Headers -#include -#include - -// ObjexxFCL Headers -#include -#include - -// EnergyPlus Headers -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace EnergyPlus::MixedAir { - -// Module containing the routines dealing with the mixed air portion -// of the HVAC air loop. - -// MODULE INFORMATION: -// AUTHOR Fred Buhl -// DATE WRITTEN October 1998 -// MODIFIED Shirey/Raustad FSEC, June/Aug 2003, Jan 2004 -// Lawrie, March 2006 - Module order (per template) -// Craig Wray 22Aug2010 - Added Fan ComponentModel -// Chandan Sharma, FSEC, 25Aug 2011 - Added ProportionalControl -// to enhance CO2 based DCV control -// Feb 2013 Bereket Nigusse, FSEC -// Added DX Coil Model For 100% OA systems -// RE-ENGINEERED na - -// PURPOSE OF THIS MODULE: -// To encapsulate the data and algorithms required to -// simulate the mixed air portion of the EPlus air loop. - -// METHODOLOGY EMPLOYED: -// An algorithmic controller will be employed - there is no attempt to -// simulate real controllers for the economizer. The mixed air controller -// will sense various node conditions and set some node flow rates. Mixed -// air components will operate with predetermined flow rates. - -// Using/Aliasing -using namespace DataLoopNode; -using namespace DataAirLoop; -using namespace DataEnvironment; -using namespace DataHVACGlobals; -using namespace ScheduleManager; -using namespace DataSizing; -using namespace FaultsManager; - -constexpr std::array(ControllerKind::Num)> ControllerKindNamesUC{"CONTROLLER:WATERCOIL", "CONTROLLER:OUTDOORAIR"}; - -constexpr std::array(MixedAirControllerType::Num)> MixedAirControllerTypeNames{ - "Controller:OutdoorAir", "ZoneHVAC:EnergyRecoveryVentilator:Controller"}; - -constexpr std::array(CMO::Num)> CurrentModuleObjects{"None", - "AirLoopHVAC:OutdoorAirSystem", - "AirLoopHVAC:OutdoorAirSystem:EquipmentList", - "AirLoopHVAC:ControllerList", - "AvailabilityManagerAssignmentList", - "Controller:OutdoorAir", - "ZoneHVAC:EnergyRecoveryVentilator:Controller", - "Controller:MechanicalVentilation", - "OutdoorAir:Mixer"}; - -constexpr std::array(DataSizing::SysOAMethod::Num)> SOAMNamesUC{"ZONESUM", - "STANDARD62.1VENTILATIONRATEPROCEDURE", - "INDOORAIRQUALITYPROCEDURE", - "PROPORTIONALCONTROLBASEDONOCCUPANCYSCHEDULE", - "INDOORAIRQUALITYPROCEDUREGENERICCONTAMINANT", - "INDOORAIRQUALITYPROCEDURECOMBINED", - "PROPORTIONALCONTROLBASEDONDESIGNOCCUPANCY", - "PROPORTIONALCONTROLBASEDONDESIGNOARATE", - "STANDARD62.1SIMPLIFIEDPROCEDURE", - "STANDARD62.1VENTILATIONRATEPROCEDUREWITHLIMIT"}; - -constexpr std::array(SimAirServingZones::CompType::Num)> CompTypeNamesUC{ - "OUTDOORAIR:MIXER", - "FAN:CONSTANTVOLUME", - "FAN:VARIABLEVOLUME", - "COIL:COOLING:WATER", - "COIL:HEATING:WATER", - "COIL:HEATING:STEAM", - "COIL:COOLING:WATER:DETAILEDGEOMETRY", - "COIL:HEATING:ELECTRIC", - "COIL:HEATING:FUEL", - "COILSYSTEM:COOLING:WATER:HEATEXCHANGERASSISTED", - "COIL:HEATING:DESUPERHEATER", - "COILSYSTEM:COOLING:DX", - "HEATEXCHANGER:AIRTOAIR:FLATPLATE", - "DEHUMIDIFIER:DESICCANT:NOFANS", - "SOLARCOLLECTOR:UNGLAZEDTRANSPIRED", - "EVAPORATIVECOOLER:DIRECT:CELDEKPAD", - "AIRLOOPHVAC:UNITARY:FURNACE:HEATONLY", - "AIRLOOPHVAC:UNITARY:FURNACE:HEATCOOL", - "HUMIDIFIER:STEAM:ELECTRIC", - "DUCT", - "AIRLOOPHVAC:UNITARYHEATCOOL:VAVCHANGEOVERBYPASS", - "AIRLOOPHVAC:UNITARYHEATPUMP:AIRTOAIR:MULTISPEED", - "FAN:COMPONENTMODEL", - "COILSYSTEM:HEATING:DX", - "COIL:USERDEFINED", - "FAN:SYSTEMMODEL", - "AIRLOOPHVAC:UNITARYSYSTEM", - "ZONEHVAC:TERMINALUNIT:VARIABLEREFRIGERANTFLOW", - "SOLARCOLLECTOR:FLATPLATE:PHOTOVOLTAICTHERMAL", - "COILSYSTEM:COOLING:WATER"}; - -static constexpr std::array(DataSizing::SysOAMethod::Num)> printSysOAMethod{ - "ZoneSum,", - "Standard62.1VentilationRateProcedure,", - "IndoorAirQualityProcedure,", - "ProportionalControlBasedOnOccupancySchedule,", - "IndoorAirQualityGenericContaminant,", - "IndoorAirQualityProcedureCombined,", - "ProportionalControlBasedOnDesignOccupancy,", - "ProportionalControlBasedOnDesignOARate,", - "Standard62.1SimplifiedProcedure,", - "Standard62.1VentilationRateProcedureWithLimit,"}; - -Real64 OAGetFlowRate(EnergyPlusData &state, int OAPtr) -{ - Real64 FlowRate(0); - if ((OAPtr > 0) && (OAPtr <= state.dataMixedAir->NumOAControllers) && (state.dataEnvrn->StdRhoAir != 0)) { - FlowRate = state.dataMixedAir->OAController(OAPtr).OAMassFlow / state.dataEnvrn->StdRhoAir; - } - return FlowRate; -} -Real64 OAGetMinFlowRate(EnergyPlusData &state, int OAPtr) -{ - Real64 MinFlowRate(0); - if ((OAPtr > 0) && (OAPtr <= state.dataMixedAir->NumOAControllers)) { - MinFlowRate = state.dataMixedAir->OAController(OAPtr).MinOA; - } - return MinFlowRate; -} -void OASetDemandManagerVentilationState(EnergyPlusData &state, int OAPtr, bool aState) -{ - if ((OAPtr > 0) && (OAPtr <= state.dataMixedAir->NumOAControllers)) { - state.dataMixedAir->OAController(OAPtr).ManageDemand = aState; - } -} -void OASetDemandManagerVentilationFlow(EnergyPlusData &state, int OAPtr, Real64 aFlow) -{ - if ((OAPtr > 0) && (OAPtr <= state.dataMixedAir->NumOAControllers)) { - state.dataMixedAir->OAController(OAPtr).DemandLimitFlowRate = aFlow * state.dataEnvrn->StdRhoAir; - } -} -int GetOAController(EnergyPlusData &state, std::string const &OAName) -{ - int CurrentOAController(0); - for (int i = 1; i <= state.dataMixedAir->NumOAControllers; i++) { - if (OAName == state.dataMixedAir->OAController(i).Name) { - CurrentOAController = i; - break; - } - } - return CurrentOAController; -} - -void ManageOutsideAirSystem(EnergyPlusData &state, std::string const &OASysName, bool const FirstHVACIteration, int const AirLoopNum, int &OASysNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - - // PURPOSE OF THIS SUBROUTINE - // Manage the outside air system - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - if (OASysNum == 0) { - OASysNum = UtilityRoutines::FindItemInList(OASysName, state.dataAirLoop->OutsideAirSys); - if (OASysNum == 0) { - ShowFatalError(state, format("ManageOutsideAirSystem: AirLoopHVAC:OutdoorAirSystem not found={}", OASysName)); - } - } - - InitOutsideAirSys(state, OASysNum, AirLoopNum); - - SimOutsideAirSys(state, OASysNum, FirstHVACIteration, AirLoopNum); -} - -void SimOASysComponents(EnergyPlusData &state, int const OASysNum, bool const FirstHVACIteration, int const AirLoopNum) -{ - auto &CompType = state.dataMixedAir->CompType; - auto &CompName = state.dataMixedAir->CompName; - bool ReSim(false); - bool Sim(true); - bool OAHeatCoil(false); - bool OACoolCoil(false); - bool OAHX(false); - - for (int CompNum = 1; CompNum <= state.dataAirLoop->OutsideAirSys(OASysNum).NumComponents; ++CompNum) { - CompType = state.dataAirLoop->OutsideAirSys(OASysNum).ComponentType(CompNum); - CompName = state.dataAirLoop->OutsideAirSys(OASysNum).ComponentName(CompNum); - SimOAComponent(state, - CompType, - CompName, - state.dataAirLoop->OutsideAirSys(OASysNum).ComponentTypeEnum(CompNum), - FirstHVACIteration, - state.dataAirLoop->OutsideAirSys(OASysNum).ComponentIndex(CompNum), - AirLoopNum, - Sim, - OASysNum, - OAHeatCoil, - OACoolCoil, - OAHX); - if (OAHX) ReSim = true; - } - // if there were heat exchangers and/or desiccant wheel in the OA path, need to simulate again in reverse - // order to propagate the air flow and conditions out the relief air path to the relief air exit node - if (ReSim) { - for (int CompNum = state.dataAirLoop->OutsideAirSys(OASysNum).NumComponents - 1; CompNum >= 1; --CompNum) { - CompType = state.dataAirLoop->OutsideAirSys(OASysNum).ComponentType(CompNum); - CompName = state.dataAirLoop->OutsideAirSys(OASysNum).ComponentName(CompNum); - SimOAComponent(state, - CompType, - CompName, - state.dataAirLoop->OutsideAirSys(OASysNum).ComponentTypeEnum(CompNum), - FirstHVACIteration, - state.dataAirLoop->OutsideAirSys(OASysNum).ComponentIndex(CompNum), - AirLoopNum, - Sim, - OASysNum, - OAHeatCoil, - OACoolCoil, - OAHX); - } - // now simulate again propagate current temps back through OA system - for (int CompNum = 1; CompNum <= state.dataAirLoop->OutsideAirSys(OASysNum).NumComponents; ++CompNum) { - CompType = state.dataAirLoop->OutsideAirSys(OASysNum).ComponentType(CompNum); - CompName = state.dataAirLoop->OutsideAirSys(OASysNum).ComponentName(CompNum); - SimOAComponent(state, - CompType, - CompName, - state.dataAirLoop->OutsideAirSys(OASysNum).ComponentTypeEnum(CompNum), - FirstHVACIteration, - state.dataAirLoop->OutsideAirSys(OASysNum).ComponentIndex(CompNum), - AirLoopNum, - Sim, - OASysNum, - OAHeatCoil, - OACoolCoil, - OAHX); - } - } -} - -void SimOutsideAirSys(EnergyPlusData &state, int const OASysNum, bool const FirstHVACIteration, int const AirLoopNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - - // PURPOSE OF THIS SUBROUTINE - // Simulate the controllers and components in the outside air system. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int OAMixerNum; - int OAControllerNum; // OA controller index in OAController - auto &CompType = state.dataMixedAir->CompType; // Tuned Made static - auto &CompName = state.dataMixedAir->CompName; // Tuned Made static - bool FatalErrorFlag(false); - - state.dataSize->CurOASysNum = OASysNum; - auto &CurrentOASystem(state.dataAirLoop->OutsideAirSys(OASysNum)); - if (state.dataAirLoop->OutsideAirSys(OASysNum).AirLoopDOASNum == -1) { - SimOAController(state, CurrentOASystem.OAControllerName, CurrentOASystem.OAControllerIndex, FirstHVACIteration, AirLoopNum); - } - SimOASysComponents(state, OASysNum, FirstHVACIteration, AirLoopNum); - - if (state.dataMixedAir->MyOneTimeErrorFlag(OASysNum)) { - if (CurrentOASystem.NumControllers - CurrentOASystem.NumSimpleControllers > 1) { - ShowWarningError( - state, - format("AirLoopHVAC:OutdoorAirSystem {} has more than 1 outside air controller; only the 1st will be used", CurrentOASystem.Name)); - } - for (int CompNum = 1; CompNum <= CurrentOASystem.NumComponents; ++CompNum) { - CompType = CurrentOASystem.ComponentType(CompNum); - CompName = CurrentOASystem.ComponentName(CompNum); - if (UtilityRoutines::SameString(CompType, "OutdoorAir:Mixer")) { - OAMixerNum = UtilityRoutines::FindItemInList(CompName, state.dataMixedAir->OAMixer); - OAControllerNum = CurrentOASystem.OAControllerIndex; - if (state.dataMixedAir->OAController(OAControllerNum).MixNode != state.dataMixedAir->OAMixer(OAMixerNum).MixNode) { - ShowSevereError( - state, format("The mixed air node of Controller:OutdoorAir=\"{}\"", state.dataMixedAir->OAController(OAControllerNum).Name)); - ShowContinueError(state, - format("should be the same node as the mixed air node of OutdoorAir:Mixer=\"{}\".", - state.dataMixedAir->OAMixer(OAMixerNum).Name)); - ShowContinueError(state, - format("Controller:OutdoorAir mixed air node=\"{}\".", - state.dataLoopNodes->NodeID(state.dataMixedAir->OAController(OAControllerNum).MixNode))); - ShowContinueError(state, - format("OutdoorAir:Mixer mixed air node=\"{}\".", - state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OAMixerNum).MixNode))); - FatalErrorFlag = true; - } - if (state.dataMixedAir->OAController(OAControllerNum).RelNode != state.dataMixedAir->OAMixer(OAMixerNum).RelNode) { - ShowSevereError( - state, format("The relief air node of Controller:OutdoorAir=\"{}\"", state.dataMixedAir->OAController(OAControllerNum).Name)); - ShowContinueError(state, - format("should be the same node as the relief air node of OutdoorAir:Mixer=\"{}\".", - state.dataMixedAir->OAMixer(OAMixerNum).Name)); - ShowContinueError(state, - format("Controller:OutdoorAir relief air node=\"{}\".", - state.dataLoopNodes->NodeID(state.dataMixedAir->OAController(OAControllerNum).RelNode))); - ShowContinueError(state, - format("OutdoorAir:Mixer relief air node=\"{}\".", - state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OAMixerNum).RelNode))); - FatalErrorFlag = true; - } - if (state.dataMixedAir->OAController(OAControllerNum).RetNode != state.dataMixedAir->OAMixer(OAMixerNum).RetNode) { - ShowSevereError( - state, format("The return air node of Controller:OutdoorAir=\"{}\"", state.dataMixedAir->OAController(OAControllerNum).Name)); - ShowContinueError(state, - format("should be the same node as the return air node of OutdoorAir:Mixer=\"{}\".", - state.dataMixedAir->OAMixer(OAMixerNum).Name)); - ShowContinueError(state, - format("Controller:OutdoorAir return air node=\"{}\".", - state.dataLoopNodes->NodeID(state.dataMixedAir->OAController(OAControllerNum).RetNode))); - ShowContinueError(state, - format("OutdoorAir:Mixer return air node=\"{}\".", - state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OAMixerNum).RetNode))); - FatalErrorFlag = true; - } - } - } - state.dataMixedAir->MyOneTimeErrorFlag(OASysNum) = false; - if (FatalErrorFlag) ShowFatalError(state, "Previous severe error(s) cause program termination"); - } - - state.dataSize->CurOASysNum = 0; - if (state.dataAirLoop->OutsideAirSys(OASysNum).AirLoopDOASNum == -1) { - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysComponentsSimulated = true; - } -} - -void SimOAComponent(EnergyPlusData &state, - std::string const &CompType, // the component type - std::string const &CompName, // the component Name - SimAirServingZones::CompType const CompTypeNum, // Component Type -- Integerized for this module - bool const FirstHVACIteration, - int &CompIndex, - int const AirLoopNum, // air loop index for economizer lockout coordination - bool const Sim, // if TRUE, simulate component; if FALSE, just set the coil exisitence flags - int const OASysNum, // index to outside air system - bool &OAHeatingCoil, // TRUE indicates a heating coil has been found - bool &OACoolingCoil, // TRUE indicates a cooling coil has been found - bool &OAHX) // TRUE indicates a heat exchanger has been found -{ - - // SUBROUTINE INFORMATION - // AUTHOR: Russ Taylor, Dan Fisher, Fred Buhl - // DATE WRITTEN: Oct 1997 - // MODIFIED: Dec 1997 Fred Buhl, D Shirey Feb/Sept 2003 - // Nov 2004 M. J. Witte, GARD Analytics, Inc. - // Add DXSystem:AirLoop as valid OA system equipment - // Work supported by ASHRAE research project 1254-RP - - // PURPOSE OF THIS SUBROUTINE: - // Calls the individual air loop component simulation routines - - // SUBROUTINE LOCAL VARIABLE DEFINITIONS - OAHeatingCoil = false; - OACoolingCoil = false; - OAHX = false; - int FanOpMode; - bool HeatingActive = false; - bool CoolingActive = false; - Real64 sensOut = 0.0; - Real64 latOut = 0.0; - int constexpr zoneOAUnitNum = -1; - Real64 constexpr OAUCoilOutTemp = 0.0; - bool constexpr ZoneEquipFlag = false; - - switch (CompTypeNum) { - case SimAirServingZones::CompType::OAMixer_Num: { // OutdoorAir:Mixer - if (Sim) { - SimOAMixer(state, CompName, CompIndex); - } - break; - } - case SimAirServingZones::CompType::Fan_Simple_CV: // Fan:ConstantVolume - case SimAirServingZones::CompType::Fan_Simple_VAV: { // Fan:VariableVolume - if (Sim) { - Fans::SimulateFanComponents(state, CompName, FirstHVACIteration, CompIndex); - } - break; - } - case SimAirServingZones::CompType::Fan_System_Object: { // Fan:SystemModel - if (CompIndex == 0) { // 0 means has not been filled because of 1-based arrays in old fortran - CompIndex = HVACFan::getFanObjectVectorIndex(state, CompName) + 1; // + 1 for shift from zero-based vector to 1-based compIndex - } - if (Sim) { - state.dataHVACFan->fanObjs[CompIndex - 1]->simulate(state, _, _, _, _); // vector is 0 based, but CompIndex is 1 based so shift - } - break; - } - case SimAirServingZones::CompType::Fan_ComponentModel: { // Fan:ComponentModel - if (Sim) { - Fans::SimulateFanComponents(state, CompName, FirstHVACIteration, CompIndex); - } - break; - } - case SimAirServingZones::CompType::WaterCoil_Cooling: { // Coil:Cooling:Water - if (Sim) { - // get water coil and controller data if not called previously - if (CompIndex == 0) WaterCoils::SimulateWaterCoilComponents(state, CompName, FirstHVACIteration, CompIndex); - // iterate on OA sys controller and water coil at the same time - if (!state.dataWaterCoils->WaterCoil(CompIndex).heatRecoveryCoil) { - SimAirServingZones::SolveWaterCoilController(state, - FirstHVACIteration, - AirLoopNum, - CompName, - CompIndex, - state.dataWaterCoils->WaterCoil(CompIndex).ControllerName, - state.dataWaterCoils->WaterCoil(CompIndex).ControllerIndex, - false); - // set flag to tell HVAC controller it will be simulated only in SolveWaterCoilController() - state.dataHVACControllers->ControllerProps(state.dataWaterCoils->WaterCoil(CompIndex).ControllerIndex).BypassControllerCalc = true; - } else { - WaterCoils::SimulateWaterCoilComponents(state, CompName, FirstHVACIteration, CompIndex); - } - } else { - // This is not working as intended ... don't want to include the HR coil in sizing. - // But if the water coil is called to get this index, then the controller is called to set the - // controller index and the simulation sizes the controller before the cooling coil. - // Pushing this aspect forward to a follow up issue where the - // controller index call is moved out of water coils getInput. - // if (CompIndex == 0) { - // bool errFound = false; - // CompIndex = WaterCoils::GetWaterCoilIndex(state, CompType, CompName, errFound); - // if (errFound) ShowFatalError(state, "SimOAComponent: Program terminates for preceding reason."); - // } - // if (!state.dataWaterCoils->WaterCoil(CompIndex).heatRecoveryCoil) OACoolingCoil = true; - // should not include heat recovery coils in sizing since heat transfer at peak cooling is minimal. - OACoolingCoil = true; - } - } break; - case SimAirServingZones::CompType::WaterCoil_SimpleHeat: { // Coil:Heating:Water - if (Sim) { - // get water coil and controller data if not called previously - if (CompIndex == 0) WaterCoils::SimulateWaterCoilComponents(state, CompName, FirstHVACIteration, CompIndex); - // iterate on OA sys controller and water coil at the same time - SimAirServingZones::SolveWaterCoilController(state, - FirstHVACIteration, - AirLoopNum, - CompName, - CompIndex, - state.dataWaterCoils->WaterCoil(CompIndex).ControllerName, - state.dataWaterCoils->WaterCoil(CompIndex).ControllerIndex, - false); - // set flag to tell HVAC controller it will be simulated only in SolveWaterCoilController() - state.dataHVACControllers->ControllerProps(state.dataWaterCoils->WaterCoil(CompIndex).ControllerIndex).BypassControllerCalc = true; - } - OAHeatingCoil = true; - } break; - case SimAirServingZones::CompType::SteamCoil_AirHeat: { // Coil:Heating:Steam - if (Sim) { - SteamCoils::SimulateSteamCoilComponents(state, CompName, FirstHVACIteration, CompIndex, 0.0); - } - OAHeatingCoil = true; - } break; - case SimAirServingZones::CompType::WaterCoil_DetailedCool: { // Coil:Cooling:Water:DetailedGeometry - if (Sim) { - // get water coil and controller data if not called previously - if (CompIndex == 0) WaterCoils::SimulateWaterCoilComponents(state, CompName, FirstHVACIteration, CompIndex); - // iterate on OA sys controller and water coil at the same time - SimAirServingZones::SolveWaterCoilController(state, - FirstHVACIteration, - AirLoopNum, - CompName, - CompIndex, - state.dataWaterCoils->WaterCoil(CompIndex).ControllerName, - state.dataWaterCoils->WaterCoil(CompIndex).ControllerIndex, - false); - // set flag to tell HVAC controller it will be simulated only in SolveWaterCoilController() - state.dataHVACControllers->ControllerProps(state.dataWaterCoils->WaterCoil(CompIndex).ControllerIndex).BypassControllerCalc = true; - } - OACoolingCoil = true; - } break; - case SimAirServingZones::CompType::Coil_ElectricHeat: // Coil:Heating:Electric - case SimAirServingZones::CompType::Coil_GasHeat: { // Coil:Heating:Fuel - if (Sim) { - // stand-alone coils are temperature controlled (do not pass QCoilReq in argument list, QCoilReq overrides temp SP) - HeatingCoils::SimulateHeatingCoilComponents(state, CompName, FirstHVACIteration, _, CompIndex); - } - OAHeatingCoil = true; - } break; - case SimAirServingZones::CompType::WaterCoil_CoolingHXAsst: { // CoilSystem:Cooling:Water:HeatExchangerAssisted - if (Sim) { - // get water coil and controller data if not called previously - if (CompIndex == 0) - HVACHXAssistedCoolingCoil::SimHXAssistedCoolingCoil( - state, CompName, FirstHVACIteration, CompressorOperation::On, 0.0, CompIndex, ContFanCycCoil); - // iterate on OA sys controller and water coil at the same time - SimAirServingZones::SolveWaterCoilController(state, - FirstHVACIteration, - AirLoopNum, - CompName, - CompIndex, - state.dataHVACAssistedCC->HXAssistedCoil(CompIndex).ControllerName, - state.dataHVACAssistedCC->HXAssistedCoil(CompIndex).ControllerIndex, - true); - // set flag to tell HVAC controller it will be simulated only in SolveWaterCoilController() - state.dataHVACControllers->ControllerProps(state.dataHVACAssistedCC->HXAssistedCoil(CompIndex).ControllerIndex).BypassControllerCalc = - true; - } - OACoolingCoil = true; - } break; - case SimAirServingZones::CompType::DXSystem: // CoilSystem:Cooling:DX - case SimAirServingZones::CompType::CoilSystemWater: // CoilSystem:Cooling:Water - case SimAirServingZones::CompType::UnitarySystemModel: { // AirloopHVAC:UnitarySystem - if (Sim) { - int compNum = CompIndex; // use local so return value of compNum from simulate call does not overwrite CompIndex - state.dataAirLoop->OutsideAirSys(OASysNum).compPointer[compNum]->simulate(state, - CompName, - FirstHVACIteration, - AirLoopNum, - compNum, - HeatingActive, - CoolingActive, - zoneOAUnitNum, - OAUCoilOutTemp, - ZoneEquipFlag, - sensOut, - latOut); - } - if (state.dataMixedAir->MyOneTimeCheckUnitarySysFlag(OASysNum) && CompTypeNum == SimAirServingZones::CompType::UnitarySystemModel) { - UnitarySystems::UnitarySys::getUnitarySysHeatCoolCoil(state, CompName, OACoolingCoil, OAHeatingCoil, 0); - UnitarySystems::UnitarySys::checkUnitarySysCoilInOASysExists(state, CompName, 0); - if (Sim) state.dataMixedAir->MyOneTimeCheckUnitarySysFlag(OASysNum) = false; - } else { - OACoolingCoil = true; - } - } break; - case SimAirServingZones::CompType::DXHeatPumpSystem: { // CoilSystem:IntegratedHeatPump:AirSource - if (Sim) { - HVACDXHeatPumpSystem::SimDXHeatPumpSystem(state, CompName, FirstHVACIteration, AirLoopNum, CompIndex); - } - OAHeatingCoil = true; - } break; - case SimAirServingZones::CompType::CoilUserDefined: { // Coil:UserDefined - if (Sim) { - UserDefinedComponents::SimCoilUserDefined(state, CompName, CompIndex, AirLoopNum, OAHeatingCoil, OACoolingCoil); - } - } break; - case SimAirServingZones::CompType::HeatXchngr: { - // HeatExchanger:AirToAir:FlatPlate, HeatExchanger:AirToAir:SensibleAndLatent, HeatExchanger:Desiccant:BalancedFlow - if (Sim) { - Real64 AirloopPLR = 1; - if (state.dataAirLoop->OutsideAirSys(OASysNum).AirLoopDOASNum > -1) { - FanOpMode = DataHVACGlobals::ContFanCycCoil; - } else { - if (state.dataAirLoop->AirLoopControlInfo(AirLoopNum).FanOpMode == DataHVACGlobals::CycFanCycCoil) { - FanOpMode = DataHVACGlobals::CycFanCycCoil; - } else { - FanOpMode = DataHVACGlobals::ContFanCycCoil; - } - if (FanOpMode == DataHVACGlobals::CycFanCycCoil) { - // HX's in the OA system can be troublesome given that the OA flow rate is not necessarily proportional to air loop PLR - // adding that user input for branch flow rate, HX nominal flow rate, OA system min/max flow rate will not necessarily be - // perfectly input, a compromise is used for OA sys HX's as the ratio of flow to max. Issue #4298. - // AirloopPLR = AirLoopFlow( AirLoopNum ).FanPLR; - AirloopPLR = state.dataMixedAir->OAController(OASysNum).OAMassFlow / state.dataMixedAir->OAController(OASysNum).MaxOAMassFlowRate; - } - } - if (state.dataAirLoop->OutsideAirSys(OASysNum).AirLoopDOASNum > -1) { - HeatRecovery::SimHeatRecovery(state, CompName, FirstHVACIteration, CompIndex, FanOpMode, AirloopPLR, _, _, _, _, _); - } else { - HeatRecovery::SimHeatRecovery(state, - CompName, - FirstHVACIteration, - CompIndex, - FanOpMode, - AirloopPLR, - _, - _, - _, - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).HeatRecoveryBypass, - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).HighHumCtrlActive); - } - } - OAHX = true; - } break; - case SimAirServingZones::CompType::Desiccant: { // Dehumidifier:Desiccant:NoFans, Dehumidifier:Desiccant:NoFans, Dehumidifier:Desiccant:System - if (Sim) { - DesiccantDehumidifiers::SimDesiccantDehumidifier(state, CompName, FirstHVACIteration, CompIndex); - } - OAHX = true; - } break; - case SimAirServingZones::CompType::Humidifier: { // Humidifier:Steam:Electric Humidifier:Steam:Gas - if (Sim) { - Humidifiers::SimHumidifier(state, CompName, FirstHVACIteration, CompIndex); - } - } break; - case SimAirServingZones::CompType::Unglazed_SolarCollector: { // SolarCollector:UnglazedTranspired - if (Sim) { - TranspiredCollector::SimTranspiredCollector(state, CompName, CompIndex); - } - } break; - case SimAirServingZones::CompType::PVT_AirBased: { // SolarCollector:FlatPlate:PhotovoltaicThermal - if (Sim) { - if (CompIndex == 0) { - CompIndex = PhotovoltaicThermalCollectors::getPVTindexFromName(state, CompName); - } - PhotovoltaicThermalCollectors::simPVTfromOASys(state, CompIndex, FirstHVACIteration); - } - } break; - case SimAirServingZones::CompType::EvapCooler: { // EvaporativeCooler:Direct:CelDekPad, EvaporativeCooler:Indirect:CelDekPad - // EvaporativeCooler:Indirect:WetCoil, EvaporativeCooler:Indirect:ResearchSpecial - if (Sim) { - EvaporativeCoolers::SimEvapCooler(state, CompName, CompIndex); - } - } break; - case SimAirServingZones::CompType::ZoneVRFasAirLoopEquip: { // ZoneHVAC:TerminalUnit:VariableRefrigerantFlow - if (Sim) { - int ControlledZoneNum = 0; - bool HeatingActive = false; - bool CoolingActive = false; - int constexpr OAUnitNum = 0; - Real64 constexpr OAUCoilOutTemp = 0.0; - bool constexpr ZoneEquipment = false; - Real64 sysOut = 0.0; - Real64 latOut = 0.0; - HVACVariableRefrigerantFlow::SimulateVRF(state, - CompName, - FirstHVACIteration, - ControlledZoneNum, - CompIndex, - HeatingActive, - CoolingActive, - OAUnitNum, - OAUCoilOutTemp, - ZoneEquipment, - sysOut, - latOut); - } else { - HVACVariableRefrigerantFlow::isVRFCoilPresent(state, CompName, OACoolingCoil, OAHeatingCoil); - } - } break; - default: - ShowFatalError(state, format("Invalid Outside Air Component={}", CompType)); - } -} - -void SimOAMixer(EnergyPlusData &state, std::string const &CompName, int &CompIndex) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - - // PURPOSE OF THIS SUBROUTINE - // Simulate an Outside Air Mixer component - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int OAMixerNum; - - if (state.dataMixedAir->GetOAMixerInputFlag) { - GetOAMixerInputs(state); - state.dataMixedAir->GetOAMixerInputFlag = false; - } - - if (CompIndex == 0) { - OAMixerNum = UtilityRoutines::FindItemInList(CompName, state.dataMixedAir->OAMixer); - CompIndex = OAMixerNum; - if (OAMixerNum == 0) { - ShowFatalError(state, format("SimOAMixer: OutdoorAir:Mixer not found={}", CompName)); - } - } else { - OAMixerNum = CompIndex; - } - - InitOAMixer(state, OAMixerNum); - - CalcOAMixer(state, OAMixerNum); - - UpdateOAMixer(state, OAMixerNum); -} - -void SimOAController(EnergyPlusData &state, std::string const &CtrlName, int &CtrlIndex, bool const FirstHVACIteration, int const AirLoopNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - - // PURPOSE OF THIS SUBROUTINE - // Simulate an Outside Air Controller component - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int OAControllerNum; - - if ((state.dataMixedAir->GetOAControllerInputFlag) && - (AirLoopNum > 0)) { // Gets input for object first time Sim routine is called from an airloop - GetOAControllerInputs(state); - state.dataMixedAir->GetOAControllerInputFlag = false; - } - - if (CtrlIndex == 0) { - if (state.dataMixedAir->NumOAControllers > 0) { - OAControllerNum = UtilityRoutines::FindItemInList(CtrlName, state.dataMixedAir->OAController); - } else { - OAControllerNum = 0; - } - CtrlIndex = OAControllerNum; - if (OAControllerNum == 0) { - ShowFatalError(state, format("SimOAController: Outside Air Controller not found={}", CtrlName)); - } - } else { - OAControllerNum = CtrlIndex; - } - - InitOAController(state, OAControllerNum, FirstHVACIteration, AirLoopNum); - - state.dataMixedAir->OAController(OAControllerNum).CalcOAController(state, AirLoopNum, FirstHVACIteration); - state.dataMixedAir->OAController(OAControllerNum).UpdateOAController(state); -} - -// Get Input Section of the Module -//****************************************************************************** - -void GetOutsideAirSysInputs(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - - // PURPOSE OF THIS SUBROUTINE - // Input the Outside Air System data and store it in the OutsideAirSys array. - - // METHODOLOGY EMPLOYED: - // Use the Get routines from the InputProcessor module. - - // SUBROUTINE PARAMETER DEFINITIONS: - static constexpr std::string_view RoutineName("GetOutsideAirSysInputs: "); // include trailing blank space - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - bool ErrorsFound(false); - int NumNums; // Number of real numbers returned by GetObjectItem - int NumAlphas; // Number of alphanumerics returned by GetObjectItem - int AlphaNum; - int TotalArgs(0); // Total number of alpha and numeric arguments (max) for a - int IOStat; - Array1D NumArray; - Array1D_string AlphArray; - Array1D_string cAlphaFields; // Alpha field names - Array1D_string cNumericFields; // Numeric field names - Array1D_bool lAlphaBlanks; // Logical array, alpha field input BLANK = .TRUE. - Array1D_bool lNumericBlanks; // Logical array, numeric field input BLANK = .TRUE. - - if (!state.dataMixedAir->GetOASysInputFlag) return; - - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( - state, CurrentModuleObjects[static_cast(CMO::OASystem)], TotalArgs, NumAlphas, NumNums); - int MaxNums = NumNums; - int MaxAlphas = NumAlphas; - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( - state, CurrentModuleObjects[static_cast(CMO::AirLoopEqList)], TotalArgs, NumAlphas, NumNums); - MaxNums = max(MaxNums, NumNums); - MaxAlphas = max(MaxAlphas, NumAlphas); - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( - state, CurrentModuleObjects[static_cast(CMO::ControllerList)], TotalArgs, NumAlphas, NumNums); - MaxNums = max(MaxNums, NumNums); - MaxAlphas = max(MaxAlphas, NumAlphas); - - AlphArray.allocate(MaxAlphas); - cAlphaFields.allocate(MaxAlphas); - NumArray.dimension(MaxNums, 0.0); - cNumericFields.allocate(MaxNums); - lAlphaBlanks.dimension(MaxAlphas, true); - lNumericBlanks.dimension(MaxNums, true); - - std::string_view CurrentModuleObject = CurrentModuleObjects[static_cast(CMO::ControllerList)]; - state.dataMixedAir->NumControllerLists = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - - state.dataMixedAir->ControllerLists.allocate(state.dataMixedAir->NumControllerLists); - - for (int Item = 1; Item <= state.dataMixedAir->NumControllerLists; ++Item) { - - // create a reference for convenience - auto &thisControllerList(state.dataMixedAir->ControllerLists(Item)); - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - Item, - AlphArray, - NumAlphas, - NumArray, - NumNums, - IOStat, - lNumericBlanks, - lAlphaBlanks, - cAlphaFields, - cNumericFields); - thisControllerList.Name = AlphArray(1); // no need to check if AlphaArray(1) is empty since Json will catch missing required fields - thisControllerList.NumControllers = (NumAlphas - 1) / 2; - thisControllerList.ControllerType.dimension(thisControllerList.NumControllers, ControllerKind::Invalid); - thisControllerList.ControllerName.allocate(thisControllerList.NumControllers); - AlphaNum = 2; - for (int CompNum = 1; CompNum <= thisControllerList.NumControllers; ++CompNum) { - // Json will catch any object types that are not the correct key choice of Controller:OutdoorAir or Controller:WaterCoil - thisControllerList.ControllerType(CompNum) = - static_cast(getEnumerationValue(ControllerKindNamesUC, UtilityRoutines::MakeUPPERCase(AlphArray(AlphaNum)))); - thisControllerList.ControllerName(CompNum) = AlphArray(AlphaNum + 1); - // loop over all previous controller lists to check if this controllers is also present on previous controllers - for (int previousListNum = 1; previousListNum < Item; ++previousListNum) { - // loop over each of the controllers listed for this list - auto &previousList(state.dataMixedAir->ControllerLists(previousListNum)); - for (int PreviousListControllerNum = 1; PreviousListControllerNum <= previousList.NumControllers; ++PreviousListControllerNum) { - if ((previousList.ControllerType(PreviousListControllerNum) == thisControllerList.ControllerType(CompNum)) && - (previousList.ControllerName(PreviousListControllerNum) == thisControllerList.ControllerName(CompNum))) { - ShowSevereError(state, format("Controller instance repeated in multiple {} objects", CurrentModuleObject)); - ShowContinueError(state, format("Found in {} = {}", CurrentModuleObject, thisControllerList.Name)); - ShowContinueError(state, format("Also found in {} = {}", CurrentModuleObject, previousList.Name)); - ErrorsFound = true; - } - } - } - AlphaNum += 2; - } - } - - CurrentModuleObject = CurrentModuleObjects[static_cast(CMO::OASystem)]; - - state.dataAirLoop->NumOASystems = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - - state.dataAirLoop->OutsideAirSys.allocate(state.dataAirLoop->NumOASystems); - state.dataSize->OASysEqSizing.allocate(state.dataAirLoop->NumOASystems); - state.dataMixedAir->ControllerListUniqueNames.reserve(static_cast(state.dataAirLoop->NumOASystems)); - state.dataMixedAir->MyOneTimeErrorFlag.dimension(state.dataAirLoop->NumOASystems, true); - state.dataMixedAir->MyOneTimeCheckUnitarySysFlag.dimension(state.dataAirLoop->NumOASystems, true); - state.dataMixedAir->initOASysFlag.dimension(state.dataAirLoop->NumOASystems, true); - - for (int OASysNum = 1; OASysNum <= state.dataAirLoop->NumOASystems; ++OASysNum) { - auto &OASys = state.dataAirLoop->OutsideAirSys(OASysNum); - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - OASysNum, - AlphArray, - NumAlphas, - NumArray, - NumNums, - IOStat, - lNumericBlanks, - lAlphaBlanks, - cAlphaFields, - cNumericFields); - OASys.Name = AlphArray(1); // no need to check if AlphaArray(1) is empty since Json will catch missing required fields - if (!AlphArray(2).empty()) { - GlobalNames::IntraObjUniquenessCheck( - state, AlphArray(2), CurrentModuleObject, cAlphaFields(2), state.dataMixedAir->ControllerListUniqueNames, ErrorsFound); - } - OASys.ControllerListName = AlphArray(2); - OASys.ComponentListName = AlphArray(3); - - BranchNodeConnections::TestCompSet(state, CurrentModuleObject, OASys.Name, "UNDEFINED", "UNDEFINED", "Air Nodes"); - - if (!lAlphaBlanks(3)) { - int ListNum = state.dataInputProcessing->inputProcessor->getObjectItemNum( - state, CurrentModuleObjects[static_cast(CMO::AirLoopEqList)], OASys.ComponentListName); - if (ListNum > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem( - state, CurrentModuleObjects[static_cast(CMO::AirLoopEqList)], ListNum, AlphArray, NumAlphas, NumArray, NumNums, IOStat); - int NumInList = (NumAlphas - 1) / 2; - OASys.NumComponents = NumInList; - OASys.ComponentName.allocate(NumInList); - OASys.ComponentType.allocate(NumInList); - OASys.ComponentTypeEnum.dimension(NumInList, SimAirServingZones::CompType::Invalid); - OASys.ComponentIndex.dimension(NumInList, 0); - OASys.InletNodeNum.dimension(NumInList, 0); - OASys.OutletNodeNum.dimension(NumInList, 0); - OASys.compPointer.resize(NumInList + 1, nullptr); - for (int InListNum = 1; InListNum <= NumInList; ++InListNum) { - OASys.ComponentName(InListNum) = AlphArray(InListNum * 2 + 1); - OASys.ComponentType(InListNum) = AlphArray(InListNum * 2); - - // Add equipment to component sets array - BranchNodeConnections::SetUpCompSets(state, - CurrentModuleObject, - OASys.Name, - OASys.ComponentType(InListNum), - OASys.ComponentName(InListNum), - "UNDEFINED", - "UNDEFINED"); - } - } else { - ShowSevereError( - state, - format("{} = \"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, OASys.Name, cAlphaFields(3), OASys.ComponentListName)); - ErrorsFound = true; - } - } else { - ShowSevereError(state, format("{} = \"{}\" invalid {} is blank and must be entered.", CurrentModuleObject, OASys.Name, cAlphaFields(3))); - ErrorsFound = true; - } - - int ListNum = 0; - int NumSimpControllers = 0; // number of Controller:Simple objects in an OA System - if (!lAlphaBlanks(2)) { - ListNum = state.dataInputProcessing->inputProcessor->getObjectItemNum( - state, CurrentModuleObjects[static_cast(CMO::ControllerList)], OASys.ControllerListName); - if (ListNum > 0) { - state.dataInputProcessing->inputProcessor->getObjectItem( - state, CurrentModuleObjects[static_cast(CMO::ControllerList)], ListNum, AlphArray, NumAlphas, NumArray, NumNums, IOStat); - int NumInList = (NumAlphas - 1) / 2; - OASys.NumControllers = NumInList; - OASys.ControllerName.allocate(NumInList); - OASys.ControllerType.allocate(NumInList); - OASys.controllerTypeEnum.dimension(NumInList, DataAirLoop::ControllerKind::Invalid); - OASys.ControllerIndex.dimension(NumInList, 0); - for (int InListNum = 1; InListNum <= NumInList; ++InListNum) { - OASys.ControllerName(InListNum) = AlphArray(InListNum * 2 + 1); - OASys.ControllerType(InListNum) = AlphArray(InListNum * 2); - OASys.controllerTypeEnum(InListNum) = - static_cast(getEnumerationValue(ControllerKindNamesUC, OASys.ControllerType(InListNum))); - // only count Controller:OutdoorAir types as valid simple controllers - if (OASys.controllerTypeEnum(InListNum) != DataAirLoop::ControllerKind::OutdoorAir) { - ++NumSimpControllers; - } - } - } else { - ShowSevereError(state, - format("{} = \"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, AlphArray(1), cAlphaFields(2), AlphArray(2))); - ErrorsFound = true; - } - } else { - if (state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, "AirLoopHVAC:DedicatedOutdoorAirSystem") == 0) { - ShowSevereError(state, - format("{} = \"{}\" invalid {} is blank and must be entered.", CurrentModuleObject, AlphArray(1), cAlphaFields(2))); - ErrorsFound = true; - } else { - ShowWarningError(state, - format("{} = \"{}\": blank {} must be used with AirLoopHVAC:DedicatedOutdoorAirSystem.", - CurrentModuleObject, - AlphArray(1), - cAlphaFields(2))); - } - } - OASys.ControllerListNum = ListNum; - OASys.NumSimpleControllers = NumSimpControllers; - } - - for (int OASysNum = 1; OASysNum <= state.dataAirLoop->NumOASystems; ++OASysNum) { - auto &OASys = state.dataAirLoop->OutsideAirSys(OASysNum); - for (int CompNum = 1; CompNum <= OASys.NumComponents; ++CompNum) { - OASys.ComponentTypeEnum(CompNum) = - static_cast(getEnumerationValue(CompTypeNamesUC, OASys.ComponentType(CompNum))); - if (OASys.ComponentTypeEnum(CompNum) == SimAirServingZones::CompType::Fan_System_Object) { - // construct fan object - state.dataHVACFan->fanObjs.emplace_back(new HVACFan::FanSystem(state, OASys.ComponentName(CompNum))); - OASys.ComponentIndex(CompNum) = state.dataHVACFan->fanObjs.size(); - } else if (OASys.ComponentTypeEnum(CompNum) == SimAirServingZones::CompType::CoilSystemWater || - OASys.ComponentTypeEnum(CompNum) == SimAirServingZones::CompType::UnitarySystemModel || - OASys.ComponentTypeEnum(CompNum) == SimAirServingZones::CompType::DXSystem) { - OASys.ComponentIndex(CompNum) = CompNum; - OASys.compPointer[CompNum] = - UnitarySystems::UnitarySys::factory(state, DataHVACGlobals::UnitarySys_AnyCoilType, OASys.ComponentName(CompNum), false, 0); - } else if (OASys.ComponentTypeEnum(CompNum) == SimAirServingZones::CompType::Invalid) { - std::string const thisComp = OASys.ComponentType(CompNum); - if (thisComp == "HEATEXCHANGER:AIRTOAIR:SENSIBLEANDLATENT" || thisComp == "HEATEXCHANGER:DESICCANT:BALANCEDFLOW") { - OASys.ComponentTypeEnum(CompNum) = SimAirServingZones::CompType::HeatXchngr; - } else if (thisComp == "DEHUMIDIFIER:DESICCANT:SYSTEM") { - OASys.ComponentTypeEnum(CompNum) = SimAirServingZones::CompType::Desiccant; - } else if (thisComp == "EVAPORATIVECOOLER:INDIRECT:CELDEKPAD" || thisComp == "EVAPORATIVECOOLER:INDIRECT:WETCOIL" || - thisComp == "EVAPORATIVECOOLER:INDIRECT:RESEARCHSPECIAL" || thisComp == "EVAPORATIVECOOLER:DIRECT:RESEARCHSPECIAL") { - OASys.ComponentTypeEnum(CompNum) = SimAirServingZones::CompType::EvapCooler; - } else if (thisComp == "HUMIDIFIER:STEAM:GAS") { - OASys.ComponentTypeEnum(CompNum) = SimAirServingZones::CompType::Humidifier; - } else { - ShowSevereError( - state, - format("{} = \"{}\" invalid Outside Air Component=\"{}\".", CurrentModuleObject, AlphArray(1), OASys.ComponentType(CompNum))); - ErrorsFound = true; - } - } - } - - // loop through the controllers in the controller list for OA system and save the pointer to the OA controller index - for (int OAControllerNum = 1; OAControllerNum <= state.dataAirLoop->OutsideAirSys(OASysNum).NumControllers; ++OAControllerNum) { - if (state.dataAirLoop->OutsideAirSys(OASysNum).controllerTypeEnum(OAControllerNum) == DataAirLoop::ControllerKind::OutdoorAir) { - state.dataAirLoop->OutsideAirSys(OASysNum).OAControllerName = - state.dataAirLoop->OutsideAirSys(OASysNum).ControllerName(OAControllerNum); - break; - } - } - } - - if (ErrorsFound) { - ShowFatalError(state, format("{}Errors found in getting {}.", RoutineName, CurrentModuleObject)); - } - - AlphArray.deallocate(); - cAlphaFields.deallocate(); - NumArray.deallocate(); - cNumericFields.deallocate(); - lAlphaBlanks.deallocate(); - lNumericBlanks.deallocate(); - - state.dataMixedAir->GetOASysInputFlag = false; -} - -void GetOAControllerInputs(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - // MODIFIED Shirey/Raustad FSEC, June 2003, Jan 2004 - // Mangesh Basarkar, 06/2011: Getting zone OA specifications from Design Specification Object - // Tianzhen Hong, 3/2012: getting zone air distribution effectiveness and secondary recirculation - // from DesignSpecification:ZoneAirDistribution objects - - // PURPOSE OF THIS SUBROUTINE - // Input the OAController data and store it in the OAController array. - // Input the Ventilation:Mechanical data and store it in the VentilationMechanical array. - // Condense Ventilation:Mechanical data array to include only unique zones specified for each instance of this object. - - // METHODOLOGY EMPLOYED: - // Use the Get routines from the InputProcessor module. - - // SUBROUTINE PARAMETER DEFINITIONS: - static constexpr std::string_view RoutineName("GetOAControllerInputs: "); // include trailing blank space - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int NumArg; // Number of arguments from GetObjectDefMaxArgs call - int NumNums; // Number of real numbers returned by GetObjectItem - int NumAlphas; // Number of alphanumerics returned by GetObjectItem - int IOStat; // Status of GetObjectItem call - Array1D NumArray; - Array1D_string AlphArray; - std::string_view CurrentModuleObject; // Object type for getting and messages - Array1D_string cAlphaFields; // Alpha field names - Array1D_string cNumericFields; // Numeric field names - Array1D_bool lAlphaBlanks; // Logical array, alpha field input BLANK = .TRUE. - Array1D_bool lNumericBlanks; // Logical array, numeric field input BLANK = .TRUE. - bool ErrorsFound(false); // Flag identifying errors found during get input - - // First, call other get input routines in this module to make sure data is filled during this routine. - if (state.dataMixedAir->GetOASysInputFlag) { // Gets input for object first time Sim routine is called - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - if (state.dataMixedAir->GetOAMixerInputFlag) { // Gets input for object first time Sim routine is called - GetOAMixerInputs(state); - state.dataMixedAir->GetOAMixerInputFlag = false; - } - - FaultsManager::CheckAndReadFaults(state); - - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( - state, CurrentModuleObjects[static_cast(CMO::OAController)], NumArg, NumAlphas, NumNums); - int MaxAlphas = NumAlphas; - int MaxNums = NumNums; - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( - state, CurrentModuleObjects[static_cast(CMO::ERVController)], NumArg, NumAlphas, NumNums); - MaxAlphas = max(MaxAlphas, NumAlphas); - MaxNums = max(MaxNums, NumNums); - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( - state, CurrentModuleObjects[static_cast(CMO::MechVentilation)], NumArg, NumAlphas, NumNums); - MaxAlphas = max(MaxAlphas, NumAlphas); - MaxNums = max(MaxNums, NumNums); - - AlphArray.allocate(MaxAlphas); - NumArray.dimension(MaxNums, 0.0); - lAlphaBlanks.dimension(MaxAlphas, true); - lNumericBlanks.dimension(MaxNums, true); - cAlphaFields.allocate(MaxAlphas); - cNumericFields.allocate(MaxNums); - - // Count OAcontrollers and ERVcontrollers and allocate arrays - AllocateOAControllers(state); - - // If there are ERV controllers, they have been filled before now NumOAControllers includes the count of NumERVControllers - if (state.dataMixedAir->NumOAControllers > state.dataMixedAir->NumERVControllers) { - CurrentModuleObject = CurrentModuleObjects[static_cast(CMO::OAController)]; - int currentOAControllerNum = 0; - for (int OutAirNum = state.dataMixedAir->NumERVControllers + 1; OutAirNum <= state.dataMixedAir->NumOAControllers; ++OutAirNum) { - ++currentOAControllerNum; - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - currentOAControllerNum, - AlphArray, - NumAlphas, - NumArray, - NumNums, - IOStat, - lNumericBlanks, - lAlphaBlanks, - cAlphaFields, - cNumericFields); - GlobalNames::VerifyUniqueInterObjectName( - state, state.dataMixedAir->OAControllerUniqueNames, AlphArray(1), CurrentModuleObject, cAlphaFields(1), ErrorsFound); - - ProcessOAControllerInputs(state, - CurrentModuleObject, - OutAirNum, - AlphArray, - NumAlphas, - NumArray, - NumNums, - lNumericBlanks, - lAlphaBlanks, - cAlphaFields, - cNumericFields, - ErrorsFound); - - // add applicable faults identifier to avoid string comparison at each time step - // loop through each fault for each OA controller and determine economizer faultys - for (int i = 1; i <= state.dataFaultsMgr->NumFaultyEconomizer; ++i) { - if (state.dataFaultsMgr->FaultsEconomizer(i).ControllerTypeEnum != iController_AirEconomizer) continue; - if (UtilityRoutines::SameString(state.dataMixedAir->OAController(OutAirNum).Name, - state.dataFaultsMgr->FaultsEconomizer(i).ControllerName)) { - state.dataFaultsMgr->FaultsEconomizer(i).ControllerID = OutAirNum; - ++state.dataMixedAir->OAController(OutAirNum).NumFaultyEconomizer; - } - } - // loop through each fault for each OA controller to determine faulty counts - state.dataMixedAir->OAController(OutAirNum).EconmizerFaultNum.allocate(state.dataMixedAir->OAController(OutAirNum).NumFaultyEconomizer); - if (state.dataMixedAir->OAController(OutAirNum).NumFaultyEconomizer > 0) { - for (int j = 0, i = 1; i <= state.dataFaultsMgr->NumFaultyEconomizer; ++i) { - if (state.dataFaultsMgr->FaultsEconomizer(i).ControllerTypeEnum != iController_AirEconomizer) continue; - if (UtilityRoutines::SameString(state.dataMixedAir->OAController(OutAirNum).Name, - state.dataFaultsMgr->FaultsEconomizer(i).ControllerName)) { - state.dataMixedAir->OAController(OutAirNum).EconmizerFaultNum(++j) = i; - } - } - } - } // LOOP FOR OutAirNum - - if (ErrorsFound) { - AlphArray.deallocate(); - NumArray.deallocate(); - lNumericBlanks.deallocate(); - lAlphaBlanks.deallocate(); - cAlphaFields.deallocate(); - cNumericFields.deallocate(); - ShowFatalError(state, format("{}Errors found in getting {} inputs.", RoutineName, CurrentModuleObject)); - } - } - - state.dataMixedAir->GetOAControllerInputFlag = false; - - // Process Controller:MechanicalVentilation objects - CurrentModuleObject = CurrentModuleObjects[static_cast(CMO::MechVentilation)]; - state.dataMixedAir->NumVentMechControllers = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - if (state.dataMixedAir->NumVentMechControllers > 0) { - state.dataMixedAir->VentilationMechanical.allocate(state.dataMixedAir->NumVentMechControllers); - for (int VentMechNum = 1; VentMechNum <= state.dataMixedAir->NumVentMechControllers; ++VentMechNum) { - auto &thisVentilationMechanical(state.dataMixedAir->VentilationMechanical(VentMechNum)); - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - VentMechNum, - AlphArray, - NumAlphas, - NumArray, - NumNums, - IOStat, - lNumericBlanks, - lAlphaBlanks, - cAlphaFields, - cNumericFields); - - int MechVentZoneCount = 0; - - int NumGroups = (NumAlphas + NumNums - 5) / 3; // Number of extensible input groups of the VentilationMechanical object - if (mod((NumAlphas + NumNums - 5), 3) != 0) ++NumGroups; - thisVentilationMechanical.Name = AlphArray(1); // no need to check if AlphaArray(1) is empty since Json will catch missing required fields - thisVentilationMechanical.SchName = AlphArray(2); - if (lAlphaBlanks(2)) { - thisVentilationMechanical.SchPtr = ScheduleManager::ScheduleAlwaysOn; - } else { - thisVentilationMechanical.SchPtr = GetScheduleIndex(state, AlphArray(2)); // convert schedule name to pointer - if (thisVentilationMechanical.SchPtr == 0) { - ShowSevereError( - state, format("{}=\"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, AlphArray(1), cAlphaFields(2), AlphArray(2))); - ErrorsFound = true; - } - } - - // Adding new flag for DCV - if (UtilityRoutines::SameString(AlphArray(3), "Yes")) { - thisVentilationMechanical.DCVFlag = true; - } else if (UtilityRoutines::SameString(AlphArray(3), "No") || lAlphaBlanks(3)) { - thisVentilationMechanical.DCVFlag = false; - } else { - ShowSevereError(state, - format("{}=\"{}\" invalid value {}=\"{}\".", CurrentModuleObject, AlphArray(1), cAlphaFields(3), AlphArray(3))); - ShowContinueError(state, "...Valid values are \"Yes\" or \"No\"."); - ErrorsFound = true; - } - - // System outdoor air method - thisVentilationMechanical.SystemOAMethod = - static_cast(getEnumerationValue(SOAMNamesUC, UtilityRoutines::MakeUPPERCase(AlphArray(4)))); - - if (thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::IAQP || - thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc || - thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc || - thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate || - thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::IAQPCOM) { - if (!state.dataContaminantBalance->Contaminant.CO2Simulation) { - ShowSevereError( - state, - format( - "{}=\"{}\" valid {}=\"{}\" requires CO2 simulation.", CurrentModuleObject, AlphArray(1), cAlphaFields(2), AlphArray(2))); - ShowContinueError(state, "The choice must be Yes for the field Carbon Dioxide Concentration in ZoneAirContaminantBalance"); - ErrorsFound = true; - } - } - - if (thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::IAQPGC || - thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::IAQPCOM) { - if (!state.dataContaminantBalance->Contaminant.GenericContamSimulation) { - ShowSevereError(state, - format("{}=\"{}\" valid {}=\"{}\" requires generic contaminant simulation.", - CurrentModuleObject, - AlphArray(1), - cAlphaFields(2), - AlphArray(2))); - ShowContinueError(state, "The choice must be Yes for the field Generic Contaminant Concentration in ZoneAirContaminantBalance"); - ErrorsFound = true; - } - } - - if (thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::Invalid) { // If specified incorrectly, show errors - thisVentilationMechanical.SystemOAMethod = DataSizing::SysOAMethod::ZoneSum; - ShowWarningError(state, - format("{}=\"{}\" incorrect specification for {}, the ZoneSum method will be used.", - CurrentModuleObject, - AlphArray(1), - cAlphaFields(4))); - // ErrorsFound=.TRUE. - } - - // Zone maximum outdoor air fraction - thisVentilationMechanical.ZoneMaxOAFraction = NumArray(1); - - state.dataMixedAir->VentMechZoneOrListName.allocate(NumGroups); - state.dataMixedAir->DesignSpecOAObjName.allocate(NumGroups); - state.dataMixedAir->DesignSpecOAObjIndex.dimension(NumGroups, 0); - state.dataMixedAir->DesignSpecZoneADObjName.allocate(NumGroups); - state.dataMixedAir->DesignSpecZoneADObjIndex.dimension(NumGroups, 0); - - // First time through find the total number of zones requiring mechanical ventilation - // May include duplicate zones. Will check for duplicate zones further down in this subroutine. - for (int groupNum = 1; groupNum <= NumGroups; ++groupNum) { - state.dataMixedAir->VentMechZoneOrListName(groupNum) = AlphArray((groupNum - 1) * 3 + 5); - - // Getting OA details from design specification OA object - if (!lAlphaBlanks((groupNum - 1) * 3 + 6)) { - state.dataMixedAir->DesignSpecOAObjName(groupNum) = AlphArray((groupNum - 1) * 3 + 6); - int ObjIndex = UtilityRoutines::FindItemInList(state.dataMixedAir->DesignSpecOAObjName(groupNum), state.dataSize->OARequirements); - state.dataMixedAir->DesignSpecOAObjIndex(groupNum) = ObjIndex; - - if (ObjIndex == 0) { - ShowSevereError(state, format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, thisVentilationMechanical.Name)); - ShowContinueError(state, - format("... not found {}=\"{}\".", - cAlphaFields((groupNum - 1) * 3 + 6), - state.dataMixedAir->DesignSpecOAObjName(groupNum))); - ErrorsFound = true; - } - } - - // Get zone air distribution details from design specification Zone Air Distribution object - if (!lAlphaBlanks((groupNum - 1) * 3 + 7)) { - state.dataMixedAir->DesignSpecZoneADObjName(groupNum) = AlphArray((groupNum - 1) * 3 + 7); - int ObjIndex = - UtilityRoutines::FindItemInList(state.dataMixedAir->DesignSpecZoneADObjName(groupNum), state.dataSize->ZoneAirDistribution); - state.dataMixedAir->DesignSpecZoneADObjIndex(groupNum) = ObjIndex; - - if (ObjIndex == 0) { - // Cannot find the design specification Zone Air Distribution object - ShowSevereError(state, format("{}{}=\"{}\", invalid", RoutineName, CurrentModuleObject, thisVentilationMechanical.Name)); - ShowContinueError(state, - format("... not found {}=\"{}\".", - cAlphaFields((groupNum - 1) * 3 + 7), - state.dataMixedAir->DesignSpecZoneADObjName(groupNum))); - ErrorsFound = true; - } - } - - int ZoneNum = UtilityRoutines::FindItemInList(state.dataMixedAir->VentMechZoneOrListName(groupNum), state.dataHeatBal->Zone); - if (ZoneNum > 0) { - ++MechVentZoneCount; - } else { - int ZoneListNum = - UtilityRoutines::FindItemInList(state.dataMixedAir->VentMechZoneOrListName(groupNum), state.dataHeatBal->ZoneList); - if (ZoneListNum > 0) { - MechVentZoneCount += state.dataHeatBal->ZoneList(ZoneListNum).NumOfZones; - } else { - ShowWarningError( - state, - format("{}=\"{}\" invalid {} not found.", CurrentModuleObject, AlphArray(1), cAlphaFields((groupNum - 1) * 3 + 5))); - ShowContinueError( - state, - format("Missing {} = {}", cAlphaFields((groupNum - 1) * 3 + 5), state.dataMixedAir->VentMechZoneOrListName(groupNum))); - ErrorsFound = true; - } - } - } - - thisVentilationMechanical.NumofVentMechZones = MechVentZoneCount; - - // Now allocate and store unique zone and associated ventilation rate information - thisVentilationMechanical.VentMechZone.allocate(MechVentZoneCount); - - MechVentZoneCount = 0; - - // Loop through zone names and list of zone names, remove duplicate zones, and store designspec names and indexes - for (int groupNum = 1; groupNum <= NumGroups; ++groupNum) { - int ZoneNum = UtilityRoutines::FindItemInList(state.dataMixedAir->VentMechZoneOrListName(groupNum), state.dataHeatBal->Zone); - if (ZoneNum > 0) { - if (std::any_of(thisVentilationMechanical.VentMechZone.begin(), - thisVentilationMechanical.VentMechZone.end(), - [ZoneNum](auto const &vmZone) { return vmZone.zoneNum == ZoneNum; })) { - // Disregard duplicate zone names, show warning and do not store data for this zone - ShowWarningError(state, - format("Zone name = {} for {} object = {}", - state.dataMixedAir->VentMechZoneOrListName(groupNum), - CurrentModuleObject, - thisVentilationMechanical.Name)); - ShowContinueError(state, "is specified more than once. The first ventilation values specified for this zone will be used"); - ShowContinueError(state, "and the rest will be ignored. Simulation will continue.."); - } else { - // Store unique zone names - ++MechVentZoneCount; - auto &thisMechVentZone = thisVentilationMechanical.VentMechZone(MechVentZoneCount); - thisMechVentZone.zoneNum = ZoneNum; - thisMechVentZone.name = state.dataHeatBal->Zone(ZoneNum).Name; - - // Populating new temp array to hold design spec OA object for each zone - if (state.dataMixedAir->DesignSpecOAObjIndex(groupNum) > 0) { - thisMechVentZone.ZoneDesignSpecOAObjName = state.dataMixedAir->DesignSpecOAObjName(groupNum); - thisMechVentZone.ZoneDesignSpecOAObjIndex = state.dataMixedAir->DesignSpecOAObjIndex(groupNum); - } else { - if (state.dataGlobal->DoZoneSizing) { - int ObjIndex = UtilityRoutines::FindItemInList(state.dataMixedAir->VentMechZoneOrListName(groupNum), - state.dataSize->ZoneSizingInput, - &ZoneSizingInputData::ZoneName); - if (ObjIndex > 0) { - thisMechVentZone.ZoneDesignSpecOAObjName = state.dataSize->ZoneSizingInput(ObjIndex).DesignSpecOAObjName; - thisMechVentZone.ZoneDesignSpecOAObjIndex = state.dataSize->ZoneSizingInput(ObjIndex).ZoneDesignSpecOAIndex; - } - } - } - // Zone Air Distribution inputs - if (state.dataMixedAir->DesignSpecZoneADObjIndex(groupNum) > 0) { - // new DCV inputs - thisMechVentZone.ZoneDesignSpecADObjName = state.dataMixedAir->DesignSpecZoneADObjName(groupNum); - thisMechVentZone.ZoneDesignSpecADObjIndex = state.dataMixedAir->DesignSpecZoneADObjIndex(groupNum); - } else { - if (state.dataGlobal->DoZoneSizing) { - int ObjIndex = UtilityRoutines::FindItemInList(state.dataMixedAir->VentMechZoneOrListName(groupNum), - state.dataSize->ZoneSizingInput, - &ZoneSizingInputData::ZoneName); - if (ObjIndex > 0) { - thisMechVentZone.ZoneDesignSpecADObjName = state.dataSize->ZoneSizingInput(ObjIndex).ZoneAirDistEffObjName; - thisMechVentZone.ZoneDesignSpecADObjIndex = state.dataSize->ZoneSizingInput(ObjIndex).ZoneAirDistributionIndex; - } - } - } - } - } else { - // Not a zone name, must be a zone list - int ZoneListNum = - UtilityRoutines::FindItemInList(state.dataMixedAir->VentMechZoneOrListName(groupNum), state.dataHeatBal->ZoneList); - if (ZoneListNum > 0) { - for (int ScanZoneListNum = 1; ScanZoneListNum <= state.dataHeatBal->ZoneList(ZoneListNum).NumOfZones; ++ScanZoneListNum) { - // check to make sure zone name is unique (not listed more than once)... - int zoneNum2 = state.dataHeatBal->ZoneList(ZoneListNum).Zone(ScanZoneListNum); - if (std::any_of(thisVentilationMechanical.VentMechZone.begin(), - thisVentilationMechanical.VentMechZone.end(), - [zoneNum2](auto const &vmZone) { return vmZone.zoneNum == zoneNum2; })) { - // Disregard duplicate zone names, show warning and do not store data for this zone - ShowWarningError(state, - format("Zone name = {} in ZoneList = {} for {} object = {}", - state.dataHeatBal->Zone(zoneNum2).Name, - state.dataMixedAir->VentMechZoneOrListName(groupNum), - CurrentModuleObject, - thisVentilationMechanical.Name)); - ShowContinueError(state, "is a duplicate. The first ventilation values specified for this zone will be used "); - ShowContinueError(state, "and the rest will be ignored. The simulation will continue..."); - } else { - // Store data for each zone name from zone list (duplicate zone names accounted for in - // HeatBalanceManager) - ++MechVentZoneCount; - auto &thisMechVentZone = thisVentilationMechanical.VentMechZone(MechVentZoneCount); - thisMechVentZone.zoneNum = zoneNum2; - thisMechVentZone.name = state.dataHeatBal->Zone(zoneNum2).Name; - // Populating new temp array to hold design spec OA object for each zone - if (state.dataMixedAir->DesignSpecOAObjIndex(groupNum) > 0) { - thisMechVentZone.ZoneDesignSpecOAObjName = state.dataMixedAir->DesignSpecOAObjName(groupNum); - thisMechVentZone.ZoneDesignSpecOAObjIndex = state.dataMixedAir->DesignSpecOAObjIndex(groupNum); - } else { - if (state.dataGlobal->DoZoneSizing) { - int ObjIndex = UtilityRoutines::FindItemInList( - state.dataHeatBal->Zone(zoneNum2).Name, state.dataSize->ZoneSizingInput, &ZoneSizingInputData::ZoneName); - if (ObjIndex > 0) { - thisMechVentZone.ZoneDesignSpecOAObjName = state.dataSize->ZoneSizingInput(ObjIndex).DesignSpecOAObjName; - thisMechVentZone.ZoneDesignSpecOAObjIndex = - state.dataSize->ZoneSizingInput(ObjIndex).ZoneDesignSpecOAIndex; - } - } - } - - if (state.dataMixedAir->DesignSpecZoneADObjIndex(groupNum) > 0) { - // new DCV inputs - thisMechVentZone.ZoneDesignSpecADObjName = state.dataMixedAir->DesignSpecZoneADObjName(groupNum); - thisMechVentZone.ZoneDesignSpecADObjIndex = state.dataMixedAir->DesignSpecZoneADObjIndex(groupNum); - } else { - if (state.dataGlobal->DoZoneSizing) { - int ObjIndex = UtilityRoutines::FindItemInList( - state.dataHeatBal->Zone(zoneNum2).Name, state.dataSize->ZoneSizingInput, &ZoneSizingInputData::ZoneName); - if (ObjIndex > 0) { - thisMechVentZone.ZoneDesignSpecADObjName = - state.dataSize->ZoneSizingInput(ObjIndex).ZoneAirDistEffObjName; - thisMechVentZone.ZoneDesignSpecADObjIndex = - state.dataSize->ZoneSizingInput(ObjIndex).ZoneAirDistributionIndex; - } - } - } - } - } - } - } - } - - // Overwrite previous number of zones with number that does not include duplicates - thisVentilationMechanical.NumofVentMechZones = MechVentZoneCount; - - // Loop over zones and fill OA and AD specs, if none were found, use defaults - for (int ventMechZoneNum = 1; ventMechZoneNum <= MechVentZoneCount; ++ventMechZoneNum) { - auto &thisVentMechZone = thisVentilationMechanical.VentMechZone(ventMechZoneNum); - int zoneOAReqObjIndex = thisVentMechZone.ZoneDesignSpecOAObjIndex; - if (zoneOAReqObjIndex > 0) { - auto const &curOARequirements(state.dataSize->OARequirements(zoneOAReqObjIndex)); - thisVentMechZone.ZoneOAAreaRate = curOARequirements.OAFlowPerArea; - thisVentMechZone.ZoneOAPeopleRate = curOARequirements.OAFlowPerPerson; - thisVentMechZone.ZoneOAFlowRate = curOARequirements.OAFlowPerZone; - thisVentMechZone.ZoneOAACHRate = curOARequirements.OAFlowACH; - thisVentMechZone.ZoneOAFlowMethod = curOARequirements.OAFlowMethod; - thisVentMechZone.ZoneOASchPtr = curOARequirements.OAFlowFracSchPtr; - thisVentMechZone.OAPropCtlMinRateSchPtr = curOARequirements.OAPropCtlMinRateSchPtr; - if (thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate) { - if (thisVentMechZone.ZoneOAPeopleRate == 0.0 && thisVentMechZone.ZoneOAAreaRate == 0.0) { - ShowSevereError( - state, - format("{}{}=\"{}\", invalid input with System Outdoor Air Method = ProportionalControlBasedOnDesignOARate.", - RoutineName, - CurrentModuleObject, - thisVentilationMechanical.Name)); - ShowContinueError(state, - " The values of Outdoor Air Flow per Person and Outdoor Air Flow per Zone Floor Area in the same " - "object can not be zero."); - ErrorsFound = true; - } - } - } else { // use defaults - thisVentMechZone.ZoneOAAreaRate = 0.0; - // since this is case with no DesSpcOA object, cannot determine the method and default would be Flow/Person which should - // default to this flow rate - thisVentMechZone.ZoneOAPeopleRate = 0.00944; - thisVentMechZone.ZoneOAFlowRate = 0.0; - thisVentMechZone.ZoneOAACHRate = 0.0; - thisVentMechZone.ZoneOAFlowMethod = OAFlowCalcMethod::PerPerson; - thisVentMechZone.ZoneOASchPtr = ScheduleManager::ScheduleAlwaysOn; - ShowWarningError(state, format("{}{}=\"{}", RoutineName, CurrentModuleObject, thisVentilationMechanical.Name)); - ShowContinueError( - state, format("Cannot locate a matching DesignSpecification:OutdoorAir object for Zone=\"{}\".", thisVentMechZone.name)); - ShowContinueError(state, "Using default OA of 0.00944 m3/s-person and 0.0 m3/s-m2."); - } - int zoneAirDistObjIndex = thisVentMechZone.ZoneDesignSpecADObjIndex; - if (zoneAirDistObjIndex > 0) { - auto const &curZoneAirDistribution(state.dataSize->ZoneAirDistribution(zoneAirDistObjIndex)); - thisVentMechZone.ZoneADEffCooling = curZoneAirDistribution.ZoneADEffCooling; - thisVentMechZone.ZoneADEffHeating = curZoneAirDistribution.ZoneADEffHeating; - thisVentMechZone.ZoneADEffSchPtr = curZoneAirDistribution.ZoneADEffSchPtr; - thisVentMechZone.ZoneSecondaryRecirculation = curZoneAirDistribution.ZoneSecondaryRecirculation; - } else { // use defaults - thisVentMechZone.ZoneADEffCooling = 1.0; - thisVentMechZone.ZoneADEffHeating = 1.0; - thisVentMechZone.ZoneSecondaryRecirculation = 0.0; - ShowWarningError(state, format("{}{}=\"{}\"", RoutineName, CurrentModuleObject, thisVentilationMechanical.Name)); - ShowContinueError( - state, - format("Cannot locate a matching DesignSpecification:ZoneAirDistribution object for Zone=\"{}\".", thisVentMechZone.name)); - ShowContinueError(state, "Using default zone air distribution effectiveness of 1.0 for heating and cooling."); - } - } - state.dataMixedAir->VentMechZoneOrListName.deallocate(); - state.dataMixedAir->DesignSpecOAObjName.deallocate(); - state.dataMixedAir->DesignSpecOAObjIndex.deallocate(); - state.dataMixedAir->DesignSpecZoneADObjName.deallocate(); - state.dataMixedAir->DesignSpecZoneADObjIndex.deallocate(); - } - - for (int VentMechNum = 1; VentMechNum <= state.dataMixedAir->NumVentMechControllers; ++VentMechNum) { - auto &thisVentilationMechanical(state.dataMixedAir->VentilationMechanical(VentMechNum)); - for (int jZone = 1; jZone <= thisVentilationMechanical.NumofVentMechZones; ++jZone) { - auto &thisVentMechZone = thisVentilationMechanical.VentMechZone(jZone); - if (thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc) { - if (thisVentMechZone.ZoneOAACHRate > 0.0 || thisVentMechZone.ZoneOAFlowRate > 0.0) { - ShowWarningError(state, - format("{}=\"{}\", inappropriate outdoor air method", CurrentModuleObject, thisVentilationMechanical.Name)); - ShowContinueError(state, - format("Inappropriate method for Design Specification Outdoor Air Object Name=\"{}\".", - thisVentMechZone.ZoneDesignSpecOAObjName)); - ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); - ShowContinueError(state, - "Since System Outdoor Air Method= ProportionalControlBasedOnOccupancySchedule\", AirChanges/Hour or " - "Flow/Zone outdoor air methods are not valid. Simulation continues.... "); - } - } - if (thisVentilationMechanical.SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc) { - if (thisVentMechZone.ZoneOAACHRate > 0.0 || thisVentMechZone.ZoneOAFlowRate > 0.0) { - ShowWarningError(state, - format("{}=\"{}\", inappropriate outdoor air method", CurrentModuleObject, thisVentilationMechanical.Name)); - ShowContinueError(state, - format("Inappropriate method for Design Specification Outdoor Air Object Name=\"{}\".", - thisVentMechZone.ZoneDesignSpecOAObjName)); - ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); - ShowContinueError(state, - "Since System Outdoor Air Method= ProportionalControlBasedOnDesignOccupancy\", AirChanges/Hour or " - "Flow/Zone outdoor air methods are not valid. Simulation continues.... "); - } - } - - // Error check to see if a single duct air terminal is assigned to a zone that has zone secondary recirculation - if (thisVentMechZone.ZoneSecondaryRecirculation > 0.0) { - int ZoneNum = thisVentMechZone.zoneNum; - if (ZoneNum > 0) { - int EquipListIndex = state.dataZoneEquip->ZoneEquipConfig(ZoneNum).EquipListIndex; - if (EquipListIndex > 0) { - for (int EquipListNum = 1; EquipListNum <= state.dataZoneEquip->NumOfZoneEquipLists; ++EquipListNum) { - if (EquipListNum == EquipListIndex) { - for (int EquipNum = 1; EquipNum <= state.dataZoneEquip->ZoneEquipList(EquipListNum).NumOfEquipTypes; ++EquipNum) { - if (UtilityRoutines::SameString(state.dataZoneEquip->ZoneEquipList(EquipListNum).EquipType(EquipNum), - "ZONEHVAC:AIRDISTRIBUTIONUNIT")) { - for (int ADUNum = 1; ADUNum <= (int)state.dataDefineEquipment->AirDistUnit.size(); ++ADUNum) { - if (UtilityRoutines::SameString(state.dataZoneEquip->ZoneEquipList(EquipListNum).EquipName(EquipNum), - state.dataDefineEquipment->AirDistUnit(ADUNum).Name)) { - if ((state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == - DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheat) || - (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == - DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolNoReheat) || - (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == - DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolReheat) || - (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == - DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVNoReheat) || - (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == - DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheatVSFan) || - (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == - DataDefineEquip::ZnAirLoopEquipType::SingleDuctCBVAVReheat) || - (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == - DataDefineEquip::ZnAirLoopEquipType::SingleDuctCBVAVNoReheat) || - (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == - DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolCooledBeam) || - (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == - DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolFourPipeBeam) || - (state.dataDefineEquipment->AirDistUnit(ADUNum).EquipTypeEnum(EquipNum) == - DataDefineEquip::ZnAirLoopEquipType::DualDuctVAVOutdoorAir)) { - ShowWarningError(state, - format("{}=\"{}\", inappropriate use of Zone secondary recirculation", - CurrentModuleObject, - thisVentilationMechanical.Name)); - ShowContinueError(state, - "A zone secondary recirculation fraction is specified for zone served by "); - ShowContinueError(state, - format("...terminal unit \"{}\" , that indicates a single path system", - state.dataDefineEquipment->AirDistUnit(ADUNum).Name)); - ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); - ShowContinueError(state, "...The zone secondary recirculation for that zone was set to 0.0"); - thisVentMechZone.ZoneSecondaryRecirculation = 0.0; - } - goto EquipLoop_exit; - } - } - } - } - } - } - EquipLoop_exit:; - } - } - } - if (thisVentMechZone.ZoneDesignSpecOAObjName.empty()) { - ShowSevereError( - state, - format("{}=\"{}\", Design Specification Outdoor Air Object Name blank", CurrentModuleObject, thisVentilationMechanical.Name)); - ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); - ShowContinueError(state, "This field either needs to be filled in in this object or Sizing:Zone object."); - ShowContinueError(state, "For this run, default values for these fields will be used."); - } - if (thisVentMechZone.ZoneOAPeopleRate <= 0.0 && thisVentilationMechanical.DCVFlag) { - ShowWarningError(state, format("{}=\"{}\", Zone OA/person rate", CurrentModuleObject, thisVentilationMechanical.Name)); - ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); - ShowContinueError(state, - format("Zone outside air per person rate not set in Design Specification Outdoor Air Object=\"{}\".", - thisVentMechZone.ZoneDesignSpecOAObjName)); - } - - if (thisVentMechZone.ZoneOAAreaRate < 0.0) { - ShowSevereError(state, - format("{}=\"{}\", invalid Outdoor Air flow per area", CurrentModuleObject, thisVentilationMechanical.Name)); - ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); - ShowContinueError(state, - format("invalid Outdoor Air flow per area specified in object=\"{}\". Value must be >= 0.0.", - thisVentMechZone.ZoneDesignSpecOAObjName)); - ErrorsFound = true; - } - if (thisVentMechZone.ZoneOAPeopleRate < 0.0) { - ShowSevereError(state, - format("{}=\"{}\", invalid Outdoor Air flow per person", CurrentModuleObject, thisVentilationMechanical.Name)); - ShowContinueError(state, format("For Zone=\"{}\".", thisVentMechZone.name)); - ShowContinueError(state, - format("invalid Outdoor Air flow per person specified in object \"{}\". Value must be >= 0.0.", - thisVentMechZone.ZoneDesignSpecOAObjName)); - ErrorsFound = true; - } - } - } - - // Link OA controller object with mechanical ventilation object - for (int OAControllerNum = 1; OAControllerNum <= state.dataMixedAir->NumOAControllers; ++OAControllerNum) { - state.dataMixedAir->OAController(OAControllerNum).VentMechObjectNum = UtilityRoutines::FindItemInList( - state.dataMixedAir->OAController(OAControllerNum).VentilationMechanicalName, state.dataMixedAir->VentilationMechanical); - if (state.dataMixedAir->OAController(OAControllerNum).VentMechObjectNum == 0 && - !state.dataMixedAir->OAController(OAControllerNum).VentilationMechanicalName.empty()) { - ShowSevereError(state, - format("{}=\"{}\", non-match to Controller:OutdoorAir", - CurrentModuleObject, - state.dataMixedAir->OAController(OAControllerNum).VentilationMechanicalName)); - ShowContinueError( - state, format("Invalid specified in Controller:OutdoorAir object = {}", state.dataMixedAir->OAController(OAControllerNum).Name)); - ShowContinueError(state, - format("{} object name must match the {} object name specified in Controller:OutdoorAir.", - CurrentModuleObject, - CurrentModuleObject)); - ErrorsFound = true; - } - } - - // write to .eio file - static constexpr std::string_view Format_700( - "!,Name,Availability Schedule Name,Demand Controlled Ventilation " - "{Yes/No},System Outdoor Air Method,Zone Maximum Outdoor Air Fraction,Number of Zones,Zone Name,DSOA " - "Name,DSZAD Name"); - print(state.files.eio, "{}\n", Format_700); - for (int VentMechNum = 1; VentMechNum <= state.dataMixedAir->NumVentMechControllers; ++VentMechNum) { - auto &thisVentilationMechanical(state.dataMixedAir->VentilationMechanical(VentMechNum)); - print(state.files.eio, " Controller:MechanicalVentilation,{},{},", thisVentilationMechanical.Name, thisVentilationMechanical.SchName); - - if (thisVentilationMechanical.DCVFlag) { - print(state.files.eio, "Yes,"); - } else { - print(state.files.eio, "No,"); - } - - if (thisVentilationMechanical.SystemOAMethod != DataSizing::SysOAMethod::Invalid) { - print(state.files.eio, printSysOAMethod[static_cast(thisVentilationMechanical.SystemOAMethod)]); - } else { - print(state.files.eio, "Invalid/Unknown,"); - } - - print(state.files.eio, "{:.2R},", thisVentilationMechanical.ZoneMaxOAFraction); - print(state.files.eio, "{},", thisVentilationMechanical.NumofVentMechZones); - - for (int jZone = 1; jZone <= thisVentilationMechanical.NumofVentMechZones; ++jZone) { - auto &thisVentMechZone = thisVentilationMechanical.VentMechZone(jZone); - if (jZone < thisVentilationMechanical.NumofVentMechZones) { - print(state.files.eio, - "{},{},{},", - state.dataHeatBal->Zone(thisVentMechZone.zoneNum).Name, - thisVentMechZone.ZoneDesignSpecOAObjName, - thisVentMechZone.ZoneDesignSpecADObjName); - } else { - print(state.files.eio, - "{},{},{}\n", - state.dataHeatBal->Zone(thisVentMechZone.zoneNum).Name, - thisVentMechZone.ZoneDesignSpecOAObjName, - thisVentMechZone.ZoneDesignSpecADObjName); - } - } - } - - } // Number of Mechanical Ventilation Objects > 0 - - AlphArray.deallocate(); - NumArray.deallocate(); - lNumericBlanks.deallocate(); - lAlphaBlanks.deallocate(); - cAlphaFields.deallocate(); - cNumericFields.deallocate(); - - if (ErrorsFound) { - ShowFatalError(state, format("{}Errors found when getting {} inputs.", RoutineName, CurrentModuleObject)); - } -} - -void AllocateOAControllers(EnergyPlusData &state) -{ - // PURPOSE OF THIS SUBROUTINE: - // Allocate the OA controller arrays which are shared by Controller:OutdoorAir and ZoneHVAC:EnergyRecoveryVentilator:Controller - - if (state.dataMixedAir->AllocateOAControllersFlag) { - state.dataMixedAir->NumOAControllers = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObjects[static_cast(CMO::OAController)]); - state.dataMixedAir->NumERVControllers = - state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObjects[static_cast(CMO::ERVController)]); - state.dataMixedAir->NumOAControllers += state.dataMixedAir->NumERVControllers; - state.dataMixedAir->OAController.allocate(state.dataMixedAir->NumOAControllers); - state.dataMixedAir->OAControllerUniqueNames.reserve(static_cast(state.dataMixedAir->NumOAControllers)); - state.dataMixedAir->AllocateOAControllersFlag = false; - } -} - -void GetOAMixerInputs(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - - // PURPOSE OF THIS SUBROUTINE - // Input the OAMixer data and store it in the OAMixer array. - - // METHODOLOGY EMPLOYED: - // Use the Get routines from the InputProcessor module. - - // SUBROUTINE PARAMETER DEFINITIONS: - static constexpr std::string_view RoutineName("GetOAMixerInputs: "); // include trailing blank space - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - - int NumNums; // Number of REAL(r64) numbers returned by GetObjectItem - int NumAlphas; // Number of alphanumerics returned by GetObjectItem - int NumArg; // Number of arguments from GetObjectDefMaxArgs call - int IOStat; - Array1D NumArray; // array that holds numeric input values - Array1D_string AlphArray; // array that holds alpha input values - Array1D_string cAlphaFields; // Alpha field names - Array1D_string cNumericFields; // Numeric field names - Array1D_bool lAlphaBlanks; // Logical array, alpha field input BLANK = .TRUE. - Array1D_bool lNumericBlanks; // Logical array, numeric field input BLANK = .TRUE. - bool ErrorsFound(false); - - if (!state.dataMixedAir->GetOAMixerInputFlag) return; - - state.dataInputProcessing->inputProcessor->getObjectDefMaxArgs( - state, CurrentModuleObjects[static_cast(CMO::OAMixer)], NumArg, NumAlphas, NumNums); - - AlphArray.allocate(NumAlphas); - NumArray.dimension(NumNums, 0.0); - lNumericBlanks.dimension(NumNums, true); - lAlphaBlanks.dimension(NumAlphas, true); - cAlphaFields.allocate(NumAlphas); - cNumericFields.allocate(NumNums); - - std::string_view const CurrentModuleObject = CurrentModuleObjects[static_cast(CMO::OAMixer)]; - - state.dataMixedAir->NumOAMixers = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - - if (state.dataMixedAir->NumOAMixers > 0) { - - state.dataMixedAir->OAMixer.allocate(state.dataMixedAir->NumOAMixers); - - for (int OutAirNum = 1; OutAirNum <= state.dataMixedAir->NumOAMixers; ++OutAirNum) { - state.dataInputProcessing->inputProcessor->getObjectItem(state, - CurrentModuleObject, - OutAirNum, - AlphArray, - NumAlphas, - NumArray, - NumNums, - IOStat, - lNumericBlanks, - lAlphaBlanks, - cAlphaFields, - cNumericFields); - // no need to check if AlphaArray(1) is empty since Json will catch missing required fields - state.dataMixedAir->OAMixer(OutAirNum).Name = AlphArray(1); - state.dataMixedAir->OAMixer(OutAirNum).MixNode = NodeInputManager::GetOnlySingleNode(state, - AlphArray(2), - ErrorsFound, - DataLoopNode::ConnectionObjectType::OutdoorAirMixer, - AlphArray(1), - DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Outlet, - NodeInputManager::CompFluidStream::Primary, - ObjectIsNotParent); - // Set connection type to 'Inlet', because this is not necessarily directly from - // outside air. Outside Air Inlet Node List will set the connection to outside air - state.dataMixedAir->OAMixer(OutAirNum).InletNode = - NodeInputManager::GetOnlySingleNode(state, - AlphArray(3), - ErrorsFound, - DataLoopNode::ConnectionObjectType::OutdoorAirMixer, - AlphArray(1), - DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Inlet, - NodeInputManager::CompFluidStream::Primary, - ObjectIsNotParent); - state.dataMixedAir->OAMixer(OutAirNum).RelNode = NodeInputManager::GetOnlySingleNode(state, - AlphArray(4), - ErrorsFound, - DataLoopNode::ConnectionObjectType::OutdoorAirMixer, - AlphArray(1), - DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::ReliefAir, - NodeInputManager::CompFluidStream::Primary, - ObjectIsNotParent); - state.dataMixedAir->OAMixer(OutAirNum).RetNode = NodeInputManager::GetOnlySingleNode(state, - AlphArray(5), - ErrorsFound, - DataLoopNode::ConnectionObjectType::OutdoorAirMixer, - AlphArray(1), - DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Inlet, - NodeInputManager::CompFluidStream::Primary, - ObjectIsNotParent); - // Check for dupes in the four nodes. - if (state.dataMixedAir->OAMixer(OutAirNum).MixNode == state.dataMixedAir->OAMixer(OutAirNum).InletNode) { - ShowSevereError(state, - format("{} = {} {} = {} duplicates the {}.", - CurrentModuleObject, - state.dataMixedAir->OAMixer(OutAirNum).Name, - cAlphaFields(3), - state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OutAirNum).InletNode), - cAlphaFields(2))); - ErrorsFound = true; - } else if (state.dataMixedAir->OAMixer(OutAirNum).MixNode == state.dataMixedAir->OAMixer(OutAirNum).RelNode) { - ShowSevereError(state, - format("{} = {} {} = {} duplicates the {}.", - CurrentModuleObject, - state.dataMixedAir->OAMixer(OutAirNum).Name, - cAlphaFields(4), - state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OutAirNum).RelNode), - cAlphaFields(2))); - ErrorsFound = true; - } else if (state.dataMixedAir->OAMixer(OutAirNum).MixNode == state.dataMixedAir->OAMixer(OutAirNum).RetNode) { - ShowSevereError(state, - format("{} = {} {} = {} duplicates the {}.", - CurrentModuleObject, - state.dataMixedAir->OAMixer(OutAirNum).Name, - cAlphaFields(5), - state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OutAirNum).RetNode), - cAlphaFields(2))); - ErrorsFound = true; - } - - if (state.dataMixedAir->OAMixer(OutAirNum).InletNode == state.dataMixedAir->OAMixer(OutAirNum).RelNode) { - ShowSevereError(state, - format("{} = {} {} = {} duplicates the {}.", - CurrentModuleObject, - state.dataMixedAir->OAMixer(OutAirNum).Name, - cAlphaFields(4), - state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OutAirNum).RelNode), - cAlphaFields(3))); - ErrorsFound = true; - } else if (state.dataMixedAir->OAMixer(OutAirNum).InletNode == state.dataMixedAir->OAMixer(OutAirNum).RetNode) { - ShowSevereError(state, - format("{} = {} {} = {} duplicates the {}.", - CurrentModuleObject, - state.dataMixedAir->OAMixer(OutAirNum).Name, - cAlphaFields(5), - state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OutAirNum).RetNode), - cAlphaFields(3))); - ErrorsFound = true; - } - - if (state.dataMixedAir->OAMixer(OutAirNum).RelNode == state.dataMixedAir->OAMixer(OutAirNum).RetNode) { - ShowSevereError(state, - format("{} = {} {} = {} duplicates the {}.", - CurrentModuleObject, - state.dataMixedAir->OAMixer(OutAirNum).Name, - cAlphaFields(5), - state.dataLoopNodes->NodeID(state.dataMixedAir->OAMixer(OutAirNum).RetNode), - cAlphaFields(4))); - ErrorsFound = true; - } - BranchNodeConnections::TestCompSet( - state, CurrentModuleObject, state.dataMixedAir->OAMixer(OutAirNum).Name, AlphArray(3), AlphArray(2), "Air Nodes"); - } - } - - if (ErrorsFound) { - ShowFatalError(state, format("{}Errors found in getting {}", RoutineName, CurrentModuleObject)); - } - - state.dataMixedAir->GetOAMixerInputFlag = false; -} - -void ProcessOAControllerInputs(EnergyPlusData &state, - std::string_view const CurrentModuleObject, - int const OutAirNum, - Array1D_string const &AlphArray, - int &NumAlphas, - Array1D const &NumArray, - int &NumNums, - Array1D_bool const &lNumericBlanks, // Unused - Array1D_bool const &lAlphaBlanks, - Array1D_string const &cAlphaFields, - Array1D_string const &cNumericFields, // Unused - bool &ErrorsFound // If errors found in input -) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - // MODIFIED Shirey/Raustad FSEC, June 2003, Jan 2004 - // Mangesh Basarkar, 06/2011: Getting zone OA specifications from Design Specification Object - // Tianzhen Hong, 3/2012: getting zone air distribution effectiveness and secondary recirculation - // from DesignSpecification:ZoneAirDistribution objects - // RE-ENGINEERED MJW: Split out processing controller:outdoorair input to facilitate unit testing, Feb 2015 - - // PURPOSE OF THIS SUBROUTINE - // Input the OAController data and store it in the OAController array. - - // SUBROUTINE PARAMETER DEFINITIONS: - static constexpr std::string_view RoutineName("GetOAControllerInputs: "); // include trailing blank space - - state.dataMixedAir->OAController(OutAirNum).Name = AlphArray(1); - state.dataMixedAir->OAController(OutAirNum).ControllerType = MixedAirControllerType::ControllerOutsideAir; - state.dataMixedAir->OAController(OutAirNum).MaxOA = NumArray(2); - state.dataMixedAir->OAController(OutAirNum).MinOA = NumArray(1); - state.dataMixedAir->OAController(OutAirNum).MixNode = - NodeInputManager::GetOnlySingleNode(state, - AlphArray(4), - ErrorsFound, - DataLoopNode::ConnectionObjectType::ControllerOutdoorAir, - AlphArray(1), - DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Sensor, - NodeInputManager::CompFluidStream::Primary, - ObjectIsNotParent); - state.dataMixedAir->OAController(OutAirNum).OANode = NodeInputManager::GetOnlySingleNode(state, - AlphArray(5), - ErrorsFound, - DataLoopNode::ConnectionObjectType::ControllerOutdoorAir, - AlphArray(1), - DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Actuator, - NodeInputManager::CompFluidStream::Primary, - ObjectIsNotParent); - if (!OutAirNodeManager::CheckOutAirNodeNumber(state, state.dataMixedAir->OAController(OutAirNum).OANode)) { - ShowWarningError(state, - format("{}=\"{}\": {}=\"{}\" is not an OutdoorAir:Node.", CurrentModuleObject, AlphArray(1), cAlphaFields(5), AlphArray(5))); - ShowContinueError(state, "Confirm that this is the intended source for the outdoor air stream."); - } - if (UtilityRoutines::SameString(AlphArray(6), "NoEconomizer")) { - state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::NoEconomizer; - } else if (UtilityRoutines::SameString(AlphArray(6), "FixedDryBulb")) { - state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::FixedDryBulb; - } else if (UtilityRoutines::SameString(AlphArray(6), "FixedEnthalpy")) { - state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::FixedEnthalpy; - } else if (UtilityRoutines::SameString(AlphArray(6), "FixedDewPointAndDryBulb")) { - state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::FixedDewPointAndDryBulb; - } else if (UtilityRoutines::SameString(AlphArray(6), "DifferentialDryBulb")) { - state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::DifferentialDryBulb; - } else if (UtilityRoutines::SameString(AlphArray(6), "DifferentialEnthalpy")) { - state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::DifferentialEnthalpy; - } else if (UtilityRoutines::SameString(AlphArray(6), "DifferentialDryBulbAndEnthalpy")) { - state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::DifferentialDryBulbAndEnthalpy; - } else if (UtilityRoutines::SameString(AlphArray(6), "ElectronicEnthalpy")) { - state.dataMixedAir->OAController(OutAirNum).Econo = EconoOp::ElectronicEnthalpy; - } else { - ShowSevereError(state, format("{}=\"{}\" invalid {}=\"{}\" value.", CurrentModuleObject, AlphArray(1), cAlphaFields(6), AlphArray(6))); - ErrorsFound = true; - } - // Bypass choice - Added by Amit for new feature implementation - if (UtilityRoutines::SameString(AlphArray(7), "ModulateFlow")) { - state.dataMixedAir->OAController(OutAirNum).EconBypass = false; - } else if (UtilityRoutines::SameString(AlphArray(7), "MinimumFlowWithBypass")) { - state.dataMixedAir->OAController(OutAirNum).EconBypass = true; - } else { - ShowSevereError(state, format("{}=\"{}\" invalid {}=\"{}\" value.", CurrentModuleObject, AlphArray(1), cAlphaFields(7), AlphArray(7))); - ErrorsFound = true; - } - - if (UtilityRoutines::SameString(AlphArray(9), "NoLockout")) { - state.dataMixedAir->OAController(OutAirNum).Lockout = LockoutType::NoLockoutPossible; - } else if (UtilityRoutines::SameString(AlphArray(9), "LockoutWithHeating")) { - state.dataMixedAir->OAController(OutAirNum).Lockout = LockoutType::LockoutWithHeatingPossible; - } else if (UtilityRoutines::SameString(AlphArray(9), "LockoutWithCompressor")) { - state.dataMixedAir->OAController(OutAirNum).Lockout = LockoutType::LockoutWithCompressorPossible; - } else { - ShowSevereError(state, format("{}=\"{}\" invalid {}=\"{}\" value.", CurrentModuleObject, AlphArray(1), cAlphaFields(9), AlphArray(9))); - ErrorsFound = true; - } - if (UtilityRoutines::SameString(AlphArray(10), "FixedMinimum")) { - state.dataMixedAir->OAController(OutAirNum).FixedMin = true; - } else { - state.dataMixedAir->OAController(OutAirNum).FixedMin = false; - } - if (lNumericBlanks(3)) { - state.dataMixedAir->OAController(OutAirNum).TempLim = BlankNumeric; - } else { - state.dataMixedAir->OAController(OutAirNum).TempLim = NumArray(3); - } - - if (lNumericBlanks(4)) { - state.dataMixedAir->OAController(OutAirNum).EnthLim = BlankNumeric; - } else { - state.dataMixedAir->OAController(OutAirNum).EnthLim = NumArray(4); - } - if (lNumericBlanks(5)) { - state.dataMixedAir->OAController(OutAirNum).DPTempLim = BlankNumeric; - } else { - state.dataMixedAir->OAController(OutAirNum).DPTempLim = NumArray(5); - } - - if (lNumericBlanks(6)) { - state.dataMixedAir->OAController(OutAirNum).TempLowLim = BlankNumeric; - } else { - state.dataMixedAir->OAController(OutAirNum).TempLowLim = NumArray(6); - } - - if (!lAlphaBlanks(8)) { - state.dataMixedAir->OAController(OutAirNum).EnthalpyCurvePtr = Curve::GetCurveIndex(state, AlphArray(8)); // convert curve name to number - if (state.dataMixedAir->OAController(OutAirNum).EnthalpyCurvePtr == 0) { - ShowSevereError(state, - format("{}=\"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, AlphArray(1), cAlphaFields(8), AlphArray(8))); - ErrorsFound = true; - } else { - // Verify Curve Object, only legal types are Quadratic and Cubic - ErrorsFound |= Curve::CheckCurveDims(state, - state.dataMixedAir->OAController(OutAirNum).EnthalpyCurvePtr, // Curve index - {1}, // Valid dimensions - RoutineName, // Routine name - CurrentModuleObject, // Object Type - state.dataMixedAir->OAController(OutAirNum).Name, // Object Name - cAlphaFields(8)); // Field Name - } - } - - state.dataMixedAir->OAController(OutAirNum).RelNode = - NodeInputManager::GetOnlySingleNode(state, - AlphArray(2), - ErrorsFound, - DataLoopNode::ConnectionObjectType::ControllerOutdoorAir, - AlphArray(1), - DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Actuator, - NodeInputManager::CompFluidStream::Primary, - ObjectIsNotParent); - state.dataMixedAir->OAController(OutAirNum).RetNode = - NodeInputManager::GetOnlySingleNode(state, - AlphArray(3), - ErrorsFound, - DataLoopNode::ConnectionObjectType::ControllerOutdoorAir, - AlphArray(1), - DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Sensor, - NodeInputManager::CompFluidStream::Primary, - ObjectIsNotParent); - state.dataMixedAir->OAController(OutAirNum).MinOASch = AlphArray(11); - state.dataMixedAir->OAController(OutAirNum).MinOASchPtr = GetScheduleIndex(state, AlphArray(11)); - if (state.dataMixedAir->OAController(OutAirNum).MinOASchPtr == 0 && (!lAlphaBlanks(11))) { - ShowSevereError(state, format("{}=\"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, AlphArray(1), cAlphaFields(11), AlphArray(11))); - ErrorsFound = true; - } - - // Changed by Amit for new feature implementation - state.dataMixedAir->OAController(OutAirNum).MinOAflowSch = AlphArray(12); - state.dataMixedAir->OAController(OutAirNum).MinOAflowSchPtr = GetScheduleIndex(state, AlphArray(12)); - if (state.dataMixedAir->OAController(OutAirNum).MinOAflowSchPtr == 0 && (!lAlphaBlanks(12))) { - ShowSevereError(state, format("{}=\"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, AlphArray(1), cAlphaFields(12), AlphArray(12))); - ErrorsFound = true; - } - - state.dataMixedAir->OAController(OutAirNum).MaxOAflowSch = AlphArray(13); - state.dataMixedAir->OAController(OutAirNum).MaxOAflowSchPtr = GetScheduleIndex(state, AlphArray(13)); - if (state.dataMixedAir->OAController(OutAirNum).MaxOAflowSchPtr == 0 && (!lAlphaBlanks(13))) { - ShowSevereError(state, format("{}=\"{}\" invalid {}=\"{}\" not found.", CurrentModuleObject, AlphArray(1), cAlphaFields(13), AlphArray(13))); - ErrorsFound = true; - } - state.dataMixedAir->OAController(OutAirNum).VentilationMechanicalName = AlphArray(14); - - // Check for a time of day economizer control schedule - state.dataMixedAir->OAController(OutAirNum).EconomizerOASchedPtr = GetScheduleIndex(state, AlphArray(15)); - - // High humidity control option can be used with any economizer flag - if (UtilityRoutines::SameString(AlphArray(16), "Yes")) { - - state.dataMixedAir->OAController(OutAirNum).HumidistatZoneNum = UtilityRoutines::FindItemInList(AlphArray(17), state.dataHeatBal->Zone); - - // Get the node number for the zone with the humidistat - if (state.dataMixedAir->OAController(OutAirNum).HumidistatZoneNum > 0) { - bool AirNodeFound = false; - bool AirLoopFound = false; - bool OASysFound = false; - for (int ControlledZoneNum = 1; ControlledZoneNum <= state.dataGlobal->NumOfZones; ++ControlledZoneNum) { - if (ControlledZoneNum != state.dataMixedAir->OAController(OutAirNum).HumidistatZoneNum) continue; - // Find the controlled zone number for the specified humidistat location - state.dataMixedAir->OAController(OutAirNum).NodeNumofHumidistatZone = - state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).ZoneNode; - // Determine which OA System uses this OA Controller - int OASysIndex = 0; - for (int OASysNum = 1; OASysNum <= state.dataAirLoop->NumOASystems; ++OASysNum) { - for (int OAControllerNum = 1; OAControllerNum <= state.dataAirLoop->OutsideAirSys(OASysNum).NumControllers; ++OAControllerNum) { - if (!UtilityRoutines::SameString(state.dataAirLoop->OutsideAirSys(OASysNum).ControllerType(OAControllerNum), - CurrentModuleObject) || - !UtilityRoutines::SameString(state.dataAirLoop->OutsideAirSys(OASysNum).ControllerName(OAControllerNum), - state.dataMixedAir->OAController(OutAirNum).Name)) - continue; - OASysIndex = OASysNum; - OASysFound = true; - break; - } - if (OASysFound) break; - } - // Determine if controller is on air loop served by the humidistat location specified - for (int zoneInNode = 1; zoneInNode <= state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).NumInletNodes; ++zoneInNode) { - int AirLoopNumber = state.dataZoneEquip->ZoneEquipConfig(ControlledZoneNum).InletNodeAirLoopNum(zoneInNode); - if (AirLoopNumber > 0 && OASysIndex > 0) { - for (int BranchNum = 1; BranchNum <= state.dataAirSystemsData->PrimaryAirSystems(AirLoopNumber).NumBranches; ++BranchNum) { - for (int CompNum = 1; - CompNum <= state.dataAirSystemsData->PrimaryAirSystems(AirLoopNumber).Branch(BranchNum).TotalComponents; - ++CompNum) { - if (!UtilityRoutines::SameString( - state.dataAirSystemsData->PrimaryAirSystems(AirLoopNumber).Branch(BranchNum).Comp(CompNum).Name, - state.dataAirLoop->OutsideAirSys(OASysIndex).Name) || - !UtilityRoutines::SameString( - state.dataAirSystemsData->PrimaryAirSystems(AirLoopNumber).Branch(BranchNum).Comp(CompNum).TypeOf, - "AirLoopHVAC:OutdoorAirSystem")) - continue; - AirLoopFound = true; - break; - } - if (AirLoopFound) break; - } - for (int HStatZoneNum = 1; HStatZoneNum <= state.dataZoneCtrls->NumHumidityControlZones; ++HStatZoneNum) { - if (state.dataZoneCtrls->HumidityControlZone(HStatZoneNum).ActualZoneNum != - state.dataMixedAir->OAController(OutAirNum).HumidistatZoneNum) - continue; - AirNodeFound = true; - break; - } - } else { - if (OASysIndex == 0) { - ShowSevereError( - state, - format("Did not find an AirLoopHVAC:OutdoorAirSystem for {} = \"{}\"", - MixedAirControllerTypeNames[static_cast(state.dataMixedAir->OAController(OutAirNum).ControllerType)], - state.dataMixedAir->OAController(OutAirNum).Name)); - ErrorsFound = true; - } - } - } - } - if (!AirNodeFound) { - ShowSevereError(state, - format("Did not find Air Node (Zone with Humidistat), {} = \"{}\"", - MixedAirControllerTypeNames[static_cast(state.dataMixedAir->OAController(OutAirNum).ControllerType)], - state.dataMixedAir->OAController(OutAirNum).Name)); - ShowContinueError(state, format("Specified {} = {}", cAlphaFields(17), AlphArray(17))); - ShowContinueError(state, - "Both a ZoneHVAC:EquipmentConnections object and a ZoneControl:Humidistat object must be specified for this zone."); - ErrorsFound = true; - } - if (!AirLoopFound) { - ShowSevereError(state, - format("Did not find correct Primary Air Loop for {} = \"{}\"", - MixedAirControllerTypeNames[static_cast(state.dataMixedAir->OAController(OutAirNum).ControllerType)], - state.dataMixedAir->OAController(OutAirNum).Name)); - ShowContinueError(state, format("{} = {} is not served by this Primary Air Loop equipment.", cAlphaFields(17), AlphArray(17))); - ErrorsFound = true; - } - } else { - ShowSevereError(state, - format("Did not find Air Node (Zone with Humidistat), {} = \"{}\"", - MixedAirControllerTypeNames[static_cast(state.dataMixedAir->OAController(OutAirNum).ControllerType)], - state.dataMixedAir->OAController(OutAirNum).Name)); - ShowContinueError(state, format("Specified {} = {}", cAlphaFields(17), AlphArray(17))); - ShowContinueError(state, - "Both a ZoneHVAC:EquipmentConnections object and a ZoneControl:Humidistat object must be specified for this zone."); - ErrorsFound = true; - } - - state.dataMixedAir->OAController(OutAirNum).HighRHOAFlowRatio = NumArray(7); - if (state.dataMixedAir->OAController(OutAirNum).HighRHOAFlowRatio <= 0.0 && NumNums > 6) { - ShowWarningError(state, format("{} \"{}\"", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); - ShowContinueError(state, format(" {} must be greater than 0.", cNumericFields(7))); - ShowContinueError(state, format(" {} is reset to 1 and the simulation continues.", cNumericFields(7))); - state.dataMixedAir->OAController(OutAirNum).HighRHOAFlowRatio = 1.0; - } - - if (UtilityRoutines::SameString(AlphArray(16), "Yes") && state.dataMixedAir->OAController(OutAirNum).FixedMin) { - if (state.dataMixedAir->OAController(OutAirNum).MaxOA > 0.0 && state.dataMixedAir->OAController(OutAirNum).MinOA != AutoSize) { - Real64 OAFlowRatio = state.dataMixedAir->OAController(OutAirNum).MinOA / state.dataMixedAir->OAController(OutAirNum).MaxOA; - if (state.dataMixedAir->OAController(OutAirNum).HighRHOAFlowRatio < OAFlowRatio) { - ShowWarningError(state, format("{} \"{}\"", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); - ShowContinueError(state, "... A fixed minimum outside air flow rate and high humidity control have been specified."); - ShowContinueError( - state, - format("... The {} is less than the ratio of the outside air controllers minimum to maximum outside air flow rate.", - cNumericFields(7))); - ShowContinueError( - state, format("... Controller {} = {:.4T} m3/s.", cNumericFields(1), state.dataMixedAir->OAController(OutAirNum).MinOA)); - ShowContinueError( - state, format("... Controller {} = {:.4T} m3/s.", cNumericFields(2), state.dataMixedAir->OAController(OutAirNum).MaxOA)); - ShowContinueError(state, format("... Controller minimum to maximum flow ratio = {:.4T}.", OAFlowRatio)); - ShowContinueError(state, - format("... {} = {:.4T}.", cNumericFields(7), state.dataMixedAir->OAController(OutAirNum).HighRHOAFlowRatio)); - } - } - } - - if (NumAlphas >= 18) { - if (UtilityRoutines::SameString(AlphArray(18), "Yes")) { - state.dataMixedAir->OAController(OutAirNum).ModifyDuringHighOAMoisture = false; - } else if (UtilityRoutines::SameString(AlphArray(18), "No")) { - state.dataMixedAir->OAController(OutAirNum).ModifyDuringHighOAMoisture = true; - } else { - ShowSevereError(state, - format("{} \"{}\", invalid field value", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); - ShowContinueError(state, format("...{}=\"{}\" - valid values are \"Yes\" or \"No\".", cAlphaFields(18), AlphArray(18))); - ErrorsFound = true; - } - } else { - if (state.dataMixedAir->OAController(OutAirNum).Econo == EconoOp::NoEconomizer) { - state.dataMixedAir->OAController(OutAirNum).ModifyDuringHighOAMoisture = true; - } else { - state.dataMixedAir->OAController(OutAirNum).ModifyDuringHighOAMoisture = false; - ShowWarningError(state, - format("{} \"{}\", missing field value", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); - ShowContinueError(state, format("...{} will default to Yes when {}= \"Yes\"", cAlphaFields(18), cAlphaFields(16))); - } - } - - } else if (UtilityRoutines::SameString(AlphArray(16), "No") || lAlphaBlanks(16)) { - if (NumAlphas >= 18) { - if (!UtilityRoutines::SameString(AlphArray(18), "Yes") && !UtilityRoutines::SameString(AlphArray(18), "No")) { - ShowSevereError(state, - format("{} \"{}\", invalid field value", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); - ShowContinueError(state, format("...{}=\"{}\" - valid values are \"Yes\" or \"No\".", cAlphaFields(18), AlphArray(18))); - ErrorsFound = true; - } - } - } else { // Invalid field 16 - ShowSevereError(state, format("{} \"{}\", invalid field value", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); - ShowContinueError(state, format("...{}=\"{}\" - valid values are \"Yes\" or \"No\".", cAlphaFields(16), AlphArray(16))); - ErrorsFound = true; - if (NumAlphas >= 18) { - if (!UtilityRoutines::SameString(AlphArray(18), "Yes") && !UtilityRoutines::SameString(AlphArray(18), "No")) { - ShowSevereError(state, - format("{} \"{}\", invalid field value", CurrentModuleObject, state.dataMixedAir->OAController(OutAirNum).Name)); - ShowContinueError(state, format("...{}=\"{}\" - valid values are \"Yes\" or \"No\".", cAlphaFields(18), AlphArray(18))); - ErrorsFound = true; - } - } - } - - if (NumAlphas > 18) { - if (!lAlphaBlanks(19)) { - if (UtilityRoutines::SameString(AlphArray(19), "BypassWhenWithinEconomizerLimits")) { - state.dataMixedAir->OAController(OutAirNum).HeatRecoveryBypassControlType = BypassWhenWithinEconomizerLimits; - } else if (UtilityRoutines::SameString(AlphArray(19), "BypassWhenOAFlowGreaterThanMinimum")) { - state.dataMixedAir->OAController(OutAirNum).HeatRecoveryBypassControlType = BypassWhenOAFlowGreaterThanMinimum; - } else { - ShowWarningError(state, format("{}=\"{}\" invalid {}=\"{}\".", CurrentModuleObject, AlphArray(1), cAlphaFields(19), AlphArray(19))); - ShowContinueError(state, "...assuming \"BypassWhenWithinEconomizerLimits\" and the simulation continues."); - state.dataMixedAir->OAController(OutAirNum).HeatRecoveryBypassControlType = BypassWhenWithinEconomizerLimits; - } - } - } - - if (UtilityRoutines::SameString(AlphArray(16), "Yes") && state.dataMixedAir->OAController(OutAirNum).Econo == EconoOp::NoEconomizer) { - ShowWarningError(state, - format("{} \"{}\"", - MixedAirControllerTypeNames[static_cast(state.dataMixedAir->OAController(OutAirNum).ControllerType)], - state.dataMixedAir->OAController(OutAirNum).Name)); - ShowContinueError(state, format("...Economizer operation must be enabled when {} is set to YES.", cAlphaFields(16))); - ShowContinueError(state, "...The high humidity control option will be disabled and the simulation continues."); - } - - state.dataMixedAir->OAController(OutAirNum).MixedAirSPMNum = - SetPointManager::GetMixedAirNumWithCoilFreezingCheck(state, state.dataMixedAir->OAController(OutAirNum).MixNode); -} - -// End of Get Input subroutines for the Module -//****************************************************************************** - -// Beginning Initialization Section of the Module -//****************************************************************************** - -void InitOutsideAirSys(EnergyPlusData &state, int const(OASysNum), int const AirLoopNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - - // PURPOSE OF THIS SUBROUTINE - // Initialize the OutsideAirSys data structure - - if (state.dataAirLoop->OutsideAirSys(OASysNum).AirLoopDOASNum > -1) return; - - if (state.dataMixedAir->initOASysFlag(OASysNum)) { - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysNum = OASysNum; - state.dataMixedAir->initOASysFlag(OASysNum) = false; - } -} - -void InitOAController(EnergyPlusData &state, int const OAControllerNum, bool const FirstHVACIteration, int const AirLoopNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - // MODIFIED Shirey/Raustad FSEC, June/Aug 2003, Feb 2004 - // Tianzhen Hong, Feb 2009 for DCV - // Tianzhen Hong, Aug 2013 for economizer faults - - // PURPOSE OF THIS SUBROUTINE - // Initialize the OAController data structure with input node data - - std::string airloopName; // Temporary equipment name - bool ErrorsFound = false; - - auto &thisOAController(state.dataMixedAir->OAController(OAControllerNum)); - - if (state.dataMixedAir->InitOAControllerOneTimeFlag) { - state.dataMixedAir->OAControllerMyOneTimeFlag.dimension(state.dataMixedAir->NumOAControllers, true); - state.dataMixedAir->OAControllerMyEnvrnFlag.dimension(state.dataMixedAir->NumOAControllers, true); - state.dataMixedAir->OAControllerMySizeFlag.dimension(state.dataMixedAir->NumOAControllers, true); - state.dataMixedAir->MechVentCheckFlag.dimension(state.dataMixedAir->NumOAControllers, true); - state.dataMixedAir->InitOAControllerSetPointCheckFlag.dimension(state.dataMixedAir->NumOAControllers, true); - state.dataMixedAir->InitOAControllerOneTimeFlag = false; - } - if (state.dataMixedAir->OAControllerMyOneTimeFlag(OAControllerNum)) { - // Determine Inlet node index for OAController, not a user input for controller, but is obtained from OutsideAirSys and OAMixer - switch (thisOAController.ControllerType) { - case MixedAirControllerType::ControllerOutsideAir: { - int thisOASys = 0; - for (int OASysNum = 1; OASysNum <= state.dataAirLoop->NumOASystems; ++OASysNum) { - // find which OAsys has this controller - int found = UtilityRoutines::FindItemInList(thisOAController.Name, - state.dataAirLoop->OutsideAirSys(OASysNum).ControllerName, - isize(state.dataAirLoop->OutsideAirSys(OASysNum).ControllerName)); - if (found != 0) { - thisOASys = OASysNum; - state.dataAirLoop->OutsideAirSys(thisOASys).OAControllerIndex = GetOAController(state, thisOAController.Name); - break; // we found it - } - } - if (thisOASys == 0) { - ShowSevereError(state, format("InitOAController: Did not find OAController=\"{}\".", thisOAController.Name)); - ShowContinueError(state, "in list of valid OA Controllers."); - ErrorsFound = true; - } - int thisNumForMixer = UtilityRoutines::FindItem(CurrentModuleObjects[static_cast(CMO::OAMixer)], - state.dataAirLoop->OutsideAirSys(thisOASys).ComponentType, - isize(state.dataAirLoop->OutsideAirSys(thisOASys).ComponentType)); - if (thisNumForMixer != 0) { - std::string_view const equipName = state.dataAirLoop->OutsideAirSys(thisOASys).ComponentName(thisNumForMixer); - int thisMixerIndex = UtilityRoutines::FindItemInList(equipName, state.dataMixedAir->OAMixer); - if (thisMixerIndex != 0) { - thisOAController.InletNode = state.dataMixedAir->OAMixer(thisMixerIndex).InletNode; - } else { - ShowSevereError(state, format("InitOAController: Did not find OAMixer=\"{}\".", equipName)); - ShowContinueError(state, "in list of valid OA Mixers."); - ErrorsFound = true; - } - } else { - ShowSevereError(state, "InitOAController: Did not find OutdoorAir:Mixer Component=\"OutdoorAir:Mixer\"."); - ShowContinueError(state, "in list of valid OA Components."); - ErrorsFound = true; - } - - if (thisOAController.InletNode == 0) { // throw an error - ShowSevereError( - state, - format("InitOAController: Failed to find proper inlet node for OutdoorAir:Mixer and Controller = {}", thisOAController.Name)); - ErrorsFound = true; - } - } break; - case MixedAirControllerType::ControllerStandAloneERV: { - // set the inlet node to also equal the OA node because this is a special controller for economizing stand alone ERV - // with the assumption that equipment is bypassed.... - thisOAController.InletNode = thisOAController.OANode; - } break; - default: { - ShowSevereError(state, - format("InitOAController: Failed to find ControllerType: {}", - MixedAirControllerTypeNames[static_cast(thisOAController.ControllerType)])); - ErrorsFound = true; - } break; - } - - state.dataMixedAir->OAControllerMyOneTimeFlag(OAControllerNum) = false; - } - - if (!state.dataGlobal->SysSizingCalc && state.dataMixedAir->InitOAControllerSetPointCheckFlag(OAControllerNum) && - state.dataHVACGlobal->DoSetPointTest && !FirstHVACIteration) { - int MixedAirNode = thisOAController.MixNode; - if (MixedAirNode > 0) { - // IF (OAController(OAControllerNum)%Econo == 1 .AND. .NOT. AirLoopControlInfo(AirLoopNum)%CyclingFan) THEN - if (thisOAController.Econo > EconoOp::NoEconomizer && state.dataAirLoop->AirLoopControlInfo(AirLoopNum).AnyContFan) { - if (state.dataLoopNodes->Node(MixedAirNode).TempSetPoint == SensedNodeFlagValue) { - if (!state.dataGlobal->AnyEnergyManagementSystemInModel) { - ShowSevereError(state, format("MixedAir: Missing temperature setpoint for economizer controller {}", thisOAController.Name)); - ShowSevereError(state, format("Node Referenced (by Controller)={}", state.dataLoopNodes->NodeID(MixedAirNode))); - ShowContinueError( - state, " use a Setpoint Manager with Control Variable = \"Temperature\" to establish a setpoint at the mixed air node."); - state.dataHVACGlobal->SetPointErrorFlag = true; - } else { - // add call to check node in EMS - CheckIfNodeSetPointManagedByEMS( - state, MixedAirNode, EMSManager::SPControlType::TemperatureSetPoint, state.dataHVACGlobal->SetPointErrorFlag); - if (state.dataHVACGlobal->SetPointErrorFlag) { - ShowSevereError(state, - format("MixedAir: Missing temperature setpoint for economizer controller {}", thisOAController.Name)); - ShowSevereError(state, format("Node Referenced (by Controller)={}", state.dataLoopNodes->NodeID(MixedAirNode))); - ShowContinueError(state, - " use a Setpoint Manager with Control Variable = \"Temperature\" to establish a setpoint at the " - "mixed air node."); - ShowContinueError(state, "Or add EMS Actuator to provide temperature setpoint at this node"); - } - } - } - } - } - - state.dataMixedAir->InitOAControllerSetPointCheckFlag(OAControllerNum) = false; - } - - if (!state.dataGlobal->SysSizingCalc && state.dataMixedAir->OAControllerMySizeFlag(OAControllerNum)) { - thisOAController.SizeOAController(state); - if (AirLoopNum > 0) { - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OACtrlNum = OAControllerNum; - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OACtrlName = thisOAController.Name; - if (thisOAController.Lockout == LockoutType::LockoutWithHeatingPossible) { - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanLockoutEconoWithHeating = true; - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanLockoutEconoWithCompressor = false; - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanNotLockoutEcono = false; - } else if (thisOAController.Lockout == LockoutType::LockoutWithCompressorPossible) { - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanLockoutEconoWithHeating = false; - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanLockoutEconoWithCompressor = true; - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanNotLockoutEcono = false; - } else { - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanLockoutEconoWithHeating = false; - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanLockoutEconoWithCompressor = false; - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CanNotLockoutEcono = true; - } - } - if ((thisOAController.MaxOA - thisOAController.MinOA) < -SmallAirVolFlow) { - ShowSevereError(state, format("For Controller:OutdoorAir: {}", thisOAController.Name)); - ShowContinueError(state, - format(" maximum outdoor air flow rate ({:.4R}) < minimum outdoor air flow rate ({:.4R})", - thisOAController.MaxOA, - thisOAController.MinOA)); - ShowContinueError(state, - " To set the minimum outside air flow rate use the \"Design (minimum) outdoor air flow rate\" field in the " - "Sizing:System object"); - ErrorsFound = true; - } - - if (AirLoopNum > 0) { - Real64 DesSupplyVolFlowRate = state.dataAirLoop->AirLoopFlow(AirLoopNum).DesSupply / state.dataEnvrn->StdRhoAir; - if ((thisOAController.MinOA - DesSupplyVolFlowRate) > 0.0001) { - ShowWarningError(state, - format("InitOAController: Minimum Outdoor Air Flow Rate for Controller:OutdoorAir={} is greater than Design Supply " - "Air Flow Rate for AirLoopHVAC={}.", - thisOAController.Name, - state.dataAirSystemsData->PrimaryAirSystems(AirLoopNum).Name)); - ShowContinueError(state, - format("...Minimum Outdoor Air Flow Rate={:.6R} will be reset to loop Design Supply Air Flow Rate={:.6R}", - thisOAController.MinOA, - DesSupplyVolFlowRate)); - thisOAController.MinOA = DesSupplyVolFlowRate; - } else if ((thisOAController.MinOA - DesSupplyVolFlowRate) > 0.0) { - // If difference is tiny, reset silently - thisOAController.MinOA = DesSupplyVolFlowRate; - } - if ((thisOAController.MaxOA - DesSupplyVolFlowRate) > 0.0001) { - ShowWarningError(state, - format("InitOAController: Maximum Outdoor Air Flow Rate for Controller:OutdoorAir={} is greater than Design Supply " - "Air Flow Rate for AirLoopHVAC={}.", - thisOAController.Name, - state.dataAirSystemsData->PrimaryAirSystems(AirLoopNum).Name)); - ShowContinueError(state, - format("...Maximum Outdoor Air Flow Rate={:.6R} will be reset to loop Design Supply Air Flow Rate={:.6R}", - thisOAController.MaxOA, - DesSupplyVolFlowRate)); - thisOAController.MaxOA = DesSupplyVolFlowRate; - } else if ((thisOAController.MaxOA - DesSupplyVolFlowRate) > 0.0) { - // If difference is tiny, reset silently - thisOAController.MaxOA = DesSupplyVolFlowRate; - } - - // Check if system has a Sizing:System object and a sizing run has been done - bool SizingDesRunThisAirSys = false; - CheckThisAirSystemForSizing(state, AirLoopNum, SizingDesRunThisAirSys); - - // Get design outdoor air flow rate - if (SizingDesRunThisAirSys && thisOAController.VentMechObjectNum > 0) { - state.dataMixedAir->VentilationMechanical(thisOAController.VentMechObjectNum).SysDesOA = - state.dataSize->FinalSysSizing(AirLoopNum).DesOutAirVolFlow; - } - } - - state.dataMixedAir->OAControllerMySizeFlag(OAControllerNum) = false; - } - - if (state.dataGlobal->BeginEnvrnFlag && state.dataMixedAir->OAControllerMyEnvrnFlag(OAControllerNum)) { - Real64 RhoAirStdInit = state.dataEnvrn->StdRhoAir; - thisOAController.MinOAMassFlowRate = thisOAController.MinOA * RhoAirStdInit; - thisOAController.MaxOAMassFlowRate = thisOAController.MaxOA * RhoAirStdInit; - state.dataMixedAir->OAControllerMyEnvrnFlag(OAControllerNum) = false; - state.dataLoopNodes->Node(thisOAController.OANode).MassFlowRateMax = thisOAController.MaxOAMassFlowRate; - - // predefined reporting - if (thisOAController.Econo > EconoOp::NoEconomizer) { - std::string_view const equipName = thisOAController.Name; - // 90.1 descriptor for economizer controls. Changed by Amit for New Feature implementation - if (thisOAController.Econo == EconoOp::DifferentialEnthalpy) { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoKind, equipName, "DifferentialEnthalpy"); - } else if (thisOAController.Econo == EconoOp::DifferentialDryBulb) { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoKind, equipName, "DifferentialDryBulb"); - } else if (thisOAController.Econo == EconoOp::FixedEnthalpy) { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoKind, equipName, "FixedEnthalpy"); - } else if (thisOAController.Econo == EconoOp::FixedDryBulb) { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoKind, equipName, "FixedDryBulb"); - } else { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoKind, equipName, "Other"); - } - - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoMinOA, equipName, thisOAController.MinOA); - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoMaxOA, equipName, thisOAController.MaxOA); - // EnergyPlus input echos for economizer controls. Changed by Amit for new feature implementation - if (thisOAController.Econo == EconoOp::DifferentialDryBulb) { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, "Yes"); - } else { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, "No"); - } - if (thisOAController.Econo == EconoOp::DifferentialEnthalpy) { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, "Yes"); - } else { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, "No"); - } - if (thisOAController.Econo == EconoOp::FixedDryBulb) { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, thisOAController.TempLim); - } else { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, "-"); - } - if (thisOAController.Econo == EconoOp::FixedEnthalpy) { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, thisOAController.EnthLim); - } else { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchEcoRetTemp, equipName, "-"); - } - } - } - - if (!state.dataGlobal->BeginEnvrnFlag) { - state.dataMixedAir->OAControllerMyEnvrnFlag(OAControllerNum) = true; - } - - if (state.dataMixedAir->MechVentCheckFlag(OAControllerNum)) { - // Make these checks only once at the beginning of the simulation - - // Make sure all air loop zones and air loop zones with people objects are covered by mechanical ventilation - // Issue a warning only if the zone is not accounted for in the associated mechanical ventilation object - if (thisOAController.VentMechObjectNum > 0) { - auto &vent_mech(state.dataMixedAir->VentilationMechanical(thisOAController.VentMechObjectNum)); - - // Make sure all zones with mechanical ventilation are on the correct air loop - int TempMechVentArrayCounter = 0; - for (int NumMechVentZone = 1; NumMechVentZone <= vent_mech.NumofVentMechZones; ++NumMechVentZone) { - auto &thisMechVentZone = vent_mech.VentMechZone(NumMechVentZone); - int ZoneNum = thisMechVentZone.zoneNum; - auto const &zone(state.dataHeatBal->Zone(ZoneNum)); - bool FoundZone = false; - - for (int AirLoopZoneInfoZoneNum = 1; AirLoopZoneInfoZoneNum <= state.dataAirLoop->AirLoopZoneInfo(AirLoopNum).NumZones; - ++AirLoopZoneInfoZoneNum) { - int NumZone = state.dataAirLoop->AirLoopZoneInfo(AirLoopNum).ActualZoneNumber(AirLoopZoneInfoZoneNum); - if (ZoneNum == NumZone) { - FoundZone = true; - ++TempMechVentArrayCounter; - if (TempMechVentArrayCounter < NumMechVentZone) { // Copy to lower index - auto &tempMechVentZone = vent_mech.VentMechZone(TempMechVentArrayCounter); - tempMechVentZone.zoneNum = thisMechVentZone.zoneNum; - tempMechVentZone.ZoneOAAreaRate = thisMechVentZone.ZoneOAAreaRate; - tempMechVentZone.ZoneOAPeopleRate = thisMechVentZone.ZoneOAPeopleRate; - tempMechVentZone.ZoneOAFlowRate = thisMechVentZone.ZoneOAFlowRate; - tempMechVentZone.ZoneOAACHRate = thisMechVentZone.ZoneOAACHRate; - tempMechVentZone.ZoneOAFlowMethod = thisMechVentZone.ZoneOAFlowMethod; - tempMechVentZone.ZoneOASchPtr = thisMechVentZone.ZoneOASchPtr; - tempMechVentZone.ZoneDesignSpecOAObjIndex = thisMechVentZone.ZoneDesignSpecOAObjIndex; - tempMechVentZone.ZoneDesignSpecOAObjName = thisMechVentZone.ZoneDesignSpecOAObjName; - - // new DCV - tempMechVentZone.ZoneADEffCooling = thisMechVentZone.ZoneADEffCooling; - tempMechVentZone.ZoneADEffHeating = thisMechVentZone.ZoneADEffHeating; - tempMechVentZone.ZoneADEffSchPtr = thisMechVentZone.ZoneADEffSchPtr; - } - - // Sum outside air per unit floor area for each mechanical ventilation object only once per simulation - vent_mech.TotAreaOAFlow += zone.FloorArea * zone.Multiplier * zone.ListMultiplier * thisMechVentZone.ZoneOAAreaRate; - vent_mech.TotZoneOAFlow += zone.Multiplier * zone.ListMultiplier * thisMechVentZone.ZoneOAFlowRate; - vent_mech.TotZoneOAACH += zone.Multiplier * zone.ListMultiplier * (thisMechVentZone.ZoneOAACHRate * zone.Volume / 3600.0); - break; - } - } - if (!FoundZone) { - ShowWarningError(state, - format("Zone name = {} in {} object name = {} is not on the same air loop as Controller:OutdoorAir = {}", - zone.Name, - CurrentModuleObjects[static_cast(CMO::MechVentilation)], - thisOAController.VentilationMechanicalName, - thisOAController.Name)); - ShowContinueError(state, "This zone will not be used and the simulation will continue..."); - } - } - - // Shrink final arrays to conserve environment space - if (TempMechVentArrayCounter < vent_mech.NumofVentMechZones) { - vent_mech.VentMechZone.resize(TempMechVentArrayCounter); - vent_mech.NumofVentMechZones = TempMechVentArrayCounter; - } - - // predefined report - for (int jZone = 1; jZone <= vent_mech.NumofVentMechZones; ++jZone) { - auto &thisMechVentZone = vent_mech.VentMechZone(jZone); - std::string_view const zoneName = state.dataHeatBal->Zone(thisMechVentZone.zoneNum).Name; - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchDCVventMechName, zoneName, vent_mech.Name); - OutputReportPredefined::PreDefTableEntry( - state, state.dataOutRptPredefined->pdchDCVperPerson, zoneName, thisMechVentZone.ZoneOAPeopleRate, 6); - OutputReportPredefined::PreDefTableEntry( - state, state.dataOutRptPredefined->pdchDCVperArea, zoneName, thisMechVentZone.ZoneOAAreaRate, 6); - OutputReportPredefined::PreDefTableEntry( - state, state.dataOutRptPredefined->pdchDCVperZone, zoneName, thisMechVentZone.ZoneOAFlowRate, 6); - OutputReportPredefined::PreDefTableEntry( - state, state.dataOutRptPredefined->pdchDCVperACH, zoneName, thisMechVentZone.ZoneOAACHRate, 6); - OutputReportPredefined::PreDefTableEntry(state, - state.dataOutRptPredefined->pdchDCVMethod, - zoneName, - OAFlowCalcMethodNames[static_cast(thisMechVentZone.ZoneOAFlowMethod)]); - if (thisMechVentZone.ZoneOASchPtr > 0) { - OutputReportPredefined::PreDefTableEntry( - state, state.dataOutRptPredefined->pdchDCVOASchName, zoneName, GetScheduleName(state, thisMechVentZone.ZoneOASchPtr)); - } else { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchDCVOASchName, zoneName, ""); - } - - // added for new DCV inputs - if (thisMechVentZone.ZoneADEffSchPtr > 0) { - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchDCVZoneADEffCooling, zoneName, ""); - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchDCVZoneADEffHeating, zoneName, ""); - OutputReportPredefined::PreDefTableEntry(state, - state.dataOutRptPredefined->pdchDCVZoneADEffSchName, - zoneName, - GetScheduleName(state, thisMechVentZone.ZoneADEffSchPtr)); - } else { - OutputReportPredefined::PreDefTableEntry( - state, state.dataOutRptPredefined->pdchDCVZoneADEffCooling, zoneName, thisMechVentZone.ZoneADEffCooling, 2); - OutputReportPredefined::PreDefTableEntry( - state, state.dataOutRptPredefined->pdchDCVZoneADEffHeating, zoneName, thisMechVentZone.ZoneADEffHeating, 2); - OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchDCVZoneADEffSchName, zoneName, ""); - } - } - - // Check to see if any zones on an air loop are not accounted for by a mechanical ventilation object - for (int AirLoopZoneInfoZoneNum = 1; AirLoopZoneInfoZoneNum <= state.dataAirLoop->AirLoopZoneInfo(AirLoopNum).NumZones; - ++AirLoopZoneInfoZoneNum) { - int NumZone = state.dataAirLoop->AirLoopZoneInfo(AirLoopNum).ActualZoneNumber(AirLoopZoneInfoZoneNum); - bool FoundAreaZone = false; - bool FoundPeopleZone = false; - for (int NumMechVentZone = 1; NumMechVentZone <= vent_mech.NumofVentMechZones; ++NumMechVentZone) { - auto &thisMechVentZone = vent_mech.VentMechZone(NumMechVentZone); - int ZoneNum = thisMechVentZone.zoneNum; - if (ZoneNum == NumZone) { - FoundAreaZone = true; - if (thisMechVentZone.ZoneOAPeopleRate > 0.0) { - FoundPeopleZone = true; - } - break; - } - } - if (!FoundAreaZone) { - ShowWarningError(state, - format("Zone name = {} is not accounted for by {} object name = {}", - state.dataHeatBal->Zone(NumZone).Name, - CurrentModuleObjects[static_cast(CMO::MechVentilation)], - thisOAController.VentilationMechanicalName)); - ShowContinueError(state, "Ventilation per unit floor area has not been specified for this zone, which is connected to"); - ShowContinueError( - state, format("the air loop served by Controller:OutdoorAir = {}. Simulation will continue...", thisOAController.Name)); - } - if (!FoundPeopleZone) { - // Loop through people objects to see if this zone has a people object and only then show a warning - for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { - if (state.dataHeatBal->People(PeopleNum).ZonePtr == NumZone) { - if (!FoundAreaZone) { - ShowWarningError(state, - format("PEOPLE object for zone = {} is not accounted for by {} object name = {}", - state.dataHeatBal->Zone(NumZone).Name, - CurrentModuleObjects[static_cast(CMO::MechVentilation)], - thisOAController.VentilationMechanicalName)); - ShowContinueError( - state, - format( - "A \"PEOPLE\" object has been specified in the idf for this zone, but it is not included in this {} Object.", - CurrentModuleObjects[static_cast(CMO::MechVentilation)])); - ShowContinueError(state, - format("Check {} object. Simulation will continue.", - CurrentModuleObjects[static_cast(CMO::MechVentilation)])); - } - } - } - } else { // People > 0, check to make sure there is a people statement in the zone - FoundAreaZone = false; - for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { - if (state.dataHeatBal->People(PeopleNum).ZonePtr != NumZone) continue; - FoundAreaZone = true; - break; - } - if (!FoundAreaZone) { - ShowWarningError(state, - format("{} = \"{}\", Zone=\"{}\".", - CurrentModuleObjects[static_cast(CMO::MechVentilation)], - thisOAController.VentilationMechanicalName, - state.dataHeatBal->Zone(NumZone).Name)); - ShowContinueError(state, - "No \"PEOPLE\" object has been specified in the idf for this zone, but the ventilation rate is > 0 in " - "this Controller:MechanicalVentilation Object."); - ShowContinueError(state, "Check ventilation rate in Controller:MechanicalVentilation object. Simulation will continue."); - } - } - } - } - - state.dataMixedAir->MechVentCheckFlag(OAControllerNum) = false; - } - //**** - - // Perform a one time initialization of AirloopHVAC OA System report variables - // If AirloopHVAC objects are used, NumPrimaryAirSys > 0 and the initialization proceeds and then sets - // SetUpAirLoopHVACVariables to .FALSE. so this is never done again and only the first IF is checked - // each time through Init. If for some reason the primary air system have not yet been read in, this - // code waits for the air loop data to be available before performing the report variable initialization. - // If AirloopHVAC objects are not used, NumPrimaryAirSys is always equal to 0 and only these - // two IF statements are checked each time through Init (e.g., if StandAloneERV controllers are used - // without AirloopHVAC objects). - if (state.dataMixedAir->InitOAControllerSetUpAirLoopHVACVariables) { - if (AirLoopNum > 0) { - // Added code to report (TH, 10/20/2008): - // air economizer status (1 = on, 0 = off or does not exist), and actual and minimum outside air fraction (0 to 1) - for (int OAControllerLoop = 1; OAControllerLoop <= state.dataMixedAir->NumOAControllers; ++OAControllerLoop) { - auto &loopOAController(state.dataMixedAir->OAController(OAControllerLoop)); - - // Find the outside air system that has the OA controller - if (loopOAController.ControllerType == MixedAirControllerType::ControllerStandAloneERV) continue; // ERV controller not on airloop - bool OASysFound = false; - int thisOASys = 0; - for (int OASysNum = 1; OASysNum <= state.dataAirLoop->NumOASystems; ++OASysNum) { - for (int OAControllerLoop2 = 1; OAControllerLoop2 <= state.dataAirLoop->OutsideAirSys(OASysNum).NumControllers; - ++OAControllerLoop2) { - if (UtilityRoutines::SameString(state.dataAirLoop->OutsideAirSys(OASysNum).ControllerName(OAControllerLoop2), - loopOAController.Name)) { - thisOASys = OASysNum; - OASysFound = true; - break; - } - } - if (OASysFound) break; - } - - int airLoopNum = 0; - bool AirLoopFound = false; - if (thisOASys <= 0) { - // Check outside air system name - ShowWarningError(state, format("Cannot find the AirLoopHVAC:OutdoorAirSystem for the OA Controller: {}", loopOAController.Name)); - } else { - // Find the primary air loop that has the outside air system - for (int thisAirLoop = 1; thisAirLoop <= state.dataHVACGlobal->NumPrimaryAirSys; ++thisAirLoop) { - for (int BranchNum = 1; BranchNum <= state.dataAirSystemsData->PrimaryAirSystems(thisAirLoop).NumBranches; ++BranchNum) { - for (int CompNum = 1; - CompNum <= state.dataAirSystemsData->PrimaryAirSystems(thisAirLoop).Branch(BranchNum).TotalComponents; - ++CompNum) { - if (!UtilityRoutines::SameString( - state.dataAirSystemsData->PrimaryAirSystems(thisAirLoop).Branch(BranchNum).Comp(CompNum).Name, - state.dataAirLoop->OutsideAirSys(thisOASys).Name) || - !UtilityRoutines::SameString( - state.dataAirSystemsData->PrimaryAirSystems(thisAirLoop).Branch(BranchNum).Comp(CompNum).TypeOf, - "AirLoopHVAC:OutdoorAirSystem")) - continue; - AirLoopFound = true; - airLoopNum = thisAirLoop; - break; - } - if (AirLoopFound) break; - } - if (AirLoopFound) break; - } - } - // Check primary air loop name - if (AirLoopFound && airLoopNum > 0) { - airloopName = state.dataAirSystemsData->PrimaryAirSystems(airLoopNum).Name; // OutsideAirSys(OASysIndex)%Name - } else { - ShowWarningError(state, format("Cannot find the primary air loop for the OA Controller: {}", loopOAController.Name)); - airloopName = "AirLoop not found"; - } - - // Note use of OAControllerLoop here to keep DO Loop index separate from InitOAController local variable - // CurrentModuleObject='AirLoopHVAC' - SetupOutputVariable(state, - "Air System Outdoor Air Economizer Status", - OutputProcessor::Unit::None, - loopOAController.EconomizerStatus, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - - SetupOutputVariable(state, - "Air System Outdoor Air Heat Recovery Bypass Status", - OutputProcessor::Unit::None, - loopOAController.HeatRecoveryBypassStatus, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - - SetupOutputVariable(state, - "Air System Outdoor Air Heat Recovery Bypass Heating Coil Activity Status", - OutputProcessor::Unit::None, - loopOAController.HRHeatingCoilActive, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - SetupOutputVariable(state, - "Air System Outdoor Air Heat Recovery Bypass Minimum Outdoor Air Mixed Air Temperature", - OutputProcessor::Unit::C, - loopOAController.MixedAirTempAtMinOAFlow, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - - SetupOutputVariable(state, - "Air System Outdoor Air High Humidity Control Status", - OutputProcessor::Unit::None, - loopOAController.HighHumCtrlStatus, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - - SetupOutputVariable(state, - "Air System Outdoor Air Limiting Factor", - OutputProcessor::Unit::None, - loopOAController.OALimitingFactorReport, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - - SetupOutputVariable(state, - "Air System Outdoor Air Flow Fraction", - OutputProcessor::Unit::None, - loopOAController.OAFractionRpt, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - - SetupOutputVariable(state, - "Air System Outdoor Air Minimum Flow Fraction", - OutputProcessor::Unit::None, - loopOAController.MinOAFracLimit, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - - SetupOutputVariable(state, - "Air System Outdoor Air Mass Flow Rate", - OutputProcessor::Unit::kg_s, - loopOAController.OAMassFlow, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - - SetupOutputVariable(state, - "Air System Mixed Air Mass Flow Rate", - OutputProcessor::Unit::kg_s, - loopOAController.MixMassFlow, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - - SetupOutputVariable(state, - "Air System Relief Air Heat Transfer Rate", - OutputProcessor::Unit::W, - loopOAController.RelTotalLossRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - - SetupOutputVariable(state, - "Air System Relief Air Sensible Heat Transfer Rate", - OutputProcessor::Unit::W, - loopOAController.RelSensiLossRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - - SetupOutputVariable(state, - "Air System Relief Air Latent Heat Transfer Rate", - OutputProcessor::Unit::W, - loopOAController.RelLatentLossRate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - - if (loopOAController.MixedAirSPMNum > 0) { - SetupOutputVariable(state, - "Air System Outdoor Air Maximum Flow Fraction", - OutputProcessor::Unit::None, - loopOAController.MaxOAFracBySetPoint, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - } - - if (state.dataGlobal->AnyEnergyManagementSystemInModel) { - SetupEMSInternalVariable( - state, "Outdoor Air Controller Maximum Mass Flow Rate", loopOAController.Name, "[kg/s]", loopOAController.MaxOAMassFlowRate); - SetupEMSInternalVariable( - state, "Outdoor Air Controller Minimum Mass Flow Rate", loopOAController.Name, "[kg/s]", loopOAController.MinOAMassFlowRate); - SetupEMSActuator(state, - "Outdoor Air Controller", - loopOAController.Name, - "Air Mass Flow Rate", - "[kg/s]", - loopOAController.EMSOverrideOARate, - loopOAController.EMSOARateValue); - } - - if (loopOAController.VentMechObjectNum > 0 && airLoopNum > 0) { - SetupOutputVariable(state, - "Air System Outdoor Air Mechanical Ventilation Requested Mass Flow Rate", - OutputProcessor::Unit::kg_s, - loopOAController.MechVentOAMassFlowRequest, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - airloopName); - if (!state.dataMixedAir->VentilationMechanical(loopOAController.VentMechObjectNum).DCVFlag) { - state.dataAirLoop->AirLoopControlInfo(airLoopNum).AirLoopDCVFlag = false; - } - } - } - - state.dataMixedAir->InitOAControllerSetUpAirLoopHVACVariables = false; - } - } - - // Each time step - if (FirstHVACIteration) { - // Mixed air setpoint. Set by a setpoint manager. - if (thisOAController.ControllerType == MixedAirControllerType::ControllerOutsideAir) { - if (state.dataLoopNodes->Node(thisOAController.MixNode).TempSetPoint > SensedNodeFlagValue) { - thisOAController.MixSetTemp = state.dataLoopNodes->Node(thisOAController.MixNode).TempSetPoint; - } else { - thisOAController.MixSetTemp = thisOAController.TempLowLim; - } - - Real64 TotalPeopleOAFlow = 0.0; - if (thisOAController.VentMechObjectNum != 0) { - auto &vent_mech(state.dataMixedAir->VentilationMechanical(thisOAController.VentMechObjectNum)); - for (int ZoneIndex = 1; ZoneIndex <= vent_mech.NumofVentMechZones; ++ZoneIndex) { - auto &thisVentMechZone = vent_mech.VentMechZone(ZoneIndex); - int ZoneNum = thisVentMechZone.zoneNum; - - // ZoneIntGain(ZoneNum)%NOFOCC is the number of occupants of a zone at each time step, already counting the occupant schedule - OAFlowCalcMethod OAFlowMethod = thisVentMechZone.ZoneOAFlowMethod; - if (OAFlowMethod == OAFlowCalcMethod::PerPerson || OAFlowMethod == OAFlowCalcMethod::Sum || - OAFlowMethod == OAFlowCalcMethod::Max) { - TotalPeopleOAFlow += state.dataHeatBal->ZoneIntGain(ZoneNum).NOFOCC * state.dataHeatBal->Zone(ZoneNum).Multiplier * - state.dataHeatBal->Zone(ZoneNum).ListMultiplier * thisVentMechZone.ZoneOAPeopleRate * - GetCurrentScheduleValue(state, thisVentMechZone.ZoneOASchPtr); - } - } - vent_mech.TotPeopleOAFlow = TotalPeopleOAFlow; - } - } else { - // Stand Alone ERV does not require a termperature setpoint schedule, make setpoint equal to lower economizer limit - thisOAController.MixSetTemp = thisOAController.TempLowLim; - } - } - - // Each iteration - - if (thisOAController.ControllerType == MixedAirControllerType::ControllerOutsideAir) { - // zone exhaust mass flow is saved in AirLoopFlow%ZoneExhaust - // the zone exhaust mass flow that is said to be balanced by simple air flows is saved in AirLoopFlow%ZoneExhaustBalanced - if (AirLoopNum > 0) { - thisOAController.ExhMassFlow = - max(0.0, state.dataAirLoop->AirLoopFlow(AirLoopNum).SupFlow - state.dataAirLoop->AirLoopFlow(AirLoopNum).SysRetFlow); - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).ZoneExhMassFlow = thisOAController.ExhMassFlow; - if (state.dataAirLoop->AirLoopControlInfo(AirLoopNum).LoopFlowRateSet && !FirstHVACIteration) { - // if flow rate has been specified by a manager, set it to the specified value - thisOAController.MixMassFlow = - state.dataAirLoop->AirLoopFlow(AirLoopNum).ReqSupplyFrac * state.dataAirLoop->AirLoopFlow(AirLoopNum).DesSupply; - } else { - thisOAController.MixMassFlow = state.dataLoopNodes->Node(thisOAController.RetNode).MassFlowRate + thisOAController.ExhMassFlow; - - // The following was commented out after discussion on PR 7382, it can be reopened for discussion anytime - // found this equation results in flow that exceeds the design flow rate when there is exhaust flow rate is greater than - // the design supply air flow rate. Capped the mixed air flow rate at design supply air flow rate, issue #77379 - // thisOAController.MixMassFlow = Node(thisOAController.RetNode).MassFlowRate + thisOAController.ExhMassFlow; - // thisOAController.MixMassFlow = - // min(Node(thisOAController.RetNode).MassFlowRate + thisOAController.ExhMassFlow, AirLoopFlow(AirLoopNum).DesSupply); - } - } else { - thisOAController.ExhMassFlow = 0.0; - thisOAController.MixMassFlow = state.dataLoopNodes->Node(thisOAController.RetNode).MassFlowRate; - } - if (state.dataLoopNodes->Node(thisOAController.MixNode).MassFlowRateMaxAvail <= 0.0) { - thisOAController.MixMassFlow = 0.0; - } - } else { - // Mixed and exhaust flow rates are passed through to model CONTROLLER:STAND ALONE ERV in SimOAController - thisOAController.OAMassFlow = thisOAController.MaxOAMassFlowRate; - thisOAController.MixMassFlow = thisOAController.MaxOAMassFlowRate; - thisOAController.ExhMassFlow = state.dataLoopNodes->Node(thisOAController.RetNode).MassFlowRate; - } - thisOAController.ExhMassFlow = max(thisOAController.ExhMassFlow, 0.0); - - // Outside air values - thisOAController.OATemp = state.dataLoopNodes->Node(thisOAController.OANode).Temp; - thisOAController.OAEnth = state.dataLoopNodes->Node(thisOAController.OANode).Enthalpy; - thisOAController.OAPress = state.dataLoopNodes->Node(thisOAController.OANode).Press; - thisOAController.OAHumRat = state.dataLoopNodes->Node(thisOAController.OANode).HumRat; - - // Inlet air values (on OA input side) - thisOAController.InletTemp = state.dataLoopNodes->Node(thisOAController.InletNode).Temp; - thisOAController.InletEnth = state.dataLoopNodes->Node(thisOAController.InletNode).Enthalpy; - thisOAController.InletPress = state.dataLoopNodes->Node(thisOAController.InletNode).Press; - thisOAController.InletHumRat = state.dataLoopNodes->Node(thisOAController.InletNode).HumRat; - - // Return air values - thisOAController.RetTemp = state.dataLoopNodes->Node(thisOAController.RetNode).Temp; - thisOAController.RetEnth = state.dataLoopNodes->Node(thisOAController.RetNode).Enthalpy; - - // Check sensors faults for the air economizer - EconoOp iEco = thisOAController.Econo; - if (state.dataFaultsMgr->AnyFaultsInModel && (iEco != EconoOp::NoEconomizer)) { - for (int i = 1; i <= thisOAController.NumFaultyEconomizer; ++i) { - int j = thisOAController.EconmizerFaultNum(i); - Real64 rSchVal = 0.0; - if (GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsEconomizer(j).AvaiSchedPtr) > 0.0) { - rSchVal = 1.0; - if (state.dataFaultsMgr->FaultsEconomizer(j).SeveritySchedPtr > 0) { - rSchVal = GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsEconomizer(j).SeveritySchedPtr); - } - } else { - continue; // no fault - } - - Real64 rOffset = rSchVal * state.dataFaultsMgr->FaultsEconomizer(j).Offset; - - if (std::abs(rOffset) < 0.000000001) continue; - - // ECONOMIZER - outdoor air dry-bulb temperature sensor offset - switch (iEco) { - case EconoOp::FixedDryBulb: - case EconoOp::DifferentialDryBulb: - case EconoOp::FixedDewPointAndDryBulb: - case EconoOp::ElectronicEnthalpy: - case EconoOp::DifferentialDryBulbAndEnthalpy: { - if (state.dataFaultsMgr->FaultsEconomizer(j).FaultTypeEnum == Fault::TemperatureSensorOffset_OutdoorAir) { - // FaultModel:TemperatureSensorOffset:OutdoorAir - thisOAController.OATemp += rOffset; - thisOAController.InletTemp += rOffset; - } - } break; - default: - break; - } - - // ECONOMIZER - outdoor air humidity ratio sensor offset. really needed ??? - switch (iEco) { - case EconoOp::FixedDewPointAndDryBulb: - case EconoOp::ElectronicEnthalpy: { - if (state.dataFaultsMgr->FaultsEconomizer(j).FaultTypeEnum == Fault::HumiditySensorOffset_OutdoorAir) { - // FaultModel:HumiditySensorOffset:OutdoorAir - thisOAController.OAHumRat += rOffset; - thisOAController.InletHumRat += rOffset; - } - } break; - default: - break; - } - - // ECONOMIZER - outdoor air enthalpy sensor offset - switch (iEco) { - case EconoOp::FixedEnthalpy: - case EconoOp::ElectronicEnthalpy: - case EconoOp::DifferentialDryBulbAndEnthalpy: { - if (state.dataFaultsMgr->FaultsEconomizer(j).FaultTypeEnum == Fault::EnthalpySensorOffset_OutdoorAir) { - // FaultModel:EnthalpySensorOffset:OutdoorAir - thisOAController.OAEnth += rOffset; - thisOAController.InletEnth += rOffset; - } - } break; - default: - break; - } - - // ECONOMIZER - return air dry-bulb temperature sensor offset - switch (iEco) { - case EconoOp::DifferentialDryBulb: - case EconoOp::DifferentialDryBulbAndEnthalpy: { - if (state.dataFaultsMgr->FaultsEconomizer(j).FaultTypeEnum == Fault::TemperatureSensorOffset_ReturnAir) { - // FaultModel:TemperatureSensorOffset:ReturnAir - thisOAController.RetTemp += rOffset; - } - } break; - default: - break; - } - - // ECONOMIZER - return air enthalpy sensor offset - switch (iEco) { - case EconoOp::ElectronicEnthalpy: - case EconoOp::DifferentialDryBulbAndEnthalpy: { - if (state.dataFaultsMgr->FaultsEconomizer(j).FaultTypeEnum == Fault::EnthalpySensorOffset_ReturnAir) { - // FaultModel:EnthalpySensorOffset:ReturnAir - thisOAController.RetEnth += rOffset; - } - } break; - default: - break; - } - } - } - - if (ErrorsFound) { - ShowFatalError(state, format("Error in {}; program terminated", CurrentModuleObjects[static_cast(CMO::OAController)])); - } -} // namespace MixedAir - -void InitOAMixer(EnergyPlusData &state, int const OAMixerNum) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - - // PURPOSE OF THIS SUBROUTINE - // Initialize the OAMixer data structure with input node data - - int RetNode = state.dataMixedAir->OAMixer(OAMixerNum).RetNode; - int InletNode = state.dataMixedAir->OAMixer(OAMixerNum).InletNode; - int RelNode = state.dataMixedAir->OAMixer(OAMixerNum).RelNode; - - // Return air stream data - state.dataMixedAir->OAMixer(OAMixerNum).RetTemp = state.dataLoopNodes->Node(RetNode).Temp; - state.dataMixedAir->OAMixer(OAMixerNum).RetHumRat = state.dataLoopNodes->Node(RetNode).HumRat; - state.dataMixedAir->OAMixer(OAMixerNum).RetEnthalpy = state.dataLoopNodes->Node(RetNode).Enthalpy; - state.dataMixedAir->OAMixer(OAMixerNum).RetPressure = state.dataLoopNodes->Node(RetNode).Press; - state.dataMixedAir->OAMixer(OAMixerNum).RetMassFlowRate = state.dataLoopNodes->Node(RetNode).MassFlowRate; - // Outside air stream data - state.dataMixedAir->OAMixer(OAMixerNum).OATemp = state.dataLoopNodes->Node(InletNode).Temp; - state.dataMixedAir->OAMixer(OAMixerNum).OAHumRat = state.dataLoopNodes->Node(InletNode).HumRat; - state.dataMixedAir->OAMixer(OAMixerNum).OAEnthalpy = state.dataLoopNodes->Node(InletNode).Enthalpy; - state.dataMixedAir->OAMixer(OAMixerNum).OAPressure = state.dataLoopNodes->Node(InletNode).Press; - state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate = state.dataLoopNodes->Node(InletNode).MassFlowRate; - // Relief air data - state.dataMixedAir->OAMixer(OAMixerNum).RelMassFlowRate = state.dataLoopNodes->Node(RelNode).MassFlowRate; -} - -void OAControllerProps::CalcOAController(EnergyPlusData &state, int const AirLoopNum, bool const FirstHVACIteration) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - // MODIFIED Shirey/Raustad FSEC, June 2003 - // Tianzhen Hong, Feb 2009 for new DCV - // Brent Griffith ,EMS override of OA rate - // Mangesh Basarkar, 06/2011: Modifying outside air calculation based on DCV flag - // Chandan Sharma, FSEC, 25Aug 2011 - Added ProportionalControl - // to enhance CO2 based DCV control - // Tianzhen Hong, March 2012, zone maximum OA fraction - a TRACE feature - // Tianzhen Hong, March 2012, multi-path VRP based on ASHRAE 62.1-2010 - - // PURPOSE OF THIS SUBROUTINE - // Determine the outside air flow - - // REFERENCES: - // DOE-2.1E Supplement pages 3.97 - 3.100 - // BLAST User Reference pages 183 - 186 - // ASHRAE Standard 62.1-2010 - - // SUBROUTINE PARAMETER DEFINITIONS: - static constexpr std::string_view RoutineName("CalcOAController: "); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 OASignal = 0.0; // Outside air flow rate fraction (0.0 to 1.0) - bool AirLoopCyclingFan = false; // Type of air loop fan (TRUE if Fan:OnOff) - bool HighHumidityOperationFlag = false; // TRUE if zone humidistat senses a high humidity condition - - if (AirLoopNum > 0) { - AirLoopCyclingFan = (state.dataAirLoop->AirLoopControlInfo(AirLoopNum).FanOpMode == CycFanCycCoil); - } else { - AirLoopCyclingFan = false; - } - - this->OALimitingFactor = OALimitFactor::None; // oa controller limiting factor - - // Check for no flow - if (this->MixMassFlow <= SmallMassFlow) { - - this->OAMassFlow = 0.0; // outside air mass flow rate - this->RelMassFlow = 0.0; // relief air mass flow rate - this->MixMassFlow = 0.0; // mixed air mass flow rate - this->MinOAFracLimit = 0.0; // minimum OA fraction limit - - this->EconomizerStatus = 0; // economizer status for reporting - this->HeatRecoveryBypassStatus = 0; // HR bypass status for reporting - this->HRHeatingCoilActive = 0; // resets report variable - this->MixedAirTempAtMinOAFlow = state.dataLoopNodes->Node(this->RetNode).Temp; // track return T - this->HighHumCtrlStatus = 0; // high humdity control status for reporting - this->OAFractionRpt = 0.0; // actual OA fraction for reporting - - this->EconoActive = false; // DataAirLoop variable (OA Controllers) - this->HighHumCtrlActive = false; // DataAirLoop variable (OA Controllers) - - // also reset air loop data for use by other routines - if (AirLoopNum > 0) { - auto &curAirLoopControlInfo(state.dataAirLoop->AirLoopControlInfo(AirLoopNum)); - auto &curAirLoopFlow(state.dataAirLoop->AirLoopFlow(AirLoopNum)); - - curAirLoopControlInfo.EconoActive = false; // DataAirLoop variable (AirloopHVAC) - curAirLoopControlInfo.HeatRecoveryBypass = false; // DataAirLoop variable (AirloopHVAC) - curAirLoopControlInfo.HighHumCtrlActive = false; // DataAirLoop variable (AirloopHVAC) - curAirLoopControlInfo.ResimAirLoopFlag = false; // DataAirLoop variable (AirloopHVAC) - curAirLoopFlow.OAFrac = 0.0; // DataAirLoop variable (AirloopHVAC) - curAirLoopFlow.OAMinFrac = 0.0; // DataAirLoop variable (AirloopHVAC) - curAirLoopFlow.MinOutAir = 0.0; - curAirLoopFlow.OAFlow = 0.0; - } - return; - } - - Real64 OutAirMinFrac = 0.0; // Local variable used to calculate min OA fraction - if (AirLoopNum > 0) { - auto &curAirLoopFlow(state.dataAirLoop->AirLoopFlow(AirLoopNum)); - if (curAirLoopFlow.DesSupply >= SmallAirVolFlow) { - OutAirMinFrac = this->MinOAMassFlowRate / curAirLoopFlow.DesSupply; - } - } else { - if (this->MaxOA >= SmallAirVolFlow) { - OutAirMinFrac = this->MinOA / this->MaxOA; - } - } - Real64 MinOASchedVal = 1.0; // value of the minimum outside air schedule - if (this->MinOASchPtr > 0) { - MinOASchedVal = GetCurrentScheduleValue(state, this->MinOASchPtr); - MinOASchedVal = min(max(MinOASchedVal, 0.0), 1.0); - OutAirMinFrac *= MinOASchedVal; - this->OALimitingFactor = OALimitFactor::Limits; - } - - // Get outside air mass flow rate calculated by mechanical ventilation object [kg/s] - Real64 MechVentOutsideAirMinFrac = 0.0; // fraction of OA specified by mechanical ventilation object - if (AirLoopNum > 0 && this->VentMechObjectNum != 0) { - auto &curAirLoopControlInfo(state.dataAirLoop->AirLoopControlInfo(AirLoopNum)); - auto &curAirLoopFlow(state.dataAirLoop->AirLoopFlow(AirLoopNum)); - - // Get system supply air flow rate - Real64 SysSA = 0.0; // System supply air mass flow rate [kg/s] - if (curAirLoopControlInfo.LoopFlowRateSet) { - // if flow rate has been specified by a manager, set it to the specified value - // DesSupply and SupFlow are mass flow rate in kg/s - SysSA = curAirLoopFlow.ReqSupplyFrac * curAirLoopFlow.DesSupply; - } else { - SysSA = curAirLoopFlow.SupFlow; - } - - this->MechVentOAMassFlowRequest = state.dataMixedAir->VentilationMechanical(this->VentMechObjectNum).CalcMechVentController(state, SysSA); - MechVentOutsideAirMinFrac = this->MechVentOAMassFlowRequest / curAirLoopFlow.DesSupply; - if (curAirLoopFlow.FanPLR > 0.0) { - MechVentOutsideAirMinFrac *= curAirLoopFlow.FanPLR; - this->MechVentOAMassFlowRequest *= curAirLoopFlow.FanPLR; - } - } else { - this->MechVentOAMassFlowRequest = 0.0; - } - //****** use greater of Mechanical Ventilation Outside Air fraction and OutAirMinFrac - if ((MechVentOutsideAirMinFrac > 0.0) && (OutAirMinFrac > MechVentOutsideAirMinFrac)) { - if (!state.dataGlobal->WarmupFlag) { - if (this->CountMechVentFrac == 0) { - ++this->CountMechVentFrac; - ShowWarningError( - state, - format("{}Minimum OA fraction > Mechanical Ventilation Controller request for Controller:OutdoorAir={}, Min OA fraction is used.", - RoutineName, - this->Name)); - ShowContinueError(state, - "This may be overriding desired ventilation controls. Check inputs for Minimum Outdoor Air Flow Rate, Minimum " - "Outdoor Air Schedule Name and Controller:MechanicalVentilation"); - ShowContinueErrorTimeStamp( - state, format("Minimum OA fraction = {:.4R}, Mech Vent OA fraction = {:.4R}", OutAirMinFrac, MechVentOutsideAirMinFrac)); - } else { - ShowRecurringWarningErrorAtEnd(state, - "Controller:OutdoorAir=\"" + this->Name + - "\": Min OA fraction > Mechanical ventilation OA fraction, continues...", - this->IndexMechVentFrac, - OutAirMinFrac, - OutAirMinFrac); - } - } - } - if (MechVentOutsideAirMinFrac > OutAirMinFrac) { - OutAirMinFrac = MechVentOutsideAirMinFrac; - this->OALimitingFactor = OALimitFactor::DCV; - } - - OutAirMinFrac = min(max(OutAirMinFrac, 0.0), 1.0); - - // At this point, OutAirMinFrac is still based on AirLoopFlow.DesSupply - if (AirLoopNum > 0) { - auto &curAirLoopFlow(state.dataAirLoop->AirLoopFlow(AirLoopNum)); - - curAirLoopFlow.MinOutAir = OutAirMinFrac * curAirLoopFlow.DesSupply; - - // calculate mixed air temp at min OA flow rate - Real64 ReliefMassFlowAtMinOA = max(curAirLoopFlow.MinOutAir - this->ExhMassFlow, 0.0); - Real64 RecircMassFlowRateAtMinOAFlow = max(state.dataLoopNodes->Node(this->RetNode).MassFlowRate - ReliefMassFlowAtMinOA, 0.0); - if ((RecircMassFlowRateAtMinOAFlow + curAirLoopFlow.MinOutAir) > 0.0) { - Real64 RecircTemp = state.dataLoopNodes->Node(this->RetNode).Temp; // return air temp used for custom economizer control calculation - this->MixedAirTempAtMinOAFlow = - (RecircMassFlowRateAtMinOAFlow * RecircTemp + curAirLoopFlow.MinOutAir * state.dataLoopNodes->Node(this->OANode).Temp) / - (RecircMassFlowRateAtMinOAFlow + curAirLoopFlow.MinOutAir); - } else { - this->MixedAirTempAtMinOAFlow = state.dataLoopNodes->Node(this->RetNode).Temp; - } - } - - // Economizer - this->CalcOAEconomizer(state, AirLoopNum, OutAirMinFrac, OASignal, HighHumidityOperationFlag, FirstHVACIteration); - - this->OAMassFlow = OASignal * this->MixMassFlow; - - // Do not allow OA to be below Ventilation:Mechanical flow rate or above mixed mass flow rate - if (AirLoopNum > 0 && VentMechObjectNum != 0) { - if (this->MechVentOAMassFlowRequest > this->OAMassFlow) { - this->OAMassFlow = min(this->MechVentOAMassFlowRequest, this->MixMassFlow); - } - } - - // Do not allow OA to be below Exh for controller:outside air - if (this->ControllerType == MixedAirControllerType::ControllerOutsideAir) { - if (this->ExhMassFlow > this->OAMassFlow) { - this->OAMassFlow = this->ExhMassFlow; - this->OALimitingFactor = OALimitFactor::Exhaust; - } - } - - // if fixed minimum, don't let go below min OA - if (this->FixedMin) { - // cycling fans allow "average" min OA to be below minimum - if (!AirLoopCyclingFan) { - Real64 minOASchedMassFlowRate = this->MinOAMassFlowRate * MinOASchedVal; - if (minOASchedMassFlowRate > this->OAMassFlow) { - this->OAMassFlow = minOASchedMassFlowRate; - this->OALimitingFactor = OALimitFactor::Limits; - } - } - } - - // Apply Minimum Fraction of Outdoor Air Schedule - if (this->MinOAflowSchPtr > 0) { - Real64 MinOAflowfracVal = GetCurrentScheduleValue(state, this->MinOAflowSchPtr); - MinOAflowfracVal = min(max(MinOAflowfracVal, 0.0), 1.0); - OutAirMinFrac = max(MinOAflowfracVal, OutAirMinFrac); - Real64 minOAFracMassFlowRate = this->MixMassFlow * MinOAflowfracVal; - if (minOAFracMassFlowRate > this->OAMassFlow) { - this->OAMassFlow = minOAFracMassFlowRate; - this->OALimitingFactor = OALimitFactor::Limits; - } - } - - // Apply Maximum Fraction of Outdoor Air Schedule - Real64 currentMaxOAMassFlowRate = this->MaxOAMassFlowRate; - if (this->MaxOAflowSchPtr > 0) { - Real64 MaxOAflowfracVal = GetCurrentScheduleValue(state, this->MaxOAflowSchPtr); - MaxOAflowfracVal = min(max(MaxOAflowfracVal, 0.0), 1.0); - currentMaxOAMassFlowRate = min(this->MaxOAMassFlowRate, this->MixMassFlow * MaxOAflowfracVal); - OutAirMinFrac = min(MaxOAflowfracVal, OutAirMinFrac); - if (currentMaxOAMassFlowRate < this->OAMassFlow) { - this->OAMassFlow = currentMaxOAMassFlowRate; - this->OALimitingFactor = OALimitFactor::Limits; - } - } - - // Don't let the OA flow be > than the max OA limit. OA for high humidity control is allowed to be greater than max OA. - // Night Ventilation has priority and may override an OASignal > 1 high humidity condition with OASignal = 1 - if (HighHumidityOperationFlag) { - Real64 maxOAMassFlow = this->MaxOAMassFlowRate * max(1.0, OASignal); - if (maxOAMassFlow < this->OAMassFlow) { - this->OAMassFlow = maxOAMassFlow; - this->OALimitingFactor = OALimitFactor::Limits; - } - } else { - if (this->MaxOAMassFlowRate < this->OAMassFlow) { - this->OAMassFlow = this->MaxOAMassFlowRate; - this->OALimitingFactor = OALimitFactor::Limits; - } - } - - if (!state.dataGlobal->WarmupFlag && !state.dataGlobal->DoingSizing && (this->ManageDemand) && (this->OAMassFlow > this->DemandLimitFlowRate)) { - this->OAMassFlow = this->DemandLimitFlowRate; - this->OALimitingFactor = OALimitFactor::DemandLimit; - } - if (this->EMSOverrideOARate) { - this->OAMassFlow = this->EMSOARateValue; - this->OALimitingFactor = OALimitFactor::EMS; - } - - // Don't let OA flow be > mixed air flow. - // Seems if RAB (return air bypass) that this should be don't let OA flow be > design supply flow but that causes other issues - if (this->MixMassFlow < this->OAMassFlow) { - this->OAMassFlow = this->MixMassFlow; - this->OALimitingFactor = OALimitFactor::MixedAir; - } - - // save the min outside air flow fraction and max outside air mass flow rate - if (AirLoopNum > 0) { - auto &curAirLoopControlInfo(state.dataAirLoop->AirLoopControlInfo(AirLoopNum)); - auto &curAirLoopFlow(state.dataAirLoop->AirLoopFlow(AirLoopNum)); - - curAirLoopFlow.OAMinFrac = OutAirMinFrac; - if (this->FixedMin) { - curAirLoopFlow.MinOutAir = min(OutAirMinFrac * curAirLoopFlow.DesSupply, this->MixMassFlow); - } else { - curAirLoopFlow.MinOutAir = OutAirMinFrac * this->MixMassFlow; - } - if (this->MixMassFlow > 0.0) { - curAirLoopFlow.OAFrac = this->OAMassFlow / this->MixMassFlow; - curAirLoopFlow.OAFlow = this->OAMassFlow; - } else { - curAirLoopFlow.OAFrac = 0.0; - curAirLoopFlow.OAFlow = 0.0; - } - this->MinOAFracLimit = OutAirMinFrac; - if (HighHumidityOperationFlag && OASignal > 1.0) { - curAirLoopFlow.MaxOutAir = this->MaxOAMassFlowRate * OASignal; - } else { - curAirLoopFlow.MaxOutAir = currentMaxOAMassFlowRate; - } - - // MJW - Not sure if this is necessary but keeping it for now - if (curAirLoopControlInfo.HeatingActiveFlag && curAirLoopControlInfo.EconomizerFlowLocked) { - // The airloop needs to be simulated again so that the heating coil & HX can be resimulated - if (curAirLoopControlInfo.HeatRecoveryResimFlag && curAirLoopControlInfo.OASysComponentsSimulated) { - curAirLoopControlInfo.ResimAirLoopFlag = true; - curAirLoopControlInfo.HeatRecoveryResimFlag = false; - curAirLoopControlInfo.HeatRecoveryResimFlag2 = true; - // on the first iteration, air loop heating coils have not be simulated so HeatingCoilActive=FALSE - // on the second iteration, the heating coils could have been on, but logic tests here could deactivate heating coil - // reset heating coil active status and HX since logic tests may turn off heating coil - // the ResimAirLoopFlag will force another iteration and things should line up on subsequent iterations - curAirLoopControlInfo.HeatingActiveFlag = false; - this->HRHeatingCoilActive = 0; - curAirLoopControlInfo.HeatRecoveryBypass = true; - this->HeatRecoveryBypassStatus = 1; - } else if (curAirLoopControlInfo.HeatRecoveryResimFlag2) { - curAirLoopControlInfo.ResimAirLoopFlag = true; - curAirLoopControlInfo.HeatRecoveryResimFlag2 = false; - } else { - curAirLoopControlInfo.ResimAirLoopFlag = false; - } - } else if (curAirLoopControlInfo.HeatingActiveFlag) { - this->HRHeatingCoilActive = 1; - } else { - this->HRHeatingCoilActive = 0; - } - - } // if (AirLoopNum > 0) - - // Set the relief air flow rate (must be done last to account for changes in OAMassFlow - this->RelMassFlow = max(this->OAMassFlow - this->ExhMassFlow, 0.0); - - // Save OA fraction for reporting - if (this->MixMassFlow > 0) { - this->OAFractionRpt = this->OAMassFlow / this->MixMassFlow; - } else { - if (this->OAMassFlow > 0) { - this->OAFractionRpt = OASignal; - } else { - this->OAFractionRpt = 0.0; - } - } - this->RelTemp = this->RetTemp; - this->RelEnth = this->RetEnth; - this->RelSensiLossRate = - this->RelMassFlow * Psychrometrics::PsyCpAirFnW(state.dataEnvrn->OutHumRat) * (this->RelTemp - state.dataEnvrn->OutDryBulbTemp); - this->RelTotalLossRate = this->RelMassFlow * (this->RelEnth - state.dataEnvrn->OutEnthalpy); - this->RelLatentLossRate = this->RelTotalLossRate - this->RelSensiLossRate; - this->OALimitingFactorReport = static_cast(OALimitingFactor); -} - -Real64 VentilationMechanicalProps::CalcMechVentController(EnergyPlusData &state, - Real64 SysSA // System supply air mass flow rate [kg/s] -) -{ - static constexpr std::string_view RoutineName("CalcMechVentController: "); - static std::string_view const &CurrentModuleObject(CurrentModuleObjects[static_cast(CMO::MechVentilation)]); - - // new local variables for DCV - // Zone OA flow rate based on each calculation method [m3/s] - std::array(DataSizing::OAFlowCalcMethod::Num)> ZoneOACalc{0.0}; - Real64 CO2PeopleGeneration = 0; // CO2 generation from people at design level - Real64 ZoneOABZ; // Zone breathing-zone OA flow rate [m3/s] - Real64 ZoneOA; // Zone OA flow rate [m3/s] - Real64 ZoneOAFrac; // Zone OA fraction (as a fraction of actual supply air flow rate) - Real64 SysOAuc; // System uncorrected OA flow rate - Real64 SysOA; // System supply OA volume flow rate [m3/s] - Real64 SysEv; // System ventilation efficiency - Real64 NodeTemp; // node temperature - Real64 NodeHumRat; // node humidity ratio - Real64 ZoneMaxCO2 = 0.0; // Breathing-zone CO2 concentartion - Real64 ZoneMinCO2 = 0.0; // Minimum CO2 concentration in zone - Real64 ZoneOAMin = 0.0; // Minimum Zone OA flow rate when the zone is unoccupied (i.e. ZoneOAPeople = 0) - Real64 ZoneOAMax = 0.0; // Maximum Zone OA flow rate (ZoneOAPeople + ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)]) - Real64 MechVentOAMassFlow = 0.0; - - // Apply mechanical ventilation only when it is available/allowed - if (GetCurrentScheduleValue(state, this->SchPtr) > 0) { - Real64 SysOAMassFlow = 0.0; // System supply OA mass flow rate [kg/s] - if (this->SystemOAMethod == DataSizing::SysOAMethod::IAQP) { - // IAQP for CO2 control - for (int ZoneIndex = 1; ZoneIndex <= this->NumofVentMechZones; ++ZoneIndex) { - auto &thisMechVentZone = this->VentMechZone(ZoneIndex); - int ZoneNum = thisMechVentZone.zoneNum; - SysOAMassFlow += state.dataContaminantBalance->ZoneSysContDemand(ZoneNum).OutputRequiredToCO2SP * - GetCurrentScheduleValue(state, thisMechVentZone.ZoneOASchPtr); - } - MechVentOAMassFlow = SysOAMassFlow; - } else if (this->SystemOAMethod == DataSizing::SysOAMethod::IAQPGC) { - // IAQP for generic contaminant control - for (int ZoneIndex = 1; ZoneIndex <= this->NumofVentMechZones; ++ZoneIndex) { - auto &thisMechVentZone = this->VentMechZone(ZoneIndex); - int ZoneNum = thisMechVentZone.zoneNum; - SysOAMassFlow += state.dataContaminantBalance->ZoneSysContDemand(ZoneNum).OutputRequiredToGCSP * - GetCurrentScheduleValue(state, thisMechVentZone.ZoneOASchPtr); - } - MechVentOAMassFlow = SysOAMassFlow; - } else if (this->SystemOAMethod == DataSizing::SysOAMethod::IAQPCOM) { - // IAQP for both CO2 and generic contaminant control - SysOAMassFlow = 0.0; - for (int ZoneIndex = 1; ZoneIndex <= this->NumofVentMechZones; ++ZoneIndex) { - auto &thisMechVentZone = this->VentMechZone(ZoneIndex); - int ZoneNum = thisMechVentZone.zoneNum; - SysOAMassFlow += state.dataContaminantBalance->ZoneSysContDemand(ZoneNum).OutputRequiredToCO2SP * - GetCurrentScheduleValue(state, thisMechVentZone.ZoneOASchPtr); - } - MechVentOAMassFlow = SysOAMassFlow; - SysOAMassFlow = 0.0; - for (int ZoneIndex = 1; ZoneIndex <= this->NumofVentMechZones; ++ZoneIndex) { - auto &thisMechVentZone = this->VentMechZone(ZoneIndex); - int ZoneNum = thisMechVentZone.zoneNum; - SysOAMassFlow += state.dataContaminantBalance->ZoneSysContDemand(ZoneNum).OutputRequiredToGCSP * - GetCurrentScheduleValue(state, thisMechVentZone.ZoneOASchPtr); - } - MechVentOAMassFlow = max(SysOAMassFlow, MechVentOAMassFlow); - } else { - // for system OA methods: Zone_Sum, VRP, CO2 methods - // new code for DCV method complying with the VRP defined in ASHRAE Standard 62.1-2010 - - // Loop through each zone first to calc uncorrected system OA flow rate - SysOAuc = 0.0; - SysOA = 0.0; - for (int ZoneIndex = 1; ZoneIndex <= this->NumofVentMechZones; ++ZoneIndex) { - auto &thisMechVentZone = this->VentMechZone(ZoneIndex); - int ZoneNum = thisMechVentZone.zoneNum; - auto const &curZone(state.dataHeatBal->Zone(ZoneNum)); - Real64 multiplier = curZone.Multiplier * curZone.ListMultiplier * GetCurrentScheduleValue(state, thisMechVentZone.ZoneOASchPtr); - - // Calc the zone OA flow rate based on the people component - // ZoneIntGain(ZoneNum)%NOFOCC is the number of occupants of a zone at each time step, already counting the occupant schedule - // Checking DCV flag before calculating zone OA per person - if (this->DCVFlag && this->SystemOAMethod != DataSizing::SysOAMethod::ProportionalControlDesOcc) { - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] = - state.dataHeatBal->ZoneIntGain(ZoneNum).NOFOCC * thisMechVentZone.ZoneOAPeopleRate; - } else { - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] = curZone.TotOccupants * thisMechVentZone.ZoneOAPeopleRate; - } - - // Calc the zone OA flow rate based on the floor area component - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] = curZone.FloorArea * thisMechVentZone.ZoneOAAreaRate; - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerZone)] = thisMechVentZone.ZoneOAFlowRate; - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::ACH)] = (thisMechVentZone.ZoneOAACHRate * curZone.Volume) / 3600.0; - - // Calc the breathing-zone OA flow rate - int OAIndex = thisMechVentZone.ZoneDesignSpecOAObjIndex; // index to design specification outdoor air objects - if (OAIndex > 0) { - switch (state.dataSize->OARequirements(OAIndex).OAFlowMethod) { - case DataSizing::OAFlowCalcMethod::Sum: { - ZoneOABZ = multiplier * (ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] + - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] + - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerZone)] + - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::ACH)]); - } break; - case DataSizing::OAFlowCalcMethod::Max: { - ZoneOABZ = multiplier * max(ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)], - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)], - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerZone)], - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::ACH)]); - - } break; - default: { - ZoneOABZ = multiplier * ZoneOACalc[static_cast(state.dataSize->OARequirements(OAIndex).OAFlowMethod)]; - break; - } - } - } else { - ZoneOABZ = multiplier * ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)]; - } - - if (this->SystemOAMethod == DataSizing::SysOAMethod::ZoneSum) { - // Sum the zone OA flow rates and done - SysOA += ZoneOABZ; - } else { - // Calc the uncorrected system OA flow rate - VRP and ProportionalControl - SysOAuc += ZoneOABZ; - } - } - - // get system supply air flow rate - if (this->SystemOAMethod == DataSizing::SysOAMethod::VRP || this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc || - this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc || - this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate || - this->SystemOAMethod == DataSizing::SysOAMethod::VRPL) { - - // System supply air flow rate is always greater than or equal the system outdoor air flow rate - if ((SysSA > 0.0) && (SysSA < (SysOAuc * state.dataEnvrn->StdRhoAir))) SysSA = SysOAuc * state.dataEnvrn->StdRhoAir; - - // calc Xs - average outdoor air fraction - if (SysSA > 0.0) { - Xs = (SysOAuc * state.dataEnvrn->StdRhoAir) / SysSA; - } else { - Xs = 0.0; - } - - // Loop through each zone again - SysEv = 2.0; // starting with a big fraction - for (int ZoneIndex = 1; ZoneIndex <= this->NumofVentMechZones; ++ZoneIndex) { - auto &thisMechVentZone = this->VentMechZone(ZoneIndex); - int ZoneNum = thisMechVentZone.zoneNum; - int ZoneEquipConfigNum = ZoneNum; // correspondence - 1:1 of ZoneEquipConfig to Zone index - Real64 ZoneEz = 0.0; // Zone air distribution effectiveness - - // Assign references - auto &curZone(state.dataHeatBal->Zone(ZoneNum)); - auto &curZoneSysEnergyDemand(state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneEquipConfigNum)); - Real64 multiplier = curZone.Multiplier * curZone.ListMultiplier * GetCurrentScheduleValue(state, thisMechVentZone.ZoneOASchPtr); - - // Calc the zone OA flow rate based on the people component - // ZoneIntGain(ZoneNum)%NOFOCC is the number of occupants of a zone at each time step, already counting the occupant schedule - // Checking DCV flag before calculating zone OA per person - if (this->DCVFlag && this->SystemOAMethod != DataSizing::SysOAMethod::ProportionalControlDesOcc) { - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] = - state.dataHeatBal->ZoneIntGain(ZoneNum).NOFOCC * multiplier * thisMechVentZone.ZoneOAPeopleRate; - } else { - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] = - curZone.TotOccupants * multiplier * thisMechVentZone.ZoneOAPeopleRate; - } - - // Calc the zone OA flow rate based on the floor area component - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] = - curZone.FloorArea * multiplier * thisMechVentZone.ZoneOAAreaRate; - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerZone)] = multiplier * thisMechVentZone.ZoneOAFlowRate; - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::ACH)] = - multiplier * (thisMechVentZone.ZoneOAACHRate * curZone.Volume) / 3600.0; - - // Calc the breathing-zone OA flow rate - int OAIndex = thisMechVentZone.ZoneDesignSpecOAObjIndex; - if (OAIndex > 0) { - switch (state.dataSize->OARequirements(OAIndex).OAFlowMethod) { - case DataSizing::OAFlowCalcMethod::Sum: { - ZoneOABZ = ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] + - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] + - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerZone)] + - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::ACH)]; - } break; - case DataSizing::OAFlowCalcMethod::Max: { - ZoneOABZ = max(ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)], - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)], - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerZone)], - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::ACH)]); - - } break; - default: { - ZoneOABZ = ZoneOACalc[static_cast(state.dataSize->OARequirements(OAIndex).OAFlowMethod)]; - break; - } - } - } - - // use the ventilation rate procedure in ASHRAE Standard 62.1-2007 - // Calc the zone supplied OA flow rate counting the zone air distribution effectiveness - // First check whether the zone air distribution effectiveness schedule exists, if yes uses it; - // otherwise uses the inputs of zone distribution effectiveness in cooling mode or heating mode - int ADEffSchPtr = thisMechVentZone.ZoneADEffSchPtr; - if (ADEffSchPtr > 0) { - // Get schedule value for the zone air distribution effectiveness - ZoneEz = GetCurrentScheduleValue(state, ADEffSchPtr); - } else { - Real64 ZoneLoad = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneNum).TotalOutputRequired; - - // Zone in cooling mode - if (ZoneLoad < 0.0) ZoneEz = thisMechVentZone.ZoneADEffCooling; - - // Zone in heating mode - if (ZoneLoad > 0.0) ZoneEz = thisMechVentZone.ZoneADEffHeating; - } - if (ZoneEz <= 0.0) { - // Enforce defaults - ZoneEz = 1.0; - } - - // Calc zone supply OA flow rate - if (this->SystemOAMethod == DataSizing::SysOAMethod::VRP || this->SystemOAMethod == DataSizing::SysOAMethod::VRPL) { - // the VRP case - ZoneOA = ZoneOABZ / ZoneEz; - - } else if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc || - this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc || - this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate) { - // Check whether "Carbon Dioxide Control Availability Schedule" for ZoneControl:ContaminantController is specified - if (curZone.ZoneContamControllerSchedIndex > 0.0) { - // Check the availability schedule value for ZoneControl:ContaminantController - Real64 ZoneContamControllerSched = GetCurrentScheduleValue(state, curZone.ZoneContamControllerSchedIndex); - if (ZoneContamControllerSched > 0.0) { - ZoneOAMin = ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] / ZoneEz; - ZoneOAMax = (ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] + - ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)]) / - ZoneEz; - if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate) { - ZoneOAMax = ZoneOABZ / ZoneEz; - if (thisMechVentZone.OAPropCtlMinRateSchPtr > 0) { - ZoneOAMin = ZoneOAMax * GetCurrentScheduleValue(state, thisMechVentZone.OAPropCtlMinRateSchPtr); - } else { - ZoneOAMin = ZoneOAMax; - } - if (ZoneOAMax < ZoneOAMin) { - ZoneOAMin = ZoneOAMax; - ++this->OAMaxMinLimitErrorCount; - if (this->OAMaxMinLimitErrorCount < 2) { - ShowSevereError(state, format("{}{} = \"{}\".", RoutineName, CurrentModuleObject, this->Name)); - ShowContinueError( - state, - format("For System Outdoor Air Method = ProportionalControlBasedOnDesignOARate, maximum zone " - "outdoor air rate ({:.4R}), is not greater than minimum zone outdoor air rate ({:.4R}).", - ZoneOAMax, - ZoneOAMin)); - ShowContinueError(state, - " The minimum zone outdoor air rate is set to the maximum zone outdoor air rate. " - "Simulation continues..."); - ShowContinueErrorTimeStamp(state, ""); - } else { - ShowRecurringWarningErrorAtEnd( - state, - format("{} = \"{}\", For System Outdoor Air Method = ProportionalControlBasedOnDesignOARate, maximum " - "zone outdoor air rate is not greater than minimum zone outdoor air rate. Error continues...", - CurrentModuleObject, - this->Name), - this->OAMaxMinLimitErrorIndex); - } - } - } - - if (ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] > 0.0) { - if (state.dataContaminantBalance->ZoneCO2GainFromPeople(ZoneNum) > 0.0) { - if (curZone.ZoneMinCO2SchedIndex > 0.0) { - // Take the schedule value of "Minimum Carbon Dioxide Concentration Schedule Name" - // in the ZoneControl:ContaminantController - ZoneMinCO2 = GetCurrentScheduleValue(state, curZone.ZoneMinCO2SchedIndex); - } else { - ZoneMinCO2 = state.dataContaminantBalance->OutdoorCO2; - } - - // Calculate zone maximum target CO2 concentration in PPM - if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc) { - // Accumulate CO2 generation from people at design occupancy and current activity level - for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { - if (state.dataHeatBal->People(PeopleNum).ZonePtr != ZoneNum) continue; - CO2PeopleGeneration += - state.dataHeatBal->People(PeopleNum).NumberOfPeople * - state.dataHeatBal->People(PeopleNum).CO2RateFactor * - GetCurrentScheduleValue(state, state.dataHeatBal->People(PeopleNum).ActivityLevelPtr); - } - ZoneMaxCO2 = state.dataContaminantBalance->OutdoorCO2 + - (CO2PeopleGeneration * curZone.Multiplier * curZone.ListMultiplier * 1.0e6) / ZoneOAMax; - } else if (curZone.ZoneMaxCO2SchedIndex > 0.0) { - ZoneMaxCO2 = GetCurrentScheduleValue(state, curZone.ZoneMaxCO2SchedIndex); - } else { - ZoneMaxCO2 = state.dataContaminantBalance->OutdoorCO2 + - (state.dataContaminantBalance->ZoneCO2GainFromPeople(ZoneNum) * curZone.Multiplier * - curZone.ListMultiplier * 1.0e6) / - ZoneOAMax; - } - - if (ZoneMaxCO2 <= ZoneMinCO2) { - ++this->CO2MaxMinLimitErrorCount; - if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc) { - if (this->CO2MaxMinLimitErrorCount < 2) { - ShowSevereError(state, format("{}{} = \"{}\".", RoutineName, CurrentModuleObject, this->Name)); - ShowContinueError( - state, - format("For System Outdoor Air Method = ProportionalControlBasedOnOccupancySchedule, " - "maximum target CO2 concentration ({:.2R}), is not greater than minimum target " - "CO2 concentration ({:.2R}).", - ZoneMaxCO2, - ZoneMinCO2)); - ShowContinueError(state, - "\"ProportionalControlBasedOnOccupancySchedule\" will not be modeled. " - "Default \"Standard62.1VentilationRateProcedure\" will be modeled. Simulation " - "continues..."); - ShowContinueErrorTimeStamp(state, ""); - } else { - ShowRecurringWarningErrorAtEnd(state, - format("{} = \"{}\", For System Outdoor Air Method = " - "ProportionalControlBasedOnOccupancySchedule, maximum " - "target CO2 concentration is not greater than minimum " - "target CO2 concentration. Error continues...", - CurrentModuleObject, - this->Name), - this->CO2MaxMinLimitErrorIndex); - } - } - if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc) { - if (this->CO2MaxMinLimitErrorCount < 2) { - ShowSevereError(state, format("{}{} = \"{}\".", RoutineName, CurrentModuleObject, this->Name)); - ShowContinueError( - state, - format("For System Outdoor Air Method = ProportionalControlBasedOnDesignOccupancy, " - "maximum target CO2 concentration ({:.2R}), is not greater than minimum target " - "CO2 concentration ({:.2R}).", - ZoneMaxCO2, - ZoneMinCO2)); - ShowContinueError(state, - "\"ProportionalControlBasedOnDesignOccupancy\" will not be modeled. " - "Default \"Standard62.1VentilationRateProcedure\" will be modeled. Simulation " - "continues..."); - ShowContinueErrorTimeStamp(state, ""); - } else { - ShowRecurringWarningErrorAtEnd(state, - format("{} = \"{}\", For System Outdoor Air Method = " - "ProportionalControlBasedOnDesignOccupancy, maximum " - "target CO2 concentration is not greater than minimum " - "target CO2 concentration. Error continues...", - CurrentModuleObject, - this->Name), - this->CO2MaxMinLimitErrorIndex); - } - } - if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate) { - if (this->CO2MaxMinLimitErrorCount < 2) { - ShowSevereError(state, format("{}{} = \"{}\".", RoutineName, CurrentModuleObject, this->Name)); - ShowContinueError( - state, - format("For System Outdoor Air Method = ProportionalControlBasedOnDesignOARate, maximum " - "target CO2 concentration ({:.2R}), is not greater than minimum target CO2 " - "concentration ({:.2R}).", - ZoneMaxCO2, - ZoneMinCO2)); - ShowContinueError( - state, - "\"ProportionalControlBasedOnDesignOARate\" will not be modeled. Default " - "\"Standard62.1VentilationRateProcedure\" will be modeled. Simulation continues..."); - ShowContinueErrorTimeStamp(state, ""); - } else { - ShowRecurringWarningErrorAtEnd(state, - format("{} = \"{}\", For System Outdoor Air Method = " - "ProportionalControlBasedOnDesignOARate, maximum target " - "CO2 concentration is not greater than minimum target CO2 " - "concentration. Error continues...", - CurrentModuleObject, - this->Name), - this->CO2MaxMinLimitErrorIndex); - } - } - - ZoneOA = ZoneOABZ / ZoneEz; - } else { - - if (state.dataContaminantBalance->ZoneAirCO2(ZoneNum) <= ZoneMinCO2) { - // Zone air CO2 concentration is less than minimum zone CO2 concentration, set the Zone OA flow - // rate to minimum Zone OA flow rate when the zone is unoccupied - ZoneOA = ZoneOAMin; - } else if (state.dataContaminantBalance->ZoneAirCO2(ZoneNum) >= ZoneMaxCO2) { - // Zone air CO2 concentration is greater than maximum zone CO2 concentration, set the Zone OA flow - // rate to maximum Zone OA flow rate (i.e. - // ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerArea)] + ZoneOAPeople) - ZoneOA = ZoneOAMax; - } else { - // Zone air CO2 concentration is between maximum and minimum limits of zone CO2 concentration, - // set Zone OA flow rate by proportionally adjusting between ZoneOAMin and ZoneOAMax - ZoneOA = ZoneOAMin + - (ZoneOAMax - ZoneOAMin) * ((state.dataContaminantBalance->ZoneAirCO2(ZoneNum) - ZoneMinCO2) / - (ZoneMaxCO2 - ZoneMinCO2)); - } - } - } else { - if (state.dataGlobal->DisplayExtraWarnings) { - ++this->CO2GainErrorCount; - if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc) { - if (this->CO2GainErrorCount < 2) { - ShowSevereError(state, format("{}{} = \"{}\".", RoutineName, CurrentModuleObject, this->Name)); - ShowContinueError( - state, - format("For System Outdoor Air Method = ProportionalControlBasedOnOccupancySchedule, CO2 " - "generation from people is not greater than zero. Occurs in Zone =\"{}\". ", - curZone.Name)); - ShowContinueError(state, - "\"ProportionalControlBasedOnOccupancySchedule\" will not be modeled. " - "Default \"Standard62.1VentilationRateProcedure\" will be modeled. Simulation " - "continues..."); - ShowContinueErrorTimeStamp(state, ""); - } else { - ShowRecurringWarningErrorAtEnd( - state, - format("{} = \"{}\", For System Outdoor Air Method = " - "ProportionalControlBasedOnOccupancySchedule, " - "CO2 generation from people is not greater than zero. Error continues...", - CurrentModuleObject, - this->Name), - this->CO2GainErrorIndex); - } - } - if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc) { - if (this->CO2GainErrorCount < 2) { - ShowSevereError(state, format("{}{} = \"{}\".", RoutineName, CurrentModuleObject, this->Name)); - ShowContinueError( - state, - format("For System Outdoor Air Method = ProportionalControlBasedOnDesignOccupancy, CO2 " - "generation from people is not greater than zero. Occurs in Zone =\"{}\". ", - curZone.Name)); - ShowContinueError(state, - "\"ProportionalControlBasedOnDesignOccupancy\" will not be modeled. " - "Default \"Standard62.1VentilationRateProcedure\" will be modeled. Simulation " - "continues..."); - ShowContinueErrorTimeStamp(state, ""); - } else { - ShowRecurringWarningErrorAtEnd( - state, - format( - "{} = \"{}\", For System Outdoor Air Method = ProportionalControlBasedOnDesignOccupancy, " - "CO2 generation from people is not greater than zero. Error continues...", - CurrentModuleObject, - this->Name), - this->CO2GainErrorIndex); - } - } - } - ZoneOA = ZoneOABZ / ZoneEz; - } - } else { - // ZoneOACalc[static_cast(DataSizing::OAFlowCalcMethod::PerPerson)] is less than or equal to zero - ZoneOA = ZoneOABZ / ZoneEz; - } - } else { - // ZoneControl:ContaminantController is scheduled off (not available) - ZoneOA = ZoneOABZ / ZoneEz; - } - } else { - // "Carbon Dioxide Control Availability Schedule" for ZoneControl:ContaminantController not found - ZoneOA = ZoneOABZ / ZoneEz; - } - SysOA = SysOA + ZoneOA; - } - - // Get the zone supply air flow rate - Real64 ZoneSA = 0.0; // Zone supply air flow rate - Real64 ZonePA = 0.0; // Zone primary air flow rate - Ep = 1.0; - if (ZoneEquipConfigNum > 0) { - auto &curZoneEquipConfig = state.dataZoneEquip->ZoneEquipConfig(ZoneEquipConfigNum); - for (int InNodeIndex = 1; InNodeIndex <= curZoneEquipConfig.NumInletNodes; ++InNodeIndex) { - // Assume primary air is always stored at the AirDistUnitCool (cooling deck if dual duct) - int PriNode = curZoneEquipConfig.AirDistUnitCool(InNodeIndex).InNode; // primary node of zone terminal unit - Real64 MassFlowRate = 0.0; - if (PriNode > 0) { - NodeTemp = state.dataLoopNodes->Node(PriNode).Temp; - NodeHumRat = state.dataLoopNodes->Node(PriNode).HumRat; - MassFlowRate = state.dataLoopNodes->Node(PriNode).MassFlowRate; - } - // total primary air to terminal units of the zone - if (MassFlowRate > 0.0) - ZonePA += - MassFlowRate / Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, NodeTemp, NodeHumRat); - - // or InletNode = ZoneEquipConfig(ZoneEquipConfigNum)%AirDistUnitCool(InNodeIndex)%OutNode - int InletNode = curZoneEquipConfig.InletNode(InNodeIndex); // outlet node of zone terminal unit - MassFlowRate = 0.0; - if (InletNode > 0) { - NodeTemp = state.dataLoopNodes->Node(InletNode).Temp; - NodeHumRat = state.dataLoopNodes->Node(InletNode).HumRat; // ZoneAirHumRat(ZoneNum) - MassFlowRate = state.dataLoopNodes->Node(InletNode).MassFlowRate; - } - // total supply air to the zone - if (MassFlowRate > 0.0) - ZoneSA += - MassFlowRate / Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, NodeTemp, NodeHumRat); - } - - // calc zone primary air fraction - if (ZoneSA > 0.0) Ep = ZonePA / ZoneSA; - if (Ep > 1.0) Ep = 1.0; - } - - // Calc the zone OA fraction = Zone OA flow rate / Zone supply air flow rate - if (ZoneSA > 0.0) { - ZoneOAFrac = ZoneOA / ZoneSA; - // Zone OA fraction cannot be more than 1 - if (ZoneOAFrac > 1.0) ZoneOAFrac = 1.0; - } else { - ZoneOAFrac = 0.0; - } - - // added for TRACE - zone maximum OA fraction - calculate the adjustment factor for the TU/zone supply air flow - // only for VRP system OA method - curZoneSysEnergyDemand.SupplyAirAdjustFactor = 1.0; - - if (this->SystemOAMethod == DataSizing::SysOAMethod::VRP || this->SystemOAMethod == DataSizing::SysOAMethod::VRPL) { - if (ZoneOAFrac > this->ZoneMaxOAFraction) { - if (this->ZoneMaxOAFraction > 0.0) { - curZoneSysEnergyDemand.SupplyAirAdjustFactor = ZoneOAFrac / this->ZoneMaxOAFraction; - } else { - curZoneSysEnergyDemand.SupplyAirAdjustFactor = 1.0; - } - - // cap zone OA fraction at the maximum specified - ZoneOAFrac = this->ZoneMaxOAFraction; - } - } - - // Zone air secondary recirculation fraction - Er = thisMechVentZone.ZoneSecondaryRecirculation; - if (Er > 0.0) { - // multi-path ventilation system using VRP - Fa = Ep + (1.0 - Ep) * Er; - Fb = Ep; - Fc = 1.0 - (1.0 - ZoneEz) * (1.0 - Er) * (1.0 - Ep); - - // Calc zone ventilation efficiency - if (Fa > 0.0) { - Evz = 1.0 + Xs * Fb / Fa - ZoneOAFrac * Ep * Fc / Fa; - } else { - Evz = 1.0; - } - } else { - // single-path ventilation system - Evz = 1.0 + Xs - ZoneOAFrac; - } - - // calc system ventilation efficiency = Minimum of zone ventilation efficiency - if (Evz < 0.0) Evz = 0.0; - if (Evz < SysEv) SysEv = Evz; - - } // zone loop - - // Calc the system supply OA flow rate counting the system ventilation efficiency - if (SysEv <= 0.0) SysEv = 1.0; - - // Calc system outdoor air requirement - if (this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlSchOcc || - this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOcc || - this->SystemOAMethod == DataSizing::SysOAMethod::ProportionalControlDesOARate) { - SysOA = SysOA / SysEv; - } else if (this->SystemOAMethod == DataSizing::SysOAMethod::VRPL && this->SysDesOA > 0.0) { - // Limit system OA to design OA minimum flow rate, as per ASHRAE Guideline 36-2018 Section 5.16.3.1 - // If no system sizing run is done (i.e. no Sizing:System) the design outdoor air flow rate is not known - SysOA = min(SysOAuc / SysEv, this->SysDesOA); - } else { - SysOA = SysOAuc / SysEv; - } - } - - // Finally calc the system supply OA mass flow rate - MechVentOAMassFlow = SysOA * state.dataEnvrn->StdRhoAir; - } - } - return MechVentOAMassFlow; -} - -void OAControllerProps::CalcOAEconomizer(EnergyPlusData &state, - int const AirLoopNum, - Real64 const OutAirMinFrac, - Real64 &OASignal, - bool &HighHumidityOperationFlag, - bool const FirstHVACIteration) -{ - int constexpr MaxIte(500); // Maximum number of iterations - Real64 constexpr Acc(0.0001); // Accuracy of result - bool AirLoopEconoLockout; // Economizer lockout flag - bool AirLoopNightVent; // Night Ventilation flag for air loop - bool EconomizerOperationFlag; // TRUE if OA economizer is active - Real64 EconomizerAirFlowScheduleValue; // value of economizer operation schedule (push-button type control schedule) - Real64 MaximumOAFracBySetPoint; // The maximum OA fraction due to freezing cooling coil check - Real64 OutAirSignal; // Used to set OA mass flow rate - int SolFla; // Flag of solver - Real64 minOAFrac; - - if (AirLoopNum > 0) { - // Check lockout with heating for any airloop - will lockout economizer even on airloops without a unitary system - if (this->Lockout == LockoutType::LockoutWithHeatingPossible) { - // For all system types (even ones that don't set AirLoopEconoLockout) lock out economizer if unfavorable for heating - if (state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CheckHeatRecoveryBypassStatus && - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysComponentsSimulated) { - - if (this->MixedAirTempAtMinOAFlow <= state.dataLoopNodes->Node(this->MixNode).TempSetPoint) { - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).EconomizerFlowLocked = true; - // this->OAMassFlow = AirLoopFlow( AirLoopNum ).MinOutAir; - // AirLoopFlow( AirLoopNum ).OAFrac = this->OAMassFlow / this->MixMassFlow; - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).EconoLockout = true; - EconomizerOperationFlag = false; - } else { - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).EconomizerFlowLocked = false; - this->HRHeatingCoilActive = 0; - } - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).CheckHeatRecoveryBypassStatus = false; - } - } - } - - if (AirLoopNum > 0) { - AirLoopEconoLockout = state.dataAirLoop->AirLoopControlInfo(AirLoopNum).EconoLockout; - AirLoopNightVent = state.dataAirLoop->AirLoopControlInfo(AirLoopNum).NightVent; - } else { - AirLoopEconoLockout = false; - AirLoopNightVent = false; - } - - // Define an outside air signal - if (this->MixedAirSPMNum > 0) { - this->CoolCoilFreezeCheck = SetPointManager::GetCoilFreezingCheckFlag(state, this->MixedAirSPMNum); - } else { - this->CoolCoilFreezeCheck = false; - } - - if (std::abs(this->RetTemp - this->InletTemp) > SmallTempDiff) { - OutAirSignal = (this->RetTemp - this->MixSetTemp) / (this->RetTemp - this->InletTemp); - if (this->CoolCoilFreezeCheck) { - this->MaxOAFracBySetPoint = 0.0; - MaximumOAFracBySetPoint = OutAirSignal; - } - } else { - if (this->RetTemp - this->MixSetTemp < 0.0) { - if (this->RetTemp - this->InletTemp >= 0.0) { - OutAirSignal = -1.0; - } else { - OutAirSignal = 1.0; - } - } else { - if (this->RetTemp - this->InletTemp >= 0.0) { - OutAirSignal = 1.0; - } else { - OutAirSignal = -1.0; - } - } - } - OutAirSignal = min(max(OutAirSignal, OutAirMinFrac), 1.0); - - // If no economizer, set to minimum and disable economizer and high humidity control - if (this->Econo == EconoOp::NoEconomizer) { - OutAirSignal = OutAirMinFrac; - EconomizerOperationFlag = false; - EconomizerAirFlowScheduleValue = 0.0; - HighHumidityOperationFlag = false; - } else if (this->MaxOA < SmallAirVolFlow) { - OutAirSignal = OutAirMinFrac; - EconomizerOperationFlag = false; - EconomizerAirFlowScheduleValue = 0.0; - HighHumidityOperationFlag = false; - } else if (AirLoopEconoLockout) { - OutAirSignal = OutAirMinFrac; - EconomizerOperationFlag = false; - EconomizerAirFlowScheduleValue = 0.0; - HighHumidityOperationFlag = false; - } else { - // Changed by Amit for new implementation - // Otherwise do the limit checks - EconomizerOperationFlag = true; - // Outside air temp greater than mix air setpoint - if (this->InletTemp > this->MixSetTemp) { - OutAirSignal = 1.0; - } - // Return air temp limit - if (this->Econo == EconoOp::DifferentialDryBulb) { - if (this->InletTemp > this->RetTemp) { - OutAirSignal = OutAirMinFrac; - EconomizerOperationFlag = false; - } - this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); - } - // Return air enthalpy limit - if (this->Econo == EconoOp::DifferentialEnthalpy) { - if (this->InletEnth > this->RetEnth) { - OutAirSignal = OutAirMinFrac; - EconomizerOperationFlag = false; - } - this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); - } - // Outside air temperature limit - if (this->Econo == EconoOp::FixedDryBulb) { - this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); - } - // Fixed Enthalpy limit - if (this->Econo == EconoOp::FixedEnthalpy) { - this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); - } - // FIXED DEW POINT AND DRY BULB TEMPERATURE STRATEGY - if (this->Econo == EconoOp::FixedDewPointAndDryBulb) { - this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); - } - // ELECRONIC ENTHALPY, HUMIDITY RATIO CURVE - if (this->Econo == EconoOp::ElectronicEnthalpy) { - this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); - } - // Differential dry bulb and enthalpy strategy - if (this->Econo == EconoOp::DifferentialDryBulbAndEnthalpy) { - if (this->InletTemp > this->RetTemp) { - OutAirSignal = OutAirMinFrac; - EconomizerOperationFlag = false; - } - if (this->InletEnth > this->RetEnth) { - OutAirSignal = OutAirMinFrac; - EconomizerOperationFlag = false; - } - this->Checksetpoints(state, OutAirMinFrac, OutAirSignal, EconomizerOperationFlag); - } - - if (this->TempLowLim != BlankNumeric && this->OATemp < this->TempLowLim) { - OutAirSignal = OutAirMinFrac; - EconomizerOperationFlag = false; - } - // Increase air flow for humidity control - // (HumidistatZoneNum is greater than 0 IF High Humidity Control Flag = YES, checked in GetInput) - if (this->HumidistatZoneNum > 0) { - // IF humidistat senses a moisture load check to see if modifying air flow is appropriate, otherwise disable modified air flow - if (state.dataZoneEnergyDemand->ZoneSysMoistureDemand(this->HumidistatZoneNum).TotalOutputRequired < 0.0) { - // IF OAController is not allowed to modify air flow during high outdoor humrat condition, then disable modified air flow - // if indoor humrat is less than or equal to outdoor humrat - if (!this->ModifyDuringHighOAMoisture && - (state.dataLoopNodes->Node(this->NodeNumofHumidistatZone).HumRat - this->OAHumRat) <= DataHVACGlobals::SmallHumRatDiff) { - HighHumidityOperationFlag = false; - } else { - HighHumidityOperationFlag = true; - } - } else { - HighHumidityOperationFlag = false; - } - } else { - HighHumidityOperationFlag = false; - } - - // Check time of day economizer schedule, enable economizer if schedule value > 0 - EconomizerAirFlowScheduleValue = 0.0; - if (this->EconomizerOASchedPtr > 0) { - EconomizerAirFlowScheduleValue = GetCurrentScheduleValue(state, this->EconomizerOASchedPtr); - if (EconomizerAirFlowScheduleValue > 0.0) { - EconomizerOperationFlag = true; - OutAirSignal = 1.0; - } - } - } - - // OutAirSignal will not give exactly the correct mixed air temperature (equal to the setpoint) since - // it was calculated using the approximate method of sensible energy balance. Now we have to get the - // accurate result using a full mass, enthalpy and moisture balance and iteration. - if (OutAirSignal > OutAirMinFrac && OutAirSignal < 1.0 && this->MixMassFlow > VerySmallMassFlow && - this->ControllerType == MixedAirControllerType::ControllerOutsideAir && !AirLoopNightVent) { - - if (AirLoopNum > 0) { - - if (state.dataAirLoop->OutsideAirSys(state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysNum).NumComponents == 1) { - // no need to simulate OA System if only a mixer is used in the OutsideAirSystem - - auto f = [&state, this](Real64 const OASignal) { - Real64 const OAMassFlowRate = OASignal * this->MixMassFlow; - Real64 const RecircMassFlowRate = max(this->MixMassFlow - OAMassFlowRate, 0.0); - Real64 const RecircEnth = state.dataLoopNodes->Node(this->RetNode).Enthalpy; - Real64 const RecircHumRat = state.dataLoopNodes->Node(this->RetNode).HumRat; - Real64 const MixEnth = - (RecircMassFlowRate * RecircEnth + OAMassFlowRate * state.dataLoopNodes->Node(this->OANode).Enthalpy) / this->MixMassFlow; - Real64 const MixHumRat = - (RecircMassFlowRate * RecircHumRat + OAMassFlowRate * state.dataLoopNodes->Node(this->OANode).HumRat) / this->MixMassFlow; - Real64 const MixTemp = Psychrometrics::PsyTdbFnHW(MixEnth, MixHumRat); - return state.dataLoopNodes->Node(this->MixNode).TempSetPoint - MixTemp; - }; - - General::SolveRoot(state, Acc, MaxIte, SolFla, OASignal, f, OutAirMinFrac, 1.0); - if (SolFla < 0) { - OASignal = OutAirSignal; - } - - } else { - - // simulate OA System if equipment exists other than the mixer (e.g., heating/cooling coil, HX, ect.) - - // 1 - check min OA flow result - if (this->FixedMin) { - state.dataLoopNodes->Node(this->OANode).MassFlowRate = - min(max(this->ExhMassFlow, OutAirMinFrac * state.dataAirLoop->AirLoopFlow(AirLoopNum).DesSupply), - state.dataLoopNodes->Node(this->MixNode).MassFlowRate); - state.dataLoopNodes->Node(this->RelNode).MassFlowRate = - max(state.dataLoopNodes->Node(this->OANode).MassFlowRate - this->ExhMassFlow, 0.0); - // save actual OA flow frac for use as min value for RegulaFalsi call - minOAFrac = max(OutAirMinFrac, state.dataLoopNodes->Node(this->OANode).MassFlowRate / this->MixMassFlow); - } else { - state.dataLoopNodes->Node(this->OANode).MassFlowRate = - max(this->ExhMassFlow, OutAirMinFrac * state.dataLoopNodes->Node(this->MixNode).MassFlowRate); - state.dataLoopNodes->Node(this->RelNode).MassFlowRate = - max(state.dataLoopNodes->Node(this->OANode).MassFlowRate - this->ExhMassFlow, 0.0); - // save actual OA flow frac for use as min value for RegulaFalsi call - minOAFrac = max(OutAirMinFrac, state.dataLoopNodes->Node(this->OANode).MassFlowRate / this->MixMassFlow); - } - SimOASysComponents(state, state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysNum, FirstHVACIteration, AirLoopNum); - Real64 lowFlowResiduum = state.dataLoopNodes->Node(this->MixNode).TempSetPoint - state.dataLoopNodes->Node(this->MixNode).Temp; - - // 2 - check max OA flow result - state.dataLoopNodes->Node(this->OANode).MassFlowRate = max(this->ExhMassFlow, state.dataLoopNodes->Node(this->MixNode).MassFlowRate); - state.dataLoopNodes->Node(this->RelNode).MassFlowRate = - max(state.dataLoopNodes->Node(this->OANode).MassFlowRate - this->ExhMassFlow, 0.0); - SimOASysComponents(state, state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysNum, FirstHVACIteration, AirLoopNum); - Real64 highFlowResiduum = state.dataLoopNodes->Node(this->MixNode).TempSetPoint - state.dataLoopNodes->Node(this->MixNode).Temp; - - // 3 - test to ensure RegulaFalsi can find an answer - if ((sign(lowFlowResiduum) == sign(highFlowResiduum))) { - OASignal = OutAirSignal; - } else { - // 4 - find result - - auto f = [&state, this, FirstHVACIteration, AirLoopNum](Real64 const OASignal) { - Real64 const MixMassFlowRate = this->MixMassFlow; - int const OASysNum = state.dataAirLoop->AirLoopControlInfo(AirLoopNum).OASysNum; - Real64 localExhMassFlow = state.dataAirLoop->AirLoopControlInfo(AirLoopNum).ZoneExhMassFlow; - Real64 const OAMassFlowRate = max(localExhMassFlow, OASignal * MixMassFlowRate); - state.dataLoopNodes->Node(this->OANode).MassFlowRate = OAMassFlowRate; // set OA node mass flow rate - state.dataLoopNodes->Node(this->RelNode).MassFlowRate = - max(OAMassFlowRate - localExhMassFlow, 0.0); // set relief node mass flow rate to maintain mixer continuity calcs - SimOASysComponents(state, OASysNum, FirstHVACIteration, AirLoopNum); - return state.dataLoopNodes->Node(this->MixNode).TempSetPoint - state.dataLoopNodes->Node(this->MixNode).Temp; - }; - - General::SolveRoot(state, (Acc / 10.0), MaxIte, SolFla, OASignal, f, minOAFrac, 1.0); - if (SolFla < 0) { // if RegulaFalsi fails to find a solution, returns -1 or -2, set to existing OutAirSignal - OASignal = OutAirSignal; - } - } - } - - } else { - - auto f = [&state, this](Real64 const OASignal) { - Real64 const MixMassFlowRate = this->MixMassFlow; - Real64 OAMassFlowRate = OASignal * MixMassFlowRate; - Real64 RecircMassFlowRate = max(MixMassFlowRate - OAMassFlowRate, 0.0); - Real64 RecircEnth = state.dataLoopNodes->Node(this->RetNode).Enthalpy; - Real64 RecircHumRat = state.dataLoopNodes->Node(this->RetNode).HumRat; - Real64 MixEnth = - (RecircMassFlowRate * RecircEnth + OAMassFlowRate * state.dataLoopNodes->Node(this->OANode).Enthalpy) / MixMassFlowRate; - Real64 MixHumRat = - (RecircMassFlowRate * RecircHumRat + OAMassFlowRate * state.dataLoopNodes->Node(this->OANode).HumRat) / MixMassFlowRate; - Real64 MixTemp = Psychrometrics::PsyTdbFnHW(MixEnth, MixHumRat); - return state.dataLoopNodes->Node(this->MixNode).TempSetPoint - MixTemp; - }; - - General::SolveRoot(state, Acc, MaxIte, SolFla, OASignal, f, OutAirMinFrac, 1.0); - if (SolFla < 0) { - OASignal = OutAirSignal; - } - } - - } else { - OASignal = OutAirSignal; - } - - // Economizer choice "Bypass" forces minimum OA except when high humidity air flow is active based on indoor RH - if (this->EconBypass && EconomizerAirFlowScheduleValue == 0.0) { - OASignal = OutAirMinFrac; - } - - // Set outdoor air signal based on OA flow ratio if high humidity air flow is enabled - if (HighHumidityOperationFlag) { - if (this->MixMassFlow > 0.0) { - // calculate the actual ratio of outside air to mixed air so the magnitude of OA during high humidity control is correct - OASignal = max(OutAirMinFrac, (this->HighRHOAFlowRatio * this->MaxOAMassFlowRate / this->MixMassFlow)); - this->OALimitingFactor = OALimitFactor::HighHum; - } - } - - if (this->CoolCoilFreezeCheck) { - MaximumOAFracBySetPoint = min(max(MaximumOAFracBySetPoint, 0.0), 1.0); - this->MaxOAFracBySetPoint = MaximumOAFracBySetPoint; - - // This should not be messing with OutAirMinFrac, freeze protection should only limit economizer operation - // if (MaximumOAFracBySetPoint < OutAirMinFrac) { - // OutAirMinFrac = MaximumOAFracBySetPoint; - // if (AirLoopNum > 0) AirLoopFlow(AirLoopNum).MinOutAir = OutAirMinFrac * this->MixMassFlow; - //} - if (MaximumOAFracBySetPoint < OASignal) { - OASignal = MaximumOAFracBySetPoint; - this->OALimitingFactor = OALimitFactor::Limits; - } - if (OutAirMinFrac > OASignal) { - OASignal = OutAirMinFrac; - this->OALimitingFactor = OALimitFactor::Limits; - } - } - - if (AirLoopNum > 0) { - - // Set the air loop economizer and high humidity control flags. - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).EconoActive = EconomizerOperationFlag; - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).HighHumCtrlActive = HighHumidityOperationFlag; - if (state.dataAirLoop->AirLoopControlInfo(AirLoopNum).EconomizerFlowLocked) { - this->OAMassFlow = state.dataAirLoop->AirLoopFlow(AirLoopNum).MinOutAir; - state.dataAirLoop->AirLoopFlow(AirLoopNum).OAFrac = this->OAMassFlow / this->MixMassFlow; - state.dataAirLoop->AirLoopFlow(AirLoopNum).OAFlow = this->OAMassFlow; - } - - // Check heat exchanger bypass control - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).HeatRecoveryBypass = false; - this->HeatRecoveryBypassStatus = 0; - if (EconomizerOperationFlag) { - if (this->HeatRecoveryBypassControlType == BypassWhenWithinEconomizerLimits) { - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).HeatRecoveryBypass = true; - this->HeatRecoveryBypassStatus = 1; - } else if (this->HeatRecoveryBypassControlType == BypassWhenOAFlowGreaterThanMinimum) { - Real64 OAMassFlowMin = OutAirMinFrac * state.dataAirLoop->AirLoopFlow(AirLoopNum).DesSupply; - Real64 OAMassFlowActual = OASignal * this->MixMassFlow; - Real64 reasonablySmallMassFlow = 1e-6; - if (OAMassFlowActual > (OAMassFlowMin + reasonablySmallMassFlow)) { - state.dataAirLoop->AirLoopControlInfo(AirLoopNum).HeatRecoveryBypass = true; - this->HeatRecoveryBypassStatus = 1; - } - } - } - } - - // Set economizer report variable and status flag - if (this->Econo == EconoOp::NoEconomizer) { - // No economizer - this->EconomizerStatus = 0; - this->EconoActive = false; - } else { - // With economizer. - if (EconomizerOperationFlag) { - // Economizer is enabled - this->EconomizerStatus = 1; - this->EconoActive = true; - if ((OASignal > OutAirMinFrac) && !HighHumidityOperationFlag) { - this->OALimitingFactor = OALimitFactor::Economizer; - } - } else { - // Economizer is disabled - this->EconomizerStatus = 0; - this->EconoActive = false; - } - } - - // Night ventilation control overrides economizer and high humidity control. - if (AirLoopNightVent) { - OASignal = 1.0; - this->OALimitingFactor = OALimitFactor::NightVent; - } - - // Set high humidity control report variable and status flag - if (HighHumidityOperationFlag) { - this->HighHumCtrlStatus = 1; - this->HighHumCtrlActive = true; - } else { - this->HighHumCtrlStatus = 0; - this->HighHumCtrlActive = false; - } -} -void CalcOAMixer(EnergyPlusData &state, int const OAMixerNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - - // PURPOSE OF THIS SUBROUTINE - // Calculate the mixed air flow and conditions - - // Define a recirculation mass flow rate - Real64 RecircMassFlowRate = state.dataMixedAir->OAMixer(OAMixerNum).RetMassFlowRate - state.dataMixedAir->OAMixer(OAMixerNum).RelMassFlowRate; - // In certain low flow conditions the return air mass flow rate can be below the outside air value established - // by the user. This check will ensure that this condition does not result in unphysical air properties. - if (RecircMassFlowRate < 0.0) { - RecircMassFlowRate = 0.0; - state.dataMixedAir->OAMixer(OAMixerNum).RelMassFlowRate = state.dataMixedAir->OAMixer(OAMixerNum).RetMassFlowRate; - } - - // Pass through the return air conditions to the relief air stream. The return air is "split" to - // the relief air and the recirculation air. - state.dataMixedAir->OAMixer(OAMixerNum).RelTemp = state.dataMixedAir->OAMixer(OAMixerNum).RetTemp; - state.dataMixedAir->OAMixer(OAMixerNum).RelHumRat = state.dataMixedAir->OAMixer(OAMixerNum).RetHumRat; - state.dataMixedAir->OAMixer(OAMixerNum).RelEnthalpy = state.dataMixedAir->OAMixer(OAMixerNum).RetEnthalpy; - state.dataMixedAir->OAMixer(OAMixerNum).RelPressure = state.dataMixedAir->OAMixer(OAMixerNum).RetPressure; - Real64 RecircPressure = state.dataMixedAir->OAMixer(OAMixerNum).RetPressure; - Real64 RecircEnthalpy = state.dataMixedAir->OAMixer(OAMixerNum).RetEnthalpy; - Real64 RecircHumRat = state.dataMixedAir->OAMixer(OAMixerNum).RetHumRat; - // The recirculation air and the outside air are mixed to form the mixed air stream - state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate = state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate + RecircMassFlowRate; - // Check for zero flow - if (state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate <= VerySmallMassFlow) { - state.dataMixedAir->OAMixer(OAMixerNum).MixEnthalpy = state.dataMixedAir->OAMixer(OAMixerNum).RetEnthalpy; - state.dataMixedAir->OAMixer(OAMixerNum).MixHumRat = state.dataMixedAir->OAMixer(OAMixerNum).RetHumRat; - state.dataMixedAir->OAMixer(OAMixerNum).MixPressure = state.dataMixedAir->OAMixer(OAMixerNum).RetPressure; - state.dataMixedAir->OAMixer(OAMixerNum).MixTemp = state.dataMixedAir->OAMixer(OAMixerNum).RetTemp; - return; - } - - state.dataMixedAir->OAMixer(OAMixerNum).MixEnthalpy = - (RecircMassFlowRate * RecircEnthalpy + - state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate * state.dataMixedAir->OAMixer(OAMixerNum).OAEnthalpy) / - state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; - state.dataMixedAir->OAMixer(OAMixerNum).MixHumRat = (RecircMassFlowRate * RecircHumRat + state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate * - state.dataMixedAir->OAMixer(OAMixerNum).OAHumRat) / - state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; - state.dataMixedAir->OAMixer(OAMixerNum).MixPressure = - (RecircMassFlowRate * RecircPressure + - state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate * state.dataMixedAir->OAMixer(OAMixerNum).OAPressure) / - state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; - // Mixed air temperature is calculated from the mixed air enthalpy and humidity ratio. - state.dataMixedAir->OAMixer(OAMixerNum).MixTemp = - Psychrometrics::PsyTdbFnHW(state.dataMixedAir->OAMixer(OAMixerNum).MixEnthalpy, state.dataMixedAir->OAMixer(OAMixerNum).MixHumRat); -} - -// End of Calculation/Simulation Section of the Module -//****************************************************************************** - -// Beginning Sizing Section of the Module -//****************************************************************************** - -void OAControllerProps::SizeOAController(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN September 2001 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine is for sizing OAController Components for which flow rates have not been - // specified in the input. - - // METHODOLOGY EMPLOYED: - // Obtains flow rates from the zone or system sizing arrays. - - // SUBROUTINE PARAMETER DEFINITIONS: - static std::string_view const &CurrentModuleObject(CurrentModuleObjects[static_cast(CMO::OAController)]); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - std::string CoilName; - std::string CoilType; - - bool ErrorsFound = false; - if (this->MaxOA == AutoSize) { - - if (state.dataSize->CurSysNum > 0) { - - switch (this->ControllerType) { - case MixedAirControllerType::ControllerOutsideAir: { - CheckSysSizing(state, CurrentModuleObject, this->Name); - switch (state.dataSize->CurDuctType) { - case DataHVACGlobals::AirDuctType::Cooling: { - this->MaxOA = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesCoolVolFlow; - } break; - case DataHVACGlobals::AirDuctType::Heating: { - this->MaxOA = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesHeatVolFlow; - } break; - case DataHVACGlobals::AirDuctType::Main: - case DataHVACGlobals::AirDuctType::Other: - default: { - this->MaxOA = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesMainVolFlow; - } break; - } - } break; - case MixedAirControllerType::ControllerStandAloneERV: { - } break; - default: - break; - } - - } else if (state.dataSize->CurZoneEqNum > 0) { - - switch (this->ControllerType) { - case MixedAirControllerType::ControllerOutsideAir: { - CheckZoneSizing(state, CurrentModuleObject, this->Name); - this->MaxOA = max(state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum).DesCoolVolFlow, - state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum).DesHeatVolFlow); - } break; - case MixedAirControllerType::ControllerStandAloneERV: { - } break; - default: - break; - } - } - - if (this->MaxOA < SmallAirVolFlow) { - this->MaxOA = 0.0; - } - - BaseSizer::reportSizerOutput(state, CurrentModuleObject, this->Name, "Maximum Outdoor Air Flow Rate [m3/s]", this->MaxOA); - } - - if (this->MinOA == AutoSize) { - - if (state.dataSize->CurSysNum > 0) { - - CheckSysSizing(state, CurrentModuleObject, this->Name); - if (state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesOutAirVolFlow >= SmallAirVolFlow) { - this->MinOA = min(state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesOutAirVolFlow, this->MaxOA); - } else { - this->MinOA = 0.0; - } - } - - BaseSizer::reportSizerOutput(state, CurrentModuleObject, this->Name, "Minimum Outdoor Air Flow Rate [m3/s]", this->MinOA); - - if (this->HumidistatZoneNum > 0 && this->FixedMin) { - if (this->MaxOA > 0.0) { - Real64 OAFlowRatio = this->MinOA / this->MaxOA; - if (this->HighRHOAFlowRatio < OAFlowRatio) { - ShowWarningError(state, format("{} \"{}\"", CurrentModuleObject, this->Name)); - ShowContinueError(state, "... A fixed minimum outdoor air flow rate and high humidity control have been specified."); - ShowContinueError(state, - "... The High Humidity Outdoor Air Flow Ratio is less than the ratio of the outdoor air controllers " - "minimum to maximum outside air flow rate."); - ShowContinueError(state, format("... Controller minimum flow rate = {:.4T} m3/s.", this->MinOA)); - ShowContinueError(state, format("... Controller maximum flow rate = {:.4T} m3/s.", this->MaxOA)); - ShowContinueError(state, format("... Controller minimum to maximum flow ratio = {:.4T}.", OAFlowRatio)); - ShowContinueError(state, format("... High humidity control flow ratio = {:.4T}.", this->HighRHOAFlowRatio)); - } - } - } - } - // If there is an outside air system, loop over components in the OA system; pass the design air flow rate - // to the coil components that don't have design air flow as an input. - if (state.dataSize->CurOASysNum > 0) { - for (int CompNum = 1; CompNum <= state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).NumComponents; ++CompNum) { - std::string const &CompType = state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).ComponentType(CompNum); - std::string const &CompName = state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).ComponentName(CompNum); - if (UtilityRoutines::SameString(CompType, "COIL:COOLING:WATER:DETAILEDGEOMETRY") || - UtilityRoutines::SameString(CompType, "COIL:HEATING:WATER") || - UtilityRoutines::SameString(CompType, "COILSYSTEM:COOLING:WATER:HEATEXCHANGERASSISTED")) { - if (UtilityRoutines::SameString(CompType, "COILSYSTEM:COOLING:WATER:HEATEXCHANGERASSISTED")) { - CoilName = HVACHXAssistedCoolingCoil::GetHXDXCoilName(state, CompType, CompName, ErrorsFound); - CoilType = HVACHXAssistedCoolingCoil::GetHXCoilType(state, CompType, CompName, ErrorsFound); - } else { - CoilName = CompName; - CoilType = CompType; - } - WaterCoils::SetCoilDesFlow(state, CoilType, CoilName, this->MinOA, ErrorsFound); - } - } // End of component loop - } - if (ErrorsFound) { - ShowFatalError(state, "Preceding sizing errors cause program termination"); - } -} - -// End of Sizing Section of the Module -//****************************************************************************** - -// Beginning Update/Reporting Section of the Module -//****************************************************************************** - -void OAControllerProps::UpdateOAController(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - // MODIFIED Shirey/Raustad FSEC, June 2003 - - // PURPOSE OF THIS SUBROUTINE - // Move the results of CalcOAController to the affected nodes - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int OutAirNodeNum = this->OANode; - int InletAirNodeNum = this->InletNode; - int RelAirNodeNum = this->RelNode; - int RetAirNodeNum = this->RetNode; - - if (this->ControllerType == MixedAirControllerType::ControllerOutsideAir) { - // The outside air controller sets the outside air flow rate and the relief air flow rate - if (!state.dataGlobal->WarmupFlag && !state.dataGlobal->DoingSizing && (this->ManageDemand) && - (this->OAMassFlow > this->DemandLimitFlowRate)) { - state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRate = this->DemandLimitFlowRate; - state.dataLoopNodes->Node(InletAirNodeNum).MassFlowRate = this->DemandLimitFlowRate; - state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRateMaxAvail = this->DemandLimitFlowRate; - } else { - state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRate = this->OAMassFlow; - state.dataLoopNodes->Node(InletAirNodeNum).MassFlowRate = this->OAMassFlow; - state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRateMaxAvail = this->OAMassFlow; - } - state.dataLoopNodes->Node(RelAirNodeNum).MassFlowRate = this->RelMassFlow; - } else { - // The ERV controller sets the supply and secondary inlet node information for the Stand Alone ERV - // Currently, the Stand Alone ERV only has constant air flows (supply and exhaust), and these are - // already set in HVACStandAloneERV.cc (subroutine init). Therefore, these flow assignments below are - // currently redundant but may be useful in the future as mass flow rates can vary based on the controller signal. - if (!state.dataGlobal->WarmupFlag && !state.dataGlobal->DoingSizing && (this->ManageDemand) && - (this->OAMassFlow > this->DemandLimitFlowRate)) { - state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRate = this->DemandLimitFlowRate; - state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRateMaxAvail = this->DemandLimitFlowRate; - } else { - state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRate = this->OAMassFlow; - state.dataLoopNodes->Node(OutAirNodeNum).MassFlowRateMaxAvail = this->OAMassFlow; - } - state.dataLoopNodes->Node(RetAirNodeNum).MassFlowRate = state.dataLoopNodes->Node(this->RetNode).MassFlowRate; - state.dataLoopNodes->Node(RetAirNodeNum).MassFlowRateMaxAvail = state.dataLoopNodes->Node(this->RetNode).MassFlowRate; - } -} - -void UpdateOAMixer(EnergyPlusData &state, int const OAMixerNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN Oct 1998 - - // PURPOSE OF THIS SUBROUTINE - // Move the results of CalcOAMixer to the affected nodes - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int MixNode = state.dataMixedAir->OAMixer(OAMixerNum).MixNode; - int RelNode = state.dataMixedAir->OAMixer(OAMixerNum).RelNode; - int RetNode = state.dataMixedAir->OAMixer(OAMixerNum).RetNode; - // Move mixed air data to the mixed air node - state.dataLoopNodes->Node(MixNode).MassFlowRate = state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; - state.dataLoopNodes->Node(MixNode).Temp = state.dataMixedAir->OAMixer(OAMixerNum).MixTemp; - state.dataLoopNodes->Node(MixNode).HumRat = state.dataMixedAir->OAMixer(OAMixerNum).MixHumRat; - state.dataLoopNodes->Node(MixNode).Enthalpy = state.dataMixedAir->OAMixer(OAMixerNum).MixEnthalpy; - state.dataLoopNodes->Node(MixNode).Press = state.dataMixedAir->OAMixer(OAMixerNum).MixPressure; - state.dataLoopNodes->Node(MixNode).MassFlowRateMaxAvail = state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; - // Move the relief air data to the relief air node - state.dataLoopNodes->Node(RelNode).MassFlowRate = state.dataMixedAir->OAMixer(OAMixerNum).RelMassFlowRate; - state.dataLoopNodes->Node(RelNode).Temp = state.dataMixedAir->OAMixer(OAMixerNum).RelTemp; - state.dataLoopNodes->Node(RelNode).HumRat = state.dataMixedAir->OAMixer(OAMixerNum).RelHumRat; - state.dataLoopNodes->Node(RelNode).Enthalpy = state.dataMixedAir->OAMixer(OAMixerNum).RelEnthalpy; - state.dataLoopNodes->Node(RelNode).Press = state.dataMixedAir->OAMixer(OAMixerNum).RelPressure; - state.dataLoopNodes->Node(RelNode).MassFlowRateMaxAvail = state.dataMixedAir->OAMixer(OAMixerNum).RelMassFlowRate; - - if (state.dataContaminantBalance->Contaminant.CO2Simulation) { - state.dataLoopNodes->Node(RelNode).CO2 = state.dataLoopNodes->Node(RetNode).CO2; - if (state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate <= VerySmallMassFlow) { - state.dataLoopNodes->Node(MixNode).CO2 = state.dataLoopNodes->Node(RetNode).CO2; - } else { - state.dataLoopNodes->Node(MixNode).CO2 = - ((state.dataLoopNodes->Node(RetNode).MassFlowRate - state.dataLoopNodes->Node(RelNode).MassFlowRate) * - state.dataLoopNodes->Node(RetNode).CO2 + - state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate * state.dataContaminantBalance->OutdoorCO2) / - state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; - } - } - - if (state.dataContaminantBalance->Contaminant.GenericContamSimulation) { - state.dataLoopNodes->Node(RelNode).GenContam = state.dataLoopNodes->Node(RetNode).GenContam; - if (state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate <= VerySmallMassFlow) { - state.dataLoopNodes->Node(MixNode).GenContam = state.dataLoopNodes->Node(RetNode).GenContam; - } else { - state.dataLoopNodes->Node(MixNode).GenContam = - ((state.dataLoopNodes->Node(RetNode).MassFlowRate - state.dataLoopNodes->Node(RelNode).MassFlowRate) * - state.dataLoopNodes->Node(RetNode).GenContam + - state.dataMixedAir->OAMixer(OAMixerNum).OAMassFlowRate * state.dataContaminantBalance->OutdoorGC) / - state.dataMixedAir->OAMixer(OAMixerNum).MixMassFlowRate; - } - } -} - -// End of Sizing Section of the Module -//****************************************************************************** - -// Beginning Utility Section of the Module -//****************************************************************************** - -Array1D_int GetOAMixerNodeNumbers(EnergyPlusData &state, - std::string const &OAMixerName, // must match OA mixer names for the OA mixer type - bool &ErrorsFound // set to true if problem -) -{ - - // FUNCTION INFORMATION: - // AUTHOR Richard Raustad - // DATE WRITTEN June 2006 - - // PURPOSE OF THIS FUNCTION: - // This function looks up the given OA mixer and returns the node numbers. If - // incorrect OA mixer name is given, ErrorsFound is returned as true - // as zero. - - // Return value - Array1D_int OANodeNumbers(4); // return OA mixer nodes - - // Obtains and Allocates OA mixer related parameters from input file - if (state.dataMixedAir->GetOAMixerInputFlag) { // First time subroutine has been entered - GetOAMixerInputs(state); - state.dataMixedAir->GetOAMixerInputFlag = false; - } - - int WhichOAMixer = UtilityRoutines::FindItemInList(OAMixerName, state.dataMixedAir->OAMixer); - if (WhichOAMixer != 0) { - OANodeNumbers(1) = state.dataMixedAir->OAMixer(WhichOAMixer).InletNode; - OANodeNumbers(2) = state.dataMixedAir->OAMixer(WhichOAMixer).RelNode; - OANodeNumbers(3) = state.dataMixedAir->OAMixer(WhichOAMixer).RetNode; - OANodeNumbers(4) = state.dataMixedAir->OAMixer(WhichOAMixer).MixNode; - } - - if (WhichOAMixer == 0) { - ShowSevereError(state, format("GetOAMixerNodeNumbers: Could not find OA Mixer = \"{}\"", OAMixerName)); - ErrorsFound = true; - OANodeNumbers = 0; - } - - return OANodeNumbers; -} - -int GetNumOAMixers(EnergyPlusData &state) -{ - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN October 2006 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the number of OA mixers is returned. - - if (state.dataMixedAir->GetOAMixerInputFlag) { // First time subroutine has been entered - GetOAMixerInputs(state); - state.dataMixedAir->GetOAMixerInputFlag = false; - } - - return state.dataMixedAir->NumOAMixers; -} - -int GetNumOAControllers(EnergyPlusData &state) -{ - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN October 2006 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the number of OA Controllers is returned. - - if (state.dataMixedAir->AllocateOAControllersFlag) { - // Make sure OAControllers are allocated - AllocateOAControllers(state); - } - - return state.dataMixedAir->NumOAControllers; -} - -int GetOAMixerReliefNodeNumber(EnergyPlusData &state, int const OAMixerNum) // Which Mixer -{ - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN October 2006 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the relief node number of indicated mixer is returned. - - if (state.dataMixedAir->GetOAMixerInputFlag) { // First time subroutine has been entered - GetOAMixerInputs(state); - state.dataMixedAir->GetOAMixerInputFlag = false; - } - - if (OAMixerNum > state.dataMixedAir->NumOAMixers) { - ShowFatalError(state, - format("GetOAMixerReliefNodeNumber: Requested Mixer #={}, which is > number of OA Mixers={}", - OAMixerNum, - state.dataMixedAir->NumOAMixers)); - } - - return state.dataMixedAir->OAMixer(OAMixerNum).RelNode; -} - -int GetOASysControllerListIndex(EnergyPlusData &state, int const OASysNumber) // OA Sys Number -{ - - // FUNCTION INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN April 2007 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the Controller List index of the indicated OA System is returned. - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - return state.dataAirLoop->OutsideAirSys(OASysNumber).ControllerListNum; -} - -int GetOASysNumSimpControllers(EnergyPlusData &state, int const OASysNumber) // OA Sys Number -{ - - // FUNCTION INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN April 2007 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the number of Controller:Simple objects in the OA System is returned. - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - return state.dataAirLoop->OutsideAirSys(OASysNumber).NumSimpleControllers; -} - -int GetOASysNumHeatingCoils(EnergyPlusData &state, int const OASysNumber) // OA Sys Number -{ - - // FUNCTION INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN May 2007 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the number of heating coils in the OA System is returned. - - // FUNCTION LOCAL VARIABLE DECLARATIONS: - bool Sim(false); - bool FirstHVACIteration(false); - bool OAHeatingCoil(false); - bool OACoolingCoil(false); - int AirLoopNum(0); - bool OAHX(false); - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - int NumHeatingCoils = 0; - for (int CompNum = 1; CompNum <= state.dataAirLoop->OutsideAirSys(OASysNumber).NumComponents; ++CompNum) { - std::string const &CompType = state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentType(CompNum); - std::string const &CompName = state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentName(CompNum); - SimOAComponent(state, - CompType, - CompName, - state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentTypeEnum(CompNum), - FirstHVACIteration, - state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentIndex(CompNum), - AirLoopNum, - Sim, - OASysNumber, - OAHeatingCoil, - OACoolingCoil, - OAHX); - if (OAHeatingCoil) { - ++NumHeatingCoils; - } - } - - return NumHeatingCoils; -} - -int GetOASysNumHXs(EnergyPlusData &state, int const OASysNumber) -{ - - // FUNCTION INFORMATION: - // AUTHOR Fred Buhl, Rongpeng Zhang - // DATE WRITTEN Oct. 2015 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the number of heat recovery exchangers in the OA System is returned. - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - int NumHX = 0; - - auto const &componentType_Num = state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentTypeEnum; - for (int CompNum = 1; CompNum <= state.dataAirLoop->OutsideAirSys(OASysNumber).NumComponents; ++CompNum) { - SimAirServingZones::CompType const componentTypeNum = componentType_Num(CompNum); - if (SimAirServingZones::CompType::HeatXchngr == componentTypeNum || SimAirServingZones::CompType::Desiccant == componentTypeNum) { - ++NumHX; - } - } - - return NumHX; -} - -int GetOASysNumCoolingCoils(EnergyPlusData &state, int const OASysNumber) // OA Sys Number -{ - - // FUNCTION INFORMATION: - // AUTHOR Fred Buhl - // DATE WRITTEN May 2007 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the number of cooling coils in the OA System is returned. - - // FUNCTION LOCAL VARIABLE DECLARATIONS: - bool Sim(false); - bool FirstHVACIteration(false); - bool OAHeatingCoil(false); - bool OACoolingCoil(false); - int AirLoopNum(0); - bool OAHX(false); - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - int NumCoolingCoils = 0; - for (int CompNum = 1; CompNum <= state.dataAirLoop->OutsideAirSys(OASysNumber).NumComponents; ++CompNum) { - std::string const &CompType = state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentType(CompNum); - std::string const &CompName = state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentName(CompNum); - SimOAComponent(state, - CompType, - CompName, - state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentTypeEnum(CompNum), - FirstHVACIteration, - state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentIndex(CompNum), - AirLoopNum, - Sim, - OASysNumber, - OAHeatingCoil, - OACoolingCoil, - OAHX); - if (OACoolingCoil) { - ++NumCoolingCoils; - } - } - - return NumCoolingCoils; -} - -int GetOASystemNumber(EnergyPlusData &state, std::string const &OASysName) // OA Sys Name -{ - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN October 2006 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the OA System number of indicated OA System is returned. - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - return UtilityRoutines::FindItemInList(OASysName, state.dataAirLoop->OutsideAirSys); -} - -int FindOAMixerMatchForOASystem(EnergyPlusData &state, int const OASysNumber) // Which OA System -{ - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN October 2006 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the matched mixer number is found. - // Note -- only the first is looked at for an Outside Air System. - - if (state.dataMixedAir->GetOAMixerInputFlag) { - GetOAMixerInputs(state); - state.dataMixedAir->GetOAMixerInputFlag = false; - } - - int OAMixerNumber = 0; - if (OASysNumber > 0 && OASysNumber <= state.dataAirLoop->NumOASystems) { - for (int OACompNum = 1; OACompNum <= state.dataAirLoop->OutsideAirSys(OASysNumber).NumComponents; ++OACompNum) { - if (UtilityRoutines::SameString(state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentType(OACompNum), "OUTDOORAIR:MIXER")) { - OAMixerNumber = UtilityRoutines::FindItemInList(state.dataAirLoop->OutsideAirSys(OASysNumber).ComponentName(OACompNum), - state.dataMixedAir->OAMixer); - break; - } - } - } - - return OAMixerNumber; -} - -int GetOAMixerIndex(EnergyPlusData &state, std::string const &OAMixerName) // Which Mixer -{ - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN December 2010 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the mixer index of indicated mixer is returned. - - if (state.dataMixedAir->GetOAMixerInputFlag) { - GetOAMixerInputs(state); - state.dataMixedAir->GetOAMixerInputFlag = false; - } - - int OAMixerIndex = UtilityRoutines::FindItem(OAMixerName, state.dataMixedAir->OAMixer); - - if (OAMixerIndex == 0) { - ShowSevereError(state, format("GetOAMixerIndex: Could not find OutdoorAir:Mixer, Name=\"{}\"", OAMixerName)); - } - - return OAMixerIndex; -} - -int GetOAMixerInletNodeNumber(EnergyPlusData &state, int const OAMixerNumber) // Which Mixer -{ - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN October 2006 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the mixer inlet node number of indicated mixer is returned. - - if (state.dataMixedAir->GetOAMixerInputFlag) { - GetOAMixerInputs(state); - state.dataMixedAir->GetOAMixerInputFlag = false; - } - - int OAMixerInletNodeNumber = 0; - if (OAMixerNumber > 0 && OAMixerNumber <= state.dataMixedAir->NumOAMixers) { - OAMixerInletNodeNumber = state.dataMixedAir->OAMixer(OAMixerNumber).InletNode; - } - - return OAMixerInletNodeNumber; -} - -int GetOAMixerReturnNodeNumber(EnergyPlusData &state, int const OAMixerNumber) // Which Mixer -{ - - // FUNCTION INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN December 2006 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the mixer return node number of indicated mixer is returned. - - // METHODOLOGY EMPLOYED: - // followed Linda Lawrie's GetOAMixerInletNodeNumber - - if (state.dataMixedAir->GetOAMixerInputFlag) { - GetOAMixerInputs(state); - state.dataMixedAir->GetOAMixerInputFlag = false; - } - - int OAMixerReturnNodeNumber = 0; - if (OAMixerNumber > 0 && OAMixerNumber <= state.dataMixedAir->NumOAMixers) { - OAMixerReturnNodeNumber = state.dataMixedAir->OAMixer(OAMixerNumber).RetNode; - } - - return OAMixerReturnNodeNumber; -} - -int GetOAMixerMixedNodeNumber(EnergyPlusData &state, int const OAMixerNumber) // Which Mixer -{ - - // FUNCTION INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN December 2006 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the mixer mixed air node number of indicated mixer is returned. - - if (state.dataMixedAir->GetOAMixerInputFlag) { - GetOAMixerInputs(state); - state.dataMixedAir->GetOAMixerInputFlag = false; - } - - int OAMixerMixedNodeNumber = 0; - if (OAMixerNumber > 0 && OAMixerNumber <= state.dataMixedAir->NumOAMixers) { - OAMixerMixedNodeNumber = state.dataMixedAir->OAMixer(OAMixerNumber).MixNode; - } - - return OAMixerMixedNodeNumber; -} - -bool CheckForControllerWaterCoil(EnergyPlusData &state, - DataAirLoop::ControllerKind ControllerType, // should be passed in as UPPERCASE - std::string const &ControllerName // should be passed in as UPPERCASE -) -{ - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN May 2009 - - // PURPOSE OF THIS FUNCTION: - // This routine checks the controller list for existance of the reference coil. - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - int OnControllerList = false; - - for (int Num = 1; Num <= state.dataMixedAir->NumControllerLists; ++Num) { - for (int CompNum = 1; CompNum <= state.dataMixedAir->ControllerLists(Num).NumControllers; ++CompNum) { - - if (state.dataMixedAir->ControllerLists(Num).ControllerType(CompNum) != ControllerType) continue; - if (!UtilityRoutines::SameString(state.dataMixedAir->ControllerLists(Num).ControllerName(CompNum), ControllerName)) continue; - OnControllerList = true; - break; - } - } - - return OnControllerList; -} - -void CheckControllerLists(EnergyPlusData &state, bool &ErrFound) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN May 2009 - - // PURPOSE OF THIS SUBROUTINE: - // This routine checks for a "dangling" controller list (AirLoopHVAC:ControllerList). - // It must be either found on a AirLoopHVAC or AirLoopHVAC:OutdoorAirSystem. - - // SUBROUTINE PARAMETER DEFINITIONS: - static std::string const CurrentModuleObject("AirLoopHVAC:ControllerList"); - static std::string const AirLoopObject("AirLoopHVAC"); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int NumAlphas; - int NumNumbers; - int IOStat; - int Count; - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - int NumControllers = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, CurrentModuleObject); - int NumAirLoop = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, AirLoopObject); - std::string_view AirLoopName = ""; - - for (int Item = 1; Item <= NumControllers; ++Item) { - - state.dataInputProcessing->inputProcessor->getObjectItem( - state, CurrentModuleObject, Item, state.dataIPShortCut->cAlphaArgs, NumAlphas, state.dataIPShortCut->rNumericArgs, NumNumbers, IOStat); - std::string const ControllerListName = state.dataIPShortCut->cAlphaArgs(1); - Count = 0; - - // Check AirLoopHVAC -- brute force, get each AirLoopHVAC - - for (int Loop = 1; Loop <= NumAirLoop; ++Loop) { - state.dataInputProcessing->inputProcessor->getObjectItem( - state, AirLoopObject, Loop, state.dataIPShortCut->cAlphaArgs, NumAlphas, state.dataIPShortCut->rNumericArgs, NumNumbers, IOStat); - if (state.dataIPShortCut->cAlphaArgs(2) != ControllerListName) continue; - if (++Count == 1) AirLoopName = state.dataIPShortCut->cAlphaArgs(1); - } - - // Now check AirLoopHVAC and AirLoopHVAC:OutdoorAirSystem - int Found = 0; - if (state.dataAirLoop->NumOASystems > 0) { - Found = UtilityRoutines::FindItemInList(ControllerListName, state.dataAirLoop->OutsideAirSys, &OutsideAirSysProps::ControllerListName); - if (Found > 0) ++Count; - } - - if (Count == 0) { - ShowSevereError(state, - format("{}=\"{}\" is not referenced on a AirLoopHVAC or AirLoopHVAC:OutdoorAirSystem object.", - CurrentModuleObject, - ControllerListName)); - ErrFound = true; - } else if (Count > 1) { - ShowSevereError(state, - format("{}=\"{}\" has too many references on AirLoopHVAC or AirLoopHVAC:OutdoorAirSystem objects.", - CurrentModuleObject, - ControllerListName)); - if (Found > 0) { - ShowContinueError(state, format("...AirLoopHVAC:OutdoorAirSystem=\"{}\".", state.dataAirLoop->OutsideAirSys(Found).Name)); - } - ShowContinueError(state, format("...also on AirLoopHVAC=\"{}\".", AirLoopName)); - ErrFound = true; - } - } -} - -void CheckOAControllerName( - EnergyPlusData &state, std::string &OAControllerName, std::string const &ObjectType, std::string const &FieldName, bool &ErrorsFound) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN October 2006 - - // PURPOSE OF THIS SUBROUTINE: - // When OA Controller data is gotten from other routines, must check to make sure - // new name doesn't duplicate. (Essentially a pass through to call Verify Name) - // Currently, this is only called from HVACStandAlongERV::GetStandaloneERV() - - if (state.dataMixedAir->AllocateOAControllersFlag) { - // Make sure OAControllers are allocated - AllocateOAControllers(state); - } - - GlobalNames::VerifyUniqueInterObjectName( - state, state.dataMixedAir->OAControllerUniqueNames, OAControllerName, ObjectType, FieldName, ErrorsFound); -} - -void OAControllerProps::Checksetpoints(EnergyPlusData &state, - Real64 const OutAirMinFrac, // Local variable used to calculate min OA fraction - Real64 &OutAirSignal, // Used to set OA mass flow rate - bool &EconomizerOperationFlag // logical used to show economizer status -) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Amit bhansali - // DATE WRITTEN August 2008? - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine checks the setpoints of the upper limits of temperatures, limit enthalpy - // Limit dew point, Enthalpy curve - - if (this->TempLim != BlankNumeric && this->OATemp > this->TempLim) { - OutAirSignal = OutAirMinFrac; - EconomizerOperationFlag = false; - } - // Outside air enthalpy limit - if (this->EnthLim != BlankNumeric && this->OAEnth > this->EnthLim) { - OutAirSignal = OutAirMinFrac; - EconomizerOperationFlag = false; - } - - if (this->DPTempLim != BlankNumeric) { - Real64 OADPTemp = Psychrometrics::PsyTdpFnWPb(state, this->OAHumRat, this->OAPress); - if (OADPTemp > this->DPTempLim) { - OutAirSignal = OutAirMinFrac; - EconomizerOperationFlag = false; - } - } - - if (this->EnthalpyCurvePtr > 0) { - if (this->OAHumRat > Curve::CurveValue(state, this->EnthalpyCurvePtr, this->OATemp)) { - OutAirSignal = OutAirMinFrac; - EconomizerOperationFlag = false; - } - } -} - -int GetNumOASystems(EnergyPlusData &state) -{ - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN November 2010 - - // PURPOSE OF THIS FUNCTION: - // Get Number of OA Systems, After making sure get input is done - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - return state.dataAirLoop->NumOASystems; -} - -int GetOACompListNumber(EnergyPlusData &state, int const OASysNum) // OA Sys Number -{ - - // FUNCTION INFORMATION: - // AUTHOR Heejin Cho - // DATE WRITTEN November 2010 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the OA System number of indicated OA System is returned. - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - return state.dataAirLoop->OutsideAirSys(OASysNum).NumComponents; -} - -std::string GetOACompName(EnergyPlusData &state, - int const OASysNum, // OA Sys Number - int const InListNum // In-list Number -) -{ - - // FUNCTION INFORMATION: - // AUTHOR Heejin Cho - // DATE WRITTEN November 2010 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the number of heating coils in the OA System is returned. - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - return state.dataAirLoop->OutsideAirSys(OASysNum).ComponentName(InListNum); -} - -std::string GetOACompType(EnergyPlusData &state, - int const OASysNum, // OA Sys Number - int const InListNum // In-list Number -) -{ - - // FUNCTION INFORMATION: - // AUTHOR Heejin Cho - // DATE WRITTEN November 2010 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the number of heating coils in the OA System is returned. - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - return state.dataAirLoop->OutsideAirSys(OASysNum).ComponentType(InListNum); -} - -SimAirServingZones::CompType GetOACompTypeNum(EnergyPlusData &state, - int const OASysNum, // OA Sys Number - int const InListNum // In-list Number -) -{ - - // FUNCTION INFORMATION: - // AUTHOR Heejin Cho - // DATE WRITTEN November 2010 - - // PURPOSE OF THIS FUNCTION: - // After making sure get input is done, the number of heating coils in the OA System is returned. - - if (state.dataMixedAir->GetOASysInputFlag) { - GetOutsideAirSysInputs(state); - state.dataMixedAir->GetOASysInputFlag = false; - } - - return state.dataAirLoop->OutsideAirSys(OASysNum).ComponentTypeEnum(InListNum); -} - -int GetOAMixerNumber(EnergyPlusData &state, std::string const &OAMixerName // must match OA mixer names for the OA mixer type -) -{ - - // FUNCTION INFORMATION: - // AUTHOR Lixing Gu - // DATE WRITTEN Feb. 2018 - - // PURPOSE OF THIS FUNCTION: - // This function looks up the given OA mixer and returns the OAMixer number. If - // incorrect OA mixer name is given, ErrorsFound is returned as true - - // Obtains and Allocates OA mixer related parameters from input file - if (state.dataMixedAir->GetOAMixerInputFlag) { // First time subroutine has been entered - GetOAMixerInputs(state); - state.dataMixedAir->GetOAMixerInputFlag = false; - } - - return UtilityRoutines::FindItemInList(OAMixerName, state.dataMixedAir->OAMixer); -} -// End of Utility Section of the Module -//****************************************************************************** - -} // namespace EnergyPlus::MixedAir diff --git a/src/EnergyPlus/MixedAir.hh.bak b/src/EnergyPlus/MixedAir.hh.bak deleted file mode 100644 index 9596783a5d7..00000000000 --- a/src/EnergyPlus/MixedAir.hh.bak +++ /dev/null @@ -1,600 +0,0 @@ -// EnergyPlus, Copyright (c) 1996-2023, The Board of Trustees of the University of Illinois, -// The Regents of the University of California, through Lawrence Berkeley National Laboratory -// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge -// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other -// contributors. All rights reserved. -// -// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the -// U.S. Government consequently retains certain rights. As such, the U.S. Government has been -// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, -// worldwide license in the Software to reproduce, distribute copies to the public, prepare -// derivative works, and perform publicly and display publicly, and to permit others to do so. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted -// provided that the following conditions are met: -// -// (1) Redistributions of source code must retain the above copyright notice, this list of -// conditions and the following disclaimer. -// -// (2) Redistributions in binary form must reproduce the above copyright notice, this list of -// conditions and the following disclaimer in the documentation and/or other materials -// provided with the distribution. -// -// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, -// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be -// used to endorse or promote products derived from this software without specific prior -// written permission. -// -// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form -// without changes from the version obtained under this License, or (ii) Licensee makes a -// reference solely to the software portion of its product, Licensee must refer to the -// software as "EnergyPlus version X" software, where "X" is the version number Licensee -// obtained under this License and may not use a different name for the software. Except as -// specifically required in this Section (4), Licensee shall not use in a company name, a -// product name, in advertising, publicity, or other promotional activities any name, trade -// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly -// similar designation, without the U.S. Department of Energy's prior written consent. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -#ifndef MixedAir_hh_INCLUDED -#define MixedAir_hh_INCLUDED - -// C++ Headers -#include - -// ObjexxFCL Headers -#include - -// EnergyPlus Headers -#include -#include -#include -#include -#include -#include -#include -#include - -namespace EnergyPlus { - -// Forward declarations -struct EnergyPlusData; - -namespace MixedAir { - - // Data - // MODULE PARAMETER DEFINITIONS - - enum class LockoutType - { - Invalid = -1, - NoLockoutPossible, - LockoutWithHeatingPossible, - LockoutWithCompressorPossible, - Num - }; - - enum class EconoOp - { - Invalid = -1, - NoEconomizer, - FixedDryBulb, - FixedEnthalpy, - DifferentialDryBulb, - DifferentialEnthalpy, - FixedDewPointAndDryBulb, - ElectronicEnthalpy, - DifferentialDryBulbAndEnthalpy, - Num - }; - - enum class MixedAirControllerType - { - Invalid = -1, - ControllerOutsideAir, - ControllerStandAloneERV, - Num, - }; - - // Parameters below (CMO - Current Module Object. used primarily in Get Inputs) - // Multiple Get Input routines in this module or these would be in individual routines. - enum class CMO - { - Invalid = -1, - None, - OASystem, - AirLoopEqList, - ControllerList, - SysAvailMgrList, - OAController, - ERVController, - MechVentilation, - OAMixer, - Num, - }; - - // OA Controller Limiting Factor - // Must keep these values to use for integer output variable OAControllerProps::OALimitingFactorReport - enum class OALimitFactor - { - Invalid = -1, - None = 0, // No limit other than fixed OA amount - Limits = 1, // Limits and scheduled limits - Economizer = 2, // Economizer operation - Exhaust = 3, // Exhaust flow - MixedAir = 4, // Mixed air flow rate - HighHum = 5, // High humidity economizer control - DCV = 6, // Demand-controlled ventilation - NightVent = 7, // Night ventilation - DemandLimit = 8, // Demand-limiting - EMS = 9, // EMS override - Num - }; - - extern const std::array(CMO::Num)> CurrentModuleObjects; - - struct ControllerListProps - { - // Members - std::string Name; - int NumControllers = 0; // number of controllers on list - EPVector ControllerType; - Array1D_string ControllerName; - }; - - struct OAControllerProps // Derived type for Outside Air Controller data - { - // Members - std::string Name; - MixedAirControllerType ControllerType = MixedAirControllerType::Invalid; // Mixed air controller type - LockoutType Lockout = LockoutType::NoLockoutPossible; // 0=NoLockoutPossible; 1=LockoutWithHeatingPossible; - // 2=LockoutWithCompressorPossible; - bool FixedMin = true; // Fixed Minimum or Proportional Minimum - Real64 TempLim = 0.0; // Temperature Limit - Real64 TempLowLim = 0.0; // Temperature Lower Limit - Real64 EnthLim = 0.0; // Enthalpy Limit - Real64 DPTempLim = 0.0; // Dew Point Temperature Limit - int EnthalpyCurvePtr = 0; // Electronic Enthalpy Curve Index (max HumRat = f[OAT]) - Real64 MinOA = 0.0; // Minimum outside air flow (m3/sec) - Real64 MaxOA = 0.0; // Maximum outside air flow (m3/sec) - EconoOp Econo = EconoOp::NoEconomizer; // 0 = NoEconomizer, 1 = FixedDryBulb, 2 = FixedEnthalpy, 3=DifferentialDryBulb, - // 4=DifferentialEnthalpy, 5=FixedDewPointAndDryBulb, 6 = ElectronicEnthalpy, - // 7 =DifferentialDryBulbAndEnthalpy - bool EconBypass = false; // ModulateFlow =FALSE , MinimumFlowWithBypass =TRUE - int MixNode = 0; // Controlled node (mixed air node) - int OANode = 0; // Actuated node (outside air node) - int InletNode = 0; // Inlet Air Node for into Mixer (BTG Nov 2004) - int RelNode = 0; // Relief Air Node Number - int RetNode = 0; // Return Air Node Number - std::string MinOASch; // Name of the minimum outside air schedule - int MinOASchPtr = 0; // Index to the minimum outside air schedule - Real64 RelMassFlow = 0.0; - Real64 OAMassFlow = 0.0; - Real64 ExhMassFlow = 0.0; - Real64 MixMassFlow = 0.0; - Real64 InletTemp = 0.0; - Real64 InletEnth = 0.0; - Real64 InletPress = 0.0; - Real64 InletHumRat = 0.0; - Real64 OATemp = 0.0; - Real64 OAEnth = 0.0; - Real64 OAPress = 0.0; - Real64 OAHumRat = 0.0; - Real64 RetTemp = 0.0; - Real64 RetEnth = 0.0; - Real64 MixSetTemp = 0.0; - Real64 MinOAMassFlowRate = 0.0; // Minimum outside air flow (kg/s) - Real64 MaxOAMassFlowRate = 0.0; // Maximum outside air flow (kg/s) - Real64 RelTemp = 0.0; - Real64 RelEnth = 0.0; - Real64 RelSensiLossRate = 0.0; // Heat lost to ambient from relief air (W) - Real64 RelLatentLossRate = 0.0; - Real64 RelTotalLossRate = 0.0; - - int ZoneEquipZoneNum = 0; - std::string VentilationMechanicalName; // Name of ventilation:mechanical object used for DCV - int VentMechObjectNum = 0; // Index to VENTILATION:MECHANICAL object for this controller - int HumidistatZoneNum = 0; // zone number where humidistat is located - int NodeNumofHumidistatZone = 0; // node number of zone where humidistat is located - Real64 HighRHOAFlowRatio = 1.0; // Modify ratio with respect to maximum outdoor air flow rate (high RH) - bool ModifyDuringHighOAMoisture = false; // flag to Modify outdoor air flow, TRUE when modify any time, FALSE when modify only when indoor air - // humrat is less than outdoor HR - int EconomizerOASchedPtr = 0; // schedule to modify outdoor air flow - std::string MinOAflowSch; // Name of the Minimum fraction of Design/Mixed Mass of air - std::string MaxOAflowSch; // Name of the Maximum fraction of Design/Mixed Mass of air - int MinOAflowSchPtr = 0; // Index to the Minimum Fraction of Outdoor Air Schedule - int MaxOAflowSchPtr = 0; // Index to the Maximum Fraction of Outdoor Air Schedule - // Economizer Status, which is currently following the EconomizerOperationFlag, might be something like "Economizer status - // indicates when the conditions are favorable for the economizer to operate (i.e., none of the control limits have been exceeded). - // While this status signal indicates favorable conditions for economizer operation, it does not guarantee that the air-side - // economizer has increased outdoor air flow above the minimum level since the actual outdoor air flow rate is also governed - // by other controls (e.g., mixed air setpoint temperature, time of day economizer control, etc.). - int EconomizerStatus = 0; // Air Economizer status (1 = on, 0 = off or economizer not exists) - int HeatRecoveryBypassStatus = 0; // OA Sys Heat Recovery Bypass status (1 = on, 0 = off or economizer not exists) - int HRHeatingCoilActive = 0; // OA Sys Heat Recovery Heating Coil Was Active status (1 = on, 0 = off) - Real64 MixedAirTempAtMinOAFlow = 0.0; // calculated mixed air temp at min flow rate when using special HX bypass control - int HighHumCtrlStatus = 0; // High Humidity Control status (1 = on, 0 = off or high hum ctrl not used) - Real64 OAFractionRpt = 0.0; // Actual outdoor air fraction for reporting (based on mixed air flow rate), - // 0 to 1 (normally) - Real64 MinOAFracLimit = 0.0; // Minimum OA fraction limit - Real64 MechVentOAMassFlowRequest = 0.0; // outside air mass flow rate calculated by mechanical ventilation object [kg/s] - bool EMSOverrideOARate = false; // if true, EMS is calling to override OA rate - Real64 EMSOARateValue = 0.0; // Value EMS is directing to use. [kg/s] - int HeatRecoveryBypassControlType = - DataHVACGlobals::BypassWhenWithinEconomizerLimits; // User input selects type of heat recovery optimization - bool ManageDemand = false; // Used by demand manager to manage ventilation - Real64 DemandLimitFlowRate = 0.0; // Current demand limit if demand manager is ON - Real64 MaxOAFracBySetPoint = 0.0; // The maximum OA fraction due to freezing cooling coil check - int MixedAirSPMNum = 0; // index of mixed air setpoint manager - bool CoolCoilFreezeCheck = false; // if true, cooling coil freezing is prevented by recalculating the amount of OA - bool EconoActive = false; // if true economizer is active - bool HighHumCtrlActive = false; // if true high humidity control is active - Array1D_int EconmizerFaultNum; // index to economizer fault - int NumFaultyEconomizer = 0; // total number of economizer faults - int CountMechVentFrac = 0; // Count when OA min fraction > mech vent fraction - int IndexMechVentFrac = 0; // Index when OA min fraction > mech vent fraction - OALimitFactor OALimitingFactor = OALimitFactor::Invalid; // OA controller limiting factor - int OALimitingFactorReport = 0; // OA controller limiting factor - integer for reporting - - void CalcOAController(EnergyPlusData &state, int const AirLoopNum, bool const FirstHVACIteration); - - void CalcOAEconomizer(EnergyPlusData &state, - int const AirLoopNum, - Real64 const OutAirMinFrac, - Real64 &OASignal, - bool &HighHumidityOperationFlag, - bool const FirstHVACIteration); - - void SizeOAController(EnergyPlusData &state); - - void UpdateOAController(EnergyPlusData &state); - - void Checksetpoints(EnergyPlusData &state, - Real64 const OutAirMinFrac, // Local variable used to calculate min OA fraction - Real64 &OutAirSignal, // Used to set OA mass flow rate - bool &EconomizerOperationFlag // logical used to show economizer status - ); - }; - - struct VentilationMechanicalZoneProps - { - std::string name; // name of mech vent zone - int zoneNum = 0; // Actual zones number - Real64 ZoneOAAreaRate = 0.0; // Mechanical ventilation rate (m3/s/m2) for each zone - Real64 ZoneOAPeopleRate = 0.0; // Mechanical ventilation rate (m3/s/person) for each zone - Real64 ZoneOAFlowRate = 0.0; // OA Flow Rate (m3/s/zone) for each zone - Real64 ZoneOAACHRate = 0.0; // OA ACH (m3/s/volume) for each zone - int ZoneDesignSpecOAObjIndex = 0; // index of the design specification outdoor air object for each zone - std::string ZoneDesignSpecOAObjName; // name of the design specification outdoor air object for each zone - Real64 ZoneADEffCooling = 1.0; // Zone air distribution effectiveness in cooling mode for each zone - Real64 ZoneADEffHeating = 1.0; // Zone air distribution effectiveness in heating mode for each zone - int ZoneADEffSchPtr = 0; // Pointer to the zone air distribution effectiveness schedule for each zone - int ZoneDesignSpecADObjIndex = 0; // index of the design specification zone air distribution object for each zone - std::string ZoneDesignSpecADObjName; // name of the design specification zone air distribution object for each zone - Real64 ZoneSecondaryRecirculation = 0.0; // zone air secondary recirculation ratio for each zone - DataSizing::OAFlowCalcMethod ZoneOAFlowMethod = DataSizing::OAFlowCalcMethod::PerPerson; // OA flow method for each zone - int ZoneOASchPtr = 0; // Index to the outdoor air schedule for each zone (from DesignSpecification:OutdoorAir or default) - Real64 OAPropCtlMinRateSchPtr = 0; // Outdoor design OA flow rate schedule from DesignSpecification:OutdoorAir - }; - - struct VentilationMechanicalProps // Derived type for Ventilation:Mechanical data - { - // Members - std::string Name; // Name of Ventilation:Mechanical object - std::string SchName; // Name of the mechanical ventilation schedule - int SchPtr = 0; // Index to the mechanical ventilation schedule - bool DCVFlag = false; // if true, implement OA based on demand controlled ventilation - int NumofVentMechZones = 0; // Number of zones with mechanical ventilation - Real64 TotAreaOAFlow = 0.0; // Total outdoor air flow rate for all zones per area (m3/s/m2) - Real64 TotPeopleOAFlow = 0.0; // Total outdoor air flow rate for all PEOPLE objects in zones (m3/s) - Real64 TotZoneOAFlow = 0.0; // Total outdoor air flow rate for all zones (m3/s) - Real64 TotZoneOAACH = 0.0; // Total outdoor air flow rate for all zones Air Changes per hour (m3/s/m3) - DataSizing::SysOAMethod SystemOAMethod = DataSizing::SysOAMethod::Invalid; // System Outdoor Air Method - SOAM_ZoneSum, SOAM_VRP, SOAM_VRPL - Real64 ZoneMaxOAFraction = 1.0; // Zone maximum outdoor air fraction - int CO2MaxMinLimitErrorCount = 0; // Counter when max CO2 concentration < min CO2 concentration for SOAM_ProportionalControlSchOcc - int CO2MaxMinLimitErrorIndex = 0; // Index for max CO2 concentration < min CO2 concentration recurring error message for - // SOAM_ProportionalControlSchOcc - int CO2GainErrorCount = 0; // Counter when CO2 generation from people is zero for SOAM_ProportionalControlSchOcc - int CO2GainErrorIndex = 0; // Index for recurring error message when CO2 generation from people is zero for SOAM_ProportionalControlSchOcc - int OAMaxMinLimitErrorCount = 0; // Counter when max OA < min OA for SOAM_ProportionalControlDesOARate - int OAMaxMinLimitErrorIndex = 0; // Index for max OA < min OA recurring error message for SOAM_ProportionalControlDesOARate - Real64 Ep = 1.0; // zone primary air fraction - Real64 Er = 0.0; // zone secondary recirculation fraction - Real64 Fa = 1.0; // temporary variable used in multi-path VRP calc - Real64 Fb = 1.0; - Real64 Fc = 1.0; - Real64 Xs = 1.0; // uncorrected system outdoor air fraction - Real64 Evz = 1.0; // zone ventilation efficiency - Real64 SysDesOA = 0.0; // System design OA - EPVector VentMechZone; - - Real64 CalcMechVentController(EnergyPlusData &state, - Real64 SysSA // System supply air mass flow rate [kg/s] - ); - }; - - struct OAMixerProps // Derived type for Outside Air Mixing Component - { - // Members - std::string Name; - int MixerIndex = 0; // Set on first call... - int MixNode = 0; // Outlet node - mixed air - int InletNode = 0; // Inlet node for outside air stream (Nov. 2004 BTG was OANode ) - int RelNode = 0; // Outlet node - relief air - int RetNode = 0; // Inlet node - return air - Real64 MixTemp = 0.0; - Real64 MixHumRat = 0.0; - Real64 MixEnthalpy = 0.0; - Real64 MixPressure = 0.0; - Real64 MixMassFlowRate = 0.0; - Real64 OATemp = 0.0; - Real64 OAHumRat = 0.0; - Real64 OAEnthalpy = 0.0; - Real64 OAPressure = 0.0; - Real64 OAMassFlowRate = 0.0; - Real64 RelTemp = 0.0; - Real64 RelHumRat = 0.0; - Real64 RelEnthalpy = 0.0; - Real64 RelPressure = 0.0; - Real64 RelMassFlowRate = 0.0; - Real64 RetTemp = 0.0; - Real64 RetHumRat = 0.0; - Real64 RetEnthalpy = 0.0; - Real64 RetPressure = 0.0; - Real64 RetMassFlowRate = 0.0; - }; - - // Functions - - Real64 OAGetFlowRate(EnergyPlusData &state, int OAPtr); - - Real64 OAGetMinFlowRate(EnergyPlusData &state, int OAPtr); - - void OASetDemandManagerVentilationState(EnergyPlusData &state, int OAPtr, bool aState); - - void OASetDemandManagerVentilationFlow(EnergyPlusData &state, int OAPtr, Real64 aFlow); - - int GetOAController(EnergyPlusData &state, std::string const &OAName); - - void - ManageOutsideAirSystem(EnergyPlusData &state, std::string const &OASysName, bool const FirstHVACIteration, int const AirLoopNum, int &OASysNum); - - void SimOutsideAirSys(EnergyPlusData &state, int const OASysNum, bool const FirstHVACIteration, int const AirLoopNum); - - void SimOASysComponents(EnergyPlusData &state, int const OASysNum, bool const FirstHVACIteration, int const AirLoopNum); - - void SimOAComponent(EnergyPlusData &state, - std::string const &CompType, // the component type - std::string const &CompName, // the component Name - SimAirServingZones::CompType const CompTypeNum, // Component Type -- Integerized for this module - bool const FirstHVACIteration, - int &CompIndex, - int const AirLoopNum, // air loop index for economizer lockout coordination - bool const Sim, // if TRUE, simulate component; if FALSE, just set the coil exisitence flags - int const OASysNum, // index to outside air system - bool &OAHeatingCoil, // TRUE indicates a heating coil has been found - bool &OACoolingCoil, // TRUE indicates a cooling coil has been found - bool &OAHX); // TRUE indicates a heat exchanger has been found - - void SimOAMixer(EnergyPlusData &state, std::string const &CompName, int &CompIndex); - - void SimOAController(EnergyPlusData &state, std::string const &CtrlName, int &CtrlIndex, bool const FirstHVACIteration, int const AirLoopNum); - - // Get Input Section of the Module - //****************************************************************************** - - void GetOutsideAirSysInputs(EnergyPlusData &state); - - void GetOAControllerInputs(EnergyPlusData &state); - - void AllocateOAControllers(EnergyPlusData &state); - - void GetOAMixerInputs(EnergyPlusData &state); - - void ProcessOAControllerInputs(EnergyPlusData &state, - std::string_view const CurrentModuleObject, - int const OutAirNum, - Array1D_string const &AlphArray, - int &NumAlphas, - Array1D const &NumArray, - int &NumNums, - Array1D_bool const &lNumericBlanks, // Unused - Array1D_bool const &lAlphaBlanks, - Array1D_string const &cAlphaFields, - Array1D_string const &cNumericFields, // Unused - bool &ErrorsFound // If errors found in input - ); - - // End of Get Input subroutines for the Module - //****************************************************************************** - - // Beginning Initialization Section of the Module - //****************************************************************************** - - void InitOutsideAirSys(EnergyPlusData &state, int const OASysNum, int const AirLoopNum); - - void InitOAController(EnergyPlusData &state, int const OAControllerNum, bool const FirstHVACIteration, int const AirLoopNum); - - void InitOAMixer(EnergyPlusData &state, int const OAMixerNum); - - // End of Initialization Section of the Module - //****************************************************************************** - - // Beginning Calculation Section of the Module - //****************************************************************************** - - void CalcOAMixer(EnergyPlusData &state, int const OAMixerNum); - - // End of Calculation/Simulation Section of the Module - //****************************************************************************** - - // Beginning Sizing Section of the Module - //****************************************************************************** - - // End of Sizing Section of the Module - //****************************************************************************** - - // Beginning Update/Reporting Section of the Module - //****************************************************************************** - - void UpdateOAMixer(EnergyPlusData &state, int const OAMixerNum); - - // End of Sizing Section of the Module - //****************************************************************************** - - // Beginning Utility Section of the Module - //****************************************************************************** - - Array1D_int GetOAMixerNodeNumbers(EnergyPlusData &state, - std::string const &OAMixerName, // must match OA mixer names for the OA mixer type - bool &ErrorsFound // set to true if problem - ); - - int GetNumOAMixers(EnergyPlusData &state); - - int GetNumOAControllers(EnergyPlusData &state); - - int GetOAMixerReliefNodeNumber(EnergyPlusData &state, int const OAMixerNum); // Which Mixer - - int GetOASysControllerListIndex(EnergyPlusData &state, int const OASysNumber); // OA Sys Number - - int GetOASysNumSimpControllers(EnergyPlusData &state, int const OASysNumber); // OA Sys Number - - int GetOASysNumHeatingCoils(EnergyPlusData &state, int const OASysNumber); // OA Sys Number - - int GetOASysNumHXs(EnergyPlusData &state, int const OASysNumber); // OA Sys Number - - int GetOASysNumCoolingCoils(EnergyPlusData &state, int const OASysNumber); // OA Sys Number - - int GetOASystemNumber(EnergyPlusData &state, std::string const &OASysName); // OA Sys Name - - int FindOAMixerMatchForOASystem(EnergyPlusData &state, int const OASysNumber); // Which OA System - - int GetOAMixerIndex(EnergyPlusData &state, std::string const &OAMixerName); // Which Mixer - - int GetOAMixerInletNodeNumber(EnergyPlusData &state, int const OAMixerNumber); // Which Mixer - - int GetOAMixerReturnNodeNumber(EnergyPlusData &state, int const OAMixerNumber); // Which Mixer - - int GetOAMixerMixedNodeNumber(EnergyPlusData &state, int const OAMixerNumber); // Which Mixer - - bool CheckForControllerWaterCoil(EnergyPlusData &state, - DataAirLoop::ControllerKind ControllerType, // should be passed in as UPPERCASE - std::string const &ControllerName // should be passed in as UPPERCASE - ); - - void CheckControllerLists(EnergyPlusData &state, bool &ErrFound); - - void CheckOAControllerName( - EnergyPlusData &state, std::string &OAControllerName, std::string const &ObjectType, std::string const &FieldName, bool &ErrorsFound); - - int GetNumOASystems(EnergyPlusData &state); - - int GetOACompListNumber(EnergyPlusData &state, int const OASysNum); // OA Sys Number - - std::string GetOACompName(EnergyPlusData &state, - int const OASysNum, // OA Sys Number - int const InListNum // In-list Number - ); - - std::string GetOACompType(EnergyPlusData &state, - int const OASysNum, // OA Sys Number - int const InListNum // In-list Number - ); - - SimAirServingZones::CompType GetOACompTypeNum(EnergyPlusData &state, - int const OASysNum, // OA Sys Number - int const InListNum // In-list Number - ); - - int GetOAMixerNumber(EnergyPlusData &state, std::string const &OAMixerName); // must match OA mixer names for the OA mixer type - - // End of Utility Section of the Module - //****************************************************************************** - -} // namespace MixedAir - -struct MixedAirData : BaseGlobalStruct -{ - - int NumControllerLists = 0; // Number of Controller Lists - int NumOAControllers = 0; // Number of OA Controllers (includes ERV controllers) - int NumERVControllers = 0; // Number of ERV Controllers - int NumOAMixers = 0; // Number of Outdoor Air Mixers - int NumVentMechControllers = 0; // Number of Controller:MechanicalVentilation objects in input deck - Array1D_bool MyOneTimeErrorFlag; - Array1D_bool MyOneTimeCheckUnitarySysFlag; - Array1D_bool initOASysFlag; - bool GetOASysInputFlag = true; - bool GetOAMixerInputFlag = true; - bool GetOAControllerInputFlag = true; - bool InitOAControllerOneTimeFlag = true; - Array1D_bool InitOAControllerSetPointCheckFlag; - bool InitOAControllerSetUpAirLoopHVACVariables = true; - bool AllocateOAControllersFlag = true; - Array1D_string DesignSpecOAObjName; // name of the design specification outdoor air object - Array1D_int DesignSpecOAObjIndex; // index of the design specification outdoor air object - Array1D_string VentMechZoneOrListName; // Zone or Zone List to apply mechanical ventilation rate - Array1D_string DesignSpecZoneADObjName; // name of the design specification zone air distribution object - Array1D_int DesignSpecZoneADObjIndex; // index of the design specification zone air distribution object - EPVector ControllerLists; - EPVector OAController; - EPVector OAMixer; - EPVector VentilationMechanical; - std::unordered_set ControllerListUniqueNames; - std::unordered_map OAControllerUniqueNames; - std::string CompType; - std::string CompName; - std::string CtrlName; - Array1D_bool OAControllerMyOneTimeFlag; - Array1D_bool OAControllerMyEnvrnFlag; - Array1D_bool OAControllerMySizeFlag; - Array1D_bool MechVentCheckFlag; - - void clear_state() override - { - this->NumControllerLists = 0; - this->NumOAControllers = 0; - this->NumERVControllers = 0; - this->NumOAMixers = 0; - this->NumVentMechControllers = 0; - this->MyOneTimeErrorFlag.deallocate(); - this->MyOneTimeCheckUnitarySysFlag.deallocate(); - this->initOASysFlag.deallocate(); - this->GetOASysInputFlag = true; - this->GetOAMixerInputFlag = true; - this->GetOAControllerInputFlag = true; - this->InitOAControllerOneTimeFlag = true; - this->InitOAControllerSetPointCheckFlag.deallocate(); - this->InitOAControllerSetUpAirLoopHVACVariables = true; - this->AllocateOAControllersFlag = true; - this->DesignSpecOAObjName.deallocate(); - this->DesignSpecOAObjIndex.deallocate(); - this->VentMechZoneOrListName.deallocate(); - this->DesignSpecZoneADObjName.deallocate(); - this->DesignSpecZoneADObjIndex.deallocate(); - this->ControllerLists.deallocate(); - this->OAController.deallocate(); - this->OAMixer.deallocate(); - this->VentilationMechanical.deallocate(); - this->ControllerListUniqueNames.clear(); - this->OAControllerUniqueNames.clear(); - this->OAControllerMyOneTimeFlag.clear(); - this->OAControllerMyEnvrnFlag.clear(); - this->OAControllerMySizeFlag.clear(); - this->MechVentCheckFlag.clear(); - } -}; - -} // namespace EnergyPlus - -#endif diff --git a/src/EnergyPlus/ZoneTempPredictorCorrector.cc.bak b/src/EnergyPlus/ZoneTempPredictorCorrector.cc.bak deleted file mode 100644 index 6c1d8da9bd0..00000000000 --- a/src/EnergyPlus/ZoneTempPredictorCorrector.cc.bak +++ /dev/null @@ -1,7500 +0,0 @@ -// EnergyPlus, Copyright (c) 1996-2022, The Board of Trustees of the University of Illinois, -// The Regents of the University of California, through Lawrence Berkeley National Laboratory -// (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge -// National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other -// contributors. All rights reserved. -// -// NOTICE: This Software was developed under funding from the U.S. Department of Energy and the -// U.S. Government consequently retains certain rights. As such, the U.S. Government has been -// granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, -// worldwide license in the Software to reproduce, distribute copies to the public, prepare -// derivative works, and perform publicly and display publicly, and to permit others to do so. -// -// Redistribution and use in source and binary forms, with or without modification, are permitted -// provided that the following conditions are met: -// -// (1) Redistributions of source code must retain the above copyright notice, this list of -// conditions and the following disclaimer. -// -// (2) Redistributions in binary form must reproduce the above copyright notice, this list of -// conditions and the following disclaimer in the documentation and/or other materials -// provided with the distribution. -// -// (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, -// the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be -// used to endorse or promote products derived from this software without specific prior -// written permission. -// -// (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form -// without changes from the version obtained under this License, or (ii) Licensee makes a -// reference solely to the software portion of its product, Licensee must refer to the -// software as "EnergyPlus version X" software, where "X" is the version number Licensee -// obtained under this License and may not use a different name for the software. Except as -// specifically required in this Section (4), Licensee shall not use in a company name, a -// product name, in advertising, publicity, or other promotional activities any name, trade -// name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly -// similar designation, without the U.S. Department of Energy's prior written consent. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR -// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -// AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR -// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -// C++ Headers -#include -#include - -// ObjexxFCL Headers -#include -#include - -// EnergyPlus Headers -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace EnergyPlus::ZoneTempPredictorCorrector { - -// MODULE INFORMATION: -// AUTHOR Russell D. Taylor -// DATE WRITTEN 1997 -// MODIFIED Aug 2001(FW): make SNLoadHeatRate public -// Nov 2010 BN(FSEC) added TemperatureAndHumidity Control -// RE-ENGINEERED July 2003 (Peter Graham Ellis) -// July 2006 (BG) added operative temp control -// February 2008 (BG) reworked zone air temp histories - -// PURPOSE OF THIS MODULE: -// This module contains routines to predict and correct zone temperatures. -// also includes zone thermostatic controlling -// Model the "Air Heat Balance" part of the the "Zone Heat Balance Method." - -// METHODOLOGY EMPLOYED: -// apply model equations for air heat balance solved for zone air temp. -// sum up values for the terms (e.g SUMHAT, SUMHA etc. ) -// "Predict" step is used to get zone loads for HVAC equipment -// "correct" step determines zone air temp with available HVAC - -enum class ZoneControlTypes -{ - Invalid = -1, - TStat = 1, - TCTStat = 2, - OTTStat = 3, - HStat = 4, - TandHStat = 5, - StagedDual = 6, - Num -}; - -enum class AdaptiveComfortModel -{ - Invalid = -1, - ADAP_NONE = 1, - ASH55_CENTRAL = 2, - ASH55_UPPER_90 = 3, - ASH55_UPPER_80 = 4, - CEN15251_CENTRAL = 5, - CEN15251_UPPER_I = 6, - CEN15251_UPPER_II = 7, - CEN15251_UPPER_III = 8, - Num -}; - -static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidControlTypes = { - "Uncontrolled", - "ThermostatSetpoint:SingleHeating", - "ThermostatSetpoint:SingleCooling", - "ThermostatSetpoint:SingleHeatingOrCooling", - "ThermostatSetpoint:DualSetpoint"}; - -static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidControlTypesUC = { - "UNCONTROLLED", - "THERMOSTATSETPOINT:SINGLEHEATING", - "THERMOSTATSETPOINT:SINGLECOOLING", - "THERMOSTATSETPOINT:SINGLEHEATINGORCOOLING", - "THERMOSTATSETPOINT:DUALSETPOINT"}; - -static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidComfortControlTypes = { - "Uncontrolled", - "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeating", - "ThermostatSetpoint:ThermalComfort:Fanger:SingleCooling", - "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeatingOrCooling", - "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint"}; - -static constexpr std::array(DataHVACGlobals::ThermostatType::Num)> ValidComfortControlTypesUC = { - "UNCONTROLLED", - "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:SINGLEHEATING", - "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:SINGLECOOLING", - "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:SINGLEHEATINGORCOOLING", - "THERMOSTATSETPOINT:THERMALCOMFORT:FANGER:DUALSETPOINT"}; - -Array1D_string const cZControlTypes(6, - {"ZoneControl:Thermostat", - "ZoneControl:Thermostat:ThermalComfort", - "ZoneControl:Thermostat:OperativeTemperature", - "ZoneControl:Humidistat", - "ZoneControl:Thermostat:TemperatureAndHumidity", - "ZoneControl:Thermostat:StagedDualSetpoint"}); - -Array1D_string const AdaptiveComfortModelTypes(8, - {"None", - "AdaptiveASH55CentralLine", - "AdaptiveASH5590PercentUpperLine", - "AdaptiveASH5580PercentUpperLine", - "AdaptiveCEN15251CentralLine", - "AdaptiveCEN15251CategoryIUpperLine", - "AdaptiveCEN15251CategoryIIUpperLine", - "AdaptiveCEN15251CategoryIIIUpperLine"}); - -// Functions -void ManageZoneAirUpdates(EnergyPlusData &state, - DataHeatBalFanSys::PredictorCorrectorCtrl const UpdateType, // Can be iGetZoneSetPoints, iPredictStep, iCorrectStep - Real64 &ZoneTempChange, // Temp change in zone air btw previous and current timestep - bool const ShortenTimeStepSys, - bool const UseZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step - Real64 const PriorTimeStep // the old value for timestep length is passed for possible use in interpolating -) -{ - - // SUBROUTINE INFORMATION - // AUTHOR Russ Taylor - // DATE WRITTEN September 1998 - // MODIFIED na - // RE-ENGINEERED Brent Griffith Feb. 2008, added arguments - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine predicts or corrects the zone air temperature - // depending on the simulation status and determines the correct - // temperature setpoint for each zone from the schedule manager. - - if (state.dataZoneCtrls->GetZoneAirStatsInputFlag) { - GetZoneAirSetPoints(state); - state.dataZoneCtrls->GetZoneAirStatsInputFlag = false; - } - - InitZoneAirSetPoints(state); - - switch (UpdateType) { - case DataHeatBalFanSys::PredictorCorrectorCtrl::GetZoneSetPoints: { - CalcZoneAirTempSetPoints(state); - } break; - case DataHeatBalFanSys::PredictorCorrectorCtrl::PredictStep: { - PredictSystemLoads(state, ShortenTimeStepSys, UseZoneTimeStepHistory, PriorTimeStep); - } break; - case DataHeatBalFanSys::PredictorCorrectorCtrl::CorrectStep: { - ZoneTempChange = correctZoneAirTemps(state, UseZoneTimeStepHistory); - } break; - case DataHeatBalFanSys::PredictorCorrectorCtrl::RevertZoneTimestepHistories: { - RevertZoneTimestepHistories(state); - } break; - case DataHeatBalFanSys::PredictorCorrectorCtrl::PushZoneTimestepHistories: { - PushZoneTimestepHistories(state); - } break; - case DataHeatBalFanSys::PredictorCorrectorCtrl::PushSystemTimestepHistories: { - PushSystemTimestepHistories(state); - } break; - default: - break; - } -} - -void GetZoneAirSetPoints(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Russell Taylor - // DATE WRITTEN September 1998 - // MODIFIED L.Gu, May 2006, B. Griffith June 2006 - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine gets the inputs related to thermostatic control. - - // METHODOLOGY EMPLOYED: - // Uses the status flags to trigger events. - - // Using/Aliasing - using General::CheckCreatedZoneItemName; - using General::FindNumberInList; - - using ScheduleManager::CheckScheduleValue; - using ScheduleManager::CheckScheduleValueMinMax; - using ScheduleManager::GetScheduleIndex; - using ScheduleManager::GetScheduleMaxValue; - using ScheduleManager::GetScheduleMinValue; - - // SUBROUTINE PARAMETER DEFINITIONS: - static constexpr std::string_view RoutineName("GetZoneAirSetpoints: "); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int TempControlledZoneNum; // The Splitter that you are currently loading input into - int NumAlphas; - int NumNums; - int ControlTypeNum; - int IOStat; - bool ErrorsFound(false); - bool errFlag; - int CTIndex; - int HumidControlledZoneNum; // The Humidity Controller that information is being loaded into - bool ValidScheduleControlType; - bool ValidRadFractSched; // check for if radiative fraction schedule has valid numbers - bool ValidZoneOvercoolRangeSched; // check for if Zone Overcool range schedule has valid numbers - int SchedMin; - int SchedMax; - int ActualZoneNum; - int SchedTypeIndex; - - int ComfortControlledZoneNum; // The Splitter that you are currently loading input into - int i; - int IZoneCount; - int found; - int NumStageControlledZones; // Number of staged controlled objects - int StageControlledZoneNum; // Index for staged controlled zones - - Array1D_int CTSchedMapToControlledZone; - Array1D_int CCmSchedMapToControlledZone; - int Item; - int Item1; - int ZLItem; - - struct NeededControlTypes - { - // Members 4= the four control types + uncontrolled - std::array(DataHVACGlobals::ThermostatType::Num)> MustHave = {false, false, false, false, false}; - std::array(DataHVACGlobals::ThermostatType::Num)> DidHave = {false, false, false, false, false}; - }; - - struct NeededComfortControlTypes - { - // Members 4= the four control types + uncontrolled - std::array(DataHVACGlobals::ThermostatType::Num)> MustHave = {false, false, false, false, false}; - std::array(DataHVACGlobals::ThermostatType::Num)> DidHave = {false, false, false, false, false}; - }; - - // Object Data - Array1D TStatControlTypes; - Array1D TComfortControlTypes; - - // Formats - static constexpr std::string_view Header( - "! , Sensible Heat Capacity Multiplier, Moisture Capacity Multiplier, Carbon " - "Dioxide Capacity Multiplier, Generic Contaminant Capacity Multiplier\n"); - static constexpr std::string_view Format_701("Zone Volume Capacitance Multiplier,{:8.3F} ,{:8.3F},{:8.3F},{:8.3F}\n"); - - auto &cCurrentModuleObject = state.dataIPShortCut->cCurrentModuleObject; - auto &TStatObjects = state.dataZoneCtrls->TStatObjects; - auto &NumTStatStatements = state.dataZoneCtrls->NumTStatStatements; - auto &NumTempControlledZones = state.dataZoneCtrls->NumTempControlledZones; - auto &Zone = state.dataHeatBal->Zone; - auto &ZoneList = state.dataHeatBal->ZoneList; - auto &TempControlledZone = state.dataZoneCtrls->TempControlledZone; - auto &HumidityControlZone = state.dataZoneCtrls->HumidityControlZone; - auto &ComfortTStatObjects = state.dataZoneCtrls->ComfortTStatObjects; - auto &ComfortControlledZone = state.dataZoneCtrls->ComfortControlledZone; - auto &NumOfZones = state.dataGlobal->NumOfZones; - auto &StageControlledZone = state.dataZoneCtrls->StageControlledZone; - auto &SetPointSingleHeating = state.dataZoneTempPredictorCorrector->SetPointSingleHeating; - auto &SetPointSingleCooling = state.dataZoneTempPredictorCorrector->SetPointSingleCooling; - auto &cAlphaArgs = state.dataIPShortCut->cAlphaArgs; - auto &rNumericArgs = state.dataIPShortCut->rNumericArgs; - auto &lNumericFieldBlanks = state.dataIPShortCut->lNumericFieldBlanks; - auto &lAlphaFieldBlanks = state.dataIPShortCut->lAlphaFieldBlanks; - auto &cAlphaFieldNames = state.dataIPShortCut->cAlphaFieldNames; - auto &cNumericFieldNames = state.dataIPShortCut->cNumericFieldNames; - auto &inputProcessor = state.dataInputProcessing->inputProcessor; - auto &SetPointDualHeatCool = state.dataZoneTempPredictorCorrector->SetPointDualHeatCool; - - cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::TStat)); - NumTStatStatements = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - TStatObjects.allocate(NumTStatStatements); - - // Pre-scan for use of Zone lists in TStat statements (i.e. Global application of TStat) - NumTempControlledZones = 0; - for (Item = 1; Item <= NumTStatStatements; ++Item) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Item, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - - TStatObjects(Item).Name = cAlphaArgs(1); - Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - ZLItem = 0; - if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); - if (Item1 > 0) { - TStatObjects(Item).TempControlledZoneStartPtr = NumTempControlledZones + 1; - ++NumTempControlledZones; - TStatObjects(Item).NumOfZones = 1; - TStatObjects(Item).ZoneListActive = false; - TStatObjects(Item).ZoneOrZoneListPtr = Item1; - } else if (ZLItem > 0) { - TStatObjects(Item).TempControlledZoneStartPtr = NumTempControlledZones + 1; - NumTempControlledZones += ZoneList(ZLItem).NumOfZones; - TStatObjects(Item).NumOfZones = ZoneList(ZLItem).NumOfZones; - TStatObjects(Item).ZoneListActive = true; - TStatObjects(Item).ZoneOrZoneListPtr = ZLItem; - } else { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - } - - if (ErrorsFound) { - ShowSevereError(state, "GetZoneAirSetpoints: Errors with invalid names in " + cCurrentModuleObject + " objects."); - ShowContinueError(state, "...These will not be read in. Other errors may occur."); - NumTempControlledZones = 0; - } - - if (NumTempControlledZones > 0) { - TempControlledZone.allocate(NumTempControlledZones); - TStatControlTypes.allocate(NumTempControlledZones); // Number of set point types - CTSchedMapToControlledZone.dimension(NumTempControlledZones, 0); - - TempControlledZoneNum = 0; - state.dataZoneTempPredictorCorrector->NumOnOffCtrZone = 0; - for (Item = 1; Item <= NumTStatStatements; ++Item) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Item, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - for (Item1 = 1; Item1 <= TStatObjects(Item).NumOfZones; ++Item1) { - ++TempControlledZoneNum; - if (TStatObjects(Item).ZoneListActive) { - cAlphaArgs(2) = Zone(ZoneList(TStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name; - } - int ZoneAssigned = UtilityRoutines::FindItemInList( - cAlphaArgs(2), TempControlledZone, &DataZoneControls::ZoneTempControls::ZoneName, TempControlledZoneNum - 1); - if (ZoneAssigned == 0) { - TempControlledZone(TempControlledZoneNum).ZoneName = cAlphaArgs(2); - TempControlledZone(TempControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - if (TempControlledZone(TempControlledZoneNum).ActualZoneNum == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" not found."); - ErrorsFound = true; - } else { - Zone(TempControlledZone(TempControlledZoneNum).ActualZoneNum).TempControlledZoneIndex = TempControlledZoneNum; - } - } else { - TempControlledZone(TempControlledZoneNum).ZoneName = cAlphaArgs(2); // for continuity - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" zone previously assigned."); - ShowContinueError(state, "...Zone was previously assigned to Thermostat=\"" + TempControlledZone(ZoneAssigned).Name + "\"."); - ErrorsFound = true; - continue; - } - - if (!TStatObjects(Item).ZoneListActive) { - TempControlledZone(TempControlledZoneNum).Name = cAlphaArgs(1); - } else { - CheckCreatedZoneItemName(state, - RoutineName, - cCurrentModuleObject, - Zone(ZoneList(TStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name, - ZoneList(TStatObjects(Item).ZoneOrZoneListPtr).MaxZoneNameLength, - TStatObjects(Item).Name, - TempControlledZone, - TempControlledZoneNum - 1, - TempControlledZone(TempControlledZoneNum).Name, - errFlag); - if (errFlag) ErrorsFound = true; - } - - TempControlledZone(TempControlledZoneNum).ControlTypeSchedName = cAlphaArgs(3); - TempControlledZone(TempControlledZoneNum).CTSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); - if (Item1 == 1) { // only show error on first of several if zone list - if (TempControlledZone(TempControlledZoneNum).CTSchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + - "\" not found."); - ErrorsFound = true; - } else { - // Check validity of control types. - ValidScheduleControlType = - CheckScheduleValueMinMax(state, TempControlledZone(TempControlledZoneNum).CTSchedIndex, ">=", 0.0, "<=", 4.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid range " + cAlphaFieldNames(2) + "=\"" + - cAlphaArgs(2) + "\""); - ShowContinueError(state, "..contains values outside of range [0,4]."); - ErrorsFound = true; - } - } - } - - if (lAlphaFieldBlanks(7)) { - NumAlphas = 5; - } else if (lAlphaFieldBlanks(9)) { - NumAlphas = 7; - } else if (lAlphaFieldBlanks(11)) { - NumAlphas = 9; - } - - TempControlledZone(TempControlledZoneNum).NumControlTypes = nint((NumAlphas - 3.0) / 2.0); - TempControlledZone(TempControlledZoneNum).ControlType.allocate(TempControlledZone(TempControlledZoneNum).NumControlTypes); - TempControlledZone(TempControlledZoneNum).ControlTypeName.allocate(TempControlledZone(TempControlledZoneNum).NumControlTypes); - TempControlledZone(TempControlledZoneNum).ControlTypeEnum.allocate(TempControlledZone(TempControlledZoneNum).NumControlTypes); - - for (ControlTypeNum = 1; ControlTypeNum <= TempControlledZone(TempControlledZoneNum).NumControlTypes; ++ControlTypeNum) { - - TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 3)); - TempControlledZone(TempControlledZoneNum).ControlTypeName(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum + 3)); - - if (!TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum).empty()) { - auto ctrlType = static_cast( - getEnumerationValue(ValidControlTypesUC, TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum))); - TempControlledZone(TempControlledZoneNum).ControlTypeEnum(ControlTypeNum) = ctrlType; - if (ctrlType == DataHVACGlobals::ThermostatType::Invalid) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + - cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 3)) + "=\"" + - cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 3)) + "\""); - ErrorsFound = true; - } - } else { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + - cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 3)) + "=\"\""); - ErrorsFound = true; - } - } - if (NumNums > 0) { - if (rNumericArgs(1) >= 0.0) { - TempControlledZone(TempControlledZoneNum).DeltaTCutSet = rNumericArgs(1); - if (rNumericArgs(1) > 0.0) state.dataZoneTempPredictorCorrector->NumOnOffCtrZone++; - } else { - ShowSevereError( - state, - format("{}=\"{} invalid {}=[{:.0T}].", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(1), rNumericArgs(1))); - ShowContinueError(state, "..Allowable values must be greater or equal to 0"); - ErrorsFound = true; - } - } - if (TempControlledZone(TempControlledZoneNum).DeltaTCutSet > 0.0) { - for (ControlTypeNum = 1; ControlTypeNum <= TempControlledZone(TempControlledZoneNum).NumControlTypes; ++ControlTypeNum) { - if (UtilityRoutines::SameString(TempControlledZone(TempControlledZoneNum).ControlType(ControlTypeNum), - "ThermostatSetpoint:SingleHeatingOrCooling")) { - ShowWarningError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + - ": The choice of Temperature Difference Between Cutout And Setpoint will not be applied to " - "ThermostatSetpoint:SingleHeatingOrCooling."); - } - } - } - } - } // NumTStatStatements - } // Check on number of TempControlledZones - - cCurrentModuleObject = ValidControlTypesUC[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)]; - state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls > 0) - SetPointSingleHeating.allocate(state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &singleHtgSetpoint = SetPointSingleHeating(idx); - singleHtgSetpoint.Name = cAlphaArgs(1); - singleHtgSetpoint.TempSchedName = cAlphaArgs(2); - singleHtgSetpoint.TempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (singleHtgSetpoint.TempSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - - } // SingleTempHeatingControlNum - - cCurrentModuleObject = ValidControlTypesUC[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)]; - state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls > 0) - SetPointSingleCooling.allocate(state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &singleClgSetpoint = SetPointSingleCooling(idx); - singleClgSetpoint.Name = cAlphaArgs(1); - singleClgSetpoint.TempSchedName = cAlphaArgs(2); - singleClgSetpoint.TempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (singleClgSetpoint.TempSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - - } // SingleTempCoolingControlNum - - cCurrentModuleObject = ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)]; - state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls > 0) - state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool.allocate(state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - auto &singleHeatCoolSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool(idx); - singleHeatCoolSetpoint.Name = cAlphaArgs(1); - singleHeatCoolSetpoint.TempSchedName = cAlphaArgs(2); - singleHeatCoolSetpoint.TempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (singleHeatCoolSetpoint.TempSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - - } // SingleTempHeatCoolControlNum - - cCurrentModuleObject = ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)]; - state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls > 0) - SetPointDualHeatCool.allocate(state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &dualHeatCoolSetpoint = SetPointDualHeatCool(idx); - dualHeatCoolSetpoint.Name = cAlphaArgs(1); - dualHeatCoolSetpoint.HeatTempSetptSchedName = cAlphaArgs(2); - dualHeatCoolSetpoint.HeatTempSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (dualHeatCoolSetpoint.HeatTempSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - dualHeatCoolSetpoint.CoolTempSetptSchedName = cAlphaArgs(3); - dualHeatCoolSetpoint.CoolTempSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); - if (dualHeatCoolSetpoint.CoolTempSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" not found."); - ErrorsFound = true; - } - - } // DualTempHeatCoolControlNum - - // Finish filling in Schedule pointing indexes - int setPointObjectArrayIndex; - for (TempControlledZoneNum = 1; TempControlledZoneNum <= NumTempControlledZones; ++TempControlledZoneNum) { - for (int ct = 1; ct <= state.dataZoneCtrls->TempControlledZone(TempControlledZoneNum).NumControlTypes; ct++) { - switch (state.dataZoneCtrls->TempControlledZone(TempControlledZoneNum).ControlTypeEnum(ct)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - setPointObjectArrayIndex = - UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), SetPointSingleHeating); - TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatSetPoint = - state.dataZoneTempPredictorCorrector->SetPointSingleHeating(setPointObjectArrayIndex).TempSchedIndex; - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - setPointObjectArrayIndex = - UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), SetPointSingleCooling); - TempControlledZone(TempControlledZoneNum).SchIndx_SingleCoolSetPoint = - state.dataZoneTempPredictorCorrector->SetPointSingleCooling(setPointObjectArrayIndex).TempSchedIndex; - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - setPointObjectArrayIndex = UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), - state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool); - TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatCoolSetPoint = - state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool(setPointObjectArrayIndex).TempSchedIndex; - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - setPointObjectArrayIndex = UtilityRoutines::FindItem(TempControlledZone(TempControlledZoneNum).ControlTypeName(ct), - state.dataZoneTempPredictorCorrector->SetPointDualHeatCool); - TempControlledZone(TempControlledZoneNum).SchIndx_DualSetPointWDeadBandHeat = - state.dataZoneTempPredictorCorrector->SetPointDualHeatCool(setPointObjectArrayIndex).HeatTempSchedIndex; - TempControlledZone(TempControlledZoneNum).SchIndx_DualSetPointWDeadBandCool = - state.dataZoneTempPredictorCorrector->SetPointDualHeatCool(setPointObjectArrayIndex).CoolTempSchedIndex; - break; - default: - assert(false); - } - } - } - - // Now, Check the schedule values/indices for validity - - for (TempControlledZoneNum = 1; TempControlledZoneNum <= NumTempControlledZones; ++TempControlledZoneNum) { - - ActualZoneNum = TempControlledZone(TempControlledZoneNum).ActualZoneNum; - CTIndex = TempControlledZone(TempControlledZoneNum).CTSchedIndex; - if (CTIndex == 0) continue; // error will be caught elsewhere - SchedMin = GetScheduleMinValue(state, CTIndex); - SchedMax = GetScheduleMaxValue(state, CTIndex); - - if (SchedMin == 0 && SchedMax == 0) { - if (FindNumberInList(CTIndex, CTSchedMapToControlledZone, NumTempControlledZones) == 0) { - ShowSevereError(state, "Control Type Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, "..specifies control type 0 for all entries."); - ShowContinueError(state, "All zones using this Control Type Schedule have no heating or cooling available."); - } - CTSchedMapToControlledZone(TempControlledZoneNum) = CTIndex; - } - - for (ControlTypeNum = SchedMin; ControlTypeNum <= SchedMax; ++ControlTypeNum) { - - int TempIndex = 0; - switch (static_cast(ControlTypeNum)) { - case DataHVACGlobals::ThermostatType::Uncontrolled: - break; - case DataHVACGlobals::ThermostatType::SingleHeating: - TempIndex = TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatSetPoint; - if (TempIndex == 0) { - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeating))) { - ShowSevereError(state, "Control Type Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies control type 1 ({}) as the control type. Not valid for this zone.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - TempIndex = TempControlledZone(TempControlledZoneNum).SchIndx_SingleCoolSetPoint; - if (TempIndex == 0) { - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleCooling))) { - ShowSevereError(state, "Control Type Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies control type 2 ({}) as the control type. Not valid for this zone.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - TempIndex = TempControlledZone(TempControlledZoneNum).SchIndx_SingleHeatCoolSetPoint; - if (TempIndex == 0) { - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool))) { - ShowSevereError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies control type 3 ({}) as the control type. Not valid for this zone.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - TempIndex = TempControlledZone(TempControlledZoneNum) - .SchIndx_DualSetPointWDeadBandHeat; // using "Heat" as a sentinel that dualsetpoint is on this zone control object - if (TempIndex == 0) { - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand))) { - ShowSevereError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies control type 4 ({}) as the control type. Not valid for this zone.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - default: - ShowSevereError(state, - format("GetZoneAirSetpoints: Illegal control type for Zone={}, Found value={}, in Schedule={}", - Zone(ActualZoneNum).Name, - ControlTypeNum, - TempControlledZone(TempControlledZoneNum).ControlTypeSchedName)); - ShowContinueError(state, "..valid range values are [0,4]."); - ErrorsFound = true; - } - } - } - - for (TempControlledZoneNum = 1; TempControlledZoneNum <= NumTempControlledZones; ++TempControlledZoneNum) { - - ActualZoneNum = TempControlledZone(TempControlledZoneNum).ActualZoneNum; - CTIndex = TempControlledZone(TempControlledZoneNum).CTSchedIndex; - if (CTIndex == 0) continue; // error caught elsewhere -- would just be confusing here - - for (ControlTypeNum = 1; ControlTypeNum <= 4; ++ControlTypeNum) { - if (TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum] && TStatControlTypes(TempControlledZoneNum).DidHave[ControlTypeNum]) - continue; - - switch (static_cast(ControlTypeNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 1 ({}) but does not.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 2 ({}) but does not.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 3 ({}) but does not.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - if (!TStatControlTypes(TempControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + TempControlledZone(TempControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 4 ({}) but does not.", - ValidControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TStat)) + '=' + - TempControlledZone(TempControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + TempControlledZone(TempControlledZoneNum).ZoneName); - break; - default: - break; - } - } - } - - if (allocated(TStatControlTypes)) TStatControlTypes.deallocate(); - // This starts the Humidity Control Get Input section - cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::HStat)); - state.dataZoneCtrls->NumHumidityControlZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneCtrls->NumHumidityControlZones > 0) { - HumidityControlZone.allocate(state.dataZoneCtrls->NumHumidityControlZones); - state.dataZoneTempPredictorCorrector->HumidityControlZoneUniqueNames.reserve( - static_cast(state.dataZoneCtrls->NumHumidityControlZones)); - } - - for (HumidControlledZoneNum = 1; HumidControlledZoneNum <= state.dataZoneCtrls->NumHumidityControlZones; ++HumidControlledZoneNum) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - HumidControlledZoneNum, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - - HumidityControlZone(HumidControlledZoneNum).ControlName = cAlphaArgs(1); - GlobalNames::IntraObjUniquenessCheck(state, - cAlphaArgs(2), - cCurrentModuleObject, - cAlphaFieldNames(2), - state.dataZoneTempPredictorCorrector->HumidityControlZoneUniqueNames, - ErrorsFound); - - HumidityControlZone(HumidControlledZoneNum).ZoneName = cAlphaArgs(2); - HumidityControlZone(HumidControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItem(cAlphaArgs(2), Zone); - if (HumidityControlZone(HumidControlledZoneNum).ActualZoneNum == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } else { - state.dataHeatBal->Zone(HumidityControlZone(HumidControlledZoneNum).ActualZoneNum).humidityControlZoneIndex = HumidControlledZoneNum; - } - HumidityControlZone(HumidControlledZoneNum).HumidifyingSched = cAlphaArgs(3); - HumidityControlZone(HumidControlledZoneNum).HumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); - if (HumidityControlZone(HumidControlledZoneNum).HumidifyingSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" not found."); - ErrorsFound = true; - } - if (NumAlphas == 4) { - HumidityControlZone(HumidControlledZoneNum).DehumidifyingSched = cAlphaArgs(4); - HumidityControlZone(HumidControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(4)); - if (HumidityControlZone(HumidControlledZoneNum).DehumidifyingSchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + - "\" not found."); - ErrorsFound = true; - } - } else { - HumidityControlZone(HumidControlledZoneNum).DehumidifyingSched = cAlphaArgs(3); - HumidityControlZone(HumidControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); - } - - } // HumidControlledZoneNum - - // Start to read Thermal comfort control objects - cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::TCTStat)); - state.dataZoneCtrls->NumComfortTStatStatements = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - ComfortTStatObjects.allocate(state.dataZoneCtrls->NumComfortTStatStatements); - - // Pre-scan for use of Zone lists in TStat statements (i.e. Global application of TStat) - state.dataZoneCtrls->NumComfortControlledZones = 0; - errFlag = false; - for (Item = 1; Item <= state.dataZoneCtrls->NumComfortTStatStatements; ++Item) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Item, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - - Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - ZLItem = 0; - if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); - ComfortTStatObjects(Item).Name = cAlphaArgs(1); - if (Item1 > 0) { - ComfortTStatObjects(Item).ComfortControlledZoneStartPtr = state.dataZoneCtrls->NumComfortControlledZones + 1; - ++state.dataZoneCtrls->NumComfortControlledZones; - ComfortTStatObjects(Item).NumOfZones = 1; - ComfortTStatObjects(Item).ZoneListActive = false; - ComfortTStatObjects(Item).ZoneOrZoneListPtr = Item1; - } else if (ZLItem > 0) { - ComfortTStatObjects(Item).ComfortControlledZoneStartPtr = state.dataZoneCtrls->NumComfortControlledZones + 1; - state.dataZoneCtrls->NumComfortControlledZones += ZoneList(ZLItem).NumOfZones; - ComfortTStatObjects(Item).NumOfZones = ZoneList(ZLItem).NumOfZones; - ComfortTStatObjects(Item).ZoneListActive = true; - ComfortTStatObjects(Item).ZoneOrZoneListPtr = ZLItem; - } else { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - errFlag = true; - ErrorsFound = true; - } - } - - if (errFlag) { - ShowSevereError(state, "GetZoneAirSetpoints: Errors with invalid names in " + cCurrentModuleObject + " objects."); - ShowContinueError(state, "...These will not be read in. Other errors may occur."); - state.dataZoneCtrls->NumComfortControlledZones = 0; - } - - if (state.dataZoneCtrls->NumComfortControlledZones > 0) { - ComfortControlledZone.allocate(state.dataZoneCtrls->NumComfortControlledZones); - TComfortControlTypes.allocate(state.dataZoneCtrls->NumComfortControlledZones); // Number of set point types - CCmSchedMapToControlledZone.dimension(state.dataZoneCtrls->NumComfortControlledZones, 0); - - ComfortControlledZoneNum = 0; - for (Item = 1; Item <= state.dataZoneCtrls->NumComfortTStatStatements; ++Item) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Item, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - for (Item1 = 1; Item1 <= ComfortTStatObjects(Item).NumOfZones; ++Item1) { - ++ComfortControlledZoneNum; - if (ComfortTStatObjects(Item).ZoneListActive) { - cAlphaArgs(2) = state.dataHeatBal->Zone(ZoneList(ComfortTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name; - } - int ZoneAssigned = UtilityRoutines::FindItemInList( - cAlphaArgs(2), ComfortControlledZone, &DataZoneControls::ZoneComfortControls::ZoneName, ComfortControlledZoneNum - 1); - if (ZoneAssigned == 0) { - ComfortControlledZone(ComfortControlledZoneNum).ZoneName = cAlphaArgs(2); - ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" not found."); - ErrorsFound = true; - } - } else { - ComfortControlledZone(ComfortControlledZoneNum).ZoneName = cAlphaArgs(2); // for continuity - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" zone previously assigned."); - ShowContinueError(state, "...Zone was previously assigned to Thermostat=\"" + ComfortControlledZone(ZoneAssigned).Name + "\"."); - ErrorsFound = true; - continue; - } - - if (!ComfortTStatObjects(Item).ZoneListActive) { - ComfortControlledZone(ComfortControlledZoneNum).Name = cAlphaArgs(1); - } else { - ComfortControlledZone(ComfortControlledZoneNum).Name = - state.dataHeatBal->Zone(ZoneList(ComfortTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name + ' ' + - ComfortTStatObjects(Item).Name; - } - - // Read Fields A3 and A4 for averaging method - IZoneCount = 0; - for (i = 1; i <= state.dataHeatBal->TotPeople; ++i) { - if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == state.dataHeatBal->People(i).ZonePtr) { - ++IZoneCount; - } - } - // Could not find a people object for this particular zone - if (IZoneCount == 0 && ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum > 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " no PEOPLE in " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" - cannot use Comfort Control."); - ErrorsFound = true; - } - ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::NO; - if (IZoneCount > 1) { - ComfortControlledZone(ComfortControlledZoneNum).AverageMethodName = cAlphaArgs(3); - if (UtilityRoutines::SameString(cAlphaArgs(3), "SpecificObject")) { - ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::SPE; - } - if (UtilityRoutines::SameString(cAlphaArgs(3), "ObjectAverage")) { - ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::OBJ; - } - if (UtilityRoutines::SameString(cAlphaArgs(3), "PeopleAverage")) { - ComfortControlledZone(ComfortControlledZoneNum).AverageMethod = DataZoneControls::AverageMethod::PEO; - } - if (ComfortControlledZone(ComfortControlledZoneNum).AverageMethod == DataZoneControls::AverageMethod::NO) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\"."); - ShowContinueError(state, "Allowed keys are SpecificObject, ObjectAverage, or PeopleAverage"); - ErrorsFound = true; - } - if (ComfortControlledZone(ComfortControlledZoneNum).AverageMethod == DataZoneControls::AverageMethod::SPE) { - ComfortControlledZone(ComfortControlledZoneNum).AverageObjectName = cAlphaArgs(4); - if (UtilityRoutines::FindItem(cAlphaArgs(4), state.dataHeatBal->People) == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + - "\"."); - ErrorsFound = true; - } else { - ComfortControlledZone(ComfortControlledZoneNum).SpecificObjectNum = - UtilityRoutines::FindItem(cAlphaArgs(4), state.dataHeatBal->People); - } - } - } else { - for (i = 1; i <= state.dataHeatBal->TotPeople; ++i) { - if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == state.dataHeatBal->People(i).ZonePtr) break; - } - ComfortControlledZone(ComfortControlledZoneNum).SpecificObjectNum = i; - } - // Check values used for thermal comfort calculation - for (i = 1; i <= state.dataHeatBal->TotPeople; ++i) { - if (ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum == state.dataHeatBal->People(i).ZonePtr) { - // Check activity level - if (state.dataHeatBal->People(i).ActivityLevelPtr > 0) { - ValidScheduleControlType = - CheckScheduleValueMinMax(state, state.dataHeatBal->People(i).ActivityLevelPtr, ">=", 72.0, "<=", 909.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - "GetPeople Activity Level: Invalid activity level values entered for thermal comfort calculation"); - ShowContinueError(state, "Outside of range values [72,909], Reference object=" + state.dataHeatBal->People(i).Name); - ErrorsFound = true; - } - } else { - ShowSevereError(state, - "GetPeople Activity Level: Activity level schedule is not found=" + state.dataHeatBal->People(i).Name); - ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); - ErrorsFound = true; - } - // Check Work Efficiency - if (state.dataHeatBal->People(i).WorkEffPtr > 0) { - ValidScheduleControlType = CheckScheduleValueMinMax(state, state.dataHeatBal->People(i).WorkEffPtr, ">=", 0.0, "<=", 1.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - "GetPeople work efficiency: Invalid work efficiency values entered for thermal comfort calculation"); - ShowContinueError(state, "Outside of range values [0,1], Reference object=" + state.dataHeatBal->People(i).Name); - ErrorsFound = true; - } - } else { - ShowSevereError(state, - "GetPeople work efficiency: Work efficiency schedule is not found=" + state.dataHeatBal->People(i).Name); - ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); - ErrorsFound = true; - } - // Check Clothing Insulation - if (state.dataHeatBal->People(i).ClothingPtr > 0) { - ValidScheduleControlType = CheckScheduleValueMinMax(state, state.dataHeatBal->People(i).ClothingPtr, ">", 0.0, "<=", 2.0); - if (!ValidScheduleControlType) { - ShowSevereError( - state, - "GetPeople Clothing Insulation: Invalid Clothing Insulation values entered for thermal comfort calculation"); - ShowContinueError(state, "Outside of range values [0.0,2.0], Reference object=" + state.dataHeatBal->People(i).Name); - ErrorsFound = true; - } - } else { - ShowSevereError(state, - "GetPeople Clothing Insulation: Clothing Insulation schedule is not found=" + - state.dataHeatBal->People(i).Name); - ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); - ErrorsFound = true; - } - // Check Air velocity - if (state.dataHeatBal->People(i).AirVelocityPtr <= 0) { - ShowSevereError(state, "GetPeople Air Velocity: Air velocity schedule is not found=" + state.dataHeatBal->People(i).Name); - ShowContinueError(state, "Required when the zone has Thermal Comfort Controls."); - ErrorsFound = true; - } - } - } - - // Read Max and Min temperature setpoint - if (NumNums > 0) { - ComfortControlledZone(ComfortControlledZoneNum).TdbMinSetPoint = rNumericArgs(1); - if (rNumericArgs(1) > 50 || rNumericArgs(1) < 0) { - ShowSevereError( - state, - format("{}=\"{} invalid {}=[{:.0T}].", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(1), rNumericArgs(1))); - ShowContinueError(state, "..Allowable values must be between 0 C and 50 C"); - ErrorsFound = true; - } - } - if (NumNums > 1) { - ComfortControlledZone(ComfortControlledZoneNum).TdbMaxSetPoint = rNumericArgs(2); - if (rNumericArgs(2) > 50 || rNumericArgs(2) < 0) { - ShowSevereError( - state, - format("{}=\"{} invalid {}=[{:.0T}].", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(2), rNumericArgs(2))); - ShowContinueError(state, "..Allowable values must be between 0 C and 50 C"); - ErrorsFound = true; - } - } - // Ensure MaxTemp >= MinTemp - if (ComfortControlledZone(ComfortControlledZoneNum).TdbMinSetPoint > ComfortControlledZone(ComfortControlledZoneNum).TdbMaxSetPoint) { - ShowSevereError(state, cCurrentModuleObject + "=\"" + cAlphaArgs(1)); - ShowContinueError(state, ".." + cNumericFieldNames(1) + " > " + cNumericFieldNames(2)); - ShowContinueError(state, format("..[{:.0T}] > [{:.0T}].", rNumericArgs(1), rNumericArgs(2))); - ErrorsFound = true; - } - // If MaxTemp = MinTemp, no thermal comfort control - if (ComfortControlledZone(ComfortControlledZoneNum).TdbMinSetPoint == - ComfortControlledZone(ComfortControlledZoneNum).TdbMaxSetPoint) { - ShowSevereError(state, cCurrentModuleObject + "=\"" + cAlphaArgs(1)); - ShowContinueError(state, ".." + cNumericFieldNames(1) + " = " + cNumericFieldNames(2)); - ShowContinueError(state, "The zone will be controlled using this dry-bulb temperature setpoint."); - } - // read Thermal comfort type schedule name - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName = cAlphaArgs(5); - ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex = GetScheduleIndex(state, cAlphaArgs(5)); - if (ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + - "\" not found."); - ErrorsFound = true; - } else { - // Check validity of control types. - ValidScheduleControlType = - CheckScheduleValueMinMax(state, ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex, ">=", 0.0, "<=", 4.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid range " + cAlphaFieldNames(5) + "=\"" + - cAlphaArgs(5) + "\""); - ShowContinueError(state, "..contains values outside of range [0,4]."); - ErrorsFound = true; - } - } - ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes = nint((NumAlphas - 5.0) / 2.0); - ComfortControlledZone(ComfortControlledZoneNum).ControlType.allocate(ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - ComfortControlledZone(ComfortControlledZoneNum) - .ControlTypeName.allocate(ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - ComfortControlledZone(ComfortControlledZoneNum) - .ControlTypeSchIndx.allocate(ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - - for (ControlTypeNum = 1; ControlTypeNum <= ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes; ++ControlTypeNum) { - ComfortControlledZone(ComfortControlledZoneNum).ControlType(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 5)); - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ControlTypeNum) = cAlphaArgs(nint(2.0 * ControlTypeNum + 5)); - if (ComfortControlledZone(ComfortControlledZoneNum).ControlType(ControlTypeNum) != "") { - CTIndex = getEnumerationValue( - ValidComfortControlTypesUC, - UtilityRoutines::MakeUPPERCase(ComfortControlledZone(ComfortControlledZoneNum).ControlType(ControlTypeNum))); - if (CTIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + - cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 5)) + "=\"" + - cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 5)) + "\""); - ErrorsFound = true; - } - if (CTIndex > 4) { // For Fanger control only for the time being - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + - cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 5)) + "=\"" + - cAlphaArgs(nint(2.0 * ControlTypeNum - 1 + 5)) + "\""); - ShowContinueError(state, "..Fanger is the only valid model."); - ErrorsFound = true; - } - } else { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + - cAlphaFieldNames(nint(2.0 * ControlTypeNum - 1 + 5)) + "=\"\""); - ErrorsFound = true; - } - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ControlTypeNum) = 0; - } - } - } // NumComfortTStatStatements - } - // End of Thermal comfort control reading and checking - - cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)]; - state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls > 0) - state.dataZoneTempPredictorCorrector->SetPointSingleHeatingFanger.allocate( - state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleFangerHeatingControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &singleSetpointHtgFanger = state.dataZoneTempPredictorCorrector->SetPointSingleHeatingFanger(idx); - singleSetpointHtgFanger.Name = cAlphaArgs(1); - singleSetpointHtgFanger.PMVSchedName = cAlphaArgs(2); - singleSetpointHtgFanger.PMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (singleSetpointHtgFanger.PMVSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } else { - ValidScheduleControlType = CheckScheduleValueMinMax(state, singleSetpointHtgFanger.PMVSchedIndex, ">=", -3.0, "<=", 3.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + - cAlphaArgs(2) + "\" entered."); - ShowContinueError(state, "..Values outside of range [-3,+3]."); - ErrorsFound = true; - } - } - } // SingleFangerHeatingControlNum - - cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)]; - state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls > 0) { - state.dataZoneTempPredictorCorrector->SetPointSingleCoolingFanger.allocate( - state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls); - } - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleFangerCoolingControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &singleSetpointClgFanger = state.dataZoneTempPredictorCorrector->SetPointSingleCoolingFanger(idx); - singleSetpointClgFanger.Name = cAlphaArgs(1); - singleSetpointClgFanger.PMVSchedName = cAlphaArgs(2); - singleSetpointClgFanger.PMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (singleSetpointClgFanger.PMVSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } else { - ValidScheduleControlType = CheckScheduleValueMinMax(state, singleSetpointClgFanger.PMVSchedIndex, ">=", -3.0, "<=", 3.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + - cAlphaArgs(2) + "\" entered."); - ShowContinueError(state, "..Values outside of range [-3,+3]."); - ErrorsFound = true; - } - } - - } // SingleFangerCoolingControlNum - - cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)]; - state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls > 0) - state.dataZoneTempPredictorCorrector->SetPointSingleHeatCoolFanger.allocate( - state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleFangerHeatCoolControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &singleSetpointHeatCoolFanger = state.dataZoneTempPredictorCorrector->SetPointSingleHeatCoolFanger(idx); - singleSetpointHeatCoolFanger.Name = cAlphaArgs(1); - singleSetpointHeatCoolFanger.PMVSchedName = cAlphaArgs(2); - singleSetpointHeatCoolFanger.PMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (singleSetpointHeatCoolFanger.PMVSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } else { - ValidScheduleControlType = CheckScheduleValueMinMax(state, singleSetpointHeatCoolFanger.PMVSchedIndex, ">=", -3.0, "<=", 3.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + - cAlphaArgs(2) + "\" entered."); - ShowContinueError(state, "..Values outside of range [-3,+3]."); - ErrorsFound = true; - } - } - - } // SingleFangerHeatCoolControlNum - - cCurrentModuleObject = ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)]; - state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls > 0) - state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger.allocate( - state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls); - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumDualFangerHeatCoolControls; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - auto &dualSetpointHeatCoolFanger = state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(idx); - dualSetpointHeatCoolFanger.Name = cAlphaArgs(1); - dualSetpointHeatCoolFanger.HeatPMVSetptSchedName = cAlphaArgs(2); - dualSetpointHeatCoolFanger.HeatPMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (dualSetpointHeatCoolFanger.HeatPMVSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - dualSetpointHeatCoolFanger.CoolPMVSetptSchedName = cAlphaArgs(3); - dualSetpointHeatCoolFanger.CoolPMVSchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); - if (dualSetpointHeatCoolFanger.CoolPMVSchedIndex == 0) { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + "\" not found."); - ErrorsFound = true; - } else { - ValidScheduleControlType = CheckScheduleValueMinMax(state, dualSetpointHeatCoolFanger.HeatPMVSchedIndex, ">=", -3.0, "<=", 3.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(2) + "=\"" + - cAlphaArgs(2) + "\" entered."); - ShowContinueError(state, "..Values outside of range [-3,+3]."); - ErrorsFound = true; - } - ValidScheduleControlType = CheckScheduleValueMinMax(state, dualSetpointHeatCoolFanger.CoolPMVSchedIndex, ">=", -3.0, "<=", 3.0); - if (!ValidScheduleControlType) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid PMV values " + cAlphaFieldNames(3) + "=\"" + - cAlphaArgs(3) + "\" entered."); - ShowContinueError(state, "..Values outside of range [-3,+3]."); - ErrorsFound = true; - } - } - - } // DualFangerHeatCoolControlNum - - // Finish filling in Schedule pointing indexes for Thermal Comfort Control - for (ComfortControlledZoneNum = 1; ComfortControlledZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++ComfortControlledZoneNum) { - - int ComfortIndex = UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)], - ComfortControlledZone(ComfortControlledZoneNum).ControlType, - ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeating = ComfortIndex; - if (ComfortIndex > 0) { - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = - UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), - state.dataZoneTempPredictorCorrector->SetPointSingleHeatingFanger); - TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)] = true; - } - - ComfortIndex = UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)], - ComfortControlledZone(ComfortControlledZoneNum).ControlType, - ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleCooling = ComfortIndex; - if (ComfortIndex > 0) { - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = - UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), - state.dataZoneTempPredictorCorrector->SetPointSingleCoolingFanger); - TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)] = true; - } - - ComfortIndex = UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)], - ComfortControlledZone(ComfortControlledZoneNum).ControlType, - ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeatCool = ComfortIndex; - if (ComfortIndex > 0) { - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = - UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), - state.dataZoneTempPredictorCorrector->SetPointSingleHeatCoolFanger); - TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)] = true; - } - - ComfortIndex = - UtilityRoutines::FindItem(ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)], - ComfortControlledZone(ComfortControlledZoneNum).ControlType, - ComfortControlledZone(ComfortControlledZoneNum).NumControlTypes); - ComfortControlledZone(ComfortControlledZoneNum).SchIndx_DualSetPointWithDeadBand = ComfortIndex; - if (ComfortIndex > 0) { - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex) = - UtilityRoutines::FindItem(ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex), - state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger); - TComfortControlTypes(ComfortControlledZoneNum).MustHave[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)] = - true; - } - } - - // Now, Check the schedule values/indices for validity for Thermal Comfort Control - - for (ComfortControlledZoneNum = 1; ComfortControlledZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++ComfortControlledZoneNum) { - - ActualZoneNum = ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum; - CTIndex = ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex; - if (CTIndex == 0) continue; // error will be caught elsewhere - SchedMin = GetScheduleMinValue(state, CTIndex); - SchedMax = GetScheduleMaxValue(state, CTIndex); - - if (SchedMin == 0 && SchedMax == 0) { - if (FindNumberInList(CTIndex, CCmSchedMapToControlledZone, state.dataZoneCtrls->NumComfortControlledZones) == 0) { - ShowWarningError(state, "Control Type Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, "..specifies control type 0 for all entries."); - ShowContinueError(state, "All zones using this Control Type Schedule have no thermal comfort control."); - } - CCmSchedMapToControlledZone(ComfortControlledZoneNum) = CTIndex; - } - - for (ControlTypeNum = SchedMin; ControlTypeNum <= SchedMax; ++ControlTypeNum) { - - int ComfortIndex; - switch (static_cast(ControlTypeNum)) { - case DataHVACGlobals::ThermostatType::Uncontrolled: - break; - case DataHVACGlobals::ThermostatType::SingleHeating: - ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeating; - TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)] = true; - if (ComfortIndex != 0) { - SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); - if (SchedTypeIndex == 0) { - ShowSevereError(state, - format("GetZoneAirSetpoints: Could not find {} Schedule={}", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)], - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); - ErrorsFound = true; - } - } else { // ComfortIndex = 0 - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeating))) { - ShowSevereError(state, "Control Type Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies thermal control type 1 ({}) as the control type. Not valid for this zone.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleCooling; - TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)] = true; - if (ComfortIndex != 0) { - SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); - if (SchedTypeIndex == 0) { - ShowSevereError(state, - format("GetZoneAirSetpoints: Could not find {} Schedule={}", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)], - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); - ErrorsFound = true; - } - } else { // ComfortIndex = 0 - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleCooling))) { - ShowSevereError(state, "Control Type Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies thermal control type 2 ({}) as the control type. Not valid for this zone.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_SingleHeatCool; - TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)] = true; - if (ComfortIndex != 0) { - SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); - if (SchedTypeIndex == 0) { - ShowSevereError(state, - format("GetZoneAirSetpoints: Could not find {} Schedule={}", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)], - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); - ErrorsFound = true; - } - } else { // ComfortIndex = 0 - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool))) { - ShowSevereError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("..specifies thermal control type 3 ({}) as the control type. Not valid for this zone.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - ComfortIndex = ComfortControlledZone(ComfortControlledZoneNum).SchIndx_DualSetPointWithDeadBand; - TComfortControlTypes(ComfortControlledZoneNum).DidHave[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)] = - true; - if (ComfortIndex != 0) { - SchedTypeIndex = ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchIndx(ComfortIndex); - if (SchedTypeIndex == 0) { - ShowSevereError(state, - format("GetZoneAirSetpoints: Could not find {} Schedule={}", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)], - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeName(ComfortIndex))); - ErrorsFound = true; - } - } else { // ComfortIndex = 0 - if (CheckScheduleValue(state, CTIndex, static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand))) { - ShowSevereError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError( - state, - format("..specifies thermal control type 4 ({}) as the control type. Not valid for this zone.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - ErrorsFound = true; - } - } - break; - default: - ShowSevereError(state, - format("GetZoneAirSetpoints: Illegal control type for Zone={}, Found value={}, in Schedule={}", - Zone(ActualZoneNum).Name, - ControlTypeNum, - ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName)); - ShowContinueError(state, "..valid range values are [0,4]."); - ErrorsFound = true; - break; - } - } - } - - for (ComfortControlledZoneNum = 1; ComfortControlledZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++ComfortControlledZoneNum) { - - ActualZoneNum = ComfortControlledZone(ComfortControlledZoneNum).ActualZoneNum; - CTIndex = ComfortControlledZone(ComfortControlledZoneNum).ComfortSchedIndex; - if (CTIndex == 0) continue; // error caught elsewhere -- would just be confusing here - - for (ControlTypeNum = 1; ControlTypeNum <= 4; ++ControlTypeNum) { - if (TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum] && - TComfortControlTypes(ComfortControlledZoneNum).DidHave[ControlTypeNum]) - continue; - - switch (static_cast(ControlTypeNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 1 ({}) but does not.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeating)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 2 ({}) but does not.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleCooling)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 3 ({}) but does not.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - if (!TComfortControlTypes(ComfortControlledZoneNum).MustHave[ControlTypeNum]) continue; - ShowWarningError(state, "Schedule=" + ComfortControlledZone(ComfortControlledZoneNum).ControlTypeSchedName); - ShowContinueError(state, - format("...should include control type 4 ({}) but does not.", - ValidComfortControlTypes[static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand)])); - ShowContinueError(state, - "..reference " + cZControlTypes(static_cast(ZoneControlTypes::TCTStat)) + '=' + - ComfortControlledZone(ComfortControlledZoneNum).Name); - ShowContinueError(state, "..reference ZONE=" + ComfortControlledZone(ComfortControlledZoneNum).ZoneName); - break; - default: - break; - } - } - } - - if (allocated(TComfortControlTypes)) TComfortControlTypes.deallocate(); - - // Get the Hybrid Model setting inputs - HybridModel::GetHybridModelZone(state); - - // Default multiplier values - Real64 ZoneVolCapMultpSens = 1.0; - Real64 ZoneVolCapMultpMoist = 1.0; - Real64 ZoneVolCapMultpCO2 = 1.0; - Real64 ZoneVolCapMultpGenContam = 1.0; - - // Get the Zone Air Capacitance Multiplier for use in the Predictor-Corrector Procedure - cCurrentModuleObject = "ZoneCapacitanceMultiplier:ResearchSpecial"; - int NumZoneCapaMultiplier = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); // Number of ZonesCapacityMultiplier object - if (NumZoneCapaMultiplier == 0) { - // Assign default multiplier values to all zones - for (int ZoneNum = 1; ZoneNum <= NumOfZones; ZoneNum++) { - Zone(ZoneNum).ZoneVolCapMultpSens = ZoneVolCapMultpSens; - Zone(ZoneNum).ZoneVolCapMultpMoist = ZoneVolCapMultpMoist; - Zone(ZoneNum).ZoneVolCapMultpCO2 = ZoneVolCapMultpCO2; - Zone(ZoneNum).ZoneVolCapMultpGenContam = ZoneVolCapMultpGenContam; - } - - } else { - - // Allow user to specify ZoneCapacitanceMultiplier:ResearchSpecial at zone level - // Added by S. Lee and R. Zhang in Oct. 2016. - // Assign the user inputted multipliers to specified zones - for (int ZoneCapNum = 1; ZoneCapNum <= NumZoneCapaMultiplier; ZoneCapNum++) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - ZoneCapNum, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - - if (lAlphaFieldBlanks(2)) { - // default multiplier values for all the zones not specified (zone or zonelist name field is empty) - ZoneVolCapMultpSens = rNumericArgs(1); - ZoneVolCapMultpMoist = rNumericArgs(2); - ZoneVolCapMultpCO2 = rNumericArgs(3); - ZoneVolCapMultpGenContam = rNumericArgs(4); - } else { - // multiplier values for the specified zone(s) - int ZoneNum = 0; - ZLItem = 0; - Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); - if (Item1 > 0) { - ZoneNum = Item1; - Zone(ZoneNum).FlagCustomizedZoneCap = true; - Zone(ZoneNum).ZoneVolCapMultpSens = rNumericArgs(1); - Zone(ZoneNum).ZoneVolCapMultpMoist = rNumericArgs(2); - Zone(ZoneNum).ZoneVolCapMultpCO2 = rNumericArgs(3); - Zone(ZoneNum).ZoneVolCapMultpGenContam = rNumericArgs(4); - } else if (ZLItem > 0) { - for (int ZonePtrNum = 1; ZonePtrNum < ZoneList(ZLItem).NumOfZones; ZonePtrNum++) { - ZoneNum = ZoneList(ZLItem).Zone(ZonePtrNum); - Zone(ZoneNum).FlagCustomizedZoneCap = true; - Zone(ZoneNum).ZoneVolCapMultpSens = rNumericArgs(1); - Zone(ZoneNum).ZoneVolCapMultpMoist = rNumericArgs(2); - Zone(ZoneNum).ZoneVolCapMultpCO2 = rNumericArgs(3); - Zone(ZoneNum).ZoneVolCapMultpGenContam = rNumericArgs(4); - } - - } else { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" not found."); - ErrorsFound = true; - } - } - } - - // Assign default multiplier values to all the other zones - for (int ZoneNum = 1; ZoneNum <= NumOfZones; ZoneNum++) { - if (!Zone(ZoneNum).FlagCustomizedZoneCap) { - Zone(ZoneNum).ZoneVolCapMultpSens = ZoneVolCapMultpSens; - Zone(ZoneNum).ZoneVolCapMultpMoist = ZoneVolCapMultpMoist; - Zone(ZoneNum).ZoneVolCapMultpCO2 = ZoneVolCapMultpCO2; - Zone(ZoneNum).ZoneVolCapMultpGenContam = ZoneVolCapMultpGenContam; - } - } - - // Calculate the average multiplier value from all zones - { - Real64 ZoneVolCapMultpSens_temp = 0.0; - Real64 ZoneVolCapMultpMoist_temp = 0.0; - Real64 ZoneVolCapMultpCO2_temp = 0.0; - Real64 ZoneVolCapMultpGenContam_temp = 0.0; - - for (int ZoneNum = 1; ZoneNum <= NumOfZones; ZoneNum++) { - ZoneVolCapMultpSens_temp += Zone(ZoneNum).ZoneVolCapMultpSens; - ZoneVolCapMultpMoist_temp += Zone(ZoneNum).ZoneVolCapMultpMoist; - ZoneVolCapMultpCO2_temp += Zone(ZoneNum).ZoneVolCapMultpCO2; - ZoneVolCapMultpGenContam_temp += Zone(ZoneNum).ZoneVolCapMultpGenContam; - } - - if (NumOfZones > 0) { - ZoneVolCapMultpSens = ZoneVolCapMultpSens_temp / NumOfZones; - ZoneVolCapMultpMoist = ZoneVolCapMultpMoist_temp / NumOfZones; - ZoneVolCapMultpCO2 = ZoneVolCapMultpCO2_temp / NumOfZones; - ZoneVolCapMultpGenContam = ZoneVolCapMultpGenContam_temp / NumOfZones; - } - } - } - - print(state.files.eio, Header); - print(state.files.eio, Format_701, ZoneVolCapMultpSens, ZoneVolCapMultpMoist, ZoneVolCapMultpCO2, ZoneVolCapMultpGenContam); - - cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::OTTStat)); - state.dataZoneCtrls->NumOpTempControlledZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneCtrls->NumOpTempControlledZones > 0) { - state.dataZoneCtrls->AnyOpTempControl = true; - - for (int idx = 1; idx <= state.dataZoneCtrls->NumOpTempControlledZones; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - // find matching name of ZONECONTROL:THERMOSTAT object - found = UtilityRoutines::FindItem(cAlphaArgs(1), TStatObjects); - if (found == 0) { - // It might be in the TempControlledZones - found = UtilityRoutines::FindItem(cAlphaArgs(1), TempControlledZone); - if (found == 0) { // throw error - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + - cZControlTypes(static_cast(ZoneControlTypes::TStat)) + " reference not found."); - ErrorsFound = true; - } else { - TempControlledZoneNum = found; - TempControlledZone(TempControlledZoneNum).OperativeTempControl = true; - if (UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled")) { - TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled = true; - } - if ((!(UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled"))) && (!(UtilityRoutines::SameString(cAlphaArgs(2), "Constant")))) { - ShowSevereError( - state, cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\"."); - ErrorsFound = true; - } - - TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction = rNumericArgs(1); - TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched = GetScheduleIndex(state, cAlphaArgs(3)); - if ((TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched == 0) && - (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled)) { // throw error - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + - "\" not found."); - ErrorsFound = true; - } - - // check validity of fixed radiative fraction - if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction < 0.0) && - (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be negative.", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction >= 0.9) && - (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot >= .9.", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - - // check schedule min max. - if (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled) { - ValidRadFractSched = CheckScheduleValueMinMax( - state, TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched, ">=", 0.0, "<", 0.9); - if (!ValidRadFractSched) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(3) + "=[" + - cAlphaArgs(3) + "\"."); - ShowContinueError(state, "..Values outside of range [0.0,0.9)."); - ErrorsFound = true; - } - } - - // added Jan, 2017 - Xuan Luo - // read adaptive comfort model and calculate adaptive thermal comfort setpoint - if (TempControlledZone(TempControlledZoneNum).OperativeTempControl) { - if (NumAlphas >= 4 && !lAlphaFieldBlanks(4)) { - int adaptiveComfortModelTypeIndex = - UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); - if (!adaptiveComfortModelTypeIndex) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + - cAlphaArgs(4) + "\" not found."); - ErrorsFound = true; - } else if (adaptiveComfortModelTypeIndex != static_cast(AdaptiveComfortModel::ADAP_NONE)) { - TempControlledZone(TempControlledZoneNum).AdaptiveComfortTempControl = true; - TempControlledZone(TempControlledZoneNum).AdaptiveComfortModelTypeIndex = - UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); - if (!state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule.initialized) { - Array1D runningAverageASH(state.dataWeatherManager->NumDaysInYear, 0.0); - Array1D runningAverageCEN(state.dataWeatherManager->NumDaysInYear, 0.0); - CalculateMonthlyRunningAverageDryBulb(state, runningAverageASH, runningAverageCEN); - CalculateAdaptiveComfortSetPointSchl(state, runningAverageASH, runningAverageCEN); - } - } - } - } - - // CurrentModuleObject='ZoneControl:Thermostat:OperativeTemperature' - SetupOutputVariable(state, - "Zone Thermostat Operative Temperature", - OutputProcessor::Unit::C, - state.dataHeatBal->ZnAirRpt(TempControlledZone(TempControlledZoneNum).ActualZoneNum).ThermOperativeTemp, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - Zone(TempControlledZone(TempControlledZoneNum).ActualZoneNum).Name); - } - } else { - for (Item = 1; Item <= TStatObjects(found).NumOfZones; ++Item) { - TempControlledZoneNum = TStatObjects(found).TempControlledZoneStartPtr + Item - 1; - if (NumTempControlledZones == 0) continue; - TempControlledZone(TempControlledZoneNum).OperativeTempControl = true; - if (UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled")) { - TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled = true; - } - if (Item == 1) { - if ((!(UtilityRoutines::SameString(cAlphaArgs(2), "Scheduled"))) && - (!(UtilityRoutines::SameString(cAlphaArgs(2), "Constant")))) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\"."); - ErrorsFound = true; - } - } - - TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction = rNumericArgs(1); - TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched = GetScheduleIndex(state, cAlphaArgs(3)); - if (Item == 1) { - if ((TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched == 0) && - (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled)) { // throw error - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + - "\" not found."); - ErrorsFound = true; - } - } - - // check validity of fixed radiative fraction - if (Item == 1) { - if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction < 0.0) && - (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be negative.", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - } - if (Item == 1) { - if ((TempControlledZone(TempControlledZoneNum).FixedRadiativeFraction >= 0.9) && - (!(TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot >= .9.", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - } - - // check schedule min max. - if (Item == 1) { - if (TempControlledZone(TempControlledZoneNum).OpTempCntrlModeScheduled) { - ValidRadFractSched = CheckScheduleValueMinMax( - state, TempControlledZone(TempControlledZoneNum).OpTempRadiativeFractionSched, ">=", 0.0, "<", 0.9); - if (!ValidRadFractSched) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(3) + "=[" + - cAlphaArgs(3) + "\"."); - ShowContinueError(state, "..Values outside of range [0.0,0.9)."); - ErrorsFound = true; - } - } - } - - // added Jan, 2017 - Xuan Luo - // read adaptive comfort model and calculate adaptive thermal comfort setpoint - if (TempControlledZone(TempControlledZoneNum).OperativeTempControl) { - if (NumAlphas >= 4 && !lAlphaFieldBlanks(4)) { - int adaptiveComfortModelTypeIndex = - UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); - if (!adaptiveComfortModelTypeIndex) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + - cAlphaArgs(4) + "\" not found."); - ErrorsFound = true; - } else if (adaptiveComfortModelTypeIndex != static_cast(AdaptiveComfortModel::ADAP_NONE)) { - TempControlledZone(TempControlledZoneNum).AdaptiveComfortTempControl = true; - TempControlledZone(TempControlledZoneNum).AdaptiveComfortModelTypeIndex = - UtilityRoutines::FindItem(cAlphaArgs(4), AdaptiveComfortModelTypes, AdaptiveComfortModelTypes.isize()); - if (!state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule.initialized) { - Array1D runningAverageASH(state.dataWeatherManager->NumDaysInYear, 0.0); - Array1D runningAverageCEN(state.dataWeatherManager->NumDaysInYear, 0.0); - CalculateMonthlyRunningAverageDryBulb(state, runningAverageASH, runningAverageCEN); - CalculateAdaptiveComfortSetPointSchl(state, runningAverageASH, runningAverageCEN); - } - } - } - } - - // CurrentModuleObject='ZoneControl:Thermostat:OperativeTemperature' - SetupOutputVariable(state, - "Zone Thermostat Operative Temperature", - OutputProcessor::Unit::C, - state.dataHeatBal->ZnAirRpt(TempControlledZone(TempControlledZoneNum).ActualZoneNum).ThermOperativeTemp, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - Zone(TempControlledZone(TempControlledZoneNum).ActualZoneNum).Name); - } // TStat Objects Loop - } // found thermostat referene - } // loop over NumOpTempControlledZones - } // NumOpTempControlledZones > 0 - - // Overcool dehumidificaton GetInput starts here - cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::TandHStat)); - state.dataZoneCtrls->NumTempAndHumidityControlledZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - - if (state.dataZoneCtrls->NumTempAndHumidityControlledZones > 0) { - state.dataZoneCtrls->AnyZoneTempAndHumidityControl = true; - - for (int idx = 1; idx <= state.dataZoneCtrls->NumTempAndHumidityControlledZones; ++idx) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - idx, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - // find matching name of ZONECONTROL:THERMOSTAT object - found = UtilityRoutines::FindItem(cAlphaArgs(1), TStatObjects); - if (found == 0) { - // It might be in the TempControlledZones - found = UtilityRoutines::FindItem(cAlphaArgs(1), TempControlledZone); - if (found == 0) { // throw error - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + - cZControlTypes(static_cast(ZoneControlTypes::TStat)) + " reference not found."); - ErrorsFound = true; - } else { - TempControlledZoneNum = found; - TempControlledZone(TempControlledZoneNum).DehumidifyingSched = cAlphaArgs(2); - TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" not found."); - ErrorsFound = true; - } - TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = true; - if ((UtilityRoutines::SameString(cAlphaArgs(3), "None"))) { - TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = false; - } - if (UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled")) { - TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled = true; - } - if ((!(UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled"))) && (!(UtilityRoutines::SameString(cAlphaArgs(4), "Constant")))) { - ShowSevereError( - state, cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + "\"."); - ErrorsFound = true; - } - - TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange = rNumericArgs(1); - TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex = GetScheduleIndex(state, cAlphaArgs(4)); - if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex == 0) && - (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled)) { // throw error - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + - "\" not found."); - ErrorsFound = true; - } - - // check validity of zone Overcool constant range - if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange < 0.0) && - (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be negative.", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange > 3.0) && - (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be > 3.0", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - - // check zone Overcool range schedule min/max values. - if (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled) { - ValidZoneOvercoolRangeSched = CheckScheduleValueMinMax( - state, TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex, ">=", 0.0, "<=", 3.0); - if (!ValidZoneOvercoolRangeSched) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(5) + "=[" + - cAlphaArgs(5) + "\"."); - ShowContinueError(state, "..Values outside of range [0.0,3.0]."); - ErrorsFound = true; - } - } - // check Overcool Control Ratio limits - TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio = rNumericArgs(2); - if (TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio < 0.0) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be negative.", - cCurrentModuleObject, - cAlphaArgs(2), - cNumericFieldNames(2), - rNumericArgs(2))); - ErrorsFound = true; - } - } - } else { - for (Item = 1; Item <= TStatObjects(found).NumOfZones; ++Item) { - TempControlledZoneNum = TStatObjects(found).TempControlledZoneStartPtr + Item - 1; - TempControlledZone(TempControlledZoneNum).DehumidifyingSched = cAlphaArgs(2); - TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex = GetScheduleIndex(state, cAlphaArgs(2)); - if (TempControlledZone(TempControlledZoneNum).DehumidifyingSchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" not found."); - ErrorsFound = true; - } - TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = true; - if ((UtilityRoutines::SameString(cAlphaArgs(3), "None"))) { - TempControlledZone(TempControlledZoneNum).ZoneOvercoolControl = false; - } - if (UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled")) { - TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled = false; - } - if (Item == 1) { - if ((!(UtilityRoutines::SameString(cAlphaArgs(4), "Scheduled"))) && - (!(UtilityRoutines::SameString(cAlphaArgs(4), "Constant")))) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + - "\"."); - ErrorsFound = true; - } - } - TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange = rNumericArgs(1); - TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex = GetScheduleIndex(state, cAlphaArgs(6)); - if (Item == 1) { - if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex == 0) && - (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled)) { // throw error - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid " + cAlphaFieldNames(5) + "=\"" + cAlphaArgs(5) + - "\" not found."); - ErrorsFound = true; - } - } - // check validity of zone Overcool constant range - if (Item == 1) { - if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange < 0.0) && - (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be negative.", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - } - if (Item == 1) { - if ((TempControlledZone(TempControlledZoneNum).ZoneOvercoolConstRange > 3.0) && - (!(TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled))) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot > 3.0", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(1), - rNumericArgs(1))); - ErrorsFound = true; - } - } - // check zone Overcool range schedule min/max values. - if (Item == 1) { - if (TempControlledZone(TempControlledZoneNum).OvercoolCntrlModeScheduled) { - ValidZoneOvercoolRangeSched = CheckScheduleValueMinMax( - state, TempControlledZone(TempControlledZoneNum).ZoneOvercoolRangeSchedIndex, ">=", 0.0, "<=", 3.0); - if (!ValidZoneOvercoolRangeSched) { - ShowSevereError(state, - cCurrentModuleObject + '=' + cAlphaArgs(1) + " invalid values " + cAlphaFieldNames(5) + "=[" + - cAlphaArgs(5) + "\"."); - ShowContinueError(state, "..Values outside of range [0.0,3.0]."); - ErrorsFound = true; - } - } - } - TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio = rNumericArgs(2); - // check Overcool Control Ratio limits - if (Item == 1) { - if (TempControlledZone(TempControlledZoneNum).ZoneOvercoolControlRatio < 0.0) { - ShowSevereError(state, - format("{}={} invalid {}=[{:.2T}\" cannot be negative.", - cCurrentModuleObject, - cAlphaArgs(2), - cNumericFieldNames(2), - rNumericArgs(2))); - ErrorsFound = true; - } - } - - } // TStat Objects Loop - } // found thermostat reference - } // loop over NumTempAndHumidityControlledZones - } // NumTempAndHumidityControlledZones > 0 - - // Staged thermostat control inputs start - cCurrentModuleObject = cZControlTypes(static_cast(ZoneControlTypes::StagedDual)); - NumStageControlledZones = inputProcessor->getNumObjectsFound(state, cCurrentModuleObject); - if (NumStageControlledZones > 0) state.dataZoneCtrls->StagedTStatObjects.allocate(NumStageControlledZones); - - // Pre-scan for use of Zone lists in TStat statements (i.e. Global application of TStat) - state.dataZoneTempPredictorCorrector->NumStageCtrZone = 0; - for (Item = 1; Item <= NumStageControlledZones; ++Item) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Item, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - UtilityRoutines::IsNameEmpty(state, cAlphaArgs(1), cCurrentModuleObject, ErrorsFound); - - state.dataZoneCtrls->StagedTStatObjects(Item).Name = cAlphaArgs(1); - Item1 = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - ZLItem = 0; - if (Item1 == 0 && state.dataHeatBal->NumOfZoneLists > 0) ZLItem = UtilityRoutines::FindItemInList(cAlphaArgs(2), ZoneList); - if (Item1 > 0) { - state.dataZoneCtrls->StagedTStatObjects(Item).StageControlledZoneStartPtr = state.dataZoneTempPredictorCorrector->NumStageCtrZone + 1; - ++state.dataZoneTempPredictorCorrector->NumStageCtrZone; - state.dataZoneCtrls->StagedTStatObjects(Item).NumOfZones = 1; - state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive = false; - state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr = Item1; - } else if (ZLItem > 0) { - state.dataZoneCtrls->StagedTStatObjects(Item).TempControlledZoneStartPtr = state.dataZoneTempPredictorCorrector->NumStageCtrZone + 1; - state.dataZoneTempPredictorCorrector->NumStageCtrZone += ZoneList(ZLItem).NumOfZones; - state.dataZoneCtrls->StagedTStatObjects(Item).NumOfZones = ZoneList(ZLItem).NumOfZones; - state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive = true; - state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr = ZLItem; - } else { - ShowSevereError( - state, cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + "\" not found."); - ErrorsFound = true; - } - } - - if (ErrorsFound) { - ShowSevereError(state, "GetStagedDualSetpoint: Errors with invalid names in " + cCurrentModuleObject + " objects."); - ShowContinueError(state, "...These will not be read in. Other errors may occur."); - state.dataZoneTempPredictorCorrector->NumStageCtrZone = 0; - } - - if (state.dataZoneTempPredictorCorrector->NumStageCtrZone > 0) { - StageControlledZone.allocate(state.dataZoneTempPredictorCorrector->NumStageCtrZone); - state.dataZoneCtrls->StageZoneLogic.dimension(NumOfZones, false); - - StageControlledZoneNum = 0; - for (Item = 1; Item <= NumStageControlledZones; ++Item) { - inputProcessor->getObjectItem(state, - cCurrentModuleObject, - Item, - cAlphaArgs, - NumAlphas, - rNumericArgs, - NumNums, - IOStat, - lNumericFieldBlanks, - lAlphaFieldBlanks, - cAlphaFieldNames, - cNumericFieldNames); - for (Item1 = 1; Item1 <= state.dataZoneCtrls->StagedTStatObjects(Item).NumOfZones; ++Item1) { - ++StageControlledZoneNum; - if (state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive) { - cAlphaArgs(2) = - state.dataHeatBal->Zone(ZoneList(state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name; - } - int ZoneAssigned = UtilityRoutines::FindItemInList( - cAlphaArgs(2), StageControlledZone, &DataZoneControls::ZoneStagedControls::ZoneName, StageControlledZoneNum - 1); - if (ZoneAssigned == 0) { - StageControlledZone(StageControlledZoneNum).ZoneName = cAlphaArgs(2); - StageControlledZone(StageControlledZoneNum).ActualZoneNum = UtilityRoutines::FindItemInList(cAlphaArgs(2), Zone); - if (StageControlledZone(StageControlledZoneNum).ActualZoneNum == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" not found."); - ErrorsFound = true; - } else { - // Zone(StageControlledZone(StageControlledZoneNum)%ActualZoneNum)%StageControlledZoneIndex = - // StageControlledZoneNum - } - state.dataZoneCtrls->StageZoneLogic(StageControlledZone(StageControlledZoneNum).ActualZoneNum) = true; - } else { - StageControlledZone(StageControlledZoneNum).ZoneName = cAlphaArgs(2); // for continuity - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(2) + "=\"" + cAlphaArgs(2) + - "\" zone previously assigned."); - ShowContinueError(state, "...Zone was previously assigned to Thermostat=\"" + StageControlledZone(ZoneAssigned).Name + "\"."); - ErrorsFound = true; - continue; - } - - if (!state.dataZoneCtrls->StagedTStatObjects(Item).ZoneListActive) { - StageControlledZone(StageControlledZoneNum).Name = cAlphaArgs(1); - } else { - CheckCreatedZoneItemName( - state, - RoutineName, - cCurrentModuleObject, - state.dataHeatBal->Zone(ZoneList(state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr).Zone(Item1)).Name, - ZoneList(state.dataZoneCtrls->StagedTStatObjects(Item).ZoneOrZoneListPtr).MaxZoneNameLength, - state.dataZoneCtrls->StagedTStatObjects(Item).Name, - StageControlledZone, - StageControlledZoneNum - 1, - StageControlledZone(StageControlledZoneNum).Name, - errFlag); - if (errFlag) ErrorsFound = true; - } - - StageControlledZone(StageControlledZoneNum).NumOfHeatStages = rNumericArgs(1); - if (rNumericArgs(1) < 1 || rNumericArgs(1) > 4) { - ShowSevereError( - state, - format("{}=\"{}\" invalid range {}=\"{:.0R}\"", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(1), rNumericArgs(1))); - ShowContinueError(state, "..contains values outside of range [1,4]."); - ErrorsFound = true; - } - - StageControlledZone(StageControlledZoneNum).HeatSetBaseSchedName = cAlphaArgs(3); - StageControlledZone(StageControlledZoneNum).HSBchedIndex = GetScheduleIndex(state, cAlphaArgs(3)); - if (Item1 == 1) { // only show error on first of several if zone list - if (StageControlledZone(StageControlledZoneNum).HSBchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(3) + "=\"" + cAlphaArgs(3) + - "\" not found."); - ErrorsFound = true; - } - } - - StageControlledZone(StageControlledZoneNum).HeatThroRange = rNumericArgs(2); - if (rNumericArgs(1) < 0.0) { - ShowSevereError(state, - format("{}=\"{}\" negative value is found at {}=\"{:.1R}\"", - cAlphaArgs(1), - cCurrentModuleObject, - cNumericFieldNames(2), - rNumericArgs(2))); - ShowContinueError(state, ".. The minimum value is 0."); - ErrorsFound = true; - } - - if (StageControlledZone(StageControlledZoneNum).NumOfHeatStages > 0) { - StageControlledZone(StageControlledZoneNum).HeatTOffset.allocate(StageControlledZone(StageControlledZoneNum).NumOfHeatStages); - for (i = 1; i <= StageControlledZone(StageControlledZoneNum).NumOfHeatStages; ++i) { - StageControlledZone(StageControlledZoneNum).HeatTOffset(i) = rNumericArgs(2 + i); - if (rNumericArgs(2 + i) > 0.0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" positive value is found at " + - format("{}=\"{:.1R}\"", cNumericFieldNames(2 + i), rNumericArgs(2 + i))); - ShowContinueError(state, ".. The maximum value is 0."); - ErrorsFound = true; - } - if (lNumericFieldBlanks(2 + i)) { - ShowSevereError(state, - cCurrentModuleObject + " object =" + cAlphaArgs(1) + ". The input of " + cNumericFieldNames(2 + i) + - " is required, but a blank is found."); - ErrorsFound = true; - } - if (i > 1) { - if (rNumericArgs(2 + i) >= rNumericArgs(1 + i)) { - ShowSevereError(state, - format(R"({}="{}" The value at {}="{:.1R}" has to be less than )", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(2 + i), - rNumericArgs(2 + i))); - ShowContinueError(state, format("{}=\"{:.1R}", cNumericFieldNames(1 + i), rNumericArgs(1 + i))); - ErrorsFound = true; - } - } - } - } - - StageControlledZone(StageControlledZoneNum).NumOfCoolStages = rNumericArgs(7); - if (rNumericArgs(7) < 1 || rNumericArgs(7) > 4) { - ShowSevereError( - state, - format("{}=\"{}\" invalid range {}=\"{:.0R}\"", cCurrentModuleObject, cAlphaArgs(1), cNumericFieldNames(7), rNumericArgs(7))); - ShowContinueError(state, "..contains values outside of range [1,4]."); - ErrorsFound = true; - } - - StageControlledZone(StageControlledZoneNum).CoolSetBaseSchedName = cAlphaArgs(4); - StageControlledZone(StageControlledZoneNum).CSBchedIndex = GetScheduleIndex(state, cAlphaArgs(4)); - if (Item1 == 1) { // only show error on first of several if zone list - if (StageControlledZone(StageControlledZoneNum).CSBchedIndex == 0) { - ShowSevereError(state, - cCurrentModuleObject + "=\"" + cAlphaArgs(1) + "\" invalid " + cAlphaFieldNames(4) + "=\"" + cAlphaArgs(4) + - "\" not found."); - ErrorsFound = true; - } - } - - StageControlledZone(StageControlledZoneNum).CoolThroRange = rNumericArgs(8); - if (rNumericArgs(8) < 0.0) { - ShowSevereError(state, - format("{}=\"{}\" negative value is found at {}=\"{:.1R}\"", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(8), - rNumericArgs(8))); - ShowContinueError(state, ".. The minumum value is 0."); - ErrorsFound = true; - } - - if (StageControlledZone(StageControlledZoneNum).NumOfCoolStages > 0) { - StageControlledZone(StageControlledZoneNum).CoolTOffset.allocate(StageControlledZone(StageControlledZoneNum).NumOfCoolStages); - for (i = 1; i <= StageControlledZone(StageControlledZoneNum).NumOfCoolStages; ++i) { - StageControlledZone(StageControlledZoneNum).CoolTOffset(i) = rNumericArgs(8 + i); - if (rNumericArgs(8 + i) < 0.0) { - ShowSevereError(state, - format("{}=\"{}\" negative value is found at {}=\"{:.1R}\"", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(8 + i), - rNumericArgs(8 + i))); - ShowContinueError(state, ".. The minimum value is 0."); - ErrorsFound = true; - } - if (lNumericFieldBlanks(8 + i)) { - ShowSevereError(state, - cCurrentModuleObject + " object =" + cAlphaArgs(1) + ". The input of " + cNumericFieldNames(8 + i) + - " is required, but a blank is found."); - ErrorsFound = true; - } - if (i > 1) { - if (rNumericArgs(8 + i) <= rNumericArgs(7 + i)) { - ShowSevereError(state, - format("{}=\"{}\" The value at {}=\"{:.1R}\" has to be greater than ", - cCurrentModuleObject, - cAlphaArgs(1), - cNumericFieldNames(8 + i), - rNumericArgs(8 + i))); - ShowContinueError(state, format("{}=\"{:.1R}", cNumericFieldNames(7 + i), rNumericArgs(7 + i))); - ErrorsFound = true; - } - } - } - } - } - } // loop over NumStageControlledZones - if ((inputProcessor->getNumObjectsFound(state, "AirLoopHVAC:UnitaryHeatPump:AirToAir:MultiSpeed") == 0) && - (inputProcessor->getNumObjectsFound(state, "AirLoopHVAC:UnitarySystem") == 0) && - (inputProcessor->getNumObjectsFound(state, "SetpointManager:SingleZone:OneStageCooling") == 0) && - (inputProcessor->getNumObjectsFound(state, "SetpointManager:SingleZone:OneStageHeating") == 0)) { - ShowWarningError(state, cCurrentModuleObject + " is applicable to only selected HVAC objects which are missing from input."); - ShowContinueError(state, "Model should include one or more of the following objects: "); - ShowContinueError(state, "AirLoopHVAC:UnitaryHeatPump:AirToAir:MultiSpeed, AirLoopHVAC:UnitarySystem, "); - ShowContinueError( - state, "SetpointManager:SingleZone:OneStageCooling, and/or SetpointManager:SingleZone:OneStageHeating. The simulation continues..."); - } - } // NumStageControlledZones > 0 - - if (ErrorsFound) { - ShowFatalError(state, "Errors getting Zone Control input data. Preceding condition(s) cause termination."); - } -} - -void CalculateMonthlyRunningAverageDryBulb(EnergyPlusData &state, Array1D &runningAverageASH, Array1D &runningAverageCEN) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Xuan Luo - // DATE WRITTEN January 2017 - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine calculate the monthly running average dry bulb temperature; - - // Using/Aliasing - - using OutputReportTabular::GetColumnUsingTabs; - using OutputReportTabular::StrToReal; - - // SUBROUTINE PARAMETER DEFINITIONS: - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - - std::string lineIn; - std::string lineAvg; - std::string epwLine; - - Real64 dryBulb; - Real64 avgDryBulb; - - int readStat; - int calcEndDay; - int calcStartDayASH; - int calcStartDayCEN; - - std::string::size_type pos; - int ind, i, j; - - Array1D adaptiveTemp(state.dataWeatherManager->NumDaysInYear, 0.0); - Array1D dailyDryTemp(state.dataWeatherManager->NumDaysInYear, 0.0); - - readStat = 0; - if (FileSystem::fileExists(state.files.inputWeatherFilePath.filePath)) { - // Read hourly dry bulb temperature first - auto epwFile = state.files.inputWeatherFilePath.open(state, "CalcThermalComfortAdaptive"); - for (i = 1; i <= 9; ++i) { // Headers - epwFile.readLine(); - } - for (i = 1; i <= state.dataWeatherManager->NumDaysInYear; ++i) { - avgDryBulb = 0.0; - for (j = 1; j <= 24; ++j) { - epwLine = epwFile.readLine().data; - for (ind = 1; ind <= 6; ++ind) { - pos = index(epwLine, ','); - epwLine.erase(0, pos + 1); - } - pos = index(epwLine, ','); - dryBulb = StrToReal(epwLine.substr(0, pos)); - avgDryBulb += (dryBulb / 24.0); - } - dailyDryTemp(i) = avgDryBulb; - } - epwFile.close(); - - // Calculate monthly running average dry bulb temperature. - int dayOfYear = 0; - while (dayOfYear < state.dataWeatherManager->NumDaysInYear) { - dayOfYear++; - calcEndDay = dayOfYear - 1; - calcStartDayASH = calcEndDay - 30; - calcStartDayCEN = calcEndDay - 7; - - if (calcStartDayASH > 0) { - for (i = calcStartDayASH; i <= calcStartDayASH + 30; i++) { - avgDryBulb = dailyDryTemp(i); - runningAverageASH(dayOfYear) = runningAverageASH(dayOfYear) + avgDryBulb; - } - runningAverageASH(dayOfYear) /= 30; - } else { // Do special things for wrapping the epw - calcStartDayASH += state.dataWeatherManager->NumDaysInYear; - for (i = 1; i <= calcEndDay; i++) { - avgDryBulb = dailyDryTemp(i); - runningAverageASH(dayOfYear) = runningAverageASH(dayOfYear) + avgDryBulb; - } - for (i = calcStartDayASH; i < state.dataWeatherManager->NumDaysInYear; i++) { - avgDryBulb = dailyDryTemp(i); - runningAverageASH(dayOfYear) = runningAverageASH(dayOfYear) + avgDryBulb; - } - runningAverageASH(dayOfYear) /= 30; - } - - if (calcStartDayCEN > 0) { - for (i = calcStartDayCEN; i <= calcStartDayCEN + 7; i++) { - avgDryBulb = dailyDryTemp(i); - runningAverageCEN(dayOfYear) = runningAverageCEN(dayOfYear) + avgDryBulb; - } - runningAverageCEN(dayOfYear) /= 7; - } else { // Do special things for wrapping the epw - calcStartDayCEN += state.dataWeatherManager->NumDaysInYear; - for (i = 1; i <= calcEndDay; i++) { - avgDryBulb = dailyDryTemp(i); - runningAverageCEN(dayOfYear) = runningAverageCEN(dayOfYear) + avgDryBulb; - } - for (i = calcStartDayCEN; i < state.dataWeatherManager->NumDaysInYear; i++) { - avgDryBulb = dailyDryTemp(i); - runningAverageCEN(dayOfYear) = runningAverageCEN(dayOfYear) + avgDryBulb; - } - runningAverageCEN(dayOfYear) /= 7; - } - } - } else { - ShowFatalError(state, - "CalcThermalComfortAdaptive: Could not open file " + state.files.inputWeatherFilePath.filePath.string() + - " for input (read). (File does not exist)"); - } -} - -void CalculateAdaptiveComfortSetPointSchl(EnergyPlusData &state, Array1D const &runningAverageASH, Array1D const &runningAverageCEN) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Xuan Luo - // DATE WRITTEN January 2017 - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine calculates the zone operative temperature setpoint using adaptive comfort model. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int constexpr summerDesignDayTypeIndex(9); - Real64 GrossApproxAvgDryBulbDesignDay(0.0); - - auto &AdapComfortDailySetPointSchedule = state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule; - auto &AdapComfortSetPointSummerDesDay = state.dataZoneTempPredictorCorrector->AdapComfortSetPointSummerDesDay; - - for (size_t i = 1; i <= state.dataWeatherManager->DesDayInput.size(); i++) { - // Summer design day - if (state.dataWeatherManager->DesDayInput(i).DayType == summerDesignDayTypeIndex) { - GrossApproxAvgDryBulbDesignDay = - (state.dataWeatherManager->DesDayInput(i).MaxDryBulb + - (state.dataWeatherManager->DesDayInput(i).MaxDryBulb - state.dataWeatherManager->DesDayInput(i).DailyDBRange)) / - 2.0; - if (GrossApproxAvgDryBulbDesignDay > 10 && GrossApproxAvgDryBulbDesignDay < 33.5) { - AdapComfortSetPointSummerDesDay[0] = 0.31 * GrossApproxAvgDryBulbDesignDay + 17.8; - AdapComfortSetPointSummerDesDay[1] = 0.31 * GrossApproxAvgDryBulbDesignDay + 20.3; - AdapComfortSetPointSummerDesDay[2] = 0.31 * GrossApproxAvgDryBulbDesignDay + 21.3; - } - if (GrossApproxAvgDryBulbDesignDay > 10 && GrossApproxAvgDryBulbDesignDay < 30) { - AdapComfortSetPointSummerDesDay[3] = 0.33 * GrossApproxAvgDryBulbDesignDay + 18.8; - AdapComfortSetPointSummerDesDay[4] = 0.33 * GrossApproxAvgDryBulbDesignDay + 20.8; - ; - AdapComfortSetPointSummerDesDay[5] = 0.33 * GrossApproxAvgDryBulbDesignDay + 21.8; - ; - AdapComfortSetPointSummerDesDay[6] = 0.33 * GrossApproxAvgDryBulbDesignDay + 22.8; - ; - } - } - } - - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central.allocate(state.dataWeatherManager->NumDaysInYear); - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90.allocate(state.dataWeatherManager->NumDaysInYear); - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80.allocate(state.dataWeatherManager->NumDaysInYear); - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central.allocate(state.dataWeatherManager->NumDaysInYear); - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I.allocate(state.dataWeatherManager->NumDaysInYear); - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II.allocate(state.dataWeatherManager->NumDaysInYear); - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III.allocate(state.dataWeatherManager->NumDaysInYear); - - // Calculate the set points based on different models, set flag as -1 when running average temperature is not in the range. - for (int day = 1; day <= state.dataWeatherManager->NumDaysInYear; day++) { - if (runningAverageASH(day) > 10 && runningAverageASH(day) < 33.5) { - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central(day) = 0.31 * runningAverageASH(day) + 17.8; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90(day) = 0.31 * runningAverageASH(day) + 20.3; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80(day) = 0.31 * runningAverageASH(day) + 21.3; - } else { - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central(day) = -1; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90(day) = -1; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80(day) = -1; - } - if (runningAverageCEN(day) > 10 && runningAverageCEN(day) < 30) { - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central(day) = 0.33 * runningAverageCEN(day) + 18.8; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I(day) = 0.33 * runningAverageCEN(day) + 20.8; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II(day) = 0.33 * runningAverageCEN(day) + 21.8; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III(day) = 0.33 * runningAverageCEN(day) + 22.8; - } else { - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central(day) = -1; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I(day) = -1; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II(day) = -1; - AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III(day) = -1; - } - } - AdapComfortDailySetPointSchedule.initialized = true; -} - -void InitZoneAirSetPoints(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Russell Taylor - // DATE WRITTEN September 1998 - // MODIFIED November 2004, M. J. Witte additional report variables - // MODIFIED L.Gu, May 2006 - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine initializes the data for the zone air setpoints. - - // METHODOLOGY EMPLOYED: - // Uses the status flags to trigger events. - - // SUBROUTINE PARAMETER DEFINITIONS: - static constexpr std::string_view RoutineName("InitZoneAirSetpoints: "); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - bool FirstSurfFlag; - int TRefFlag; // Flag for Reference Temperature process in Zones - - auto &ZoneList = state.dataHeatBal->ZoneList; - auto &TempControlledZone = state.dataZoneCtrls->TempControlledZone; - auto &TempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint; - auto &TempControlType = state.dataHeatBalFanSys->TempControlType; - auto &TempControlTypeRpt = state.dataHeatBalFanSys->TempControlTypeRpt; - auto &ComfortControlledZone = state.dataZoneCtrls->ComfortControlledZone; - auto &ZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo; - auto &ZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi; - auto &NumOfZones = state.dataGlobal->NumOfZones; - - if (state.dataZoneTempPredictorCorrector->InitZoneAirSetPointsOneTimeFlag) { - TempZoneThermostatSetPoint.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->AdapComfortCoolingSetPoint.dimension(NumOfZones, 0.0); - ZoneThermostatSetPointHi.dimension(NumOfZones, 0.0); - ZoneThermostatSetPointLo.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->ZoneThermostatSetPointHiAver.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->ZoneThermostatSetPointLoAver.dimension(NumOfZones, 0.0); - - state.dataHeatBalFanSys->LoadCorrectionFactor.dimension(NumOfZones, 0.0); - TempControlType.dimension(NumOfZones, DataHVACGlobals::ThermostatType::Uncontrolled); - TempControlTypeRpt.dimension(NumOfZones, 0); - if (state.dataZoneCtrls->NumComfortControlledZones > 0) { - state.dataHeatBalFanSys->ComfortControlType.dimension(NumOfZones, DataHVACGlobals::ThermostatType::Uncontrolled); - state.dataHeatBalFanSys->ComfortControlTypeRpt.dimension(NumOfZones, 0); - state.dataHeatBalFanSys->ZoneComfortControlsFanger.allocate(NumOfZones); - } - state.dataZoneEnergyDemand->Setback.dimension(NumOfZones, false); - state.dataZoneEnergyDemand->DeadBandOrSetback.dimension(NumOfZones, false); - state.dataZoneEnergyDemand->CurDeadBandOrSetback.dimension(NumOfZones, false); - - state.dataHeatBal->ZoneListSNLoadHeatEnergy.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); - state.dataHeatBal->ZoneListSNLoadCoolEnergy.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); - state.dataHeatBal->ZoneListSNLoadHeatRate.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); - state.dataHeatBal->ZoneListSNLoadCoolRate.dimension(state.dataHeatBal->NumOfZoneLists, 0.0); - - state.dataHeatBal->ZoneGroupSNLoadHeatEnergy.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); - state.dataHeatBal->ZoneGroupSNLoadCoolEnergy.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); - state.dataHeatBal->ZoneGroupSNLoadHeatRate.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); - state.dataHeatBal->ZoneGroupSNLoadCoolRate.dimension(state.dataHeatBal->NumOfZoneGroups, 0.0); - - // Hybrid modeling - state.dataHeatBalFanSys->PreviousMeasuredZT1.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->PreviousMeasuredZT2.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->PreviousMeasuredZT3.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->PreviousMeasuredHumRat1.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->PreviousMeasuredHumRat2.dimension(NumOfZones, 0.0); - state.dataHeatBalFanSys->PreviousMeasuredHumRat3.dimension(NumOfZones, 0.0); - - // Allocate Derived Types - state.dataZoneEnergyDemand->ZoneSysEnergyDemand.allocate(NumOfZones); - state.dataZoneEnergyDemand->ZoneSysMoistureDemand.allocate(NumOfZones); - if (state.dataHeatBal->doSpaceHeatBalanceSimulation || state.dataHeatBal->doSpaceHeatBalanceSizing) { - state.dataZoneEnergyDemand->spaceSysEnergyDemand.allocate(state.dataGlobal->numSpaces); - state.dataZoneEnergyDemand->spaceSysMoistureDemand.allocate(state.dataGlobal->numSpaces); - } - - for (int zoneNum = 1; zoneNum <= NumOfZones; ++zoneNum) { - FirstSurfFlag = true; - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - auto &thisSpace = state.dataHeatBal->space(spaceNum); - for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { - if (FirstSurfFlag) { - TRefFlag = state.dataSurface->SurfTAirRef(SurfNum); - FirstSurfFlag = false; - } - // for each particular zone, the reference air temperature(s) should be the same - // (either mean air, bulk air, or supply air temp). - if (state.dataSurface->SurfTAirRef(SurfNum) != TRefFlag) { - ShowWarningError(state, - "Different reference air temperatures for difference surfaces encountered in zone " + - state.dataHeatBal->Zone(zoneNum).Name); - } - } - } - } - - // CurrentModuleObject='Zone' - for (int zoneNum = 1; zoneNum <= NumOfZones; ++zoneNum) { - auto &thisZone = state.dataHeatBal->Zone(zoneNum); - state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).setUpOutputVars(state, DataStringGlobals::zonePrefix, thisZone.Name); - if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).setUpOutputVars( - state, DataStringGlobals::spacePrefix, state.dataHeatBal->space(spaceNum).Name); - } - } - bool staged = false; - if (allocated(state.dataZoneCtrls->StageZoneLogic)) { - staged = state.dataZoneCtrls->StageZoneLogic(zoneNum); - } - // If not doSpaceHeatBalanceSimulation then meter zones, not spaces - bool attachMeters = !state.dataHeatBal->doSpaceHeatBalanceSimulation; - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).setUpOutputVars( - state, DataStringGlobals::zonePrefix, thisZone.Name, staged, attachMeters, thisZone.Multiplier, thisZone.ListMultiplier); - if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { - // If doSpaceHeatBalanceSimulation then meter spaces, not zones - attachMeters = state.dataHeatBal->doSpaceHeatBalanceSimulation; - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).setUpOutputVars(state, - DataStringGlobals::spacePrefix, - state.dataHeatBal->space(spaceNum).Name, - staged, - attachMeters, - thisZone.Multiplier, - thisZone.ListMultiplier); - } - } - state.dataZoneEnergyDemand->ZoneSysMoistureDemand(zoneNum).setUpOutputVars(state, DataStringGlobals::zonePrefix, thisZone.Name); - if (state.dataHeatBal->doSpaceHeatBalanceSizing || state.dataHeatBal->doSpaceHeatBalanceSimulation) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneEnergyDemand->spaceSysMoistureDemand(spaceNum).setUpOutputVars( - state, DataStringGlobals::spacePrefix, state.dataHeatBal->space(spaceNum).Name); - } - } - SetupOutputVariable(state, - "Zone Thermostat Air Temperature", - OutputProcessor::Unit::C, - state.dataHeatBalFanSys->TempTstatAir(zoneNum), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Thermostat Control Type", - OutputProcessor::Unit::None, - TempControlTypeRpt(zoneNum), - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Thermostat Heating Setpoint Temperature", - OutputProcessor::Unit::C, - ZoneThermostatSetPointLo(zoneNum), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Thermostat Cooling Setpoint Temperature", - OutputProcessor::Unit::C, - ZoneThermostatSetPointHi(zoneNum), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Adaptive Comfort Operative Temperature Set Point", - OutputProcessor::Unit::C, - state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(zoneNum), - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Predicted Sensible Load Room Air Correction Factor", - OutputProcessor::Unit::None, - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - } // zoneNum - - // Thermal comfort control output - if (state.dataZoneCtrls->NumComfortControlledZones > 0) { - // CurrentModuleObject='ZoneControl:Thermostat:ThermalComfort' - for (int Loop = 1; Loop <= state.dataZoneCtrls->NumComfortControlledZones; ++Loop) { - int zoneNum = ComfortControlledZone(Loop).ActualZoneNum; - auto &thisZone = state.dataHeatBal->Zone(zoneNum); - SetupOutputVariable(state, - "Zone Thermal Comfort Control Type", - OutputProcessor::Unit::None, - state.dataHeatBalFanSys->ComfortControlTypeRpt(zoneNum), - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Thermal Comfort Control Fanger Low Setpoint PMV", - OutputProcessor::Unit::None, - state.dataHeatBalFanSys->ZoneComfortControlsFanger(zoneNum).LowPMV, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - SetupOutputVariable(state, - "Zone Thermal Comfort Control Fanger High Setpoint PMV", - OutputProcessor::Unit::None, - state.dataHeatBalFanSys->ZoneComfortControlsFanger(zoneNum).HighPMV, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::Average, - thisZone.Name); - } - } - - // CurrentModuleObject='ZoneList' - for (int Loop = 1; Loop <= state.dataHeatBal->NumOfZoneLists; ++Loop) { - SetupOutputVariable(state, - "Zone List Sensible Heating Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZoneListSNLoadHeatEnergy(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - ZoneList(Loop).Name); - SetupOutputVariable(state, - "Zone List Sensible Cooling Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZoneListSNLoadCoolEnergy(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - ZoneList(Loop).Name); - SetupOutputVariable(state, - "Zone List Sensible Heating Rate", - OutputProcessor::Unit::W, - state.dataHeatBal->ZoneListSNLoadHeatRate(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - ZoneList(Loop).Name); - SetupOutputVariable(state, - "Zone List Sensible Cooling Rate", - OutputProcessor::Unit::W, - state.dataHeatBal->ZoneListSNLoadCoolRate(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - ZoneList(Loop).Name); - } // Loop - - // CurrentModuleObject='ZoneGroup' - for (int Loop = 1; Loop <= state.dataHeatBal->NumOfZoneGroups; ++Loop) { - SetupOutputVariable(state, - "Zone Group Sensible Heating Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZoneGroupSNLoadHeatEnergy(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->ZoneGroup(Loop).Name); - SetupOutputVariable(state, - "Zone Group Sensible Cooling Energy", - OutputProcessor::Unit::J, - state.dataHeatBal->ZoneGroupSNLoadCoolEnergy(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - state.dataHeatBal->ZoneGroup(Loop).Name); - SetupOutputVariable(state, - "Zone Group Sensible Heating Rate", - OutputProcessor::Unit::W, - state.dataHeatBal->ZoneGroupSNLoadHeatRate(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->ZoneGroup(Loop).Name); - SetupOutputVariable(state, - "Zone Group Sensible Cooling Rate", - OutputProcessor::Unit::W, - state.dataHeatBal->ZoneGroupSNLoadCoolRate(Loop), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - state.dataHeatBal->ZoneGroup(Loop).Name); - } // Loop - - state.dataZoneTempPredictorCorrector->InitZoneAirSetPointsOneTimeFlag = false; - } - - // Do the Begin Environment initializations - if (state.dataZoneTempPredictorCorrector->MyEnvrnFlag && state.dataGlobal->BeginEnvrnFlag) { - for (auto &thisZoneHB : state.dataZoneTempPredictorCorrector->zoneHeatBalance) { - thisZoneHB.beginEnvironmentInit(state); - } - if (state.dataHeatBal->doSpaceHeatBalance) { - for (auto &thisSpaceHB : state.dataZoneTempPredictorCorrector->spaceHeatBalance) { - thisSpaceHB.beginEnvironmentInit(state); - } - } - TempZoneThermostatSetPoint = 0.0; - state.dataHeatBalFanSys->AdapComfortCoolingSetPoint = 0.0; - ZoneThermostatSetPointHi = 0.0; - ZoneThermostatSetPointLo = 0.0; - - state.dataHeatBalFanSys->LoadCorrectionFactor = 1.0; - TempControlType = DataHVACGlobals::ThermostatType::Uncontrolled; - for (auto &e : state.dataZoneEnergyDemand->ZoneSysEnergyDemand) { - e.beginEnvironmentInit(); - } - for (auto &e : state.dataZoneEnergyDemand->ZoneSysMoistureDemand) { - e.beginEnvironmentInit(); - } - if (state.dataHeatBal->doSpaceHeatBalance) { - for (auto &e : state.dataZoneEnergyDemand->spaceSysEnergyDemand) { - e.beginEnvironmentInit(); - } - for (auto &e : state.dataZoneEnergyDemand->spaceSysMoistureDemand) { - e.beginEnvironmentInit(); - } - } - - state.dataZoneEnergyDemand->DeadBandOrSetback = false; - - for (auto &e : state.dataHeatBal->Zone) - e.NoHeatToReturnAir = false; - state.dataHeatBalFanSys->PreviousMeasuredZT1 = 0.0; // Hybrid modeling - state.dataHeatBalFanSys->PreviousMeasuredZT2 = 0.0; // Hybrid modeling - state.dataHeatBalFanSys->PreviousMeasuredZT3 = 0.0; // Hybrid modeling - state.dataHeatBalFanSys->PreviousMeasuredHumRat1 = 0.0; // Hybrid modeling - state.dataHeatBalFanSys->PreviousMeasuredHumRat2 = 0.0; // Hybrid modeling - state.dataHeatBalFanSys->PreviousMeasuredHumRat3 = 0.0; // Hybrid modeling - - state.dataZoneTempPredictorCorrector->MyEnvrnFlag = false; - } - - if (!state.dataGlobal->BeginEnvrnFlag) { - state.dataZoneTempPredictorCorrector->MyEnvrnFlag = true; - } - - // Do the Begin Day initializations - if (state.dataZoneTempPredictorCorrector->MyDayFlag && state.dataGlobal->BeginDayFlag) { - state.dataZoneTempPredictorCorrector->MyDayFlag = false; - } - - if (!state.dataGlobal->BeginDayFlag) { - state.dataZoneTempPredictorCorrector->MyDayFlag = true; - } - - for (int Loop = 1; Loop <= state.dataZoneCtrls->NumTempControlledZones; ++Loop) { - if (state.dataZoneEquip->ZoneEquipInputsFilled && !state.dataZoneTempPredictorCorrector->ControlledZonesChecked) { - if (!VerifyControlledZoneForThermostat(state, TempControlledZone(Loop).ZoneName)) { - ShowSevereError(state, - format("{}Zone=\"{}\" has specified a Thermostatic control but is not a controlled zone.", - RoutineName, - TempControlledZone(Loop).ZoneName)); - ShowContinueError(state, "...must have a ZoneHVAC:EquipmentConnections specification for this zone."); - state.dataZoneTempPredictorCorrector->ErrorsFound = true; - } - } - - if (TempControlledZone(Loop).ManageDemand) { - int ZoneNum = TempControlledZone(Loop).ActualZoneNum; - - switch (TempControlType(ZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - if (TempZoneThermostatSetPoint(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) { - TempZoneThermostatSetPoint(ZoneNum) = TempControlledZone(Loop).HeatingResetLimit; - ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - } - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - if (TempZoneThermostatSetPoint(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit) { - TempZoneThermostatSetPoint(ZoneNum) = TempControlledZone(Loop).CoolingResetLimit; - ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - } - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - if ((TempZoneThermostatSetPoint(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) || - (TempZoneThermostatSetPoint(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit)) { - - TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; - TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); - ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - - if (ZoneThermostatSetPointLo(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) - ZoneThermostatSetPointLo(ZoneNum) = TempControlledZone(Loop).HeatingResetLimit; - if (ZoneThermostatSetPointHi(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit) - ZoneThermostatSetPointHi(ZoneNum) = TempControlledZone(Loop).CoolingResetLimit; - } - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - if (ZoneThermostatSetPointLo(ZoneNum) > TempControlledZone(Loop).HeatingResetLimit) - ZoneThermostatSetPointLo(ZoneNum) = TempControlledZone(Loop).HeatingResetLimit; - if (ZoneThermostatSetPointHi(ZoneNum) < TempControlledZone(Loop).CoolingResetLimit) - ZoneThermostatSetPointHi(ZoneNum) = TempControlledZone(Loop).CoolingResetLimit; - break; - default: - break; - } - } - } - - for (int Loop = 1; Loop <= state.dataZoneCtrls->NumComfortControlledZones; ++Loop) { - if (state.dataZoneEquip->ZoneEquipInputsFilled && !state.dataZoneTempPredictorCorrector->ControlledZonesChecked) { - if (!VerifyControlledZoneForThermostat(state, ComfortControlledZone(Loop).ZoneName)) { - ShowSevereError(state, - format("{}Zone=\"{}\" has specified a Comfort control but is not a controlled zone.", - RoutineName, - ComfortControlledZone(Loop).ZoneName)); - ShowContinueError(state, "...must have a ZoneHVAC:EquipmentConnections specification for this zone."); - state.dataZoneTempPredictorCorrector->ErrorsFound = true; - } - } - if (ComfortControlledZone(Loop).ManageDemand) { - int ZoneNum = ComfortControlledZone(Loop).ActualZoneNum; - - switch (state.dataHeatBalFanSys->ComfortControlType(ZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - if (TempZoneThermostatSetPoint(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) { - TempZoneThermostatSetPoint(ZoneNum) = ComfortControlledZone(Loop).HeatingResetLimit; - ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::SingleHeating; - TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); - } - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - if (TempZoneThermostatSetPoint(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit) { - TempZoneThermostatSetPoint(ZoneNum) = ComfortControlledZone(Loop).CoolingResetLimit; - ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::SingleCooling; - TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); - } - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - if ((TempZoneThermostatSetPoint(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) || - (TempZoneThermostatSetPoint(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit)) { - - TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; - TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); - ZoneThermostatSetPointLo(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - ZoneThermostatSetPointHi(ZoneNum) = TempZoneThermostatSetPoint(ZoneNum); - - if (ZoneThermostatSetPointLo(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) - ZoneThermostatSetPointLo(ZoneNum) = ComfortControlledZone(Loop).HeatingResetLimit; - if (ZoneThermostatSetPointHi(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit) - ZoneThermostatSetPointHi(ZoneNum) = ComfortControlledZone(Loop).CoolingResetLimit; - } - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - TempControlType(ZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; - TempControlTypeRpt(ZoneNum) = static_cast(TempControlType(ZoneNum)); - if (ZoneThermostatSetPointLo(ZoneNum) >= ComfortControlledZone(Loop).HeatingResetLimit) - ZoneThermostatSetPointLo(ZoneNum) = ComfortControlledZone(Loop).HeatingResetLimit; - if (ZoneThermostatSetPointHi(ZoneNum) <= ComfortControlledZone(Loop).CoolingResetLimit) - ZoneThermostatSetPointHi(ZoneNum) = ComfortControlledZone(Loop).CoolingResetLimit; - break; - default: - break; - } - } // Demand manager - } - - if (state.dataZoneTempPredictorCorrector->ErrorsFound) { - ShowFatalError(state, "InitZoneAirSetpoints - program terminates due to previous condition."); - } - - if (state.dataZoneEquip->ZoneEquipInputsFilled) { - state.dataZoneTempPredictorCorrector->ControlledZonesChecked = true; - } -} - -void ZoneSpaceHeatBalanceData::beginEnvironmentInit(EnergyPlusData &state) -{ - for (int i = 0; i <= 3; ++i) { - this->ZTM[i] = 0.0; - this->WPrevZoneTS[i] = state.dataEnvrn->OutHumRat; - this->DSWPrevZoneTS[i] = state.dataEnvrn->OutHumRat; - this->WPrevZoneTSTemp[i] = 0.0; - } - this->WZoneTimeMinusP = state.dataEnvrn->OutHumRat; - this->ZoneW1 = state.dataEnvrn->OutHumRat; - this->ZoneWMX = state.dataEnvrn->OutHumRat; - this->ZoneWM2 = state.dataEnvrn->OutHumRat; - this->ZoneAirHumRatTemp = 0.0; - this->TempIndZnLd = 0.0; - this->TempDepZnLd = 0.0; - this->ZoneAirRelHum = 0.0; - this->AirPowerCap = 0.0; - this->ZoneT1 = 0.0; -} - -void ZoneSpaceHeatBalanceData::setUpOutputVars(EnergyPlusData &state, std::string_view prefix, std::string_view name) -{ - SetupOutputVariable(state, - format("{} Air Temperature", prefix), - OutputProcessor::Unit::C, - this->ZT, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - name); - SetupOutputVariable(state, - format("{} Air Humidity Ratio", prefix), - OutputProcessor::Unit::None, - this->ZoneAirHumRat, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - name); - SetupOutputVariable(state, - format("{} Air Relative Humidity", prefix), - OutputProcessor::Unit::Perc, - this->ZoneAirRelHum, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Average, - name); -} - -void PredictSystemLoads(EnergyPlusData &state, - bool const ShortenTimeStepSys, - bool const UseZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step - Real64 const PriorTimeStep // the old value for timestep length is passed for possible use in interpolating -) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Russ Taylor - // DATE WRITTEN May 1997 - // MODIFIED na - // RE-ENGINEERED July 2003 (Peter Graham Ellis) - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine is responsible for determining - // how much of each type of energy every zone requires. - // In effect, this subroutine defines and simulates all - // the system types and in the case of hybrid systems - // which use more than one type of energy must determine - // how to apportion the load. An example of a hybrid system - // is a water loop heat pump with supplemental air. In - // this case, a zone will require water from the loop and - // cooled or heated air from the air system. A simpler - // example would be a VAV system with baseboard heaters. - - // Basic Air System Types - // 1) Constant Volume Single Duct - // 2) Variable Volume Single Duct - // 3) Constant Volume Dual Duct - // 4) Variable Volume Dual Duct - - // METHODOLOGY EMPLOYED: - // 0. Determine if simulation has downstepped and readjust history and revert node results - // 1. Determine zone load - this is zone temperature dependent - // 2. Determine balance point - the temperature at which the - // zone load is balanced by the system output. The way the - // balance point is determined will be different depending on - // the type of system being simulated. - // 3. Calculate zone energy requirements - - // Staged thermostat setpoint - if (state.dataZoneTempPredictorCorrector->NumStageCtrZone > 0) { - for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneTempPredictorCorrector->NumStageCtrZone; ++RelativeZoneNum) { - auto &thisStageControlZone = state.dataZoneCtrls->StageControlledZone(RelativeZoneNum); - int ActualZoneNum = thisStageControlZone.ActualZoneNum; - auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ActualZoneNum); - auto &thisZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum); - auto &thisZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum); - Real64 ZoneT = thisZoneHB.MAT; // Zone temperature at previous time step - if (ShortenTimeStepSys) ZoneT = thisZoneHB.XMPT; - thisStageControlZone.HeatSetPoint = ScheduleManager::GetCurrentScheduleValue(state, thisStageControlZone.HSBchedIndex); - thisStageControlZone.CoolSetPoint = ScheduleManager::GetCurrentScheduleValue(state, thisStageControlZone.CSBchedIndex); - if (thisStageControlZone.HeatSetPoint >= thisStageControlZone.CoolSetPoint) { - ++thisStageControlZone.StageErrCount; - if (thisStageControlZone.StageErrCount < 2) { - ShowWarningError(state, - "ZoneControl:Thermostat:StagedDualSetpoint: The heating setpoint is equal to or above the cooling setpoint in " + - thisStageControlZone.Name); - ShowContinueError(state, "The zone heating setpoint is set to the cooling setpoint - 0.1C."); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } else { - ShowRecurringWarningErrorAtEnd(state, - "The heating setpoint is still above the cooling setpoint", - thisStageControlZone.StageErrIndex, - thisStageControlZone.HeatSetPoint, - thisStageControlZone.HeatSetPoint); - } - thisStageControlZone.HeatSetPoint = thisStageControlZone.CoolSetPoint - 0.1; //??????????? - } - // Determine either cooling or heating - if (thisStageControlZone.CoolSetPoint < ZoneT) { // Cooling - Real64 SetpointOffset = ZoneT - thisStageControlZone.CoolSetPoint; - int Itemp = 0; - for (int I = 1; I <= thisStageControlZone.NumOfCoolStages; ++I) { - if (SetpointOffset >= thisStageControlZone.CoolTOffset(I)) { - Itemp = -I; - } - } - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum = Itemp; - if (SetpointOffset >= 0.5 * thisStageControlZone.CoolThroRange) { - thisZoneThermostatSetPointHi = thisStageControlZone.CoolSetPoint - 0.5 * thisStageControlZone.CoolThroRange; - } else { - thisZoneThermostatSetPointHi = thisStageControlZone.CoolSetPoint + 0.5 * thisStageControlZone.CoolThroRange; - } - thisZoneThermostatSetPointLo = thisZoneThermostatSetPointHi; - } else if (thisStageControlZone.HeatSetPoint > ZoneT) { // heating - Real64 SetpointOffset = ZoneT - thisStageControlZone.HeatSetPoint; - int Itemp = 0; - for (int I = 1; I <= thisStageControlZone.NumOfHeatStages; ++I) { - if (std::abs(SetpointOffset) >= std::abs(thisStageControlZone.HeatTOffset(I))) { - Itemp = I; - } - } - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum = Itemp; - if (std::abs(SetpointOffset) >= 0.5 * thisStageControlZone.CoolThroRange) { - thisZoneThermostatSetPointLo = thisStageControlZone.HeatSetPoint + 0.5 * thisStageControlZone.HeatThroRange; - } else { - thisZoneThermostatSetPointLo = thisStageControlZone.HeatSetPoint - 0.5 * thisStageControlZone.HeatThroRange; - } - thisZoneThermostatSetPointHi = thisZoneThermostatSetPointLo; - } else { - thisZoneThermostatSetPointHi = thisStageControlZone.CoolSetPoint + 0.5 * thisStageControlZone.CoolThroRange; - thisZoneThermostatSetPointLo = thisStageControlZone.HeatSetPoint - 0.5 * thisStageControlZone.HeatThroRange; - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum = 0; - } - // SpaceHB TODO: For now, set space stagenum to zone stagenum - later need to see what space the thermostat is in - if (state.dataHeatBal->doSpaceHeatBalance) { - for (int spaceNum : state.dataHeatBal->Zone(ActualZoneNum).spaceIndexes) { - state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).StageNum = - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ActualZoneNum).StageNum; - } - } - } - } - - // Setpoint revision for onoff thermostat - if (state.dataZoneTempPredictorCorrector->NumOnOffCtrZone > 0) { - Real64 TempTole = 0.02; - Real64 Tprev; - for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumTempControlledZones; ++RelativeZoneNum) { - auto &thisTempControlledZone = state.dataZoneCtrls->TempControlledZone(RelativeZoneNum); - if (thisTempControlledZone.DeltaTCutSet > 0.0) { - if (ShortenTimeStepSys) { - thisTempControlledZone.HeatModeLast = thisTempControlledZone.HeatModeLastSave; - thisTempControlledZone.CoolModeLast = thisTempControlledZone.CoolModeLastSave; - } else { - thisTempControlledZone.HeatModeLastSave = thisTempControlledZone.HeatModeLast; - thisTempControlledZone.CoolModeLastSave = thisTempControlledZone.CoolModeLast; - } - auto &thisTempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint(thisTempControlledZone.ActualZoneNum); - auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(thisTempControlledZone.ActualZoneNum); - auto &thisZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(thisTempControlledZone.ActualZoneNum); - auto &thisZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(thisTempControlledZone.ActualZoneNum); - - thisTempControlledZone.CoolOffFlag = false; - thisTempControlledZone.HeatOffFlag = false; - if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::ThirdOrder) { - Tprev = thisZoneHB.MAT; - if (ShortenTimeStepSys) Tprev = thisZoneHB.XMPT; - } else { - Tprev = thisZoneHB.ZoneT1; - } - - switch (state.dataHeatBalFanSys->TempControlType(thisTempControlledZone.ActualZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo; - thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; - if (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + TempTole) { - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; - thisZoneThermostatSetPointLo = thisTempZoneThermostatSetPoint; - } else if (Tprev > thisTempControlledZone.ZoneThermostatSetPointLo && - (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet - TempTole)) { - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; - thisZoneThermostatSetPointLo = thisTempZoneThermostatSetPoint; - } else { - thisTempControlledZone.HeatOffFlag = true; - } - if (thisTempControlledZone.HeatModeLast && Tprev > thisTempControlledZone.ZoneThermostatSetPointLo) { - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointLo; - thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; - thisTempControlledZone.HeatOffFlag = true; - } - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi; - thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; - if (Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - TempTole) { - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; - thisZoneThermostatSetPointHi = thisTempZoneThermostatSetPoint; - } else if (Tprev < thisTempControlledZone.ZoneThermostatSetPointHi && - Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet + TempTole) { - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; - thisZoneThermostatSetPointHi = thisTempZoneThermostatSetPoint; - } else { - thisTempControlledZone.CoolOffFlag = true; - } - if (thisTempControlledZone.CoolModeLast && Tprev < thisTempControlledZone.ZoneThermostatSetPointHi) { - thisTempZoneThermostatSetPoint = thisTempControlledZone.ZoneThermostatSetPointHi; - thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; - thisTempControlledZone.CoolOffFlag = true; - } - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; - thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; - if (Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - TempTole) { - thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; - } else if (Tprev < thisTempControlledZone.ZoneThermostatSetPointHi && - Tprev > thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet + TempTole) { - thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi - thisTempControlledZone.DeltaTCutSet; - } else { - thisTempControlledZone.CoolOffFlag = true; - } - if (thisTempControlledZone.CoolModeLast && Tprev < thisTempControlledZone.ZoneThermostatSetPointHi) { - thisZoneThermostatSetPointHi = thisTempControlledZone.ZoneThermostatSetPointHi; - thisTempControlledZone.CoolOffFlag = true; - } - - if (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + TempTole) { - thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; - } else if (Tprev > thisTempControlledZone.ZoneThermostatSetPointLo && - (Tprev < thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet - TempTole)) { - thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo + thisTempControlledZone.DeltaTCutSet; - } else { - thisTempControlledZone.HeatOffFlag = true; - } - if (thisTempControlledZone.HeatModeLast && Tprev > thisTempControlledZone.ZoneThermostatSetPointLo) { - thisZoneThermostatSetPointLo = thisTempControlledZone.ZoneThermostatSetPointLo; - thisTempControlledZone.HeatOffFlag = true; - } - // check setpoint for both and provde an error message - if (thisZoneThermostatSetPointLo >= thisZoneThermostatSetPointHi) { - ShowSevereError(state, - "DualSetPointWithDeadBand: When Temperature Difference Between Cutout And Setpoint is applied, the heating " - "setpoint is greater than the cooling setpoint. "); - ShowContinueErrorTimeStamp(state, "occurs in Zone=" + state.dataHeatBal->Zone(thisTempControlledZone.ActualZoneNum).Name); - ShowContinueError(state, format("Zone Heating ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointLo)); - ShowContinueError(state, format("Zone Cooling ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointHi)); - ShowFatalError(state, "Program terminates due to above conditions."); - } - break; - default: - break; - } - } - } - } - - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).predictSystemLoad( - state, ShortenTimeStepSys, UseZoneTimeStepHistory, PriorTimeStep, zoneNum); - if (state.dataHeatBal->doSpaceHeatBalance) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).predictSystemLoad( - state, ShortenTimeStepSys, UseZoneTimeStepHistory, PriorTimeStep, zoneNum, spaceNum); - } - } - } - if (state.dataZoneTempPredictorCorrector->NumOnOffCtrZone > 0) { - for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumTempControlledZones; ++RelativeZoneNum) { - auto &thisTempControlledZone = state.dataZoneCtrls->TempControlledZone(RelativeZoneNum); - if (thisTempControlledZone.DeltaTCutSet > 0.0) { - int ZoneNum = thisTempControlledZone.ActualZoneNum; - if (thisTempControlledZone.CoolOffFlag && state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneNum).TotalOutputRequired >= 0.0) { - thisTempControlledZone.CoolModeLast = true; - } else { - thisTempControlledZone.CoolModeLast = false; - } - if (thisTempControlledZone.HeatOffFlag && state.dataZoneEnergyDemand->ZoneSysEnergyDemand(ZoneNum).TotalOutputRequired <= 0.0) { - thisTempControlledZone.HeatModeLast = true; - } else { - thisTempControlledZone.HeatModeLast = false; - } - } - } - } -} -void ZoneSpaceHeatBalanceData::predictSystemLoad( - EnergyPlusData &state, - bool const shortenTimeStepSys, - bool const useZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step - Real64 const priorTimeStep, // the old value for timestep length is passed for possible use in interpolating - int zoneNum, - int spaceNum) -{ - assert(zoneNum > 0); - this->updateTemperatures(state, shortenTimeStepSys, useZoneTimeStepHistory, priorTimeStep, zoneNum, spaceNum); - - Real64 volume = 0.0; - if (spaceNum > 0) { - volume = state.dataHeatBal->space(spaceNum).Volume; - } else { - volume = state.dataHeatBal->Zone(zoneNum).Volume; - } - this->AirPowerCap = volume * state.dataHeatBal->Zone(zoneNum).ZoneVolCapMultpSens * - Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->MAT, this->ZoneAirHumRat) * - Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat) / (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); - Real64 RAFNFrac = 0.0; - - // Calculate the various heat balance sums - - // NOTE: SumSysMCp and SumSysMCpT are not used in the predict step - this->calcZoneOrSpaceSums(state, false, zoneNum, spaceNum); - - // Sum all convective internal gains except for people: SumIntGainExceptPeople - if (spaceNum == 0 && state.dataHybridModel->FlagHybridModel_PC) { - this->SumIntGainExceptPeople = 0.0; - this->SumIntGainExceptPeople = InternalHeatGains::SumAllInternalConvectionGainsExceptPeople(state, zoneNum); - } - - this->TempDepCoef = this->SumHA + this->SumMCp; - this->TempIndCoef = this->SumIntGain + this->SumHATsurf - this->SumHATref + this->SumMCpT + this->SysDepZoneLoadsLagged; - this->TempHistoryTerm = this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2]); - this->TempDepZnLd = (11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef; - this->TempIndZnLd = this->TempHistoryTerm + this->TempIndCoef; - if (state.dataRoomAirMod->anyNonMixingRoomAirModel) { - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - // RoomAirflowNetworkModel - make dynamic term independent of TimeStepSys - auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); - if (thisRoomAirflowNetworkZoneInfo.IsUsed) { - int RoomAirNode = thisRoomAirflowNetworkZoneInfo.ControlAirNodeID; - RoomAirModelAirflowNetwork::LoadPredictionRoomAirModelAirflowNetwork(state, zoneNum, RoomAirNode); - this->TempDepCoef = - thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumHA + thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumLinkMCp; - this->TempIndCoef = thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumIntSensibleGain + - thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumHATsurf - - thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumHATref + - thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SumLinkMCpT + - thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).SysDepZoneLoadsLagged; - this->AirPowerCap = thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).AirVolume * - state.dataHeatBal->Zone(zoneNum).ZoneVolCapMultpSens * thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).RhoAir * - thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).CpAir / - (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); - this->TempHistoryTerm = this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2]); - this->TempDepZnLd = (11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef; - this->TempIndZnLd = this->TempHistoryTerm + this->TempIndCoef; - if (thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).HasHVACAssigned) - RAFNFrac = thisRoomAirflowNetworkZoneInfo.Node(RoomAirNode).HVAC(1).SupplyFraction; - } - } - } - - // Exact solution or Euler method - state.dataHVACGlobal->ShortenTimeStepSysRoomAir = false; - if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) { - if (shortenTimeStepSys && state.dataHVACGlobal->TimeStepSys < state.dataGlobal->TimeStepZone) { - if (state.dataHVACGlobal->PreviousTimeStep < state.dataGlobal->TimeStepZone) { - this->ZoneT1 = this->ZoneTM2; - this->ZoneW1 = this->ZoneWM2; - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); - for (int LoopNode = 1; LoopNode <= thisRoomAirflowNetworkZoneInfo.NumOfAirNodes; ++LoopNode) { - thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempT1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempTM2; - thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatW1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatWM2; - } - } - } else { - this->ZoneT1 = this->ZoneTMX; - this->ZoneW1 = this->ZoneWMX; - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); - for (int LoopNode = 1; LoopNode <= thisRoomAirflowNetworkZoneInfo.NumOfAirNodes; ++LoopNode) { - thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempT1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempTMX; - thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatW1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatWMX; - } - } - } - state.dataHVACGlobal->ShortenTimeStepSysRoomAir = true; - } else { - this->ZoneT1 = this->ZT; - this->ZoneW1 = this->ZoneAirHumRat; - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - auto &thisRoomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); - for (int LoopNode = 1; LoopNode <= thisRoomAirflowNetworkZoneInfo.NumOfAirNodes; ++LoopNode) { - thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTempT1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).AirTemp; - thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRatW1 = thisRoomAirflowNetworkZoneInfo.Node(LoopNode).HumRat; - } - } - } - this->TempDepZnLd = this->TempDepCoef; - this->TempIndZnLd = this->TempIndCoef; - } - - // Calculate the predicted zone load to be provided by the system with the given desired zone air temperature - this->calcPredictedSystemLoad(state, RAFNFrac, zoneNum, spaceNum); - - // Calculate the predicted zone load to be provided by the system with the given desired humidity ratio - this->calcPredictedHumidityRatio(state, RAFNFrac, zoneNum, spaceNum); -} - -void CalcZoneAirTempSetPoints(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Russ Taylor - // DATE WRITTEN Nov 1997 - // MODIFIED Aug 2013, Xiufeng Pang (XP) - Added code for updating set points during - // optimum start period - // RE-ENGINEERED na - - // PURPOSE OF THIS SUBROUTINE: - // This routine sets what the setpoints for each controlled zone should be based on schedules. - // This is called each time step. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int RelativeZoneNum; - int ActualZoneNum; - int TempControlSchedIndex; - int SetPointTempSchedIndexHot; - int SetPointTempSchedIndexCold; - int SchedNameIndex; - Array2D DaySPValues; // Day room temp setpoint values - for optimum start - int OccStartTime; // Occupancy start time - for optimum start - Real64 DeltaT; // Temperature difference between cutout and setpoint - - auto &Zone = state.dataHeatBal->Zone; - auto &TempControlledZone = state.dataZoneCtrls->TempControlledZone; - auto &TempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint; - auto &TempControlType = state.dataHeatBalFanSys->TempControlType; - auto &TempControlTypeRpt = state.dataHeatBalFanSys->TempControlTypeRpt; - auto &ZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo; - auto &ZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi; - auto &NumOfZones = state.dataGlobal->NumOfZones; - - TempControlType = DataHVACGlobals::ThermostatType::Uncontrolled; // Default - - // Place holder for occupied heating and cooling set points - for optimum start - if (!allocated(state.dataZoneCtrls->OccRoomTSetPointHeat)) { - state.dataZoneCtrls->OccRoomTSetPointHeat.allocate(NumOfZones); - } - if (!allocated(state.dataZoneCtrls->OccRoomTSetPointCool)) { - state.dataZoneCtrls->OccRoomTSetPointCool.allocate(NumOfZones); - } - state.dataZoneCtrls->OccRoomTSetPointHeat = 0.0; - state.dataZoneCtrls->OccRoomTSetPointCool = 100.0; - DeltaT = 0.0; - - for (RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumTempControlledZones; ++RelativeZoneNum) { - - // What if this zone not controlled??? - ActualZoneNum = TempControlledZone(RelativeZoneNum).ActualZoneNum; - TempControlSchedIndex = TempControlledZone(RelativeZoneNum).CTSchedIndex; - TempControlType(ActualZoneNum) = - static_cast(ScheduleManager::GetCurrentScheduleValue(state, TempControlSchedIndex)); - TempControlTypeRpt(ActualZoneNum) = static_cast(TempControlType(ActualZoneNum)); - // Error detection for these values is done in the Get routine - - switch (TempControlType(ActualZoneNum)) { - case DataHVACGlobals::ThermostatType::Uncontrolled: - break; - case DataHVACGlobals::ThermostatType::SingleHeating: - SchedNameIndex = TempControlledZone(RelativeZoneNum).SchIndx_SingleHeatSetPoint; - TempZoneThermostatSetPoint(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SchedNameIndex); - TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointLo = TempZoneThermostatSetPoint(ActualZoneNum); - - AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); - ZoneThermostatSetPointLo(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - SchedNameIndex = TempControlledZone(RelativeZoneNum).SchIndx_SingleCoolSetPoint; - TempZoneThermostatSetPoint(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SchedNameIndex); - TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointHi = TempZoneThermostatSetPoint(ActualZoneNum); - - // Added Jan 17 (X. Luo) - // Adjust operative temperature based on adaptive comfort model - if ((TempControlledZone(RelativeZoneNum).AdaptiveComfortTempControl)) { - AdjustOperativeSetPointsforAdapComfort(state, RelativeZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); - state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - } - - AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); - ZoneThermostatSetPointHi(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - - AdjustCoolingSetPointforTempAndHumidityControl(state, RelativeZoneNum, ActualZoneNum); - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - - SchedNameIndex = TempControlledZone(RelativeZoneNum).SchIndx_SingleHeatCoolSetPoint; - - TempZoneThermostatSetPoint(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SchedNameIndex); - - // Added Jan 17 (X. Luo) - // Adjust operative temperature based on adaptive comfort model - if ((TempControlledZone(RelativeZoneNum).AdaptiveComfortTempControl)) { - AdjustOperativeSetPointsforAdapComfort(state, RelativeZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); - state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - } - - AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, TempZoneThermostatSetPoint(ActualZoneNum)); - - ZoneThermostatSetPointHi(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - ZoneThermostatSetPointLo(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - - // Change the room set point to occupied set point during optimum start period-------------- - - if (allocated(state.dataHVACGlobal->OptStartData.OptStartFlag)) { - if (!allocated(DaySPValues)) { - DaySPValues.allocate(state.dataGlobal->NumOfTimeStepInHour, 24); - } - if (state.dataHVACGlobal->OptStartData.ActualZoneNum(ActualZoneNum) == ActualZoneNum) { - ScheduleManager::GetScheduleValuesForDay(state, SetPointTempSchedIndexCold, DaySPValues); - OccStartTime = CEILING(state.dataHVACGlobal->OptStartData.OccStartTime(ActualZoneNum)) + 1; - TempZoneThermostatSetPoint(ActualZoneNum) = DaySPValues(1, OccStartTime); - } - - if (state.dataHVACGlobal->OptStartData.OptStartFlag(ActualZoneNum)) { - ZoneThermostatSetPointHi(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - ZoneThermostatSetPointLo(ActualZoneNum) = TempZoneThermostatSetPoint(ActualZoneNum); - } - } - //-------------------------------------------------------------------------------------------- - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - SetPointTempSchedIndexHot = TempControlledZone(RelativeZoneNum).SchIndx_DualSetPointWDeadBandHeat; - SetPointTempSchedIndexCold = TempControlledZone(RelativeZoneNum).SchIndx_DualSetPointWDeadBandCool; - - ZoneThermostatSetPointHi(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SetPointTempSchedIndexCold); - TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointHi = ZoneThermostatSetPointHi(ActualZoneNum); - - // Added Jan 17 (X. Luo) - // Adjust operative temperature based on adaptive comfort model - if ((TempControlledZone(RelativeZoneNum).AdaptiveComfortTempControl)) { - AdjustOperativeSetPointsforAdapComfort(state, RelativeZoneNum, ZoneThermostatSetPointHi(ActualZoneNum)); - state.dataHeatBalFanSys->AdapComfortCoolingSetPoint(ActualZoneNum) = ZoneThermostatSetPointHi(ActualZoneNum); - } - - AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, ZoneThermostatSetPointHi(ActualZoneNum)); - - ZoneThermostatSetPointLo(ActualZoneNum) = ScheduleManager::GetCurrentScheduleValue(state, SetPointTempSchedIndexHot); - TempControlledZone(RelativeZoneNum).ZoneThermostatSetPointLo = ZoneThermostatSetPointLo(ActualZoneNum); - AdjustAirSetPointsforOpTempCntrl(state, RelativeZoneNum, ActualZoneNum, ZoneThermostatSetPointLo(ActualZoneNum)); - - // Change the room set point to occupied set point during optimum start period-------------- - - if (allocated(state.dataHVACGlobal->OptStartData.OptStartFlag)) { - if (!allocated(DaySPValues)) { - DaySPValues.allocate(state.dataGlobal->NumOfTimeStepInHour, 24); - } - if (state.dataHVACGlobal->OptStartData.ActualZoneNum(ActualZoneNum) == ActualZoneNum) { - ScheduleManager::GetScheduleValuesForDay(state, SetPointTempSchedIndexCold, DaySPValues); - OccStartTime = CEILING(state.dataHVACGlobal->OptStartData.OccStartTime(ActualZoneNum)) + 1; - state.dataZoneCtrls->OccRoomTSetPointCool(ActualZoneNum) = DaySPValues(1, OccStartTime); - ScheduleManager::GetScheduleValuesForDay(state, SetPointTempSchedIndexHot, DaySPValues); - state.dataZoneCtrls->OccRoomTSetPointHeat(ActualZoneNum) = DaySPValues(1, OccStartTime); - } - - if (state.dataHVACGlobal->OptStartData.OptStartFlag(ActualZoneNum)) { - ZoneThermostatSetPointHi(ActualZoneNum) = state.dataZoneCtrls->OccRoomTSetPointCool(ActualZoneNum); - ZoneThermostatSetPointLo(ActualZoneNum) = state.dataZoneCtrls->OccRoomTSetPointHeat(ActualZoneNum); - } - } - //-------------------------------------------------------------------------------------------- - - AdjustCoolingSetPointforTempAndHumidityControl(state, RelativeZoneNum, ActualZoneNum); - break; - default: - ShowSevereError(state, - format("CalcZoneAirTempSetpoints: Illegal control type for Zone={}, Found value={}, in Schedule={}", - Zone(ActualZoneNum).Name, - TempControlType(ActualZoneNum), - TempControlledZone(RelativeZoneNum).ControlTypeSchedName)); - - break; - } - - // Apply offset for faulty therostats - if ((state.dataFaultsMgr->NumFaultyThermostat > 0) && (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing) && - (!state.dataGlobal->KickOffSimulation)) { - // loop through the FaultsThermostatOffset objects to find the one for the zone - for (int iFault = 1; iFault <= state.dataFaultsMgr->NumFaultyThermostat; ++iFault) { - - if (UtilityRoutines::SameString(TempControlledZone(RelativeZoneNum).Name, - state.dataFaultsMgr->FaultsThermostatOffset(iFault).FaultyThermostatName)) { - - // Check fault availability schedules - if (ScheduleManager::GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsThermostatOffset(iFault).AvaiSchedPtr) > 0.0) { - - // Check fault severity schedules to update the reference thermostat offset - double rSchVal = 1.0; - double offsetUpdated; - if (state.dataFaultsMgr->FaultsThermostatOffset(iFault).SeveritySchedPtr >= 0) { - rSchVal = - ScheduleManager::GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsThermostatOffset(iFault).SeveritySchedPtr); - } - offsetUpdated = rSchVal * state.dataFaultsMgr->FaultsThermostatOffset(iFault).Offset; - - // Positive offset means the sensor reading is higher than the actual value - TempZoneThermostatSetPoint(ActualZoneNum) -= offsetUpdated; - ZoneThermostatSetPointLo(ActualZoneNum) -= offsetUpdated; - ZoneThermostatSetPointHi(ActualZoneNum) -= offsetUpdated; - } - - // Stop searching the FaultsThermostatOffset object for the zone - break; - } - } - } - } - - if (state.dataZoneCtrls->NumComfortControlledZones > 0) CalcZoneAirComfortSetPoints(state); - OverrideAirSetPointsforEMSCntrl(state); -} - -void ZoneSpaceHeatBalanceData::calcPredictedHumidityRatio(EnergyPlusData &state, Real64 const RAFNFrac, int const zoneNum, int const spaceNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Richard J. Liesen - // DATE WRITTEN May 2001 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine does the prediction step for humidity control - - // METHODOLOGY EMPLOYED: - // This solves for the required system moisture required to try and achieve the desired - // Humidity Ratio in the Zone - - // REFERENCES: - // Routine FinalZnCalcs - FINAL ZONE CALCULATIONS, authored by Dale Herron - // for BLAST. - - static constexpr std::string_view RoutineName("calcPredictedHumidityRatio"); - - Real64 ZoneRHHumidifyingSetPoint = 0.0; // Zone humidifying set point (%) - Real64 ZoneRHDehumidifyingSetPoint = 0.0; // Zone dehumidifying set point (%) - - auto &thisZone = state.dataHeatBal->Zone(zoneNum); - bool SingleSetPoint = false; // This determines whether both setpoint are equal or not - - // Check to see if this is a "humidity controlled zone" - bool ControlledHumidZoneFlag = false; - // Check all the controlled zones to see if it matches the zone simulated - if (thisZone.humidityControlZoneIndex > 0) { - auto &humidityControlZone = state.dataZoneCtrls->HumidityControlZone(thisZone.humidityControlZoneIndex); - assert(humidityControlZone.ActualZoneNum == zoneNum); - ZoneRHHumidifyingSetPoint = ScheduleManager::GetCurrentScheduleValue(state, humidityControlZone.HumidifyingSchedIndex); - ZoneRHDehumidifyingSetPoint = ScheduleManager::GetCurrentScheduleValue(state, humidityControlZone.DehumidifyingSchedIndex); - - // Apply EMS values to overwrite the humidistat values - if (humidityControlZone.EMSOverrideHumidifySetPointOn) { - ZoneRHHumidifyingSetPoint = humidityControlZone.EMSOverrideHumidifySetPointValue; - } - if (humidityControlZone.EMSOverrideDehumidifySetPointOn) { - ZoneRHDehumidifyingSetPoint = humidityControlZone.EMSOverrideDehumidifySetPointValue; - } - - // Apply offsets for faulty humidistats - if ((state.dataFaultsMgr->NumFaultyHumidistat > 0) && (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing) && - (!state.dataGlobal->KickOffSimulation)) { - - // loop through the FaultsHumidistatOffset objects to find the one for the zone - for (int iFault = 1; iFault <= state.dataFaultsMgr->NumFaultyHumidistat; ++iFault) { - - if (UtilityRoutines::SameString(humidityControlZone.ControlName, - state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyHumidistatName)) { - - if (UtilityRoutines::SameString(state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyHumidistatType, - "ThermostatOffsetDependent")) { - // For Humidistat Offset Type I: ThermostatOffsetDependent - - bool IsThermostatFound = false; - double offsetThermostat = 0.0; - double offsetZoneRHHumidifyingSetPoint = 0.0; - double offsetZoneRHDehumidifyingSetPoint = 0.0; - double faultZoneWHumidifyingSetPoint; - double faultZoneWDehumidifyingSetPoint; - - // Get the offset value of the corresponding thermostat fault object - if (state.dataFaultsMgr->NumFaultyThermostat > 0) { - - // loop through the FaultsThermostatOffset objects to find the one causes the Humidistat Offset - for (int iFaultThermo = 1; iFaultThermo <= state.dataFaultsMgr->NumFaultyThermostat; ++iFaultThermo) { - - if (UtilityRoutines::SameString(state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyThermostatName, - state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).Name)) { - IsThermostatFound = true; - - // Check fault availability schedules - if (ScheduleManager::GetCurrentScheduleValue( - state, state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).AvaiSchedPtr) > 0.0) { - - // Check fault severity schedules to update the reference thermostat offset - double rSchVal = 1.0; - if (state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).SeveritySchedPtr >= 0) { - rSchVal = ScheduleManager::GetCurrentScheduleValue( - state, state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).SeveritySchedPtr); - } - offsetThermostat = rSchVal * state.dataFaultsMgr->FaultsThermostatOffset(iFaultThermo).Offset; - } - - // Stop searching the FaultsThermostatOffset object for the Humidistat Offset - break; - } - } - } - - // The FaultsThermostatOffset specified in the FaultHumidistatOffset is not found - if (!IsThermostatFound) { - ShowSevereError(state, - "FaultModel:HumidistatOffset = \"" + state.dataFaultsMgr->FaultsHumidistatOffset(iFault).Name + - "\" invalid Reference Humidistat Offset Name = \"" + - state.dataFaultsMgr->FaultsHumidistatOffset(iFault).FaultyThermostatName + "\" not found."); - ShowFatalError(state, "Errors getting FaultModel input data. Preceding condition(s) cause termination."); - } - - if (offsetThermostat != 0.0) { - // Calculate the humidistat offset value from the thermostat offset value - faultZoneWHumidifyingSetPoint = Psychrometrics::PsyWFnTdbRhPb( - state, (this->MAT + offsetThermostat), (ZoneRHHumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress); - faultZoneWDehumidifyingSetPoint = Psychrometrics::PsyWFnTdbRhPb( - state, (this->MAT + offsetThermostat), (ZoneRHDehumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress); - offsetZoneRHHumidifyingSetPoint = - ZoneRHHumidifyingSetPoint - - Psychrometrics::PsyRhFnTdbWPb(state, this->MAT, faultZoneWHumidifyingSetPoint, state.dataEnvrn->OutBaroPress) * 100.0; - offsetZoneRHDehumidifyingSetPoint = - ZoneRHDehumidifyingSetPoint - - Psychrometrics::PsyRhFnTdbWPb(state, this->MAT, faultZoneWDehumidifyingSetPoint, state.dataEnvrn->OutBaroPress) * - 100.0; - - // Apply the calculated humidistat offset value - // Positive offset means the sensor reading is higher than the actual value - ZoneRHHumidifyingSetPoint -= offsetZoneRHHumidifyingSetPoint; - ZoneRHDehumidifyingSetPoint -= offsetZoneRHDehumidifyingSetPoint; - - // constrain value to something reasonable - ZoneRHHumidifyingSetPoint = min(100.0, max(0.0, ZoneRHHumidifyingSetPoint)); - ZoneRHDehumidifyingSetPoint = min(100.0, max(0.0, ZoneRHDehumidifyingSetPoint)); - } - - } else { - // For Humidistat Offset Type II: ThermostatOffsetIndependent - - // Check fault availability schedules - if (ScheduleManager::GetCurrentScheduleValue(state, state.dataFaultsMgr->FaultsHumidistatOffset(iFault).AvaiSchedPtr) > 0.0) { - - // Check fault severity schedules to update the reference humidistat offset - double rSchVal = 1.0; - double offsetUpdated; - if (state.dataFaultsMgr->FaultsHumidistatOffset(iFault).SeveritySchedPtr >= 0) { - rSchVal = ScheduleManager::GetCurrentScheduleValue( - state, state.dataFaultsMgr->FaultsHumidistatOffset(iFault).SeveritySchedPtr); - } - offsetUpdated = rSchVal * state.dataFaultsMgr->FaultsHumidistatOffset(iFault).Offset; - - // Positive offset means the sensor reading is higher than the actual value - ZoneRHHumidifyingSetPoint -= offsetUpdated; - ZoneRHDehumidifyingSetPoint -= offsetUpdated; - - // constrain value to something reasonable - ZoneRHHumidifyingSetPoint = min(100.0, max(0.0, ZoneRHHumidifyingSetPoint)); - ZoneRHDehumidifyingSetPoint = min(100.0, max(0.0, ZoneRHDehumidifyingSetPoint)); - } - } - break; - } - } - } - - // Run-time error check - if (ZoneRHHumidifyingSetPoint > ZoneRHDehumidifyingSetPoint) { - if (humidityControlZone.ErrorIndex == 0) { - ShowWarningMessage(state, - "HUMIDISTAT: The humidifying setpoint is above the dehumidifying setpoint in " + humidityControlZone.ControlName); - ShowContinueError(state, "The zone humidifying setpoint is set to the dehumidifying setpoint."); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "The humidifying setpoint is still above the dehumidifying setpoint", - humidityControlZone.ErrorIndex, - ZoneRHHumidifyingSetPoint, - ZoneRHHumidifyingSetPoint); - ZoneRHHumidifyingSetPoint = ZoneRHDehumidifyingSetPoint; - } - if (ZoneRHHumidifyingSetPoint == ZoneRHDehumidifyingSetPoint) SingleSetPoint = true; - ControlledHumidZoneFlag = true; - - } // HumidControlledZoneNum - - // if zone latent sizing is requested but no humidistat exists - if (state.dataGlobal->DoingSizing && !ControlledHumidZoneFlag && state.dataHeatBal->DoLatentSizing) { - for (size_t zoneEqConfigNum = 1; zoneEqConfigNum <= state.dataZoneEquip->ZoneEquipConfig.size(); ++zoneEqConfigNum) { - auto &zoneEqConfig = state.dataZoneEquip->ZoneEquipConfig(zoneEqConfigNum); - if (!zoneEqConfig.IsControlled) continue; - int ZoneSizNum = - UtilityRoutines::FindItemInList(zoneEqConfig.ZoneName, state.dataSize->ZoneSizingInput, &DataSizing::ZoneSizingInputData::ZoneName); - // should use the first Sizing:Zone object if not found - if (ZoneSizNum == 0 && !state.dataSize->ZoneSizingInput.empty()) ZoneSizNum = 1; - if (ZoneSizNum > 0) { - auto &zoneSizingInput = state.dataSize->ZoneSizingInput(ZoneSizNum); - if (zoneSizingInput.zoneLatentSizing) { - ZoneRHDehumidifyingSetPoint = (zoneSizingInput.zoneRHDehumidifySchIndex) - ? ScheduleManager::GetCurrentScheduleValue(state, zoneSizingInput.zoneRHDehumidifySchIndex) - : zoneSizingInput.zoneRHDehumidifySetPoint; - ZoneRHHumidifyingSetPoint = (zoneSizingInput.zoneRHHumidifySchIndex) - ? ScheduleManager::GetCurrentScheduleValue(state, zoneSizingInput.zoneRHHumidifySchIndex) - : zoneSizingInput.zoneRHHumidifySetPoint; - if (ZoneRHHumidifyingSetPoint > ZoneRHDehumidifyingSetPoint) ZoneRHHumidifyingSetPoint = ZoneRHDehumidifyingSetPoint; - if (ZoneRHHumidifyingSetPoint == ZoneRHDehumidifyingSetPoint) SingleSetPoint = true; - ControlledHumidZoneFlag = true; - } - } - break; - } - } - - Real64 LoadToHumidifySetPoint = 0.0; // Moisture load at humidifying set point - Real64 LoadToDehumidifySetPoint = 0.0; // Moisture load at dehumidifying set point - Real64 totalOutputRequired = 0.0; - if (ControlledHumidZoneFlag) { - - // Calculate hourly humidity ratio from infiltration + humidity added from latent load - // to determine system added/subtracted moisture. - Real64 LatentGain = - this->ZoneLatentGain + state.dataHeatBalFanSys->SumLatentHTRadSys(zoneNum) + state.dataHeatBalFanSys->SumLatentPool(zoneNum); - - Real64 SysTimeStepInSeconds = DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys; - - // Calculate the coefficients for the 3rd Order derivative for final - // zone humidity ratio. The A, B, C coefficients are analogous to the heat balance. - // SumHmARaW and SumHmARa will be used with the Moisture Balance on the building elements and - // are currently set to zero when the CTF only version is used. - - // The density of air and latent heat of vaporization are calculated as functions. - Real64 RhoAir = Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->ZT, this->ZoneAirHumRat, RoutineName); - Real64 H2OHtOfVap = Psychrometrics::PsyHgAirFnWTdb(this->ZoneAirHumRat, this->ZT); - - // Assume that the system will have flow - Real64 A = 0.0; - Real64 B = 0.0; - Real64 C = 0.0; - if (state.afn->multizone_always_simulated || - (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && - state.afn->AirflowNetworkFanActivated)) { - // Multizone airflow calculated in AirflowNetwork - B = (LatentGain / H2OHtOfVap) + state.afn->exchangeData(zoneNum).SumMHrW + state.afn->exchangeData(zoneNum).SumMMHrW + this->SumHmARaW; - A = state.afn->exchangeData(zoneNum).SumMHr + state.afn->exchangeData(zoneNum).SumMMHr + this->SumHmARa; - } else { - B = (LatentGain / H2OHtOfVap) + ((this->OAMFL + this->VAMFL + this->CTMFL) * state.dataEnvrn->OutHumRat) + this->EAMFLxHumRat + - this->SumHmARaW + this->MixingMassFlowXHumRat + this->MDotOA * state.dataEnvrn->OutHumRat; - A = this->OAMFL + this->VAMFL + this->EAMFL + this->CTMFL + this->SumHmARa + this->MixingMassFlowZone + this->MDotOA; - } - Real64 volume = 0.0; - if (spaceNum > 0) { - volume = state.dataHeatBal->space(spaceNum).Volume; - } else { - volume = thisZone.Volume; - } - C = RhoAir * volume * thisZone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; - - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - auto &roomAFNInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum); - int RoomAirNode = roomAFNInfo.ControlAirNodeID; - H2OHtOfVap = Psychrometrics::PsyHgAirFnWTdb(roomAFNInfo.Node(RoomAirNode).HumRat, roomAFNInfo.Node(RoomAirNode).AirTemp); - A = roomAFNInfo.Node(RoomAirNode).SumLinkM + roomAFNInfo.Node(RoomAirNode).SumHmARa; - B = (roomAFNInfo.Node(RoomAirNode).SumIntLatentGain / H2OHtOfVap) + roomAFNInfo.Node(RoomAirNode).SumLinkMW + - roomAFNInfo.Node(RoomAirNode).SumHmARaW; - C = roomAFNInfo.Node(RoomAirNode).RhoAir * roomAFNInfo.Node(RoomAirNode).AirVolume * thisZone.ZoneVolCapMultpMoist / - (DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys); - } - - // Use a 3rd Order derivative to predict zone moisture addition or removal and - // smooth the changes using the zone air capacitance. Positive values of Moist Load means that - // this amount of moisture must be added to the zone to reach the setpoint. Negative values represent - // the amount of moisture that must be removed by the system. - // MoistLoadHumidSetPoint = massflow * HumRat = kgDryAir/s * kgWater/kgDryAir = kgWater/s - Real64 WZoneSetPoint = - Psychrometrics::PsyWFnTdbRhPb(state, this->ZT, (ZoneRHHumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress, RoutineName); - Real64 exp_700_A_C(0.0); - if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::ThirdOrder) { - LoadToHumidifySetPoint = - ((11.0 / 6.0) * C + A) * WZoneSetPoint - - (B + C * (3.0 * this->WPrevZoneTSTemp[0] - (3.0 / 2.0) * this->WPrevZoneTSTemp[1] + (1.0 / 3.0) * this->WPrevZoneTSTemp[2])); - // Exact solution - } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::AnalyticalSolution) { - if (A == 0.0) { // B=0 - LoadToHumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) - B; - } else { - exp_700_A_C = std::exp(min(700.0, -A / C)); // Tuned Save expensive value - LoadToHumidifySetPoint = A * (WZoneSetPoint - this->ZoneW1 * exp_700_A_C) / (1.0 - exp_700_A_C) - B; - } - } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::EulerMethod) { - LoadToHumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) + A * WZoneSetPoint - B; - } - if (RAFNFrac > 0.0) LoadToHumidifySetPoint = LoadToHumidifySetPoint / RAFNFrac; - WZoneSetPoint = - Psychrometrics::PsyWFnTdbRhPb(state, this->ZT, (ZoneRHDehumidifyingSetPoint / 100.0), state.dataEnvrn->OutBaroPress, RoutineName); - if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::ThirdOrder) { - LoadToDehumidifySetPoint = - ((11.0 / 6.0) * C + A) * WZoneSetPoint - - (B + C * (3.0 * this->WPrevZoneTSTemp[0] - (3.0 / 2.0) * this->WPrevZoneTSTemp[1] + (1.0 / 3.0) * this->WPrevZoneTSTemp[2])); - // Exact solution - } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::AnalyticalSolution) { - if (A == 0.0) { // B=0 - LoadToDehumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) - B; - } else { - LoadToDehumidifySetPoint = A * (WZoneSetPoint - this->ZoneW1 * exp_700_A_C) / (1.0 - exp_700_A_C) - B; // exp_700_A_C set above - } - } else if (state.dataHeatBal->ZoneAirSolutionAlgo == DataHeatBalance::SolutionAlgo::EulerMethod) { - LoadToDehumidifySetPoint = C * (WZoneSetPoint - this->ZoneW1) + A * WZoneSetPoint - B; - } - if (RAFNFrac > 0.0) LoadToDehumidifySetPoint = LoadToDehumidifySetPoint / RAFNFrac; - - // The load is added to the TotalOutputRequired as in the Temperature Predictor. There is also the remaining - // output variable for those who will use this for humidity control and stored in DataZoneEnergyDemands with the - // analogous temperature terms. - - if (SingleSetPoint) { - totalOutputRequired = LoadToHumidifySetPoint; - } else { - if (LoadToHumidifySetPoint > 0.0 && LoadToDehumidifySetPoint > 0.0) { - totalOutputRequired = LoadToHumidifySetPoint; - } else if (LoadToHumidifySetPoint < 0.0 && LoadToDehumidifySetPoint < 0.0) { - totalOutputRequired = LoadToDehumidifySetPoint; - } else if (LoadToHumidifySetPoint <= 0.0 && LoadToDehumidifySetPoint >= 0.0) { // deadband includes zero loads - totalOutputRequired = 0.0; - } else { // this should never occur! - ShowSevereError( - state, "Humidistat: Unanticipated combination of humidifying and dehumidifying loads - report to EnergyPlus Development Team"); - ShowContinueErrorTimeStamp(state, format("occurs in Zone = {}", thisZone.Name)); - ShowContinueError( - state, - format("LoadToHumidifySetPoint={:.5R}, LoadToDehumidifySetPoint={:.5R}", LoadToHumidifySetPoint, LoadToDehumidifySetPoint)); - ShowContinueError(state, format("Zone RH Humidifying Set-point={:.1R}", ZoneRHHumidifyingSetPoint)); - ShowContinueError(state, format("Zone RH Dehumidifying Set-point={:.2R}", ZoneRHDehumidifyingSetPoint)); - ShowFatalError(state, "Program terminates due to above conditions."); - } - } - } - - // Apply zone multipliers as needed or set to zero - if (spaceNum > 0) { - auto &thisspaceSysMoistureDemand = state.dataZoneEnergyDemand->spaceSysMoistureDemand(spaceNum); - if (ControlledHumidZoneFlag) { - thisspaceSysMoistureDemand.reportMoistLoadsZoneMultiplier( - state, zoneNum, totalOutputRequired, LoadToHumidifySetPoint, LoadToDehumidifySetPoint); - } else { - thisspaceSysMoistureDemand.TotalOutputRequired = 0.0; - thisspaceSysMoistureDemand.OutputRequiredToDehumidifyingSP = 0.0; - thisspaceSysMoistureDemand.OutputRequiredToHumidifyingSP = 0.0; - } - } else { - auto &thisZoneSysMoistureDemand = state.dataZoneEnergyDemand->ZoneSysMoistureDemand(zoneNum); - if (ControlledHumidZoneFlag) { - thisZoneSysMoistureDemand.reportMoistLoadsZoneMultiplier( - state, zoneNum, totalOutputRequired, LoadToHumidifySetPoint, LoadToDehumidifySetPoint); - } else { - thisZoneSysMoistureDemand.TotalOutputRequired = 0.0; - thisZoneSysMoistureDemand.OutputRequiredToDehumidifyingSP = 0.0; - thisZoneSysMoistureDemand.OutputRequiredToHumidifyingSP = 0.0; - } - } -} - -Real64 correctZoneAirTemps(EnergyPlusData &state, - bool useZoneTimeStepHistory // if true then use zone timestep history, if false use system time step history -) -{ - Real64 maxTempChange = DataPrecisionGlobals::constant_zero; // Max absolute air temperature change between previous and current timestep - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - Real64 zoneTempChange = state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).correctAirTemp(state, useZoneTimeStepHistory, zoneNum); - if (state.dataHeatBal->doSpaceHeatBalance) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - Real64 spaceTempChange = - state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).correctAirTemp(state, useZoneTimeStepHistory, zoneNum, spaceNum); - maxTempChange = max(maxTempChange, spaceTempChange); - } - } - maxTempChange = max(maxTempChange, zoneTempChange); - } - return maxTempChange; -} - -Real64 ZoneSpaceHeatBalanceData::correctAirTemp( - EnergyPlusData &state, - bool const useZoneTimeStepHistory, // if true then use zone timestep history, if false use system time step history - int const zoneNum, - int const spaceNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Russell Taylor - // MODIFIED November 1999, LKL; November 2016 Sang Hoon Lee, Tianzhen Hong, Rongpeng Zhang; - // RE-ENGINEERED July 2003 (Peter Graham Ellis) - // February 2008 (Brent Griffith reworked history ) - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine updates the zone air temperature and modifies the system - // time step. - - static constexpr std::string_view RoutineName("correctAirTemp"); - - Real64 tempChange = DataPrecisionGlobals::constant_zero; // Zone or space air temperature change between previous and current timestep - - assert(zoneNum > 0); - auto &thisZone = state.dataHeatBal->Zone(zoneNum); - - // Update zone temperatures - - Real64 ZoneMult = thisZone.Multiplier * thisZone.ListMultiplier; - - // update the variables actually used in the balance equations. - if (!useZoneTimeStepHistory) { - this->ZTM = this->DSXMAT; - this->WPrevZoneTSTemp = this->DSWPrevZoneTS; - } else { - this->ZTM = this->XMAT; - this->WPrevZoneTSTemp = this->WPrevZoneTS; - } - - Real64 volume = 0.0; - if (spaceNum > 0) { - volume = state.dataHeatBal->space(spaceNum).Volume; - } else { - volume = thisZone.Volume; - } - this->AirPowerCap = volume * thisZone.ZoneVolCapMultpSens * - Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->MAT, this->ZoneAirHumRat, RoutineName) * - Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat) / (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); - - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0) { - RoomAirModelManager::ManageAirModel(state, zoneNum); - } - - // Calculate the various heat balance sums - this->calcZoneOrSpaceSums(state, true, zoneNum, spaceNum); - - // Sum all convective internal gains except for people: SumIntGainExceptPeople - if (state.dataHybridModel->FlagHybridModel_PC) { - // TODO: For now, don't do space heat balance with hybrid model - this->SumIntGainExceptPeople = InternalHeatGains::SumAllInternalConvectionGainsExceptPeople(state, zoneNum); - } - - // ZoneTempHistoryTerm = (3.0D0 * ZTM1(zoneNum) - (3.0D0/2.0D0) * ZTM2(zoneNum) + (1.0D0/3.0D0) * ZTM3(zoneNum)) - int ZoneNodeNum = thisZone.SystemZoneNodeNumber; - if (spaceNum > 0) { - ZoneNodeNum = state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber; - } - - Real64 SNLoad = 0.0; - - if (ZoneNodeNum > 0) { // This zone is controlled by a zone equipment configuration or zone plenum - auto &thisSystemNode = state.dataLoopNodes->Node(ZoneNodeNum); - - // Heat balance coefficients for controlled zone, i.e. with system air flow - this->TempDepCoef = this->SumHA + this->SumMCp + this->SumSysMCp; - this->TempIndCoef = this->SumIntGain + this->SumHATsurf - this->SumHATref + this->SumMCpT + this->SumSysMCpT + - (this->NonAirSystemResponse / ZoneMult + this->SysDepZoneLoadsLagged); - - if (state.afn->distribution_simulated) { - this->TempIndCoef += state.afn->exchangeData(zoneNum).TotalSen; - } - - // Solve for zone air temperature - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - this->ZT = (this->TempIndCoef + this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2])) / - ((11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef); - } break; - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepCoef == 0.0) { // B=0 - this->ZT = this->ZoneT1 + this->TempIndCoef / this->AirPowerCap; - } else { - this->ZT = (this->ZoneT1 - this->TempIndCoef / this->TempDepCoef) * std::exp(min(700.0, -this->TempDepCoef / this->AirPowerCap)) + - this->TempIndCoef / this->TempDepCoef; - } - } break; - case DataHeatBalance::SolutionAlgo::EulerMethod: { - this->ZT = (this->AirPowerCap * this->ZoneT1 + this->TempIndCoef) / (this->AirPowerCap + this->TempDepCoef); - } break; - default: - break; - } - // Update zone node temperature and thermostat temperature unless already updated in Room Air Model, - // calculate load correction factor - if (!state.dataRoomAirMod->anyNonMixingRoomAirModel) { - // Fully mixed - thisSystemNode.Temp = this->ZT; - // SpaceHB TODO: What to do here if this is for space - if (spaceNum == 0) { - state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; - } - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; - } else { - auto &thisAirModel = state.dataRoomAirMod->AirModel(zoneNum); - if ((thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::Mixing) || (!thisAirModel.SimAirModel)) { - // Fully mixed - thisSystemNode.Temp = this->ZT; - // SpaceHB TODO: What to do here if this is for space - if (spaceNum == 0) { - state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; - } - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; - } else if (state.dataRoomAirMod->IsZoneDV(zoneNum) || state.dataRoomAirMod->IsZoneUI(zoneNum)) { - // UCSDDV: Not fully mixed - calculate factor to correct load for fully mixed assumption - // Space HB TODO: Space HB doesn't mix with DV etc. - if (this->SumSysMCp > DataHVACGlobals::SmallMassFlow) { - Real64 TempSupplyAir = this->SumSysMCpT / this->SumSysMCp; // Non-negligible flow, calculate supply air temperature - if (std::abs(TempSupplyAir - this->ZT) > state.dataHeatBal->TempConvergTol) { - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = (TempSupplyAir - thisSystemNode.Temp) / (TempSupplyAir - this->ZT); - // constrain value to something reasonable - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = max(-3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = min(3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); - - } else { - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; // Indeterminate - } - } else { - // Negligible flow, assume mixed - reasonable lagged starting value for first step time with significant flow - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; - } - } else if (thisAirModel.SimAirModel && ((thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UserDefined) || - (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::Mundt))) { - if (this->SumSysMCp > DataHVACGlobals::SmallMassFlow) { - Real64 TempSupplyAir = this->SumSysMCpT / this->SumSysMCp; // Non-negligible flow, calculate supply air temperature - if (std::abs(TempSupplyAir - this->ZT) > state.dataHeatBal->TempConvergTol) { - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = (TempSupplyAir - thisSystemNode.Temp) / (TempSupplyAir - this->ZT); - // constrain value - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = max(-3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = min(3.0, state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum)); - - } else { - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; // Indeterminate - } - } else { - // Negligible flow, assume mixed - reasonable lagged starting value for first step time with significant flow - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; - } - } else if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - // Zone node used in the RoomAirflowNetwork model - this->ZT = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum) - .Node(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).ControlAirNodeID) - .AirTemp; - thisSystemNode.Temp = this->ZT; - // SpaceHB TODO: What to do here if this is for space - if (spaceNum == 0) { - state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; - } - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; - } else { - thisSystemNode.Temp = this->ZT; - // SpaceHB TODO: What to do here if this is for space - if (spaceNum == 0) { - state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->ZT; - } - state.dataHeatBalFanSys->LoadCorrectionFactor(zoneNum) = 1.0; - } - } - - // Sensible load is the enthalpy into the zone minus the enthalpy that leaves the zone. - Real64 CpAir = Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat); - Real64 ZoneEnthalpyIn = this->SumSysMCpT; - - // SNLOAD is the single zone load, without Zone Multiplier or Zone List Multiplier - SNLoad = ZoneEnthalpyIn - (thisSystemNode.MassFlowRate / ZoneMult) * CpAir * thisSystemNode.Temp + this->NonAirSystemResponse / ZoneMult + - this->SysDepZoneLoadsLagged; - - } else { - - // Heat balance coefficients for uncontrolled zone, i.e. without system air flow - this->TempDepCoef = this->SumHA + this->SumMCp; - this->TempIndCoef = this->SumIntGain + this->SumHATsurf - this->SumHATref + this->SumMCpT; - - if (state.afn->distribution_simulated) { - this->TempIndCoef += state.afn->exchangeData(zoneNum).TotalSen; - } - - // Solve for zone air temperature - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - this->ZT = (this->TempIndCoef + this->AirPowerCap * (3.0 * this->ZTM[0] - (3.0 / 2.0) * this->ZTM[1] + (1.0 / 3.0) * this->ZTM[2])) / - ((11.0 / 6.0) * this->AirPowerCap + this->TempDepCoef); - // Exact solution - } break; - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepCoef == 0.0) { // B=0 - this->ZT = this->ZoneT1 + this->TempIndCoef / this->AirPowerCap; - } else { - this->ZT = (this->ZoneT1 - this->TempIndCoef / this->TempDepCoef) * std::exp(min(700.0, -this->TempDepCoef / this->AirPowerCap)) + - this->TempIndCoef / this->TempDepCoef; - } - } break; - case DataHeatBalance::SolutionAlgo::EulerMethod: { - this->ZT = (this->AirPowerCap * this->ZoneT1 + this->TempIndCoef) / (this->AirPowerCap + this->TempDepCoef); - } break; - default: - break; - } - - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - this->ZT = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum) - .Node(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).ControlAirNodeID) - .AirTemp; - } - } - - // No sensible load - SNLoad = 0.0; - } - - // Hybrid modeling start - // SpaceHB TODO: For now, hybrid model is only for zones - if (spaceNum == 0 && state.dataHybridModel->FlagHybridModel) { - if ((state.dataHybridModel->HybridModelZone(zoneNum).InfiltrationCalc_T || - state.dataHybridModel->HybridModelZone(zoneNum).InternalThermalMassCalc_T || - state.dataHybridModel->HybridModelZone(zoneNum).PeopleCountCalc_T) && - (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing)) { - InverseModelTemperature(state, - zoneNum, - this->SumIntGain, - this->SumIntGainExceptPeople, - this->SumHA, - this->SumHATsurf, - this->SumHATref, - this->SumMCp, - this->SumMCpT, - this->SumSysMCp, - this->SumSysMCpT, - this->AirPowerCap); - } - } - - this->MAT = this->ZT; - - // Determine sensible load heating/cooling rate and energy - if (spaceNum > 0) { - state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).reportZoneAirSystemSensibleLoads(state, SNLoad); - } else { - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).reportZoneAirSystemSensibleLoads(state, SNLoad); - } - - // Final humidity calcs - this->correctHumRat(state, zoneNum, spaceNum); - - this->ZoneAirHumRat = this->ZoneAirHumRatTemp; - this->ZoneAirRelHum = 100.0 * Psychrometrics::PsyRhFnTdbWPb(state, this->ZT, this->ZoneAirHumRat, state.dataEnvrn->OutBaroPress, RoutineName); - - // tempChange is used by HVACManager to determine if the timestep needs to be shortened. - bool isMixed = true; - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { - isMixed = !((state.dataRoomAirMod->IsZoneDV(zoneNum) && !state.dataRoomAirMod->ZoneDVMixedFlag(zoneNum)) || - (state.dataRoomAirMod->IsZoneUI(zoneNum) && !state.dataRoomAirMod->ZoneUFMixedFlag(zoneNum))); - } - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - if (isMixed) { - tempChange = max(tempChange, std::abs(this->ZT - this->ZTM[0])); - } else { - tempChange = max(tempChange, - max(std::abs(state.dataRoomAirMod->ZTOC(zoneNum) - state.dataRoomAirMod->ZTM1OC(zoneNum)), - std::abs(state.dataRoomAirMod->ZTMX(zoneNum) - state.dataRoomAirMod->ZTM1MX(zoneNum)))); - } - } break; - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: - case DataHeatBalance::SolutionAlgo::EulerMethod: { - if (isMixed) { - tempChange = max(tempChange, std::abs(this->ZT - this->ZoneT1)); - } else { - tempChange = max(tempChange, - max(std::abs(state.dataRoomAirMod->ZTOC(zoneNum) - state.dataRoomAirMod->Zone1OC(zoneNum)), - std::abs(state.dataRoomAirMod->ZTMX(zoneNum) - state.dataRoomAirMod->Zone1MX(zoneNum)))); - } - } break; - default: - break; - } - - CalcZoneComponentLoadSums(state, - zoneNum, - this->TempDepCoef, - this->TempIndCoef, - state.dataHeatBal->ZnAirRpt(zoneNum).SumIntGains, - state.dataHeatBal->ZnAirRpt(zoneNum).SumHADTsurfs, - state.dataHeatBal->ZnAirRpt(zoneNum).SumMCpDTzones, - state.dataHeatBal->ZnAirRpt(zoneNum).SumMCpDtInfil, - state.dataHeatBal->ZnAirRpt(zoneNum).SumMCpDTsystem, - state.dataHeatBal->ZnAirRpt(zoneNum).SumNonAirSystem, - state.dataHeatBal->ZnAirRpt(zoneNum).CzdTdt, - state.dataHeatBal->ZnAirRpt(zoneNum).imBalance, - state.dataHeatBal->ZnAirRpt(zoneNum).SumEnthalpyM, - state.dataHeatBal->ZnAirRpt(zoneNum).SumEnthalpyH); - return tempChange; -} - -void PushZoneTimestepHistories(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN February 2008 - - // PURPOSE OF THIS SUBROUTINE: - // push histories for timestep advancing - - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).pushZoneTimestepHistory(state, zoneNum); - if (state.dataHeatBal->doSpaceHeatBalance) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).pushZoneTimestepHistory(state, zoneNum, spaceNum); - } - } - } -} - -void ZoneSpaceHeatBalanceData::pushZoneTimestepHistory(EnergyPlusData &state, int const zoneNum, int const spaceNum) -{ - - constexpr std::string_view routineName("pushTimestepHistories"); - assert(zoneNum > 0); - - auto &thisAirModel = state.dataRoomAirMod->AirModel(zoneNum); - - // Push the temperature and humidity ratio histories - - for (int iHistory = 3; iHistory >= 1; --iHistory) { - this->XMAT[iHistory] = this->XMAT[iHistory - 1]; - this->WPrevZoneTS[iHistory] = this->WPrevZoneTS[iHistory - 1]; - } - this->XMAT[0] = this->ZTAV; // using average for whole zone time step. - this->XMPT = this->ZT; - this->WPrevZoneTS[0] = this->ZoneAirHumRatAvg; // using average for whole zone time step. - this->ZoneAirHumRat = this->ZoneAirHumRatTemp; - this->WZoneTimeMinusP = this->ZoneAirHumRatTemp; - this->ZoneAirRelHum = 100.0 * Psychrometrics::PsyRhFnTdbWPb(state, this->ZT, this->ZoneAirHumRat, state.dataEnvrn->OutBaroPress, routineName); - - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0) { - if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || - thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || - thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { - state.dataRoomAirMod->XM4TFloor(zoneNum) = state.dataRoomAirMod->XM3TFloor(zoneNum); - state.dataRoomAirMod->XM3TFloor(zoneNum) = state.dataRoomAirMod->XM2TFloor(zoneNum); - state.dataRoomAirMod->XM2TFloor(zoneNum) = state.dataRoomAirMod->XMATFloor(zoneNum); - state.dataRoomAirMod->XMATFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); - state.dataRoomAirMod->MATFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); - - state.dataRoomAirMod->XM4TOC(zoneNum) = state.dataRoomAirMod->XM3TOC(zoneNum); - state.dataRoomAirMod->XM3TOC(zoneNum) = state.dataRoomAirMod->XM2TOC(zoneNum); - state.dataRoomAirMod->XM2TOC(zoneNum) = state.dataRoomAirMod->XMATOC(zoneNum); - state.dataRoomAirMod->XMATOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); - state.dataRoomAirMod->MATOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); - - state.dataRoomAirMod->XM4TMX(zoneNum) = state.dataRoomAirMod->XM3TMX(zoneNum); - state.dataRoomAirMod->XM3TMX(zoneNum) = state.dataRoomAirMod->XM2TMX(zoneNum); - state.dataRoomAirMod->XM2TMX(zoneNum) = state.dataRoomAirMod->XMATMX(zoneNum); - state.dataRoomAirMod->XMATMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); - state.dataRoomAirMod->MATMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); - } - - // for RoomAirflowNetwork model - if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { - auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); - roomAirflowNetworkZoneInfo.AirTempX4 = roomAirflowNetworkZoneInfo.AirTempX3; - roomAirflowNetworkZoneInfo.AirTempX3 = roomAirflowNetworkZoneInfo.AirTempX2; - roomAirflowNetworkZoneInfo.AirTempX2 = roomAirflowNetworkZoneInfo.AirTempX1; - roomAirflowNetworkZoneInfo.AirTempX1 = roomAirflowNetworkZoneInfo.AirTemp; - - roomAirflowNetworkZoneInfo.HumRatX4 = roomAirflowNetworkZoneInfo.HumRatX3; - roomAirflowNetworkZoneInfo.HumRatX3 = roomAirflowNetworkZoneInfo.HumRatX2; - roomAirflowNetworkZoneInfo.HumRatX2 = roomAirflowNetworkZoneInfo.HumRatX1; - roomAirflowNetworkZoneInfo.HumRatX1 = roomAirflowNetworkZoneInfo.HumRat; - } - } - } - - if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) { - this->ZoneTM2 = this->ZoneTMX; - this->ZoneTMX = this->ZTAV; // using average for whole zone time step. - this->ZoneWM2 = this->ZoneWMX; - this->ZoneWMX = this->ZoneAirHumRatAvg; // using average for whole zone time step. - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0) { - if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || - thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || - thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { - state.dataRoomAirMod->ZoneM2Floor(zoneNum) = state.dataRoomAirMod->ZoneMXFloor(zoneNum); - state.dataRoomAirMod->ZoneMXFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); // using average for whole zone time step. - state.dataRoomAirMod->ZoneM2OC(zoneNum) = state.dataRoomAirMod->ZoneMXOC(zoneNum); - state.dataRoomAirMod->ZoneMXOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); // using average for whole zone time step. - state.dataRoomAirMod->ZoneM2MX(zoneNum) = state.dataRoomAirMod->ZoneMXMX(zoneNum); - state.dataRoomAirMod->ZoneMXMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); // using average for whole zone time step. - } - - if (thisAirModel.AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { - auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); - roomAirflowNetworkZoneInfo.AirTempTM2 = roomAirflowNetworkZoneInfo.AirTempTMX; - roomAirflowNetworkZoneInfo.AirTempTMX = roomAirflowNetworkZoneInfo.AirTemp; - - roomAirflowNetworkZoneInfo.HumRatWM2 = roomAirflowNetworkZoneInfo.HumRatWMX; - roomAirflowNetworkZoneInfo.HumRatWMX = roomAirflowNetworkZoneInfo.HumRat; - } - } - } - } -} - -void PushSystemTimestepHistories(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN April 2008 - - // PURPOSE OF THIS SUBROUTINE: - // Push the temperature and humidity ratio histories back in time - - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).pushSystemTimestepHistory(state, zoneNum); - if (state.dataHeatBal->doSpaceHeatBalance) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).pushSystemTimestepHistory(state, zoneNum, spaceNum); - } - } - } -} - -void ZoneSpaceHeatBalanceData::pushSystemTimestepHistory(EnergyPlusData &state, int const zoneNum, int const spaceNum) -{ - assert(zoneNum > 0); - for (int iHistory = 3; iHistory >= 1; --iHistory) { - this->DSXMAT[iHistory] = this->DSXMAT[iHistory - 1]; - this->DSWPrevZoneTS[iHistory] = this->DSWPrevZoneTS[iHistory - 1]; - } - this->DSXMAT[0] = this->MAT; - this->DSWPrevZoneTS[0] = this->ZoneAirHumRat; - - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { - if (state.dataRoomAirMod->IsZoneDV(zoneNum) || state.dataRoomAirMod->IsZoneUI(zoneNum)) { - state.dataRoomAirMod->DSXM4TFloor(zoneNum) = state.dataRoomAirMod->DSXM3TFloor(zoneNum); - state.dataRoomAirMod->DSXM3TFloor(zoneNum) = state.dataRoomAirMod->DSXM2TFloor(zoneNum); - state.dataRoomAirMod->DSXM2TFloor(zoneNum) = state.dataRoomAirMod->DSXMATFloor(zoneNum); - state.dataRoomAirMod->DSXMATFloor(zoneNum) = state.dataRoomAirMod->MATFloor(zoneNum); - - state.dataRoomAirMod->DSXM4TOC(zoneNum) = state.dataRoomAirMod->DSXM3TOC(zoneNum); - state.dataRoomAirMod->DSXM3TOC(zoneNum) = state.dataRoomAirMod->DSXM2TOC(zoneNum); - state.dataRoomAirMod->DSXM2TOC(zoneNum) = state.dataRoomAirMod->DSXMATOC(zoneNum); - state.dataRoomAirMod->DSXMATOC(zoneNum) = state.dataRoomAirMod->MATOC(zoneNum); - - state.dataRoomAirMod->DSXM4TMX(zoneNum) = state.dataRoomAirMod->DSXM3TMX(zoneNum); - state.dataRoomAirMod->DSXM3TMX(zoneNum) = state.dataRoomAirMod->DSXM2TMX(zoneNum); - state.dataRoomAirMod->DSXM2TMX(zoneNum) = state.dataRoomAirMod->DSXMATMX(zoneNum); - state.dataRoomAirMod->DSXMATMX(zoneNum) = state.dataRoomAirMod->MATMX(zoneNum); - } - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { - auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); - roomAirflowNetworkZoneInfo.AirTempDSX4 = roomAirflowNetworkZoneInfo.AirTempDSX3; - roomAirflowNetworkZoneInfo.AirTempDSX3 = roomAirflowNetworkZoneInfo.AirTempDSX2; - roomAirflowNetworkZoneInfo.AirTempDSX2 = roomAirflowNetworkZoneInfo.AirTempDSX1; - roomAirflowNetworkZoneInfo.AirTempDSX1 = roomAirflowNetworkZoneInfo.AirTemp; - - roomAirflowNetworkZoneInfo.HumRatDSX4 = roomAirflowNetworkZoneInfo.HumRatDSX3; - roomAirflowNetworkZoneInfo.HumRatDSX3 = roomAirflowNetworkZoneInfo.HumRatDSX2; - roomAirflowNetworkZoneInfo.HumRatDSX2 = roomAirflowNetworkZoneInfo.HumRatDSX1; - roomAirflowNetworkZoneInfo.HumRatDSX1 = roomAirflowNetworkZoneInfo.HumRat; - } - } - } - - if (state.dataHeatBal->ZoneAirSolutionAlgo != DataHeatBalance::SolutionAlgo::ThirdOrder) { - this->ZoneTM2 = this->ZoneTMX; - this->ZoneTMX = this->MAT; // using average for whole zone time step. - this->ZoneWM2 = this->ZoneWMX; - this->ZoneWMX = this->ZoneAirHumRatTemp; // using average for whole zone time step. - - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0) { - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || - state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || - state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { - state.dataRoomAirMod->ZoneM2Floor(zoneNum) = state.dataRoomAirMod->ZoneMXFloor(zoneNum); - state.dataRoomAirMod->ZoneMXFloor(zoneNum) = state.dataRoomAirMod->ZTFloor(zoneNum); // using average for whole zone time step. - state.dataRoomAirMod->ZoneM2OC(zoneNum) = state.dataRoomAirMod->ZoneMXOC(zoneNum); - state.dataRoomAirMod->ZoneMXOC(zoneNum) = state.dataRoomAirMod->ZTOC(zoneNum); // using average for whole zone time step. - state.dataRoomAirMod->ZoneM2MX(zoneNum) = state.dataRoomAirMod->ZoneMXMX(zoneNum); - state.dataRoomAirMod->ZoneMXMX(zoneNum) = state.dataRoomAirMod->ZTMX(zoneNum); // using average for whole zone time step. - } - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { - auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); - roomAirflowNetworkZoneInfo.AirTempTM2 = roomAirflowNetworkZoneInfo.AirTempTMX; - roomAirflowNetworkZoneInfo.AirTempTMX = roomAirflowNetworkZoneInfo.AirTemp; - - roomAirflowNetworkZoneInfo.HumRatWM2 = roomAirflowNetworkZoneInfo.HumRatWMX; - roomAirflowNetworkZoneInfo.HumRatWMX = roomAirflowNetworkZoneInfo.HumRat; - } - } - } - } -} - -void RevertZoneTimestepHistories(EnergyPlusData &state) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN February 2008 - - // PURPOSE OF THIS SUBROUTINE: - // Revert the temperature and humidity ratio histories - - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).revertZoneTimestepHistory(state, zoneNum); - if (state.dataHeatBal->doSpaceHeatBalance) { - for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).revertZoneTimestepHistory(state, zoneNum, spaceNum); - } - } - } -} - -void ZoneSpaceHeatBalanceData::revertZoneTimestepHistory(EnergyPlusData &state, int const zoneNum, int const spaceNum) -{ - assert(zoneNum > 0); - - for (int iHistory = 0; iHistory <= 2; ++iHistory) { - this->XMAT[iHistory] = this->XMAT[iHistory + 1]; - this->WPrevZoneTS[iHistory] = this->WPrevZoneTS[iHistory + 1]; - } - - // SpaceHB TODO: For now, room air model is only for zones - if (spaceNum == 0) { - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDDV || - state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFI || - state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::UCSDUFE) { - - state.dataRoomAirMod->XMATFloor(zoneNum) = state.dataRoomAirMod->XM2TFloor(zoneNum); - state.dataRoomAirMod->XM2TFloor(zoneNum) = state.dataRoomAirMod->XM3TFloor(zoneNum); - state.dataRoomAirMod->XM3TFloor(zoneNum) = state.dataRoomAirMod->XM4TFloor(zoneNum); - - state.dataRoomAirMod->XMATOC(zoneNum) = state.dataRoomAirMod->XM2TOC(zoneNum); - state.dataRoomAirMod->XM2TOC(zoneNum) = state.dataRoomAirMod->XM3TOC(zoneNum); - state.dataRoomAirMod->XM3TOC(zoneNum) = state.dataRoomAirMod->XM4TOC(zoneNum); - - state.dataRoomAirMod->XMATMX(zoneNum) = state.dataRoomAirMod->XM2TMX(zoneNum); - state.dataRoomAirMod->XM2TMX(zoneNum) = state.dataRoomAirMod->XM3TMX(zoneNum); - state.dataRoomAirMod->XM3TMX(zoneNum) = state.dataRoomAirMod->XM4TMX(zoneNum); - } - - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { - auto &roomAirflowNetworkZoneInfo = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode); - roomAirflowNetworkZoneInfo.AirTempX1 = roomAirflowNetworkZoneInfo.AirTempX2; - roomAirflowNetworkZoneInfo.AirTempX2 = roomAirflowNetworkZoneInfo.AirTempX3; - roomAirflowNetworkZoneInfo.AirTempX3 = roomAirflowNetworkZoneInfo.AirTempX4; - - roomAirflowNetworkZoneInfo.HumRatX1 = roomAirflowNetworkZoneInfo.HumRatX2; - roomAirflowNetworkZoneInfo.HumRatX2 = roomAirflowNetworkZoneInfo.HumRatX3; - roomAirflowNetworkZoneInfo.HumRatX3 = roomAirflowNetworkZoneInfo.HumRatX4; - } - } - } -} - -void ZoneSpaceHeatBalanceData::correctHumRat(EnergyPlusData &state, int const zoneNum, int const spaceNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Richard Liesen - // DATE WRITTEN 2000 - // REFERENCES: Routine FinalZnCalcs - FINAL ZONE CALCULATIONS, authored by Dale Herron for BLAST. - - assert(zoneNum > 0); - static constexpr std::string_view RoutineName("correctHumRat"); - - Real64 MoistureMassFlowRate = 0.0; - Real64 ZoneMassFlowRate = 0.0; - auto &zone = state.dataHeatBal->Zone(zoneNum); - int ZoneMult = zone.Multiplier * zone.ListMultiplier; - bool ControlledZoneAirFlag = zone.IsControlled; - bool ZoneRetPlenumAirFlag = zone.IsReturnPlenum; - bool ZoneSupPlenumAirFlag = zone.IsSupplyPlenum; - - if (ControlledZoneAirFlag) { // If there is system flow then calculate the flow rates - auto &zoneEquipConfig = state.dataZoneEquip->ZoneEquipConfig(zoneNum); - // Calculate moisture flow rate into each zone - for (int NodeNum = 1; NodeNum <= zoneEquipConfig.NumInletNodes; ++NodeNum) { - auto &inletNode = state.dataLoopNodes->Node(zoneEquipConfig.InletNode(NodeNum)); - MoistureMassFlowRate += (inletNode.MassFlowRate * inletNode.HumRat) / ZoneMult; - ZoneMassFlowRate += inletNode.MassFlowRate / ZoneMult; - } - - // Do the calculations for the plenum zone - } else if (ZoneRetPlenumAirFlag) { - int ZoneRetPlenumNum = zone.PlenumCondNum; - auto &zoneRetPlenCond = state.dataZonePlenum->ZoneRetPlenCond(ZoneRetPlenumNum); - for (int NodeNum = 1; NodeNum <= zoneRetPlenCond.NumInletNodes; ++NodeNum) { - auto &inletNode = state.dataLoopNodes->Node(zoneRetPlenCond.InletNode(NodeNum)); - MoistureMassFlowRate += (inletNode.MassFlowRate * inletNode.HumRat) / ZoneMult; - ZoneMassFlowRate += inletNode.MassFlowRate / ZoneMult; - } - // add in the leak flow - for (int ADUListIndex = 1; ADUListIndex <= zoneRetPlenCond.NumADUs; ++ADUListIndex) { - int ADUNum = zoneRetPlenCond.ADUIndex(ADUListIndex); - auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(ADUNum); - if (airDistUnit.UpStreamLeak) { - int ADUInNode = airDistUnit.InletNodeNum; - MoistureMassFlowRate += (airDistUnit.MassFlowRateUpStrLk * state.dataLoopNodes->Node(ADUInNode).HumRat) / ZoneMult; - ZoneMassFlowRate += airDistUnit.MassFlowRateUpStrLk / ZoneMult; - } - if (airDistUnit.DownStreamLeak) { - int ADUOutNode = airDistUnit.OutletNodeNum; - MoistureMassFlowRate += (airDistUnit.MassFlowRateDnStrLk * state.dataLoopNodes->Node(ADUOutNode).HumRat) / ZoneMult; - ZoneMassFlowRate += airDistUnit.MassFlowRateDnStrLk / ZoneMult; - } - } - - } else if (ZoneSupPlenumAirFlag) { - int ZoneSupPlenumNum = zone.PlenumCondNum; - auto &inletNode = state.dataLoopNodes->Node(state.dataZonePlenum->ZoneSupPlenCond(ZoneSupPlenumNum).InletNode); - MoistureMassFlowRate += (inletNode.MassFlowRate * inletNode.HumRat) / ZoneMult; - ZoneMassFlowRate += inletNode.MassFlowRate / ZoneMult; - } - - // Calculate hourly humidity ratio from infiltration + humidity added from latent load + system added moisture - Real64 LatentGain = this->ZoneLatentGain + state.dataHeatBalFanSys->SumLatentHTRadSys(zoneNum) + state.dataHeatBalFanSys->SumLatentPool(zoneNum); - - Real64 SysTimeStepInSeconds = DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys; - - // Calculate the coefficients for the 3rd order derivative for final - // zone humidity ratio. The A, B, C coefficients are analogous to the - // heat balance. There are 2 cases that should be considered, system - // operating and system shutdown. - - Real64 const RhoAir = Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, this->ZT, this->ZoneAirHumRat, RoutineName); - Real64 const H2OHtOfVap = Psychrometrics::PsyHgAirFnWTdb(this->ZoneAirHumRat, this->ZT); - - Real64 B = (LatentGain / H2OHtOfVap) + ((this->OAMFL + this->VAMFL + this->CTMFL) * state.dataEnvrn->OutHumRat) + this->EAMFLxHumRat + - (MoistureMassFlowRate) + this->SumHmARaW + this->MixingMassFlowXHumRat + this->MDotOA * state.dataEnvrn->OutHumRat; - Real64 A = ZoneMassFlowRate + this->OAMFL + this->VAMFL + this->EAMFL + this->CTMFL + this->SumHmARa + this->MixingMassFlowZone + this->MDotOA; - - if (state.afn->multizone_always_simulated || - (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && - state.afn->AirflowNetworkFanActivated)) { - auto &exchangeData = state.afn->exchangeData(zoneNum); - // Multizone airflow calculated in AirflowNetwork - B = (LatentGain / H2OHtOfVap) + (exchangeData.SumMHrW + exchangeData.SumMMHrW) + (MoistureMassFlowRate) + this->SumHmARaW; - A = ZoneMassFlowRate + exchangeData.SumMHr + exchangeData.SumMMHr + this->SumHmARa; - } - Real64 C = RhoAir * zone.Volume * zone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; - - if (state.afn->distribution_simulated) { - B += state.afn->exchangeData(zoneNum).TotalLat; - } - - // Use a 3rd order derivative to predict final zone humidity ratio and - // smooth the changes using the zone air capacitance. - // auto &zoneAirHumRatTemp = this->ZoneAirHumRatTemp; - // auto &zoneW1 = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).ZoneW1; - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - this->ZoneAirHumRatTemp = - (B + C * (3.0 * this->WPrevZoneTSTemp[0] - (3.0 / 2.0) * this->WPrevZoneTSTemp[1] + (1.0 / 3.0) * this->WPrevZoneTSTemp[2])) / - ((11.0 / 6.0) * C + A); - // Exact solution - } break; - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (A == 0.0) { // B=0 - this->ZoneAirHumRatTemp = this->ZoneW1 + B / C; - } else { - this->ZoneAirHumRatTemp = (this->ZoneW1 - B / A) * std::exp(min(700.0, -A / C)) + B / A; - } - } break; - case DataHeatBalance::SolutionAlgo::EulerMethod: { - this->ZoneAirHumRatTemp = (C * this->ZoneW1 + B) / (C + A); - } break; - default: - break; - } - - // Set the humidity ratio to zero if the zone has been dried out - if (this->ZoneAirHumRatTemp < 0.0) this->ZoneAirHumRatTemp = 0.0; - - // Check to make sure that is saturated there is condensation in the zone - // by resetting to saturation conditions. - Real64 const WZSat = Psychrometrics::PsyWFnTdbRhPb(state, this->ZT, 1.0, state.dataEnvrn->OutBaroPress, RoutineName); - - if (this->ZoneAirHumRatTemp > WZSat) this->ZoneAirHumRatTemp = WZSat; - - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - this->ZoneAirHumRatTemp = state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum) - .Node(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).ControlAirNodeID) - .HumRat; - } - - // HybridModel with measured humidity ratio begins - // SpaceHB TODO: For now, hybrid model is only for zones - if (spaceNum == 0 && state.dataHybridModel->FlagHybridModel) { - if ((state.dataHybridModel->HybridModelZone(zoneNum).InfiltrationCalc_H || - state.dataHybridModel->HybridModelZone(zoneNum).PeopleCountCalc_H) && - (!state.dataGlobal->WarmupFlag) && (!state.dataGlobal->DoingSizing)) { - Real64 LatentGainExceptPeople = 0.0; - if (state.dataHybridModel->HybridModelZone(zoneNum).PeopleCountCalc_H) { - LatentGainExceptPeople = this->ZoneLatentGainExceptPeople + state.dataHeatBalFanSys->SumLatentHTRadSys(zoneNum) + - state.dataHeatBalFanSys->SumLatentPool(zoneNum); - } - - InverseModelHumidity(state, zoneNum, LatentGain, LatentGainExceptPeople, ZoneMassFlowRate, MoistureMassFlowRate, H2OHtOfVap, RhoAir); - } - } - - // Now put the calculated info into the actual zone nodes; ONLY if there is zone air flow, i.e. controlled zone or plenum zone - int ZoneNodeNum = zone.SystemZoneNodeNumber; - if (spaceNum > 0) { - ZoneNodeNum = state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber; - } - if (ZoneNodeNum > 0) { - state.dataLoopNodes->Node(ZoneNodeNum).HumRat = this->ZoneAirHumRatTemp; - state.dataLoopNodes->Node(ZoneNodeNum).Enthalpy = Psychrometrics::PsyHFnTdbW(this->ZT, this->ZoneAirHumRatTemp); - } - if (state.dataHeatBal->DoLatentSizing) { - Real64 sensibleLoad = 0.0; - Real64 pSat = Psychrometrics::PsyPsatFnTemp(state, this->ZT, RoutineName); - Real64 Tdp = Psychrometrics::PsyTdpFnWPb(state, this->ZoneAirHumRatTemp, state.dataEnvrn->StdBaroPress); - Real64 vaporPressureDiff = pSat - Psychrometrics::PsyPsatFnTemp(state, Tdp, RoutineName); - if (spaceNum > 0) { - sensibleLoad = state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).ZoneSNLoadHeatRate + - state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).ZoneSNLoadCoolRate; - state.dataZoneEnergyDemand->spaceSysMoistureDemand(spaceNum).reportZoneAirSystemMoistureLoads( - state, LatentGain, sensibleLoad, vaporPressureDiff); - } else { - sensibleLoad = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).ZoneSNLoadHeatRate + - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).ZoneSNLoadCoolRate; - state.dataZoneEnergyDemand->ZoneSysMoistureDemand(zoneNum).reportZoneAirSystemMoistureLoads( - state, LatentGain, sensibleLoad, vaporPressureDiff); - } - } -} - -void DownInterpolate4HistoryValues(Real64 const OldTimeStep, - Real64 const NewTimeStep, - Real64 const oldVal0, - Real64 const oldVal1, - Real64 const oldVal2, - Real64 &newVal0, - Real64 &newVal1, - Real64 &newVal2, - Real64 &newVal3, - Real64 &newVal4) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN Feb 2008 - - // PURPOSE OF THIS SUBROUTINE: - // provide a reusable routine for the various places that need to - // interpolate a new set of history values on a different time scale - // Once the systemtimestep has shortened, the new history terms need to be interpolated - - // METHODOLOGY EMPLOYED: - // This routine assumes that the direction is to a shorter timestep. - // The down step ratio, DSRatio = OldTimeStep/ NewTimeStep - // is expected to be roughly integer-valued and near 2.0 or 3.0 or 4.0 or more. - - // first construct data on timestamps for interpolating with later - Real64 const oldTime0 = 0.0; - Real64 const oldTime1 = oldTime0 - OldTimeStep; - - Real64 const newTime0 = 0.0; - Real64 const newTime1 = newTime0 - NewTimeStep; - Real64 const newTime2 = newTime1 - NewTimeStep; - Real64 const newTime3 = newTime2 - NewTimeStep; - Real64 const newTime4 = newTime3 - NewTimeStep; - - Real64 const DSRatio = OldTimeStep / NewTimeStep; // should pretty much be an integer value 2, 3, 4, etc. - - newVal0 = oldVal0; - - if (std::abs(DSRatio - 2.0) < 0.01) { // DSRatio = 2 - // first two points lie between oldVal0 and oldVal1 - newVal1 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime1) / (OldTimeStep)); - newVal2 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime2) / (OldTimeStep)); - // last two points lie between oldVal1 and oldVal2 - newVal3 = oldVal1 + (oldVal2 - oldVal1) * ((oldTime1 - newTime3) / (OldTimeStep)); - newVal4 = oldVal1 + (oldVal2 - oldVal1) * ((oldTime1 - newTime4) / (OldTimeStep)); - } else if (std::abs(DSRatio - 3.0) < 0.01) { // DSRatio = 3 - // first three points lie between oldVal0 and oldVal1 - newVal1 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime1) / (OldTimeStep)); - newVal2 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime2) / (OldTimeStep)); - newVal3 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime3) / (OldTimeStep)); - // last point lie between oldVal1 and oldVal2 - newVal4 = oldVal1 + (oldVal2 - oldVal1) * ((oldTime1 - newTime4) / (OldTimeStep)); - - } else { // DSRatio = 4 or more - // all new points lie between oldVal0 and oldVal1 - newVal1 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime1) / (OldTimeStep)); - newVal2 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime2) / (OldTimeStep)); - newVal3 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime3) / (OldTimeStep)); - newVal4 = oldVal0 + (oldVal1 - oldVal0) * ((oldTime0 - newTime4) / (OldTimeStep)); - } -} - -Real64 DownInterpolate4HistoryValues(Real64 OldTimeStep, Real64 NewTimeStep, std::array const &oldVals, std::array &newVals) -{ - // first construct data on timestamps for interpolating with later - Real64 const oldTime0 = 0.0; - Real64 const oldTime1 = oldTime0 - OldTimeStep; - - Real64 const newTime0 = 0.0; - Real64 const newTime1 = newTime0 - NewTimeStep; - Real64 const newTime2 = newTime1 - NewTimeStep; - Real64 const newTime3 = newTime2 - NewTimeStep; - Real64 const newTime4 = newTime3 - NewTimeStep; - - Real64 const DSRatio = OldTimeStep / NewTimeStep; // should pretty much be an integer value 2, 3, 4, etc. - - if (std::abs(DSRatio - 2.0) < 0.01) { // DSRatio = 2 - // first two points lie between oldVals[0] and oldVals[1] - Real64 delta10 = oldVals[1] - oldVals[0]; - newVals[0] = oldVals[0] + delta10 * ((oldTime0 - newTime1) / OldTimeStep); - newVals[1] = oldVals[0] + delta10 * ((oldTime0 - newTime2) / OldTimeStep); - // last two points lie between oldVals[1] and oldVals[2] - Real64 delta21 = oldVals[2] - oldVals[1]; - newVals[2] = oldVals[1] + delta21 * ((oldTime1 - newTime3) / OldTimeStep); - newVals[3] = oldVals[1] + delta21 * ((oldTime1 - newTime4) / OldTimeStep); - } else if (std::abs(DSRatio - 3.0) < 0.01) { // DSRatio = 3 - // first three points lie between oldVals[0] and oldVals[1] - Real64 delta10 = oldVals[1] - oldVals[0]; - newVals[0] = oldVals[0] + delta10 * ((oldTime0 - newTime1) / OldTimeStep); - newVals[1] = oldVals[0] + delta10 * ((oldTime0 - newTime2) / OldTimeStep); - newVals[2] = oldVals[0] + delta10 * ((oldTime0 - newTime3) / OldTimeStep); - // last point lie between oldVals[1] and oldVals[2] - Real64 delta21 = (oldVals[2] - oldVals[1]) / OldTimeStep; - newVals[3] = oldVals[1] + delta21 * ((oldTime1 - newTime4) / OldTimeStep); - - } else { // DSRatio = 4 or more - // all new points lie between oldVals[0] and oldVals[1] - Real64 delta10 = oldVals[1] - oldVals[0]; - newVals[0] = oldVals[0] + delta10 * ((oldTime0 - newTime1) / OldTimeStep); - newVals[1] = oldVals[0] + delta10 * ((oldTime0 - newTime2) / OldTimeStep); - newVals[2] = oldVals[0] + delta10 * ((oldTime0 - newTime3) / OldTimeStep); - newVals[3] = oldVals[0] + delta10 * ((oldTime0 - newTime4) / OldTimeStep); - } - return oldVals[0]; - - // if (std::abs(DSRatio - 2.0) < 0.01) { // DSRatio = 2 - // // first two points lie between oldVals[0] and oldVals[1] - // Real64 ratio10 = (oldVals[1] - oldVals[0]) / OldTimeStep; - // newVals[0] = oldVals[0] + ratio10 * (oldTime0 - newTime1); - // newVals[1] = oldVals[0] + ratio10 * (oldTime0 - newTime2); - // // last two points lie between oldVals[1] and oldVals[2] - // Real64 ratio21 = (oldVals[2] - oldVals[1]) / OldTimeStep; - // newVals[2] = oldVals[1] + ratio21 * (oldTime1 - newTime3); - // newVals[3] = oldVals[1] + ratio21 * (oldTime1 - newTime4); - // } else if (std::abs(DSRatio - 3.0) < 0.01) { // DSRatio = 3 - // // first three points lie between oldVals[0] and oldVals[1] - // Real64 ratio10 = (oldVals[1] - oldVals[0]) / OldTimeStep; - // newVals[0] = oldVals[0] + ratio10 * (oldTime0 - newTime1); - // newVals[1] = oldVals[0] + ratio10 * (oldTime0 - newTime2); - // newVals[2] = oldVals[0] + ratio10 * (oldTime0 - newTime3); - // // last point lie between oldVals[1] and oldVals[2] - // Real64 ratio21 = (oldVals[2] - oldVals[1]) / OldTimeStep; - // newVals[3] = oldVals[1] + ratio21 * (oldTime1 - newTime4); - - //} else { // DSRatio = 4 or more - // // all new points lie between oldVals[0] and oldVals[1] - // Real64 ratio10 = (oldVals[1] - oldVals[0]) / OldTimeStep; - // newVals[0] = oldVals[0] + ratio10 * (oldTime0 - newTime1); - // newVals[1] = oldVals[0] + ratio10 * (oldTime0 - newTime2); - // newVals[2] = oldVals[0] + ratio10 * (oldTime0 - newTime3); - // newVals[3] = oldVals[0] + ratio10 * (oldTime0 - newTime4); - //} -} -void InverseModelTemperature(EnergyPlusData &state, - int const ZoneNum, // Zone number - Real64 const SumIntGain, // Zone sum of convective internal gains - Real64 const SumIntGainExceptPeople, // Zone sum of convective internal gains except for people - Real64 const SumHA, // Zone sum of Hc*Area - Real64 const SumHATsurf, // Zone sum of Hc*Area*Tsurf - Real64 const SumHATref, // Zone sum of Hc*Area*Tref, for ceiling diffuser convection correlation - Real64 const SumMCp, // Zone sum of MassFlowRate*Cp - Real64 const SumMCpT, // Zone sum of MassFlowRate*Cp*T - Real64 const SumSysMCp, // Zone sum of air system MassFlowRate*Cp - Real64 const SumSysMCpT, // Zone sum of air system MassFlowRate*Cp*T - Real64 const AirCap // Formerly CoefAirrat, coef in zone temp eqn with dim of "air power capacity"rd -) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Han Li - // DATE WRITTEN February 2019 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine inversely solve infiltration airflow rate or people count with zone air temperatures measurements. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 AirCapHM(0.0); // Air power capacity for hybrid modeling - Real64 AA(0.0); - Real64 BB(0.0); - Real64 FractionConvection(0.0); // Default convection portion of the sensible heat from people - - auto &zone = state.dataHeatBal->Zone(ZoneNum); - auto &hybridModelZone = state.dataHybridModel->HybridModelZone(ZoneNum); - auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); - - int ZoneMult = zone.Multiplier * zone.ListMultiplier; - zone.ZoneMeasuredTemperature = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneMeasuredTemperatureSchedulePtr); - - // HM calculation only HM calculation period start - if (state.dataEnvrn->DayOfYear >= hybridModelZone.HybridStartDayOfYear && state.dataEnvrn->DayOfYear <= hybridModelZone.HybridEndDayOfYear) { - Real64 HMMultiplierAverage(1.0); - Real64 MultpHM(1.0); - - thisZoneHB.ZT = zone.ZoneMeasuredTemperature; // Array1D ZT -- Zone - // Air Temperature Averaged over - // the System Time Increment - if (hybridModelZone.InfiltrationCalc_T && state.dataHVACGlobal->UseZoneTimeStepHistory) { - static constexpr std::string_view RoutineNameInfiltration("CalcAirFlowSimple:Infiltration"); - - if (hybridModelZone.IncludeSystemSupplyParameters) { - zone.ZoneMeasuredSupplyAirTemperature = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirTemperatureSchedulePtr); - zone.ZoneMeasuredSupplyAirFlowRate = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); - zone.ZoneMeasuredSupplyAirHumidityRatio = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); - // Calculate the air humidity ratio at supply air inlet. - Real64 CpAirInlet(0.0); - CpAirInlet = Psychrometrics::PsyCpAirFnW(zone.ZoneMeasuredSupplyAirHumidityRatio); - - Real64 SumSysMCp_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet; - Real64 SumSysMCpT_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet * zone.ZoneMeasuredSupplyAirTemperature; - - AA = SumSysMCp_HM + SumHA + thisZoneHB.MCPV + thisZoneHB.MCPM + thisZoneHB.MCPE + thisZoneHB.MCPC + thisZoneHB.MDotCPOA; - BB = SumSysMCpT_HM + SumIntGain + SumHATsurf - SumHATref + thisZoneHB.MCPTV + thisZoneHB.MCPTM + thisZoneHB.MCPTE + thisZoneHB.MCPTC + - thisZoneHB.MDotCPOA * zone.OutDryBulbTemp + (thisZoneHB.NonAirSystemResponse / ZoneMult + thisZoneHB.SysDepZoneLoadsLagged); - } else { - AA = SumHA + thisZoneHB.MCPV + thisZoneHB.MCPM + thisZoneHB.MCPE + thisZoneHB.MCPC + thisZoneHB.MDotCPOA; - BB = SumIntGain + SumHATsurf - SumHATref + thisZoneHB.MCPTV + thisZoneHB.MCPTM + thisZoneHB.MCPTE + thisZoneHB.MCPTC + - thisZoneHB.MDotCPOA * zone.OutDryBulbTemp; - } - Real64 CC = AirCap; - Real64 DD = - (3.0 * state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) - (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum) + - (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredZT3(ZoneNum)); - - Real64 delta_T = (zone.ZoneMeasuredTemperature - zone.OutDryBulbTemp); - Real64 CpAir = Psychrometrics::PsyCpAirFnW(state.dataEnvrn->OutHumRat); - Real64 AirDensity = Psychrometrics::PsyRhoAirFnPbTdbW( - state, state.dataEnvrn->OutBaroPress, zone.OutDryBulbTemp, state.dataEnvrn->OutHumRat, RoutineNameInfiltration); - zone.delta_T = delta_T; - - // s4 - Set ACH to 0 when delta_T <= 0.5, add max and min limits to ach - Real64 M_inf = 0.0; - if (std::abs(delta_T) > 0.5) { - M_inf = (BB + CC * DD - ((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredTemperature) / (CpAir * delta_T); - } - Real64 ACH_inf = max(0.0, min(10.0, (M_inf / AirDensity) / zone.Volume * DataGlobalConstants::SecInHour)); - M_inf = (ACH_inf / DataGlobalConstants::SecInHour) * zone.Volume * AirDensity; - - // Overwrite variable with inverse solution - zone.MCPIHM = M_inf; - zone.InfilOAAirChangeRateHM = ACH_inf; - - } // Hybrid model infiltration calculation end - - // Hybrid modeling internal thermal mass calculation start - if (hybridModelZone.InternalThermalMassCalc_T && SumSysMCpT == 0 && thisZoneHB.ZT != state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) && - state.dataHVACGlobal->UseZoneTimeStepHistory) { // HM calculation only when SumSysMCpT =0, - // TimeStepZone (not @ TimeStepSys) - Real64 TempDepCoef = SumHA + SumMCp + SumSysMCp; - Real64 TempIndCoef = SumIntGain + SumHATsurf - SumHATref + SumMCpT + SumSysMCpT + - (thisZoneHB.NonAirSystemResponse / ZoneMult + thisZoneHB.SysDepZoneLoadsLagged); - // TempHistoryTerm = AirCap * (3.0 * ZTM1(ZoneNum) - (3.0/2.0) * ZTM2(ZoneNum) + (1.0/3.0) * ZTM3(ZoneNum)) !debug only - - if (state.afn->distribution_simulated) { - TempIndCoef += state.afn->exchangeData(ZoneNum).TotalSen; - } - // Calculate air capacity using DataHeatBalance::SolutionAlgo::AnalyticalSolution - if (TempDepCoef == 0.0) { - // Is this correct? Shouldn't we use log?? What if thisZT == - // PreviousMeasuredZT1(ZoneNum)?? - AirCapHM = TempIndCoef / (thisZoneHB.ZT - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)); // Inverse equation - } else { - Real64 AirCapHM_temp = 0.0; - if (TempIndCoef == TempDepCoef * thisZoneHB.ZT) { - AirCapHM_temp = 0.0; // This is the denominator. - } else { - AirCapHM_temp = (TempIndCoef - TempDepCoef * state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)) / - (TempIndCoef - TempDepCoef * thisZoneHB.ZT); - } - - if ((AirCapHM_temp > 0) && (AirCapHM_temp != 1)) { // Avoide IND - AirCapHM = TempDepCoef / std::log(AirCapHM_temp); // Inverse equation - } else { - AirCapHM = TempIndCoef / (thisZoneHB.ZT - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)); - } - } - - // Calculate multiplier - if (std::abs(thisZoneHB.ZT - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum)) > 0.05) { // Filter - MultpHM = AirCapHM / - (zone.Volume * - Psychrometrics::PsyRhoAirFnPbTdbW(state, - state.dataEnvrn->OutBaroPress, - thisZoneHB.ZT, - thisZoneHB.ZoneAirHumRat) * - Psychrometrics::PsyCpAirFnW(thisZoneHB.ZoneAirHumRat)) * - (state.dataGlobal->TimeStepZone * DataGlobalConstants::SecInHour); // Inverse equation - if ((MultpHM < 1.0) || (MultpHM > 30.0)) { // Temperature capacity multiplier greater than - // 1 and less than 30 - MultpHM = 1.0; // Default value 1.0 - } - } else { - MultpHM = 1.0; // Default value 1.0 - } - - zone.ZoneVolCapMultpSensHM = MultpHM; // For timestep output - - // Calculate the average multiplier of the zone for the whole running period - { - // count for hybrid model calculations - if (MultpHM > 1.0) { - zone.ZoneVolCapMultpSensHMSum += MultpHM; - zone.ZoneVolCapMultpSensHMCountSum++; - } - - // Calculate and store the multiplier average at the end of HM - // simulations - if (state.dataEnvrn->DayOfYear == hybridModelZone.HybridEndDayOfYear && state.dataGlobal->EndDayFlag) { - HMMultiplierAverage = zone.ZoneVolCapMultpSensHMSum / zone.ZoneVolCapMultpSensHMCountSum; - zone.ZoneVolCapMultpSensHMAverage = HMMultiplierAverage; - } - } - } // Hybrid model internal thermal mass calcualtion end - - // Hybrid model people count calculation - if (hybridModelZone.PeopleCountCalc_T && state.dataHVACGlobal->UseZoneTimeStepHistory) { - zone.ZoneMeasuredTemperature = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneMeasuredTemperatureSchedulePtr); - zone.ZonePeopleActivityLevel = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleActivityLevelSchedulePtr); - zone.ZonePeopleSensibleHeatFraction = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleSensibleFractionSchedulePtr); - zone.ZonePeopleRadiantHeatFraction = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleRadiationFractionSchedulePtr); - - Real64 FractionSensible = zone.ZonePeopleSensibleHeatFraction; - Real64 FractionRadiation = zone.ZonePeopleRadiantHeatFraction; - Real64 ActivityLevel = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleActivityLevelSchedulePtr); - - if (FractionSensible <= 0.0) { - FractionSensible = 0.6; - } - - if (FractionRadiation <= 0.0) { - FractionConvection = 0.7; - } else { - FractionConvection = 1.0 - FractionRadiation; - } - - if (ActivityLevel <= 0.0) { - ActivityLevel = 130.0; - } - - if (hybridModelZone.IncludeSystemSupplyParameters) { - zone.ZoneMeasuredSupplyAirTemperature = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirTemperatureSchedulePtr); - zone.ZoneMeasuredSupplyAirFlowRate = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); - zone.ZoneMeasuredSupplyAirHumidityRatio = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); - - // Calculate the air humidity ratio at supply air inlet. - Real64 CpAirInlet = Psychrometrics::PsyCpAirFnW(zone.ZoneMeasuredSupplyAirHumidityRatio); - - Real64 SumSysMCp_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet; - Real64 SumSysMCpT_HM = zone.ZoneMeasuredSupplyAirFlowRate * CpAirInlet * zone.ZoneMeasuredSupplyAirTemperature; - - AA = SumSysMCp_HM + SumHA + SumMCp; - BB = SumSysMCpT_HM + SumIntGainExceptPeople + SumHATsurf - SumHATref + SumMCpT + - (thisZoneHB.NonAirSystemResponse / ZoneMult + thisZoneHB.SysDepZoneLoadsLagged); - } else { - AA = SumHA + SumMCp; - BB = SumIntGainExceptPeople + SumHATsurf - SumHATref + SumMCpT; - } - - Real64 CC = AirCap; - Real64 DD = - (3.0 * state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) - (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum) + - (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredZT3(ZoneNum)); - - Real64 SumIntGainPeople = ((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredTemperature - BB - CC * DD; - Real64 UpperBound = max(0.0, SumIntGain / (ActivityLevel * FractionSensible * FractionConvection)); - Real64 NumPeople = min(UpperBound, max(0.0, SumIntGainPeople / (ActivityLevel * FractionSensible * FractionConvection))); - - if (NumPeople < 0.05) { - NumPeople = 0; - } - zone.NumOccHM = NumPeople; - } - } - - // Update zone temperatures in the previous steps - state.dataHeatBalFanSys->PreviousMeasuredZT3(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum); - state.dataHeatBalFanSys->PreviousMeasuredZT2(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum); - state.dataHeatBalFanSys->PreviousMeasuredZT1(ZoneNum) = thisZoneHB.ZT; -} - -void InverseModelHumidity(EnergyPlusData &state, - int const ZoneNum, // Zone number - Real64 const LatentGain, // Zone sum of latent gain - Real64 const LatentGainExceptPeople, // Zone sum of latent gain except for people - Real64 const ZoneMassFlowRate, // Zone air mass flow rate - Real64 const MoistureMassFlowRate, // Zone moisture mass flow rate - Real64 const H2OHtOfVap, // Heat of vaporization of air - Real64 const RhoAir // Air density -) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Han Li - // DATE WRITTEN February 2019 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine inversely solve infiltration airflow rate or people count with zone air humidity measurements. - - // SUBROUTINE PARAMETER DEFINITIONS: - static constexpr std::string_view RoutineName("InverseModelHumidity"); - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 AA(0.0); - Real64 BB(0.0); - Real64 ActivityLevel(0.0); - Real64 SysTimeStepInSeconds = DataGlobalConstants::SecInHour * state.dataHVACGlobal->TimeStepSys; - - auto &zone = state.dataHeatBal->Zone(ZoneNum); - auto &hybridModelZone = state.dataHybridModel->HybridModelZone(ZoneNum); - auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); - - // Get measured zone humidity ratio - zone.ZoneMeasuredHumidityRatio = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneMeasuredHumidityRatioSchedulePtr); - - if (state.dataEnvrn->DayOfYear >= hybridModelZone.HybridStartDayOfYear && state.dataEnvrn->DayOfYear <= hybridModelZone.HybridEndDayOfYear) { - thisZoneHB.ZoneAirHumRat = zone.ZoneMeasuredHumidityRatio; - - // Hybrid Model calculate air infiltration rate - if (hybridModelZone.InfiltrationCalc_H && state.dataHVACGlobal->UseZoneTimeStepHistory) { - // Conditionally calculate the time dependent and time independent terms - if (hybridModelZone.IncludeSystemSupplyParameters) { - zone.ZoneMeasuredSupplyAirFlowRate = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); - zone.ZoneMeasuredSupplyAirHumidityRatio = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); - - Real64 SumSysM_HM = zone.ZoneMeasuredSupplyAirFlowRate; - Real64 SumSysMHumRat_HM = zone.ZoneMeasuredSupplyAirFlowRate * zone.ZoneMeasuredSupplyAirHumidityRatio; - - AA = SumSysM_HM + thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + thisZoneHB.MixingMassFlowZone + - thisZoneHB.MDotOA; - BB = SumSysMHumRat_HM + (LatentGain / H2OHtOfVap) + ((thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + - thisZoneHB.EAMFLxHumRat + thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + - thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; - } else { - AA = thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + thisZoneHB.MixingMassFlowZone + thisZoneHB.MDotOA; - BB = (LatentGain / H2OHtOfVap) + ((thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + thisZoneHB.EAMFLxHumRat + - thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; - } - - Real64 CC = RhoAir * zone.Volume * zone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; - Real64 DD = (3.0 * state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum) - - (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum) + - (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat3(ZoneNum)); - - Real64 delta_HR = (zone.ZoneMeasuredHumidityRatio - state.dataEnvrn->OutHumRat); - - Real64 AirDensity = - Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, zone.OutDryBulbTemp, state.dataEnvrn->OutHumRat, RoutineName); - - Real64 M_inf = 0.0; - if (std::abs(zone.ZoneMeasuredHumidityRatio - state.dataEnvrn->OutHumRat) > 0.0000001) { - M_inf = (CC * DD + BB - ((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredHumidityRatio) / delta_HR; - } - - // Add threshold for air change rate - Real64 ACH_inf = max(0.0, min(10.0, (M_inf / AirDensity) / zone.Volume * DataGlobalConstants::SecInHour)); - M_inf = (ACH_inf / DataGlobalConstants::SecInHour) * zone.Volume * AirDensity; - zone.MCPIHM = M_inf; - zone.InfilOAAirChangeRateHM = ACH_inf; - } - - // Hybrid Model calculate people count - if (hybridModelZone.PeopleCountCalc_H && state.dataHVACGlobal->UseZoneTimeStepHistory) { - zone.ZonePeopleActivityLevel = ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleActivityLevelSchedulePtr); - zone.ZonePeopleSensibleHeatFraction = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleSensibleFractionSchedulePtr); - zone.ZonePeopleRadiantHeatFraction = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZonePeopleRadiationFractionSchedulePtr); - - Real64 FractionSensible = zone.ZonePeopleSensibleHeatFraction; - - if (FractionSensible <= 0.0) { - FractionSensible = 0.6; - } - - if (ActivityLevel <= 0.0) { - ActivityLevel = 130.0; - } - - // Conditionally calculate the humidity-dependent and humidity-independent - // terms. - if (hybridModelZone.IncludeSystemSupplyParameters) { - zone.ZoneMeasuredSupplyAirFlowRate = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirMassFlowRateSchedulePtr); - zone.ZoneMeasuredSupplyAirHumidityRatio = - ScheduleManager::GetCurrentScheduleValue(state, hybridModelZone.ZoneSupplyAirHumidityRatioSchedulePtr); - - Real64 SumSysM_HM = zone.ZoneMeasuredSupplyAirFlowRate; - Real64 SumSysMHumRat_HM = zone.ZoneMeasuredSupplyAirFlowRate * zone.ZoneMeasuredSupplyAirHumidityRatio; - - AA = SumSysM_HM + thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + - thisZoneHB.MixingMassFlowZone + thisZoneHB.MDotOA; - BB = SumSysMHumRat_HM + (LatentGainExceptPeople / H2OHtOfVap) + - ((thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + thisZoneHB.EAMFLxHumRat + - thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; - } else { - AA = ZoneMassFlowRate + thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.EAMFL + thisZoneHB.CTMFL + thisZoneHB.SumHmARa + - thisZoneHB.MixingMassFlowZone + thisZoneHB.MDotOA; - BB = (LatentGainExceptPeople / H2OHtOfVap) + ((thisZoneHB.OAMFL + thisZoneHB.VAMFL + thisZoneHB.CTMFL) * state.dataEnvrn->OutHumRat) + - thisZoneHB.EAMFLxHumRat + (MoistureMassFlowRate) + thisZoneHB.SumHmARaW + thisZoneHB.MixingMassFlowXHumRat + - thisZoneHB.MDotOA * state.dataEnvrn->OutHumRat; - } - - Real64 CC = RhoAir * zone.Volume * zone.ZoneVolCapMultpMoist / SysTimeStepInSeconds; - Real64 DD = (3.0 * state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum) - - (3.0 / 2.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum) + - (1.0 / 3.0) * state.dataHeatBalFanSys->PreviousMeasuredHumRat3(ZoneNum)); - - Real64 LatentGainPeople = (((11.0 / 6.0) * CC + AA) * zone.ZoneMeasuredHumidityRatio - BB - CC * DD) * H2OHtOfVap; - Real64 UpperBound = max(0.0, LatentGain / (ActivityLevel * (1.0 - FractionSensible))); - Real64 NumPeople = min(UpperBound, max(0.0, LatentGainPeople / (ActivityLevel * (1.0 - FractionSensible)))); - NumPeople = floor(NumPeople * 100.00 + 0.5) / 100.00; - if (NumPeople < 0.05) { - NumPeople = 0; - } - zone.NumOccHM = NumPeople; - } - } - - // Update zone humidity ratio in the previous steps - state.dataHeatBalFanSys->PreviousMeasuredHumRat3(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum); - state.dataHeatBalFanSys->PreviousMeasuredHumRat2(ZoneNum) = state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum); - state.dataHeatBalFanSys->PreviousMeasuredHumRat1(ZoneNum) = zone.ZoneMeasuredHumidityRatio; -} - -void ZoneSpaceHeatBalanceData::calcZoneOrSpaceSums(EnergyPlusData &state, - bool const CorrectorFlag, // Corrector call flag - int const zoneNum, - int const spaceNum) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Peter Graham Ellis - // DATE WRITTEN July 2003 - // MODIFIED Aug 2003, FCW: add this->SumHA contributions from window frame and divider - // Aug 2003, CC: change how the reference temperatures are used - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine calculates the various sums that go into the zone heat balance - // equation. This replaces the SUMC, SumHA, and SumHAT calculations that were - // previously done in various places throughout the program. - // The SumHAT portion of the code is reproduced in RadiantSystemHighTemp and - // RadiantSystemLowTemp and should be updated accordingly. - // A reference temperature (Tref) is specified for use with the ceiling diffuser - // convection correlation. A bogus value of Tref = -999.9 defaults to using - // the zone air (i.e. outlet) temperature for the reference temperature. - // If Tref is applied to all surfaces, SumHA = 0, and SumHATref /= 0. - // If Tref is not used at all, SumHATref = 0, and SumHA /= 0. - // For future implementations, Tref can be easily converted into an array to - // allow a different reference temperature to be specified for each surface. - assert(zoneNum > 0); - - this->SumHA = 0.0; - this->SumHATsurf = 0.0; - this->SumHATref = 0.0; - this->SumSysMCp = 0.0; - this->SumSysMCpT = 0.0; - // Sum all convective internal gains: this->SumIntGain - if (spaceNum == 0) { - this->SumIntGain = InternalHeatGains::zoneSumAllInternalConvectionGains(state, zoneNum); - } else { - this->SumIntGain = InternalHeatGains::spaceSumAllInternalConvectionGains(state, spaceNum); - } - this->SumIntGain += state.dataHeatBalFanSys->SumConvHTRadSys(zoneNum) + state.dataHeatBalFanSys->SumConvPool(zoneNum); - - // Add heat to return air if zonal system (no return air) or cycling system (return air frequently very low or zero) - assert(zoneNum > 0); - auto &thisZone = state.dataHeatBal->Zone(zoneNum); - if (thisZone.NoHeatToReturnAir) { - if (spaceNum == 0) { - this->SumIntGain += InternalHeatGains::zoneSumAllReturnAirConvectionGains(state, zoneNum, 0); - } else { - this->SumIntGain += InternalHeatGains::spaceSumAllReturnAirConvectionGains(state, spaceNum, 0); - } - } - - // Sum all non-system air flow, i.e. infiltration, simple ventilation, mixing, earth tube: this->SumMCp, this->SumMCpT - this->SumMCp = this->MCPI + this->MCPV + this->MCPM + this->MCPE + this->MCPC + this->MDotCPOA; - this->SumMCpT = this->MCPTI + this->MCPTV + this->MCPTM + this->MCPTE + this->MCPTC + this->MDotCPOA * thisZone.OutDryBulbTemp; - - // Sum all multizone air flow calculated from AirflowNetwork by assuming no simple air infiltration model - if (state.afn->multizone_always_simulated || - (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && - state.afn->AirflowNetworkFanActivated)) { - auto &exchangeData = state.afn->exchangeData(zoneNum); - this->SumMCp = exchangeData.SumMCp + exchangeData.SumMVCp + exchangeData.SumMMCp; - this->SumMCpT = exchangeData.SumMCpT + exchangeData.SumMVCpT + exchangeData.SumMMCpT; - } - - // Sum all system air flow: this->SumSysMCp, this->SumSysMCpT and check to see if this is a controlled zone - if (CorrectorFlag) { - // Plenum and controlled zones have a different set of inlet nodes which must be calculated. - if (thisZone.IsControlled) { - auto const &zec(state.dataZoneEquip->ZoneEquipConfig(zoneNum)); - for (int NodeNum = 1, NodeNum_end = zec.NumInletNodes; NodeNum <= NodeNum_end; ++NodeNum) { - // Get node conditions, this next block is of interest to irratic system loads... maybe nodes are not accurate at time of call? - // how can we tell? predict step must be lagged ? correct step, systems have run. - auto const &node(state.dataLoopNodes->Node(zec.InletNode(NodeNum))); - Real64 CpAir = Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat); - Real64 const MassFlowRate_CpAir(node.MassFlowRate * CpAir); - this->SumSysMCp += MassFlowRate_CpAir; - this->SumSysMCpT += MassFlowRate_CpAir * node.Temp; - } - - } else if (thisZone.IsReturnPlenum) { - auto const &zrpc(state.dataZonePlenum->ZoneRetPlenCond(thisZone.PlenumCondNum)); - Real64 const air_hum_rat(this->ZoneAirHumRat); - for (int NodeNum = 1, NodeNum_end = zrpc.NumInletNodes; NodeNum <= NodeNum_end; ++NodeNum) { - auto const &node(state.dataLoopNodes->Node(zrpc.InletNode(NodeNum))); - Real64 const MassFlowRate_CpAir(node.MassFlowRate * Psychrometrics::PsyCpAirFnW(air_hum_rat)); - this->SumSysMCp += MassFlowRate_CpAir; - this->SumSysMCpT += MassFlowRate_CpAir * node.Temp; - } - // add in the leaks - for (int ADUListIndex = 1, ADUListIndex_end = zrpc.NumADUs; ADUListIndex <= ADUListIndex_end; ++ADUListIndex) { - auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(zrpc.ADUIndex(ADUListIndex)); - if (airDistUnit.UpStreamLeak) { - Real64 const MassFlowRate_CpAir(airDistUnit.MassFlowRateUpStrLk * Psychrometrics::PsyCpAirFnW(air_hum_rat)); - this->SumSysMCp += MassFlowRate_CpAir; - this->SumSysMCpT += MassFlowRate_CpAir * state.dataLoopNodes->Node(airDistUnit.InletNodeNum).Temp; - } - if (airDistUnit.DownStreamLeak) { - Real64 const MassFlowRate_CpAir(airDistUnit.MassFlowRateDnStrLk * Psychrometrics::PsyCpAirFnW(air_hum_rat)); - this->SumSysMCp += MassFlowRate_CpAir; - this->SumSysMCpT += MassFlowRate_CpAir * state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).Temp; - } - } - - } else if (thisZone.IsSupplyPlenum) { - Real64 MassFlowRate = state.dataLoopNodes->Node(state.dataZonePlenum->ZoneSupPlenCond(thisZone.PlenumCondNum).InletNode).MassFlowRate; - Real64 CpAir = Psychrometrics::PsyCpAirFnW(this->ZoneAirHumRat); - this->SumSysMCp += MassFlowRate * CpAir; - this->SumSysMCpT += - MassFlowRate * CpAir * state.dataLoopNodes->Node(state.dataZonePlenum->ZoneSupPlenCond(thisZone.PlenumCondNum).InletNode).Temp; - } - - int ZoneMult = thisZone.Multiplier * thisZone.ListMultiplier; - - this->SumSysMCp /= ZoneMult; - this->SumSysMCpT /= ZoneMult; - } - - if (spaceNum > 0) { - Real64 spaceFrac = state.dataHeatBal->space(spaceNum).fracZoneVolume; - this->SumSysMCp *= spaceFrac; - this->SumSysMCpT *= spaceFrac; - } - - // Sum all surface convection: this->SumHA, this->SumHATsurf, this->SumHATref (and additional contributions to this->SumIntGain) - SumHATOutput sumHATResults; // space or zone return values - sumHATResults = this->calcSumHAT(state, zoneNum, spaceNum); - this->SumIntGain += sumHATResults.sumIntGain; - this->SumHA = sumHATResults.sumHA; - this->SumHATsurf = sumHATResults.sumHATsurf; - this->SumHATref = sumHATResults.sumHATref; -} - -SumHATOutput ZoneHeatBalanceData::calcSumHAT(EnergyPlusData &state, int const zoneNum, [[maybe_unused]] int const spaceNum) -{ - assert(zoneNum > 0); - assert(spaceNum == 0); - SumHATOutput zoneResults; // zone-level return values - for (int zoneSpaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { - SumHATOutput spaceResults; // temporary return value from space-level calcSumHAT - spaceResults = state.dataZoneTempPredictorCorrector->spaceHeatBalance(zoneSpaceNum).calcSumHAT(state, zoneNum, zoneSpaceNum); - zoneResults.sumIntGain += spaceResults.sumIntGain; - zoneResults.sumHA += spaceResults.sumHA; - zoneResults.sumHATsurf += spaceResults.sumHATsurf; - zoneResults.sumHATref += spaceResults.sumHATref; - } - return zoneResults; -} - -SumHATOutput SpaceHeatBalanceData::calcSumHAT(EnergyPlusData &state, int const zoneNum, int const spaceNum) -{ - assert(zoneNum > 0); - assert(spaceNum > 0); - auto &thisZone = state.dataHeatBal->Zone(zoneNum); - auto &thisSpace = state.dataHeatBal->space(spaceNum); - SumHATOutput results; // space-level return values - - for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { - Real64 HA = 0.0; - Real64 Area = state.dataSurface->Surface(SurfNum).Area; // For windows, this is the glazing area - - if (state.dataSurface->Surface(SurfNum).Class == DataSurfaces::SurfaceClass::Window) { - DataSurfaces::WinShadingType const shading_flag = state.dataSurface->SurfWinShadingFlag(SurfNum); - - // Add to the convective internal gains - if (ANY_INTERIOR_SHADE_BLIND(shading_flag)) { - // The shade area covers the area of the glazing plus the area of the dividers. - Area += state.dataSurface->SurfWinDividerArea(SurfNum); - // If interior shade or blind is present it is assumed that both the convective and IR radiative gain - // from the inside surface of the divider goes directly into the zone air -- i.e., the IR radiative - // interaction between divider and shade or blind is ignored due to the difficulty of calculating this interaction - // at the same time that the interaction between glass and shade is calculated. - results.sumIntGain += state.dataSurface->SurfWinDividerHeatGain(SurfNum); - } - - // Other convection term is applicable to equivalent layer window (ASHWAT) model - if (state.dataConstruction->Construct(state.dataSurface->Surface(SurfNum).Construction).WindowTypeEQL) - results.sumIntGain += state.dataSurface->SurfWinOtherConvHeatGain(SurfNum); - - // Convective heat gain from natural convection in gap between glass and interior shade or blind - if (ANY_INTERIOR_SHADE_BLIND(shading_flag)) results.sumIntGain += state.dataSurface->SurfWinConvHeatFlowNatural(SurfNum); - - // Convective heat gain from airflow window - if (state.dataSurface->SurfWinAirflowThisTS(SurfNum) > 0.0) { - results.sumIntGain += state.dataSurface->SurfWinConvHeatGainToZoneAir(SurfNum); - if (thisZone.NoHeatToReturnAir) { - results.sumIntGain += state.dataSurface->SurfWinRetHeatGainToZoneAir(SurfNum); - state.dataSurface->SurfWinHeatGain(SurfNum) += state.dataSurface->SurfWinRetHeatGainToZoneAir(SurfNum); - if (state.dataSurface->SurfWinHeatGain(SurfNum) >= 0.0) { - state.dataSurface->SurfWinHeatGainRep(SurfNum) = state.dataSurface->SurfWinHeatGain(SurfNum); - state.dataSurface->SurfWinHeatGainRepEnergy(SurfNum) = - state.dataSurface->SurfWinHeatGainRep(SurfNum) * state.dataGlobal->TimeStepZoneSec; - } else { - state.dataSurface->SurfWinHeatLossRep(SurfNum) = -state.dataSurface->SurfWinHeatGain(SurfNum); - state.dataSurface->SurfWinHeatLossRepEnergy(SurfNum) = - state.dataSurface->SurfWinHeatLossRep(SurfNum) * state.dataGlobal->TimeStepZoneSec; - } - state.dataSurface->SurfWinHeatTransferRepEnergy(SurfNum) = - state.dataSurface->SurfWinHeatGain(SurfNum) * state.dataGlobal->TimeStepZoneSec; - } - } - - // Add to the surface convection sums - if (state.dataSurface->SurfWinFrameArea(SurfNum) > 0.0) { - // Window frame contribution - Real64 const HA_surf(state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinFrameArea(SurfNum) * - (1.0 + state.dataSurface->SurfWinProjCorrFrIn(SurfNum))); - results.sumHATsurf += HA_surf * state.dataSurface->SurfWinFrameTempIn(SurfNum); - HA += HA_surf; - } - - if (state.dataSurface->SurfWinDividerArea(SurfNum) > 0.0 && !ANY_INTERIOR_SHADE_BLIND(shading_flag)) { - // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) - Real64 const HA_surf(state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinDividerArea(SurfNum) * - (1.0 + 2.0 * state.dataSurface->SurfWinProjCorrDivIn(SurfNum))); - results.sumHATsurf += HA_surf * state.dataSurface->SurfWinDividerTempIn(SurfNum); - HA += HA_surf; - } - - } // End of check if window - - HA += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * Area; - results.sumHATsurf += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * Area * state.dataHeatBalSurf->SurfTempInTmp(SurfNum); - - // determine reference air temperature for this surface - switch (state.dataSurface->SurfTAirRef(SurfNum)) { - case DataSurfaces::RefAirTemp::ZoneMeanAirTemp: - // The zone air is the reference temperature (which is to be solved for in CorrectZoneAirTemp). - results.sumHA += HA; - break; - case DataSurfaces::RefAirTemp::AdjacentAirTemp: - results.sumHATref += HA * state.dataHeatBal->SurfTempEffBulkAir(SurfNum); - break; - case DataSurfaces::RefAirTemp::ZoneSupplyAirTemp: - // check whether this zone is a controlled zone or not - if (!thisZone.IsControlled) { - ShowFatalError(state, "Zones must be controlled for Ceiling-Diffuser Convection model. No system serves zone " + thisZone.Name); - return results; - } - // determine supply air temperature as a weighted average of the inlet temperatures. - // TODO: For now, use zone-level values for system flow - if (state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).SumSysMCp > 0.0) { - results.sumHATref += HA * state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).SumSysMCpT / - state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum).SumSysMCp; - } else { - // no system flow (yet) so just use zone air temperature #5906 - results.sumHA += HA; - } - break; - default: - // currently set to mean air temp but should add error warning here - results.sumHA += HA; - break; - } - - } // SurfNum - return results; -} -void CalcZoneComponentLoadSums(EnergyPlusData &state, - int const ZoneNum, // Zone number - Real64 const TempDepCoef, // Dependent coefficient - Real64 const TempIndCoef, // Independent coefficient - Real64 &SumIntGains, // Zone sum of convective internal gains - Real64 &SumHADTsurfs, // Zone sum of Hc*Area*(Tsurf - Tz) - Real64 &SumMCpDTzones, // zone sum of MassFlowRate*cp*(TremotZone - Tz) transfer air from other zone, Mixing - Real64 &SumMCpDtInfil, // Zone sum of MassFlowRate*Cp*(Tout - Tz) transfer from outside, ventil, earth tube - Real64 &SumMCpDTsystem, // Zone sum of air system MassFlowRate*Cp*(Tsup - Tz) - Real64 &SumNonAirSystem, // Zone sum of non air system convective heat gains - Real64 &CzdTdt, // Zone air energy storage term. - Real64 &imBalance, // put all terms in eq. 5 on RHS , should be zero - Real64 &SumEnthalpyM, // Zone sum of phase change material melting enthlpy - Real64 &SumEnthalpyH // Zone sum of phase change material freezing enthalpy -) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Brent Griffith - // DATE WRITTEN Feb 2008 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine calculates the various sums that go into the zone heat balance - // equation for reporting (and diagnostic) purposes only. - // It was derived from CalcZoneSums but differs in that that routine - // breaks up the component's dependence on zone air temp in order to *solve* for zone air temp, - // but here we *use* the result for zone air temp and calculate the terms of the heat balance - // Go back and calculate each of the 6 terms in Equation 5 and fill report variables. - // notes on these raw terms for zone air heat balance model : - // these are state variables at the end of the last system timestep. - // they are not necessarily proper averages for what happened over entire zone time step - // these are not multiplied by zone multipliers. - // The values are all Watts. - - // REFERENCES: - // Equation 5 in Engineering Reference. - - SumIntGains = 0.0; // Zone sum of convective internal gains - SumHADTsurfs = 0.0; // Zone sum of Hc*Area*(Tsurf - Tz) - SumMCpDTzones = 0.0; // zone sum of MassFlowRate*cp*(TremotZone - Tz) transfer air from other zone, Mixing - SumMCpDtInfil = 0.0; // Zone sum of MassFlowRate*Cp*(Tout - Tz) - SumMCpDTsystem = 0.0; // Zone sum of air system MassFlowRate*Cp*(Tsup - Tz) - SumNonAirSystem = 0.0; - CzdTdt = 0.0; - imBalance = 0.0; - SumEnthalpyM = 0.0; - SumEnthalpyH = 0.0; - - auto &thisZone = state.dataHeatBal->Zone(ZoneNum); - auto const &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); - - // Sum all convective internal gains: SumIntGain - SumIntGains = InternalHeatGains::zoneSumAllInternalConvectionGains(state, ZoneNum); - - // Add heat to return air if zonal system (no return air) or cycling system (return air frequently very - // low or zero) - if (thisZone.NoHeatToReturnAir) { - SumIntGains += InternalHeatGains::zoneSumAllReturnAirConvectionGains(state, ZoneNum, 0); - } - - // sum non-system air flow transfers between zones - SumMCpDTzones = thisZoneHB.MCPTM - thisZoneHB.MCPM * thisZoneHB.MAT; // but maybe it should be ZTAV(ZoneNum) - - // Sum non-system air flow, i.e. infiltration, simple ventilation, earth tube - // reuse SumMCp, SumMCpT from CalcZoneSum but use MAT (or maybe ZTAV?) to complete - SumMCpDtInfil = (thisZoneHB.MCPTI - thisZoneHB.MCPI * thisZoneHB.MAT) + (thisZoneHB.MCPTV - thisZoneHB.MCPV * thisZoneHB.MAT) + - (thisZoneHB.MCPTE - thisZoneHB.MCPE * thisZoneHB.MAT) + (thisZoneHB.MCPTC - thisZoneHB.MCPC * thisZoneHB.MAT) + - (thisZoneHB.MDotCPOA * thisZone.OutDryBulbTemp - - thisZoneHB.MDotCPOA * thisZoneHB.MAT); // infiltration | Ventilation (simple) | Earth tube. | Cooltower | combined OA flow - - // Sum all multizone air flow calculated from AirflowNetwork by assuming no simple air infiltration model (if used) - if (state.afn->multizone_always_simulated || - (state.afn->simulation_control.type == AirflowNetwork::ControlType::MultizoneWithDistributionOnlyDuringFanOperation && - state.afn->AirflowNetworkFanActivated)) { - // Multizone airflow calculated in AirflowNetwork - SumMCpDtInfil = state.afn->exchangeData(ZoneNum).SumMCpT + state.afn->exchangeData(ZoneNum).SumMVCpT - - (state.afn->exchangeData(ZoneNum).SumMCp + state.afn->exchangeData(ZoneNum).SumMVCp) * thisZoneHB.MAT; - SumMCpDTzones = state.afn->exchangeData(ZoneNum).SumMMCpT - state.afn->exchangeData(ZoneNum).SumMMCp * thisZoneHB.MAT; - } - - // Sum all system air flow: reusing how SumSysMCp, SumSysMCpT are calculated in CalcZoneSums - // Plenum and controlled zones have a different set of inlet nodes which must be calculated. - Real64 QSensRate = 0.0; - if (thisZone.IsControlled) { - auto &zoneEquipConfig = state.dataZoneEquip->ZoneEquipConfig(ZoneNum); - for (int NodeNum = 1; NodeNum <= zoneEquipConfig.NumInletNodes; ++NodeNum) { - // Get node conditions - Real64 const NodeTemp = state.dataLoopNodes->Node(zoneEquipConfig.InletNode(NodeNum)).Temp; - Real64 const MassFlowRate = state.dataLoopNodes->Node(zoneEquipConfig.InletNode(NodeNum)).MassFlowRate; - QSensRate = calcZoneSensibleOutput(MassFlowRate, NodeTemp, thisZoneHB.MAT, thisZoneHB.ZoneAirHumRat); - SumMCpDTsystem += QSensRate; - - if (zoneEquipConfig.InletNodeADUNum(NodeNum) > 0) { - auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(zoneEquipConfig.InletNodeADUNum(NodeNum)); - Real64 ADUHeatAddRate = calcZoneSensibleOutput(state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).MassFlowRate, - state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).Temp, - thisZoneHB.MAT, - thisZoneHB.ZoneAirHumRat); - airDistUnit.HeatRate = max(0.0, ADUHeatAddRate); - airDistUnit.CoolRate = std::abs(min(0.0, ADUHeatAddRate)); - airDistUnit.HeatGain = airDistUnit.HeatRate * state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour; - airDistUnit.CoolGain = airDistUnit.CoolRate * state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour; - } - } - - } else if (thisZone.IsReturnPlenum) { - auto &zoneRetPlenCond = state.dataZonePlenum->ZoneRetPlenCond(thisZone.PlenumCondNum); - for (int NodeNum = 1; NodeNum <= zoneRetPlenCond.NumInletNodes; ++NodeNum) { - QSensRate = calcZoneSensibleOutput(state.dataLoopNodes->Node(zoneRetPlenCond.InletNode(NodeNum)).MassFlowRate, - state.dataLoopNodes->Node(zoneRetPlenCond.InletNode(NodeNum)).Temp, - thisZoneHB.MAT, - thisZoneHB.ZoneAirHumRat); - SumMCpDTsystem += QSensRate; - } - // add in the leaks - for (int ADUListIndex = 1; ADUListIndex <= zoneRetPlenCond.NumADUs; ++ADUListIndex) { - auto &airDistUnit = state.dataDefineEquipment->AirDistUnit(zoneRetPlenCond.ADUIndex(ADUListIndex)); - if (airDistUnit.UpStreamLeak) { - QSensRate = calcZoneSensibleOutput(airDistUnit.MassFlowRateUpStrLk, - state.dataLoopNodes->Node(airDistUnit.InletNodeNum).Temp, - thisZoneHB.MAT, - thisZoneHB.ZoneAirHumRat); - SumMCpDTsystem += QSensRate; - } - if (airDistUnit.DownStreamLeak) { - QSensRate = calcZoneSensibleOutput(airDistUnit.MassFlowRateDnStrLk, - state.dataLoopNodes->Node(airDistUnit.OutletNodeNum).Temp, - thisZoneHB.MAT, - thisZoneHB.ZoneAirHumRat); - SumMCpDTsystem += QSensRate; - } - } - - } else if (thisZone.IsSupplyPlenum) { - auto &zoneSupPlenCond = state.dataZonePlenum->ZoneSupPlenCond(thisZone.PlenumCondNum); - QSensRate = calcZoneSensibleOutput(state.dataLoopNodes->Node(zoneSupPlenCond.InletNode).MassFlowRate, - state.dataLoopNodes->Node(zoneSupPlenCond.InletNode).Temp, - thisZoneHB.MAT, - thisZoneHB.ZoneAirHumRat); - SumMCpDTsystem += QSensRate; - } - - // non air system response. - SumNonAirSystem = - thisZoneHB.NonAirSystemResponse + state.dataHeatBalFanSys->SumConvHTRadSys(ZoneNum) + state.dataHeatBalFanSys->SumConvPool(ZoneNum); - - // Sum all surface convection: SumHA, SumHATsurf, SumHATref (and additional contributions to SumIntGain) - for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) { - auto &thisSpace = state.dataHeatBal->space(spaceNum); - for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { - - Real64 Area = state.dataSurface->Surface(SurfNum).Area; // For windows, this is the glazing area - Real64 RefAirTemp = state.dataSurface->Surface(SurfNum).getInsideAirTemperature(state, SurfNum); - - if (state.dataSurface->Surface(SurfNum).Class == DataSurfaces::SurfaceClass::Window) { - - // Add to the convective internal gains - if (ANY_INTERIOR_SHADE_BLIND(state.dataSurface->SurfWinShadingFlag(SurfNum))) { - // The shade area covers the area of the glazing plus the area of the dividers. - Area += state.dataSurface->SurfWinDividerArea(SurfNum); - // If interior shade or blind is present it is assumed that both the convective and IR radiative gain - // from the inside surface of the divider goes directly into the zone air -- i.e., the IR radiative - // interaction between divider and shade or blind is ignored due to the difficulty of calculating this interaction - // at the same time that the interaction between glass and shade is calculated. - SumIntGains += state.dataSurface->SurfWinDividerHeatGain(SurfNum); - } - - // Other convection term is applicable to equivalent layer window (ASHWAT) model - if (state.dataConstruction->Construct(state.dataSurface->Surface(SurfNum).Construction).WindowTypeEQL) - SumIntGains += state.dataSurface->SurfWinOtherConvHeatGain(SurfNum); - - // Convective heat gain from natural convection in gap between glass and interior shade or blind - if (ANY_INTERIOR_SHADE_BLIND(state.dataSurface->SurfWinShadingFlag(SurfNum))) - SumIntGains += state.dataSurface->SurfWinConvHeatFlowNatural(SurfNum); - - // Convective heat gain from airflow window - if (state.dataSurface->SurfWinAirflowThisTS(SurfNum) > 0.0) { - SumIntGains += state.dataSurface->SurfWinConvHeatGainToZoneAir(SurfNum); - if (thisZone.NoHeatToReturnAir) { - SumIntGains += state.dataSurface->SurfWinRetHeatGainToZoneAir(SurfNum); - } - } - - // Add to the surface convection sums - if (state.dataSurface->SurfWinFrameArea(SurfNum) > 0.0) { - // Window frame contribution - SumHADTsurfs += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinFrameArea(SurfNum) * - (1.0 + state.dataSurface->SurfWinProjCorrFrIn(SurfNum)) * - (state.dataSurface->SurfWinFrameTempIn(SurfNum) - RefAirTemp); - } - - if (state.dataSurface->SurfWinDividerArea(SurfNum) > 0.0 && - !ANY_INTERIOR_SHADE_BLIND(state.dataSurface->SurfWinShadingFlag(SurfNum))) { - // Window divider contribution (only from shade or blind for window with divider and interior shade or blind) - SumHADTsurfs += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * state.dataSurface->SurfWinDividerArea(SurfNum) * - (1.0 + 2.0 * state.dataSurface->SurfWinProjCorrDivIn(SurfNum)) * - (state.dataSurface->SurfWinDividerTempIn(SurfNum) - RefAirTemp); - } - - } // End of check if window - - SumHADTsurfs += state.dataHeatBalSurf->SurfHConvInt(SurfNum) * Area * (state.dataHeatBalSurf->SurfTempInTmp(SurfNum) - RefAirTemp); - - // Accumulate Zone Phase Change Material Melting/Freezing Enthalpy output variables - if (state.dataSurface->Surface(SurfNum).HeatTransferAlgorithm == DataSurfaces::HeatTransferModel::CondFD) { - state.dataHeatBal->ZnAirRpt(ZoneNum).SumEnthalpyM += state.dataHeatBalFiniteDiffMgr->SurfaceFD(SurfNum).EnthalpyM; - state.dataHeatBal->ZnAirRpt(ZoneNum).SumEnthalpyH += state.dataHeatBalFiniteDiffMgr->SurfaceFD(SurfNum).EnthalpyF; - } - } - } - // now calculate air energy storage source term. - // capacitance is volume * density * heat capacity - Real64 CpAir = Psychrometrics::PsyCpAirFnW(thisZoneHB.ZoneAirHumRat); - Real64 RhoAir = Psychrometrics::PsyRhoAirFnPbTdbW(state, state.dataEnvrn->OutBaroPress, thisZoneHB.MAT, thisZoneHB.ZoneAirHumRat); - - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - CzdTdt = RhoAir * CpAir * thisZone.Volume * thisZone.ZoneVolCapMultpSens * (thisZoneHB.MAT - thisZoneHB.ZTM[0]) / - (state.dataHVACGlobal->TimeStepSys * DataGlobalConstants::SecInHour); - // Exact solution - } break; - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - CzdTdt = TempIndCoef - TempDepCoef * thisZoneHB.MAT; - } break; - case DataHeatBalance::SolutionAlgo::EulerMethod: { - CzdTdt = thisZoneHB.AirPowerCap * (thisZoneHB.MAT - thisZoneHB.ZoneT1); - } break; - default: - break; - } - - if (state.dataGlobal->DisplayZoneAirHeatBalanceOffBalance) { - imBalance = SumIntGains + SumHADTsurfs + SumMCpDTzones + SumMCpDtInfil + SumMCpDTsystem + SumNonAirSystem - CzdTdt; - - // throw warning if seriously out of balance (this may need to be removed if too noisy... ) - // formulate dynamic threshold value based on 20% of quadrature sum of components - Real64 Threshold = 0.2 * std::sqrt(pow_2(SumIntGains) + pow_2(SumHADTsurfs) + pow_2(SumMCpDTzones) + pow_2(SumMCpDtInfil) + - pow_2(SumMCpDTsystem) + pow_2(SumNonAirSystem) + pow_2(CzdTdt)); - if ((std::abs(imBalance) > Threshold) && (!state.dataGlobal->WarmupFlag) && - (!state.dataGlobal->DoingSizing)) { // air balance is out by more than threshold - if (thisZone.AirHBimBalanceErrIndex == 0) { - ShowWarningMessage(state, format("Zone Air Heat Balance is out of balance for zone named {}", thisZone.Name)); - ShowContinueError(state, format("Zone Air Heat Balance Deviation Rate is more than {:.1R} {{W}}", Threshold)); - if (state.dataHVACGlobal->TurnFansOn) { - ShowContinueError(state, "Night cycle fan operation may be causing above error"); - } - - ShowContinueErrorTimeStamp(state, " Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - format("Zone Air Heat Balance is out of balance ... zone named {}", thisZone.Name), - thisZone.AirHBimBalanceErrIndex, - std::abs(imBalance) - Threshold, - std::abs(imBalance) - Threshold, - _, - "{W}", - "{W}"); - } - } -} - -bool VerifyThermostatInZone(EnergyPlusData &state, std::string const &ZoneName) // Zone to verify -{ - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN Feb 2005 - - // PURPOSE OF THIS FUNCTION: - // This function verifies that a zone (by name) has a Zone Control:Thermostatic object entered. - - if (state.dataZoneCtrls->GetZoneAirStatsInputFlag) { - GetZoneAirSetPoints(state); - state.dataZoneCtrls->GetZoneAirStatsInputFlag = false; - } - if (state.dataZoneCtrls->NumTempControlledZones > 0) { - if (UtilityRoutines::FindItemInList(ZoneName, state.dataZoneCtrls->TempControlledZone, &DataZoneControls::ZoneTempControls::ZoneName) > 0) { - return true; - } else { - return false; - } - } - return false; -} - -bool VerifyControlledZoneForThermostat(EnergyPlusData &state, std::string const &ZoneName) // Zone to verify -{ - - // FUNCTION INFORMATION: - // AUTHOR Linda Lawrie - // DATE WRITTEN Mar 2007 - - // PURPOSE OF THIS FUNCTION: - // This function verifies that a zone (by name) has a ZoneHVAC:EquipmentConnections object entered. - - return (UtilityRoutines::FindItemInList(ZoneName, state.dataZoneEquip->ZoneEquipConfig, &DataZoneEquipment::EquipConfiguration::ZoneName) > 0); -} - -void DetectOscillatingZoneTemp(EnergyPlusData &state) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Jason Glazer - // DATE WRITTEN August 2005 - - // PURPOSE OF THIS SUBROUTINE: - // Oscillating temperatures between HVAC timesteps indicate that the - // simulation may be poor. Code is trying to be fast since the purpose - // is to see the impact on oscillating by trying longer time steps in - // an attempt to speed up the simulation. - // Note that the OscillateMagnitude threshold must be less than - // MaxZoneTempDiff since ManageHVAC keeps shortening the timestep - // until that is reached unless it goes to less than the - // MinTimeStepSys. - - // first time run allocate arrays and setup output variable - if (state.dataZoneTempPredictorCorrector->SetupOscillationOutputFlag) { - state.dataZoneTempPredictorCorrector->ZoneTempHist.allocate(4, state.dataGlobal->NumOfZones); - state.dataZoneTempPredictorCorrector->ZoneTempHist = 0.0; - state.dataZoneTempPredictorCorrector->ZoneTempOscillate.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy.dimension(state.dataGlobal->NumOfZones, 0.0); - state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband.dimension(state.dataGlobal->NumOfZones, 0.0); - // set up zone by zone variables, CurrentModuleObject='Zone' - for (int iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) { - auto &zone = state.dataHeatBal->Zone(iZone); - SetupOutputVariable(state, - "Zone Oscillating Temperatures Time", - OutputProcessor::Unit::hr, - state.dataZoneTempPredictorCorrector->ZoneTempOscillate(iZone), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zone.Name); - SetupOutputVariable(state, - "Zone Oscillating Temperatures During Occupancy Time", - OutputProcessor::Unit::hr, - state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy(iZone), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zone.Name); - SetupOutputVariable(state, - "Zone Oscillating Temperatures in Deadband Time", - OutputProcessor::Unit::hr, - state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband(iZone), - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - zone.Name); - } - // set up a variable covering all zones - SetupOutputVariable(state, - "Facility Any Zone Oscillating Temperatures Time", - OutputProcessor::Unit::hr, - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillate, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - "Facility"); - SetupOutputVariable(state, - "Facility Any Zone Oscillating Temperatures During Occupancy Time", - OutputProcessor::Unit::hr, - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateDuringOccupancy, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - "Facility"); - SetupOutputVariable(state, - "Facility Any Zone Oscillating Temperatures in Deadband Time", - OutputProcessor::Unit::hr, - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateInDeadband, - OutputProcessor::SOVTimeStepType::System, - OutputProcessor::SOVStoreType::Summed, - "Facility"); - // test if the oscillation variables are even used - if (ReportingThisVariable(state, "Zone Oscillating Temperatures Time") || - ReportingThisVariable(state, "Zone Oscillating Temperatures During Occupancy Time") || - ReportingThisVariable(state, "Zone Oscillating Temperatures in Deadband Time") || - ReportingThisVariable(state, "Facility Any Zone Oscillating Temperatures Time") || - ReportingThisVariable(state, "Facility Any Zone Oscillating Temperatures During Occupancy Time") || - ReportingThisVariable(state, "Facility Any Zone Oscillating Temperatures in Deadband Time")) { - state.dataZoneTempPredictorCorrector->OscillationVariablesNeeded = true; - } - state.dataZoneTempPredictorCorrector->SetupOscillationOutputFlag = false; - } - - auto &TimeStepSys = state.dataHVACGlobal->TimeStepSys; - if (state.dataZoneTempPredictorCorrector->OscillationVariablesNeeded) { - // precalc the negative value for performance - Real64 NegOscillateMagnitude = -DataHVACGlobals::OscillateMagnitude; - // assume no zone is oscillating - bool isAnyZoneOscillating = false; - bool isAnyZoneOscillatingDuringOccupancy = false; - bool isAnyZoneOscillatingInDeadband = false; - - for (int iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) { - bool isOscillate = false; - state.dataZoneTempPredictorCorrector->ZoneTempHist(4, iZone) = state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone); - state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone) = state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone); - state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone) = state.dataZoneTempPredictorCorrector->ZoneTempHist(1, iZone); - state.dataZoneTempPredictorCorrector->ZoneTempHist(1, iZone) = state.dataZoneTempPredictorCorrector->zoneHeatBalance(iZone).ZT; - Real64 Diff34 = - state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone) - state.dataZoneTempPredictorCorrector->ZoneTempHist(4, iZone); - Real64 Diff23 = - state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone) - state.dataZoneTempPredictorCorrector->ZoneTempHist(3, iZone); - Real64 Diff12 = - state.dataZoneTempPredictorCorrector->ZoneTempHist(1, iZone) - state.dataZoneTempPredictorCorrector->ZoneTempHist(2, iZone); - // roll out the conditionals for increased performance - if (Diff12 > DataHVACGlobals::OscillateMagnitude) { - if (Diff23 < NegOscillateMagnitude) { - if (Diff34 > DataHVACGlobals::OscillateMagnitude) { - isOscillate = true; - } - } - } - // now try the opposite sequence of swings - if (Diff12 < NegOscillateMagnitude) { - if (Diff23 > DataHVACGlobals::OscillateMagnitude) { - if (Diff34 < NegOscillateMagnitude) { - isOscillate = true; - } - } - } - state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy(iZone) = 0.0; - state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband(iZone) = 0.0; - if (isOscillate) { - state.dataZoneTempPredictorCorrector->ZoneTempOscillate(iZone) = TimeStepSys; - isAnyZoneOscillating = true; - if (allocated(state.dataThermalComforts->ThermalComfortInASH55)) { - if (state.dataThermalComforts->ThermalComfortInASH55(iZone).ZoneIsOccupied) { - state.dataZoneTempPredictorCorrector->ZoneTempOscillateDuringOccupancy(iZone) = TimeStepSys; - isAnyZoneOscillatingDuringOccupancy = true; - } - } - if (state.dataZoneEnergyDemand->CurDeadBandOrSetback(iZone)) { - state.dataZoneTempPredictorCorrector->ZoneTempOscillateInDeadband(iZone) = TimeStepSys; - isAnyZoneOscillatingInDeadband = true; - } - } else { - state.dataZoneTempPredictorCorrector->ZoneTempOscillate(iZone) = 0.0; - } - } - // any zone variable - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillate = (isAnyZoneOscillating) ? TimeStepSys : 0.0; - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateDuringOccupancy = (isAnyZoneOscillatingDuringOccupancy) ? TimeStepSys : 0.0; - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateInDeadband = (isAnyZoneOscillatingInDeadband) ? TimeStepSys : 0.0; - - // annual/runperiod sum for _perflog.csv file - state.dataZoneTempPredictorCorrector->AnnualAnyZoneTempOscillate += state.dataZoneTempPredictorCorrector->AnyZoneTempOscillate; - state.dataZoneTempPredictorCorrector->AnnualAnyZoneTempOscillateDuringOccupancy += - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateDuringOccupancy; - state.dataZoneTempPredictorCorrector->AnnualAnyZoneTempOscillateInDeadband += - state.dataZoneTempPredictorCorrector->AnyZoneTempOscillateInDeadband; - } -} - -void AdjustAirSetPointsforOpTempCntrl(EnergyPlusData &state, int const TempControlledZoneID, int const ActualZoneNum, Real64 &ZoneAirSetPoint) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR B. Griffith - // DATE WRITTEN June 2006 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine modifies the air temperature setpoint to effect operative temperature control - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 thisMRTFraction; // local variable for fraction that MRT is in Op Temp definition - - if (!(state.dataZoneCtrls->AnyOpTempControl)) return; // do nothing to setpoint - - auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID); - if (!(tempControlledZone.OperativeTempControl)) return; // do nothing to setpoint - - // is operative temp radiative fraction scheduled or fixed? - thisMRTFraction = (tempControlledZone.OpTempCntrlModeScheduled) - ? ScheduleManager::GetCurrentScheduleValue(state, tempControlledZone.OpTempRadiativeFractionSched) - : tempControlledZone.FixedRadiativeFraction; - - // get mean radiant temperature for zone - Real64 thisMRT = state.dataHeatBal->ZoneMRT(ActualZoneNum); - - // modify setpoint for operative temperature control - // traping for MRT fractions between 0.0 and 0.9 during get input, so shouldn't be able to divide by zero here. - ZoneAirSetPoint = (ZoneAirSetPoint - thisMRTFraction * thisMRT) / (1.0 - thisMRTFraction); -} - -void AdjustOperativeSetPointsforAdapComfort(EnergyPlusData &state, int const TempControlledZoneID, Real64 &ZoneAirSetPoint) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Xuan Luo - // DATE WRITTEN Jan 2017 - - // PURPOSE OF THIS SUBROUTINE: - // This routine adjust the operative setpoints for each controlled adaptive thermal comfort models. - - auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID); - auto &AdapComfortDailySetPointSchedule = state.dataZoneTempPredictorCorrector->AdapComfortDailySetPointSchedule; - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - int originZoneAirSetPoint = ZoneAirSetPoint; - int AdaptiveComfortModelTypeIndex = tempControlledZone.AdaptiveComfortModelTypeIndex; - - // adjust zone operative setpoint - if (!(tempControlledZone.AdaptiveComfortTempControl)) return; // do nothing to setpoint - if ((state.dataWeatherManager->Environment(state.dataWeatherManager->Envrn).KindOfEnvrn != DataGlobalConstants::KindOfSim::DesignDay) && - (state.dataWeatherManager->Environment(state.dataWeatherManager->Envrn).KindOfEnvrn != DataGlobalConstants::KindOfSim::HVACSizeDesignDay)) { - // Adjust run period cooling set point - switch (AdaptiveComfortModelTypeIndex) { - case static_cast(AdaptiveComfortModel::ASH55_CENTRAL): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Central(state.dataEnvrn->DayOfYear); - break; - case static_cast(AdaptiveComfortModel::ASH55_UPPER_90): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_90(state.dataEnvrn->DayOfYear); - break; - case static_cast(AdaptiveComfortModel::ASH55_UPPER_80): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveASH55_Upper_80(state.dataEnvrn->DayOfYear); - break; - case static_cast(AdaptiveComfortModel::CEN15251_CENTRAL): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Central(state.dataEnvrn->DayOfYear); - break; - case static_cast(AdaptiveComfortModel::CEN15251_UPPER_I): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_I(state.dataEnvrn->DayOfYear); - break; - case static_cast(AdaptiveComfortModel::CEN15251_UPPER_II): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_II(state.dataEnvrn->DayOfYear); - break; - case static_cast(AdaptiveComfortModel::CEN15251_UPPER_III): - ZoneAirSetPoint = AdapComfortDailySetPointSchedule.ThermalComfortAdaptiveCEN15251_Upper_III(state.dataEnvrn->DayOfYear); - break; - default: - break; - } - } else { - int const envrnDayNum(state.dataWeatherManager->Environment(state.dataWeatherManager->Envrn).DesignDayNum); - int constexpr summerDesignDayTypeIndex(9); - // Adjust summer design day set point - if (state.dataWeatherManager->DesDayInput(envrnDayNum).DayType == summerDesignDayTypeIndex) { - ZoneAirSetPoint = state.dataZoneTempPredictorCorrector->AdapComfortSetPointSummerDesDay[AdaptiveComfortModelTypeIndex - 2]; - } - } - // If adaptive operative temperature not applicable, set back - if (ZoneAirSetPoint < originZoneAirSetPoint) { - ZoneAirSetPoint = originZoneAirSetPoint; - } - // If meet fault flag, set back - if (ZoneAirSetPoint == -1) { - ZoneAirSetPoint = originZoneAirSetPoint; - } -} - -void CalcZoneAirComfortSetPoints(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Lixing Gu - // DATE WRITTEN May 2006 - - // PURPOSE OF THIS SUBROUTINE: - // This routine sets the thermal comfort setpoints for each controlled zone based on air tempeature obtained from thermal comfort models. - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 SetPointLo = 0.0; - Real64 SetPointHi = 0.0; - Real64 Tset = 0.0; - int PeopleNum = 0; - int ObjectCount = 0; - Real64 PeopleCount = 0.0; - int SetPointComfortSchedIndex = 0; - int SchedTypeIndex = 0; - - // Call thermal comfort module to read zone control comfort object - if (state.dataZoneTempPredictorCorrector->CalcZoneAirComfortSetPointsFirstTimeFlag) { - ThermalComfort::ManageThermalComfort(state, true); - state.dataZoneTempPredictorCorrector->CalcZoneAirComfortSetPointsFirstTimeFlag = false; - } - - state.dataHeatBalFanSys->ComfortControlType = DataHVACGlobals::ThermostatType::Uncontrolled; // Default - - for (int RelativeZoneNum = 1; RelativeZoneNum <= state.dataZoneCtrls->NumComfortControlledZones; ++RelativeZoneNum) { - - auto &comfortControlledZone = state.dataZoneCtrls->ComfortControlledZone(RelativeZoneNum); - int ActualZoneNum = comfortControlledZone.ActualZoneNum; - auto &zone = state.dataHeatBal->Zone(ActualZoneNum); - auto &comfortControlType = state.dataHeatBalFanSys->ComfortControlType(ActualZoneNum); - auto &comfortControlTypeRpt = state.dataHeatBalFanSys->ComfortControlTypeRpt(ActualZoneNum); - auto &tempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ActualZoneNum); - auto &zoneComfortControlsFanger = state.dataHeatBalFanSys->ZoneComfortControlsFanger(ActualZoneNum); - comfortControlType = - static_cast(ScheduleManager::GetCurrentScheduleValue(state, comfortControlledZone.ComfortSchedIndex)); - comfortControlTypeRpt = static_cast(comfortControlType); - - // Get PMV values - switch (comfortControlType) { - case DataHVACGlobals::ThermostatType::Uncontrolled: - zoneComfortControlsFanger.LowPMV = -999.0; - zoneComfortControlsFanger.HighPMV = -999.0; - break; - case DataHVACGlobals::ThermostatType::SingleHeating: - zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::SingleHeating); - zoneComfortControlsFanger.LowPMV = ScheduleManager::GetCurrentScheduleValue( - state, - state.dataZoneTempPredictorCorrector - ->SetPointSingleHeatingFanger(comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_SingleHeating)) - .PMVSchedIndex); - zoneComfortControlsFanger.HighPMV = -999.0; - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::SingleCooling); - zoneComfortControlsFanger.LowPMV = -999.0; - zoneComfortControlsFanger.HighPMV = ScheduleManager::GetCurrentScheduleValue( - state, - state.dataZoneTempPredictorCorrector - ->SetPointSingleCoolingFanger(comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_SingleCooling)) - .PMVSchedIndex); - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - SetPointComfortSchedIndex = - state.dataZoneTempPredictorCorrector - ->SetPointSingleHeatCoolFanger(comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_SingleHeatCool)) - .PMVSchedIndex; - zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::SingleHeatCool); - zoneComfortControlsFanger.LowPMV = ScheduleManager::GetCurrentScheduleValue(state, SetPointComfortSchedIndex); - zoneComfortControlsFanger.HighPMV = ScheduleManager::GetCurrentScheduleValue(state, SetPointComfortSchedIndex); - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - SchedTypeIndex = comfortControlledZone.ControlTypeSchIndx(comfortControlledZone.SchIndx_DualSetPointWithDeadBand); - zoneComfortControlsFanger.FangerType = static_cast(DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand); - zoneComfortControlsFanger.LowPMV = ScheduleManager::GetCurrentScheduleValue( - state, state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(SchedTypeIndex).HeatPMVSchedIndex); - zoneComfortControlsFanger.HighPMV = ScheduleManager::GetCurrentScheduleValue( - state, state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(SchedTypeIndex).CoolPMVSchedIndex); - if (zoneComfortControlsFanger.LowPMV > zoneComfortControlsFanger.HighPMV) { - ++zoneComfortControlsFanger.DualPMVErrCount; - if (zoneComfortControlsFanger.DualPMVErrCount < 2) { - ShowWarningError(state, - "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint: The heating PMV setpoint is above the cooling " - "PMV setpoint in " + - state.dataZoneTempPredictorCorrector->SetPointDualHeatCoolFanger(SchedTypeIndex).Name); - ShowContinueError(state, "The zone dual heating PMV setpoint is set to the dual cooling PMV setpoint."); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } else { - ShowRecurringWarningErrorAtEnd(state, - "The heating PMV setpoint is still above the cooling PMV setpoint", - zoneComfortControlsFanger.DualPMVErrIndex, - zoneComfortControlsFanger.LowPMV, - zoneComfortControlsFanger.LowPMV); - } - zoneComfortControlsFanger.LowPMV = zoneComfortControlsFanger.HighPMV; - } - break; - default: - ShowSevereError(state, - format("CalcZoneAirTempSetpoints: Illegal thermal control control type for Zone={}, Found value={}, in Schedule={}", - zone.Name, - comfortControlTypeRpt, - comfortControlledZone.ControlTypeSchedName)); - break; - } - - // Check Average method - switch (comfortControlledZone.AverageMethod) { - case DataZoneControls::AverageMethod::NO: - PeopleNum = comfortControlledZone.SpecificObjectNum; - if (comfortControlType == DataHVACGlobals::ThermostatType::SingleCooling) { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointLo); - } else { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, SetPointLo); - } - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointHi); - break; - case DataZoneControls::AverageMethod::SPE: - PeopleNum = comfortControlledZone.SpecificObjectNum; - if (comfortControlType == DataHVACGlobals::ThermostatType::SingleCooling) { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointLo); - } else { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, SetPointLo); - } - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, SetPointHi); - break; - case DataZoneControls::AverageMethod::OBJ: - SetPointLo = 0.0; - SetPointHi = 0.0; - for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { - if (ActualZoneNum == state.dataHeatBal->People(PeopleNum).ZonePtr) { - ++ObjectCount; - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, Tset); - SetPointLo += Tset; - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, Tset); - SetPointHi += Tset; - } - } - } - SetPointLo /= ObjectCount; - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) SetPointHi /= ObjectCount; - break; - case DataZoneControls::AverageMethod::PEO: - SetPointLo = 0.0; - SetPointHi = 0.0; - for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { - if (ActualZoneNum == state.dataHeatBal->People(PeopleNum).ZonePtr) { - int NumberOccupants = state.dataHeatBal->People(PeopleNum).NumberOfPeople * - ScheduleManager::GetCurrentScheduleValue(state, state.dataHeatBal->People(PeopleNum).NumberOfPeoplePtr); - PeopleCount += NumberOccupants; - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, Tset); - SetPointLo += Tset * NumberOccupants; - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, Tset); - SetPointHi += Tset * NumberOccupants; - } - } - } - if (PeopleCount > 0) { - SetPointLo /= PeopleCount; - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) SetPointHi /= PeopleCount; - } else { - if (comfortControlledZone.PeopleAverageErrIndex == 0) { - ShowWarningMessage(state, - "ZoneControl:Thermostat:ThermalComfort: The total number of people in Zone = " + zone.Name + - " is zero. The People Average option is not used."); - ShowContinueError(state, "The Object Average option is used instead. Simulation continues ....."); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "ZoneControl:Thermostat:ThermalComfort: The total number of people in Zone = " + zone.Name + - " is still zero. The People Average option is not used", - comfortControlledZone.PeopleAverageErrIndex, - PeopleCount, - PeopleCount); - SetPointLo = 0.0; - SetPointHi = 0.0; - for (int PeopleNum = 1; PeopleNum <= state.dataHeatBal->TotPeople; ++PeopleNum) { - if (ActualZoneNum == state.dataHeatBal->People(PeopleNum).ZonePtr) { - ++ObjectCount; - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.LowPMV, Tset); - SetPointLo += Tset; - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) { - GetComfortSetPoints(state, PeopleNum, RelativeZoneNum, zoneComfortControlsFanger.HighPMV, Tset); - SetPointHi += Tset; - } - } - } - SetPointLo /= ObjectCount; - if (comfortControlType == DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand) SetPointHi /= ObjectCount; - } - break; - default: - break; - } - - // Assign setpoint - switch (comfortControlType) { - case DataHVACGlobals::ThermostatType::Uncontrolled: - switch (state.dataHeatBalFanSys->TempControlType(ActualZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = 0.0; - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = 0.0; - break; - default: - break; - } - break; - case DataHVACGlobals::ThermostatType::SingleHeating: - if (SetPointLo < comfortControlledZone.TdbMinSetPoint) { - SetPointLo = comfortControlledZone.TdbMinSetPoint; - if (comfortControlledZone.TdbMinErrIndex < 2) { - ShowWarningMessage(state, - "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeating temperature is below the Minimum dry-bulb " - "temperature setpoint " + - comfortControlledZone.Name); - ShowContinueError(state, "The zone heating setpoint is set to the Minimum dry-bulb temperature setpoint"); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeating temperature is still below the " - "Minimum dry-bulb temperature setpoint ...", - comfortControlledZone.TdbMinErrIndex, - SetPointLo, - SetPointLo); - } - tempZoneThermostatSetPoint = SetPointLo; - state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = tempZoneThermostatSetPoint; - state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::SingleHeating; - state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - if (SetPointLo > comfortControlledZone.TdbMaxSetPoint) { - SetPointLo = comfortControlledZone.TdbMaxSetPoint; - if (comfortControlledZone.TdbMaxErrIndex == 0) { - ShowWarningMessage(state, - "ThermostatSetpoint:ThermalComfort:Fanger:SingleCooling temperature is above the Maximum dry-bulb " - "temperature setpoint " + - comfortControlledZone.Name); - ShowContinueError(state, "The zone cooling setpoint is set to the Maximum dry-bulb temperature setpoint"); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "ThermostatSetpoint:ThermalComfort:Fanger:SingleCooling temperature is still above the " - "Maximum dry-bulb temperature setpoint ...", - comfortControlledZone.TdbMaxErrIndex, - SetPointLo, - SetPointLo); - } - tempZoneThermostatSetPoint = SetPointLo; - state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = tempZoneThermostatSetPoint; - state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::SingleCooling; - state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - if (comfortControlledZone.TdbMaxSetPoint == comfortControlledZone.TdbMinSetPoint) { - SetPointLo = comfortControlledZone.TdbMaxSetPoint; - } - if (SetPointLo > comfortControlledZone.TdbMaxSetPoint) SetPointLo = comfortControlledZone.TdbMaxSetPoint; - if (SetPointLo < comfortControlledZone.TdbMinSetPoint) SetPointLo = comfortControlledZone.TdbMinSetPoint; - if (SetPointLo < comfortControlledZone.TdbMinSetPoint || SetPointLo > comfortControlledZone.TdbMaxSetPoint) { - if (comfortControlledZone.TdbHCErrIndex == 0) { - ShowWarningMessage(state, - "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeatingOrCooling temperature is above the Maximum or " - "below the Minimum dry-bulb temperature setpoint " + - comfortControlledZone.Name); - ShowContinueError(state, - "The zone setpoint is set to the Maximum dry-bulb temperature setpoint if above or the Minimum " - "dry-bulb temperature setpoint if below"); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "ThermostatSetpoint:ThermalComfort:Fanger:SingleHeatingOrCooling temperature is still beyond " - "the range between Maximum and Minimum dry-bulb temperature setpoint ...", - comfortControlledZone.TdbHCErrIndex, - SetPointLo, - SetPointLo); - } - tempZoneThermostatSetPoint = SetPointLo; - state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = tempZoneThermostatSetPoint; - state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = tempZoneThermostatSetPoint; - state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::SingleHeatCool; - state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - if (SetPointLo < comfortControlledZone.TdbMinSetPoint) { - SetPointLo = comfortControlledZone.TdbMinSetPoint; - - if (comfortControlledZone.TdbDualMinErrIndex == 0) { - ShowWarningMessage(state, - "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is below the Minimum dry-bulb " - "temperature setpoint " + - comfortControlledZone.Name); - ShowContinueError(state, "The zone dual heating setpoint is set to the Minimum dry-bulb temperature setpoint"); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is still below the Minimum " - "dry-bulb temperature setpoint ...", - comfortControlledZone.TdbDualMinErrIndex, - SetPointLo, - SetPointLo); - } - if (SetPointHi > comfortControlledZone.TdbMaxSetPoint) { - SetPointHi = comfortControlledZone.TdbMaxSetPoint; - if (comfortControlledZone.TdbDualMaxErrIndex == 0) { - ShowWarningMessage(state, - format("ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is above the Maximum dry-bulb " - "temperature setpoint in zone = {}", - comfortControlledZone.Name)); - ShowContinueError(state, "The zone dual cooling setpoint is set to the Maximum dry-bulb temperature setpoint"); - ShowContinueErrorTimeStamp(state, "Occurrence info:"); - } - ShowRecurringWarningErrorAtEnd(state, - "ThermostatSetpoint:ThermalComfort:Fanger:DualSetpoint temperature is still above the Maximum " - "dry-bulb temperature setpoint ...", - comfortControlledZone.TdbDualMaxErrIndex, - SetPointLo, - SetPointLo); - } - - state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum) = SetPointLo; - state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) = SetPointHi; - state.dataHeatBalFanSys->TempControlType(ActualZoneNum) = DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand; - state.dataHeatBalFanSys->TempControlTypeRpt(ActualZoneNum) = static_cast(state.dataHeatBalFanSys->TempControlType(ActualZoneNum)); - break; - default: - ShowSevereError(state, - format("CalcZoneAirComfortSetpoints: Illegal thermal control control type for Zone={}, Found value={}, in Schedule={}", - zone.Name, - comfortControlTypeRpt, - comfortControlledZone.ControlTypeSchedName)); - } - } -} - -void GetComfortSetPoints(EnergyPlusData &state, - int const PeopleNum, - int const ComfortControlNum, - Real64 const PMVSet, - Real64 &Tset // drybulb setpoint temperature for a given PMV value -) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR Lixing Gu - // DATE WRITTEN May, 2006 - // PURPOSE OF THIS SUBROUTINE: - // This routine sets what the thermal comfort setpoints for each controlled zone should be based on air temperature - // obtained from thermal comfort models. This is called each time step. - - // SUBROUTINE ARGUMENT DEFINITIONS: - // 0 = Solution; 1 = Set to Min; 2 Set to Max - - // SUBROUTINE PARAMETER DEFINITIONS: - Real64 constexpr Acc(0.001); // accuracy control for SolveRoot - int constexpr MaxIter(500); // iteration control for SolveRoot - - // SUBROUTINE LOCAL VARIABLE DECLARATIONS: - Real64 PMVResult = 0.0; // Calculated PMV value - int SolFla = 0; // feed back flag from SolveRoot - - auto &comfortControlledZone = state.dataZoneCtrls->ComfortControlledZone(ComfortControlNum); - Real64 Tmin = comfortControlledZone.TdbMinSetPoint; - Real64 Tmax = comfortControlledZone.TdbMaxSetPoint; - - ThermalComfort::CalcThermalComfortFanger(state, PeopleNum, Tmin, PMVResult); - Real64 PMVMin = PMVResult; - ThermalComfort::CalcThermalComfortFanger(state, PeopleNum, Tmax, PMVResult); - Real64 PMVMax = PMVResult; - if (PMVSet > PMVMin && PMVSet < PMVMax) { - - auto f = [&state, PMVSet, PeopleNum](Real64 Tset) { - Real64 PMVresult = 0.0; // resulting PMV values - ThermalComfort::CalcThermalComfortFanger(state, PeopleNum, Tset, PMVresult); - return (PMVSet - PMVresult); - }; - - General::SolveRoot(state, Acc, MaxIter, SolFla, Tset, f, Tmin, Tmax); - if (SolFla == -1) { - if (!state.dataGlobal->WarmupFlag) { - ++state.dataZoneTempPredictorCorrector->IterLimitExceededNum1; - if (state.dataZoneTempPredictorCorrector->IterLimitExceededNum1 == 1) { - ShowWarningError(state, - comfortControlledZone.Name + - ": Iteration limit exceeded calculating thermal comfort Fanger setpoint and non-converged setpoint is used"); - } else { - ShowRecurringWarningErrorAtEnd(state, - comfortControlledZone.Name + ": Iteration limit exceeded calculating thermal comfort setpoint.", - state.dataZoneTempPredictorCorrector->IterLimitErrIndex1, - Tset, - Tset); - } - } - } else if (SolFla == -2) { - if (!state.dataGlobal->WarmupFlag) { - ++state.dataZoneTempPredictorCorrector->IterLimitExceededNum2; - if (state.dataZoneTempPredictorCorrector->IterLimitExceededNum2 == 1) { - ShowWarningError( - state, - format("{}: Solution is not found in calculating thermal comfort Fanger setpoint and the minimum setpoint is used", - comfortControlledZone.Name)); - } else { - ShowRecurringWarningErrorAtEnd( - state, - format("{}: Solution is not found in calculating thermal comfort Fanger setpoint.", comfortControlledZone.Name), - state.dataZoneTempPredictorCorrector->IterLimitErrIndex2, - Tset, - Tset); - } - } - } - } else if (PMVSet < PMVMin) { - Tset = Tmin; - } else if (PMVSet > PMVMax) { - Tset = Tmax; - } -} - -void AdjustCoolingSetPointforTempAndHumidityControl(EnergyPlusData &state, - int const TempControlledZoneID, - int const ActualZoneNum // controlled zone actual zone number -) -{ - // SUBROUTINE INFORMATION: - // AUTHOR Bereket A Nigusse, FSEC/UCF - // DATE WRITTEN Nov 2010 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine modifies the air cooling setpoint temperature to effect zone air Temperature and humidity control - // Alter the zone air cooling setpoint if the zone air relative humidity value exceeds the the zone dehumidifying relative humidity setpoint. - - Real64 ZoneOvercoolRange = 0.0; - auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID); - - if (!(state.dataZoneCtrls->AnyZoneTempAndHumidityControl)) return; // do nothing to setpoint - if (!(tempControlledZone.ZoneOvercoolControl)) return; // do nothing to setpoint - - if (tempControlledZone.OvercoolCntrlModeScheduled) { - ZoneOvercoolRange = ScheduleManager::GetCurrentScheduleValue(state, tempControlledZone.ZoneOvercoolRangeSchedIndex); - } else { - ZoneOvercoolRange = tempControlledZone.ZoneOvercoolConstRange; - } - Real64 ZoneOvercoolControlRatio = tempControlledZone.ZoneOvercoolControlRatio; - - // For Dual Setpoint thermostat the overcool range is limited by the temperature difference between cooling and heating setpoints - Real64 MaxAllowedOvercoolRange = - state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) - state.dataHeatBalFanSys->ZoneThermostatSetPointLo(ActualZoneNum); - if (MaxAllowedOvercoolRange > 0.0) { - ZoneOvercoolRange = min(ZoneOvercoolRange, MaxAllowedOvercoolRange); - } - // Calculate difference between zone air relative humidity and the dehumidifying setpoint - Real64 RelativeHumidityDiff = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ActualZoneNum).ZoneAirRelHum - - ScheduleManager::GetCurrentScheduleValue(state, tempControlledZone.DehumidifyingSchedIndex); - if (RelativeHumidityDiff > 0.0 && ZoneOvercoolControlRatio > 0.0) { - // proportionally reset the cooling setpoint temperature downward (zone Overcool) - ZoneOvercoolRange = min(ZoneOvercoolRange, RelativeHumidityDiff / ZoneOvercoolControlRatio); - state.dataHeatBalFanSys->ZoneThermostatSetPointHi(ActualZoneNum) -= ZoneOvercoolRange; - } -} - -void OverrideAirSetPointsforEMSCntrl(EnergyPlusData &state) -{ - - // SUBROUTINE INFORMATION: - // AUTHOR L. Gu - // DATE WRITTEN June 2017 - - // PURPOSE OF THIS SUBROUTINE: - // This subroutine overrides the air temperature setpoint based on EMS - - auto &ZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo; - auto &ZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi; - - for (int Loop = 1; Loop <= state.dataZoneCtrls->NumTempControlledZones; ++Loop) { - auto &tempControlledZone = state.dataZoneCtrls->TempControlledZone(Loop); - if (tempControlledZone.EMSOverrideHeatingSetPointOn) { - int ZoneNum = tempControlledZone.ActualZoneNum; - - switch (state.dataHeatBalFanSys->TempControlType(ZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; - ZoneThermostatSetPointLo(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; - ZoneThermostatSetPointLo(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - ZoneThermostatSetPointLo(ZoneNum) = tempControlledZone.EMSOverrideHeatingSetPointValue; - break; - default: - break; - } - } - if (tempControlledZone.EMSOverrideCoolingSetPointOn) { - int ZoneNum = tempControlledZone.ActualZoneNum; - - switch (state.dataHeatBalFanSys->TempControlType(ZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleCooling: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; - ZoneThermostatSetPointHi(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; - ZoneThermostatSetPointHi(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - ZoneThermostatSetPointHi(ZoneNum) = tempControlledZone.EMSOverrideCoolingSetPointValue; - break; - default: - break; - } - } - } - - for (int Loop = 1; Loop <= state.dataZoneCtrls->NumComfortControlledZones; ++Loop) { - auto &comfortControlledZone = state.dataZoneCtrls->ComfortControlledZone(Loop); - if (comfortControlledZone.EMSOverrideHeatingSetPointOn) { - int ZoneNum = comfortControlledZone.ActualZoneNum; - switch (state.dataHeatBalFanSys->ComfortControlType(ZoneNum)) { - case DataHVACGlobals::ThermostatType::SingleHeating: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; - ZoneThermostatSetPointLo(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; - ZoneThermostatSetPointLo(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - ZoneThermostatSetPointLo(ZoneNum) = comfortControlledZone.EMSOverrideHeatingSetPointValue; - break; - default: - break; - } - } - - if (comfortControlledZone.EMSOverrideCoolingSetPointOn) { - int ZoneNum = comfortControlledZone.ActualZoneNum; - switch (static_cast(state.dataHeatBalFanSys->ComfortControlType(ZoneNum))) { - case DataHVACGlobals::ThermostatType::SingleCooling: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; - ZoneThermostatSetPointHi(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; - ZoneThermostatSetPointHi(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - ZoneThermostatSetPointHi(ZoneNum) = comfortControlledZone.EMSOverrideCoolingSetPointValue; - break; - default: - break; - } - } - } -} - -// add values to the LEED tabular report related to schedules used by the thermostat objects -void FillPredefinedTableOnThermostatSetpoints(EnergyPlusData &state) -{ - // J.Glazer - Aug 2017 - using namespace OutputReportPredefined; - std::vector uniqSch; - uniqSch.reserve( - state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls + state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls + - state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls + state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls * 2); - Real64 setPointAt11; - Real64 setPointAt23; - int numDays; - std::string monthAssumed; - std::string monthAssumed2; - constexpr int wednesday = 4; - - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatingControls; ++idx) { - auto &singleHtgSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleHeating(idx); - if (std::find(uniqSch.begin(), uniqSch.end(), singleHtgSetpoint.TempSchedIndex) == uniqSch.end()) { - uniqSch.emplace_back(singleHtgSetpoint.TempSchedIndex); - PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, singleHtgSetpoint.TempSchedName, singleHtgSetpoint.Name); - - std::tie(setPointAt11, numDays, monthAssumed) = temperatureAndCountInSch(state, singleHtgSetpoint.TempSchedIndex, false, wednesday, 11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, singleHtgSetpoint.TempSchedName, setPointAt11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, singleHtgSetpoint.TempSchedName, numDays); - - std::tie(setPointAt23, numDays, monthAssumed) = temperatureAndCountInSch(state, singleHtgSetpoint.TempSchedIndex, false, wednesday, 23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, singleHtgSetpoint.TempSchedName, setPointAt23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, singleHtgSetpoint.TempSchedName, numDays); - - PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, singleHtgSetpoint.TempSchedName, monthAssumed); - } - } - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempCoolingControls; ++idx) { - auto &singleClgSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleCooling(idx); - if (std::find(uniqSch.begin(), uniqSch.end(), singleClgSetpoint.TempSchedIndex) == uniqSch.end()) { - uniqSch.emplace_back(singleClgSetpoint.TempSchedIndex); - PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, singleClgSetpoint.TempSchedName, singleClgSetpoint.Name); - - std::tie(setPointAt11, numDays, monthAssumed) = temperatureAndCountInSch(state, singleClgSetpoint.TempSchedIndex, true, wednesday, 11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, singleClgSetpoint.TempSchedName, setPointAt11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, singleClgSetpoint.TempSchedName, numDays); - - std::tie(setPointAt23, numDays, monthAssumed) = temperatureAndCountInSch(state, singleClgSetpoint.TempSchedIndex, true, wednesday, 23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, singleClgSetpoint.TempSchedName, setPointAt23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, singleClgSetpoint.TempSchedName, numDays); - - PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, singleClgSetpoint.TempSchedName, monthAssumed); - } - } - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumSingleTempHeatCoolControls; ++idx) { - auto &singleHeatCoolSetpoint = state.dataZoneTempPredictorCorrector->SetPointSingleHeatCool(idx); - if (std::find(uniqSch.begin(), uniqSch.end(), singleHeatCoolSetpoint.TempSchedIndex) == uniqSch.end()) { - uniqSch.emplace_back(singleHeatCoolSetpoint.TempSchedIndex); - PreDefTableEntry( - state, state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, singleHeatCoolSetpoint.TempSchedName, singleHeatCoolSetpoint.Name); - - std::string schNm = singleHeatCoolSetpoint.TempSchedName + " (summer)"; - std::tie(setPointAt11, numDays, monthAssumed) = - temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, true, wednesday, 11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, schNm, setPointAt11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, schNm, numDays); - - std::tie(setPointAt23, numDays, monthAssumed) = - temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, true, wednesday, 23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, schNm, setPointAt23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, schNm, numDays); - - schNm = singleHeatCoolSetpoint.TempSchedName + " (winter)"; - std::tie(setPointAt11, numDays, monthAssumed2) = - temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, false, wednesday, 11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, schNm, setPointAt11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, schNm, numDays); - - std::tie(setPointAt23, numDays, monthAssumed2) = - temperatureAndCountInSch(state, singleHeatCoolSetpoint.TempSchedIndex, false, wednesday, 23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, schNm, setPointAt23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, schNm, numDays); - - PreDefTableEntry(state, - state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, - singleHeatCoolSetpoint.TempSchedName, - monthAssumed + " and " + monthAssumed2); - } - } - for (int idx = 1; idx <= state.dataZoneTempPredictorCorrector->NumDualTempHeatCoolControls; ++idx) { - auto &dualHeatCoolSetpoint = state.dataZoneTempPredictorCorrector->SetPointDualHeatCool(idx); - if (std::find(uniqSch.begin(), uniqSch.end(), dualHeatCoolSetpoint.HeatTempSchedIndex) == uniqSch.end()) { - uniqSch.emplace_back(dualHeatCoolSetpoint.HeatTempSchedIndex); - PreDefTableEntry(state, - state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, - dualHeatCoolSetpoint.HeatTempSetptSchedName, - dualHeatCoolSetpoint.Name); - - std::tie(setPointAt11, numDays, monthAssumed) = - temperatureAndCountInSch(state, dualHeatCoolSetpoint.HeatTempSchedIndex, false, wednesday, 11); - PreDefTableEntry( - state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, dualHeatCoolSetpoint.HeatTempSetptSchedName, setPointAt11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, dualHeatCoolSetpoint.HeatTempSetptSchedName, numDays); - - std::tie(setPointAt23, numDays, monthAssumed) = - temperatureAndCountInSch(state, dualHeatCoolSetpoint.HeatTempSchedIndex, false, wednesday, 23); - PreDefTableEntry( - state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, dualHeatCoolSetpoint.HeatTempSetptSchedName, setPointAt23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, dualHeatCoolSetpoint.HeatTempSetptSchedName, numDays); - - PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, dualHeatCoolSetpoint.HeatTempSetptSchedName, monthAssumed); - } - if (std::find(uniqSch.begin(), uniqSch.end(), dualHeatCoolSetpoint.CoolTempSchedIndex) == uniqSch.end()) { - uniqSch.emplace_back(dualHeatCoolSetpoint.CoolTempSchedIndex); - PreDefTableEntry(state, - state.dataOutRptPredefined->pdChLeedSchStPtFirstObjUsed, - dualHeatCoolSetpoint.CoolTempSetptSchedName, - dualHeatCoolSetpoint.Name); - - std::tie(setPointAt11, numDays, monthAssumed) = - temperatureAndCountInSch(state, dualHeatCoolSetpoint.CoolTempSchedIndex, true, wednesday, 11); - PreDefTableEntry( - state, state.dataOutRptPredefined->pdchLeedSchStPt11amWednesday, dualHeatCoolSetpoint.CoolTempSetptSchedName, setPointAt11); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11amWedCnt, dualHeatCoolSetpoint.CoolTempSetptSchedName, numDays); - - std::tie(setPointAt23, numDays, monthAssumed) = - temperatureAndCountInSch(state, dualHeatCoolSetpoint.CoolTempSchedIndex, true, wednesday, 23); - PreDefTableEntry( - state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWednesday, dualHeatCoolSetpoint.CoolTempSetptSchedName, setPointAt23); - PreDefTableEntry(state, state.dataOutRptPredefined->pdchLeedSchStPt11pmWedCnt, dualHeatCoolSetpoint.CoolTempSetptSchedName, numDays); - - PreDefTableEntry(state, state.dataOutRptPredefined->pdChLeedSchStPtMonthUsed, dualHeatCoolSetpoint.CoolTempSetptSchedName, monthAssumed); - } - } -} - -// returns the temperature value from a schedule at a certain time for the first day of the week in either January or July -std::tuple -temperatureAndCountInSch(EnergyPlusData &state, int const scheduleIndex, bool const isSummer, int const dayOfWeek, int const hourOfDay) -{ - // J.Glazer - Aug 2017 - - // determine month to use based on hemiphere and season - int monthToUse; - if (isSummer) { - if (state.dataEnvrn->Latitude > 0.) { - monthToUse = 7; // July - summer in northern hemisphere - } else { - monthToUse = 1; // January - summer in southern hemisphere - } - } else { - if (state.dataEnvrn->Latitude > 0.) { - monthToUse = 1; // January - winter in northern hemisphere - } else { - monthToUse = 7; // July - winter in southern hemisphere - } - } - std::string monthName; - if (monthToUse == 1) { - monthName = "January"; - } else { - monthName = "July"; - } - - int jdateSelect = General::nthDayOfWeekOfMonth(state, dayOfWeek, 1, monthToUse); - - // determine number of days in year - int DaysInYear; - if (state.dataEnvrn->CurrentYearIsLeapYear) { - DaysInYear = 366; - } else { - DaysInYear = 365; - } - - // should adjust date if lands on a holiday but for now assume that it does not - - // adjust time of day for daylight savings time - int hourSelect = hourOfDay + state.dataWeatherManager->DSTIndex(jdateSelect); - - // get the value at the selected time - int constexpr firstTimeStep = 1; - int weekSchIndexSelect = state.dataScheduleMgr->Schedule(scheduleIndex).WeekSchedulePointer(jdateSelect); - int daySchIndexSelect = state.dataScheduleMgr->WeekSchedule(weekSchIndexSelect).DaySchedulePointer(dayOfWeek); - Real64 valueAtSelectTime = state.dataScheduleMgr->DaySchedule(daySchIndexSelect).TSValue(firstTimeStep, hourSelect); - int countOfSame = 0; - - // count the number of times with that same value - for (int jdateOfYear = 1; jdateOfYear <= DaysInYear; ++jdateOfYear) { - int wkSch = state.dataScheduleMgr->Schedule(scheduleIndex).WeekSchedulePointer(jdateOfYear); - if (wkSch == weekSchIndexSelect) { // if same week schedule can short circuit rest of testing and increment counter - ++countOfSame; - } else { - int daySch = state.dataScheduleMgr->WeekSchedule(wkSch).DaySchedulePointer(dayOfWeek); - if (daySch == daySchIndexSelect) { // if same day schedule can short circuit rest of testing and increment counter - ++countOfSame; - } else { - Real64 valueAt = state.dataScheduleMgr->DaySchedule(daySch).TSValue(firstTimeStep, hourSelect); - if (valueAt == valueAtSelectTime) { - ++countOfSame; - } - } - } - } - - return std::make_tuple(valueAtSelectTime, countOfSame, monthName); -} - -void ZoneSpaceHeatBalanceData::updateTemperatures(EnergyPlusData &state, - bool const ShortenTimeStepSys, - bool const UseZoneTimeStepHistory, - Real64 const PriorTimeStep, - int const zoneNum, - int const spaceNum) -{ - assert(zoneNum > 0); - if (ShortenTimeStepSys) { - // timestep has just shifted from full zone timestep to a new shorter system timestep - // throw away last updates in corrector and rewind for resimulating smaller timestep - if (spaceNum == 0) { - if (state.dataHeatBal->Zone(zoneNum).SystemZoneNodeNumber > 0) { // roll back result for zone air node, - auto &zoneNode = state.dataLoopNodes->Node(state.dataHeatBal->Zone(zoneNum).SystemZoneNodeNumber); - zoneNode.Temp = this->XMAT[0]; - state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->XMAT[0]; - zoneNode.HumRat = this->WPrevZoneTS[0]; - zoneNode.Enthalpy = Psychrometrics::PsyHFnTdbW(this->XMAT[0], this->WPrevZoneTS[0]); - } - } else { - if (state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber > 0) { // roll back result for space air node, - auto &spaceNode = state.dataLoopNodes->Node(state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber); - spaceNode.Temp = this->XMAT[0]; - state.dataHeatBalFanSys->TempTstatAir(zoneNum) = this->XMAT[0]; - spaceNode.HumRat = this->WPrevZoneTS[0]; - spaceNode.Enthalpy = Psychrometrics::PsyHFnTdbW(this->XMAT[0], this->WPrevZoneTS[0]); - } - } - - if (state.dataHVACGlobal->NumOfSysTimeSteps != - state.dataHVACGlobal->NumOfSysTimeStepsLastZoneTimeStep) { // cannot reuse existing DS data, interpolate from zone time - - this->MAT = DownInterpolate4HistoryValues(PriorTimeStep, state.dataHVACGlobal->TimeStepSys, this->XMAT, this->DSXMAT); - this->ZoneAirHumRat = - DownInterpolate4HistoryValues(PriorTimeStep, state.dataHVACGlobal->TimeStepSys, this->WPrevZoneTS, this->DSWPrevZoneTS); - - if (spaceNum == 0 && state.dataRoomAirMod->anyNonMixingRoomAirModel) { - if (state.dataRoomAirMod->IsZoneDV(zoneNum) || state.dataRoomAirMod->IsZoneUI(zoneNum)) { - - DownInterpolate4HistoryValues(PriorTimeStep, - state.dataHVACGlobal->TimeStepSys, - state.dataRoomAirMod->XMATFloor(zoneNum), - state.dataRoomAirMod->XM2TFloor(zoneNum), - state.dataRoomAirMod->XM3TFloor(zoneNum), - state.dataRoomAirMod->MATFloor(zoneNum), - state.dataRoomAirMod->DSXMATFloor(zoneNum), - state.dataRoomAirMod->DSXM2TFloor(zoneNum), - state.dataRoomAirMod->DSXM3TFloor(zoneNum), - state.dataRoomAirMod->DSXM4TFloor(zoneNum)); - DownInterpolate4HistoryValues(PriorTimeStep, - state.dataHVACGlobal->TimeStepSys, - state.dataRoomAirMod->XMATOC(zoneNum), - state.dataRoomAirMod->XM2TOC(zoneNum), - state.dataRoomAirMod->XM3TOC(zoneNum), - state.dataRoomAirMod->MATOC(zoneNum), - state.dataRoomAirMod->DSXMATOC(zoneNum), - state.dataRoomAirMod->DSXM2TOC(zoneNum), - state.dataRoomAirMod->DSXM3TOC(zoneNum), - state.dataRoomAirMod->DSXM4TOC(zoneNum)); - DownInterpolate4HistoryValues(PriorTimeStep, - state.dataHVACGlobal->TimeStepSys, - state.dataRoomAirMod->XMATMX(zoneNum), - state.dataRoomAirMod->XM2TMX(zoneNum), - state.dataRoomAirMod->XM3TMX(zoneNum), - state.dataRoomAirMod->MATMX(zoneNum), - state.dataRoomAirMod->DSXMATMX(zoneNum), - state.dataRoomAirMod->DSXM2TMX(zoneNum), - state.dataRoomAirMod->DSXM3TMX(zoneNum), - state.dataRoomAirMod->DSXM4TMX(zoneNum)); - } - if (state.dataRoomAirMod->AirModel(zoneNum).AirModelType == DataRoomAirModel::RoomAirModel::AirflowNetwork) { - for (int LoopNode = 1; LoopNode <= state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).NumOfAirNodes; ++LoopNode) { - auto &ThisRAFNNode(state.dataRoomAirMod->RoomAirflowNetworkZoneInfo(zoneNum).Node(LoopNode)); - DownInterpolate4HistoryValues(PriorTimeStep, - state.dataHVACGlobal->TimeStepSys, - ThisRAFNNode.AirTempX1, - ThisRAFNNode.AirTempX2, - ThisRAFNNode.AirTempX3, - ThisRAFNNode.AirTemp, - ThisRAFNNode.AirTempDSX1, - ThisRAFNNode.AirTempDSX2, - ThisRAFNNode.AirTempDSX3, - ThisRAFNNode.AirTempDSX4); - DownInterpolate4HistoryValues(PriorTimeStep, - state.dataHVACGlobal->TimeStepSys, - ThisRAFNNode.HumRatX1, - ThisRAFNNode.HumRatX2, - ThisRAFNNode.HumRatX3, - ThisRAFNNode.HumRat, - ThisRAFNNode.HumRatDSX1, - ThisRAFNNode.HumRatDSX2, - ThisRAFNNode.HumRatDSX3, - ThisRAFNNode.HumRatDSX4); - } - } - } - } else { // reuse history data in DS terms from last zone time step to preserve information that would be lost - // do nothing because DS history would have been pushed prior and should be ready - } - } - // now update the variables actually used in the balance equations. - if (UseZoneTimeStepHistory) { - this->ZTM = this->XMAT; - this->WPrevZoneTSTemp = this->WPrevZoneTS; - } else { // use down-stepped history - this->ZTM = this->DSXMAT; - this->WPrevZoneTSTemp = this->DSWPrevZoneTS; - } -} - -void ZoneSpaceHeatBalanceData::calcPredictedSystemLoad(EnergyPlusData &state, Real64 const RAFNFrac, int const zoneNum, int const spaceNum) -{ - // Calculate the predicted system load for a time step. - - assert(zoneNum > 0); - auto const &thisZone = state.dataHeatBal->Zone(zoneNum); - Real64 const thisTempZoneThermostatSetPoint = state.dataHeatBalFanSys->TempZoneThermostatSetPoint(zoneNum); - Real64 const thisZoneThermostatSetPointLo = state.dataHeatBalFanSys->ZoneThermostatSetPointLo(zoneNum); - Real64 const thisZoneThermostatSetPointHi = state.dataHeatBalFanSys->ZoneThermostatSetPointHi(zoneNum); - - bool thisDeadBandOrSetBack = false; - Real64 ZoneSetPoint = 0.0; - Real64 totalLoad = 0.0; - Real64 LoadToHeatingSetPoint = 0.0; - Real64 LoadToCoolingSetPoint = 0.0; - - switch (state.dataHeatBalFanSys->TempControlType(zoneNum)) { - case DataHVACGlobals::ThermostatType::Uncontrolled: - // Uncontrolled Zone - LoadToHeatingSetPoint = 0.0; - LoadToCoolingSetPoint = 0.0; - totalLoad = 0.0; - break; - case DataHVACGlobals::ThermostatType::SingleHeating: - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - LoadToHeatingSetPoint = (this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd); - break; - } - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepZnLd == 0.0) { // B=0 - LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; - } else { - Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); - LoadToHeatingSetPoint = - this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - } - break; - } - case DataHeatBalance::SolutionAlgo::EulerMethod: { - LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + - this->TempDepZnLd * (thisTempZoneThermostatSetPoint) - this->TempIndZnLd; - break; - } - default: { - assert(false); - } - } - if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; - totalLoad = LoadToHeatingSetPoint; - ZoneSetPoint = thisTempZoneThermostatSetPoint; - LoadToCoolingSetPoint = LoadToHeatingSetPoint; - // for consistency with the other cases, use LE instead of LT and don't subtract 1.0 Watt as a way of pushing the zero load - // case over the threshold - if ((totalLoad) <= 0.0) thisDeadBandOrSetBack = true; - - break; - case DataHVACGlobals::ThermostatType::SingleCooling: - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - LoadToCoolingSetPoint = this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; - break; - } - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepZnLd == 0.0) { // B=0 - LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; - } else { - Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); - LoadToCoolingSetPoint = - this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - } - break; - } - case DataHeatBalance::SolutionAlgo::EulerMethod: { - LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + - this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; - break; - } - default: { - assert(false); - } - } - if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; - if (thisZone.HasAdjustedReturnTempByITE && !(state.dataGlobal->BeginSimFlag)) { - LoadToCoolingSetPoint = this->TempDepZnLd * thisZone.AdjustedReturnTempByITE - this->TempIndZnLd; - } - totalLoad = LoadToCoolingSetPoint; - ZoneSetPoint = thisTempZoneThermostatSetPoint; - LoadToHeatingSetPoint = LoadToCoolingSetPoint; - // for consistency with the other cases, use GE instead of GT and don't add 1.0 Watt as a way of pushing the zero load - // case over the threshold - if ((totalLoad) >= 0.0) thisDeadBandOrSetBack = true; - break; - case DataHVACGlobals::ThermostatType::SingleHeatCool: - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - LoadToHeatingSetPoint = (this->TempDepZnLd * (thisTempZoneThermostatSetPoint) - this->TempIndZnLd); - LoadToCoolingSetPoint = (this->TempDepZnLd * (thisTempZoneThermostatSetPoint) - this->TempIndZnLd); - break; - } - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepZnLd == 0.0) { // B=0 - LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; - LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) - this->TempIndZnLd; - } else { - Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); - LoadToHeatingSetPoint = - this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - LoadToCoolingSetPoint = - this->TempDepZnLd * (thisTempZoneThermostatSetPoint - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - } - break; - } - case DataHeatBalance::SolutionAlgo::EulerMethod: { - LoadToHeatingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + - this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; - LoadToCoolingSetPoint = this->AirPowerCap * (thisTempZoneThermostatSetPoint - this->ZoneT1) + - this->TempDepZnLd * thisTempZoneThermostatSetPoint - this->TempIndZnLd; - break; - } - default: { - assert(false); - } - } - ZoneSetPoint = thisTempZoneThermostatSetPoint; - if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; - if (RAFNFrac > 0.0) LoadToCoolingSetPoint = LoadToCoolingSetPoint / RAFNFrac; - - if (thisZone.HasAdjustedReturnTempByITE && !(state.dataGlobal->BeginSimFlag)) { - LoadToCoolingSetPoint = this->TempDepZnLd * thisZone.AdjustedReturnTempByITE - this->TempIndZnLd; - } - - // Note that LoadToHeatingSetPoint is generally not equal to LoadToCoolingSetPoint - // when the heating and cooling set-points are equal if the zone is unmixed, - // e.g. displacement ventilation or UFAD, since the stratification is generally not the same in heating and cooling modes - - // Possible combinations: - // 1/ LoadToHeatingSetPoint > 0 & LoadToCoolingSetPoint > 0 --> Heating required - // 2/ LoadToHeatingSetPoint > LoadToCoolingSetPoint --> Possible in the unmixed case but should be trapped - // as a poor choice of set-points - // 3/ LoadToHeatingSetPoint < 0 & LoadToCoolingSetPoint < 0 --> Cooling Required - // 4/ LoadToHeatingSetPoint <=0 & LoadToCoolingSetPoint >=0 --> Dead Band Operation ! includes zero load cases - // First trap bad set-points - if (LoadToHeatingSetPoint > LoadToCoolingSetPoint) { - ShowSevereError( - state, - "DataHVACGlobals::ThermostatType::SingleHeatCool: Effective heating set-point higher than effective cooling set-point - use " - "DualSetPointWithDeadBand if using unmixed air model"); - ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); - ShowContinueError(state, - format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); - ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); - ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); - ShowContinueError(state, format("Zone ThermostatSetPoint={:.2R}", thisTempZoneThermostatSetPoint)); - ShowFatalError(state, "Program terminates due to above conditions."); - } - - if (LoadToHeatingSetPoint > 0.0 && LoadToCoolingSetPoint > 0.0) { - totalLoad = LoadToHeatingSetPoint; - } else if (LoadToHeatingSetPoint < 0.0 && LoadToCoolingSetPoint < 0.0) { - totalLoad = LoadToCoolingSetPoint; - } else if (LoadToHeatingSetPoint <= 0.0 && LoadToCoolingSetPoint >= 0.0) { // deadband includes zero loads - totalLoad = 0.0; - if (thisZone.SystemZoneNodeNumber > 0) { - ZoneSetPoint = state.dataLoopNodes->Node(thisZone.SystemZoneNodeNumber).Temp; - ZoneSetPoint = max(ZoneSetPoint, thisZoneThermostatSetPointLo); // trap out of deadband - ZoneSetPoint = min(ZoneSetPoint, thisZoneThermostatSetPointHi); // trap out of deadband - } - thisDeadBandOrSetBack = true; - } else { // this should never occur! - ShowSevereError(state, - "SingleHeatCoolSetPoint: Unanticipated combination of heating and cooling loads - report to EnergyPlus Development Team"); - ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); - ShowContinueError(state, - format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); - ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); - ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); - ShowContinueError(state, format("Zone ThermostatSetPoint={:.2R}", thisTempZoneThermostatSetPoint)); - ShowFatalError(state, "Program terminates due to above conditions."); - } - break; - case DataHVACGlobals::ThermostatType::DualSetPointWithDeadBand: - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - LoadToHeatingSetPoint = (this->TempDepZnLd * (thisZoneThermostatSetPointLo) - this->TempIndZnLd); - LoadToCoolingSetPoint = (this->TempDepZnLd * (thisZoneThermostatSetPointHi) - this->TempIndZnLd); - break; - } - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepZnLd == 0.0) { // B=0 - LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) - this->TempIndZnLd; - LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) - this->TempIndZnLd; - } else { - Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); - LoadToHeatingSetPoint = - this->TempDepZnLd * (thisZoneThermostatSetPointLo - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - LoadToCoolingSetPoint = - this->TempDepZnLd * (thisZoneThermostatSetPointHi - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - } - break; - } - case DataHeatBalance::SolutionAlgo::EulerMethod: { - LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) + - this->TempDepZnLd * thisZoneThermostatSetPointLo - this->TempIndZnLd; - LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) + - this->TempDepZnLd * thisZoneThermostatSetPointHi - this->TempIndZnLd; - break; - } - default: { - assert(false); - } - } - if (RAFNFrac > 0.0) LoadToHeatingSetPoint = LoadToHeatingSetPoint / RAFNFrac; - if (RAFNFrac > 0.0) LoadToCoolingSetPoint = LoadToCoolingSetPoint / RAFNFrac; - - if (thisZone.HasAdjustedReturnTempByITE && !(state.dataGlobal->BeginSimFlag)) { - LoadToCoolingSetPoint = this->TempDepZnLd * thisZone.AdjustedReturnTempByITE - this->TempIndZnLd; - } - - // Possible combinations: - // 1/ LoadToHeatingSetPoint > 0 & LoadToCoolingSetPoint > 0 --> Heating required - // 2/ LoadToHeatingSetPoint > LoadToCoolingSetPoint --> Possible in the unmixed case but should be trapped - // as a poor choice of set-points - // 3/ LoadToHeatingSetPoint < 0 & LoadToCoolingSetPoint < 0 --> Cooling Required - // 4/ LoadToHeatingSetPoint <=0 & LoadToCoolingSetPoint >=0 --> Dead Band Operation - includes zero load cases - // First trap bad set-points - if (LoadToHeatingSetPoint > LoadToCoolingSetPoint) { - ShowSevereError(state, - "DualSetPointWithDeadBand: Effective heating set-point higher than effective cooling set-point - increase " - "deadband if using unmixed air model"); - ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); - ShowContinueError(state, - format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); - ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); - ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); - ShowContinueError(state, format("Zone Heating ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointLo)); - ShowContinueError(state, format("Zone Cooling ThermostatSetPoint={:.2R}", thisZoneThermostatSetPointHi)); - ShowFatalError(state, "Program terminates due to above conditions."); - } - - if (LoadToHeatingSetPoint > 0.0 && LoadToCoolingSetPoint > 0.0) { - totalLoad = LoadToHeatingSetPoint; - ZoneSetPoint = thisZoneThermostatSetPointLo; - } else if (LoadToHeatingSetPoint < 0.0 && LoadToCoolingSetPoint < 0.0) { - totalLoad = LoadToCoolingSetPoint; - ZoneSetPoint = thisZoneThermostatSetPointHi; - } else if (LoadToHeatingSetPoint <= 0.0 && LoadToCoolingSetPoint >= 0.0) { // deadband includes zero loads - // this turns out to cause instabilities sometimes? that lead to setpoint errors if predictor is off. - totalLoad = 0.0; - if (thisZone.SystemZoneNodeNumber > 0) { - ZoneSetPoint = state.dataLoopNodes->Node(thisZone.SystemZoneNodeNumber).Temp; - ZoneSetPoint = max(ZoneSetPoint, thisZoneThermostatSetPointLo); // trap out of deadband - ZoneSetPoint = min(ZoneSetPoint, thisZoneThermostatSetPointHi); // trap out of deadband - } - thisDeadBandOrSetBack = true; - } else { // this should never occur! - ShowSevereError( - state, "DualSetPointWithDeadBand: Unanticipated combination of heating and cooling loads - report to EnergyPlus Development Team"); - ShowContinueErrorTimeStamp(state, "occurs in Zone=" + thisZone.Name); - ShowContinueError(state, - format("LoadToHeatingSetPoint={:.3R}, LoadToCoolingSetPoint={:.3R}", LoadToHeatingSetPoint, LoadToCoolingSetPoint)); - ShowContinueError(state, format("Zone Heating Set-point={:.2R}", thisZoneThermostatSetPointLo)); - ShowContinueError(state, format("Zone Cooling Set-point={:.2R}", thisZoneThermostatSetPointHi)); - ShowContinueError(state, format("Zone TempDepZnLd={:.2R}", this->TempDepZnLd)); - ShowContinueError(state, format("Zone TempIndZnLd={:.2R}", this->TempIndZnLd)); - ShowContinueError(state, format("Zone ThermostatSetPoint={:.2R}", thisTempZoneThermostatSetPoint)); - - ShowFatalError(state, "Program terminates due to above conditions."); - } - break; - default: - break; - } - - int systemNodeNumber = 0; - int stageNum = 0; - if (spaceNum > 0) { - systemNodeNumber = state.dataHeatBal->space(spaceNum).SystemZoneNodeNumber; - stageNum = state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).StageNum; - assert(stageNum == state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).StageNum); - } else { - systemNodeNumber = thisZone.SystemZoneNodeNumber; - stageNum = state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).StageNum; - } - // Staged control zone - if (state.dataZoneTempPredictorCorrector->NumStageCtrZone > 0) { - if (state.dataZoneCtrls->StageZoneLogic(zoneNum)) { - if (stageNum == 0) { // No load - LoadToHeatingSetPoint = 0.0; - LoadToCoolingSetPoint = 0.0; - totalLoad = 0.0; - if (systemNodeNumber > 0) { - ZoneSetPoint = state.dataLoopNodes->Node(systemNodeNumber).Temp; - ZoneSetPoint = max(ZoneSetPoint, thisZoneThermostatSetPointLo); // trap out of deadband - ZoneSetPoint = min(ZoneSetPoint, thisZoneThermostatSetPointHi); // trap out of deadband - } - thisDeadBandOrSetBack = true; - } else if (stageNum < 0) { // Cooling load - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - LoadToCoolingSetPoint = (this->TempDepZnLd * (thisZoneThermostatSetPointHi) - this->TempIndZnLd); - break; - } - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepZnLd == 0.0) { // B=0 - LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) - this->TempIndZnLd; - } else { - Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); - LoadToCoolingSetPoint = - this->TempDepZnLd * (thisZoneThermostatSetPointHi - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - } - break; - } - case DataHeatBalance::SolutionAlgo::EulerMethod: { - LoadToCoolingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointHi - this->ZoneT1) + - this->TempDepZnLd * thisZoneThermostatSetPointHi - this->TempIndZnLd; - break; - } - default: { - assert(false); - } - } - totalLoad = LoadToCoolingSetPoint; - ZoneSetPoint = thisZoneThermostatSetPointHi; - LoadToHeatingSetPoint = LoadToCoolingSetPoint; - if ((totalLoad) >= 0.0) thisDeadBandOrSetBack = true; - } else { // Heating load - switch (state.dataHeatBal->ZoneAirSolutionAlgo) { - case DataHeatBalance::SolutionAlgo::ThirdOrder: { - LoadToHeatingSetPoint = (this->TempDepZnLd * thisZoneThermostatSetPointLo - this->TempIndZnLd); - break; - } - case DataHeatBalance::SolutionAlgo::AnalyticalSolution: { - if (this->TempDepZnLd == 0.0) { // B=0 - LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) - this->TempIndZnLd; - } else { - Real64 const exp_700_TA(std::exp(min(700.0, -this->TempDepZnLd / this->AirPowerCap))); - LoadToHeatingSetPoint = - this->TempDepZnLd * (thisZoneThermostatSetPointLo - this->ZoneT1 * exp_700_TA) / (1.0 - exp_700_TA) - this->TempIndZnLd; - } - break; - } - case DataHeatBalance::SolutionAlgo::EulerMethod: { - LoadToHeatingSetPoint = this->AirPowerCap * (thisZoneThermostatSetPointLo - this->ZoneT1) + - this->TempDepZnLd * (thisZoneThermostatSetPointLo) - this->TempIndZnLd; - break; - } - default: { - assert(false); - } - } - totalLoad = LoadToHeatingSetPoint; - ZoneSetPoint = thisZoneThermostatSetPointLo; - LoadToCoolingSetPoint = LoadToHeatingSetPoint; - if ((totalLoad) <= 0.0) thisDeadBandOrSetBack = true; - } - } - } - - // If the ZoneNodeNum has been set for a Controlled Zone, then the zone setpoint is placed on the node. - if (thisZone.SystemZoneNodeNumber > 0) { - state.dataLoopNodes->Node(thisZone.SystemZoneNodeNumber).TempSetPoint = ZoneSetPoint; - } - - state.dataZoneEnergyDemand->Setback(zoneNum) = (ZoneSetPoint > this->ZoneSetPointLast); - - this->ZoneSetPointLast = ZoneSetPoint; - state.dataHeatBalFanSys->TempZoneThermostatSetPoint(zoneNum) = ZoneSetPoint; // needed to fix Issue # 5048 - state.dataZoneEnergyDemand->DeadBandOrSetback(zoneNum) = thisDeadBandOrSetBack; - state.dataZoneEnergyDemand->CurDeadBandOrSetback(zoneNum) = thisDeadBandOrSetBack; - - // Apply the Zone Multiplier and Load Correction factor as needed - if (spaceNum > 0) { - state.dataZoneEnergyDemand->spaceSysEnergyDemand(spaceNum).reportSensibleLoadsZoneMultiplier( - state, zoneNum, totalLoad, LoadToHeatingSetPoint, LoadToCoolingSetPoint); - } else { - state.dataZoneEnergyDemand->ZoneSysEnergyDemand(zoneNum).reportSensibleLoadsZoneMultiplier( - state, zoneNum, totalLoad, LoadToHeatingSetPoint, LoadToCoolingSetPoint); - } -} -} // namespace EnergyPlus::ZoneTempPredictorCorrector From 06448e104ddbb69326a5f6f54dadd9c0274b3545 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Tue, 26 Sep 2023 16:35:08 -0500 Subject: [PATCH 07/26] EnclosureAveraged --- performance_tests/15zonePSZ.idf | 30 ++-- performance_tests/15zonePTAC.idf | 30 ++-- performance_tests/15zonePVAV.idf | 30 ++-- performance_tests/15zonevav.idf | 30 ++-- performance_tests/15zonevav_no_reports.idf | 30 ++-- performance_tests/30zonePSZ.idf | 60 ++++---- performance_tests/30zonePTAC.idf | 60 ++++---- performance_tests/30zonePVAV.idf | 60 ++++---- performance_tests/30zonevav.idf | 60 ++++---- performance_tests/45zonePSZ.idf | 90 ++++++------ performance_tests/45zonePTAC.idf | 90 ++++++------ performance_tests/45zonePVAV.idf | 90 ++++++------ performance_tests/45zonevav.idf | 90 ++++++------ ...chmarkHospitalNew_USA_CA_SAN_FRANCISCO.idf | 108 +++++++------- ...A_CA_SAN_FRANCISCO_10_windows_per_zone.idf | 30 ++-- ...icenew_usa_ca_san_francisco_no_reports.idf | 30 ++-- .../ASHRAE901_HotelSmall_STD2019_Denver.idf | 134 +++++++++--------- .../ASHRAE901_OfficeSmall_STD2019_Denver.idf | 10 +- .../ASHRAE901_Warehouse_STD2019_Denver.idf | 2 +- testfiles/AtticRoof_RadiantBarriers.idf | 2 +- testfiles/SingleFamilyHouse_HP_Slab.idf | 2 +- ...leFamilyHouse_HP_Slab_Dehumidification.idf | 2 +- ...US+SF+CZ4A+hp+crawlspace+IECC_2006_VRF.idf | 2 +- 23 files changed, 536 insertions(+), 536 deletions(-) diff --git a/performance_tests/15zonePSZ.idf b/performance_tests/15zonePSZ.idf index 07c43fca111..7186fa2e716 100644 --- a/performance_tests/15zonePSZ.idf +++ b/performance_tests/15zonePSZ.idf @@ -1863,7 +1863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2266,7 +2266,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2669,7 +2669,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3072,7 +3072,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3475,7 +3475,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3878,7 +3878,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4281,7 +4281,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4684,7 +4684,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5087,7 +5087,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5490,7 +5490,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5893,7 +5893,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6296,7 +6296,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6678,7 +6678,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7026,7 +7026,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7408,7 +7408,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/15zonePTAC.idf b/performance_tests/15zonePTAC.idf index 4412325f839..d05446ac08d 100644 --- a/performance_tests/15zonePTAC.idf +++ b/performance_tests/15zonePTAC.idf @@ -1863,7 +1863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2372,7 +2372,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2881,7 +2881,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3390,7 +3390,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3899,7 +3899,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4408,7 +4408,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4917,7 +4917,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5426,7 +5426,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5935,7 +5935,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6444,7 +6444,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6953,7 +6953,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7462,7 +7462,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7950,7 +7950,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8404,7 +8404,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8892,7 +8892,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/15zonePVAV.idf b/performance_tests/15zonePVAV.idf index e6fe46cd48f..bae4fdbdd75 100644 --- a/performance_tests/15zonePVAV.idf +++ b/performance_tests/15zonePVAV.idf @@ -1863,7 +1863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2281,7 +2281,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2699,7 +2699,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3117,7 +3117,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3535,7 +3535,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3953,7 +3953,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4371,7 +4371,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4789,7 +4789,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5207,7 +5207,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5625,7 +5625,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6043,7 +6043,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6461,7 +6461,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6858,7 +6858,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7221,7 +7221,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7618,7 +7618,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/15zonevav.idf b/performance_tests/15zonevav.idf index 8517fc959b4..b7c4e939071 100644 --- a/performance_tests/15zonevav.idf +++ b/performance_tests/15zonevav.idf @@ -1863,7 +1863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2281,7 +2281,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2699,7 +2699,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3117,7 +3117,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3535,7 +3535,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3953,7 +3953,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4371,7 +4371,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4789,7 +4789,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5207,7 +5207,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5625,7 +5625,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6043,7 +6043,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6461,7 +6461,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6858,7 +6858,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7221,7 +7221,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7618,7 +7618,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/15zonevav_no_reports.idf b/performance_tests/15zonevav_no_reports.idf index 12c35c9ad5e..6b24cfb234a 100644 --- a/performance_tests/15zonevav_no_reports.idf +++ b/performance_tests/15zonevav_no_reports.idf @@ -1863,7 +1863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2281,7 +2281,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2699,7 +2699,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3117,7 +3117,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3535,7 +3535,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3953,7 +3953,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4371,7 +4371,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4789,7 +4789,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5207,7 +5207,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5625,7 +5625,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6043,7 +6043,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6461,7 +6461,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6858,7 +6858,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7221,7 +7221,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7618,7 +7618,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/30zonePSZ.idf b/performance_tests/30zonePSZ.idf index 782e64b7748..510986aab33 100644 --- a/performance_tests/30zonePSZ.idf +++ b/performance_tests/30zonePSZ.idf @@ -1863,7 +1863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2266,7 +2266,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2669,7 +2669,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3072,7 +3072,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3475,7 +3475,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3878,7 +3878,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4281,7 +4281,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4684,7 +4684,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5087,7 +5087,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5490,7 +5490,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5893,7 +5893,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6296,7 +6296,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6699,7 +6699,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7102,7 +7102,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7505,7 +7505,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7908,7 +7908,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8311,7 +8311,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8714,7 +8714,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9117,7 +9117,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9520,7 +9520,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9923,7 +9923,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10326,7 +10326,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10729,7 +10729,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11132,7 +11132,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11514,7 +11514,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11896,7 +11896,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12244,7 +12244,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12592,7 +12592,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12974,7 +12974,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13356,7 +13356,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/30zonePTAC.idf b/performance_tests/30zonePTAC.idf index 13939eb4ac0..e462d9a1196 100644 --- a/performance_tests/30zonePTAC.idf +++ b/performance_tests/30zonePTAC.idf @@ -1863,7 +1863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2372,7 +2372,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2881,7 +2881,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3390,7 +3390,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3899,7 +3899,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4408,7 +4408,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4917,7 +4917,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5426,7 +5426,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5935,7 +5935,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6444,7 +6444,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6953,7 +6953,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7462,7 +7462,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7971,7 +7971,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8480,7 +8480,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8989,7 +8989,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9498,7 +9498,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10007,7 +10007,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10516,7 +10516,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11025,7 +11025,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11534,7 +11534,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12043,7 +12043,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12552,7 +12552,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13061,7 +13061,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13570,7 +13570,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14058,7 +14058,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14546,7 +14546,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15000,7 +15000,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15454,7 +15454,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15942,7 +15942,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16430,7 +16430,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/30zonePVAV.idf b/performance_tests/30zonePVAV.idf index b467b8550b1..30b879a9a18 100644 --- a/performance_tests/30zonePVAV.idf +++ b/performance_tests/30zonePVAV.idf @@ -1863,7 +1863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2281,7 +2281,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2699,7 +2699,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3117,7 +3117,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3535,7 +3535,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3953,7 +3953,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4371,7 +4371,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4789,7 +4789,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5207,7 +5207,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5625,7 +5625,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6043,7 +6043,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6461,7 +6461,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6879,7 +6879,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7297,7 +7297,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7715,7 +7715,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8133,7 +8133,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8551,7 +8551,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8969,7 +8969,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9387,7 +9387,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9805,7 +9805,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10223,7 +10223,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10641,7 +10641,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11059,7 +11059,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11477,7 +11477,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11874,7 +11874,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12271,7 +12271,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12634,7 +12634,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12997,7 +12997,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13394,7 +13394,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13791,7 +13791,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/30zonevav.idf b/performance_tests/30zonevav.idf index 916bf9e326f..c623de61dbd 100644 --- a/performance_tests/30zonevav.idf +++ b/performance_tests/30zonevav.idf @@ -1863,7 +1863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2281,7 +2281,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2699,7 +2699,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3117,7 +3117,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3535,7 +3535,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3953,7 +3953,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4371,7 +4371,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4789,7 +4789,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5207,7 +5207,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5625,7 +5625,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6043,7 +6043,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6461,7 +6461,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6879,7 +6879,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7297,7 +7297,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7715,7 +7715,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8133,7 +8133,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8551,7 +8551,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8969,7 +8969,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9387,7 +9387,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9805,7 +9805,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10223,7 +10223,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10641,7 +10641,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11059,7 +11059,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11477,7 +11477,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11874,7 +11874,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12271,7 +12271,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12634,7 +12634,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12997,7 +12997,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13394,7 +13394,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13791,7 +13791,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/45zonePSZ.idf b/performance_tests/45zonePSZ.idf index 51b2540c12c..c1f925be2e7 100644 --- a/performance_tests/45zonePSZ.idf +++ b/performance_tests/45zonePSZ.idf @@ -1863,7 +1863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2266,7 +2266,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2669,7 +2669,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3072,7 +3072,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3475,7 +3475,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3878,7 +3878,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4281,7 +4281,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4684,7 +4684,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5087,7 +5087,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5490,7 +5490,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5893,7 +5893,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6296,7 +6296,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6699,7 +6699,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7102,7 +7102,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7505,7 +7505,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7908,7 +7908,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8311,7 +8311,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8714,7 +8714,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9117,7 +9117,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9520,7 +9520,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9923,7 +9923,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10326,7 +10326,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10729,7 +10729,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11132,7 +11132,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11535,7 +11535,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11938,7 +11938,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12341,7 +12341,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12744,7 +12744,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13147,7 +13147,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13550,7 +13550,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13953,7 +13953,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14356,7 +14356,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14759,7 +14759,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15162,7 +15162,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15565,7 +15565,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15968,7 +15968,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16350,7 +16350,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16732,7 +16732,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17114,7 +17114,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17462,7 +17462,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17810,7 +17810,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18158,7 +18158,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18540,7 +18540,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18922,7 +18922,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19304,7 +19304,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/45zonePTAC.idf b/performance_tests/45zonePTAC.idf index f38bc8467d4..53c9a8ebc0b 100644 --- a/performance_tests/45zonePTAC.idf +++ b/performance_tests/45zonePTAC.idf @@ -1863,7 +1863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2372,7 +2372,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2881,7 +2881,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3390,7 +3390,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3899,7 +3899,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4408,7 +4408,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4917,7 +4917,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5426,7 +5426,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5935,7 +5935,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6444,7 +6444,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6953,7 +6953,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7462,7 +7462,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7971,7 +7971,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8480,7 +8480,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8989,7 +8989,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9498,7 +9498,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10007,7 +10007,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10516,7 +10516,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11025,7 +11025,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11534,7 +11534,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12043,7 +12043,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12552,7 +12552,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13061,7 +13061,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13570,7 +13570,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14079,7 +14079,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14588,7 +14588,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15097,7 +15097,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15606,7 +15606,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16115,7 +16115,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16624,7 +16624,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17133,7 +17133,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17642,7 +17642,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18151,7 +18151,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18660,7 +18660,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19169,7 +19169,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19678,7 +19678,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -20166,7 +20166,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -20654,7 +20654,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -21142,7 +21142,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -21596,7 +21596,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -22050,7 +22050,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -22504,7 +22504,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -22992,7 +22992,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -23480,7 +23480,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -23968,7 +23968,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/45zonePVAV.idf b/performance_tests/45zonePVAV.idf index ebcb928c734..bb92a304781 100644 --- a/performance_tests/45zonePVAV.idf +++ b/performance_tests/45zonePVAV.idf @@ -1863,7 +1863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2281,7 +2281,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2699,7 +2699,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3117,7 +3117,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3535,7 +3535,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3953,7 +3953,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4371,7 +4371,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4789,7 +4789,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5207,7 +5207,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5625,7 +5625,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6043,7 +6043,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6461,7 +6461,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6879,7 +6879,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7297,7 +7297,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7715,7 +7715,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8133,7 +8133,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8551,7 +8551,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8969,7 +8969,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9387,7 +9387,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9805,7 +9805,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10223,7 +10223,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10641,7 +10641,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11059,7 +11059,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11477,7 +11477,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11895,7 +11895,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12313,7 +12313,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12731,7 +12731,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13149,7 +13149,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13567,7 +13567,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13985,7 +13985,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14403,7 +14403,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14821,7 +14821,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15239,7 +15239,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15657,7 +15657,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16075,7 +16075,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16493,7 +16493,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16890,7 +16890,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17287,7 +17287,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17684,7 +17684,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18047,7 +18047,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18410,7 +18410,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18773,7 +18773,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19170,7 +19170,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19567,7 +19567,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19964,7 +19964,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/45zonevav.idf b/performance_tests/45zonevav.idf index a86a6e55725..05766411451 100644 --- a/performance_tests/45zonevav.idf +++ b/performance_tests/45zonevav.idf @@ -1863,7 +1863,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2281,7 +2281,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2699,7 +2699,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3117,7 +3117,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3535,7 +3535,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3953,7 +3953,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4371,7 +4371,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4789,7 +4789,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5207,7 +5207,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5625,7 +5625,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6043,7 +6043,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6461,7 +6461,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6879,7 +6879,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7297,7 +7297,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7715,7 +7715,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8133,7 +8133,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8551,7 +8551,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8969,7 +8969,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9387,7 +9387,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9805,7 +9805,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10223,7 +10223,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10641,7 +10641,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11059,7 +11059,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11477,7 +11477,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11895,7 +11895,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12313,7 +12313,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12731,7 +12731,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13149,7 +13149,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13567,7 +13567,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13985,7 +13985,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14403,7 +14403,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14821,7 +14821,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15239,7 +15239,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15657,7 +15657,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16075,7 +16075,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16493,7 +16493,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16890,7 +16890,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17287,7 +17287,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17684,7 +17684,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18047,7 +18047,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18410,7 +18410,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18773,7 +18773,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19170,7 +19170,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19567,7 +19567,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19964,7 +19964,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/BenchmarkHospitalNew_USA_CA_SAN_FRANCISCO.idf b/performance_tests/BenchmarkHospitalNew_USA_CA_SAN_FRANCISCO.idf index 5ed9f31e778..233105d17c1 100644 --- a/performance_tests/BenchmarkHospitalNew_USA_CA_SAN_FRANCISCO.idf +++ b/performance_tests/BenchmarkHospitalNew_USA_CA_SAN_FRANCISCO.idf @@ -1982,7 +1982,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2400,7 +2400,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2818,7 +2818,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3236,7 +3236,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3654,7 +3654,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4087,7 +4087,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4558,7 +4558,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4938,7 +4938,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5364,7 +5364,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5727,7 +5727,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6145,7 +6145,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6563,7 +6563,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6981,7 +6981,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7414,7 +7414,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7807,7 +7807,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8185,7 +8185,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8563,7 +8563,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -8926,7 +8926,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9289,7 +9289,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -9715,7 +9715,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10093,7 +10093,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10541,7 +10541,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -10974,7 +10974,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11422,7 +11422,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -11855,7 +11855,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12273,7 +12273,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -12721,7 +12721,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13154,7 +13154,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -13602,7 +13602,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14134,7 +14134,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -14535,7 +14535,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15118,7 +15118,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15618,7 +15618,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -15968,7 +15968,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16416,7 +16416,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -16849,7 +16849,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17297,7 +17297,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -17730,7 +17730,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18148,7 +18148,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -18596,7 +18596,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19029,7 +19029,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -19477,7 +19477,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -20009,7 +20009,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -20410,7 +20410,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -20993,7 +20993,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -21493,7 +21493,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -21843,7 +21843,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -22242,7 +22242,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -22622,7 +22622,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -23380,7 +23380,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -23758,7 +23758,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -24151,7 +24151,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -24529,7 +24529,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -24968,7 +24968,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/BenchmarkLargeOfficeNew_USA_CA_SAN_FRANCISCO_10_windows_per_zone.idf b/performance_tests/BenchmarkLargeOfficeNew_USA_CA_SAN_FRANCISCO_10_windows_per_zone.idf index e3a0c099617..ea2327fcea8 100644 --- a/performance_tests/BenchmarkLargeOfficeNew_USA_CA_SAN_FRANCISCO_10_windows_per_zone.idf +++ b/performance_tests/BenchmarkLargeOfficeNew_USA_CA_SAN_FRANCISCO_10_windows_per_zone.idf @@ -1989,7 +1989,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2407,7 +2407,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2825,7 +2825,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3243,7 +3243,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3606,7 +3606,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3969,7 +3969,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4332,7 +4332,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4695,7 +4695,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5058,7 +5058,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5421,7 +5421,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5784,7 +5784,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6147,7 +6147,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6510,7 +6510,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6873,7 +6873,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7236,7 +7236,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/performance_tests/Benchmarklargeofficenew_usa_ca_san_francisco_no_reports.idf b/performance_tests/Benchmarklargeofficenew_usa_ca_san_francisco_no_reports.idf index 1106cd10dfb..edfefbf0774 100644 --- a/performance_tests/Benchmarklargeofficenew_usa_ca_san_francisco_no_reports.idf +++ b/performance_tests/Benchmarklargeofficenew_usa_ca_san_francisco_no_reports.idf @@ -1989,7 +1989,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2407,7 +2407,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -2825,7 +2825,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3258,7 +3258,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -3636,7 +3636,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4014,7 +4014,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4392,7 +4392,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -4770,7 +4770,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5148,7 +5148,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5526,7 +5526,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -5904,7 +5904,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6282,7 +6282,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -6660,7 +6660,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7038,7 +7038,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -7416,7 +7416,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name WORK_EFF_SCH, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/ASHRAE901_HotelSmall_STD2019_Denver.idf b/testfiles/ASHRAE901_HotelSmall_STD2019_Denver.idf index 58df32cd5fd..e9551fb97df 100644 --- a/testfiles/ASHRAE901_HotelSmall_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_HotelSmall_STD2019_Denver.idf @@ -13804,7 +13804,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, CorridorFlr2_People, !- Name @@ -13819,7 +13819,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, CorridorFlr3_People, !- Name @@ -13834,7 +13834,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, CorridorFlr4_People, !- Name @@ -13849,7 +13849,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, ElevatorCoreFlr1_People, !- Name @@ -13864,7 +13864,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, ElevatorCoreFlr2_People, !- Name @@ -13879,7 +13879,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, ElevatorCoreFlr3_People, !- Name @@ -13894,7 +13894,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, ElevatorCoreFlr4_People, !- Name @@ -13909,7 +13909,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, EmployeeLoungeFlr1_People, !- Name @@ -13924,7 +13924,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, ExerciseCenterFlr1_People, !- Name @@ -13939,7 +13939,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, FrontLoungeFlr1_People, !- Name @@ -13954,7 +13954,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, FrontOfficeFlr1_People, !- Name @@ -13969,7 +13969,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, FrontStairsFlr1_People, !- Name @@ -13984,7 +13984,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, FrontStairsFlr2_People, !- Name @@ -13999,7 +13999,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, FrontStairsFlr3_People, !- Name @@ -14014,7 +14014,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, FrontStairsFlr4_People, !- Name @@ -14029,7 +14029,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, FrontStorageFlr1_People, !- Name @@ -14044,7 +14044,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, FrontStorageFlr2_People, !- Name @@ -14059,7 +14059,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, FrontStorageFlr3_People, !- Name @@ -14074,7 +14074,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, FrontStorageFlr4_People, !- Name @@ -14089,7 +14089,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom101_People, !- Name @@ -14104,7 +14104,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom102_People, !- Name @@ -14119,7 +14119,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom103_People, !- Name @@ -14134,7 +14134,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom104_People, !- Name @@ -14149,7 +14149,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom105_People, !- Name @@ -14164,7 +14164,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom201_People, !- Name @@ -14179,7 +14179,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom202_205_People, !- Name @@ -14194,7 +14194,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom206_208_People, !- Name @@ -14209,7 +14209,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom209_212_People, !- Name @@ -14224,7 +14224,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom213_People, !- Name @@ -14239,7 +14239,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom214_People, !- Name @@ -14254,7 +14254,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom215_218_People, !- Name @@ -14269,7 +14269,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom219_People, !- Name @@ -14284,7 +14284,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom220_223_People, !- Name @@ -14299,7 +14299,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom224_People, !- Name @@ -14314,7 +14314,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom301_People, !- Name @@ -14329,7 +14329,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom302_305_People, !- Name @@ -14344,7 +14344,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom306_308_People, !- Name @@ -14359,7 +14359,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom309_312_People, !- Name @@ -14374,7 +14374,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom313_People, !- Name @@ -14389,7 +14389,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom314_People, !- Name @@ -14404,7 +14404,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom315_318_People, !- Name @@ -14419,7 +14419,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom319_People, !- Name @@ -14434,7 +14434,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom320_323_People, !- Name @@ -14449,7 +14449,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom324_People, !- Name @@ -14464,7 +14464,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom401_People, !- Name @@ -14479,7 +14479,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom402_405_People, !- Name @@ -14494,7 +14494,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom406_408_People, !- Name @@ -14509,7 +14509,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom409_412_People, !- Name @@ -14524,7 +14524,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom413_People, !- Name @@ -14539,7 +14539,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom414_People, !- Name @@ -14554,7 +14554,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom415_418_People, !- Name @@ -14569,7 +14569,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom419_People, !- Name @@ -14584,7 +14584,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom420_423_People, !- Name @@ -14599,7 +14599,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, GuestRoom424_People, !- Name @@ -14614,7 +14614,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, LaundryRoomFlr1_People, !- Name @@ -14629,7 +14629,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, MechanicalRoomFlr1_People, !- Name @@ -14644,7 +14644,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, MeetingRoomFlr1_People, !- Name @@ -14659,7 +14659,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, RearStairsFlr1_People, !- Name @@ -14674,7 +14674,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, RearStairsFlr2_People, !- Name @@ -14689,7 +14689,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, RearStairsFlr3_People, !- Name @@ -14704,7 +14704,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, RearStairsFlr4_People, !- Name @@ -14719,7 +14719,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, RearStorageFlr1_People, !- Name @@ -14734,7 +14734,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, RearStorageFlr2_People, !- Name @@ -14749,7 +14749,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, RearStorageFlr3_People, !- Name @@ -14764,7 +14764,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, RearStorageFlr4_People, !- Name @@ -14779,7 +14779,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, RestroomFlr1_People, !- Name @@ -14794,7 +14794,7 @@ Activity_Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type !- =========== ALL OBJECTS IN CLASS: LIGHTS =========== diff --git a/testfiles/ASHRAE901_OfficeSmall_STD2019_Denver.idf b/testfiles/ASHRAE901_OfficeSmall_STD2019_Denver.idf index 9e3dd0f5702..108fb1ef86d 100644 --- a/testfiles/ASHRAE901_OfficeSmall_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_OfficeSmall_STD2019_Denver.idf @@ -2972,7 +2972,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, Perimeter_ZN_1, !- Name @@ -2987,7 +2987,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, Perimeter_ZN_2, !- Name @@ -3002,7 +3002,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, Perimeter_ZN_3, !- Name @@ -3017,7 +3017,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type People, Perimeter_ZN_4, !- Name @@ -3032,7 +3032,7 @@ ACTIVITY_SCH, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type !- =========== ALL OBJECTS IN CLASS: LIGHTS =========== diff --git a/testfiles/ASHRAE901_Warehouse_STD2019_Denver.idf b/testfiles/ASHRAE901_Warehouse_STD2019_Denver.idf index 65f3a5ab057..5537023e54a 100644 --- a/testfiles/ASHRAE901_Warehouse_STD2019_Denver.idf +++ b/testfiles/ASHRAE901_Warehouse_STD2019_Denver.idf @@ -4359,7 +4359,7 @@ Office Activity Schedule,!- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type !- =========== ALL OBJECTS IN CLASS: LIGHTS =========== diff --git a/testfiles/AtticRoof_RadiantBarriers.idf b/testfiles/AtticRoof_RadiantBarriers.idf index 089a1f6862b..7759989dd69 100644 --- a/testfiles/AtticRoof_RadiantBarriers.idf +++ b/testfiles/AtticRoof_RadiantBarriers.idf @@ -733,7 +733,7 @@ occupants activity schedule, !- Activity Level Schedule Name 0, !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type Lights, interior lighting, !- Name diff --git a/testfiles/SingleFamilyHouse_HP_Slab.idf b/testfiles/SingleFamilyHouse_HP_Slab.idf index 75fa842730d..b4906fd0a8a 100644 --- a/testfiles/SingleFamilyHouse_HP_Slab.idf +++ b/testfiles/SingleFamilyHouse_HP_Slab.idf @@ -2805,7 +2805,7 @@ activity_sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type !- =========== ALL OBJECTS IN CLASS: LIGHTS =========== diff --git a/testfiles/SingleFamilyHouse_HP_Slab_Dehumidification.idf b/testfiles/SingleFamilyHouse_HP_Slab_Dehumidification.idf index e181fd8d1e4..48eb4cd5128 100644 --- a/testfiles/SingleFamilyHouse_HP_Slab_Dehumidification.idf +++ b/testfiles/SingleFamilyHouse_HP_Slab_Dehumidification.idf @@ -2805,7 +2805,7 @@ activity_sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type !- =========== ALL OBJECTS IN CLASS: LIGHTS =========== diff --git a/testfiles/US+SF+CZ4A+hp+crawlspace+IECC_2006_VRF.idf b/testfiles/US+SF+CZ4A+hp+crawlspace+IECC_2006_VRF.idf index 06b944fb7bc..b8d89a106d4 100644 --- a/testfiles/US+SF+CZ4A+hp+crawlspace+IECC_2006_VRF.idf +++ b/testfiles/US+SF+CZ4A+hp+crawlspace+IECC_2006_VRF.idf @@ -6349,7 +6349,7 @@ activity_sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} No, !- Enable ASHRAE 55 Comfort Warnings - ZoneAveraged; !- Mean Radiant Temperature Calculation Type + EnclosureAveraged; !- Mean Radiant Temperature Calculation Type !- =========== ALL OBJECTS IN CLASS: LIGHTS =========== From 066ff56fa57ebcb756f1d62ee56337f7dfe555b2 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Tue, 26 Sep 2023 19:11:02 -0500 Subject: [PATCH 08/26] EnclosureAveraged and json field names --- testfiles/HVAC3Zone-IntGains-Def.imf | 6 +- ...gMediumOfficeNew2004_Chicago_epJSON.epJSON | 90 +++++++++---------- 2 files changed, 48 insertions(+), 48 deletions(-) diff --git a/testfiles/HVAC3Zone-IntGains-Def.imf b/testfiles/HVAC3Zone-IntGains-Def.imf index 6cb8e1448a2..c87a97f08b9 100644 --- a/testfiles/HVAC3Zone-IntGains-Def.imf +++ b/testfiles/HVAC3Zone-IntGains-Def.imf @@ -17,7 +17,7 @@ Activity Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -51,7 +51,7 @@ Activity Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -99,7 +99,7 @@ Activity Sch, !- Activity Level Schedule Name , !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method diff --git a/testfiles/RefBldgMediumOfficeNew2004_Chicago_epJSON.epJSON b/testfiles/RefBldgMediumOfficeNew2004_Chicago_epJSON.epJSON index 17a77dada74..365450f89ab 100644 --- a/testfiles/RefBldgMediumOfficeNew2004_Chicago_epJSON.epJSON +++ b/testfiles/RefBldgMediumOfficeNew2004_Chicago_epJSON.epJSON @@ -5624,7 +5624,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Core_bottom" }, "Core_mid_PlugMisc_Equip": { @@ -5634,7 +5634,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Core_mid" }, "Core_top_PlugMisc_Equip": { @@ -5644,7 +5644,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Core_top" }, "Perimeter_bot_ZN_1_PlugMisc_Equip": { @@ -5654,7 +5654,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_bot_ZN_1" }, "Perimeter_bot_ZN_2_PlugMisc_Equip": { @@ -5664,7 +5664,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_bot_ZN_2" }, "Perimeter_bot_ZN_3_PlugMisc_Equip": { @@ -5674,7 +5674,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_bot_ZN_3" }, "Perimeter_bot_ZN_4_PlugMisc_Equip": { @@ -5684,7 +5684,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_bot_ZN_4" }, "Perimeter_mid_ZN_1_PlugMisc_Equip": { @@ -5694,7 +5694,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_mid_ZN_1" }, "Perimeter_mid_ZN_2_PlugMisc_Equip": { @@ -5704,7 +5704,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_mid_ZN_2" }, "Perimeter_mid_ZN_3_PlugMisc_Equip": { @@ -5714,7 +5714,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_mid_ZN_3" }, "Perimeter_mid_ZN_4_PlugMisc_Equip": { @@ -5724,7 +5724,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_mid_ZN_4" }, "Perimeter_top_ZN_1_PlugMisc_Equip": { @@ -5734,7 +5734,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_top_ZN_1" }, "Perimeter_top_ZN_2_PlugMisc_Equip": { @@ -5744,7 +5744,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_top_ZN_2" }, "Perimeter_top_ZN_3_PlugMisc_Equip": { @@ -5754,7 +5754,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_top_ZN_3" }, "Perimeter_top_ZN_4_PlugMisc_Equip": { @@ -5764,7 +5764,7 @@ "fraction_lost": 0.0, "fraction_radiant": 0.5, "schedule_name": "BLDG_EQUIP_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_top_ZN_4" } }, @@ -6230,7 +6230,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Core_bottom" }, "Core_mid_Lights": { @@ -6242,7 +6242,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Core_mid" }, "Core_top_Lights": { @@ -6254,7 +6254,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Core_top" }, "Perimeter_bot_ZN_1_Lights": { @@ -6266,7 +6266,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_bot_ZN_1" }, "Perimeter_bot_ZN_2_Lights": { @@ -6278,7 +6278,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_bot_ZN_2" }, "Perimeter_bot_ZN_3_Lights": { @@ -6290,7 +6290,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_bot_ZN_3" }, "Perimeter_bot_ZN_4_Lights": { @@ -6302,7 +6302,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_bot_ZN_4" }, "Perimeter_mid_ZN_1_Lights": { @@ -6314,7 +6314,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_mid_ZN_1" }, "Perimeter_mid_ZN_2_Lights": { @@ -6326,7 +6326,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_mid_ZN_2" }, "Perimeter_mid_ZN_3_Lights": { @@ -6338,7 +6338,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_mid_ZN_3" }, "Perimeter_mid_ZN_4_Lights": { @@ -6350,7 +6350,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_mid_ZN_4" }, "Perimeter_top_ZN_1_Lights": { @@ -6362,7 +6362,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_top_ZN_1" }, "Perimeter_top_ZN_2_Lights": { @@ -6374,7 +6374,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_top_ZN_2" }, "Perimeter_top_ZN_3_Lights": { @@ -6386,7 +6386,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_top_ZN_3" }, "Perimeter_top_ZN_4_Lights": { @@ -6398,7 +6398,7 @@ "return_air_fraction": 0.4, "return_air_fraction_calculated_from_plenum_temperature": "No", "schedule_name": "BLDG_LIGHT_SCH", - "watts_per_zone_floor_area": 10.76, + "watts_per_floor_area": 10.76, "zone_or_zonelist_or_space_or_spacelist_name": "Perimeter_top_ZN_4" } }, @@ -7160,7 +7160,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7176,7 +7176,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7192,7 +7192,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7208,7 +7208,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7224,7 +7224,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7240,7 +7240,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7256,7 +7256,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7272,7 +7272,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7288,7 +7288,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7304,7 +7304,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7320,7 +7320,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7336,7 +7336,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7352,7 +7352,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7368,7 +7368,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", @@ -7384,7 +7384,7 @@ "clothing_insulation_schedule_name": "CLOTHING_SCH", "enable_ashrae_55_comfort_warnings": "No", "fraction_radiant": 0.3, - "mean_radiant_temperature_calculation_type": "ZoneAveraged", + "mean_radiant_temperature_calculation_type": "EnclosureAveraged", "number_of_people_calculation_method": "Area/Person", "number_of_people_schedule_name": "BLDG_OCC_SCH", "sensible_heat_fraction": "Autocalculate", From 557908feb3d839da3306af7a604726886fa21c5c Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Wed, 27 Sep 2023 15:31:06 -0500 Subject: [PATCH 09/26] People MRTCalcType getEnumValue --- src/EnergyPlus/DataHeatBalance.hh | 3 + src/EnergyPlus/InternalHeatGains.cc | 92 ++++++++++++++--------------- 2 files changed, 48 insertions(+), 47 deletions(-) diff --git a/src/EnergyPlus/DataHeatBalance.hh b/src/EnergyPlus/DataHeatBalance.hh index 07d251d2ea5..c452e7e322a 100644 --- a/src/EnergyPlus/DataHeatBalance.hh +++ b/src/EnergyPlus/DataHeatBalance.hh @@ -281,6 +281,9 @@ namespace DataHeatBalance { Num }; + static constexpr std::array(DataHeatBalance::CalcMRT::Num)> CalcMRTTypeNamesUC = { + "ENCLOSUREAVERAGED", "SURFACEWEIGHTED", "ANGLEFACTOR"}; + static constexpr std::array(DataHeatBalance::AirBalance::Num)> AirBalanceTypeNamesUC = {"NONE", "QUADRATURE"}; static constexpr std::array(DataHeatBalance::InfiltrationFlow::Num)> InfiltrationFlowTypeNamesUC = { diff --git a/src/EnergyPlus/InternalHeatGains.cc b/src/EnergyPlus/InternalHeatGains.cc index 8fc2ddb9de5..b53b4d53d30 100644 --- a/src/EnergyPlus/InternalHeatGains.cc +++ b/src/EnergyPlus/InternalHeatGains.cc @@ -77,6 +77,7 @@ #include #include #include +#include #include #include #include @@ -740,66 +741,63 @@ namespace InternalHeatGains { thisPeople.CoolingEffectASH55 || thisPeople.AnkleDraftASH55; // MRT Calculation Type and Surface Name - { - std::string const &mrtType = IHGAlphas(7); - - if (mrtType == "ENCLOSUREAVERAGED") { - thisPeople.MRTCalcType = DataHeatBalance::CalcMRT::EnclosureAveraged; - - } else if (mrtType == "SURFACEWEIGHTED") { - thisPeople.MRTCalcType = DataHeatBalance::CalcMRT::SurfaceWeighted; - thisPeople.SurfacePtr = UtilityRoutines::FindItemInList(IHGAlphas(8), state.dataSurface->Surface); - if (thisPeople.SurfacePtr == 0 && ModelWithAdditionalInputs) { - if (Item1 == 1) { - ShowSevereError(state, - format("{}{}=\"{}\", {}={} invalid Surface Name={}", - RoutineName, - peopleModuleObject, - IHGAlphas(1), - IHGAlphaFieldNames(7), - IHGAlphas(7), - IHGAlphas(8))); - ErrorsFound = true; - } - } else if (state.dataSurface->Surface(thisPeople.SurfacePtr).Zone != thisPeople.ZonePtr && - ModelWithAdditionalInputs) { + thisPeople.MRTCalcType = static_cast(getEnumValue(CalcMRTTypeNamesUC, IHGAlphas(7))); + + switch (thisPeople.MRTCalcType) { + case DataHeatBalance::CalcMRT::EnclosureAveraged: { + // nothing to do here + } break; + case DataHeatBalance::CalcMRT::SurfaceWeighted: { + thisPeople.SurfacePtr = UtilityRoutines::FindItemInList(IHGAlphas(8), state.dataSurface->Surface); + if (thisPeople.SurfacePtr == 0 && ModelWithAdditionalInputs) { + if (Item1 == 1) { + ShowSevereError(state, + format("{}{}=\"{}\", {}={} invalid Surface Name={}", + RoutineName, + peopleModuleObject, + IHGAlphas(1), + IHGAlphaFieldNames(7), + IHGAlphas(7), + IHGAlphas(8))); + ErrorsFound = true; + } + } else { + int const surfRadEnclNum = state.dataSurface->Surface(thisPeople.SurfacePtr).RadEnclIndex; + int const thisPeopleRadEnclNum = state.dataHeatBal->space(thisPeople.spaceIndex).radiantEnclosureNum; + if (surfRadEnclNum != thisPeopleRadEnclNum && ModelWithAdditionalInputs) { ShowSevereError(state, - format("{}{}=\"{}\", Surface referenced in {}={} in different zone.", + format("{}{}=\"{}\", Surface referenced in {}={} in different enclosure.", RoutineName, peopleModuleObject, IHGAlphas(1), IHGAlphaFieldNames(7), IHGAlphas(7))); ShowContinueError(state, - format("Surface is in Zone={} and {} is in Zone={}", - state.dataHeatBal->Zone(state.dataSurface->Surface(thisPeople.SurfacePtr).Zone).Name, + format("Surface is in Enclosure={} and {} is in Enclosure={}", + state.dataViewFactor->EnclRadInfo(surfRadEnclNum).Name, peopleModuleObject, - IHGAlphas(2))); + state.dataViewFactor->EnclRadInfo(thisPeopleRadEnclNum).Name)); ErrorsFound = true; } + } - } else if (mrtType == "ANGLEFACTOR") { - thisPeople.MRTCalcType = DataHeatBalance::CalcMRT::AngleFactor; - thisPeople.AngleFactorListName = IHGAlphas(8); - - } else if (mrtType == "") { // Blank input field--just ignore this - if (Item1 == 1 && ModelWithAdditionalInputs) - ShowWarningError( - state, - format("{}{}=\"{}\", blank {}", RoutineName, peopleModuleObject, IHGAlphas(1), IHGAlphaFieldNames(7))); + } break; + case DataHeatBalance::CalcMRT::AngleFactor: { + thisPeople.AngleFactorListName = IHGAlphas(8); - } else { // An invalid keyword was entered--warn but ignore - if (Item1 == 1 && ModelWithAdditionalInputs) { - ShowWarningError(state, - format("{}{}=\"{}\", invalid {}={}", - RoutineName, - peopleModuleObject, - IHGAlphas(1), - IHGAlphaFieldNames(7), - IHGAlphas(7))); - ShowContinueError(state, "...Valid values are \"EnclosureAveraged\", \"SurfaceWeighted\", \"AngleFactor\"."); - } + } break; + default: { // An invalid keyword was entered--warn but ignore + if (Item1 == 1 && ModelWithAdditionalInputs) { + ShowWarningError(state, + format("{}{}=\"{}\", invalid {}={}", + RoutineName, + peopleModuleObject, + IHGAlphas(1), + IHGAlphaFieldNames(7), + IHGAlphas(7))); + ShowContinueError(state, "...Valid values are \"EnclosureAveraged\", \"SurfaceWeighted\", \"AngleFactor\"."); } + } break; } if (!IHGAlphaFieldBlanks(9)) { From d48a92f3048ba94cb90257f344e01b9dfc492c0f Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Fri, 29 Sep 2023 14:53:24 -0500 Subject: [PATCH 10/26] Add enclosure MRT --- src/EnergyPlus/DataViewFactorInformation.hh | 4 ++ src/EnergyPlus/HeatBalanceManager.cc | 9 +++ src/EnergyPlus/HeatBalanceSurfaceManager.cc | 68 +++++++++++++++---- src/EnergyPlus/SurfaceGeometry.cc | 2 + .../unit/HeatBalanceSurfaceManager.unit.cc | 3 +- 5 files changed, 73 insertions(+), 13 deletions(-) diff --git a/src/EnergyPlus/DataViewFactorInformation.hh b/src/EnergyPlus/DataViewFactorInformation.hh index 1a21ac485d7..e5853e9cc14 100644 --- a/src/EnergyPlus/DataViewFactorInformation.hh +++ b/src/EnergyPlus/DataViewFactorInformation.hh @@ -90,6 +90,10 @@ namespace DataViewFactorInformation { bool solAbsFirstCalc = true; // for error message bool radReCalc = false; // Enclosure solar or thermal radiation properties need recalc due to window/shading status change or envelope EMS // actuators present + Real64 sumAE = 0.0; // Sum of surface area * emissivity for all surfaces in the enclosure + Real64 sumAET = 0.0; // Sum of surface area * emissivity * temperature for all surfaces in the enclosure + Real64 MRT = 0.0; // Mean radiant temperature of the enclosure + bool reCalcMRT = false; // True when MRT needs to be recalculated }; } // namespace DataViewFactorInformation diff --git a/src/EnergyPlus/HeatBalanceManager.cc b/src/EnergyPlus/HeatBalanceManager.cc index 7084c0d22b6..19e4050dfd0 100644 --- a/src/EnergyPlus/HeatBalanceManager.cc +++ b/src/EnergyPlus/HeatBalanceManager.cc @@ -3110,6 +3110,15 @@ namespace HeatBalanceManager { OutputProcessor::SOVStoreType::State, state.dataHeatBal->Zone(loop).Name); } + for (auto &thisEnclosure : state.dataViewFactor->EnclRadInfo) { + SetupOutputVariable(state, + "Enclosure Mean Radiant Temperature", + OutputProcessor::Unit::C, + thisEnclosure.MRT, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::State, + thisEnclosure.Name); + } } // End Initialization Section of the Module diff --git a/src/EnergyPlus/HeatBalanceSurfaceManager.cc b/src/EnergyPlus/HeatBalanceSurfaceManager.cc index ba96b711f0e..7a88db38c24 100644 --- a/src/EnergyPlus/HeatBalanceSurfaceManager.cc +++ b/src/EnergyPlus/HeatBalanceSurfaceManager.cc @@ -5448,7 +5448,7 @@ void CalculateZoneMRT(EnergyPlusData &state, // DATE WRITTEN November 2000 // PURPOSE OF THIS SUBROUTINE: - // Calculates the current zone MRT for thermal comfort and radiation + // Calculates the current zone and enclosure MRT for thermal comfort and radiation // calculation purposes. if (state.dataHeatBalSurfMgr->CalculateZoneMRTfirstTime) { @@ -5463,28 +5463,72 @@ void CalculateZoneMRT(EnergyPlusData &state, surface.Area * state.dataConstruction->Construct(surface.Construction).InsideAbsorpThermal; int ZoneNum = surface.Zone; if (ZoneNum > 0) state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum) += state.dataHeatBalSurfMgr->SurfaceAE(SurfNum); + if (surface.RadEnclIndex > 0) + state.dataViewFactor->EnclRadInfo(surface.RadEnclIndex).sumAE += state.dataHeatBalSurfMgr->SurfaceAE(SurfNum); } } } + // Zero sumAET for applicable enclosures + if (present(ZoneToResimulate)) { + for (int spaceNum : state.dataHeatBal->Zone(ZoneToResimulate).spaceIndexes) { + int enclNum = state.dataHeatBal->space(spaceNum).radiantEnclosureNum; + state.dataViewFactor->EnclRadInfo(enclNum).sumAET = 0.0; + state.dataViewFactor->EnclRadInfo(enclNum).reCalcMRT = true; + } + } else { + for (auto &thisEnclosure : state.dataViewFactor->EnclRadInfo) { + thisEnclosure.sumAET = 0.0; + thisEnclosure.reCalcMRT = true; + } + } for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { if (present(ZoneToResimulate) && (ZoneNum != ZoneToResimulate)) continue; - Real64 SumAET = 0.0; + Real64 zoneSumAET = 0.0; for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) { auto const &thisSpace = state.dataHeatBal->space(spaceNum); for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { - SumAET += state.dataHeatBalSurfMgr->SurfaceAE(SurfNum) * state.dataHeatBalSurf->SurfTempIn(SurfNum); + Real64 surfAET = state.dataHeatBalSurfMgr->SurfaceAE(SurfNum) * state.dataHeatBalSurf->SurfTempIn(SurfNum); + zoneSumAET += surfAET; + state.dataViewFactor->EnclRadInfo(state.dataSurface->Surface(SurfNum).RadEnclIndex).sumAET += surfAET; } - if (state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum) > 0.01) { - state.dataHeatBal->ZoneMRT(ZoneNum) = SumAET / state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum); + } + if (state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum) > 0.01) { + state.dataHeatBal->ZoneMRT(ZoneNum) = zoneSumAET / state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum); + } else { + if (state.dataHeatBalSurfMgr->CalculateZoneMRTfirstTime) { + ShowWarningError( + state, + format("Zone areas*inside surface emissivities are summing to zero, for Zone=\"{}\"", state.dataHeatBal->Zone(ZoneNum).Name)); + ShowContinueError(state, "As a result, MRT will be set to MAT for that zone"); + } + state.dataHeatBal->ZoneMRT(ZoneNum) = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT; + } + } + // Calculate MRT for applicable enclosures + for (auto &thisEnclosure : state.dataViewFactor->EnclRadInfo) { + if (!thisEnclosure.reCalcMRT) continue; + if (thisEnclosure.sumAE > 0.01) { + thisEnclosure.MRT = thisEnclosure.sumAET / thisEnclosure.sumAE; + } else { + if (state.dataHeatBalSurfMgr->CalculateZoneMRTfirstTime) { + ShowWarningError(state, + format("Enclosure areas*inside surface emissivities are summing to zero, for Enclosure=\"{}\"", thisEnclosure.Name)); + ShowContinueError(state, "As a result, MRT will be set to the volume weighted average MAT for that enclosure"); + } + Real64 sumMATVol = 0.0; + Real64 sumVol = 0.0; + Real64 sumMAT = 0.0; + for (auto &spaceNum : thisEnclosure.spaceNums) { + Real64 spaceVolume = state.dataHeatBal->space(spaceNum).Volume; + sumVol += spaceVolume; + sumMATVol += state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).MAT * spaceVolume; + sumMAT += state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).MAT; + } + if (sumVol > 0.01) { + thisEnclosure.MRT = sumMATVol / sumVol; } else { - if (state.dataHeatBalSurfMgr->CalculateZoneMRTfirstTime) { - ShowWarningError( - state, - format("Zone areas*inside surface emissivities are summing to zero, for Zone=\"{}\"", state.dataHeatBal->Zone(ZoneNum).Name)); - ShowContinueError(state, "As a result, MRT will be set to MAT for that zone"); - } - state.dataHeatBal->ZoneMRT(ZoneNum) = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT; + thisEnclosure.MRT = sumMAT / (int)thisEnclosure.spaceNums.size(); } } } diff --git a/src/EnergyPlus/SurfaceGeometry.cc b/src/EnergyPlus/SurfaceGeometry.cc index b7f9d491d0d..26619de54bd 100644 --- a/src/EnergyPlus/SurfaceGeometry.cc +++ b/src/EnergyPlus/SurfaceGeometry.cc @@ -15655,8 +15655,10 @@ namespace SurfaceGeometry { } if (radiantSetup) { assert(state.dataViewFactor->NumOfRadiantEnclosures <= int(Enclosures.size())); + Enclosures.resize(state.dataViewFactor->NumOfRadiantEnclosures); } else { assert(state.dataViewFactor->NumOfSolarEnclosures <= int(Enclosures.size())); + Enclosures.resize(state.dataViewFactor->NumOfSolarEnclosures); } // TODO MJW: For now, set the max and min enclosure numbers for each zone to be used in CalcInteriorRadExchange with ZoneToResimulate diff --git a/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc b/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc index c7aa7b44c56..49be281b3fd 100644 --- a/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc +++ b/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc @@ -745,7 +745,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceSurfaceManager_TestSurfTempCalcHeatBalanceI state->dataSurfaceGeometry->CosBldgRotAppGonly = 1.0; state->dataSurfaceGeometry->SinBldgRotAppGonly = 0.0; - SurfaceGeometry::GetSurfaceData(*state, ErrorsFound); + SurfaceGeometry::SetupZoneGeometry(*state, ErrorsFound); EXPECT_FALSE(ErrorsFound); state->dataZoneEquip->ZoneEquipConfig.allocate(1); @@ -819,6 +819,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceSurfaceManager_TestSurfTempCalcHeatBalanceI state->dataSurface->SurfTAirRef(3) = DataSurfaces::RefAirTemp::ZoneSupplyAirTemp; // with supply air + HeatBalanceIntRadExchange::InitSolarViewFactors(*state); CalcHeatBalanceInsideSurf(*state); EXPECT_EQ(24.0, state->dataHeatBal->SurfTempEffBulkAir(1)); EXPECT_EQ(23.0, state->dataHeatBal->SurfTempEffBulkAir(2)); From 10a564dc9c43b0ed8a6691e68425630081410fd8 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Fri, 29 Sep 2023 15:37:16 -0500 Subject: [PATCH 11/26] Use enclosureMRT for thermal comfort --- src/EnergyPlus/ThermalComfort.cc | 24 +++++++++++++--------- src/EnergyPlus/ThermalComfort.hh | 2 +- tst/EnergyPlus/unit/ThermalComfort.unit.cc | 9 ++++++++ 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/EnergyPlus/ThermalComfort.cc b/src/EnergyPlus/ThermalComfort.cc index 1de6450e821..eebf7266eb0 100644 --- a/src/EnergyPlus/ThermalComfort.cc +++ b/src/EnergyPlus/ThermalComfort.cc @@ -170,6 +170,7 @@ namespace ThermalComfort { CurrentGroupName = state.dataHeatBal->People(Loop).Name; // CurrentModuleObject='People' + // MJW MRT ToDo: Rename most Zone Therml Comfort output varibles to People Thermal Comfort ('cause they're keyed by People name) if (state.dataHeatBal->People(Loop).Fanger) { SetupOutputVariable(state, "Zone Thermal Comfort Fanger Model PMV", @@ -1979,11 +1980,10 @@ namespace ThermalComfort { routineName, cCurrentModuleObject, thisAngFacList.Name)); - ShowContinueError( - state, - format("... Surface=\"{}\" is in enclosure=\"{}\"", - state.dataSurface->Surface(thisAngFacList.SurfacePtr(1)).Name, - state.dataViewFactor->EnclRadInfo(state.dataSurface->Surface(thisAngFacList.SurfacePtr(1)).RadEnclIndex).Name)); + ShowContinueError(state, + format("... Surface=\"{}\" is in enclosure=\"{}\"", + state.dataSurface->Surface(thisAngFacList.SurfacePtr(1)).Name, + state.dataViewFactor->EnclRadInfo(thisAngFacList.EnclosurePtr).Name)); ShowContinueError(state, format("... Surface=\"{}\" is in enclosure=\"{}\"", thisSurf.Name, @@ -2188,7 +2188,7 @@ namespace ThermalComfort { return std::exp(18.6686 - 4030.183 / (Temp + 235.0)); } - Real64 CalcRadTemp(EnergyPlusData &state, int const PeopleListNum) // Type of MRT calculation (zone averaged or surface weighted) + Real64 CalcRadTemp(EnergyPlusData &state, int const PeopleListNum) { // FUNCTION INFORMATION: @@ -2226,21 +2226,24 @@ namespace ThermalComfort { Real64 constexpr AreaEff = 1.8; // Effective area of a "standard" person in meters squared Real64 constexpr StefanBoltzmannConst = 5.6697e-8; // Stefan-Boltzmann constant in W/(m2*K4) - switch (state.dataHeatBal->People(PeopleListNum).MRTCalcType) { + auto &thisPeople = state.dataHeatBal->People(PeopleListNum); + switch (thisPeople.MRTCalcType) { case DataHeatBalance::CalcMRT::EnclosureAveraged: { - state.dataThermalComforts->RadTemp = state.dataHeatBal->ZoneMRT(state.dataThermalComforts->ZoneNum); + int enclNum = state.dataHeatBal->space(thisPeople.spaceIndex).radiantEnclosureNum; + state.dataThermalComforts->RadTemp = state.dataViewFactor->EnclRadInfo(enclNum).MRT; } break; case DataHeatBalance::CalcMRT::SurfaceWeighted: { - state.dataThermalComforts->RadTemp = CalcSurfaceWeightedMRT(state, state.dataHeatBal->People(PeopleListNum).SurfacePtr); + state.dataThermalComforts->RadTemp = CalcSurfaceWeightedMRT(state, thisPeople.SurfacePtr); } break; case DataHeatBalance::CalcMRT::AngleFactor: { - state.dataThermalComforts->RadTemp = CalcAngleFactorMRT(state, state.dataHeatBal->People(PeopleListNum).AngleFactorListPtr); + state.dataThermalComforts->RadTemp = CalcAngleFactorMRT(state, thisPeople.AngleFactorListPtr); } break; default: break; } // If high temperature radiant heater present and on, then must account for this in MRT calculation + // MJW MRT ToDo: Think about what happens here - at a minimum, set a flag to skip this if there isn't any radiant HVAC state.dataHeatBalFanSys->ZoneQdotRadHVACToPerson(state.dataThermalComforts->ZoneNum) = state.dataHeatBalFanSys->ZoneQHTRadSysToPerson(state.dataThermalComforts->ZoneNum) + state.dataHeatBalFanSys->ZoneQCoolingPanelToPerson(state.dataThermalComforts->ZoneNum) + @@ -2303,6 +2306,7 @@ namespace ThermalComfort { } } // loop through the zones and determine if in simple ashrae 55 comfort regions + // MJW MRT ToDo: Extend ASHRAE 55 to spaces? for (iZone = 1; iZone <= state.dataGlobal->NumOfZones; ++iZone) { if (state.dataThermalComforts->ThermalComfortInASH55(iZone).ZoneIsOccupied) { auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(iZone); diff --git a/src/EnergyPlus/ThermalComfort.hh b/src/EnergyPlus/ThermalComfort.hh index e43575e40e3..cf91b22bf7a 100644 --- a/src/EnergyPlus/ThermalComfort.hh +++ b/src/EnergyPlus/ThermalComfort.hh @@ -219,7 +219,7 @@ namespace ThermalComfort { Real64 CalcSatVapPressFromTempTorr(Real64 const Temp); - Real64 CalcRadTemp(EnergyPlusData &state, int const PeopleListNum); // Type of MRT calculation (zone averaged or surface weighted) + Real64 CalcRadTemp(EnergyPlusData &state, int const PeopleListNum); void CalcThermalComfortSimpleASH55(EnergyPlusData &state); diff --git a/tst/EnergyPlus/unit/ThermalComfort.unit.cc b/tst/EnergyPlus/unit/ThermalComfort.unit.cc index b8dc82e68d5..83782d983b0 100644 --- a/tst/EnergyPlus/unit/ThermalComfort.unit.cc +++ b/tst/EnergyPlus/unit/ThermalComfort.unit.cc @@ -724,6 +724,7 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcThermalComfortFanger) state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAVComf = 25.0; state->dataHeatBal->ZoneMRT(1) = 26.0; + state->dataViewFactor->EnclRadInfo(1).MRT = 26.0; state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).airHumRatAvgComf = 0.00529; // 0.002 to 0.006 CalcThermalComfortFanger(*state); @@ -733,6 +734,7 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcThermalComfortFanger) state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAVComf = 26.0; state->dataHeatBal->ZoneMRT(1) = 27.0; + state->dataViewFactor->EnclRadInfo(1).MRT = 27.0; state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).airHumRatAvgComf = 0.00529; // 0.002 to 0.006 CalcThermalComfortFanger(*state); @@ -742,6 +744,7 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcThermalComfortFanger) state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAVComf = 27.0; state->dataHeatBal->ZoneMRT(1) = 28.0; + state->dataViewFactor->EnclRadInfo(1).MRT = 28.0; state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).airHumRatAvgComf = 0.00529; // 0.002 to 0.006 CalcThermalComfortFanger(*state); @@ -751,6 +754,7 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcThermalComfortFanger) state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAVComf = 25.0; state->dataHeatBal->ZoneMRT(1) = 26.0; + state->dataViewFactor->EnclRadInfo(1).MRT = 26.0; state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).airHumRatAvgComf = 0.00629; // 0.002 to 0.006 CalcThermalComfortFanger(*state); @@ -1008,6 +1012,10 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcThermalComfortASH55) state->dataHeatBal->People(1).Show55Warning = true; state->dataHeatBal->People(1).Pierce = true; state->dataHeatBal->People(1).MRTCalcType = DataHeatBalance::CalcMRT::EnclosureAveraged; + state->dataHeatBal->People(1).spaceIndex = 1; + state->dataHeatBal->space.allocate(1); + state->dataHeatBal->space(1).radiantEnclosureNum = 1; + state->dataViewFactor->EnclRadInfo.allocate(1); state->dataHeatBal->People(1).WorkEffPtr = 0; state->dataHeatBal->People(1).clothingType = ClothingType::InsulationSchedule; @@ -1052,6 +1060,7 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcThermalComfortASH55) state->dataZoneTempPredictorCorrector->zoneHeatBalance.allocate(state->dataGlobal->NumOfZones); state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAVComf = AirTemp; state->dataHeatBal->ZoneMRT(1) = RadTemp; + state->dataViewFactor->EnclRadInfo(1).MRT = RadTemp; state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).airHumRatAvgComf = Psychrometrics::PsyWFnTdbRhPb( *state, state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAVComf, RelHum, state->dataEnvrn->OutBaroPress); state->dataScheduleMgr->Schedule(1).CurrentValue = ActMet * BodySurfaceArea * ThermalComfort::ActLevelConv; From 7ee07cb27071301fcbd4bd01b60aaa1839244da7 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Mon, 2 Oct 2023 09:33:10 -0500 Subject: [PATCH 12/26] Setup enclosures earlier --- src/EnergyPlus/HeatBalanceManager.cc | 3 +++ .../unit/HeatBalanceAirManager.unit.cc | 26 +++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/EnergyPlus/HeatBalanceManager.cc b/src/EnergyPlus/HeatBalanceManager.cc index 19e4050dfd0..127a5019869 100644 --- a/src/EnergyPlus/HeatBalanceManager.cc +++ b/src/EnergyPlus/HeatBalanceManager.cc @@ -310,6 +310,9 @@ namespace HeatBalanceManager { ShowFatalError(state, "Errors found in Building Input, Program Stopped"); } + // Set up enclosures before processing internal gains input + HeatBalanceIntRadExchange::InitSolarViewFactors(state); + // following is done to "get internal heat gains" input so that lights are gotten before // daylighting input ManageInternalHeatGains(state, true); diff --git a/tst/EnergyPlus/unit/HeatBalanceAirManager.unit.cc b/tst/EnergyPlus/unit/HeatBalanceAirManager.unit.cc index e502500004b..3ef0a3e3ebd 100644 --- a/tst/EnergyPlus/unit/HeatBalanceAirManager.unit.cc +++ b/tst/EnergyPlus/unit/HeatBalanceAirManager.unit.cc @@ -373,7 +373,18 @@ TEST_F(EnergyPlusFixture, HeatBalanceAirManager_GetInfiltrationAndVentilation) std::string const error_string = delimited_string( {" ** Warning ** GetSurfaceData: Entered Space Floor Area(s) differ more than 5% from calculated Space Floor Area(s).", " ** ~~~ ** ...use Output:Diagnostics,DisplayExtraWarnings; to show more details on individual Spaces.", - " ** Warning ** CalculateZoneVolume: 1 zone is not fully enclosed. For more details use: Output:Diagnostics,DisplayExtrawarnings; "}); + " ** Warning ** CalculateZoneVolume: 1 zone is not fully enclosed. For more details use: Output:Diagnostics,DisplayExtrawarnings; ", + " ** Warning ** CalcApproximateViewFactors: Zero area for all other zone surfaces.", + " ** ~~~ ** Happens for Surface=\"DUMMY SPACE 1A FLOOR\" in Zone=ZONE 1", + " ** Warning ** CalcApproximateViewFactors: Zero area for all other zone surfaces.", + " ** ~~~ ** Happens for Surface=\"DUMMY SPACE 1B FLOOR\" in Zone=ZONE 1", + " ** Warning ** Surfaces in Zone/Enclosure=\"ZONE 1\" do not define an enclosure.", + " ** ~~~ ** Number of surfaces <= 3, view factors are set to force reciprocity but may not fulfill completeness.", + " ** ~~~ ** Reciprocity means that radiant exchange between two surfaces will match and not lead to an energy loss.", + " ** ~~~ ** Completeness means that all of the view factors between a surface and the other surfaces in a zone add up to unity.", + " ** ~~~ ** So, when there are three or less surfaces in a zone, EnergyPlus will make sure there are no losses of energy but", + " ** ~~~ ** it will not exchange the full amount of radiation with the rest of the zone as it would if there was a completed " + "enclosure."}); compare_err_stream(error_string, true); EXPECT_FALSE(ErrorsFound); @@ -749,7 +760,18 @@ TEST_F(EnergyPlusFixture, HeatBalanceAirManager_GetMixingAndCrossMixing) std::string const error_string = delimited_string( {" ** Warning ** GetSurfaceData: Entered Space Floor Area(s) differ more than 5% from calculated Space Floor Area(s).", " ** ~~~ ** ...use Output:Diagnostics,DisplayExtraWarnings; to show more details on individual Spaces.", - " ** Warning ** CalculateZoneVolume: 1 zone is not fully enclosed. For more details use: Output:Diagnostics,DisplayExtrawarnings; "}); + " ** Warning ** CalculateZoneVolume: 1 zone is not fully enclosed. For more details use: Output:Diagnostics,DisplayExtrawarnings; ", + " ** Warning ** CalcApproximateViewFactors: Zero area for all other zone surfaces.", + " ** ~~~ ** Happens for Surface=\"DUMMY SPACE 1A FLOOR\" in Zone=ZONE 1", + " ** Warning ** CalcApproximateViewFactors: Zero area for all other zone surfaces.", + " ** ~~~ ** Happens for Surface=\"DUMMY SPACE 1B FLOOR\" in Zone=ZONE 1", + " ** Warning ** Surfaces in Zone/Enclosure=\"ZONE 1\" do not define an enclosure.", + " ** ~~~ ** Number of surfaces <= 3, view factors are set to force reciprocity but may not fulfill completeness.", + " ** ~~~ ** Reciprocity means that radiant exchange between two surfaces will match and not lead to an energy loss.", + " ** ~~~ ** Completeness means that all of the view factors between a surface and the other surfaces in a zone add up to unity.", + " ** ~~~ ** So, when there are three or less surfaces in a zone, EnergyPlus will make sure there are no losses of energy but", + " ** ~~~ ** it will not exchange the full amount of radiation with the rest of the zone as it would if there was a completed " + "enclosure."}); compare_err_stream(error_string, true); EXPECT_FALSE(ErrorsFound); From 4f6f7fe6de2c7c6f24e76c71e7a148edfa9803c3 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Mon, 2 Oct 2023 09:51:41 -0500 Subject: [PATCH 13/26] MRT calc refinement --- src/EnergyPlus/HeatBalanceSurfaceManager.cc | 24 ++++++++++++--------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/EnergyPlus/HeatBalanceSurfaceManager.cc b/src/EnergyPlus/HeatBalanceSurfaceManager.cc index 7a88db38c24..850af157053 100644 --- a/src/EnergyPlus/HeatBalanceSurfaceManager.cc +++ b/src/EnergyPlus/HeatBalanceSurfaceManager.cc @@ -5478,22 +5478,21 @@ void CalculateZoneMRT(EnergyPlusData &state, } } else { for (auto &thisEnclosure : state.dataViewFactor->EnclRadInfo) { - thisEnclosure.sumAET = 0.0; thisEnclosure.reCalcMRT = true; } } for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { if (present(ZoneToResimulate) && (ZoneNum != ZoneToResimulate)) continue; - Real64 zoneSumAET = 0.0; - for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) { - auto const &thisSpace = state.dataHeatBal->space(spaceNum); - for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { - Real64 surfAET = state.dataHeatBalSurfMgr->SurfaceAE(SurfNum) * state.dataHeatBalSurf->SurfTempIn(SurfNum); - zoneSumAET += surfAET; - state.dataViewFactor->EnclRadInfo(state.dataSurface->Surface(SurfNum).RadEnclIndex).sumAET += surfAET; - } - } if (state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum) > 0.01) { + Real64 zoneSumAET = 0.0; + for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) { + auto const &thisSpace = state.dataHeatBal->space(spaceNum); + for (int SurfNum = thisSpace.HTSurfaceFirst; SurfNum <= thisSpace.HTSurfaceLast; ++SurfNum) { + Real64 surfAET = state.dataHeatBalSurfMgr->SurfaceAE(SurfNum) * state.dataHeatBalSurf->SurfTempIn(SurfNum); + zoneSumAET += surfAET; + state.dataViewFactor->EnclRadInfo(state.dataSurface->Surface(SurfNum).RadEnclIndex).sumAET += surfAET; + } + } state.dataHeatBal->ZoneMRT(ZoneNum) = zoneSumAET / state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum); } else { if (state.dataHeatBalSurfMgr->CalculateZoneMRTfirstTime) { @@ -5509,6 +5508,11 @@ void CalculateZoneMRT(EnergyPlusData &state, for (auto &thisEnclosure : state.dataViewFactor->EnclRadInfo) { if (!thisEnclosure.reCalcMRT) continue; if (thisEnclosure.sumAE > 0.01) { + thisEnclosure.sumAET = 0.0; + for (int surfNum : thisEnclosure.SurfacePtr) { + Real64 surfAET = state.dataHeatBalSurfMgr->SurfaceAE(surfNum) * state.dataHeatBalSurf->SurfTempIn(surfNum); + thisEnclosure.sumAET += surfAET; + } thisEnclosure.MRT = thisEnclosure.sumAET / thisEnclosure.sumAE; } else { if (state.dataHeatBalSurfMgr->CalculateZoneMRTfirstTime) { From 9e42b8da709346544d04b11dea10d0440a906377 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Mon, 2 Oct 2023 14:06:37 -0500 Subject: [PATCH 14/26] Setup enclosures earlier --- src/EnergyPlus/HeatBalanceManager.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/EnergyPlus/HeatBalanceManager.cc b/src/EnergyPlus/HeatBalanceManager.cc index 127a5019869..1c8d3aa17a1 100644 --- a/src/EnergyPlus/HeatBalanceManager.cc +++ b/src/EnergyPlus/HeatBalanceManager.cc @@ -169,7 +169,6 @@ namespace HeatBalanceManager { if (state.dataHeatBalMgr->ManageHeatBalanceGetInputFlag) { GetHeatBalanceInput(state); // Obtains heat balance related parameters from input file if (state.dataGlobal->DoingSizing) state.dataHeatBal->doSpaceHeatBalance = state.dataHeatBal->doSpaceHeatBalanceSizing; - HeatBalanceIntRadExchange::InitSolarViewFactors(state); // Surface octree setup // The surface octree holds live references to surfaces so it must be updated From ddaa321f49097aaa6af55bc20a494ad63e7704f8 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Tue, 3 Oct 2023 12:33:53 -0500 Subject: [PATCH 15/26] Use enclosureMRT for interzone windows --- src/EnergyPlus/WindowComplexManager.cc | 6 +++--- src/EnergyPlus/WindowEquivalentLayer.cc | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/EnergyPlus/WindowComplexManager.cc b/src/EnergyPlus/WindowComplexManager.cc index 56bd893d460..bbb8d505ba9 100644 --- a/src/EnergyPlus/WindowComplexManager.cc +++ b/src/EnergyPlus/WindowComplexManager.cc @@ -66,6 +66,7 @@ #include #include #include +#include #include #include #include @@ -2653,7 +2654,6 @@ namespace WindowComplexManager { int TotGlassLay; // Total number of glass layers in a construction int k; // Layer counter int SurfNumAdj; // An interzone surface's number in the adjacent zone - int ZoneNumAdj; // An interzone surface's adjacent zone number WinShadingType ShadeFlag; // Flag indicating whether shade or blind is on, and shade/blind position int IMix; @@ -2759,11 +2759,11 @@ namespace WindowComplexManager { // now get "outside" air temperature if (SurfNumAdj > 0) { // Interzone window - ZoneNumAdj = state.dataSurface->Surface(SurfNumAdj).Zone; + int enclNumAdj = state.dataSurface->Surface(SurfNumAdj).RadEnclIndex; RefAirTemp = state.dataSurface->Surface(SurfNumAdj).getInsideAirTemperature(state, SurfNumAdj); tout = RefAirTemp + Constant::KelvinConv; // outside air temperature - tsky = state.dataHeatBal->ZoneMRT(ZoneNumAdj) + + tsky = state.dataViewFactor->EnclRadInfo(enclNumAdj).MRT + Constant::KelvinConv; // TODO this misses IR from sources such as high temp radiant and baseboards // ! Add long-wave radiation from adjacent zone absorbed by glass layer closest to the adjacent zone. diff --git a/src/EnergyPlus/WindowEquivalentLayer.cc b/src/EnergyPlus/WindowEquivalentLayer.cc index 5ca82bc9ad4..fe4a2dd87ec 100644 --- a/src/EnergyPlus/WindowEquivalentLayer.cc +++ b/src/EnergyPlus/WindowEquivalentLayer.cc @@ -61,6 +61,7 @@ #include #include #include +#include #include #include #include @@ -687,7 +688,6 @@ void EQLWindowSurfaceHeatBalance(EnergyPlusData &state, int ConstrNum; // Construction number int SurfNumAdj; // An interzone surface's number in the adjacent zone - int ZoneNumAdj; // An interzone surface's adjacent zone number Real64 LWAbsIn; // effective long wave absorptance/emissivity back side Real64 LWAbsOut; // effective long wave absorptance/emissivity front side Real64 outir(0); @@ -725,10 +725,10 @@ void EQLWindowSurfaceHeatBalance(EnergyPlusData &state, if (SurfNumAdj > 0) { // this is interzone window. the outside condition is determined from the adjacent zone // condition - ZoneNumAdj = state.dataSurface->Surface(SurfNumAdj).Zone; + int enclNumAdj = state.dataSurface->Surface(SurfNumAdj).RadEnclIndex; RefAirTemp = state.dataSurface->Surface(SurfNumAdj).getInsideAirTemperature(state, SurfNumAdj); Tout = RefAirTemp + Constant::KelvinConv; // outside air temperature - tsky = state.dataHeatBal->ZoneMRT(ZoneNumAdj) + + tsky = state.dataViewFactor->EnclRadInfo(enclNumAdj).MRT + Constant::KelvinConv; // TODO this misses IR from sources such as high temp radiant and baseboards // The IR radiance of this window's "exterior" surround is the IR radiance From c56d921913c709c7aa7f2e9d23204392246fd01d Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Tue, 3 Oct 2023 13:19:31 -0500 Subject: [PATCH 16/26] Use enclosureMRT for operative temp --- src/EnergyPlus/DataHeatBalance.hh | 2 +- src/EnergyPlus/HeatBalanceAirManager.cc | 20 ++++++++++++++------ src/EnergyPlus/HeatBalanceAirManager.hh | 7 ++++++- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/EnergyPlus/DataHeatBalance.hh b/src/EnergyPlus/DataHeatBalance.hh index c452e7e322a..652cb238047 100644 --- a/src/EnergyPlus/DataHeatBalance.hh +++ b/src/EnergyPlus/DataHeatBalance.hh @@ -1398,7 +1398,7 @@ namespace DataHeatBalance { Real64 OperativeTemp = 0.0; // Average of Mean Air Temperature {C} and Mean Radiant Temperature {C} Real64 MeanAirHumRat = 0.0; // Mean Air Humidity Ratio {kg/kg} (averaged over zone time step) Real64 MeanAirDewPointTemp = 0.0; // Mean Air Dewpoint Temperature {C} - Real64 ThermOperativeTemp = 0.0; // Mix or MRT and MAT for Zone Control:Thermostatic:Operative Temperature {C} + Real64 ThermOperativeTemp = 0.0; // Mix of MRT and MAT for Zone Control:Thermostatic:Operative Temperature {C} Real64 InfilHeatGain = 0.0; // Heat Gain {J} due to infiltration Real64 InfilHeatLoss = 0.0; // Heat Loss {J} due to infiltration Real64 InfilLatentGain = 0.0; // Latent Gain {J} due to infiltration diff --git a/src/EnergyPlus/HeatBalanceAirManager.cc b/src/EnergyPlus/HeatBalanceAirManager.cc index 603b28aa862..39fd5f0fadd 100644 --- a/src/EnergyPlus/HeatBalanceAirManager.cc +++ b/src/EnergyPlus/HeatBalanceAirManager.cc @@ -62,6 +62,7 @@ #include #include #include +#include #include #include #include @@ -4910,24 +4911,31 @@ void ReportZoneMeanAirTemp(EnergyPlusData &state) for (int ZoneLoop = 1; ZoneLoop <= state.dataGlobal->NumOfZones; ++ZoneLoop) { auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneLoop); - calcMeanAirTemps(state, thisZoneHB.ZTAV, thisZoneHB.airHumRatAvg, state.dataHeatBal->ZnAirRpt(ZoneLoop), ZoneLoop); + calcMeanAirTemps( + state, thisZoneHB.ZTAV, thisZoneHB.airHumRatAvg, state.dataHeatBal->ZoneMRT(ZoneLoop), state.dataHeatBal->ZnAirRpt(ZoneLoop), ZoneLoop); if (state.dataHeatBal->doSpaceHeatBalanceSimulation) { for (int spaceNum : state.dataHeatBal->Zone(ZoneLoop).spaceIndexes) { auto &thisSpaceHB = state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum); - calcMeanAirTemps(state, thisSpaceHB.ZTAV, thisSpaceHB.airHumRatAvg, state.dataHeatBal->spaceAirRpt(spaceNum), ZoneLoop); + Real64 const thisMRT = state.dataViewFactor->EnclRadInfo(state.dataHeatBal->space(spaceNum).radiantEnclosureNum).MRT; + calcMeanAirTemps(state, thisSpaceHB.ZTAV, thisSpaceHB.airHumRatAvg, thisMRT, state.dataHeatBal->spaceAirRpt(spaceNum), ZoneLoop); } } } } -void calcMeanAirTemps(EnergyPlusData &state, Real64 ZTAV, Real64 airHumRatAvg, DataHeatBalance::AirReportVars &thisAirRpt, int zoneNum) +void calcMeanAirTemps(EnergyPlusData &state, + Real64 const ZTAV, + Real64 const airHumRatAvg, + Real64 const MRT, + DataHeatBalance::AirReportVars &thisAirRpt, + int const zoneNum) { // The mean air temperature is actually ZTAV which is the average // temperature of the air temperatures at the system time step for the // entire zone time step. thisAirRpt.MeanAirTemp = ZTAV; thisAirRpt.MeanAirHumRat = airHumRatAvg; - thisAirRpt.OperativeTemp = 0.5 * (ZTAV + state.dataHeatBal->ZoneMRT(zoneNum)); + thisAirRpt.OperativeTemp = 0.5 * (ZTAV + MRT); thisAirRpt.MeanAirDewPointTemp = Psychrometrics::PsyTdpFnWPb(state, thisAirRpt.MeanAirHumRat, state.dataEnvrn->OutBaroPress); // if operative temperature control is being used, then radiative fraction/weighting @@ -4945,8 +4953,8 @@ void calcMeanAirTemps(EnergyPlusData &state, Real64 ZTAV, Real64 airHumRatAvg, D } else { thisMRTFraction = state.dataZoneCtrls->TempControlledZone(TempControlledZoneID).FixedRadiativeFraction; } - thisAirRpt.OperativeTemp = 0.5 * (ZTAV + state.dataHeatBal->ZoneMRT(zoneNum)); - thisAirRpt.ThermOperativeTemp = (1.0 - thisMRTFraction) * ZTAV + thisMRTFraction * state.dataHeatBal->ZoneMRT(zoneNum); + thisAirRpt.OperativeTemp = 0.5 * (ZTAV + MRT); + thisAirRpt.ThermOperativeTemp = (1.0 - thisMRTFraction) * ZTAV + thisMRTFraction * MRT; } } } diff --git a/src/EnergyPlus/HeatBalanceAirManager.hh b/src/EnergyPlus/HeatBalanceAirManager.hh index 5239da0e96b..2d179492a27 100644 --- a/src/EnergyPlus/HeatBalanceAirManager.hh +++ b/src/EnergyPlus/HeatBalanceAirManager.hh @@ -84,7 +84,12 @@ namespace HeatBalanceAirManager { void ReportZoneMeanAirTemp(EnergyPlusData &state); - void calcMeanAirTemps(EnergyPlusData &state, Real64 ZTAV, Real64 airHumRatAvg, DataHeatBalance::AirReportVars &thisAirRpt, int zoneNum); + void calcMeanAirTemps(EnergyPlusData &state, + Real64 const ZTAV, + Real64 const airHumRatAvg, + Real64 const MRT, + DataHeatBalance::AirReportVars &thisAirRpt, + int const zoneNum); } // namespace HeatBalanceAirManager From f1059bd19441937d8f7d4381fbdadb937e457db8 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Tue, 3 Oct 2023 13:40:56 -0500 Subject: [PATCH 17/26] BeginEnvironment init for enclosure MRT --- src/EnergyPlus/HeatBalanceSurfaceManager.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/EnergyPlus/HeatBalanceSurfaceManager.cc b/src/EnergyPlus/HeatBalanceSurfaceManager.cc index 850af157053..cd2e1a51a60 100644 --- a/src/EnergyPlus/HeatBalanceSurfaceManager.cc +++ b/src/EnergyPlus/HeatBalanceSurfaceManager.cc @@ -2123,6 +2123,9 @@ void InitThermalAndFluxHistories(EnergyPlusData &state) thisZoneHB.airHumRat = state.dataEnvrn->OutHumRat; state.dataHeatBalFanSys->TempTstatAir(zoneNum) = DataHeatBalance::ZoneInitialTemp; } + for (auto &thisEnclosure : state.dataViewFactor->EnclRadInfo) { + thisEnclosure.MRT = DataHeatBalance::ZoneInitialTemp; + } // Reset spaceHeatBalance even if doSpaceHeatBalance is false, beause spaceHB is used to gether zoneHB in some cases for (auto &thisSpaceHB : state.dataZoneTempPredictorCorrector->spaceHeatBalance) { new (&thisSpaceHB) ZoneTempPredictorCorrector::SpaceHeatBalanceData(); From 9b9f41903298bc8b1d43ee5e5a2f870d2b2beaff Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Thu, 5 Oct 2023 12:31:05 -0500 Subject: [PATCH 18/26] Move MRT to zone/spaceHeatBalance add Space MRT output --- src/EnergyPlus/AirflowNetwork/src/Solver.cpp | 3 +- src/EnergyPlus/ChilledCeilingPanelSimple.cc | 8 +++-- src/EnergyPlus/DataHeatBalance.hh | 1 - src/EnergyPlus/ElectricPowerServiceManager.cc | 2 +- src/EnergyPlus/HeatBalanceAirManager.cc | 7 ++-- src/EnergyPlus/HeatBalanceManager.cc | 24 ------------- src/EnergyPlus/HeatBalanceSurfaceManager.cc | 10 ++++-- src/EnergyPlus/HighTempRadiantSystem.cc | 24 +++++++------ src/EnergyPlus/LowTempRadiantSystem.cc | 4 +-- src/EnergyPlus/SurfaceGeometry.cc | 10 ++++++ src/EnergyPlus/SystemAvailabilityManager.cc | 4 +-- src/EnergyPlus/ThermalComfort.cc | 6 ++-- src/EnergyPlus/VentilatedSlab.cc | 4 +-- src/EnergyPlus/ZoneTempPredictorCorrector.cc | 11 ++++-- src/EnergyPlus/ZoneTempPredictorCorrector.hh | 1 + tst/EnergyPlus/unit/AdvancedAFN.unit.cc | 5 ++- .../unit/ChilledCeilingPanelSimple.unit.cc | 3 +- .../unit/LowTempRadiantSystem.unit.cc | 24 ++++++------- .../unit/SystemAvailabilityManager.unit.cc | 18 +++++----- tst/EnergyPlus/unit/ThermalComfort.unit.cc | 34 +++++++++---------- tst/EnergyPlus/unit/WindowManager.unit.cc | 8 ++--- 21 files changed, 102 insertions(+), 109 deletions(-) diff --git a/src/EnergyPlus/AirflowNetwork/src/Solver.cpp b/src/EnergyPlus/AirflowNetwork/src/Solver.cpp index c9a335885eb..8600016ba53 100644 --- a/src/EnergyPlus/AirflowNetwork/src/Solver.cpp +++ b/src/EnergyPlus/AirflowNetwork/src/Solver.cpp @@ -12815,7 +12815,8 @@ namespace AirflowNetwork { Tcomfort = CurveValue(state, ComfortHighTempCurveNum, OutDryBulb); } ComfortBand = -0.0028 * (100 - MaxPPD) * (100 - MaxPPD) + 0.3419 * (100 - MaxPPD) - 6.6275; - Toperative = 0.5 * (state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT + state.dataHeatBal->ZoneMRT(ZoneNum)); + Toperative = 0.5 * (state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT + + state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MRT); if (Toperative > (Tcomfort + ComfortBand)) { if (opening_probability(state, ZoneNum, TimeCloseDuration)) { diff --git a/src/EnergyPlus/ChilledCeilingPanelSimple.cc b/src/EnergyPlus/ChilledCeilingPanelSimple.cc index 7a75bba6ec5..86d28d4de05 100644 --- a/src/EnergyPlus/ChilledCeilingPanelSimple.cc +++ b/src/EnergyPlus/ChilledCeilingPanelSimple.cc @@ -1223,7 +1223,8 @@ void CoolingPanelParams::CalcCoolingPanel(EnergyPlusData &state, int const Cooli CoolingPanelOn = false; } // Calculate the "zone" temperature for determining the output of the cooling panel - Real64 Tzone = Xr * state.dataHeatBal->ZoneMRT(ZoneNum) + ((1.0 - Xr) * state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT); + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); + Real64 Tzone = Xr * thisZoneHB.MRT + ((1.0 - Xr) * thisZoneHB.MAT); // Logical controls: if the WaterInletTemperature is higher than Tzone, do not run the panel if (waterInletTemp >= Tzone) CoolingPanelOn = false; @@ -1455,10 +1456,11 @@ Real64 CoolingPanelParams::getCoolingPanelControlTemp(EnergyPlusData &state, int return state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT; } break; case ClgPanelCtrlType::MRT: { - return state.dataHeatBal->ZoneMRT(ZoneNum); + return state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MRT; } break; case ClgPanelCtrlType::Operative: { - return 0.5 * (state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT + state.dataHeatBal->ZoneMRT(ZoneNum)); + return 0.5 * (state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT + + state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MRT); } break; case ClgPanelCtrlType::ODB: { return state.dataHeatBal->Zone(ZoneNum).OutDryBulbTemp; diff --git a/src/EnergyPlus/DataHeatBalance.hh b/src/EnergyPlus/DataHeatBalance.hh index 652cb238047..7dc58674e9a 100644 --- a/src/EnergyPlus/DataHeatBalance.hh +++ b/src/EnergyPlus/DataHeatBalance.hh @@ -1916,7 +1916,6 @@ struct HeatBalanceData : BaseGlobalStruct Array1D ZoneGroupSNLoadHeatRate; Array1D ZoneGroupSNLoadCoolRate; - Array1D ZoneMRT; // MEAN RADIANT TEMPERATURE (C) Array1D ZoneTransSolar; // Exterior beam plus diffuse solar entering zone sum of WinTransSolar for exterior windows in zone (W) Array1D ZoneWinHeatGain; // Heat gain to zone from all exterior windows (includes oneTransSolar); sum of WinHeatGain for exterior windows in zone (W) diff --git a/src/EnergyPlus/ElectricPowerServiceManager.cc b/src/EnergyPlus/ElectricPowerServiceManager.cc index c906efeb3d3..2e1bf462967 100644 --- a/src/EnergyPlus/ElectricPowerServiceManager.cc +++ b/src/EnergyPlus/ElectricPowerServiceManager.cc @@ -5110,7 +5110,7 @@ void ElectricTransformer::manageTransformers(EnergyPlusData &state, Real64 const Real64 ambTemp = 20.0; if (heatLossesDestination_ == ThermalLossDestination::ZoneGains) { - ambTemp = state.dataHeatBal->ZnAirRpt(zoneNum_).MeanAirTemp; + ambTemp = state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum_).MAT; } else { ambTemp = 20.0; } diff --git a/src/EnergyPlus/HeatBalanceAirManager.cc b/src/EnergyPlus/HeatBalanceAirManager.cc index 39fd5f0fadd..43582d51de2 100644 --- a/src/EnergyPlus/HeatBalanceAirManager.cc +++ b/src/EnergyPlus/HeatBalanceAirManager.cc @@ -4911,13 +4911,12 @@ void ReportZoneMeanAirTemp(EnergyPlusData &state) for (int ZoneLoop = 1; ZoneLoop <= state.dataGlobal->NumOfZones; ++ZoneLoop) { auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneLoop); - calcMeanAirTemps( - state, thisZoneHB.ZTAV, thisZoneHB.airHumRatAvg, state.dataHeatBal->ZoneMRT(ZoneLoop), state.dataHeatBal->ZnAirRpt(ZoneLoop), ZoneLoop); + calcMeanAirTemps(state, thisZoneHB.ZTAV, thisZoneHB.airHumRatAvg, thisZoneHB.MRT, state.dataHeatBal->ZnAirRpt(ZoneLoop), ZoneLoop); if (state.dataHeatBal->doSpaceHeatBalanceSimulation) { for (int spaceNum : state.dataHeatBal->Zone(ZoneLoop).spaceIndexes) { auto &thisSpaceHB = state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum); - Real64 const thisMRT = state.dataViewFactor->EnclRadInfo(state.dataHeatBal->space(spaceNum).radiantEnclosureNum).MRT; - calcMeanAirTemps(state, thisSpaceHB.ZTAV, thisSpaceHB.airHumRatAvg, thisMRT, state.dataHeatBal->spaceAirRpt(spaceNum), ZoneLoop); + calcMeanAirTemps( + state, thisSpaceHB.ZTAV, thisSpaceHB.airHumRatAvg, thisSpaceHB.MRT, state.dataHeatBal->spaceAirRpt(spaceNum), ZoneLoop); } } } diff --git a/src/EnergyPlus/HeatBalanceManager.cc b/src/EnergyPlus/HeatBalanceManager.cc index 1c8d3aa17a1..54f904522c3 100644 --- a/src/EnergyPlus/HeatBalanceManager.cc +++ b/src/EnergyPlus/HeatBalanceManager.cc @@ -2959,10 +2959,6 @@ namespace HeatBalanceManager { if (!state.dataHeatBal->ZoneIntGain.allocated()) { DataHeatBalance::AllocateIntGains(state); } - state.dataHeatBal->ZoneMRT.allocate(state.dataGlobal->NumOfZones); - for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - state.dataHeatBal->ZoneMRT(zoneNum) = 0.0; - } state.dataZoneTempPredictorCorrector->zoneHeatBalance.allocate(state.dataGlobal->NumOfZones); // Always allocate spaceHeatBalance, even if doSpaceHeatBalance is false, because it's used to gather some of the zone totals state.dataZoneTempPredictorCorrector->spaceHeatBalance.allocate(state.dataGlobal->numSpaces); @@ -3101,26 +3097,6 @@ namespace HeatBalanceManager { state.dataHeatBalFanSys->highSETLongestStartRepPeriod.allocate(state.dataGlobal->NumOfZones, state.dataWeatherManager->TotThermalReportPers); state.dataHeatBalMgr->CountWarmupDayPoints = 0; - - for (int loop = 1; loop <= state.dataGlobal->NumOfZones; ++loop) { - // CurrentModuleObject='Zone' - SetupOutputVariable(state, - "Zone Mean Radiant Temperature", - OutputProcessor::Unit::C, - state.dataHeatBal->ZoneMRT(loop), - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::State, - state.dataHeatBal->Zone(loop).Name); - } - for (auto &thisEnclosure : state.dataViewFactor->EnclRadInfo) { - SetupOutputVariable(state, - "Enclosure Mean Radiant Temperature", - OutputProcessor::Unit::C, - thisEnclosure.MRT, - OutputProcessor::SOVTimeStepType::Zone, - OutputProcessor::SOVStoreType::State, - thisEnclosure.Name); - } } // End Initialization Section of the Module diff --git a/src/EnergyPlus/HeatBalanceSurfaceManager.cc b/src/EnergyPlus/HeatBalanceSurfaceManager.cc index cd2e1a51a60..eb225bb5c5c 100644 --- a/src/EnergyPlus/HeatBalanceSurfaceManager.cc +++ b/src/EnergyPlus/HeatBalanceSurfaceManager.cc @@ -2114,7 +2114,6 @@ void InitThermalAndFluxHistories(EnergyPlusData &state) // First do the "bulk" initializations of arrays sized to NumOfZones for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { - state.dataHeatBal->ZoneMRT(zoneNum) = DataHeatBalance::ZoneInitialTemp; // module level array // TODO: Reinitializing this entire struct may cause diffs new (&state.dataZoneTempPredictorCorrector->zoneHeatBalance(zoneNum)) ZoneTempPredictorCorrector::ZoneHeatBalanceData(); // Initialize the Zone Humidity Ratio here so that it is available for EMPD implementations @@ -5486,6 +5485,7 @@ void CalculateZoneMRT(EnergyPlusData &state, } for (int ZoneNum = 1; ZoneNum <= state.dataGlobal->NumOfZones; ++ZoneNum) { if (present(ZoneToResimulate) && (ZoneNum != ZoneToResimulate)) continue; + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); if (state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum) > 0.01) { Real64 zoneSumAET = 0.0; for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) { @@ -5496,7 +5496,7 @@ void CalculateZoneMRT(EnergyPlusData &state, state.dataViewFactor->EnclRadInfo(state.dataSurface->Surface(SurfNum).RadEnclIndex).sumAET += surfAET; } } - state.dataHeatBal->ZoneMRT(ZoneNum) = zoneSumAET / state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum); + thisZoneHB.MRT = zoneSumAET / state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum); } else { if (state.dataHeatBalSurfMgr->CalculateZoneMRTfirstTime) { ShowWarningError( @@ -5504,7 +5504,7 @@ void CalculateZoneMRT(EnergyPlusData &state, format("Zone areas*inside surface emissivities are summing to zero, for Zone=\"{}\"", state.dataHeatBal->Zone(ZoneNum).Name)); ShowContinueError(state, "As a result, MRT will be set to MAT for that zone"); } - state.dataHeatBal->ZoneMRT(ZoneNum) = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT; + thisZoneHB.MRT = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT; } } // Calculate MRT for applicable enclosures @@ -5538,6 +5538,10 @@ void CalculateZoneMRT(EnergyPlusData &state, thisEnclosure.MRT = sumMAT / (int)thisEnclosure.spaceNums.size(); } } + // Set space MRTs + for (int spaceNum : thisEnclosure.spaceNums) { + state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).MRT = thisEnclosure.MRT; + } } state.dataHeatBalSurfMgr->CalculateZoneMRTfirstTime = false; diff --git a/src/EnergyPlus/HighTempRadiantSystem.cc b/src/EnergyPlus/HighTempRadiantSystem.cc index 67791180327..bfdeb3e70ac 100644 --- a/src/EnergyPlus/HighTempRadiantSystem.cc +++ b/src/EnergyPlus/HighTempRadiantSystem.cc @@ -816,19 +816,19 @@ namespace HighTempRadiantSystem { // Determine the current setpoint temperature and the temperature at which the unit should be completely off Real64 SetPtTemp = ScheduleManager::GetCurrentScheduleValue(state, thisHTR.SetptSchedPtr); Real64 OffTemp = SetPtTemp + 0.5 * thisHTR.ThrottlRange; - Real64 OpTemp = (state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT + state.dataHeatBal->ZoneMRT(ZoneNum)) / - 2.0; // Approximate the "operative" temperature + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); + Real64 OpTemp = (thisZoneHB.MAT + thisZoneHB.MRT) / 2.0; // Approximate the "operative" temperature // Determine the fraction of maximum power to the unit (limiting the fraction range from zero to unity) switch (thisHTR.ControlType) { case RadControlType::MATControl: { - HeatFrac = (OffTemp - state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT) / thisHTR.ThrottlRange; + HeatFrac = (OffTemp - thisZoneHB.MAT) / thisHTR.ThrottlRange; } break; case RadControlType::MRTControl: { - HeatFrac = (OffTemp - state.dataHeatBal->ZoneMRT(ZoneNum)) / thisHTR.ThrottlRange; + HeatFrac = (OffTemp - thisZoneHB.MRT) / thisHTR.ThrottlRange; } break; case RadControlType::OperativeControl: { - OpTemp = 0.5 * (state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT + state.dataHeatBal->ZoneMRT(ZoneNum)); + OpTemp = 0.5 * (thisZoneHB.MAT + thisZoneHB.MRT); HeatFrac = (OffTemp - OpTemp) / thisHTR.ThrottlRange; } break; default: @@ -909,15 +909,16 @@ namespace HighTempRadiantSystem { // First determine whether or not the unit should be on // Determine the proper temperature on which to control + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); switch (thisHTR.ControlType) { case RadControlType::MATSPControl: { - ZoneTemp = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT; + ZoneTemp = thisZoneHB.MAT; } break; case RadControlType::MRTSPControl: { - ZoneTemp = state.dataHeatBal->ZoneMRT(ZoneNum); + ZoneTemp = thisZoneHB.MRT; } break; case RadControlType::OperativeSPControl: { - ZoneTemp = 0.5 * (state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT + state.dataHeatBal->ZoneMRT(ZoneNum)); + ZoneTemp = 0.5 * (thisZoneHB.MAT + thisZoneHB.MRT); } break; default: { assert(false); @@ -954,15 +955,16 @@ namespace HighTempRadiantSystem { HeatBalanceSurfaceManager::CalcHeatBalanceInsideSurf(state, ZoneNum); // Redetermine the current value of the controlling temperature + auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum); switch (thisHTR.ControlType) { case RadControlType::MATControl: { - ZoneTemp = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT; + ZoneTemp = thisZoneHB.MAT; } break; case RadControlType::MRTControl: { - ZoneTemp = state.dataHeatBal->ZoneMRT(ZoneNum); + ZoneTemp = thisZoneHB.MRT; } break; case RadControlType::OperativeControl: { - ZoneTemp = 0.5 * (state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).MAT + state.dataHeatBal->ZoneMRT(ZoneNum)); + ZoneTemp = 0.5 * (thisZoneHB.MAT + thisZoneHB.MRT); } break; default: break; diff --git a/src/EnergyPlus/LowTempRadiantSystem.cc b/src/EnergyPlus/LowTempRadiantSystem.cc index 85142d6e7f0..8bc1b7cc4d1 100644 --- a/src/EnergyPlus/LowTempRadiantSystem.cc +++ b/src/EnergyPlus/LowTempRadiantSystem.cc @@ -5580,9 +5580,9 @@ namespace LowTempRadiantSystem { case LowTempRadiantControlTypes::MATControl: return thisZoneHB.MAT; case LowTempRadiantControlTypes::MRTControl: - return state.dataHeatBal->ZoneMRT(this->ZonePtr); + return thisZoneHB.MRT; case LowTempRadiantControlTypes::OperativeControl: - return 0.5 * (thisZoneHB.MAT + state.dataHeatBal->ZoneMRT(this->ZonePtr)); + return 0.5 * (thisZoneHB.MAT + thisZoneHB.MRT); case LowTempRadiantControlTypes::ODBControl: return state.dataHeatBal->Zone(this->ZonePtr).OutDryBulbTemp; case LowTempRadiantControlTypes::OWBControl: diff --git a/src/EnergyPlus/SurfaceGeometry.cc b/src/EnergyPlus/SurfaceGeometry.cc index 26619de54bd..13713f5c014 100644 --- a/src/EnergyPlus/SurfaceGeometry.cc +++ b/src/EnergyPlus/SurfaceGeometry.cc @@ -15661,6 +15661,16 @@ namespace SurfaceGeometry { Enclosures.resize(state.dataViewFactor->NumOfSolarEnclosures); } + for (auto &thisEnclosure : state.dataViewFactor->EnclRadInfo) { + SetupOutputVariable(state, + "Enclosure Mean Radiant Temperature", + OutputProcessor::Unit::C, + thisEnclosure.MRT, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::State, + thisEnclosure.Name); + } + // TODO MJW: For now, set the max and min enclosure numbers for each zone to be used in CalcInteriorRadExchange with ZoneToResimulate for (int zoneNum = 1; zoneNum <= state.dataGlobal->NumOfZones; ++zoneNum) { for (int spaceNum : state.dataHeatBal->Zone(zoneNum).spaceIndexes) { diff --git a/src/EnergyPlus/SystemAvailabilityManager.cc b/src/EnergyPlus/SystemAvailabilityManager.cc index c23e3f5c8fb..6762649723c 100644 --- a/src/EnergyPlus/SystemAvailabilityManager.cc +++ b/src/EnergyPlus/SystemAvailabilityManager.cc @@ -4744,7 +4744,7 @@ namespace SystemAvailabilityManager { } break; case HybridVentMode_OperT80: { if (state.dataThermalComforts->runningAverageASH >= 10.0 && state.dataThermalComforts->runningAverageASH <= 33.5) { - hybridVentMgr.OperativeTemp = 0.5 * (thisZoneHB.MAT + state.dataHeatBal->ZoneMRT(ZoneNum)); + hybridVentMgr.OperativeTemp = 0.5 * (thisZoneHB.MAT + thisZoneHB.MRT); minAdaTem = 0.31 * state.dataThermalComforts->runningAverageASH + 14.3; maxAdaTem = 0.31 * state.dataThermalComforts->runningAverageASH + 21.3; hybridVentMgr.minAdaTem = minAdaTem; @@ -4761,7 +4761,7 @@ namespace SystemAvailabilityManager { } break; case HybridVentMode_OperT90: { if (state.dataThermalComforts->runningAverageASH >= 10.0 && state.dataThermalComforts->runningAverageASH <= 33.5) { - hybridVentMgr.OperativeTemp = 0.5 * (thisZoneHB.MAT + state.dataHeatBal->ZoneMRT(ZoneNum)); + hybridVentMgr.OperativeTemp = 0.5 * (thisZoneHB.MAT + thisZoneHB.MRT); minAdaTem = 0.31 * state.dataThermalComforts->runningAverageASH + 15.3; maxAdaTem = 0.31 * state.dataThermalComforts->runningAverageASH + 20.3; hybridVentMgr.minAdaTem = minAdaTem; diff --git a/src/EnergyPlus/ThermalComfort.cc b/src/EnergyPlus/ThermalComfort.cc index eebf7266eb0..f1430eea7fd 100644 --- a/src/EnergyPlus/ThermalComfort.cc +++ b/src/EnergyPlus/ThermalComfort.cc @@ -2279,8 +2279,6 @@ namespace ThermalComfort { // SUBROUTINE LOCAL VARIABLE DECLARATIONS: Real64 OperTemp; - Real64 CurAirTemp; - Real64 CurMeanRadiantTemp; Real64 NumberOccupants; bool isComfortableWithSummerClothes; bool isComfortableWithWinterClothes; @@ -2312,13 +2310,13 @@ namespace ThermalComfort { auto &thisZoneHB = state.dataZoneTempPredictorCorrector->zoneHeatBalance(iZone); // keep track of occupied hours state.dataThermalComforts->ZoneOccHrs(iZone) += state.dataGlobal->TimeStepZone; - CurAirTemp = thisZoneHB.ZTAVComf; + Real64 CurAirTemp = thisZoneHB.ZTAVComf; if (state.dataRoomAir->anyNonMixingRoomAirModel) { if (state.dataRoomAir->IsZoneDispVent3Node(iZone) || state.dataRoomAir->IsZoneUFAD(iZone)) { CurAirTemp = state.dataRoomAir->TCMF(iZone); } } - CurMeanRadiantTemp = state.dataHeatBal->ZoneMRT(iZone); + Real64 CurMeanRadiantTemp = thisZoneHB.MRT; OperTemp = CurAirTemp * 0.5 + CurMeanRadiantTemp * 0.5; // for debugging // ThermalComfortInASH55(iZone)%dCurAirTemp = CurAirTemp diff --git a/src/EnergyPlus/VentilatedSlab.cc b/src/EnergyPlus/VentilatedSlab.cc index 8e7f1ae9ce6..f40e956f1c9 100644 --- a/src/EnergyPlus/VentilatedSlab.cc +++ b/src/EnergyPlus/VentilatedSlab.cc @@ -2786,11 +2786,11 @@ namespace VentilatedSlab { break; } case ControlType::MeanRadTemp: { - SetPointTemp = state.dataHeatBal->ZoneMRT(ZoneNum); + SetPointTemp = thisZoneHB.MRT; break; } case ControlType::OperativeTemp: { - SetPointTemp = 0.5 * (thisZoneHB.MAT + state.dataHeatBal->ZoneMRT(ZoneNum)); + SetPointTemp = 0.5 * (thisZoneHB.MAT + thisZoneHB.MRT); break; } case ControlType::OutdoorDryBulbTemp: { diff --git a/src/EnergyPlus/ZoneTempPredictorCorrector.cc b/src/EnergyPlus/ZoneTempPredictorCorrector.cc index d5902f1d9fa..7aa5e14e895 100644 --- a/src/EnergyPlus/ZoneTempPredictorCorrector.cc +++ b/src/EnergyPlus/ZoneTempPredictorCorrector.cc @@ -3282,6 +3282,13 @@ void ZoneSpaceHeatBalanceData::setUpOutputVars(EnergyPlusData &state, std::strin OutputProcessor::SOVTimeStepType::System, OutputProcessor::SOVStoreType::Average, name); + SetupOutputVariable(state, + format("{} Mean Radiant Temperature", prefix), + OutputProcessor::Unit::C, + this->MRT, + OutputProcessor::SOVTimeStepType::Zone, + OutputProcessor::SOVStoreType::State, + name); } void PredictSystemLoads(EnergyPlusData &state, @@ -6238,10 +6245,10 @@ void AdjustAirSetPointsforOpTempCntrl(EnergyPlusData &state, int const TempContr : tempControlledZone.FixedRadiativeFraction; // get mean radiant temperature for zone - Real64 thisMRT = state.dataHeatBal->ZoneMRT(ActualZoneNum); + Real64 thisMRT = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ActualZoneNum).MRT; // modify setpoint for operative temperature control - // traping for MRT fractions between 0.0 and 0.9 during get input, so shouldn't be able to divide by zero here. + // trapping for MRT fractions between 0.0 and 0.9 during get input, so shouldn't be able to divide by zero here. ZoneAirSetPoint = (ZoneAirSetPoint - thisMRTFraction * thisMRT) / (1.0 - thisMRTFraction); } diff --git a/src/EnergyPlus/ZoneTempPredictorCorrector.hh b/src/EnergyPlus/ZoneTempPredictorCorrector.hh index a8ac4ec9ce7..ef5fcaf3787 100644 --- a/src/EnergyPlus/ZoneTempPredictorCorrector.hh +++ b/src/EnergyPlus/ZoneTempPredictorCorrector.hh @@ -120,6 +120,7 @@ namespace ZoneTempPredictorCorrector { // Zone or space air drybulb temperature conditions Real64 MAT = DataHeatBalance::ZoneInitialTemp; // Mean Air Temperature at end of zone time step [C] + Real64 MRT = DataHeatBalance::ZoneInitialTemp; // Mean Radiant Temperature [C] Real64 ZTAV = DataHeatBalance::ZoneInitialTemp; // Air Temperature Averaged over the zone time step (during HVAC Time Steps) Real64 ZT = DataHeatBalance::ZoneInitialTemp; // Air Temperature Averaged over the system time step Real64 ZTAVComf = DataHeatBalance::ZoneInitialTemp; // Air Temperature Averaged used in thermal comfort models (currently Fanger model only) - diff --git a/tst/EnergyPlus/unit/AdvancedAFN.unit.cc b/tst/EnergyPlus/unit/AdvancedAFN.unit.cc index 804d230170d..4c9f3751307 100644 --- a/tst/EnergyPlus/unit/AdvancedAFN.unit.cc +++ b/tst/EnergyPlus/unit/AdvancedAFN.unit.cc @@ -103,9 +103,8 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_AdvancedTest_Test1) state->dataEnvrn->OutDryBulbTemp = 15.0; state->dataHeatBal->Zone.allocate(1); state->dataZoneTempPredictorCorrector->zoneHeatBalance.allocate(1); - state->dataHeatBal->ZoneMRT.allocate(1); state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT = 22.0; - state->dataHeatBal->ZoneMRT(1) = 22.0; + state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MRT = 22.0; TimeOpenElapsed = 5.0; TimeCloseElapsed = 0.0; @@ -149,7 +148,7 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_AdvancedTest_Test1) EXPECT_EQ(1, CloseProbStatus); state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT = 26.0; - state->dataHeatBal->ZoneMRT(1) = 26.0; + state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MRT = 26.0; state->afn->OccupantVentilationControl(1).calc(*state, 1, TimeOpenElapsed, TimeCloseElapsed, OpenStatus, OpenProbStatus, CloseProbStatus); EXPECT_EQ(2, OpenProbStatus); EXPECT_EQ(0, CloseProbStatus); diff --git a/tst/EnergyPlus/unit/ChilledCeilingPanelSimple.unit.cc b/tst/EnergyPlus/unit/ChilledCeilingPanelSimple.unit.cc index 36cbd909e97..1d33c284ce9 100644 --- a/tst/EnergyPlus/unit/ChilledCeilingPanelSimple.unit.cc +++ b/tst/EnergyPlus/unit/ChilledCeilingPanelSimple.unit.cc @@ -78,8 +78,7 @@ TEST_F(EnergyPlusFixture, SetCoolingPanelControlTemp) state->dataChilledCeilingPanelSimple->CoolingPanel.allocate(1); state->dataZoneTempPredictorCorrector->zoneHeatBalance.allocate(1); state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT = 22.0; - state->dataHeatBal->ZoneMRT.allocate(1); - state->dataHeatBal->ZoneMRT(1) = 20.0; + state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MRT = 20.0; state->dataHeatBal->Zone.allocate(1); state->dataHeatBal->Zone(1).OutDryBulbTemp = 10.0; state->dataHeatBal->Zone(1).OutWetBulbTemp = 5.0; diff --git a/tst/EnergyPlus/unit/LowTempRadiantSystem.unit.cc b/tst/EnergyPlus/unit/LowTempRadiantSystem.unit.cc index 285c0c748d5..5486a53c5ce 100644 --- a/tst/EnergyPlus/unit/LowTempRadiantSystem.unit.cc +++ b/tst/EnergyPlus/unit/LowTempRadiantSystem.unit.cc @@ -2926,7 +2926,6 @@ TEST_F(LowTempRadiantSystemTest, setRadiantSystemControlTemperatureTest) Real64 acceptibleError = 0.001; state->dataZoneTempPredictorCorrector->zoneHeatBalance.allocate(1); - state->dataHeatBal->ZoneMRT.allocate(1); state->dataHeatBal->Zone.allocate(1); state->dataHeatBalSurf->SurfTempIn.allocate(1); state->dataHeatBalSurf->SurfTempUserLoc.allocate(1); @@ -2935,8 +2934,9 @@ TEST_F(LowTempRadiantSystemTest, setRadiantSystemControlTemperatureTest) state->dataLowTempRadSys->ElecRadSys.allocate(1); // Test Data - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT = 23.456; - state->dataHeatBal->ZoneMRT(1) = 12.345; + auto &zoneHB1 = state->dataZoneTempPredictorCorrector->zoneHeatBalance(1); + zoneHB1.MAT = 23.456; + zoneHB1.MRT = 12.345; state->dataHeatBal->Zone(1).OutDryBulbTemp = 34.567; state->dataHeatBal->Zone(1).OutWetBulbTemp = 1.234; state->dataHeatBalSurf->SurfTempIn(1) = 5.678; @@ -2953,19 +2953,19 @@ TEST_F(LowTempRadiantSystemTest, setRadiantSystemControlTemperatureTest) // Test 1: MAT Control state->dataLowTempRadSys->HydrRadSys(1).controlType = LowTempRadiantControlTypes::MATControl; - expectedResult = state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT; + expectedResult = zoneHB1.MAT; actualResult = 0.0; // reset actualResult = state->dataLowTempRadSys->HydrRadSys(1).setRadiantSystemControlTemperature(*state, state->dataLowTempRadSys->HydrRadSys(1).controlType); EXPECT_NEAR(expectedResult, actualResult, acceptibleError); state->dataLowTempRadSys->CFloRadSys(1).controlType = LowTempRadiantControlTypes::MATControl; - expectedResult = state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT; + expectedResult = zoneHB1.MAT; actualResult = 0.0; // reset actualResult = state->dataLowTempRadSys->CFloRadSys(1).setRadiantSystemControlTemperature(*state, state->dataLowTempRadSys->CFloRadSys(1).controlType); EXPECT_NEAR(expectedResult, actualResult, acceptibleError); state->dataLowTempRadSys->ElecRadSys(1).controlType = LowTempRadiantControlTypes::MATControl; - expectedResult = state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT; + expectedResult = zoneHB1.MAT; actualResult = 0.0; // reset actualResult = state->dataLowTempRadSys->ElecRadSys(1).setRadiantSystemControlTemperature(*state, state->dataLowTempRadSys->ElecRadSys(1).controlType); @@ -2973,19 +2973,19 @@ TEST_F(LowTempRadiantSystemTest, setRadiantSystemControlTemperatureTest) // Test 2: MRT Control state->dataLowTempRadSys->HydrRadSys(1).controlType = LowTempRadiantControlTypes::MRTControl; - expectedResult = state->dataHeatBal->ZoneMRT(1); + expectedResult = zoneHB1.MRT; actualResult = 0.0; // reset actualResult = state->dataLowTempRadSys->HydrRadSys(1).setRadiantSystemControlTemperature(*state, state->dataLowTempRadSys->HydrRadSys(1).controlType); EXPECT_NEAR(expectedResult, actualResult, acceptibleError); state->dataLowTempRadSys->CFloRadSys(1).controlType = LowTempRadiantControlTypes::MRTControl; - expectedResult = state->dataHeatBal->ZoneMRT(1); + expectedResult = zoneHB1.MRT; actualResult = 0.0; // reset actualResult = state->dataLowTempRadSys->CFloRadSys(1).setRadiantSystemControlTemperature(*state, state->dataLowTempRadSys->CFloRadSys(1).controlType); EXPECT_NEAR(expectedResult, actualResult, acceptibleError); state->dataLowTempRadSys->ElecRadSys(1).controlType = LowTempRadiantControlTypes::MRTControl; - expectedResult = state->dataHeatBal->ZoneMRT(1); + expectedResult = zoneHB1.MRT; actualResult = 0.0; // reset actualResult = state->dataLowTempRadSys->ElecRadSys(1).setRadiantSystemControlTemperature(*state, state->dataLowTempRadSys->ElecRadSys(1).controlType); @@ -2993,19 +2993,19 @@ TEST_F(LowTempRadiantSystemTest, setRadiantSystemControlTemperatureTest) // Test 3: Operative Temperature Control state->dataLowTempRadSys->HydrRadSys(1).controlType = LowTempRadiantControlTypes::OperativeControl; - expectedResult = (state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT + state->dataHeatBal->ZoneMRT(1)) / 2.0; + expectedResult = (zoneHB1.MAT + zoneHB1.MRT) / 2.0; actualResult = 0.0; // reset actualResult = state->dataLowTempRadSys->HydrRadSys(1).setRadiantSystemControlTemperature(*state, state->dataLowTempRadSys->HydrRadSys(1).controlType); EXPECT_NEAR(expectedResult, actualResult, acceptibleError); state->dataLowTempRadSys->CFloRadSys(1).controlType = LowTempRadiantControlTypes::OperativeControl; - expectedResult = (state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT + state->dataHeatBal->ZoneMRT(1)) / 2.0; + expectedResult = (zoneHB1.MAT + zoneHB1.MRT) / 2.0; actualResult = 0.0; // reset actualResult = state->dataLowTempRadSys->CFloRadSys(1).setRadiantSystemControlTemperature(*state, state->dataLowTempRadSys->CFloRadSys(1).controlType); EXPECT_NEAR(expectedResult, actualResult, acceptibleError); state->dataLowTempRadSys->ElecRadSys(1).controlType = LowTempRadiantControlTypes::OperativeControl; - expectedResult = (state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT + state->dataHeatBal->ZoneMRT(1)) / 2.0; + expectedResult = (zoneHB1.MAT + zoneHB1.MRT) / 2.0; actualResult = 0.0; // reset actualResult = state->dataLowTempRadSys->ElecRadSys(1).setRadiantSystemControlTemperature(*state, state->dataLowTempRadSys->ElecRadSys(1).controlType); diff --git a/tst/EnergyPlus/unit/SystemAvailabilityManager.unit.cc b/tst/EnergyPlus/unit/SystemAvailabilityManager.unit.cc index bbcb6b3ca0b..314c6bc418e 100644 --- a/tst/EnergyPlus/unit/SystemAvailabilityManager.unit.cc +++ b/tst/EnergyPlus/unit/SystemAvailabilityManager.unit.cc @@ -448,7 +448,6 @@ TEST_F(EnergyPlusFixture, SysAvailManager_HybridVentilation_OT_CO2Control) state->dataAirLoop->PriAirSysAvailMgr.allocate(1); state->dataHeatBal->Zone.allocate(1); state->dataZoneTempPredictorCorrector->zoneHeatBalance.allocate(1); - state->dataHeatBal->ZoneMRT.allocate(1); state->dataContaminantBalance->ZoneAirCO2.allocate(1); state->dataContaminantBalance->ZoneCO2SetPoint.allocate(1); state->dataAirLoop->PriAirSysAvailMgr.allocate(1); @@ -483,25 +482,26 @@ TEST_F(EnergyPlusFixture, SysAvailManager_HybridVentilation_OT_CO2Control) state->dataSystemAvailabilityManager->HybridVentData(1).ControlMode = 5; // 80% acceptance state->dataThermalComforts->runningAverageASH = 20.0; - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT = 23.0; - state->dataHeatBal->ZoneMRT(1) = 27.0; + auto &zoneHB1 = state->dataZoneTempPredictorCorrector->zoneHeatBalance(1); + zoneHB1.MAT = 23.0; + zoneHB1.MRT = 27.0; SystemAvailabilityManager::CalcHybridVentSysAvailMgr(*state, 1, 1); EXPECT_EQ(1, state->dataSystemAvailabilityManager->HybridVentData(1).VentilationCtrl); // Vent open - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT = 26.0; - state->dataHeatBal->ZoneMRT(1) = 30.0; + zoneHB1.MAT = 26.0; + zoneHB1.MRT = 30.0; SystemAvailabilityManager::CalcHybridVentSysAvailMgr(*state, 1, 1); EXPECT_EQ(2, state->dataSystemAvailabilityManager->HybridVentData(1).VentilationCtrl); // System operation state->dataSystemAvailabilityManager->HybridVentData(1).ControlMode = 6; // 90% acceptance - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT = 23.0; - state->dataHeatBal->ZoneMRT(1) = 27.0; + zoneHB1.MAT = 23.0; + zoneHB1.MRT = 27.0; SystemAvailabilityManager::CalcHybridVentSysAvailMgr(*state, 1, 1); EXPECT_EQ(1, state->dataSystemAvailabilityManager->HybridVentData(1).VentilationCtrl); // Vent open - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MAT = 26.0; - state->dataHeatBal->ZoneMRT(1) = 30.0; + zoneHB1.MAT = 26.0; + zoneHB1.MRT = 30.0; SystemAvailabilityManager::CalcHybridVentSysAvailMgr(*state, 1, 1); EXPECT_EQ(2, state->dataSystemAvailabilityManager->HybridVentData(1).VentilationCtrl); // System operation diff --git a/tst/EnergyPlus/unit/ThermalComfort.unit.cc b/tst/EnergyPlus/unit/ThermalComfort.unit.cc index 83782d983b0..4f2b83727af 100644 --- a/tst/EnergyPlus/unit/ThermalComfort.unit.cc +++ b/tst/EnergyPlus/unit/ThermalComfort.unit.cc @@ -722,40 +722,41 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcThermalComfortFanger) // compare_err_stream( "" ); - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAVComf = 25.0; - state->dataHeatBal->ZoneMRT(1) = 26.0; + auto &zoneHB1 = state->dataZoneTempPredictorCorrector->zoneHeatBalance(1); + zoneHB1.ZTAVComf = 25.0; + zoneHB1.MRT = 26.0; state->dataViewFactor->EnclRadInfo(1).MRT = 26.0; - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).airHumRatAvgComf = 0.00529; // 0.002 to 0.006 + zoneHB1.airHumRatAvgComf = 0.00529; // 0.002 to 0.006 CalcThermalComfortFanger(*state); EXPECT_NEAR(state->dataThermalComforts->ThermalComfortData(1).FangerPMV, -1.262, 0.005); EXPECT_NEAR(state->dataThermalComforts->ThermalComfortData(1).FangerPPD, 38.3, 0.1); - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAVComf = 26.0; - state->dataHeatBal->ZoneMRT(1) = 27.0; + zoneHB1.ZTAVComf = 26.0; + zoneHB1.MRT = 27.0; state->dataViewFactor->EnclRadInfo(1).MRT = 27.0; - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).airHumRatAvgComf = 0.00529; // 0.002 to 0.006 + zoneHB1.airHumRatAvgComf = 0.00529; // 0.002 to 0.006 CalcThermalComfortFanger(*state); EXPECT_NEAR(state->dataThermalComforts->ThermalComfortData(1).FangerPMV, -0.860, 0.005); EXPECT_NEAR(state->dataThermalComforts->ThermalComfortData(1).FangerPPD, 20.6, 0.1); - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAVComf = 27.0; - state->dataHeatBal->ZoneMRT(1) = 28.0; + zoneHB1.ZTAVComf = 27.0; + zoneHB1.MRT = 28.0; state->dataViewFactor->EnclRadInfo(1).MRT = 28.0; - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).airHumRatAvgComf = 0.00529; // 0.002 to 0.006 + zoneHB1.airHumRatAvgComf = 0.00529; // 0.002 to 0.006 CalcThermalComfortFanger(*state); EXPECT_NEAR(state->dataThermalComforts->ThermalComfortData(1).FangerPMV, -0.460, 0.005); EXPECT_NEAR(state->dataThermalComforts->ThermalComfortData(1).FangerPPD, 9.4, 0.1); - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAVComf = 25.0; - state->dataHeatBal->ZoneMRT(1) = 26.0; + zoneHB1.ZTAVComf = 25.0; + zoneHB1.MRT = 26.0; state->dataViewFactor->EnclRadInfo(1).MRT = 26.0; - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).airHumRatAvgComf = 0.00629; // 0.002 to 0.006 + zoneHB1.airHumRatAvgComf = 0.00629; // 0.002 to 0.006 CalcThermalComfortFanger(*state); @@ -989,7 +990,6 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcThermalComfortASH55) state->dataThermalComforts->ThermalComfortData.allocate(state->dataHeatBal->TotPeople); state->dataGlobal->NumOfZones = 1; state->dataHeatBal->Zone.allocate(state->dataGlobal->NumOfZones); - state->dataHeatBal->ZoneMRT.allocate(state->dataGlobal->NumOfZones); state->dataRoomAir->IsZoneDispVent3Node.allocate(state->dataGlobal->NumOfZones); state->dataRoomAir->IsZoneUFAD.allocate(state->dataGlobal->NumOfZones); state->dataHeatBalFanSys->ZoneQdotRadHVACToPerson.allocate(state->dataGlobal->NumOfZones); @@ -1058,11 +1058,11 @@ TEST_F(EnergyPlusFixture, ThermalComfort_CalcThermalComfortASH55) Real64 CloUnit = 0.5; state->dataZoneTempPredictorCorrector->zoneHeatBalance.allocate(state->dataGlobal->NumOfZones); - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAVComf = AirTemp; - state->dataHeatBal->ZoneMRT(1) = RadTemp; + auto &zoneHB1 = state->dataZoneTempPredictorCorrector->zoneHeatBalance(1); + zoneHB1.ZTAVComf = AirTemp; + zoneHB1.MRT = RadTemp; state->dataViewFactor->EnclRadInfo(1).MRT = RadTemp; - state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).airHumRatAvgComf = Psychrometrics::PsyWFnTdbRhPb( - *state, state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAVComf, RelHum, state->dataEnvrn->OutBaroPress); + zoneHB1.airHumRatAvgComf = Psychrometrics::PsyWFnTdbRhPb(*state, zoneHB1.ZTAVComf, RelHum, state->dataEnvrn->OutBaroPress); state->dataScheduleMgr->Schedule(1).CurrentValue = ActMet * BodySurfaceArea * ThermalComfort::ActLevelConv; state->dataScheduleMgr->Schedule(2).CurrentValue = CloUnit; diff --git a/tst/EnergyPlus/unit/WindowManager.unit.cc b/tst/EnergyPlus/unit/WindowManager.unit.cc index e6fe8e67c29..4b0e00a6786 100644 --- a/tst/EnergyPlus/unit/WindowManager.unit.cc +++ b/tst/EnergyPlus/unit/WindowManager.unit.cc @@ -207,12 +207,10 @@ TEST_F(EnergyPlusFixture, WindowFrameTest) state->dataGlobal->BeginEnvrnFlag = true; state->dataEnvrn->OutBaroPress = 100000; - state->dataHeatBal->ZoneMRT.allocate(1); - state->dataZoneTempPredictorCorrector->zoneHeatBalance.allocate(1); state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZT = 0.0; state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAV = 0.0; - state->dataHeatBal->ZoneMRT(1) = 0.0; + state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MRT = 0.0; state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).airHumRatAvg = 0.0; HeatBalanceManager::ManageHeatBalance(*state); @@ -7680,12 +7678,10 @@ TEST_F(EnergyPlusFixture, CFS_InteriorSolarDistribution_Test) state->dataGlobal->BeginEnvrnFlag = true; state->dataEnvrn->OutBaroPress = 101325.0; - state->dataHeatBal->ZoneMRT.allocate(1); - state->dataZoneTempPredictorCorrector->zoneHeatBalance.allocate(1); state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZT = 0.0; state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).ZTAV = 0.0; - state->dataHeatBal->ZoneMRT(1) = 0.0; + state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).MRT = 0.0; state->dataZoneTempPredictorCorrector->zoneHeatBalance(1).airHumRatAvg = 0.0; HeatBalanceManager::ManageHeatBalance(*state); From 13c11ac3076ede57199b031014c37b6c136ae8da Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Wed, 11 Oct 2023 12:33:36 -0500 Subject: [PATCH 19/26] MRT transition --- .../CreateNewIDFUsingRulesV24_1_0.f90 | 30 ++++++++++++++--- .../InputRulesFiles/Rules23-2-0-to-24-1-0.md | 33 +++++++++++++++---- 2 files changed, 52 insertions(+), 11 deletions(-) diff --git a/src/Transition/CreateNewIDFUsingRulesV24_1_0.f90 b/src/Transition/CreateNewIDFUsingRulesV24_1_0.f90 index eb53f3ede80..464743fb491 100644 --- a/src/Transition/CreateNewIDFUsingRulesV24_1_0.f90 +++ b/src/Transition/CreateNewIDFUsingRulesV24_1_0.f90 @@ -11,7 +11,13 @@ SUBROUTINE SetThisVersionVariables() ! TODO: Update this section as appropriate VerString='Conversion 23.2 => 24.1' VersionNum=24.1 - sVersionNum='24.1' + ! Starting with version 22.1, the version string requires 4 characters + ! The original sVersionNum variable is a 3 character length string + ! If we just change that variable to be 4 characters, it could break everything before 22.1 + ! So instead, let's just move forward with a new 4 character string and use that in this file and the future + ! If we get to version 100.1 and we are still using this Fortran transition then well....we can deal with it then + sVersionNum = '***' + sVersionNumFourChars='24.1' IDDFileNameWithPath=TRIM(ProgramPath)//'V23-2-0-Energy+.idd' NewIDDFileNameWithPath=TRIM(ProgramPath)//'V24-1-0-Energy+.idd' RepVarFileNameWithPath=TRIM(ProgramPath)//'Report Variables 23-2-0 to 24-1-0.csv' @@ -281,9 +287,9 @@ SUBROUTINE CreateNewIDFUsingRules(EndOfFile,DiffOnly,InLfn,AskForInput,InputFile ENDDO IF (NoVersion .and. Num == 1) THEN CALL GetNewObjectDefInIDD('VERSION',NwNumArgs,NwAorN,NwReqFld,NwObjMinFlds,NwFldNames,NwFldDefaults,NwFldUnits) - OutArgs(1) = sVersionNum + OutArgs(1) = sVersionNumFourChars CurArgs=1 - CALL ShowWarningError('No version found in file, defaulting to '//sVersionNum,Auditf) + CALL ShowWarningError('No version found in file, defaulting to '//sVersionNumFourChars,Auditf) CALL WriteOutIDFLinesAsComments(DifLfn,'Version',CurArgs,OutArgs,NwFldNames,NwFldUnits) ENDIF @@ -355,14 +361,14 @@ SUBROUTINE CreateNewIDFUsingRules(EndOfFile,DiffOnly,InLfn,AskForInput,InputFile SELECT CASE (MakeUPPERCase(TRIM(IDFRecords(Num)%Name))) CASE ('VERSION') - IF ((InArgs(1)(1:3)) == sVersionNum .and. ArgFile) THEN + IF ((InArgs(1)(1:4)) == sVersionNumFourChars .and. ArgFile) THEN CALL ShowWarningError('File is already at latest version. No new diff file made.',Auditf) CLOSE(diflfn,STATUS='DELETE') LatestVersion=.true. EXIT ENDIF CALL GetNewObjectDefInIDD(ObjectName,NwNumArgs,NwAorN,NwReqFld,NwObjMinFlds,NwFldNames,NwFldDefaults,NwFldUnits) - OutArgs(1) = sVersionNum + OutArgs(1) = sVersionNumFourChars NoDiff=.false. ! changes for this version, pick one of the spots to add rules, this will reduce the possibility of merge conflicts @@ -378,6 +384,13 @@ SUBROUTINE CreateNewIDFUsingRules(EndOfFile,DiffOnly,InLfn,AskForInput,InputFile ! If your original object starts with A, insert the rules here ! If your original object starts with C, insert the rules here + CASE('COMFORTVIEWFACTORANGLES') + CALL GetNewObjectDefInIDD(ObjectName,NwNumArgs,NwAorN,NwReqFld,NwObjMinFlds,NwFldNames,NwFldDefaults,NwFldUnits) + nodiff=.false. + OutArgs(1)=InArgs(1) + ! InArgs(2) is deleted + OutArgs(2:CurArgs-1)=InArgs(3:CurArgs) + CurArgs = CurArgs -1 ! If your original object starts with D, insert the rules here @@ -400,6 +413,13 @@ SUBROUTINE CreateNewIDFUsingRules(EndOfFile,DiffOnly,InLfn,AskForInput,InputFile ! If your original object starts with O, insert the rules here ! If your original object starts with P, insert the rules here + CASE('PEOPLE') + CALL GetNewObjectDefInIDD(ObjectName,NwNumArgs,NwAorN,NwReqFld,NwObjMinFlds,NwFldNames,NwFldDefaults,NwFldUnits) + nodiff=.false. + OutArgs(1:CurArgs)=InArgs(1:CurArgs) + IF (SameString(OutArgs(13),'ZoneAveraged') ) THEN + OutArgs(13)='EnclosureAveraged' + ENDIF ! If your original object starts with R, insert the rules here diff --git a/src/Transition/InputRulesFiles/Rules23-2-0-to-24-1-0.md b/src/Transition/InputRulesFiles/Rules23-2-0-to-24-1-0.md index eb38f629fa9..dd11d9a8737 100644 --- a/src/Transition/InputRulesFiles/Rules23-2-0-to-24-1-0.md +++ b/src/Transition/InputRulesFiles/Rules23-2-0-to-24-1-0.md @@ -2,7 +2,6 @@ Input Changes version 23.2.0 to 24.1.0 ====================================== This file documents the structural changes on the input of EnergyPlus that could affect interfaces, etc. -This was previously an Excel workbook that made for very difficult version control, especially during busy times around code freezes. # Object Changes: BASIC STRUCTURE @@ -15,15 +14,30 @@ The alpha/numeric A/N numbers are not as important here. # Object Change: ObjectStartsWithB -# Object Change: ObjectStartsWithC +# Object Change: ComfortViewFactorAngles +Field 2 (A2) Zone Name (zone_name) is deleted. +Remaining fields shift up one place. + +[PR#10244](https://github.com/NREL/EnergyPlus/pull/10244/) # Object Change: ObjectStartsWithD -# Object Change: ObjectStartsWithE +# Object Change: ElectricEquipment and Lights +Field 6 (N2) field name changed from "Watts per Zone Floor Area" (watts_per_zone_floor_area) to "Watts per Floor Area" (watts_per_floor_area). + +[PR#10244](https://github.com/NREL/EnergyPlus/pull/10244/) + +# Object Change: ElectricEquipment:ITE:AirCooled +Field 7 (N3) field name changed from "Watts per Zone Floor Area" (watts_per_zone_floor_area) to "Watts per Floor Area" (watts_per_floor_area). + +[PR#10244](https://github.com/NREL/EnergyPlus/pull/10244/) # Object Change: ObjectStartsWithF -# Object Change: ObjectStartsWithG +# Object Change: GasEquipment, HotWaterEquipment, and SteamEquipment +Field 6 (N2) field name changed from "Power per Zone Floor Area" (power_per_zone_floor_area) to "Power per Floor Area" (power_per_floor_area). + +[PR#10244](https://github.com/NREL/EnergyPlus/pull/10244/) # Object Change: ObjectStartsWithH @@ -39,9 +53,16 @@ The alpha/numeric A/N numbers are not as important here. # Object Change: ObjectStartsWithN -# Object Change: ObjectStartsWithO +# Object Change: OtherEquipment +Field 7 (N2) field name changed from "Power per Zone Floor Area" (power_per_zone_floor_area) to "Power per Floor Area" (power_per_floor_area). + +[PR#10244](https://github.com/NREL/EnergyPlus/pull/10244/) + +# Object Change: People +Field 13 (A7) Mean Radiant Temperature Calculation Type (mean_radiant_temperature_calculation_type) +\key ZoneAveraged is changed to EnclosureAveraged -# Object Change: ObjectStartsWithP +[PR#10244](https://github.com/NREL/EnergyPlus/pull/10244/) # Object Change: ObjectStartsWithQ From 89df6cb78d66226ce95a09ea6d751f0d737d0b0b Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Wed, 11 Oct 2023 12:33:55 -0500 Subject: [PATCH 20/26] Update transition template --- .../CreateNewIDFUsingRules_template.f90 | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Transition/CreateNewIDFUsingRules_template.f90 b/src/Transition/CreateNewIDFUsingRules_template.f90 index 344792c5791..5a6d52a32ee 100644 --- a/src/Transition/CreateNewIDFUsingRules_template.f90 +++ b/src/Transition/CreateNewIDFUsingRules_template.f90 @@ -11,7 +11,13 @@ SUBROUTINE SetThisVersionVariables() ! TODO: Update this section as appropriate VerString='Conversion 9.3 => 9.4' VersionNum=9.4 - sVersionNum='9.4' + ! Starting with version 22.1, the version string requires 4 characters + ! The original sVersionNum variable is a 3 character length string + ! If we just change that variable to be 4 characters, it could break everything before 22.1 + ! So instead, let's just move forward with a new 4 character string and use that in this file and the future + ! If we get to version 100.1 and we are still using this Fortran transition then well....we can deal with it then + sVersionNum = '***' + sVersionNumFourChars='23.2' IDDFileNameWithPath=TRIM(ProgramPath)//'V9-3-0-Energy+.idd' NewIDDFileNameWithPath=TRIM(ProgramPath)//'V9-4-0-Energy+.idd' RepVarFileNameWithPath=TRIM(ProgramPath)//'Report Variables 9-3-0 to 9-4-0.csv' @@ -281,9 +287,9 @@ SUBROUTINE CreateNewIDFUsingRules(EndOfFile,DiffOnly,InLfn,AskForInput,InputFile ENDDO IF (NoVersion .and. Num == 1) THEN CALL GetNewObjectDefInIDD('VERSION',NwNumArgs,NwAorN,NwReqFld,NwObjMinFlds,NwFldNames,NwFldDefaults,NwFldUnits) - OutArgs(1) = sVersionNum + OutArgs(1) = sVersionNumFourChars CurArgs=1 - CALL ShowWarningError('No version found in file, defaulting to '//sVersionNum,Auditf) + CALL ShowWarningError('No version found in file, defaulting to '//sVersionNumFourChars,Auditf) CALL WriteOutIDFLinesAsComments(DifLfn,'Version',CurArgs,OutArgs,NwFldNames,NwFldUnits) ENDIF @@ -355,14 +361,14 @@ SUBROUTINE CreateNewIDFUsingRules(EndOfFile,DiffOnly,InLfn,AskForInput,InputFile SELECT CASE (MakeUPPERCase(TRIM(IDFRecords(Num)%Name))) CASE ('VERSION') - IF ((InArgs(1)(1:3)) == sVersionNum .and. ArgFile) THEN + IF ((InArgs(1)(1:4)) == sVersionNumFourChars .and. ArgFile) THEN CALL ShowWarningError('File is already at latest version. No new diff file made.',Auditf) CLOSE(diflfn,STATUS='DELETE') LatestVersion=.true. EXIT ENDIF CALL GetNewObjectDefInIDD(ObjectName,NwNumArgs,NwAorN,NwReqFld,NwObjMinFlds,NwFldNames,NwFldDefaults,NwFldUnits) - OutArgs(1) = sVersionNum + OutArgs(1) = sVersionNumFourChars NoDiff=.false. ! changes for this version, pick one of the spots to add rules, this will reduce the possibility of merge conflicts From 481800cb522289f3f22057df93084f2249d1a388 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Thu, 12 Oct 2023 11:24:10 -0500 Subject: [PATCH 21/26] MRT unit test --- tst/EnergyPlus/unit/SurfaceGeometry.unit.cc | 76 +++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/tst/EnergyPlus/unit/SurfaceGeometry.unit.cc b/tst/EnergyPlus/unit/SurfaceGeometry.unit.cc index 5769a2f8a7a..33000f0e0e2 100644 --- a/tst/EnergyPlus/unit/SurfaceGeometry.unit.cc +++ b/tst/EnergyPlus/unit/SurfaceGeometry.unit.cc @@ -55,10 +55,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include #include @@ -69,6 +71,7 @@ #include #include #include +#include #include #include @@ -5788,6 +5791,8 @@ TEST_F(EnergyPlusFixture, HeatBalanceIntRadExchange_SetupEnclosuresWithAirBounda // SetupZoneGeometry calls SurfaceGeometry::SetupSolarEnclosuresAndAirBoundaries // SetupZoneGeometry calls SurfaceGeometry::SetupRadiantEnclosuresAndAirBoundaries EXPECT_FALSE(ErrorsFound); // expect no errors + HeatBalanceIntRadExchange::InitSolarViewFactors(*state); + HeatBalanceIntRadExchange::InitInteriorRadExchange(*state); ErrorsFound = false; @@ -5841,6 +5846,77 @@ TEST_F(EnergyPlusFixture, HeatBalanceIntRadExchange_SetupEnclosuresWithAirBounda EXPECT_EQ(state->dataHeatBal->space(1).HTSurfaceLast, Zone1Floor); EXPECT_EQ(state->dataHeatBal->space(2).HTSurfaceLast, Zone2Floor); EXPECT_EQ(state->dataHeatBal->space(3).HTSurfaceLast, Zone3Floor); + + // Check MRT calculations + state->dataZoneTempPredictorCorrector->zoneHeatBalance.allocate(3); + state->dataZoneTempPredictorCorrector->spaceHeatBalance.allocate(3); + state->dataHeatBalSurf->SurfTempIn.allocate(7); + auto &zoneHB1 = state->dataZoneTempPredictorCorrector->zoneHeatBalance(1); + auto &zoneHB2 = state->dataZoneTempPredictorCorrector->zoneHeatBalance(2); + auto &zoneHB3 = state->dataZoneTempPredictorCorrector->zoneHeatBalance(3); + auto &spaceHB1 = state->dataZoneTempPredictorCorrector->spaceHeatBalance(1); + auto &spaceHB2 = state->dataZoneTempPredictorCorrector->spaceHeatBalance(2); + auto &spaceHB3 = state->dataZoneTempPredictorCorrector->spaceHeatBalance(3); + auto &encl1 = state->dataViewFactor->EnclRadInfo(1); + auto &encl2 = state->dataViewFactor->EnclRadInfo(2); + + // Case 1 - all surfaces the same temperature + state->dataHeatBalSurf->SurfTempIn(Zone1Surface1) = 10.0; + state->dataHeatBalSurf->SurfTempIn(Zone2Surface1) = 10.0; + state->dataHeatBalSurf->SurfTempIn(Zone1Floor) = 10.0; + state->dataHeatBalSurf->SurfTempIn(Zone2Floor) = 10.0; + state->dataHeatBalSurf->SurfTempIn(Zone3Floor) = 10.0; + + HeatBalanceSurfaceManager::CalculateZoneMRT(*state); + EXPECT_NEAR(zoneHB1.MRT, 10.0, 0.001); + EXPECT_NEAR(zoneHB2.MRT, 10.0, 0.001); + EXPECT_NEAR(zoneHB3.MRT, 10.0, 0.001); + EXPECT_NEAR(encl1.MRT, 10.0, 0.001); + EXPECT_NEAR(encl2.MRT, 10.0, 0.001); + EXPECT_EQ(spaceHB1.MRT, encl1.MRT); + EXPECT_EQ(spaceHB2.MRT, encl2.MRT); + EXPECT_EQ(spaceHB3.MRT, encl1.MRT); + + // Case 2 - all surfaces in each zone same temperature + state->dataHeatBalSurf->SurfTempIn(Zone1Surface1) = 10.0; + state->dataHeatBalSurf->SurfTempIn(Zone2Surface1) = 20.0; + state->dataHeatBalSurf->SurfTempIn(Zone1Floor) = 10.0; + state->dataHeatBalSurf->SurfTempIn(Zone2Floor) = 20.0; + state->dataHeatBalSurf->SurfTempIn(Zone3Floor) = 30.0; + + HeatBalanceSurfaceManager::CalculateZoneMRT(*state); + EXPECT_NEAR(zoneHB1.MRT, 10.0, 0.001); + EXPECT_NEAR(zoneHB2.MRT, 20.0, 0.001); + EXPECT_NEAR(zoneHB3.MRT, 30.0, 0.001); + EXPECT_NEAR(encl1.MRT, 16.667, 0.001); + EXPECT_NEAR(encl2.MRT, 20.0, 0.001); + EXPECT_EQ(spaceHB1.MRT, encl1.MRT); + EXPECT_EQ(spaceHB2.MRT, encl2.MRT); + EXPECT_EQ(spaceHB3.MRT, encl1.MRT); + + // Case 3 - surface AEs sum to zero - so revert to MATs + state->dataSurface->Surface(Zone1Surface1).Area = 0.0; + state->dataSurface->Surface(Zone2Surface1).Area = 0.0; + state->dataSurface->Surface(Zone1Floor).Area = 0.0; + state->dataSurface->Surface(Zone2Floor).Area = 0.0; + state->dataSurface->Surface(Zone3Floor).Area = 0.0; + + spaceHB1.MAT = 15.0; + spaceHB2.MAT = 22.0; + spaceHB3.MAT = 28.0; + zoneHB1.MAT = 20.0; + zoneHB2.MAT = 25.0; + zoneHB3.MAT = 28.0; + state->dataHeatBalSurfMgr->CalculateZoneMRTfirstTime = true; + HeatBalanceSurfaceManager::CalculateZoneMRT(*state); + EXPECT_NEAR(zoneHB1.MRT, 20.0, 0.001); + EXPECT_NEAR(zoneHB2.MRT, 25.0, 0.001); + EXPECT_NEAR(zoneHB3.MRT, 28.0, 0.001); + EXPECT_NEAR(encl1.MRT, 21.5, 0.001); + EXPECT_NEAR(encl2.MRT, 22.0, 0.001); + EXPECT_EQ(spaceHB1.MRT, encl1.MRT); + EXPECT_EQ(spaceHB2.MRT, encl2.MRT); + EXPECT_EQ(spaceHB3.MRT, encl1.MRT); } TEST_F(EnergyPlusFixture, HeatBalanceIntRadExchange_SetupEnclosuresWithAirBoundaries3) From 67516a68e8ce119e90afbd074737c84654c38387 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Thu, 12 Oct 2023 11:24:53 -0500 Subject: [PATCH 22/26] CalculateZoneMRT refinements --- src/EnergyPlus/HeatBalanceSurfaceManager.cc | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/EnergyPlus/HeatBalanceSurfaceManager.cc b/src/EnergyPlus/HeatBalanceSurfaceManager.cc index eb225bb5c5c..c2f563a7e9a 100644 --- a/src/EnergyPlus/HeatBalanceSurfaceManager.cc +++ b/src/EnergyPlus/HeatBalanceSurfaceManager.cc @@ -5458,15 +5458,17 @@ void CalculateZoneMRT(EnergyPlusData &state, state.dataHeatBalSurfMgr->ZoneAESum.allocate(state.dataGlobal->NumOfZones); state.dataHeatBalSurfMgr->SurfaceAE = 0.0; state.dataHeatBalSurfMgr->ZoneAESum = 0.0; + for (auto &encl : state.dataViewFactor->EnclRadInfo) { + encl.sumAE = 0.0; + } for (int SurfNum = 1; SurfNum <= state.dataSurface->TotSurfaces; ++SurfNum) { auto const &surface = state.dataSurface->Surface(SurfNum); if (surface.HeatTransSurf) { - state.dataHeatBalSurfMgr->SurfaceAE(SurfNum) = - surface.Area * state.dataConstruction->Construct(surface.Construction).InsideAbsorpThermal; + auto &thisSurfAE = state.dataHeatBalSurfMgr->SurfaceAE(SurfNum); + thisSurfAE = surface.Area * state.dataConstruction->Construct(surface.Construction).InsideAbsorpThermal; int ZoneNum = surface.Zone; - if (ZoneNum > 0) state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum) += state.dataHeatBalSurfMgr->SurfaceAE(SurfNum); - if (surface.RadEnclIndex > 0) - state.dataViewFactor->EnclRadInfo(surface.RadEnclIndex).sumAE += state.dataHeatBalSurfMgr->SurfaceAE(SurfNum); + if (ZoneNum > 0) state.dataHeatBalSurfMgr->ZoneAESum(ZoneNum) += thisSurfAE; + if (surface.RadEnclIndex > 0) state.dataViewFactor->EnclRadInfo(surface.RadEnclIndex).sumAE += thisSurfAE; } } } @@ -5528,9 +5530,10 @@ void CalculateZoneMRT(EnergyPlusData &state, Real64 sumMAT = 0.0; for (auto &spaceNum : thisEnclosure.spaceNums) { Real64 spaceVolume = state.dataHeatBal->space(spaceNum).Volume; + Real64 spaceMAT = state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).MAT; sumVol += spaceVolume; - sumMATVol += state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).MAT * spaceVolume; - sumMAT += state.dataZoneTempPredictorCorrector->spaceHeatBalance(spaceNum).MAT; + sumMATVol += spaceMAT * spaceVolume; + sumMAT += spaceMAT; } if (sumVol > 0.01) { thisEnclosure.MRT = sumMATVol / sumVol; From cd8980461221f161ab3b4d99be9545c87a614479 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Thu, 12 Oct 2023 12:10:40 -0500 Subject: [PATCH 23/26] MRT Docs --- .../overview/group-thermal-zone-description-geometry.tex | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/doc/input-output-reference/src/overview/group-thermal-zone-description-geometry.tex b/doc/input-output-reference/src/overview/group-thermal-zone-description-geometry.tex index 08d6679a5ed..efe021c8b41 100644 --- a/doc/input-output-reference/src/overview/group-thermal-zone-description-geometry.tex +++ b/doc/input-output-reference/src/overview/group-thermal-zone-description-geometry.tex @@ -224,6 +224,8 @@ \subsubsection{Space Thermal Outputs Overview} Zone,Average,Space Mean Air Dewpoint Temperature {[}C{]} \item Zone,Average,Space Mean Radiant Temperature {[}C{]} +\item + Zone,Average,Enclosure Mean Radiant Temperature {[}C{]} \item Zone,Average,Space Operative Temperature {[}C{]} \item @@ -384,8 +386,10 @@ \subsubsection{Space and Zone Thermal Outputs Details} This is the zone air node temperature for the well-mixed room air model, which is the default room air model type (\hyperref[roomairmodeltype]{RoomAirModelType} = Mixing). But for other types of Room Air Model (the RoomAir:TemperaturePattern:* and RoomAirSettings:* objects) the zone thermostat air temperature may depend on the Thermostat Height and Thermostat Offset. \paragraph{Zone Mean Radiant Temperature {[}C{]}}\label{zone-mean-radiant-temperature-c} +\paragraph{Space Mean Radiant Temperature {[}C{]}}\label{space-mean-radiant-temperature-c} +\paragraph{Enclosure Mean Radiant Temperature {[}C{]}}\label{enclosure-mean-radiant-temperature-c} -The Mean Radiant Temperature (MRT) in degrees Celsius of a space is a measure of the combined effects of temperatures of surfaces within that space. Specifically it is the surface area $\times$ emissivity weighted average of the zone inside surface temperatures (ref. Surface Inside Temperature), where emissivity is the Thermal Absorptance of the inside material layer of each surface. +The Mean Radiant Temperature (MRT) in degrees Celsius is the surface area $\times$ emissivity weighted average of the \hyperref[surface-inside-face-temperature-c]{Surface Inside Face Temperature}, where emissivity is the Thermal Absorptance of the inside material layer of each surface. Zone Mean Radiant Temperature is based on all surfaces in the zone (regardless of what enclosure each surface is in). Enclosure Mean Radiant Temperature is based on all surfaces in an enclosure (one or more \hyperref[space]{Spaces}, see \hyperref[constructionairboundary]{Construction:AirBoundary}). Space Mean Radiant Temperature is based on all surfaces in the enclosure which contains the space (same as its Enclsoure Mean Radiant Temperature). \paragraph{Zone Operative Temperature {[}C{]}}\label{zone-operative-temperature-c} From 3c5984876993f5c34167dc36619482399cd70771 Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Tue, 31 Oct 2023 09:39:42 -0500 Subject: [PATCH 24/26] format --- src/EnergyPlus/ThermalComfort.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/EnergyPlus/ThermalComfort.cc b/src/EnergyPlus/ThermalComfort.cc index 3ac9aea1198..7b3a1b3f5f6 100644 --- a/src/EnergyPlus/ThermalComfort.cc +++ b/src/EnergyPlus/ThermalComfort.cc @@ -1953,8 +1953,7 @@ namespace ThermalComfort { for (int SurfNum = 1; SurfNum <= thisAngFacList.TotAngleFacSurfaces; ++SurfNum) { thisAngFacList.SurfaceName(SurfNum) = state.dataIPShortCut->cAlphaArgs(SurfNum + 1); - thisAngFacList.SurfacePtr(SurfNum) = - Util::FindItemInList(state.dataIPShortCut->cAlphaArgs(SurfNum + 1), state.dataSurface->Surface); + thisAngFacList.SurfacePtr(SurfNum) = Util::FindItemInList(state.dataIPShortCut->cAlphaArgs(SurfNum + 1), state.dataSurface->Surface); thisAngFacList.AngleFactor(SurfNum) = state.dataIPShortCut->rNumericArgs(SurfNum); // Error trap for surfaces that do not exist or surfaces not in the zone if (thisAngFacList.SurfacePtr(SurfNum) == 0) { From 8eb0b2efb9013912066083d53d19902d95cb939e Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Wed, 8 Nov 2023 15:47:22 -0600 Subject: [PATCH 25/26] Testfile cleanup --- .../HeatPumpProportionalControl_DCVDesignOccAllZones.idf | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/testfiles/HeatPumpProportionalControl_DCVDesignOccAllZones.idf b/testfiles/HeatPumpProportionalControl_DCVDesignOccAllZones.idf index cbd5e840405..9b6f51125be 100644 --- a/testfiles/HeatPumpProportionalControl_DCVDesignOccAllZones.idf +++ b/testfiles/HeatPumpProportionalControl_DCVDesignOccAllZones.idf @@ -108,7 +108,7 @@ ! Environmental Emissions: None ! Utility Tariffs: None - Version,23.2; + Version,24.1; Building, NONE, !- Name @@ -1038,7 +1038,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1060,7 +1060,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method @@ -1082,7 +1082,7 @@ Activity Sch, !- Activity Level Schedule Name 3.82E-8, !- Carbon Dioxide Generation Rate {m3/s-W} , !- Enable ASHRAE 55 Comfort Warnings - zoneaveraged, !- Mean Radiant Temperature Calculation Type + EnclosureAveraged, !- Mean Radiant Temperature Calculation Type , !- Surface Name/Angle Factor List Name Work Eff Sch, !- Work Efficiency Schedule Name ClothingInsulationSchedule, !- Clothing Insulation Calculation Method From e3d51efbe73100dbaa45c34374bf3ea7ecb1a26e Mon Sep 17 00:00:00 2001 From: "Michael J. Witte" Date: Thu, 9 Nov 2023 09:04:28 -0600 Subject: [PATCH 26/26] Error msg tweak --- src/EnergyPlus/HeatBalanceSurfaceManager.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/EnergyPlus/HeatBalanceSurfaceManager.cc b/src/EnergyPlus/HeatBalanceSurfaceManager.cc index b4c4949ff8d..dfcfe000f59 100644 --- a/src/EnergyPlus/HeatBalanceSurfaceManager.cc +++ b/src/EnergyPlus/HeatBalanceSurfaceManager.cc @@ -4392,9 +4392,10 @@ void ComputeIntSWAbsorpFactors(EnergyPlusData &state) // That's probably not correct, but how correct is it to assume that no solar is absorbed anywhere // in the zone? if (thisSolEnclosure.solAbsFirstCalc) { - ShowWarningError(state, - format("ComputeIntSWAbsorbFactors: Sum of area times inside solar absorption for all surfaces is zero in Zone: {}", - thisSolEnclosure.Name)); + ShowWarningError( + state, + format("ComputeIntSWAbsorbFactors: Sum of area times inside solar absorption for all surfaces is zero in Enclosure: {}", + thisSolEnclosure.Name)); thisSolEnclosure.solAbsFirstCalc = false; } thisSolEnclosure.solVMULT = 0.0;