openstudio-standards 0.8.5 → 0.8.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/test_performance_expected_dd_results.csv +90 -90
  3. data/lib/openstudio-standards/btap/activity.rb +858 -61
  4. data/lib/openstudio-standards/btap/attributes.rb +297 -103
  5. data/lib/openstudio-standards/btap/bridging.rb +1335 -593
  6. data/lib/openstudio-standards/btap/btap.rb +60 -181
  7. data/lib/openstudio-standards/btap/carbon/btap_carbon.rb +199 -142
  8. data/lib/openstudio-standards/btap/common/constructions.json +1275 -0
  9. data/lib/openstudio-standards/btap/common/costs.csv +1969 -0
  10. data/lib/openstudio-standards/btap/common/costs_local_factors.csv +2315 -0
  11. data/lib/openstudio-standards/btap/common/materials_glazing.csv +61 -0
  12. data/lib/openstudio-standards/btap/{common_resources → common}/materials_hvac.csv +1685 -1685
  13. data/lib/openstudio-standards/btap/{common_resources → common}/materials_lighting.csv +266 -266
  14. data/lib/openstudio-standards/btap/common/materials_opaque.csv +214 -0
  15. data/lib/openstudio-standards/btap/common/necb_building_types.csv +35 -0
  16. data/lib/openstudio-standards/btap/common/necb_space_types.csv +110 -0
  17. data/lib/openstudio-standards/btap/common/thermal_bridging.csv +73 -0
  18. data/lib/openstudio-standards/btap/costing/btap_costing.rb +346 -429
  19. data/lib/openstudio-standards/btap/costing/database.rb +104 -0
  20. data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +356 -344
  21. data/lib/openstudio-standards/btap/costing/dcv_costing.rb +282 -296
  22. data/lib/openstudio-standards/btap/costing/envelope_costing.rb +179 -192
  23. data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2477 -2316
  24. data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +127 -142
  25. data/lib/openstudio-standards/btap/costing/lighting_costing.rb +216 -198
  26. data/lib/openstudio-standards/btap/costing/nv_costing.rb +522 -523
  27. data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +649 -649
  28. data/lib/openstudio-standards/btap/costing/shw_costing.rb +626 -625
  29. data/lib/openstudio-standards/btap/costing/thermal_bridging_costing.rb +72 -0
  30. data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2363 -2361
  31. data/lib/openstudio-standards/btap/deprecated.rb +1033 -0
  32. data/lib/openstudio-standards/btap/envelope.rb +313 -572
  33. data/lib/openstudio-standards/btap/fileio.rb +152 -1070
  34. data/lib/openstudio-standards/btap/geometry.rb +486 -766
  35. data/lib/openstudio-standards/btap/linear_regression.rb +130 -0
  36. data/lib/openstudio-standards/btap/paths.rb +46 -0
  37. data/lib/openstudio-standards/btap/qaqc/analysis.rb +163 -0
  38. data/lib/openstudio-standards/btap/qaqc/data.rb +2293 -0
  39. data/lib/openstudio-standards/btap/qaqc/datapoint.rb +641 -0
  40. data/lib/openstudio-standards/btap/schedules.rb +11 -611
  41. data/lib/openstudio-standards/btap/structure.rb +574 -189
  42. data/lib/openstudio-standards/constructions/materials/information.rb +1 -1
  43. data/lib/openstudio-standards/create_typical/create_typical.rb +1 -1
  44. data/lib/openstudio-standards/exterior_lighting/create.rb +135 -85
  45. data/lib/openstudio-standards/exterior_lighting/data/typical_exterior_lighting.json +20 -0
  46. data/lib/openstudio-standards/exterior_lighting/information.rb +23 -2
  47. data/lib/openstudio-standards/geometry/create.rb +7 -3
  48. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +3 -2
  49. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +3 -2
  50. data/lib/openstudio-standards/prototypes/common/data/thermostat_schedule_lookup.json +84 -84
  51. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +4 -4
  52. data/lib/openstudio-standards/refrigeration/create_walkin.rb +45 -5
  53. data/lib/openstudio-standards/refrigeration/data/refrigerated_walkins.csv +75 -75
  54. data/lib/openstudio-standards/schedules/parametric.rb +6 -0
  55. data/lib/openstudio-standards/service_water_heating/create_typical.rb +10 -3
  56. data/lib/openstudio-standards/service_water_heating/create_water_heating_loop.rb +30 -14
  57. data/lib/openstudio-standards/service_water_heating/information.rb +4 -1
  58. data/lib/openstudio-standards/sql_file/unmet_hours.rb +2 -1
  59. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +3 -1
  60. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +3 -1
  61. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.boilers.json +12 -0
  62. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +18432 -3072
  63. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.boilers.json +26 -0
  64. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +8532 -1422
  65. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.boilers.json +26 -0
  66. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +8532 -1422
  67. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +16 -0
  68. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.computer_room_acs.json +30 -30
  69. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +7560 -1260
  70. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +1 -2
  71. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.boilers.json +16 -0
  72. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_properties.json +7560 -1260
  73. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +3 -3
  74. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +1 -2
  75. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.boilers.json +22 -0
  76. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_properties.json +7236 -1206
  77. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.furnaces.json +223 -19
  78. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +37 -1
  79. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.boilers.json +3 -0
  80. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.construction_properties.json +6900 -1150
  81. data/lib/openstudio-standards/standards/cbes/data/cbes.schedules.json +1 -1
  82. data/lib/openstudio-standards/standards/deer/data/deer.schedules.json +1 -1
  83. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/surface_thermal_transmittance.json +76 -40
  84. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/surface_thermal_transmittance.json +76 -40
  85. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +6 -4
  86. data/lib/openstudio-standards/standards/necb/NECB2011/NECB2011_QAQC.json +2988 -0
  87. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +25 -3
  88. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +672 -534
  89. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Hospital.osm +1791 -1792
  90. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LEEPMultiTower.osm +7 -1
  91. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LEEPTownHouse.osm +7 -1
  92. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LargeHotel.osm +5 -6
  93. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LargeOffice.osm +8 -9
  94. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernEducation.osm +10 -4
  95. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernHealthCare.osm +14 -15
  96. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Outpatient.osm +7 -1
  97. data/lib/openstudio-standards/standards/necb/NECB2011/data/surface_thermal_transmittance.json +76 -40
  98. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +14 -6
  99. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +542 -130
  100. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +30 -63
  101. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +7 -2
  102. data/lib/openstudio-standards/standards/necb/NECB2015/data/surface_thermal_transmittance.json +90 -0
  103. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +8 -6
  104. data/lib/openstudio-standards/standards/necb/NECB2017/data/surface_thermal_transmittance.json +76 -40
  105. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +2 -1
  106. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +0 -117
  107. data/lib/openstudio-standards/standards/necb/NECB2020/data/surface_thermal_transmittance.json +76 -45
  108. data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +218 -0
  109. data/lib/openstudio-standards/standards/necb/common/construction_defaults.osm +12 -7
  110. data/lib/openstudio-standards/standards/standard.rb +1 -1
  111. data/lib/openstudio-standards/version.rb +1 -1
  112. data/lib/openstudio-standards.rb +9 -4
  113. metadata +59 -66
  114. data/data/inventory/thermal_bridging.csv +0 -90
  115. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  116. data/data/standards/openstudio_standards_duplicates_log.csv +0 -7962
  117. data/lib/openstudio-standards/btap/NECB_building_types.csv +0 -35
  118. data/lib/openstudio-standards/btap/NECB_space_types.csv +0 -109
  119. data/lib/openstudio-standards/btap/WeatherData1.json +0 -2110
  120. data/lib/openstudio-standards/btap/WeatherData1.xlsx +0 -0
  121. data/lib/openstudio-standards/btap/btap_result.rb +0 -1144
  122. data/lib/openstudio-standards/btap/btap_test_helper.rb +0 -86
  123. data/lib/openstudio-standards/btap/common_paths.rb +0 -81
  124. data/lib/openstudio-standards/btap/common_resources/ConstructionProperties.csv +0 -52
  125. data/lib/openstudio-standards/btap/common_resources/Constructions.csv +0 -37
  126. data/lib/openstudio-standards/btap/common_resources/construction_sets.csv +0 -1270
  127. data/lib/openstudio-standards/btap/common_resources/constructions_glazing.csv +0 -121
  128. data/lib/openstudio-standards/btap/common_resources/constructions_opaque.csv +0 -2256
  129. data/lib/openstudio-standards/btap/common_resources/costs.csv +0 -1897
  130. data/lib/openstudio-standards/btap/common_resources/costs_local_factors.csv +0 -2315
  131. data/lib/openstudio-standards/btap/common_resources/materials_glazing.csv +0 -35
  132. data/lib/openstudio-standards/btap/common_resources/materials_opaque.csv +0 -164
  133. data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +0 -359
  134. data/lib/openstudio-standards/btap/costing/btap_workflow.rb +0 -117
  135. data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +0 -11
  136. data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +0 -136
  137. data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +0 -173
  138. data/lib/openstudio-standards/btap/costing/dummy.epw +0 -8768
  139. data/lib/openstudio-standards/btap/costing/dummy.osm +0 -5320
  140. data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +0 -42
  141. data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +0 -225
  142. data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +0 -28705
  143. data/lib/openstudio-standards/btap/costing/parallel_tests.rb +0 -92
  144. data/lib/openstudio-standards/btap/costing/test_list.txt +0 -15
  145. data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +0 -27
  146. data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +0 -80
  147. data/lib/openstudio-standards/btap/necb_2011_spacetype_info.csv +0 -225
  148. data/lib/openstudio-standards/btap/utilities/Add_template_field_to_json.rb +0 -22
  149. data/lib/openstudio-standards/btap/utilities/convert_surfaces_to_adiabatic_necb_8426.rb +0 -204
  150. data/lib/openstudio-standards/btap/utilities/generate_space_types.rb +0 -8
  151. data/lib/openstudio-standards/btap/utilities/necb_to_epw_map.rb +0 -50
  152. data/lib/openstudio-standards/btap/utilities/os_sim_extract.rb +0 -48
  153. data/lib/openstudio-standards/btap/utilities/rename_surfaces.rb +0 -24
  154. data/lib/openstudio-standards/btap/utilities/round_surf_coords.rb +0 -32
  155. data/lib/openstudio-standards/btap/utilities/sched_create.rb +0 -145
  156. data/lib/openstudio-standards/btap/utilities/set_mult_to_adiabatic.rb +0 -53
  157. data/lib/openstudio-standards/btap/utilities/space_type.rb +0 -78
  158. data/lib/openstudio-standards/btap/utilities/weatherData1_xlsx_to_json.rb +0 -56
  159. data/lib/openstudio-standards/btap/vintagizer.rb +0 -161
  160. data/lib/openstudio-standards/btap/visualization.rb +0 -72
  161. data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2011_spacetype_info.csv +0 -225
  162. data/lib/openstudio-standards/standards/necb/common/btap_analysis.rb +0 -79
  163. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +0 -2656
  164. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +0 -653
  165. data/lib/openstudio-standards/standards/necb/common/necb_reference_runs.csv +0 -28705
  166. data/lib/openstudio-standards/standards/necb/common/utility_pricing_2025-02-20.csv +0 -92
  167. /data/lib/openstudio-standards/btap/{common_resources → common}/carbon_frame.csv +0 -0
  168. /data/lib/openstudio-standards/btap/{common_resources → common}/carbon_glazing.csv +0 -0
  169. /data/lib/openstudio-standards/btap/{common_resources → common}/carbon_opaque.csv +0 -0
  170. /data/lib/openstudio-standards/btap/{common_resources → common}/hvac_vent_ahu.csv +0 -0
  171. /data/lib/openstudio-standards/btap/{common_resources → common}/lighting.csv +0 -0
  172. /data/lib/openstudio-standards/btap/{common_resources → common}/lighting_sets.csv +0 -0
  173. /data/lib/openstudio-standards/btap/{common_resources → common}/locations.csv +0 -0
  174. /data/lib/openstudio-standards/btap/{costing → common}/mech_sizing.json +0 -0
