openstudio-standards 0.2.15 → 0.2.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (105) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAECollege.osm +117 -117
  3. data/data/geometry/ASHRAEHighriseApartment.osm +0 -27
  4. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  5. data/data/standards/OpenStudio_Standards-ashrae_90_1_28Jan2022.xlsx +0 -0
  6. data/data/standards/OpenStudio_Standards-ashrae_90_1_28_Jan2022_2.xlsx +0 -0
  7. data/data/standards/export_OpenStudio_libraries.rb +2 -0
  8. data/data/standards/test_performance_expected_dd_results.csv +892 -892
  9. data/lib/openstudio-standards/btap/btap_result.rb +2 -2
  10. data/lib/openstudio-standards/btap/reporting.rb +2 -2
  11. data/lib/openstudio-standards/btap/simmanager.rb +2 -2
  12. data/lib/openstudio-standards/hvac_sizing/Siz.ControllerOutdoorAir.rb +0 -54
  13. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +11 -1
  14. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +1 -1
  15. data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +2 -2
  16. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +26 -5
  17. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +14 -6
  18. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +63 -63
  19. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +12 -9
  20. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +35 -16
  21. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +23 -10
  22. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +36 -0
  23. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +6 -6
  24. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +25 -15
  25. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +1 -1
  26. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +2 -2
  27. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +9 -3
  28. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +2 -0
  29. data/lib/openstudio-standards/standards/Standards.Construction.rb +12 -6
  30. data/lib/openstudio-standards/standards/Standards.Model.rb +43 -8
  31. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +15 -0
  32. data/lib/openstudio-standards/standards/Standards.Space.rb +1 -1
  33. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +7 -0
  34. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +5 -2
  35. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Model.rb +32 -11
  36. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +22 -742
  37. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +2 -2
  38. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +3 -3
  39. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +25 -25
  40. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +19 -559
  41. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +2 -2
  42. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +3 -3
  43. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +11 -11
  44. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +19 -559
  45. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +2 -2
  46. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +5 -5
  47. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +10 -10
  48. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +19 -559
  49. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +2 -2
  50. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +5 -5
  51. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +13 -13
  52. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_properties.json +370 -910
  53. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_sets.json +2 -2
  54. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.prototype_inputs.json +6 -6
  55. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_system.json +0 -8
  56. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +18 -18
  57. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +19 -6
  58. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_properties.json +2380 -1300
  59. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_sets.json +2 -2
  60. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.prototype_inputs.json +6 -6
  61. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_system.json +0 -8
  62. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +18 -18
  63. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +140 -0
  64. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +1176 -312
  65. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.construction_properties.json +172 -1132
  66. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.construction_sets.json +14 -14
  67. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +2 -2
  68. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +9 -9
  69. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.construction_properties.json +180 -1140
  70. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.construction_sets.json +14 -14
  71. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +2 -2
  72. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +10 -10
  73. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.construction_properties.json +9 -9
  74. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.construction_properties.json +9 -9
  75. data/lib/openstudio-standards/standards/deer/deer.PlanarSurface.rb +15 -0
  76. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +12 -6
  77. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +12 -6
  78. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +16 -8
  79. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +10 -20
  80. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +209 -37
  81. data/lib/openstudio-standards/standards/necb/ECMS/loads.rb +1 -0
  82. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +8 -6
  83. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +16 -9
  84. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartment.osm +1 -1
  85. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +1 -1
  86. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/MidriseApartment.osm +1 -1
  87. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +9 -5
  88. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +10 -6
  89. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +9 -5
  90. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +14 -8
  91. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +14 -8
  92. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +13 -6
  93. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +12 -6
  94. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +4 -2
  95. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +38 -19
  96. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +2 -2
  97. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +15 -4
  98. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +10 -651
  99. data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +8 -38
  100. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +159 -0
  101. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +41 -43
  102. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +7 -4
  103. data/lib/openstudio-standards/version.rb +1 -1
  104. data/lib/openstudio-standards.rb +1 -0
  105. metadata +5 -2
@@ -11,9 +11,9 @@ class Standard
11
11
  # @param nominal_thermal_efficiency [Double] boiler nominal thermal efficiency
12
12
  # @param eff_curve_temp_eval_var [String] LeavingBoiler or EnteringBoiler temperature for the boiler efficiency curve
13
13
  # @param flow_mode [String] boiler flow mode
14
- # @param lvg_temp_dsgn [Double] boiler leaving design temperature, degrees Fahrenheit
14
+ # @param lvg_temp_dsgn_f [Double] boiler leaving design temperature in degrees Fahrenheit
15
15
  # note that this field is deprecated in OS versions 3.0+
16
- # @param out_temp_lmt [Double] boiler outlet temperature limit, degrees Fahrenheit
16
+ # @param out_temp_lmt_f [Double] boiler outlet temperature limit in degrees Fahrenheit
17
17
  # @param min_plr [Double] boiler minimum part load ratio
18
18
  # @param max_plr [Double] boiler maximum part load ratio
19
19
  # @param opt_plr [Double] boiler optimum part load ratio
@@ -27,8 +27,8 @@ class Standard
27
27
  nominal_thermal_efficiency: 0.80,
28
28
  eff_curve_temp_eval_var: 'LeavingBoiler',
29
29
  flow_mode: 'LeavingSetpointModulated',
30
- lvg_temp_dsgn: 180.0,
31
- out_temp_lmt: 203.0, # 95C
30
+ lvg_temp_dsgn_f: 180.0, # 82.22 degrees Celsius
31
+ out_temp_lmt_f: 203.0, # 95.0 degrees Celsius
32
32
  min_plr: 0.0,
