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
@@ -1,122 +1,5 @@
1
-
2
1
  class NECB2020
3
2
 
4
- # Go through the default construction sets and hard-assigned
5
- # constructions. Clone the existing constructions and set their
6
- # intended surface type and standards construction type per
7
- # the PRM. For some standards, this will involve making
8
- # modifications. For others, it will not.
9
- #
10
- # 90.1-2007, 90.1-2010, 90.1-2013
11
- # @return [Boolean] returns true if successful, false if not
12
-
13
- def apply_standard_construction_properties(model:,
14
- necb_hdd: true,
15
- runner: nil,
16
- # ext surfaces
17
- ext_wall_cond: nil,
18
- ext_floor_cond: nil,
19
- ext_roof_cond: nil,
20
- # ground surfaces
21
- ground_wall_cond: nil,
22
- ground_floor_cond: nil,
23
- ground_roof_cond: nil,
24
- # fixed Windows
25
- fixed_window_cond: nil,
26
- fixed_wind_solar_trans: nil,
27
- fixed_wind_vis_trans: nil,
28
- # operable windows
29
- operable_wind_solar_trans: nil,
30
- operable_window_cond: nil,
31
- operable_wind_vis_trans: nil,
32
- # glass doors
33
- glass_door_cond: nil,
34
- glass_door_solar_trans: nil,
35
- glass_door_vis_trans: nil,
36
- # opaque doors
37
- door_construction_cond: nil,
38
- overhead_door_cond: nil,
39
- # skylights
40
- skylight_cond: nil,
41
- skylight_solar_trans: nil,
42
- skylight_vis_trans: nil,
43
- # tubular daylight dome
44
- tubular_daylight_dome_cond: nil,
45
- tubular_daylight_dome_solar_trans: nil,
46
- tubular_daylight_dome_vis_trans: nil,
47
- # tubular daylight diffuser
48
- tubular_daylight_diffuser_cond: nil,
49
- tubular_daylight_diffuser_solar_trans: nil,
50
- tubular_daylight_diffuser_vis_trans: nil)
51
-
52
- model.getDefaultConstructionSets.sort.each do |default_surface_construction_set|
53
- BTAP.runner_register('Info', 'apply_standard_construction_properties', runner)
54
- if model.weatherFile.empty? || model.weatherFile.get.path.empty? || !File.exist?(model.weatherFile.get.path.get.to_s)
55
-
56
- BTAP.runner_register('Error', 'Weather file is not defined. Please ensure the weather file is defined and exists.', runner)
57
- return false
58
- end
59
-
60
- # hdd required to get correct conductance values from the json file.
61
- hdd = get_necb_hdd18(model: model, necb_hdd: necb_hdd)
62
-
63
- # Lambdas are preferred over methods in methods for small utility methods.
64
- correct_cond = lambda do |conductivity, surface_type|
65
- return conductivity.nil? || conductivity.to_f <= 0.0 || conductivity == "NECB_Default" ? eval(model_find_objects(@standards_data['surface_thermal_transmittance'], surface_type)[0]['formula']) : conductivity.to_f
66
- end
67
-
68
- # Converts trans and vis to nil if requesting default.. or casts the string to a float.
69
- correct_vis_trans = lambda do |value|
70
- return value.nil? || value.to_f <= 0.0 || value == "NECB_Default" ? nil : value.to_f
71
- end
72
-
73
- BTAP::Resources::Envelope::ConstructionSets.customize_default_surface_construction_set!(model: model,
74
- name: "#{default_surface_construction_set.name.get} at hdd = #{hdd}",
75
- default_surface_construction_set: default_surface_construction_set,
76
- # ext surfaces
77
- ext_wall_cond: correct_cond.call(ext_wall_cond, {'boundary_condition' => 'Outdoors', 'surface' => 'Wall'}),
78
- ext_floor_cond: correct_cond.call(ext_floor_cond, {'boundary_condition' => 'Outdoors', 'surface' => 'Floor'}),
79
- ext_roof_cond: correct_cond.call(ext_roof_cond, {'boundary_condition' => 'Outdoors', 'surface' => 'RoofCeiling'}),
80
- # ground surfaces
81
- ground_wall_cond: correct_cond.call(ground_wall_cond, {'boundary_condition' => 'Ground', 'surface' => 'Wall'}),
82
- ground_floor_cond: correct_cond.call(ground_floor_cond, {'boundary_condition' => 'Ground', 'surface' => 'Floor'}),
83
- ground_roof_cond: correct_cond.call(ground_roof_cond, {'boundary_condition' => 'Ground', 'surface' => 'RoofCeiling'}),
84
- # fixed Windows
85
- fixed_window_cond: correct_cond.call(fixed_window_cond, {'boundary_condition' => 'Outdoors', 'surface' => 'Window'}),
86
- fixed_wind_solar_trans: correct_vis_trans.call(fixed_wind_solar_trans),
87
- fixed_wind_vis_trans: correct_vis_trans.call(fixed_wind_vis_trans),
88
- # operable windows
89
- operable_wind_solar_trans: correct_vis_trans.call(operable_wind_solar_trans),
90
- operable_window_cond: correct_cond.call(fixed_window_cond, {'boundary_condition' => 'Outdoors', 'surface' => 'Window'}),
91
- operable_wind_vis_trans: correct_vis_trans.call(operable_wind_vis_trans),
92
- # glass doors
93
- glass_door_cond: correct_cond.call(glass_door_cond, {'boundary_condition' => 'Outdoors', 'surface' => 'Window'}),
94
- glass_door_solar_trans: correct_vis_trans.call(glass_door_solar_trans),
95
- glass_door_vis_trans: correct_vis_trans.call(glass_door_vis_trans),
96
- # opaque doors
97
- door_construction_cond: correct_cond.call(door_construction_cond, {'boundary_condition' => 'Outdoors', 'surface' => 'Door'}),
98
- overhead_door_cond: correct_cond.call(overhead_door_cond, {'boundary_condition' => 'Outdoors', 'surface' => 'Door'}),
99
- # skylights
100
- skylight_cond: correct_cond.call(skylight_cond, {'boundary_condition' => 'Outdoors', 'surface' => 'Skylight'}),
101
- skylight_solar_trans: correct_vis_trans.call(skylight_solar_trans),
102
- skylight_vis_trans: correct_vis_trans.call(skylight_vis_trans),
103
- # tubular daylight dome
104
- tubular_daylight_dome_cond: correct_cond.call(skylight_cond, {'boundary_condition' => 'Outdoors', 'surface' => 'Skylight'}),
105
- tubular_daylight_dome_solar_trans: correct_vis_trans.call(tubular_daylight_dome_solar_trans),
106
- tubular_daylight_dome_vis_trans: correct_vis_trans.call(tubular_daylight_dome_vis_trans),
107
- # tubular daylight diffuser
108
- tubular_daylight_diffuser_cond: correct_cond.call(skylight_cond, {'boundary_condition' => 'Outdoors', 'surface' => 'Skylight'}),
109
- tubular_daylight_diffuser_solar_trans: correct_vis_trans.call(tubular_daylight_diffuser_solar_trans),
110
- tubular_daylight_diffuser_vis_trans: correct_vis_trans.call(tubular_daylight_diffuser_vis_trans)
111
- )
112
- end
113
- # sets all surfaces to use default constructions sets except adiabatic, where it does a hard assignment of the interior wall construction type.
114
- model.getPlanarSurfaces.sort.each(&:resetConstruction)
115
- # if the default construction set is defined..try to assign the interior wall to the adiabatic surfaces
116
- BTAP::Resources::Envelope.assign_interior_surface_construction_to_adiabatic_surfaces(model, nil)
117
- BTAP.runner_register('Info', ' apply_standard_construction_properties was sucessful.', runner)
118
- end
119
-
120
3
  # Set all external subsurfaces (doors, windows, skylights) to NECB values.