@@ -300,7 +300,7 @@ class NECB2011
300
300
  1 => province,
301
301
  2 => neb_fuel
302
302
  }
303
- row = look_up_csv_data(neb_prices_csv_file_name, search_info)
303
+ row = BTAP::Data.look_up_csv_data(neb_prices_csv_file_name, search_info)
304
304
  neb_fuel_cost = row['2020']
305
305
  fuel_consumption_gj = 0.0
306
306
  if neb_fuel == 'Electricity' || neb_fuel == 'Natural Gas'
@@ -325,7 +325,7 @@ class NECB2011
325
325
  # Fuel cost based local utility rates
326
326
  costing_rownames = model.sqlFile.get.execAndReturnVectorOfString("SELECT RowName FROM TabularDataWithStrings WHERE ReportName='LEEDsummary' AND ReportForString='Entire Facility' AND TableName='EAp2-7. Energy Cost Summary' AND ColumnName='Total Energy Cost'")
327
327
  #==> ["Electricity", "Natural Gas", "Additional", "Total"]
328
- costing_rownames = validate_optional(costing_rownames, model, 'N/A')
328
+ costing_rownames = BTAP::Data.validate_optional(costing_rownames, model, 'N/A')
329
329
  if costing_rownames != 'N/A'
330
330
  costing_rownames.each do |rowname|