33
33
  max_plr: 1.2,
34
34
  opt_plr: 1.0,
@@ -48,6 +48,8 @@ class Standard
48
48
 
49
49
  if fuel_type.nil? || fuel_type == 'Gas'
50
50
  boiler.setFuelType('NaturalGas')
51
+ elsif fuel_type == 'Propane' || fuel_type == 'PropaneGas'
52
+ boiler.setFuelType('Propane')
51
53
  else
52
54
  boiler.setFuelType(fuel_type)
53
55
  end
@@ -71,23 +73,24 @@ class Standard
71
73
  end
72
74
 
73
75
  if model.version < OpenStudio::VersionString.new('3.0.0')
74
- if lvg_temp_dsgn.nil?
76
+ if lvg_temp_dsgn_f.nil?
75
77
  boiler.setDesignWaterOutletTemperature(OpenStudio.convert(180.0, 'F', 'C').get)
76
78
  else
77
- boiler.setDesignWaterOutletTemperature(OpenStudio.convert(lvg_temp_dsgn, 'F', 'C').get)
79
+ boiler.setDesignWaterOutletTemperature(OpenStudio.convert(lvg_temp_dsgn_f, 'F', 'C').get)
78
80
  end
79
81
  end
80
82
 
81
- if !out_temp_lmt.nil?
83
+ if out_temp_lmt_f.nil?
82
84
  boiler.setWaterOutletUpperTemperatureLimit(OpenStudio.convert(203.0, 'F', 'C').get)
83
85
  else
84
- boiler.setWaterOutletUpperTemperatureLimit(OpenStudio.convert(out_temp_lmt, 'F', 'C').get)
86
+ boiler.setWaterOutletUpperTemperatureLimit(OpenStudio.convert(out_temp_lmt_f, 'F', 'C').get)
85
87
  end
86
88
 
87
89
  # logic to set different defaults for condensing boilers if not specified
88
90
  if draft_type == 'Condensing'
89
91
  if model.version < OpenStudio::VersionString.new('3.0.0')
90
- boiler.setDesignWaterOutletTemperature(OpenStudio.convert(120.0, 'F', 'C').get) if lvg_temp_dsgn.nil?
92
+ # default to 120 degrees Fahrenheit (48.49 degrees Celsius)
93
+ boiler.setDesignWaterOutletTemperature(OpenStudio.convert(120.0, 'F', 'C').get) if lvg_temp_dsgn_f.nil?
91
94
  end
92
95
  boiler.setNominalThermalEfficiency(0.96) if nominal_thermal_efficiency.nil?
93
96
  end
@@ -44,22 +44,41 @@ class Standard
44
44
  if type == 'OS default'
45
45
  # use OS default curves
46
46
  else # default curve set
47
- clg_coil.setTotalCoolingCapacityCoefficient1(-4.30266987344639)
48
- clg_coil.setTotalCoolingCapacityCoefficient2(7.18536990534372)
49
- clg_coil.setTotalCoolingCapacityCoefficient3(-2.23946714486189)
50
- clg_coil.setTotalCoolingCapacityCoefficient4(0.139995928440879)
51
- clg_coil.setTotalCoolingCapacityCoefficient5(0.102660179888915)
52
- clg_coil.setSensibleCoolingCapacityCoefficient1(6.0019444814887)
53
- clg_coil.setSensibleCoolingCapacityCoefficient2(22.6300677244073)
54
- clg_coil.setSensibleCoolingCapacityCoefficient3(-26.7960783730934)
55
- clg_coil.setSensibleCoolingCapacityCoefficient4(-1.72374720346819)
56
- clg_coil.setSensibleCoolingCapacityCoefficient5(0.490644802367817)
57
- clg_coil.setSensibleCoolingCapacityCoefficient6(0.0693119353468141)
58
- clg_coil.setCoolingPowerConsumptionCoefficient1(-5.67775976415698)
59
- clg_coil.setCoolingPowerConsumptionCoefficient2(0.438988156976704)
60
- clg_coil.setCoolingPowerConsumptionCoefficient3(5.845277342193)
61
- clg_coil.setCoolingPowerConsumptionCoefficient4(0.141605667000125)
62
- clg_coil.setCoolingPowerConsumptionCoefficient5(-0.168727936032429)
47
+ if model.version < OpenStudio::VersionString.new('3.2.0')
48
+ clg_coil.setTotalCoolingCapacityCoefficient1(-4.30266987344639)
49
+ clg_coil.setTotalCoolingCapacityCoefficient2(7.18536990534372)
50
+ clg_coil.setTotalCoolingCapacityCoefficient3(-2.23946714486189)
51
+ clg_coil.setTotalCoolingCapacityCoefficient4(0.139995928440879)
52
+ clg_coil.setTotalCoolingCapacityCoefficient5(0.102660179888915)
53
+ clg_coil.setSensibleCoolingCapacityCoefficient1(6.0019444814887)
54
+ clg_coil.setSensibleCoolingCapacityCoefficient2(22.6300677244073)
55
+ clg_coil.setSensibleCoolingCapacityCoefficient3(-26.7960783730934)
56
+ clg_coil.setSensibleCoolingCapacityCoefficient4(-1.72374720346819)
57
+ clg_coil.setSensibleCoolingCapacityCoefficient5(0.490644802367817)
58
+ clg_coil.setSensibleCoolingCapacityCoefficient6(0.0693119353468141)
59
+ clg_coil.setCoolingPowerConsumptionCoefficient1(-5.67775976415698)
60
+ clg_coil.setCoolingPowerConsumptionCoefficient2(0.438988156976704)
61
+ clg_coil.setCoolingPowerConsumptionCoefficient3(5.845277342193)
62
+ clg_coil.setCoolingPowerConsumptionCoefficient4(0.141605667000125)
63
+ clg_coil.setCoolingPowerConsumptionCoefficient5(-0.168727936032429)
64
+ else
65
+ clg_coil.totalCoolingCapacityCurve.setCoefficient1Constant(-4.30266987344639)
66
+ clg_coil.totalCoolingCapacityCurve.setCoefficient2w(7.18536990534372)
67
+ clg_coil.totalCoolingCapacityCurve.setCoefficient3x(-2.23946714486189)
68
+ clg_coil.totalCoolingCapacityCurve.setCoefficient4y(0.139995928440879)
69
+ clg_coil.totalCoolingCapacityCurve.setCoefficient5z(0.102660179888915)
70
+ clg_coil.sensibleCoolingCapacityCurve.setCoefficient1Constant(6.0019444814887)
71
+ clg_coil.sensibleCoolingCapacityCurve.setCoefficient2v(22.6300677244073)
72
+ clg_coil.sensibleCoolingCapacityCurve.setCoefficient3w(-26.7960783730934)
73
+ clg_coil.sensibleCoolingCapacityCurve.setCoefficient4x(-1.72374720346819)
74
+ clg_coil.sensibleCoolingCapacityCurve.setCoefficient5y(0.490644802367817)
75
+ clg_coil.sensibleCoolingCapacityCurve.setCoefficient6z(0.0693119353468141)
76
+ clg_coil.coolingPowerConsumptionCurve.setCoefficient1Constant(-5.67775976415698)
77
+ clg_coil.coolingPowerConsumptionCurve.setCoefficient2w(0.438988156976704)
78
+ clg_coil.coolingPowerConsumptionCurve.setCoefficient3x(5.845277342193)
79
+ clg_coil.coolingPowerConsumptionCurve.setCoefficient4y(0.141605667000125)
80
+ clg_coil.coolingPowerConsumptionCurve.setCoefficient5z(-0.168727936032429)
81
+ end
63
82
  end