121
4
  # @author phylroy.lopez@nrcan.gc.ca
122
5
  # @param subsurface [String]
@@ -8,53 +8,84 @@
8
8
  "PCF 1537"
9
9
  ],
10
10
  "units": "W_per_m2_K",
11
- "table": [
12
- {
13
- "boundary_condition": "Outdoors",
14
- "surface": "Wall",
15
- "formula": "( hdd < 3000) ? 0.290 : ( hdd < 4000) ? 0.265 : ( hdd < 5000 ) ? 0.240 : ( hdd < 6000) ? 0.215 :( hdd < 7000) ? 0.190 : 0.165"
11
+ "table": {
12
+ "outdoors": {
13
+ "wall": {
14
+ "3000": 0.29,
15
+ "4000": 0.265,
16
+ "5000": 0.24,
17
+ "6000": 0.215,
18
+ "7000": 0.19,
19
+ "9999": 0.165
20
+ },
21
+ "roofceiling": {
22
+ "3000": 0.164,
23
+ "4000": 0.156,
24
+ "5000": 0.138,
25
+ "6000": 0.121,
26
+ "7000": 0.117,
27
+ "9999": 0.11
28
+ },
29
+ "floor": {
30
+ "3000": 0.193,
31
+ "4000": 0.175,
32
+ "5000": 0.156,
33
+ "6000": 0.138,
34
+ "7000": 0.121,
35
+ "9999": 0.117
36
+ },
37
+ "window": {
38
+ "3000": 1.9,
39
+ "4000": 1.9,
40
+ "5000": 1.73,
41
+ "6000": 1.73,
42
+ "7000": 1.44,
43
+ "9999": 1.44
44
+ },
45
+ "skylight": {
46
+ "3000": 2.69,
47
+ "4000": 2.69,
48
+ "5000": 2.41,
49
+ "6000": 2.41,
50
+ "7000": 2.01,
51
+ "9999": 2.01
52
+ },
53
+ "door": {
54
+ "3000": 2.12,
55
+ "4000": 1.9,
56
+ "5000": 1.9,
57
+ "6000": 1.9,
58
+ "7000": 1.9,
59
+ "9999": 1.44
60
+ }
16
61
  },
17
- {
18
- "boundary_condition": "Outdoors",
19
- "surface": "RoofCeiling",
20
- "formula": "( hdd < 3000) ? 0.164 : ( hdd < 4000) ? 0.156 : ( hdd < 5000 ) ? 0.138 : ( hdd < 6000) ? 0.121 :( hdd < 7000) ? 0.117 : 0.110"
21
- },
22
- {
23
- "boundary_condition": "Outdoors",
24
- "surface": "Floor",
25
- "formula": "( hdd < 3000) ? 0.193 : ( hdd < 4000) ? 0.175 : ( hdd < 5000 ) ? 0.156 : ( hdd < 6000) ? 0.138 :( hdd < 7000) ? 0.121 : 0.117"
26
- },
27
- {
28
- "boundary_condition": "Outdoors",
29
- "surface": "Window",
30
- "formula": "( hdd < 4000) ? 1.90 : ( hdd < 6000) ? 1.730 : 1.440"
31
- },
32
- {
33
- "boundary_condition": "Outdoors",
34
- "surface": "Skylight",
35
- "formula": "( hdd < 4000) ? 2.690 : ( hdd < 6000) ? 2.410 : 2.010"
36
- },
37
- {
38
- "boundary_condition": "Outdoors",
39
- "surface": "Door",
40
- "formula": "( hdd < 4000) ? 1.900 : ( hdd < 6000) ? 1.730 : 1.440"
41
- },
42
- {
43
- "boundary_condition": "Ground",
44
- "surface": "Wall",
45
- "formula": "( hdd < 3000) ? 0.568 : ( hdd < 4000) ? 0.379 : ( hdd < 7000) ? 0.284 : 0.210"
46
- },
47
- {
48
- "boundary_condition": "Ground",
49
- "surface": "RoofCeiling",
50
- "formula": "( hdd < 3000) ? 0.568 : ( hdd < 4000) ? 0.379 : ( hdd < 7000) ? 0.284 : 0.210"
51
- },
52
- {
53
- "boundary_condition": "Ground",
54
- "surface": "Floor",
55
- "formula": "( hdd < 7000) ? 0.757 : 0.379"
62
+ "ground": {
63
+ "wall": {
64
+ "3000": 0.568,
65
+ "4000": 0.379,
66
+ "5000": 0.284,
67
+ "6000": 0.284,
68
+ "7000": 0.284,
69
+ "9999": 0.21
70
+ },
71
+ "roofceiling": {
72
+ "3000": 0.568,
73
+ "4000": 0.379,
74
+ "5000": 0.284,
75
+ "6000": 0.284,
76
+ "7000": 0.284,
77
+ "9999": 0.21
78
+ },
79
+ "floor": {
80
+ "3000": 0.757,
81
+ "4000": 0.757,
82
+ "5000": 0.757,
83
+ "6000": 0.757,
84
+ "7000": 0.757,
85
+ "9999": 0.379
86
+ }
56
87
  }
57
- ]
88
+ }
58
89
  }
59
90
  }