331
331
  case rowname
@@ -418,22 +418,22 @@ class NECB2011
418
418
  qaqc[:service_water_heating] = {}
419
419
  qaqc[:service_water_heating][:total_nominal_occupancy] = -1
420
420
  # qaqc[:service_water_heating][:total_nominal_occupancy]=model.sqlFile().get().execAndReturnVectorOfDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='OutdoorAirSummary' AND ReportForString='Entire Facility' AND TableName='Average Outdoor Air During Occupied Hours' AND ColumnName='Nominal Number of Occupants'").get.inject(0, :+)
421
- qaqc[:service_water_heating][:total_nominal_occupancy] = get_total_nominal_capacity(model)
421
+ qaqc[:service_water_heating][:total_nominal_occupancy] = BTAP::Data.get_total_nominal_capacity(model)
422
422
 
423
423
  qaqc[:service_water_heating][:electricity_per_year] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND ColumnName='Electricity' AND RowName='Water Systems'")
424
- qaqc[:service_water_heating][:electricity_per_year] = validate_optional(qaqc[:service_water_heating][:electricity_per_year], model, -1)
424
+ qaqc[:service_water_heating][:electricity_per_year] = BTAP::Data.validate_optional(qaqc[:service_water_heating][:electricity_per_year], model, -1)
425
425
 
426
426
  qaqc[:service_water_heating][:electricity_per_day] = qaqc[:service_water_heating][:electricity_per_year] / 365.5
427
427
  qaqc[:service_water_heating][:electricity_per_day_per_occupant] = qaqc[:service_water_heating][:electricity_per_day] / qaqc[:service_water_heating][:total_nominal_occupancy]
428
428
 
429
429
  qaqc[:service_water_heating][:natural_gas_per_year] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND ColumnName='Natural Gas' AND RowName='Water Systems'")
430
- qaqc[:service_water_heating][:natural_gas_per_year] = validate_optional(qaqc[:service_water_heating][:natural_gas_per_year], model, -1)
430
+ qaqc[:service_water_heating][:natural_gas_per_year] = BTAP::Data.validate_optional(qaqc[:service_water_heating][:natural_gas_per_year], model, -1)
431
431
 
432
432
  qaqc[:service_water_heating][:additional_fuel_per_year] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND ColumnName='Additional Fuel' AND RowName='Water Systems'")
433
- qaqc[:service_water_heating][:additional_fuel_per_year] = validate_optional(qaqc[:service_water_heating][:additional_fuel_per_year], model, -1)
433
+ qaqc[:service_water_heating][:additional_fuel_per_year] = BTAP::Data.validate_optional(qaqc[:service_water_heating][:additional_fuel_per_year], model, -1)
434
434
 
435
435
  qaqc[:service_water_heating][:water_m3_per_year] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='AnnualBuildingUtilityPerformanceSummary' AND ReportForString='Entire Facility' AND TableName='End Uses' AND ColumnName='Water' AND RowName='Water Systems'")
436
- qaqc[:service_water_heating][:water_m3_per_year] = validate_optional(qaqc[:service_water_heating][:water_m3_per_year], model, -1)
436
+ qaqc[:service_water_heating][:water_m3_per_year] = BTAP::Data.validate_optional(qaqc[:service_water_heating][:water_m3_per_year], model, -1)
437
437
 
438
438
  qaqc[:service_water_heating][:water_m3_per_day] = qaqc[:service_water_heating][:water_m3_per_year] / 365.5
439
439
  qaqc[:service_water_heating][:water_m3_per_day_per_occupant] = qaqc[:service_water_heating][:water_m3_per_day] / qaqc[:service_water_heating][:total_nominal_occupancy]
@@ -636,7 +636,7 @@ class NECB2011
636
636
  error_warning << "space.spaceType.get.lights[0] is nil for Space:[#{space.name.get}] Space Type:[#{spaceinfo[:space_type_name]}]"
637
637
  else
638
638
  spaceinfo[:lighting_w_per_m2] = space.spaceType.get.lights[0].lightsDefinition.wattsperSpaceFloorArea # .get.round(3) unless space.spaceType.get.lights[0].nil?