64
83
 
65
84
  return clg_coil
@@ -44,16 +44,29 @@ class Standard
44
44
  if type == 'OS default'
45
45
  # use OS default curves
46
46
  else # default curve set
47
- htg_coil.setHeatingCapacityCoefficient1(0.237847462869254)
48
- htg_coil.setHeatingCapacityCoefficient2(-3.35823796081626)
49
- htg_coil.setHeatingCapacityCoefficient3(3.80640467406376)
50
- htg_coil.setHeatingCapacityCoefficient4(0.179200417311554)
51
- htg_coil.setHeatingCapacityCoefficient5(0.12860719846082)
52
- htg_coil.setHeatingPowerConsumptionCoefficient1(-3.79175529243238)
53
- htg_coil.setHeatingPowerConsumptionCoefficient2(3.38799239505527)
54
- htg_coil.setHeatingPowerConsumptionCoefficient3(1.5022612076303)
55
- htg_coil.setHeatingPowerConsumptionCoefficient4(-0.177653510577989)
56
- htg_coil.setHeatingPowerConsumptionCoefficient5(-0.103079864171839)
47
+ if model.version < OpenStudio::VersionString.new('3.2.0')
48
+ htg_coil.setHeatingCapacityCoefficient1(0.237847462869254)
49
+ htg_coil.setHeatingCapacityCoefficient2(-3.35823796081626)
50
+ htg_coil.setHeatingCapacityCoefficient3(3.80640467406376)
51
+ htg_coil.setHeatingCapacityCoefficient4(0.179200417311554)
52
+ htg_coil.setHeatingCapacityCoefficient5(0.12860719846082)
53
+ htg_coil.setHeatingPowerConsumptionCoefficient1(-3.79175529243238)
54
+ htg_coil.setHeatingPowerConsumptionCoefficient2(3.38799239505527)
55
+ htg_coil.setHeatingPowerConsumptionCoefficient3(1.5022612076303)
56
+ htg_coil.setHeatingPowerConsumptionCoefficient4(-0.177653510577989)
57
+ htg_coil.setHeatingPowerConsumptionCoefficient5(-0.103079864171839)
58
+ else
59
+ htg_coil.heatingCapacityCurve.setCoefficient1Constant(0.237847462869254)
60
+ htg_coil.heatingCapacityCurve.setCoefficient2w(-3.35823796081626)
61
+ htg_coil.heatingCapacityCurve.setCoefficient3x(3.80640467406376)
62
+ htg_coil.heatingCapacityCurve.setCoefficient4y(0.179200417311554)
63
+ htg_coil.heatingCapacityCurve.setCoefficient5z(0.12860719846082)
64
+ htg_coil.heatingPowerConsumptionCurve.setCoefficient1Constant(-3.79175529243238)
65
+ htg_coil.heatingPowerConsumptionCurve.setCoefficient2w(3.38799239505527)
66
+ htg_coil.heatingPowerConsumptionCurve.setCoefficient3x(1.5022612076303)
67
+ htg_coil.heatingPowerConsumptionCurve.setCoefficient4y(-0.177653510577989)
68
+ htg_coil.heatingPowerConsumptionCurve.setCoefficient5z(-0.103079864171839)
69
+ end
57
70
  end