60
91
  }
@@ -140,4 +140,222 @@ class NECB2020 < NECB2017
140
140
  infiltration.setSpace(space)
141
141
  return true
142
142
  end
143
+
144
+ # Generate NECB 2020 Performance Path compliance models (proposed and reference)
145
+ #
146
+ # This method implements the NECB 2020 Section 8.4 Performance Path by:
147
+ # 1. Documenting the proposed building characteristics per Section 8.4.3
148
+ # 2. Generating a reference building with prescriptive requirements per Section 8.4.4
149
+ # 3. Optionally running simulations and validating compliance per Section 8.4.1
150
+ # 4. Generating detailed HTML compliance reports with before/after logging
151
+ #
152
+ # @param proposed_model [OpenStudio::Model::Model] The proposed building model (input, not modified)
153
+ # @param epw_file [String] Path to EPW weather file
154
+ # @param sizing_run_dir [String] Directory for sizing runs (default: current directory)
155
+ # @param output_dir [String] Directory for output files (default: current directory)
156
+ # @param run_simulations [Boolean] Whether to run EnergyPlus simulations (default: false)
157
+ # @param html_report [Boolean] Whether to generate HTML report (default: true)
158
+ # @return [Hash] Results hash containing:
159
+ # - :proposed_model - The input proposed building model (unmodified)
160
+ # - :reference_model - Generated reference building model
161
+ # - :compliance_log - Structured compliance logger with all changes
162
+ # - :proposed_model_path - Path to saved proposed model copy
163
+ # - :reference_model_path - Path to saved reference model
164
+ # - :html_report_path - Path to HTML compliance report (if html_report: true)
165
+ # - :compliance_result - Compliance validation results (if run_simulations: true)
166
+ # - :building_energy_target - Building energy target from reference (if run_simulations: true)
167
+ # - :climate_zone - Climate zone for the location
168
+ # - :hdd18 - Heating degree days (base 18°C)
169
+ #
170
+ # @example Basic usage without simulations
171
+ # standard = Standard.build('NECB2020')
172
+ # result = standard.model_create_necb_2020_performance_compliance(
173
+ # proposed_model: model,
174
+ # epw_file: 'path/to/weather.epw'
175
+ # )
176
+ # puts "Reference model: #{result[:reference_model_path]}"
177
+ # puts "HTML report: #{result[:html_report_path]}"
178
+ #
179
+ # @example With simulations and compliance validation
180
+ # result = standard.model_create_necb_2020_performance_compliance(
181
+ # proposed_model: model,
182
+ # epw_file: 'path/to/weather.epw',
183
+ # run_simulations: true
184
+ # )
185
+ # if result[:compliance_result][:compliant]
186
+ # puts "Building is compliant!"
187
+ # end
188
+ #
189
+ def model_create_necb_2020_performance_compliance(proposed_model:,
190
+ epw_file:,
191
+ sizing_run_dir: Dir.pwd,
192
+ output_dir: Dir.pwd,
193
+ run_simulations: false,
194
+ html_report: true)
195
+
196
+ # Load required modules
197
+ require_relative 'performance_compliance/compliance_logger'
198
+ require_relative 'performance_compliance/proposed_builder'
199
+ require_relative 'performance_compliance/reference_builder'
200
+ require_relative 'performance_compliance/reference_hvac_selector'
201
+ require_relative 'performance_compliance/compliance_validator'
202
+ require_relative 'performance_compliance/compliance_report'
203
+
204
+ # Initialize logger
205
+ logger = OpenstudioStandards::NECB2020::ComplianceLogger.new
206
+
207
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.NECB2020',
208
+ 'Starting NECB 2020 Performance Path compliance generation')
209
+
210
+ # Get climate information
211
+ hdd18 = get_necb_hdd18(model: proposed_model)
212
+ climate_zone = get_climate_zone_name(hdd18)
213
+
214
+ logger.log_article(
215
+ article: '8.4.1.1',
216
+ action: 'Initialized NECB 2020 Performance Path compliance',
217
+ details: {
218
+ climate_zone: climate_zone,
219
+ hdd18: hdd18.round(0),
220
+ epw_file: File.basename(epw_file)
221
+ }
222
+ )
223
+
224
+ # Step 1: Document proposed building per Section 8.4.3
225
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.NECB2020',
226
+ 'Documenting proposed building characteristics (Section 8.4.3)')
227
+
228
+ proposed_builder = OpenstudioStandards::NECB2020::ProposedBuilder.new(proposed_model, logger)
229
+ proposed_characteristics = proposed_builder.document_all_characteristics
230
+
231
+ # Step 2: Generate reference building per Section 8.4.4
232
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.NECB2020',
233
+ 'Generating reference building (Section 8.4.4)')
234
+
235
+ reference_builder = OpenstudioStandards::NECB2020::ReferenceBuilder.new(
236
+ self, proposed_model, logger, epw_file
237
+ )
238
+ reference_model = reference_builder.generate_reference_building(sizing_run_dir: sizing_run_dir)
239
+
240
+ # Step 3: Save models
241
+ proposed_model_path = File.join(output_dir, 'proposed_building.osm')
242
+ reference_model_path = File.join(output_dir, 'reference_building.osm')
243
+
244
+ BTAP::FileIO.save_osm(proposed_model, proposed_model_path)
245
+ BTAP::FileIO.save_osm(reference_model, reference_model_path)
246
+
247
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.NECB2020',
248
+ "Saved proposed model to: #{proposed_model_path}")
249
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.NECB2020',
250
+ "Saved reference model to: #{reference_model_path}")
251
+
252
+ # Prepare results
253
+ results = {
254
+ proposed_model: proposed_model,
255
+ reference_model: reference_model,
256
+ compliance_log: logger,
257
+ proposed_model_path: proposed_model_path,
258
+ reference_model_path: reference_model_path,
259
+ climate_zone: climate_zone,
260
+ hdd18: hdd18,
261
+ epw_file: epw_file
262
+ }
263
+
264
+ # Step 4: Optional - Run simulations and validate compliance
265
+ if run_simulations
266
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.NECB2020',
267
+ 'Running simulations and validating compliance (Section 8.4.1)')
268
+
269
+ # Run proposed building simulation
270
+ proposed_sql_path = run_simulation_and_get_sql(
271
+ proposed_model,
272
+ epw_file,
273
+ File.join(output_dir, 'proposed_sim')
274
+ )
275
+
276
+ # Run reference building simulation
277
+ reference_sql_path = run_simulation_and_get_sql(
278
+ reference_model,
279
+ epw_file,
280
+ File.join(output_dir, 'reference_sim')
281
+ )
282
+
283
+ if proposed_sql_path && reference_sql_path
284
+ # Load SQL files
285
+ proposed_sql = OpenStudio::SqlFile.new(proposed_sql_path)
286
+ reference_sql = OpenStudio::SqlFile.new(reference_sql_path)
287
+
288
+ # Validate compliance
289
+ validator = OpenstudioStandards::NECB2020::ComplianceValidator.new(logger)
290
+ compliance_result = validator.validate_compliance(proposed_sql, reference_sql)
291
+
292
+ results[:compliance_result] = compliance_result
293
+ results[:building_energy_target] = compliance_result[:annual_energy][:building_energy_target_gj]
294
+
295
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.NECB2020',
296
+ "Compliance: #{compliance_result[:compliant] ? 'PASS' : 'FAIL'}")
297
+ else
298
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.NECB2020',
299
+ 'Simulations failed - compliance validation not performed')
300
+ end
301
+ end
302
+
303
+ # Step 5: Generate HTML report
304
+ if html_report
305
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.NECB2020',
306
+ 'Generating HTML compliance report')
307
+
308
+ report_data = {
309
+ climate_zone: climate_zone,
310
+ hdd18: hdd18,
311
+ epw_file: epw_file,
312
+ compliance_result: results[:compliance_result]
313
+ }
314
+
315
+ report_generator = OpenstudioStandards::NECB2020::ComplianceReportGenerator.new(logger, report_data)
316
+ report_path = File.join(output_dir, 'necb_2020_performance_compliance_report.html')
317
+ report_generator.save_report(report_path)
318
+
319
+ results[:html_report_path] = report_path
320
+
321
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.NECB2020',
322
+ "Saved HTML report to: #{report_path}")
323
+ end
324
+
325
+ # Final summary
326
+ summary = logger.get_summary
327
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.NECB2020',
328
+ "Compliance generation complete. Total entries: #{summary[:total_entries]}, " \
329
+ "Passed: #{summary[:passed]}, Failed: #{summary[:failed]}")
330
+
331
+ results
332
+ end
333
+
334
+ private
335
+
336
+ # Run EnergyPlus simulation and return SQL file path
337
+ #
338
+ # @param model [OpenStudio::Model::Model] Model to simulate
339
+ # @param epw_file [String] Weather file path
340
+ # @param run_dir [String] Directory for simulation files
341
+ # @return [String, nil] Path to SQL file, or nil if simulation failed
342
+ def run_simulation_and_get_sql(model, epw_file, run_dir)
343
+ # Create run directory
344
+ FileUtils.mkdir_p(run_dir)
345
+
346
+ # Save model
347
+ osm_path = File.join(run_dir, 'in.osm')
348
+ BTAP::FileIO.save_osm(model, osm_path)
349
+
350
+ # Run simulation
351
+ sql_path = model_run_simulation_and_log_errors(model, run_dir)
352
+
353
+ return sql_path if sql_path
354
+
355
+ nil
356
+ rescue StandardError => e
357
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.NECB2020',
358
+ "Simulation failed: #{e.message}")
359
+ nil
360
+ end
143
361
  end