639
- spaceinfo[:lighting_w_per_m2] = validate_optional(spaceinfo[:lighting_w_per_m2], model, -1.0)
639
+ spaceinfo[:lighting_w_per_m2] = BTAP::Data.validate_optional(spaceinfo[:lighting_w_per_m2], model, -1.0)
640
640
  unless spaceinfo[:lighting_w_per_m2].nil?
641
641
  spaceinfo[:lighting_w_per_m2] = spaceinfo[:lighting_w_per_m2].round(3)
642
642
  end
@@ -655,7 +655,7 @@ class NECB2011
655
655
  spaceinfo[:waterUseEquipment] << waterUseEquipment_info
656
656
  waterUseEquipment_info[:peak_flow_rate] = space.waterUseEquipment[0].waterUseEquipmentDefinition.peakFlowRate
657
657
  waterUseEquipment_info[:peak_flow_rate_per_area] = waterUseEquipment_info[:peak_flow_rate] / space.floorArea
658
- area_per_occ = space.spaceType.get.people[0].nil? ? 0.0 : validate_optional(space.spaceType.get.people[0].spaceFloorAreaPerPerson, model, -1.0)
658
+ area_per_occ = space.spaceType.get.people[0].nil? ? 0.0 : BTAP::Data.validate_optional(space.spaceType.get.people[0].spaceFloorAreaPerPerson, model, -1.0)
659
659
  # Watt per person = m3/s/m3 * 1000W/kW * (specific heat * dT) * m2/person
660
660
  waterUseEquipment_info[:shw_watts_per_person] = waterUseEquipment_info[:peak_flow_rate_per_area] * 1000 * (4.19 * 44.4) * 1000 * area_per_occ
661
661
  # puts waterUseEquipment_info[:shw_watts_per_ponce the erson]
@@ -727,12 +727,12 @@ class NECB2011
727
727
  air_loop.thermalZones.sort.each do |zone|
728
728
  air_loop_info[:thermal_zones] << zone.name.get
729
729
  vbz = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='Standard62.1Summary' AND ReportForString='Entire Facility' AND TableName='Zone Ventilation Parameters' AND ColumnName='Breathing Zone Outdoor Airflow - Vbz' AND Units='m3/s' AND RowName='#{zone.name.get.to_s.upcase}' ")
730
- vbz = validate_optional(vbz, model, 0)
730
+ vbz = BTAP::Data.validate_optional(vbz, model, 0)
731
731
  air_loop_info[:total_breathing_zone_outdoor_airflow_vbz] += vbz
732
732
  air_loop_info[:total_floor_area_served] += zone.floorArea * zone.multiplier.to_f
733
733
  end
734
734
  air_loop_info[:area_outdoor_air_rate_m3_per_s_m2] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='Standard62.1Summary' AND ReportForString='Entire Facility' AND TableName='System Ventilation Parameters' AND ColumnName='Area Outdoor Air Rate - Ra' AND Units='m3/s-m2' AND RowName='#{air_loop_info[:name].to_s.upcase}' ")
735
- air_loop_info[:area_outdoor_air_rate_m3_per_s_m2] = validate_optional(air_loop_info[:area_outdoor_air_rate_m3_per_s_m2], model, -1.0)
735
+ air_loop_info[:area_outdoor_air_rate_m3_per_s_m2] = BTAP::Data.validate_optional(air_loop_info[:area_outdoor_air_rate_m3_per_s_m2], model, -1.0)
736
736
 
737
737
  air_loop_info[:outdoor_air_L_per_s] = -1.0
738
738
  unless air_loop_info[:area_outdoor_air_rate_m3_per_s_m2] == -1.0
@@ -757,7 +757,7 @@ class NECB2011
757
757
  air_loop_info[:supply_fan][:max_air_flow_rate_m3_per_s] = -1.0
758
758
 
759
759
  max_air_flow_info = model.sqlFile.get.execAndReturnVectorOfString("SELECT RowName FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Fans' AND ColumnName='Max Air Flow Rate' AND Units='m3/s' ")
760
- max_air_flow_info = validate_optional(max_air_flow_info, model, 'N/A')
760
+ max_air_flow_info = BTAP::Data.validate_optional(max_air_flow_info, model, 'N/A')
761
761
  if max_air_flow_info == 'N/A'
762
762
  error_warning << "max_air_flow_info is nil because the following sql statement returned nil: RowName FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Fans' AND ColumnName='Max Air Flow Rate' AND Units='m3/s' "
763
763
  else
@@ -804,7 +804,7 @@ class NECB2011
804
804
  coil[:efficency] = gas.gasBurnerEfficiency
805
805
  # coil[:nominal_capacity]= gas.nominalCapacity()
806
806
  coil[:nominal_capacity] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Heating Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].to_s.upcase}'")
807
- coil[:nominal_capacity] = validate_optional(coil[:nominal_capacity], model, -1.0)
807
+ coil[:nominal_capacity] = BTAP::Data.validate_optional(coil[:nominal_capacity], model, -1.0)
808
808
  end
809
809
  if supply_comp.to_CoilHeatingElectric.is_initialized
810
810
  coil = {}
@@ -813,7 +813,7 @@ class NECB2011
813
813
  coil[:name] = electric.name.get
814
814
  coil[:type] = 'Electric'
815
815
  coil[:nominal_capacity] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Heating Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].to_s.upcase}'")
816
- coil[:nominal_capacity] = validate_optional(coil[:nominal_capacity], model, -1.0)
816
+ coil[:nominal_capacity] = BTAP::Data.validate_optional(coil[:nominal_capacity], model, -1.0)
817
817
  end
818
818
  if supply_comp.to_CoilHeatingWater.is_initialized
819
819
  coil = {}
@@ -822,7 +822,7 @@ class NECB2011
822
822
  coil[:name] = water.name.get
823
823
  coil[:type] = 'Water'