58
71
 
59
72
  return htg_coil
@@ -2692,6 +2692,42 @@ Standard.class_eval do
2692
2692
  return true
2693
2693
  end
2694
2694
 
2695
+ # Calculate a model's window or WWR
2696
+ # Disregard space conditioning (assume all spaces are conditioned)
2697
+ # which is true for most of not all prototypes
2698
+ #
2699
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
2700
+ # @param wwr [Boolean]
2701
+ # @return [Numeric] Returns window to wall ratio (percentage) or window area.
2702
+ def model_get_window_area_info(model, wwr = true)
2703
+
2704
+ window_area = 0
2705
+ wall_area = 0
2706
+
2707
+ model.getSpaces.each do |space|
2708
+ # Get zone multipler
2709
+ multiplier = space.thermalZone.get.multiplier
2710
+ space.surfaces.each do |surface|
2711
+ next if surface.surfaceType != 'Wall'
2712
+ next if surface.outsideBoundaryCondition != 'Outdoors'
2713
+
2714
+ # Get wall and window area
2715
+ wall_area += surface.grossArea * multiplier
2716
+ surface.subSurfaces.each do |subsurface|
2717
+ subsurface_type = subsurface.subSurfaceType.to_s.downcase
2718
+ # Do not count doors
2719
+ next unless (subsurface_type.include? 'window') || (subsurface_type.include? 'glass')
2720
+
2721
+ window_area += subsurface.grossArea * subsurface.multiplier * multiplier
2722
+ end
2723
+ end
2724
+ end
2725
+ return window_area / wall_area * 100 if wwr
2726
+
2727
+ # else
2728
+ return window_area
2729
+ end
2730
+
2695
2731
  # Calculate a model's window or WWR for a specific orientation
2696
2732
  # Disregard space conditioning (assume all spaces are conditioned)
2697
2733
  # which is true for most of not all prototypes
@@ -381,12 +381,13 @@ class Standard
381
381
  hpwh.setCondenserBottomLocation(h_condbot)
382
382
  hpwh.setCondenserTopLocation(h_condtop)
383
383
  hpwh.setTankElementControlLogic('MutuallyExclusive')
384
+ hpwh.autocalculateEvaporatorAirFlowRate
384
385
  elsif type == 'PumpedCondenser'
385
386
  hpwh.setDeadBandTemperatureDifference(3.89)
387
+ hpwh.autosizeEvaporatorAirFlowRate
386
388
  end
387
389
 
388
390
  # set heat pump water heater properties
389
- hpwh.setEvaporatorAirFlowRate(OpenStudio.convert(181.0, 'ft^3/min', 'm^3/s').get)
390
391
  hpwh.setFanPlacement('DrawThrough')
391
392
  hpwh.setOnCycleParasiticElectricLoad(0.0)
392
393
  hpwh.setOffCycleParasiticElectricLoad(0.0)
@@ -445,9 +446,10 @@ class Standard
445
446
  if type == 'WrappedCondenser'
446
447
  coil = hpwh.dXCoil.to_CoilWaterHeatingAirToWaterHeatPumpWrapped.get
447
448
  coil.setRatedCondenserWaterTemperature(48.89)
449
+ coil.autocalculateRatedEvaporatorAirFlowRate
448
450
  elsif type == 'PumpedCondenser'
449
- coil = OpenStudio::Model::CoilWaterHeatingAirToWaterHeatPump.new(model)
450
- hpwh.setDXCoil(coil)
451
+ coil = hpwh.dXCoil.to_CoilWaterHeatingAirToWaterHeatPump.get
452
+ coil.autosizeRatedEvaporatorAirFlowRate
451
453
  end
452
454
 
453
455
  # set coil properties
@@ -457,7 +459,6 @@ class Standard
457
459
  coil.setRatedSensibleHeatRatio(shr)
458
460
  coil.setRatedEvaporatorInletAirDryBulbTemperature(OpenStudio.convert(67.5, 'F', 'C').get)
459
461
  coil.setRatedEvaporatorInletAirWetBulbTemperature(OpenStudio.convert(56.426, 'F', 'C').get)
460
- coil.setRatedEvaporatorAirFlowRate(OpenStudio.convert(181.0, 'ft^3/min', 'm^3/s').get)
461
462
  coil.setEvaporatorFanPowerIncludedinRatedCOP(true)
462
463
  coil.setEvaporatorAirTemperatureTypeforCurveObjects('WetBulbTemperature')
463
464
  coil.setHeatingCapacityFunctionofTemperatureCurve(hpwh_cap)
@@ -507,8 +508,7 @@ class Standard
507
508
  tank.setSourceSideInletHeight(0)
508
509
  tank.setSourceSideOutletHeight(0)
509
510
  elsif type == 'PumpedCondenser'
510
- tank = OpenStudio::Model::WaterHeaterMixed.new(model)
511
- hpwh.setTank(tank)
511
+ tank = hpwh.tank.to_WaterHeaterMixed.get
512
512
  tank.setDeadbandTemperatureDifference(3.89)
513
513
  tank.setHeaterControlType('Cycle')
514
514
  tank.setHeaterMaximumCapacity(electric_backup_capacity)
@@ -24,7 +24,7 @@ class Standard
24
24
  # Creates a hot water loop with a boiler, district heating, or a water-to-water heat pump and adds it to the model.
25
25
  #
26
26
  # @param model [OpenStudio::Model::Model] OpenStudio model object