@@ -1344,11 +1344,14 @@ OS:DefaultConstructionSet,
1344
1344
  , !- Building Shading Construction Name
1345
1345
  ; !- Site Shading Construction Name
1346
1346
 
1347
- OS:Material:NoMass,
1347
+ OS:Material,
1348
1348
  {8123ea19-659f-408b-9bbf-9d3d1a8354b5}, !- Handle
1349
1349
  Typical Carpet Pad, !- Name
1350
- Smooth, !- Roughness
1351
- 0.216479986995276, !- Thermal Resistance {m2-K/W}
1350
+ VeryRough, !- Roughness
1351
+ 0.01, !- Thickness {m}
1352
+ 0.06, !- Conductivity {W/m-K}
1353
+ 200, !- Density {kg/m3}
1354
+ 1360, !- Specific Heat {J/kg-K}
1352
1355
  0.9, !- Thermal Absorptance
1353
1356
  0.7, !- Solar Absorptance
1354
1357
  0.8; !- Visible Absorptance
@@ -1399,11 +1402,14 @@ OS:StandardsInformation:Construction,
1399
1402
  InteriorCeiling, !- Intended Surface Type
1400
1403
  ; !- Standards Construction Type
1401
1404
 
1402
- OS:Material:NoMass,
1405
+ OS:Material,
1403
1406
  {02547311-2903-4271-85c6-5ef37f49a4de}, !- Handle