824
824
  coil[:nominal_capacity] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Heating Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].to_s.upcase}'")
825
- coil[:nominal_capacity] = validate_optional(coil[:nominal_capacity], model, -1.0)
825
+ coil[:nominal_capacity] = BTAP::Data.validate_optional(coil[:nominal_capacity], model, -1.0)
826
826
  end
827
827
  if supply_comp.to_HeatExchangerAirToAirSensibleAndLatent.is_initialized
828
828
  heatExchanger = supply_comp.to_HeatExchangerAirToAirSensibleAndLatent.get
@@ -841,7 +841,7 @@ class NECB2011
841
841
  coil[:name] = single_speed.name.get
842
842
  coil[:cop] = single_speed.ratedCOP.to_f
843
843
  coil[:nominal_total_capacity_w] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Cooling Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].upcase}' ")
844
- coil[:nominal_total_capacity_w] = validate_optional(coil[:nominal_total_capacity_w], model, -1.0)
844
+ coil[:nominal_total_capacity_w] = BTAP::Data.validate_optional(coil[:nominal_total_capacity_w], model, -1.0)
845
845
  end
846
846
  if supply_comp.to_CoilCoolingDXTwoSpeed.is_initialized
847
847
  coil = {}
@@ -851,7 +851,7 @@ class NECB2011
851
851
  coil[:cop_low] = two_speed.ratedLowSpeedCOP.to_f
852
852
  coil[:cop_high] = two_speed.ratedHighSpeedCOP.to_f
853
853
  coil[:nominal_total_capacity_w] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Cooling Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].upcase}' ")
854
- coil[:nominal_total_capacity_w] = validate_optional(coil[:nominal_total_capacity_w], model, -1.0)
854
+ coil[:nominal_total_capacity_w] = BTAP::Data.validate_optional(coil[:nominal_total_capacity_w], model, -1.0)
855
855
  end
856
856
  if supply_comp.to_CoilCoolingWater.is_initialized
857
857
  coil = {}
@@ -859,9 +859,9 @@ class NECB2011
859
859
  coil_cooling_water = supply_comp.to_CoilCoolingWater.get
860
860
  coil[:name] = coil_cooling_water.name.get
861
861
  coil[:nominal_total_capacity_w] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Cooling Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].upcase}' ")
862
- coil[:nominal_total_capacity_w] = validate_optional(coil[:nominal_total_capacity_w], model, -1.0)
862
+ coil[:nominal_total_capacity_w] = BTAP::Data.validate_optional(coil[:nominal_total_capacity_w], model, -1.0)
863
863
  coil[:nominal_sensible_heat_ratio] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Cooling Coils' AND ColumnName='Nominal Sensible Heat Ratio' AND RowName='#{coil[:name].upcase}' ")
864
- coil[:nominal_sensible_heat_ratio] = validate_optional(coil[:nominal_sensible_heat_ratio], model, -1.0)
864
+ coil[:nominal_sensible_heat_ratio] = BTAP::Data.validate_optional(coil[:nominal_sensible_heat_ratio], model, -1.0)
865
865
  end
866
866
  end
867
867
  qaqc[:air_loops] << air_loop_info
@@ -892,11 +892,11 @@ class NECB2011
892
892
  pump_info[:name] = pump.name.get
893
893
  pump_info[:type] = 'Pump:ConstantSpeed'
894
894
  pump_info[:head_pa] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Head' AND RowName='#{pump_info[:name].upcase}' ")
895
- pump_info[:head_pa] = validate_optional(pump_info[:head_pa], model, -1.0)
895
+ pump_info[:head_pa] = BTAP::Data.validate_optional(pump_info[:head_pa], model, -1.0)
896
896
  pump_info[:water_flow_m3_per_s] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Water Flow' AND RowName='#{pump_info[:name].upcase}' ")
897
- pump_info[:water_flow_m3_per_s] = validate_optional(pump_info[:water_flow_m3_per_s], model, -1.0)
897
+ pump_info[:water_flow_m3_per_s] = BTAP::Data.validate_optional(pump_info[:water_flow_m3_per_s], model, -1.0)
898
898
  pump_info[:electric_power_w] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Electric Power' AND RowName='#{pump_info[:name].upcase}' ")
899
- pump_info[:electric_power_w] = validate_optional(pump_info[:electric_power_w], model, -1.0)
899
+ pump_info[:electric_power_w] = BTAP::Data.validate_optional(pump_info[:electric_power_w], model, -1.0)
900
900
  pump_info[:motor_efficency] = pump.motorEfficiency
901
901
  end
902
902
 
@@ -908,11 +908,11 @@ class NECB2011
908
908
  pump_info[:name] = pump.name.get
909
909
  pump_info[:type] = 'Pump:VariableSpeed'
910
910
  pump_info[:head_pa] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Head' AND RowName='#{pump_info[:name].upcase}' ")
911
- pump_info[:head_pa] = validate_optional(pump_info[:head_pa], model, -1.0)
911
+ pump_info[:head_pa] = BTAP::Data.validate_optional(pump_info[:head_pa], model, -1.0)
912
912
  pump_info[:water_flow_m3_per_s] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Water Flow' AND RowName='#{pump_info[:name].upcase}' ")
913
- pump_info[:water_flow_m3_per_s] = validate_optional(pump_info[:water_flow_m3_per_s], model, -1.0)
913
+ pump_info[:water_flow_m3_per_s] = BTAP::Data.validate_optional(pump_info[:water_flow_m3_per_s], model, -1.0)
914
914
  pump_info[:electric_power_w] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Pumps' AND ColumnName='Electric Power' AND RowName='#{pump_info[:name].upcase}' ")
915
- pump_info[:electric_power_w] = validate_optional(pump_info[:electric_power_w], model, -1.0)
915
+ pump_info[:electric_power_w] = BTAP::Data.validate_optional(pump_info[:electric_power_w], model, -1.0)
916
916
  pump_info[:motor_efficency] = pump.motorEfficiency