27
- # @param boiler_fuel_type [String] valid choices are Electricity, NaturalGas, PropaneGas, FuelOilNo1, FuelOilNo2, DistrictHeating, HeatPump
27
+ # @param boiler_fuel_type [String] valid choices are Electricity, NaturalGas, Propane, PropaneGas, FuelOilNo1, FuelOilNo2, DistrictHeating, HeatPump
28
28
  # @param ambient_loop [OpenStudio::Model::PlantLoop] The condenser loop for the heat pump. Only used when boiler_fuel_type is HeatPump.
29
29
  # @param system_name [String] the name of the system, or nil in which case it will be defaulted
30
30
  # @param dsgn_sup_wtr_temp [Double] design supply water temperature in degrees Fahrenheit, default 180F
@@ -128,17 +128,17 @@ class Standard
128
128
  when 'AirSourceHeatPump', 'ASHP'
129
129
  create_central_air_source_heat_pump(model, hot_water_loop)
130
130
  # Boiler
131
- when 'Electricity', 'Gas', 'NaturalGas', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
131
+ when 'Electricity', 'Gas', 'NaturalGas', 'Propane', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
132
132
  if boiler_lvg_temp_dsgn.nil?
133
- lvg_temp_dsgn = dsgn_sup_wtr_temp
133
+ lvg_temp_dsgn_f = dsgn_sup_wtr_temp
134
134
  else
135
- lvg_temp_dsgn = boiler_lvg_temp_dsgn
135
+ lvg_temp_dsgn_f = boiler_lvg_temp_dsgn
136
136
  end
137
137
 
138
138
  if boiler_out_temp_lmt.nil?
139
- out_temp_lmt = OpenStudio.convert(203.0, 'F', 'C').get
139
+ out_temp_lmt_f = 203.0
140
140
  else
141
- out_temp_lmt = boiler_out_temp_lmt
141
+ out_temp_lmt_f = boiler_out_temp_lmt
142
142
  end
143
143
 
144
144
  boiler = create_boiler_hot_water(model,
@@ -147,8 +147,8 @@ class Standard
147
147
  draft_type: boiler_draft_type,
148
148
  nominal_thermal_efficiency: 0.78,
149
149
  eff_curve_temp_eval_var: boiler_eff_curve_temp_eval_var,
150
- lvg_temp_dsgn: lvg_temp_dsgn,
151
- out_temp_lmt: out_temp_lmt,
150
+ lvg_temp_dsgn_f: lvg_temp_dsgn_f,
151
+ out_temp_lmt_f: out_temp_lmt_f,
152
152
  max_plr: boiler_max_plr,
153
153
  sizing_factor: boiler_sizing_factor)
154
154
 
@@ -803,13 +803,13 @@ class Standard
803
803
  when 'AirSourceHeatPump', 'ASHP'
804
804
  heating_equipment = create_central_air_source_heat_pump(model, heat_pump_water_loop)
805
805
  heating_equipment_stpt_manager.setName("#{heat_pump_water_loop.name} ASHP Scheduled Dual Setpoint")
806
- when 'Electricity', 'Gas', 'NaturalGas', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
806
+ when 'Electricity', 'Gas', 'NaturalGas', 'Propane', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
807
807
  heating_equipment = create_boiler_hot_water(model,
808
808
  hot_water_loop: heat_pump_water_loop,
809
809
  name: "#{heat_pump_water_loop.name} Supplemental Boiler",
810
810
  fuel_type: heating_fuel,
811
811
  flow_mode: 'ConstantFlow',
812
- lvg_temp_dsgn: 86.0,
812
+ lvg_temp_dsgn_f: 86.0, # 30.0 degrees Celsius
813
813
  min_plr: 0.0,
814
814
  max_plr: 1.2,
815
815
  opt_plr: 1.0)
@@ -4031,7 +4031,7 @@ class Standard
4031
4031
  high_temp_radiant = OpenStudio::Model::ZoneHVACHighTemperatureRadiant.new(model)
4032
4032
  high_temp_radiant.setName("#{zone.name} High Temp Radiant")
4033
4033
 
4034
- if heating_type.nil? || heating_type == 'Gas'
4034
+ if heating_type.nil? || heating_type == 'NaturalGas' || heating_type == 'Gas'
4035
4035
  high_temp_radiant.setFuelType('NaturalGas')
4036
4036
  else
4037
4037
  high_temp_radiant.setFuelType(heating_type)
@@ -4410,7 +4410,14 @@ class Standard
4410
4410
  # @param radiant_type [String] type of radiant system, floor or ceiling, to create in zone.
4411
4411
  # @param include_carpet [Bool] boolean to include thin carpet tile over radiant slab, default to true
4412
4412
  # @param carpet_thickness_in [Double] thickness of carpet in inches
4413
- # @param control_strategy [String] name of control strategy
4413
+ # @param model_occ_hr_start [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
4414
+ # Starting hour of building occupancy.
4415
+ # @param model_occ_hr_end [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
4416
+ # Ending hour of building occupancy.
4417
+ # @param control_strategy [String] name of control strategy. Options are 'proportional_control' and 'none'.
4418
+ # If control strategy is 'proportional_control', the method will apply the CBE radiant control sequences
4419
+ # detailed in Raftery et al. (2017), “A new control strategy for high thermal mass radiant systems”.
4420
+ # Otherwise no control strategy will be applied and the radiant system will assume the EnergyPlus default controls.
4414
4421
  # @param proportional_gain [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
4415
4422
  # Proportional gain constant (recommended 0.3 or less).