1404
1407
  Typical Insulation, !- Name
1405
- Smooth, !- Roughness
1406
- 0.101874652714525, !- Thermal Resistance {m2-K/W}
1408
+ MediumSmooth, !- Roughness
1409
+ 0.005, !- Thickness {m}
1410
+ 0.038, !- Conductivity {W/m-K}
1411
+ 29, !- Density {kg/m3}
1412
+ 1210, !- Specific Heat {J/kg-K}
1407
1413
  0.9, !- Thermal Absorptance
1408
1414
  0.7, !- Solar Absorptance
1409
1415
  0.7; !- Visible Absorptance
@@ -2884,4 +2890,3 @@ OS:Rendering:Color,
2884
2890
  255, !- Rendering Red Value
2885
2891
  140, !- Rendering Green Value
2886
2892
  0; !- Rendering Blue Value
2887
-
@@ -107,7 +107,7 @@ class Standard
107
107
  OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.standard', "Loading JSON files from #{data_dir}")
108
108
  files = Dir.glob("#{data_dir}/data/*.json").select { |e| File.file? e }
109
109
  files.each do |file|
110
- data = JSON.parse(File.read(file))
110
+ data = JSON.parse(File.read(file, encoding: 'UTF-8'))
111
111
  data.each_pair do |key, objs|