917
917
  end
918
918
 
@@ -925,7 +925,7 @@ class NECB2011
925
925
  boiler_info[:type] = 'Boiler:HotWater'
926
926
  boiler_info[:fueltype] = boiler.fuelType
927
927
  boiler_info[:nominal_capacity] = boiler.nominalCapacity
928
- boiler_info[:nominal_capacity] = validate_optional(boiler_info[:nominal_capacity], model, -1.0)
928
+ boiler_info[:nominal_capacity] = BTAP::Data.validate_optional(boiler_info[:nominal_capacity], model, -1.0)
929
929
  end
930
930
 
931
931
  # Collect ChillerElectricEIR
@@ -935,7 +935,7 @@ class NECB2011
935
935
  plant_loop_info[:chiller_electric_eir] << chiller_info
936
936
  chiller_info[:name] = chiller.name.get
937
937
  chiller_info[:type] = 'Chiller:Electric:EIR'
938
- chiller_info[:reference_capacity] = validate_optional(chiller.referenceCapacity, model, -1.0)
938
+ chiller_info[:reference_capacity] = BTAP::Data.validate_optional(chiller.referenceCapacity, model, -1.0)
939
939
  chiller_info[:reference_leaving_chilled_water_temperature] = chiller.referenceLeavingChilledWaterTemperature
940
940
  end
941
941
 
@@ -946,7 +946,7 @@ class NECB2011
946
946
  plant_loop_info[:cooling_tower_single_speed] << coolingTower_info
947
947
  coolingTower_info[:name] = coolingTower.name.get
948
948
  coolingTower_info[:type] = 'CoolingTower:SingleSpeed'
949
- coolingTower_info[:fan_power_at_design_air_flow_rate] = validate_optional(coolingTower.fanPoweratDesignAirFlowRate, model, -1.0)
949
+ coolingTower_info[:fan_power_at_design_air_flow_rate] = BTAP::Data.validate_optional(coolingTower.fanPoweratDesignAirFlowRate, model, -1.0)
950
950
 
951
951
  end
952
952
 
@@ -964,7 +964,7 @@ class NECB2011
964
964
 
965
965
  qaqc[:eplusout_err] = {}
966
966
  warnings = model.sqlFile.get.execAndReturnVectorOfString("SELECT ErrorMessage FROM Errors WHERE ErrorType='0' ")
967
- warnings = validate_optional(warnings, model, 'N/A')
967
+ warnings = BTAP::Data.validate_optional(warnings, model, 'N/A')
968
968
  unless warnings == 'N/A'
969
969
  qaqc[:eplusout_err][:warnings] = model.sqlFile.get.execAndReturnVectorOfString("SELECT ErrorMessage FROM Errors WHERE ErrorType='0' ").get
970
970
  qaqc[:eplusout_err][:fatal] = model.sqlFile.get.execAndReturnVectorOfString("SELECT ErrorMessage FROM Errors WHERE ErrorType='2' ").get
@@ -1667,7 +1667,7 @@ class NECB2011
1667
1667
  spaces = zone.spaces()
1668
1668
  spaces.each do |z_space|
1669
1669
  spacetype = z_space.spaceType
1670
- spacetype = validate_optional(spacetype, model, nil)
1670
+ spacetype = BTAP::Data.validate_optional(spacetype, model, nil)
1671
1671
  if spacetype.nil?
1672
1672
  qaqc[:warnings] << "[necb_murb_hrv_compliance] Space [#{z_space.name}] does not have a SpaceType"
1673
1673
  else
@@ -1911,37 +1911,4 @@ class NECB2011
1911
1911
 
1912
1912
  raise ArgumentError, "invalid value for #{varname}: #{value}"
1913
1913
  end
1914
-
1915
- def look_up_csv_data(csv_fname, search_criteria)
1916
- options = { headers: :first_row,
1917
- converters: [:numeric] }
1918
- unless File.exist?(csv_fname)
1919
- raise "File: [#{csv_fname}] Does not exist"
1920
- end
1921
-
1922
- # we'll save the matches here
1923
- matches = nil
1924
- # save a copy of the headers
1925
- headers = nil
1926
- CSV.open(csv_fname, 'r', **options) do |csv|
1927
- # Since CSV includes Enumerable we can use 'find_all'
1928
- # which will return all the elements of the Enumerble for
1929
- # which the block returns true
1930
-
1931
- matches = csv.find_all do |row|
1932
- match = true
1933
- search_criteria.keys.each do |key|
1934
- match &&= (row[key].strip == search_criteria[key].strip)
1935
- end
1936
- match
1937
- end
1938
- headers = csv.headers
1939
- end
1940
- # puts matches
1941
- raise('More than one match') if matches.size > 1
1942
-
1943
- puts "Zero matches found for [#{search_criteria}]" if matches.empty?
1944
- # return matches[0]
1945
- return matches[0]
1946
- end
1947
1914
  end
@@ -250,10 +250,11 @@ class NECB2011
250
250
  space_peak_flow = 0
251
251
  data = nil
252
252
  space_type_name = space.spaceType.get.standardsSpaceType.get.to_s
253
+ space_type_building = space.spaceType.get.standardsBuildingType.get.to_s
253
254
  tank_temperature = 60
254
255
  # find the specific space_type properties from standard.json
255
256
  space_types_table.each do |space_type|
256
- if (space_type['building_type'] + ' ' + space_type_name) == (space_type['building_type'] + ' ' + space_type['space_type'])
257
+ if (space_type_building + ' ' + space_type_name) == (space_type['building_type'] + ' ' + space_type['space_type'])
257
258
  break if space_type['necb_hvac_system_selection_type'] == '- undefined -'
258
259
  # If there is no service hot water load.. Don't bother adding anything.
259
260
  break if (space_type['service_water_heating_peak_flow_per_area'].to_f == 0.0 && space_type['service_water_heating_peak_flow_rate'].to_f == 0.0) || space_type['service_water_heating_schedule'].nil?