4416
4423
  # @param minimum_operation [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
@@ -4427,6 +4434,7 @@ class Standard
4427
4434
  # Only used if radiant_lockout is true
4428
4435
  # @return [Array<OpenStudio::Model::ZoneHVACLowTemperatureRadiantVariableFlow>] array of radiant objects.
4429
4436
  # @todo Once the OpenStudio API supports it, make chilled water loops optional for heating only systems
4437
+ # @todo Lookup occupany start and end hours from zone occupancy schedule
4430
4438
  def model_add_low_temp_radiant(model,
4431
4439
  thermal_zones,
4432
4440
  hot_water_loop,
@@ -4434,6 +4442,8 @@ class Standard
4434
4442
  radiant_type: 'floor',
4435
4443
  include_carpet: true,
4436
4444
  carpet_thickness_in: 0.25,
4445
+ model_occ_hr_start: 6.0,
4446
+ model_occ_hr_end: 18.0,
4437
4447
  control_strategy: 'proportional_control',
4438
4448
  proportional_gain: 0.3,
4439
4449
  minimum_operation: 1,
@@ -4743,6 +4753,8 @@ class Standard
4743
4753
  if control_strategy == 'proportional_control'
4744
4754
  model_add_radiant_proportional_controls(model, zone, radiant_loop,
4745
4755
  radiant_type: radiant_type,
4756
+ model_occ_hr_start: model_occ_hr_start,
4757
+ model_occ_hr_end: model_occ_hr_end,
4746
4758
  proportional_gain: proportional_gain,
4747
4759
  minimum_operation: minimum_operation,
4748
4760
  weekend_temperature_reset: weekend_temperature_reset,
@@ -5480,7 +5492,6 @@ class Standard
5480
5492
  ventilation.setSchedule(availability_schedule)
5481
5493
 
5482
5494
  if ventilation_type == 'Exhaust'
5483
- ventilation.setDesignFlowRateCalculationMethod('Flow/Zone')
5484
5495
  ventilation.setDesignFlowRate(flow_rate)
5485
5496
  ventilation.setFanPressureRise(31.1361206455786)
5486
5497
  ventilation.setFanTotalEfficiency(0.51)
@@ -5491,7 +5502,6 @@ class Standard
5491
5502
  ventilation.setMaximumIndoorTemperature(100.0)
5492
5503
  ventilation.setDeltaTemperature(-100.0)
5493
5504
  elsif ventilation_type == 'Natural'
5494
- ventilation.setDesignFlowRateCalculationMethod('Flow/Zone')
5495
5505
  ventilation.setDesignFlowRate(flow_rate)
5496
5506
  ventilation.setFanPressureRise(0.0)
5497
5507
  ventilation.setFanTotalEfficiency(1.0)
@@ -5502,7 +5512,6 @@ class Standard
5502
5512
  ventilation.setMaximumIndoorTemperature(29.4444452244559)
5503
5513
  ventilation.setDeltaTemperature(-100.0)
5504
5514
  elsif ventilation_type == 'Intake'
5505
- ventilation.setDesignFlowRateCalculationMethod('Flow/Area')
5506
5515
  ventilation.setFlowRateperZoneFloorArea(flow_rate)
5507
5516
  ventilation.setFanPressureRise(49.8)
5508
5517
  ventilation.setFanTotalEfficiency(0.53625)
@@ -5922,6 +5931,7 @@ class Standard
5922
5931
  if air_loop_heating_type == 'Water'
5923
5932
  hot_water_loop = model_get_or_add_hot_water_loop(model, main_heat_fuel,
5924
5933
  hot_water_loop_type: hot_water_loop_type)
5934
+ heating_type = 'Water'
5925
5935
  else
5926
5936
  hot_water_loop = nil
5927
5937
  end
@@ -30,7 +30,7 @@ def create_class_array
30
30
  'LargeOfficeDetailed',
31
31
  'Laboratory',
32
32
  'College',
33
- 'CourtHouse',
33
+ 'Courthouse',
34
34
  'TallBuilding',
35
35
  'SuperTallBuilding']
36
36
 
@@ -489,7 +489,7 @@ class Standard
489
489
  fan_pwr_limit_type = 'variable volume'
490
490
  elsif comp.to_AirLoopHVACUnitaryHeatCoolVAVChangeoverBypass.is_initialized
491
491
  fan = comp.to_AirLoopHVACUnitaryHeatCoolVAVChangeoverBypass.get.supplyAirFan
492
- if fan.to_FanConstantVolume.is_initialized || comp.to_FanOnOff.is_initialized
492
+ if fan.to_FanConstantVolume.is_initialized || fan.to_FanOnOff.is_initialized
493
493
  fan_pwr_limit_type = 'constant volume'
494
494
  elsif fan.to_FanVariableVolume.is_initialized
495
495
  fan_pwr_limit_type = 'variable volume'
@@ -1712,7 +1712,7 @@ class Standard
1712
1712
  heat_exchanger_air_to_air_sensible_and_latent_apply_prototype_nominal_electric_power(erv)
1713
1713
 
1714
1714
  # add economizer lockout
1715
- erv.setSupplyAirOutletTemperatureControl(false)
1715
+ erv.setSupplyAirOutletTemperatureControl(true)
1716
1716
  erv.setEconomizerLockout(true)
1717
1717
 
1718
1718
  # add defrost
@@ -103,7 +103,6 @@ class Standard
103
103
  # @param sql_db_vars_map [Hash] hash map
104
104
  # @return [Hash] hash of coil objects
105
105
  def coil_cooling_water_to_air_heat_pump_apply_efficiency_and_curves(coil_cooling_water_to_air_heat_pump, sql_db_vars_map)
106
- successfully_set_all_properties = true
107
106
 
108
107
  # Get the search criteria
109
108
  search_criteria = {}
@@ -116,8 +115,15 @@ class Standard
116
115
 
117
116
  # Check to make sure properties were found
118
117
  if coil_props.nil?
119
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingWaterToAirHeatPumpEquationFit', "For #{coil_cooling_water_to_air_heat_pump.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
120
- successfully_set_all_properties = false
118
+ # search again without capacity
119
+ matching_objects = model_find_objects(standards_data['water_source_heat_pumps'], search_criteria, nil, Date.today)
120
+ if matching_objects.size.zero?
121
+ # This proves that the search_criteria has issue finding the correct coil prop
122
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingWaterToAirHeatPumpEquationFit', "For #{coil_cooling_water_to_air_heat_pump.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
123
+ else
124
+ # Issue warning indicate the coil size is may be too large
125
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingWaterToAirHeatPumpEquationFit', "The capacity of the coil: #{coil_cooling_water_to_air_heat_pump.name} maybe too large to be found in the efficiency standard. The coil capacity is #{capacity_btu_per_hr} Btu/hr.")
126
+ end
121
127
  return sql_db_vars_map
122
128
  end
123
129
 
@@ -22,6 +22,8 @@ class Standard
22
22
  capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
23
23
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
24
24
 
25
+ return false unless capacity_btu_per_hr > 0
26
+
25
27
  # Get the boiler properties, if it exists for this template
26
28
  return false unless standards_data.include?('furnaces')
27
29
 
@@ -83,16 +83,22 @@ class Standard
83
83
  # and the R-value of the non-insulation layers and air films.
84
84
  # This is the desired R-value of the insulation.
85
85
  ins_r_value_si = target_r_value_si - other_layer_r_value_si
86
- if ins_r_value_si <= 0.0
87
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Construction', "Requested U-value of #{target_u_value_ip} for #{construction.name} is too low given the other materials in the construction; insulation layer will not be modified.")
88
- return false
89
- end
90
- ins_r_value_ip = OpenStudio.convert(ins_r_value_si, 'm^2*K/W', 'ft^2*h*R/Btu').get
91
86
 
92
87
  # Set the R-value of the insulation layer
93
- construction.layers.each do |layer|
88
+ construction.layers.each_with_index do |layer, l|
94
89
  next unless layer.name.get == insulation_layer_name
95
90
 
91
+ # Remove insulation layer if requested R-value is lower than sum of non-insulation materials
92
+ if ins_r_value_si <= 0.0
93
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Construction', "Requested U-value of #{target_u_value_ip} for #{construction.name} is too low given the other materials in the construction; insulation layer will be removed.")
94
+ construction.eraseLayer(l)
95
+ # Set the target R-value to the sum of other layers to make name match properties
96
+ target_r_value_ip = OpenStudio.convert(other_layer_r_value_si, 'm^2*K/W', 'ft^2*hr*R/Btu').get
97
+ break # Don't modify the insulation layer since it has been removed
98
+ end
99
+
100
+ # Modify the insulation layer
101
+ ins_r_value_ip = OpenStudio.convert(ins_r_value_si, 'm^2*K/W', 'ft^2*h*R/Btu').get
96
102
  if layer.to_StandardOpaqueMaterial.is_initialized
97
103
  layer = layer.to_StandardOpaqueMaterial.get
98
104
  layer.setThickness(ins_r_value_si * layer.conductivity)
@@ -2010,7 +2010,7 @@ class Standard
2010
2010
  if existing_sch.is_initialized
2011
2011
  existing_sch = existing_sch.get
2012
2012
  existing_day_sch_vals = existing_sch.defaultDaySchedule.values
2013
- if existing_day_sch_vals.size == 1 && existing_day_sch_vals[0] == value
2013
+ if existing_day_sch_vals.size == 1 && (existing_day_sch_vals[0] - value).abs < 1.0e-6
2014
2014
  return existing_sch
2015
2015
  end
2016
2016
  end
@@ -2524,12 +2524,28 @@ class Standard
2524
2524
  # which specifies properties by construction category by climate zone set.
2525
2525
  # AKA the info in Tables 5.5-1-5.5-8
2526
2526
 
2527
- props = model_find_object(standards_data['construction_properties'],
2528
- 'template' => template,
2529
- 'climate_zone_set' => climate_zone_set,
2530
- 'intended_surface_type' => intended_surface_type,
2531
- 'standards_construction_type' => standards_construction_type,
2532
- 'building_category' => building_category)
2527
+ wwr = model_get_percent_of_surface_range(model, intended_surface_type)
2528
+
2529
+ search_criteria = { 'template' => template,
2530
+ 'climate_zone_set' => climate_zone_set,
2531
+ 'intended_surface_type' => intended_surface_type,
2532
+ 'standards_construction_type' => standards_construction_type,
2533
+ 'building_category' => building_category }
2534
+
2535
+ if !wwr['minimum_percent_of_surface'].nil? && !wwr['maximum_percent_of_surface'].nil?
2536
+ search_criteria['minimum_percent_of_surface'] = wwr['minimum_percent_of_surface']
2537
+ search_criteria['maximum_percent_of_surface'] = wwr['maximum_percent_of_surface']
2538
+ end
2539
+
2540
+ # First search
2541
+ props = model_find_object(standards_data['construction_properties'], search_criteria)
2542
+
2543
+ if !props
2544
+ # Second search: In case need to use climate zone (e.g: 3) instead of sub-climate zone (e.g: 3A) for search
2545
+ climate_zone = climate_zone_set[0..-2]
2546
+ search_criteria['climate_zone_set'] = climate_zone
2547
+ props = model_find_object(standards_data['construction_properties'], search_criteria)
2548
+ end
2533
2549
 
2534
2550
  if !props
2535
2551
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Model', "Could not find construction properties for: #{template}-#{climate_zone_set}-#{intended_surface_type}-#{standards_construction_type}-#{building_category}.")
@@ -3602,6 +3618,12 @@ class Standard
3602
3618
  # switch to use this but update test in standards and measures to load this outside of the method
3603
3619
  construction_properties = model_find_object(standards_data['construction_properties'], search_criteria)
3604
3620
 
3621
+ if !construction_properties
3622
+ # Search again use climate zone (e.g. 3) instead of sub-climate zone (3A)
3623
+ search_criteria['climate_zone_set'] = climate_zone_set[0..-2]
3624
+ construction_properties = model_find_object(standards_data['construction_properties'], search_criteria)
3625
+ end
3626
+
3605
3627
  return construction_properties
3606
3628
  end
3607
3629
 
@@ -3962,6 +3984,9 @@ class Standard
3962
3984
 
3963
3985
  # Air loops
3964
3986
  model.getAirLoopHVACs.each(&:remove)
3987
+ if model.version > OpenStudio::VersionString.new('3.1.0')
3988
+ model.getAirLoopHVACDedicatedOutdoorAirSystems.each(&:remove)
3989
+ end
3965
3990
 
3966
3991
  # Zone equipment
3967
3992
  model.getThermalZones.sort.each do |zone|
@@ -4290,7 +4315,7 @@ class Standard
4290
4315
  # @param possible_climate_zone_sets [Array] climate zone sets
4291
4316
  # @return [String] climate zone ses
4292
4317
  def model_get_climate_zone_set_from_list(model, possible_climate_zone_sets)
4293
- climate_zone_set = possible_climate_zone_sets.min
4318
+ climate_zone_set = possible_climate_zone_sets.max
4294
4319
  return climate_zone_set
4295
4320
  end
4296
4321
 
@@ -5185,6 +5210,7 @@ class Standard
5185
5210
  electric = true
5186
5211
 
5187
5212
  if htg_fuels.include?('NaturalGas') ||
5213
+ htg_fuels.include?('Propane') ||
5188
5214
  htg_fuels.include?('PropaneGas') ||
5189
5215
  htg_fuels.include?('FuelOilNo1') ||
5190
5216
  htg_fuels.include?('FuelOilNo2') ||
@@ -5779,6 +5805,15 @@ class Standard
5779
5805
  return parametric_inputs
5780
5806
  end
5781
5807
 
5808
+ # Determine the surface range of a baseline model.
5809
+ # The method calculates the window to wall ratio (assuming all spaces are conditioned)
5810
+ # and select the range based on the calculated window to wall ratio
5811
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
5812
+ # @param intended_surface_type [String] surface type
5813
+ def model_get_percent_of_surface_range(model, intended_surface_type)
5814
+ return { 'minimum_percent_of_surface' => nil, 'maximum_percent_of_surface' => nil }
5815
+ end
5816
+
5782
5817
  # Default SAT reset type
5783
5818
  #
5784
5819
  # @param air_loop_hvac [OpenStudio::Model::AirLoopHVAC] air loop
@@ -92,6 +92,21 @@ class Standard
92
92
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlanarSurface', "Could not determine the standards fenestration type for #{planar_surface.name} from #{construction.name}. This surface will not have the standard applied.")
93
93
  return previous_construction_map
94
94
  end
95
+ # Exterior Doors
96
+ elsif surf_type == 'ExteriorDoor'
97
+ stds_type = standards_info.standardsConstructionType
98
+ if stds_type.is_initialized
99
+ stds_type = stds_type.get
100
+ case stds_type
101
+ when 'RollUp', 'Rollup', 'NonSwinging', 'Nonswinging'
102
+ stds_type = 'NonSwinging'
103
+ else
104
+ stds_type = 'Swinging'
105
+ end
106
+ else
107
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlanarSurface', "Could not determine the standards construction type for exterior door #{planar_surface.name}. This door will not have the standard applied.")
108
+ return previous_construction_map
109
+ end
95
110
  # All other surface types
96
111
  else
97
112
  stds_type = standards_info.standardsConstructionType
@@ -321,7 +321,7 @@ class Standard
321
321
  min_y_val = vertex.y
322
322
  end
323
323
  # Max y value
324
- if vertex.y > max_x_val
324
+ if vertex.y > max_y_val
325
325
  max_y_val = vertex.y
326
326
  end
327
327
  end
@@ -599,6 +599,13 @@ class Standard
599
599
  # switch to use this but update test in standards and measures to load this outside of the method
600
600
  construction_properties = model_find_object(standards_data['construction_properties'], search_criteria)
601
601
 
602
+ if !construction_properties
603
+ # Search again use climate zone (e.g. 3) instead of sub-climate zone (3A)
604
+ search_criteria['climate_zone_set'] = climate_zone_set[0..-2]
605
+ construction_properties = model_find_object(standards_data['construction_properties'], search_criteria)
606
+ end
607
+
608
+
602
609
  return construction_properties
603
610
  end
604
611
  end