112
112
  # Override the template in inherited files to match the instantiated template
113
113
  objs.each do |obj|
@@ -13,5 +13,5 @@ module OpenstudioStandards
13
13
  end
14
14
  return 'git-not-found-on-this-system'
15
15
  end
16
- VERSION = '0.8.5'.freeze
16
+ VERSION = '0.8.7'.freeze
17
17
  end
@@ -141,11 +141,19 @@ module OpenstudioStandards
141
141
 
142
142
  # BTAP (Natural Resources Canada)
143
143
  require_relative 'openstudio-standards/btap/btap'
144
- require_relative 'openstudio-standards/btap/common_paths'
144
+
145
+ # BTAP QAQC
146
+ require_relative "openstudio-standards/btap/qaqc/analysis.rb"
147
+ require_relative "openstudio-standards/btap/qaqc/data.rb"
148
+ require_relative "openstudio-standards/btap/qaqc/datapoint.rb"
149
+
150
+ # BTAP Costing
151
+ require_relative 'openstudio-standards/btap/costing/database'
145
152
  require_relative 'openstudio-standards/btap/costing/btap_costing'
146
153
  require_relative 'openstudio-standards/btap/carbon/btap_carbon'
147
154
  require_relative 'openstudio-standards/btap/costing/ventilation_costing'
148
155
  require_relative 'openstudio-standards/btap/costing/envelope_costing'
156
+ require_relative 'openstudio-standards/btap/costing/thermal_bridging_costing'
149
157
  require_relative 'openstudio-standards/btap/costing/lighting_costing'
150
158
  require_relative 'openstudio-standards/btap/costing/heating_cooling_costing'
151
159
  require_relative 'openstudio-standards/btap/costing/shw_costing'
@@ -215,9 +223,6 @@ module OpenstudioStandards
215
223
  # NECB QAQC
216
224
  require_relative "#{stds}/necb/NECB2011/qaqc/necb_qaqc.rb"
217
225
  require_relative "#{stds}/necb/NECB2015/qaqc/necb_2015_qaqc.rb"
218
- require_relative "#{stds}/necb/common/btap_analysis.rb"
219
- require_relative "#{stds}/necb/common/btap_data.rb"
220
- require_relative "#{stds}/necb/common/btap_datapoint.rb"
221
226
 
222
227
  # ECM development
223
228
  require_relative "#{stds}/necb/ECMS/ecms.rb"