@@ -360,7 +361,11 @@ class NECB2011
360
361
  # the hourly shw demand is for the following hour. It is meant to determine, of the peak hourly shw times, which has
361
362
  # the highest shw demand the following hour. This is used to determine shw capacity and volume.
362
363
  weekly_peak_flow.sort.each do |day_peak_sched|
363
- day_peak_sched[1].sort.each_with_index do |hour_flow, hour_index|
364
+ # NOTE: this previously iterated `day_peak_sched[1].sort` — the SORTED
365
+ # hourly array — while using the (sorted) index against the UNSORTED
366
+ # arrays below, so the "hour after the peak" was effectively an arbitrary
367
+ # hour. The hourly array is now iterated in hour order.
368
+ day_peak_sched[1].each_with_index do |hour_flow, hour_index|
364
369
  if hour_flow == peak_flow_sched
365
370
  if hour_index == 23
366
371
  next_hour_test = 0
@@ -0,0 +1,90 @@
1
+ {
2
+ "tables": {
3
+ "surface_thermal_transmittance": {
4
+ "data_type": "table",
5
+ "notes": "Requires hdd to be defined to be evaluated in code. Never have ground windows or doors.",
6
+ "refs": [
7
+
8
+ ],
9
+ "units": "W_per_m2_K",
10
+ "table": {
11
+ "outdoors": {
12
+ "wall": {
13
+ "3000": 0.315,
14
+ "4000": 0.278,
15
+ "5000": 0.247,
16
+ "6000": 0.21,
17
+ "7000": 0.21,
18
+ "9999": 0.183
19
+ },
20
+ "roofceiling": {
21
+ "3000": 0.227,
22
+ "4000": 0.183,
23
+ "5000": 0.183,
24
+ "6000": 0.162,
25
+ "7000": 0.162,
26
+ "9999": 0.142
27
+ },
28
+ "floor": {
29
+ "3000": 0.227,
30
+ "4000": 0.183,
31
+ "5000": 0.183,
32
+ "6000": 0.162,
33
+ "7000": 0.162,
34
+ "9999": 0.142
35
+ },
36
+ "window": {
37
+ "3000": 2.4,
38
+ "4000": 2.2,
39
+ "5000": 2.2,
40
+ "6000": 2.2,
41
+ "7000": 2.2,
42
+ "9999": 1.6
43
+ },
44
+ "skylight": {
45
+ "3000": 2.4,
46
+ "4000": 2.2,
47
+ "5000": 2.2,
48
+ "6000": 2.2,
49
+ "7000": 2.2,
50
+ "9999": 1.6
51
+ },
52
+ "door": {
53
+ "3000": 2.4,
54
+ "4000": 2.2,
55
+ "5000": 2.2,
56
+ "6000": 2.2,
57
+ "7000": 2.2,
58
+ "9999": 1.6
59
+ }
60
+ },
61
+ "ground": {
62
+ "wall": {
63
+ "3000": 0.568,
64
+ "4000": 0.379,
65
+ "5000": 0.284,
66
+ "6000": 0.284,
67
+ "7000": 0.284,
68
+ "9999": 0.21
69
+ },
70
+ "roofceiling": {
71
+ "3000": 0.568,
72
+ "4000": 0.379,
73
+ "5000": 0.284,
74
+ "6000": 0.284,
75
+ "7000": 0.284,
76
+ "9999": 0.21
77
+ },
78
+ "floor": {
79
+ "3000": 0.757,
80
+ "4000": 0.757,
81
+ "5000": 0.757,
82
+ "6000": 0.757,
83
+ "7000": 0.757,
84
+ "9999": 0.379
85
+ }
86
+ }
87
+ }
88
+ }
89
+ }
90
+ }
@@ -51,17 +51,18 @@ class NECB2015 < NECB2011
51
51
 
52
52
  def apply_loop_pump_power(model:, sizing_run_dir:)
53
53
  # NECB2015 Custom code
54
- # Do another sizing run to take into account adjustments to equipment efficiency etc. on capacities. This was done primarily
55
- # because the cooling tower loop capacity is affected by the chiller COP. If the chiller COP is not properly set then
56
- # the cooling tower loop capacity can be significantly off which will affect the NECB 2015 maximum loop pump capacity. Found
57
- # all sizing was off somewhat if the additional sizing run was not done.
54
+ # Do another sizing run to take into account adjustments to equipment
55
+ # efficiency etc. on capacities. This was done primarily because the cooling
56
+ # tower loop capacity is affected by the chiller COP. If the chiller COP is
57
+ # not properly set then the cooling tower loop capacity can be significantly
58
+ # off which will affect the NECB 2015 maximum loop pump capacity. Found all
59
+ # sizing was off somewhat if the additional sizing run was not done.
58
60
  if model_run_sizing_run(model, "#{sizing_run_dir}/SR2") == false
59
61
  raise('sizing run 2 failed!')
60
62
  end
61
63
 
62
64
  # Apply maxmimum loop pump power normalized by peak demand by served spaces as per NECB2015 5.2.6.3.(1)
63
65
  apply_maximum_loop_pump_power(model)
64
- # model = BTAP::FileIO::remove_duplicate_materials_and_constructions(model)
65
66
  return model
66
67
  end
67
68
 
@@ -73,7 +74,8 @@ class NECB2015 < NECB2011
73
74
  if standards_space_type.include? 'Atrium' # @todo Note that since none of the archetypes has Atrium, this was tested for 'Dining'. #Atrium
74
75
  puts "#{standards_space_type} - has atrium" # space_type.name.to_s
75
76
  # puts space_height
76
- if get_max_space_height_for_space_type(space_type: space_type) < 12.0
77
+ space_height = get_max_space_height_for_space_type(space_type: space_type)
78
+ if space_height < 12.0
77
79
  # @todo Regarding the below equations, identify which version of ASHRAE 90.1 was used in NECB2015.
78
80
  atrium_lpd_eq_smaller_12_intercept = 0
79
81
  atrium_lpd_eq_smaller_12_slope = 1.06
@@ -10,48 +10,84 @@
10
10
  "NECB2017_S_3.2.3.1"
11
11
  ],
12
12
  "units": "W_per_m2_K",
13
- "table": [
14
- {
15
- "boundary_condition": "Outdoors",
16
- "surface": "Wall",
17
- "formula": "( hdd < 3000) ? 0.315 : ( hdd < 4000) ? 0.278 : ( hdd < 5000 ) ? 0.247 : ( hdd < 6000) ? 0.210 :( hdd < 7000) ? 0.210 : 0.183"
13
+ "table": {
14
+ "outdoors": {
15
+ "wall": {
16
+ "3000": 0.315,
17
+ "4000": 0.278,
18
+ "5000": 0.247,
19
+ "6000": 0.21,
20
+ "7000": 0.21,
21
+ "9999": 0.183
22
+ },
23
+ "roofceiling": {
24
+ "3000": 0.193,
25
+ "4000": 0.156,
26
+ "5000": 0.156,
27
+ "6000": 0.138,
28
+ "7000": 0.138,
29
+ "9999": 0.121
30
+ },
31
+ "floor": {
32
+ "3000": 0.227,
33
+ "4000": 0.183,
34
+ "5000": 0.183,
35
+ "6000": 0.162,
36
+ "7000": 0.162,
37
+ "9999": 0.142
38
+ },
39
+ "window": {
40
+ "3000": 2.1,
41
+ "4000": 1.9,
42
+ "5000": 1.9,
43
+ "6000": 1.9,
44
+ "7000": 1.9,
45
+ "9999": 1.4
46
+ },
47
+ "skylight": {
48
+ "3000": 2.1,
49
+ "4000": 1.9,
50
+ "5000": 1.9,
51
+ "6000": 1.9,
52
+ "7000": 1.9,
53
+ "9999": 1.4
54
+ },
55
+ "door": {
56
+ "3000": 2.1,
57
+ "4000": 1.9,
58
+ "5000": 1.9,
59
+ "6000": 1.9,
60
+ "7000": 1.9,
61
+ "9999": 1.4
62
+ }
18
63
  },
19
- {
20
- "boundary_condition": "Outdoors",
21
- "surface": "RoofCeiling",
22
- "formula": "( hdd < 3000) ? 0.193 : ( hdd < 4000) ? 0.156 : ( hdd < 5000 ) ? 0.156 : ( hdd < 6000) ? 0.138 :( hdd < 7000) ? 0.138 : 0.121"
23
- },
24
- {
25
- "boundary_condition": "Outdoors",
26
- "surface": "Floor",
27
- "formula": "( hdd < 3000) ? 0.227 : ( hdd < 4000) ? 0.183 : ( hdd < 5000 ) ? 0.183 : ( hdd < 6000) ? 0.162 :( hdd < 7000) ? 0.162 : 0.142"
28
- },
29
- {
30
- "boundary_condition": "Outdoors",
31
- "surface": "Window",
32
- "formula": "( hdd < 3000) ? 2.100 : ( hdd < 7000) ? 1.900 : 1.400"
33
- },
34
- {
35
- "boundary_condition": "Outdoors",
36
- "surface": "Door",
37
- "formula": "( hdd < 3000) ? 2.100 : ( hdd < 7000) ? 1.900 : 1.400"
38
- },
39
- {
40
- "boundary_condition": "Ground",
41
- "surface": "Wall",
42
- "formula": "( hdd < 3000) ? 0.568 : ( hdd < 4000) ? 0.379 : ( hdd < 7000) ? 0.284 : 0.210"
43
- },
44
- {
45
- "boundary_condition": "Ground",
46
- "surface": "RoofCeiling",
47
- "formula": "( hdd < 3000) ? 0.568 : ( hdd < 4000) ? 0.379 : ( hdd < 7000) ? 0.284 : 0.210"
48
- },
49
- {
50
- "boundary_condition": "Ground",
51
- "surface": "Floor",
52
- "formula": "( hdd < 7000) ? 0.757 : 0.379"
64
+ "ground": {
65
+ "wall": {
66
+ "3000": 0.568,
67
+ "4000": 0.379,
68
+ "5000": 0.284,
69
+ "6000": 0.284,
70
+ "7000": 0.284,
71
+ "9999": 0.21
72
+ },
73
+ "roofceiling": {
74
+ "3000": 0.568,
75
+ "4000": 0.379,
76
+ "5000": 0.284,
77
+ "6000": 0.284,
78
+ "7000": 0.284,
79
+ "9999": 0.21
80
+ },
81
+ "floor": {
82
+ "3000": 0.757,
83
+ "4000": 0.757,
84
+ "5000": 0.757,
85
+ "6000": 0.757,
86
+ "7000": 0.757,
87
+ "9999": 0.379
88
+ }
53
89
  }
54
- ]
90
+ }
55
91
  }
56
92
  }
57
93
  }
@@ -52,7 +52,8 @@ class NECB2017 < NECB2015
52
52
  if standards_space_type.include? 'Atrium' # @todo Note that since none of the archetypes has Atrium, this was tested for 'Dining'. #Atrium
53
53
  puts "#{standards_space_type} - has atrium" # space_type.name.to_s
54
54
  # puts space_height
55
- if get_max_space_height_for_space_type(space_type: space_type) < 12.0
55
+ space_height = get_max_space_height_for_space_type(space_type: space_type)
56
+ if space_height < 12.0
56
57
  # @todo Regarding the below equations, identify which version of ASHRAE 90.1 was used in NECB2017.
57
58
  atrium_lpd_eq_smaller_12_intercept = 0
58
59
  atrium_lpd_eq_smaller_12_slope = 1.06