openstudio-standards 0.8.3 → 0.8.4
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.
- checksums.yaml +4 -4
- data/lib/openstudio-standards/btap/costing/README.md +502 -0
- data/lib/openstudio-standards/btap/costing/btap_costing.rb +473 -0
- data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +359 -0
- data/lib/openstudio-standards/btap/costing/btap_workflow.rb +117 -0
- data/lib/openstudio-standards/btap/costing/common_paths.rb +78 -0
- data/lib/openstudio-standards/btap/costing/common_resources/ConstructionProperties.csv +52 -0
- data/lib/openstudio-standards/btap/costing/common_resources/Constructions.csv +37 -0
- data/lib/openstudio-standards/btap/costing/common_resources/construction_sets.csv +1270 -0
- data/lib/openstudio-standards/btap/costing/common_resources/constructions_glazing.csv +61 -0
- data/lib/openstudio-standards/btap/costing/common_resources/constructions_opaque.csv +2256 -0
- data/lib/openstudio-standards/btap/costing/common_resources/costs.csv +1904 -0
- data/lib/openstudio-standards/btap/costing/common_resources/costs_local_factors.csv +2315 -0
- data/lib/openstudio-standards/btap/costing/common_resources/hvac_vent_ahu.csv +925 -0
- data/lib/openstudio-standards/btap/costing/common_resources/lighting.csv +364 -0
- data/lib/openstudio-standards/btap/costing/common_resources/lighting_sets.csv +2667 -0
- data/lib/openstudio-standards/btap/costing/common_resources/locations.csv +75 -0
- data/lib/openstudio-standards/btap/costing/common_resources/materials_glazing.csv +35 -0
- data/lib/openstudio-standards/btap/costing/common_resources/materials_hvac.csv +1699 -0
- data/lib/openstudio-standards/btap/costing/common_resources/materials_lighting.csv +267 -0
- data/lib/openstudio-standards/btap/costing/common_resources/materials_opaque.csv +164 -0
- data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +11 -0
- data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +136 -0
- data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +177 -0
- data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +353 -0
- data/lib/openstudio-standards/btap/costing/dcv_costing.rb +314 -0
- data/lib/openstudio-standards/btap/costing/dummy.epw +8768 -0
- data/lib/openstudio-standards/btap/costing/dummy.osm +5320 -0
- data/lib/openstudio-standards/btap/costing/envelope_costing.rb +284 -0
- data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2584 -0
- data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +155 -0
- data/lib/openstudio-standards/btap/costing/lighting_costing.rb +209 -0
- data/lib/openstudio-standards/btap/costing/mech_sizing.json +502 -0
- data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +42 -0
- data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +225 -0
- data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +28705 -0
- data/lib/openstudio-standards/btap/costing/nv_costing.rb +547 -0
- data/lib/openstudio-standards/btap/costing/parallel_tests.rb +92 -0
- data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +687 -0
- data/lib/openstudio-standards/btap/costing/shw_costing.rb +705 -0
- data/lib/openstudio-standards/btap/costing/test_list.txt +17 -0
- data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +26 -0
- data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +80 -0
- data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2616 -0
- data/lib/openstudio-standards/constructions/modify.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.Model.rb +39 -9
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +6 -1
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +2 -27
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +68 -27
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +64 -25
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +9 -14
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +46 -20
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +635 -248
- data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +43 -7
- data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartmentMult.osm +14272 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2015_table_c1.json +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +437 -437
- data/lib/openstudio-standards/standards/necb/NECB2011/data/systems.json +516 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/systems_including_sys5.json +588 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +489 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +16 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +48 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +2 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +35 -27
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +34 -23
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +8 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +42 -13
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +214 -25
- data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +61 -1
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +636 -636
- data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +38 -38
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +15 -6
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +636 -636
- data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +71 -71
- data/lib/openstudio-standards/standards/necb/README.md +343 -0
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +190 -28
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +14 -5
- data/lib/openstudio-standards/standards/necb/common/eccc_electric_grid_intensity_20250311.csv +14 -0
- data/lib/openstudio-standards/standards/necb/common/nir_gas_grid_intensity_20250311.csv +14 -0
- data/lib/openstudio-standards/standards/necb/common/system_types.yaml +0 -0
- data/lib/openstudio-standards/utilities/logging.rb +18 -14
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/modify.rb +2 -2
- data/lib/openstudio-standards.rb +12 -0
- metadata +53 -2
@@ -0,0 +1,359 @@
|
|
1
|
+
module BTAPMeasureHelper
|
2
|
+
###################Helper functions
|
3
|
+
|
4
|
+
# define the arguments that the user will input
|
5
|
+
def arguments(model)
|
6
|
+
args = OpenStudio::Measure::OSArgumentVector.new
|
7
|
+
|
8
|
+
if true == @use_json_package
|
9
|
+
#Set up package version of input.
|
10
|
+
json_default = {}
|
11
|
+
@measure_interface_detailed.each do |argument|
|
12
|
+
json_default[argument['name']] = argument["default_value"]
|
13
|
+
end
|
14
|
+
default = JSON.pretty_generate(json_default)
|
15
|
+
arg = OpenStudio::Ruleset::OSArgument.makeStringArgument('json_input', true)
|
16
|
+
arg.setDisplayName('Contains a json version of the input as a single package.')
|
17
|
+
arg.setDefaultValue(default)
|
18
|
+
args << arg
|
19
|
+
else
|
20
|
+
# Conductances for all surfaces and subsurfaces.
|
21
|
+
@measure_interface_detailed.each do |argument|
|
22
|
+
arg = nil
|
23
|
+
statement = nil
|
24
|
+
case argument['type']
|
25
|
+
when "String"
|
26
|
+
arg = OpenStudio::Ruleset::OSArgument.makeStringArgument(argument['name'], argument['is_required'])
|
27
|
+
arg.setDisplayName(argument['display_name'])
|
28
|
+
arg.setDefaultValue(argument['default_value'].to_s)
|
29
|
+
|
30
|
+
when "Double"
|
31
|
+
arg = OpenStudio::Ruleset::OSArgument.makeDoubleArgument(argument['name'], argument['is_required'])
|
32
|
+
arg.setDisplayName("#{argument['display_name']}")
|
33
|
+
arg.setDefaultValue("#{argument['default_value']}".to_f)
|
34
|
+
|
35
|
+
when "Choice"
|
36
|
+
arg = OpenStudio::Measure::OSArgument.makeChoiceArgument(argument['name'], argument['choices'], argument['is_required'])
|
37
|
+
arg.setDisplayName(argument['display_name'])
|
38
|
+
arg.setDefaultValue(argument['default_value'].to_s)
|
39
|
+
puts arg.defaultValueAsString
|
40
|
+
|
41
|
+
when "Bool"
|
42
|
+
arg = OpenStudio::Measure::OSArgument.makeBoolArgument(argument['name'], argument['is_required'])
|
43
|
+
arg.setDisplayName(argument['display_name'])
|
44
|
+
arg.setDefaultValue(argument['default_value'])
|
45
|
+
|
46
|
+
|
47
|
+
when "StringDouble"
|
48
|
+
if @use_string_double == false
|
49
|
+
arg = OpenStudio::Ruleset::OSArgument.makeDoubleArgument(argument['name'], argument['is_required'])
|
50
|
+
arg.setDefaultValue(argument['default_value'].to_f)
|
51
|
+
else
|
52
|
+
arg = OpenStudio::Ruleset::OSArgument.makeStringArgument(argument['name'], argument['is_required'])
|
53
|
+
arg.setDefaultValue(argument['default_value'].to_s)
|
54
|
+
end
|
55
|
+
arg.setDisplayName(argument['display_name'])
|
56
|
+
end
|
57
|
+
args << arg
|
58
|
+
end
|
59
|
+
end
|
60
|
+
return args
|
61
|
+
end
|
62
|
+
|
63
|
+
#returns a hash of the user inputs for you to use in your measure.
|
64
|
+
def get_hash_of_arguments(user_arguments, runner)
|
65
|
+
values = {}
|
66
|
+
if @use_json_package
|
67
|
+
return JSON.parse(runner.getStringArgumentValue('json_input', user_arguments))
|
68
|
+
else
|
69
|
+
|
70
|
+
@measure_interface_detailed.each do |argument|
|
71
|
+
|
72
|
+
case argument['type']
|
73
|
+
when "String", "Choice"
|
74
|
+
values[argument['name']] = runner.getStringArgumentValue(argument['name'], user_arguments)
|
75
|
+
when "Double"
|
76
|
+
values[argument['name']] = runner.getDoubleArgumentValue(argument['name'], user_arguments)
|
77
|
+
when "Bool"
|
78
|
+
values[argument['name']] = runner.getBoolArgumentValue(argument['name'], user_arguments)
|
79
|
+
when "StringDouble"
|
80
|
+
value = nil
|
81
|
+
if @use_string_double == false
|
82
|
+
value = (runner.getDoubleArgumentValue(argument['name'], user_arguments).to_f)
|
83
|
+
else
|
84
|
+
value = runner.getStringArgumentValue(argument['name'], user_arguments)
|
85
|
+
if valid_float?(value)
|
86
|
+
value = value.to_f
|
87
|
+
end
|
88
|
+
end
|
89
|
+
values[argument['name']] = value
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
return values
|
94
|
+
end
|
95
|
+
|
96
|
+
# boilerplate that validated ranges of inputs.
|
97
|
+
def validate_and_get_arguments_in_hash(model, runner, user_arguments)
|
98
|
+
return_value = true
|
99
|
+
values = get_hash_of_arguments(user_arguments, runner)
|
100
|
+
# use the built-in error checking
|
101
|
+
if !runner.validateUserArguments(arguments(model), user_arguments)
|
102
|
+
runner_register(runner, 'Error', "validateUserArguments failed... Check the argument definition for errors.")
|
103
|
+
return_value = false
|
104
|
+
end
|
105
|
+
|
106
|
+
# Validate arguments
|
107
|
+
errors = ""
|
108
|
+
@measure_interface_detailed.each do |argument|
|
109
|
+
case argument['type']
|
110
|
+
when "Double"
|
111
|
+
value = values[argument['name']]
|
112
|
+
if (not argument["max_double_value"].nil? and value.to_f > argument["max_double_value"].to_f) or
|
113
|
+
(not argument["min_double_value"].nil? and value.to_f < argument["min_double_value"].to_f)
|
114
|
+
error = "#{argument['name']} must be between #{argument["min_double_value"]} and #{argument["max_double_value"]}. You entered #{value.to_f} for this #{argument['name']}.\n Please enter a value withing the expected range.\n"
|
115
|
+
errors << error
|
116
|
+
end
|
117
|
+
when "StringDouble"
|
118
|
+
value = values[argument['name']]
|
119
|
+
if (not argument["valid_strings"].include?(value)) and (not valid_float?(value))
|
120
|
+
error = "#{argument['name']} must be a string that can be converted to a float, or one of these #{argument["valid_strings"]}. You have entered #{value}\n"
|
121
|
+
errors << error
|
122
|
+
elsif (not argument["max_double_value"].nil? and value.to_f > argument["max_double_value"]) or
|
123
|
+
(not argument["min_double_value"].nil? and value.to_f < argument["min_double_value"])
|
124
|
+
error = "#{argument['name']} must be between #{argument["min_double_value"]} and #{argument["max_double_value"]}. You entered #{value} for #{argument['name']}. Please enter a stringdouble value in the expected range.\n"
|
125
|
+
errors << error
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
#If any errors return false, else return the hash of argument values for user to use in measure.
|
130
|
+
if errors != ""
|
131
|
+
runner.registerError(errors)
|
132
|
+
return false
|
133
|
+
end
|
134
|
+
return values
|
135
|
+
end
|
136
|
+
|
137
|
+
# Helper method to see if str is a valid float.
|
138
|
+
def valid_float?(str)
|
139
|
+
!!Float(str) rescue false
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
|
144
|
+
module BTAPMeasureTestHelper
|
145
|
+
##### Helper methods Do notouch unless you know the consequences.
|
146
|
+
|
147
|
+
#Boiler plate to default values and number of arguments against what is in your test's setup method.
|
148
|
+
def test_arguments_and_defaults
|
149
|
+
[true, false].each do |json_input|
|
150
|
+
[true, false].each do |string_double|
|
151
|
+
@use_json_package = json_input
|
152
|
+
@use_string_double = string_double
|
153
|
+
|
154
|
+
# Create an instance of the measure
|
155
|
+
measure = get_measure_object()
|
156
|
+
measure.use_json_package = @use_json_package
|
157
|
+
measure.use_string_double = @use_string_double
|
158
|
+
model = OpenStudio::Model::Model.new
|
159
|
+
|
160
|
+
# Create an instance of a runner
|
161
|
+
runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
|
162
|
+
|
163
|
+
# Test arguments and defaults
|
164
|
+
arguments = measure.arguments(model)
|
165
|
+
#convert whatever the input was into a hash. Then test.
|
166
|
+
|
167
|
+
#check number of arguments.
|
168
|
+
if @use_json_package
|
169
|
+
assert_equal(@measure_interface_detailed.size, JSON.parse(arguments[0].defaultValueAsString).size, "The measure should have #{@measure_interface_detailed.size} but actually has #{arguments.size}. Here the the arguement expected #{@measure_interface_detailed} and this is the actual #{arguments}")
|
170
|
+
else
|
171
|
+
assert_equal(@measure_interface_detailed.size, arguments.size, "The measure should have #{@measure_interface_detailed.size} but actually has #{arguments.size}. Here the the arguement expected #{@measure_interface_detailed} and this is the actual #{arguments}")
|
172
|
+
(@measure_interface_detailed).each_with_index do |argument_expected, index|
|
173
|
+
assert_equal(argument_expected['name'], arguments[index].name, "Measure argument name of #{argument_expected['name']} was expected, but got #{arguments[index].name} instead.")
|
174
|
+
assert_equal(argument_expected['display_name'], arguments[index].displayName, "Display name for argument #{argument_expected['name']} was expected to be #{argument_expected['display_name']}, but got #{arguments[index].displayName} instead.")
|
175
|
+
case argument_type(arguments[index])
|
176
|
+
when "String", "Choice"
|
177
|
+
assert_equal(argument_expected['default_value'].to_s, arguments[index].defaultValueAsString, "The default value for argument #{argument_expected['name']} was #{argument_expected['default_value']}, but actual was #{arguments[index].defaultValueAsString}")
|
178
|
+
when "Double", "Integer"
|
179
|
+
assert_equal(argument_expected['default_value'].to_f, arguments[index].defaultValueAsDouble.to_f, "The default value for argument #{argument_expected['name']} was #{argument_expected['default_value']}, but actual was #{arguments[index].defaultValueAsString}")
|
180
|
+
when "Bool"
|
181
|
+
assert_equal(argument_expected['default_value'], arguments[index].defaultValueAsBool, "The default value for argument #{argument_expected['name']} was #{argument_expected['default_value']}, but actual was #{arguments[index].defaultValueAsString}")
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
# Test argument ranges.
|
190
|
+
def test_argument_ranges
|
191
|
+
[true, false].each do |json_input|
|
192
|
+
[true, false].each do |string_double|
|
193
|
+
@use_json_package = json_input
|
194
|
+
@use_string_double = string_double
|
195
|
+
(@measure_interface_detailed).each_with_index do |argument|
|
196
|
+
if argument['type'] == 'Double' or argument['type'] == 'StringDouble'
|
197
|
+
puts "testing range for #{argument['name']} "
|
198
|
+
#Check over max
|
199
|
+
if not argument['max_double_value'].nil?
|
200
|
+
puts "testing max limit"
|
201
|
+
model = OpenStudio::Model::Model.new
|
202
|
+
input_arguments = @good_input_arguments.clone
|
203
|
+
over_max_value = argument['max_double_value'].to_f + 1.0
|
204
|
+
over_max_value = over_max_value.to_s if argument['type'].downcase == "StringDouble".downcase
|
205
|
+
input_arguments[argument['name']] = over_max_value
|
206
|
+
puts "Testing argument #{argument['name']} max limit of #{argument['max_double_value']}"
|
207
|
+
input_arguments = {'json_input' => JSON.pretty_generate(input_arguments)} if @use_json_package
|
208
|
+
run_measure(input_arguments, model)
|
209
|
+
runner = run_measure(input_arguments, model)
|
210
|
+
assert(runner.result.value.valueName != 'Success', "Checks did not stop a lower than limit value of #{over_max_value} for #{argument['name']}")
|
211
|
+
puts "Success: Testing argument #{argument['name']} max limit of #{argument['max_double_value']}"
|
212
|
+
end
|
213
|
+
#Check over max
|
214
|
+
if not argument['min_double_value'].nil?
|
215
|
+
puts "testing min limit"
|
216
|
+
model = OpenStudio::Model::Model.new
|
217
|
+
input_arguments = @good_input_arguments.clone
|
218
|
+
over_min_value = argument['min_double_value'].to_f - 1.0
|
219
|
+
over_min_value = over_max_value.to_s if argument['type'].downcase == "StringDouble".downcase
|
220
|
+
input_arguments[argument['name']] = over_min_value
|
221
|
+
puts "Testing argument #{argument['name']} min limit of #{argument['min_double_value']}"
|
222
|
+
input_arguments = {'json_input' => JSON.pretty_generate(input_arguments)} if @use_json_package
|
223
|
+
runner = run_measure(input_arguments, model)
|
224
|
+
assert(runner.result.value.valueName != 'Success', "Checks did not stop a lower than limit value of #{over_min_value} for #{argument['name']}")
|
225
|
+
puts "Success:Testing argument #{argument['name']} min limit of #{argument['min_double_value']}"
|
226
|
+
end
|
227
|
+
|
228
|
+
end
|
229
|
+
if (argument['type'] == 'StringDouble') and (not argument["valid_strings"].nil?) and @use_string_double
|
230
|
+
model = OpenStudio::Model::Model.new
|
231
|
+
input_arguments = @good_input_arguments.clone
|
232
|
+
input_arguments[argument['name']] = SecureRandom.uuid.to_s
|
233
|
+
puts "Testing argument #{argument['name']} min limit of #{argument['min_double_value']}"
|
234
|
+
input_arguments = {'json_input' => JSON.pretty_generate(input_arguments)} if @use_json_package
|
235
|
+
runner = run_measure(input_arguments, model)
|
236
|
+
assert(runner.result.value.valueName != 'Success', "Checks did not stop a lower than limit value of #{over_min_value} for #{argument['name']}")
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
242
|
+
|
243
|
+
# helper method to create necb archetype as a starting point for testing.
|
244
|
+
def create_necb_protype_model(building_type, climate_zone, epw_file, template)
|
245
|
+
|
246
|
+
osm_directory = "#{Dir.pwd}/output/#{building_type}-#{template}-#{climate_zone}-#{epw_file}"
|
247
|
+
FileUtils.mkdir_p (osm_directory) unless Dir.exist?(osm_directory)
|
248
|
+
#Get Weather climate zone from lookup
|
249
|
+
weather = BTAP::Environment::WeatherFile.new(epw_file)
|
250
|
+
#create model
|
251
|
+
building_name = "#{template}_#{building_type}"
|
252
|
+
|
253
|
+
prototype_creator = Standard.build(template)
|
254
|
+
model = prototype_creator.model_create_prototype_model(
|
255
|
+
epw_file: epw_file,
|
256
|
+
sizing_run_dir: osm_directory,
|
257
|
+
debug: @debug,
|
258
|
+
template: template,
|
259
|
+
building_type: building_type)
|
260
|
+
|
261
|
+
#set weather file to epw_file passed to model.
|
262
|
+
weather.set_weather_file(model)
|
263
|
+
return model
|
264
|
+
end
|
265
|
+
|
266
|
+
# Custom way to run the measure in the test.
|
267
|
+
def run_measure(input_arguments, model)
|
268
|
+
|
269
|
+
# This will create a instance of the measure you wish to test. It does this based on the test class name.
|
270
|
+
measure = get_measure_object()
|
271
|
+
measure.use_json_package = @use_json_package
|
272
|
+
measure.use_string_double = @use_string_double
|
273
|
+
# Return false if can't
|
274
|
+
return false if false == measure
|
275
|
+
arguments = measure.arguments(model)
|
276
|
+
argument_map = OpenStudio::Measure.convertOSArgumentVectorToMap(arguments)
|
277
|
+
runner = OpenStudio::Measure::OSRunner.new(OpenStudio::WorkflowJSON.new)
|
278
|
+
#Check if
|
279
|
+
|
280
|
+
# Set the arguements in the argument map use json or real arguments.
|
281
|
+
if @use_json_package
|
282
|
+
argument = arguments[0].clone
|
283
|
+
assert(argument.setValue(input_arguments['json_input']), "Could not set value for 'json_input' to #{input_arguments['json_input']}")
|
284
|
+
argument_map['json_input'] = argument
|
285
|
+
else
|
286
|
+
input_arguments.each_with_index do |(key, value), index|
|
287
|
+
argument = arguments[index].clone
|
288
|
+
if argument_type(argument) == "Double"
|
289
|
+
#forces it to a double if it is a double.
|
290
|
+
assert(argument.setValue(value.to_f), "Could not set value for #{key} to #{value}")
|
291
|
+
else
|
292
|
+
assert(argument.setValue(value.to_s), "Could not set value for #{key} to #{value}")
|
293
|
+
end
|
294
|
+
argument_map[key] = argument
|
295
|
+
end
|
296
|
+
end
|
297
|
+
#run the measure
|
298
|
+
measure.run(model, runner, argument_map)
|
299
|
+
runner.result
|
300
|
+
return runner
|
301
|
+
end
|
302
|
+
|
303
|
+
|
304
|
+
#Fancy way of getting the measure object automatically.
|
305
|
+
def get_measure_object()
|
306
|
+
measure_class_name = self.class.name.to_s.match(/(BTAP.*)(\_Test)/i).captures[0]
|
307
|
+
measure = nil
|
308
|
+
eval "measure = #{measure_class_name}.new"
|
309
|
+
if measure.nil?
|
310
|
+
puts "Measure class #{measure_class_name} is invalid. Please ensure the test class name is of the form 'MeasureName_Test' "
|
311
|
+
return false
|
312
|
+
end
|
313
|
+
return measure
|
314
|
+
end
|
315
|
+
|
316
|
+
#Determines the OS argument type dynamically.
|
317
|
+
def argument_type(argument)
|
318
|
+
case argument.type.value
|
319
|
+
when 0
|
320
|
+
return "Bool"
|
321
|
+
when 1 #Double
|
322
|
+
return "Double"
|
323
|
+
when 2 #Quantity
|
324
|
+
return "Quantity"
|
325
|
+
when 3 #Integer
|
326
|
+
return "Integer"
|
327
|
+
when 4
|
328
|
+
return "String"
|
329
|
+
when 5 #Choice
|
330
|
+
return "Choice"
|
331
|
+
when 6 #Path
|
332
|
+
return "Path"
|
333
|
+
when 7 #Separator
|
334
|
+
return "Separator"
|
335
|
+
else
|
336
|
+
return "Blah"
|
337
|
+
end
|
338
|
+
end
|
339
|
+
|
340
|
+
# Valid float helper.
|
341
|
+
def valid_float?(str)
|
342
|
+
!!Float(str) rescue false
|
343
|
+
end
|
344
|
+
|
345
|
+
#Method does a deep copy of a model.
|
346
|
+
def copy_model(model)
|
347
|
+
copy_model = OpenStudio::Model::Model.new
|
348
|
+
# remove existing objects from model
|
349
|
+
handles = OpenStudio::UUIDVector.new
|
350
|
+
copy_model.objects.each do |obj|
|
351
|
+
handles << obj.handle
|
352
|
+
end
|
353
|
+
copy_model.removeObjects(handles)
|
354
|
+
# put contents of new_model into model_to_replace
|
355
|
+
copy_model.addObjects(model.toIdfFile.objects)
|
356
|
+
return copy_model
|
357
|
+
end
|
358
|
+
|
359
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require_relative '../../../../lib/openstudio-standards.rb'
|
2
|
+
|
3
|
+
class BTAPWorkflow
|
4
|
+
attr_accessor :workflow
|
5
|
+
|
6
|
+
def initialize(measures_folder: File.join(__dir__, '../../measures'))
|
7
|
+
@model = nil
|
8
|
+
@run_dir = nil
|
9
|
+
@sql_path = nil
|
10
|
+
@idf_name = 'in.idf'
|
11
|
+
@osm_name = 'in.osm'
|
12
|
+
@osw_name = 'out.osw'
|
13
|
+
@epw_path = 'in.epw'
|
14
|
+
@workflow = OpenStudio::WorkflowJSON.new
|
15
|
+
@workflow.addMeasurePath(measures_folder)
|
16
|
+
@run_cli_verbose = true
|
17
|
+
@os_measures = []
|
18
|
+
@ep_measures = []
|
19
|
+
@report_measures = []
|
20
|
+
end
|
21
|
+
|
22
|
+
def set_run_dir(run_dir: "#{Dir.pwd}/Run")
|
23
|
+
puts "set run folder to #{run_dir}"
|
24
|
+
@run_dir = run_dir
|
25
|
+
@sql_path = OpenStudio::Path.new("#{@run_dir}/run/eplusout.sql")
|
26
|
+
return self
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_os_measure(measure)
|
30
|
+
@os_measures << measure
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_ep_measure(measure)
|
34
|
+
@ep_measures << measure
|
35
|
+
end
|
36
|
+
|
37
|
+
def add_reporting_measure(measure)
|
38
|
+
@report_measures << measure
|
39
|
+
return self
|
40
|
+
end
|
41
|
+
|
42
|
+
def add_measures_to_workflow
|
43
|
+
unless @os_measures.empty?
|
44
|
+
measure_type = OpenStudio::MeasureType.new("ModelMeasure")
|
45
|
+
@workflow.setMeasureSteps(measure_type, @os_measures)
|
46
|
+
end
|
47
|
+
unless @ep_measures.empty?
|
48
|
+
measure_type = OpenStudio::MeasureType.new("EnergyPlusMeasure")
|
49
|
+
@workflow.setMeasureSteps(measure_type, @ep_measures)
|
50
|
+
end
|
51
|
+
unless @report_measures.empty?
|
52
|
+
measure_type = OpenStudio::MeasureType.new("ReportingMeasure")
|
53
|
+
@workflow.setMeasureSteps(measure_type, @report_measures)
|
54
|
+
end
|
55
|
+
@workflow
|
56
|
+
return self
|
57
|
+
end
|
58
|
+
|
59
|
+
def add_btap_create_necb_prototype_building_measure(building_type:, epw_file:, template:, primary_heating_fuel:)
|
60
|
+
os_measure_type = OpenStudio::MeasureType.new("ModelMeasure")
|
61
|
+
create_prototype_measure = OpenStudio::MeasureStep.new("btap_create_necb_prototype_building")
|
62
|
+
create_prototype_measure.setName("btap_create_necb_prototype_building")
|
63
|
+
create_prototype_measure.setArgument('building_type', building_type)
|
64
|
+
create_prototype_measure.setArgument('epw_file', epw_file)
|
65
|
+
create_prototype_measure.setArgument('template', template)
|
66
|
+
create_prototype_measure.setArgument('primary_heating_fuel', primary_heating_fuel)
|
67
|
+
@os_measures << create_prototype_measure
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
def add_btap_results_measure
|
72
|
+
reporting_measure_type = OpenStudio::MeasureType.new("ReportingMeasure")
|
73
|
+
btap_results = OpenStudio::MeasureStep.new("btap_results")
|
74
|
+
btap_results.setName("btap_results")
|
75
|
+
btap_results.setArgument('generate_hourly_report', 'false')
|
76
|
+
btap_results.setArgument('output_diet', false)
|
77
|
+
btap_results.setArgument('envelope_costing', true)
|
78
|
+
btap_results.setArgument('lighting_costing', true)
|
79
|
+
btap_results.setArgument('boilers_costing', true)
|
80
|
+
btap_results.setArgument('chillers_costing', true)
|
81
|
+
btap_results.setArgument('cooling_towers_costing', true)
|
82
|
+
btap_results.setArgument('shw_costing', true)
|
83
|
+
btap_results.setArgument('ventilation_costing', true)
|
84
|
+
btap_results.setArgument('zone_system_costing', true)
|
85
|
+
@report_measures << btap_results
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def run_command(command:)
|
90
|
+
stdout_str, stderr_str, status = Open3.capture3({}, command)
|
91
|
+
if status.success?
|
92
|
+
puts "Command completed successfully"
|
93
|
+
puts "stdout: #{stdout_str}"
|
94
|
+
puts "stderr: #{stderr_str}"
|
95
|
+
return true
|
96
|
+
else
|
97
|
+
puts "Error running command: '#{command}'"
|
98
|
+
puts "stdout: #{stdout_str}"
|
99
|
+
puts "stderr: #{stderr_str}"
|
100
|
+
return false
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def run_workflow(postprocess_only: nil, osw_path:)
|
105
|
+
#command to run workflow
|
106
|
+
os_ruby_cli = "bundle exec ruby #{File.join(File.dirname(OpenStudio.getOpenStudioCLI.to_s), '..', 'Ruby', 'openstudio_cli.rb')}"
|
107
|
+
extra_args = ' --postprocess_only ' if postprocess_only == true
|
108
|
+
cmd = "#{os_ruby_cli} run #{extra_args} --debug --workflow \"#{osw_path}\""
|
109
|
+
puts "running cli command: #{cmd}"
|
110
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "running cli command: #{cmd}")
|
111
|
+
self.run_command(command: cmd)
|
112
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished cli run.')
|
113
|
+
#Ensure items are written to disk.
|
114
|
+
sleep 3
|
115
|
+
return true
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
|
3
|
+
class CommonPaths
|
4
|
+
include Singleton
|
5
|
+
|
6
|
+
# Raw data
|
7
|
+
attr_reader :raw_paths
|
8
|
+
|
9
|
+
attr_reader :locations_path
|
10
|
+
attr_reader :construction_sets_path
|
11
|
+
attr_reader :constructions_opaque_path
|
12
|
+
attr_reader :materials_opaque_path
|
13
|
+
attr_reader :constructions_glazing_path
|
14
|
+
attr_reader :materials_glazing_path
|
15
|
+
attr_reader :constructions_path
|
16
|
+
attr_reader :construction_properties_path
|
17
|
+
attr_reader :lighting_sets_path
|
18
|
+
attr_reader :lighting_path
|
19
|
+
attr_reader :materials_lighting_path
|
20
|
+
attr_reader :hvac_vent_ahu_path
|
21
|
+
attr_reader :materials_hvac_path
|
22
|
+
|
23
|
+
# Costing data
|
24
|
+
attr_accessor :costs_path
|
25
|
+
attr_accessor :costs_local_factors_path
|
26
|
+
|
27
|
+
# Costing database location
|
28
|
+
attr_reader :costing_database_path
|
29
|
+
|
30
|
+
# Other
|
31
|
+
attr_reader :error_log
|
32
|
+
attr_reader :cost_output_file
|
33
|
+
attr_reader :mech_sizing_data_file
|
34
|
+
|
35
|
+
def initialize
|
36
|
+
dir_relative = __dir__
|
37
|
+
dir_database = "#{dir_relative}/common_resources"
|
38
|
+
|
39
|
+
@locations_path = "#{dir_database}/locations.csv"
|
40
|
+
@construction_sets_path = "#{dir_database}/construction_sets.csv"
|
41
|
+
@constructions_opaque_path = "#{dir_database}/constructions_opaque.csv"
|
42
|
+
@materials_opaque_path = "#{dir_database}/materials_opaque.csv"
|
43
|
+
@constructions_glazing_path = "#{dir_database}/constructions_glazing.csv"
|
44
|
+
@materials_glazing_path = "#{dir_database}/materials_glazing.csv"
|
45
|
+
@constructions_path = "#{dir_database}/Constructions.csv"
|
46
|
+
@construction_properties_path = "#{dir_database}/ConstructionProperties.csv"
|
47
|
+
@lighting_sets_path = "#{dir_database}/lighting_sets.csv"
|
48
|
+
@lighting_path = "#{dir_database}/lighting.csv"
|
49
|
+
@materials_lighting_path = "#{dir_database}/materials_lighting.csv"
|
50
|
+
@hvac_vent_ahu_path = "#{dir_database}/hvac_vent_ahu.csv"
|
51
|
+
@materials_hvac_path = "#{dir_database}/materials_hvac.csv"
|
52
|
+
|
53
|
+
@raw_paths = [
|
54
|
+
@locations_path,
|
55
|
+
@construction_sets_path,
|
56
|
+
@constructions_opaque_path,
|
57
|
+
@materials_opaque_path,
|
58
|
+
@constructions_glazing_path,
|
59
|
+
@materials_glazing_path,
|
60
|
+
@constructions_path,
|
61
|
+
@construction_properties_path,
|
62
|
+
@lighting_sets_path,
|
63
|
+
@lighting_path,
|
64
|
+
@materials_lighting_path,
|
65
|
+
@hvac_vent_ahu_path,
|
66
|
+
@materials_hvac_path
|
67
|
+
]
|
68
|
+
|
69
|
+
@costs_path = "#{dir_database}/costs.csv"
|
70
|
+
@costs_local_factors_path = "#{dir_database}/costs_local_factors.csv"
|
71
|
+
|
72
|
+
@costing_database_path = "#{dir_relative}/costing_database.json"
|
73
|
+
|
74
|
+
@error_log = "#{dir_relative}/errors.json"
|
75
|
+
@cost_output_file = "#{dir_relative}/cost_output.json"
|
76
|
+
@mech_sizing_data_file = "#{dir_relative}/mech_sizing.json"
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
Template,Climate Zone Set,Intended Surface Type,Standards Construction Type,Building Category,Construction,Minimum Percent of Surface,Maximum Percent of Surface,Assembly Maximum U-Value,Assembly Maximum F Factor,Assembly Maximum C Factor,Assembly Maximum Solar Heat Gain Coefficient
|
2
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorFloor,BTAP-ExteriorFloor-SteelFramed-1,Nonresidential,BTAP - Typical Insulated Steel Framed Exterior Floor-1,,,,,,
|
3
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorFloor,BTAP-ExteriorFloor-WoodFramed-1,Nonresidential,BTAP - Typical Insulated Wood Framed Exterior Floor-1,,,,,,
|
4
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-IEAD-1,Nonresidential,BTAP - Typical IEAD Roof-1,,,,,,
|
5
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-IEAD-2,Nonresidential,BTAP - Typical IEAD Roof-2,,,,,,
|
6
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-IEAD-3,Nonresidential,BTAP - Typical IEAD Roof-3,,,,,,
|
7
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-IEAD-4,Nonresidential,BTAP - Typical IEAD Roof-4,,,,,,
|
8
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-IEAD-5,Nonresidential,BTAP - Typical IEAD Roof-5,,,,,,
|
9
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-IEAD-6,Nonresidential,BTAP - Typical IEAD Roof-6,,,,,,
|
10
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-Metal-1,Nonresidential,BTAP - Typical Insulated Metal Building Roof-1,,,,,,
|
11
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,BTAP-ExteriorRoof-Metal-2,Nonresidential,BTAP - Typical Insulated Metal Building Roof-2,,,,,,
|
12
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-1,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-1,,,,,,
|
13
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-2,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-2,,,,,,
|
14
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-3,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-3,,,,,,
|
15
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-4,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-4,,,,,,
|
16
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-5,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-5,,,,,,
|
17
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-6,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-6,,,,,,
|
18
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-7,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-7,,,,,,
|
19
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-8,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-8,,,,,,
|
20
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Mass-9,Nonresidential,BTAP - Typical Insulated Exterior Mass Wall-9,,,,,,
|
21
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Metal-1,Nonresidential,BTAP - Typical Insulated Metal Building Wall-1,,,,,,
|
22
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Metal-2,Nonresidential,BTAP - Typical Insulated Metal Building Wall-2,,,,,,
|
23
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-Metal-3,Nonresidential,BTAP - Typical Insulated Metal Building Wall-3,,,,,,
|
24
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-SteelFramed-1,Nonresidential,BTAP - Typical Insulated Steel Framed Exterior Wall-1,,,,,,
|
25
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-WoodFramed-1,Nonresidential,BTAP -Typical Insulated Wood Framed Exterior Wall-1,,,,,,
|
26
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-WoodFramed-2,Nonresidential,BTAP -Typical Insulated Wood Framed Exterior Wall-2,,,,,,
|
27
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-WoodFramed-3,Nonresidential,BTAP -Typical Insulated Wood Framed Exterior Wall-3,,,,,,
|
28
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-WoodFramed-4,Nonresidential,BTAP -Typical Insulated Wood Framed Exterior Wall-4,,,,,,
|
29
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,BTAP-ExteriorWall-WoodFramed-5,Nonresidential,BTAP -Typical Insulated Wood Framed Exterior Wall-5,,,,,,
|
30
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactFloor,BTAP-GroundContactFloor-Unheated-1,Nonresidential,BTAP - Typical Insulated Carpeted 8in Slab Floor-1,,,,,,
|
31
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactRoof,BTAP-GroundContactRoof-Mass-1,Nonresidential,BTAP - Typical Insulated Carpeted 6in Slab Floor,,,,,,
|
32
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactRoof,BTAP-GroundContactRoof-Mass-2,Nonresidential,BTAP - Typical Insulated Carpeted 6in Slab Floor,,,,,,
|
33
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactWall,BTAP-GroundContactWall-Mass-1,Nonresidential,BTAP - Typical Insulated Basement Mass Wall-1,,,,,,
|
34
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactWall,BTAP-GroundContactWall-Mass-2,Nonresidential,BTAP - Typical Insulated Basement Mass Wall-2,,,,,,
|
35
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWindow,Nonmetal framing (all),Nonresidential,U 0.35 SHGC 0.35 Dbl LoE (e2-.1) Tint 6mm/13mm Air,,,0.35,,,0.4
|
36
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorDoor,Swinging,Nonresidential,Typical Insulated Metal Door,,,0.7,,,
|
37
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorDoor,OverheadDoor,Nonresidential,Typical Overhead Door,,,0.5,,,
|
38
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorFloor,Mass,Nonresidential,Typical Insulated Exterior Mass Floor,,,0.064,,,
|
39
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorRoof,Metal Building,Nonresidential,Typical Insulated Metal Building Roof,,,0.049,,,
|
40
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,Mass,Nonresidential,Typical Insulated Exterior Mass Wall,,,0.08,,,
|
41
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWall,WoodFramed,Nonresidential,Typical Insulated Wood Framed Exterior Wall,,,0.051,,,
|
42
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorWindow,Metal framing (all other),Nonresidential,U 0.55 SHGC 0.31 Dbl Ref-D Tint 6mm/6mm Air,,,0.55,,,0.4
|
43
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactFloor,Unheated,Nonresidential,Typical Insulated Carpeted 6in Slab Floor,,,,0.54,,
|
44
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactWall,Mass,Nonresidential,Typical Insulated Carpeted 6in Slab Floor,,,,,0.119,
|
45
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,Skylight,Glass with Curb,Nonresidential,U 0.48 SHGC 0.40 Dbl Ref-D Clr 6mm/13mm,0.0,2.0,0.5,,,0.19
|
46
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,GroundContactRoof,Mass,Nonresidential,Typical Insulated Carpeted 6in Slab Floor,,,,,0.119,
|
47
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,GlassDoor,Nonmetal framing (all),Nonresidential,U 0.35 SHGC 0.35 Dbl LoE (e2-.1) Tint 6mm/13mm Air,,,0.35,,,0.4
|
48
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,TubularDaylightDome,Glass with Curb,Nonresidential,U 0.48 SHGC 0.40 Dbl Ref-D Clr 6mm/13mm,0.0,2.0,0.5,,,0.19
|
49
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,TubularDaylightDiffuser,Glass with Curb,Nonresidential,U 0.48 SHGC 0.40 Dbl Ref-D Clr 6mm/13mm,0.0,2.0,0.5,,,0.19
|
50
|
+
,,,,Nonresidential,Typical Insulated Steel Framed Exterior Floor,,,,,,
|
51
|
+
,,,,Nonresidential,Typical Insulated Wood Framed Exterior Floor,,,,,,
|
52
|
+
NECB 2011,NECB-CNEB ClimatZone 4-8,ExteriorFloor,Mass,Nonresidential,Typical Insulated Exterior Mass Floor,,,0.064,,,
|
@@ -0,0 +1,37 @@
|
|
1
|
+
Name,Intended Surface Type,Standards Construction Type,Insulation Layer,Material 1,Material 2,Material 3,Material 4,Material 5
|
2
|
+
BTAP - Typical Insulated Steel Framed Exterior Floor-1,ExteriorFloor,BTAP-ExteriorFloor-SteelFramed-1,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,Typical Carpet Pad
|
3
|
+
BTAP - Typical Insulated Wood Framed Exterior Floor-1,ExteriorFloor,BTAP-ExteriorFloor-WoodFramed-1,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,Typical Carpet Pad
|
4
|
+
BTAP - Typical IEAD Roof-1,ExteriorRoof,BTAP-ExteriorRoof-IEAD-1,Typical Insulation,Roof Membrane,Typical Insulation,Metal Roof Surface,,
|
5
|
+
BTAP - Typical IEAD Roof-2,ExteriorRoof,BTAP-ExteriorRoof-IEAD-2,Typical Insulation,Roof Membrane,Typical Insulation,Metal Roof Surface,,
|
6
|
+
BTAP - Typical IEAD Roof-3,ExteriorRoof,BTAP-ExteriorRoof-IEAD-3,Typical Insulation,Roof Membrane,Typical Insulation,Metal Roof Surface,,
|
7
|
+
BTAP - Typical IEAD Roof-4,ExteriorRoof,BTAP-ExteriorRoof-IEAD-4,Typical Insulation,Roof Membrane,Typical Insulation,Metal Roof Surface,,
|
8
|
+
BTAP - Typical IEAD Roof-5,ExteriorRoof,BTAP-ExteriorRoof-IEAD-5,Typical Insulation,Roof Membrane,Typical Insulation,Metal Roof Surface,,
|
9
|
+
BTAP - Typical IEAD Roof-6,ExteriorRoof,BTAP-ExteriorRoof-IEAD-6,Typical Insulation,Roof Membrane,Typical Insulation,Metal Roof Surface,,
|
10
|
+
BTAP - Typical Insulated Metal Building Roof-1,ExteriorRoof,BTAP-ExteriorRoof-Metal-1,Typical Insulation,Metal Roof Surface,Typical Insulation,,,
|
11
|
+
BTAP - Typical Insulated Metal Building Roof-2,ExteriorRoof,BTAP-ExteriorRoof-Metal-2,Typical Insulation,Metal Roof Surface,Typical Insulation,,,
|
12
|
+
BTAP - Typical Insulated Exterior Mass Wall-1,ExteriorWall,BTAP-ExteriorWall-Mass-1,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
|
13
|
+
BTAP - Typical Insulated Exterior Mass Wall-2,ExteriorWall,BTAP-ExteriorWall-Mass-2,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
|
14
|
+
BTAP - Typical Insulated Exterior Mass Wall-3,ExteriorWall,BTAP-ExteriorWall-Mass-3,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
|
15
|
+
BTAP - Typical Insulated Exterior Mass Wall-4,ExteriorWall,BTAP-ExteriorWall-Mass-4,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
|
16
|
+
BTAP - Typical Insulated Exterior Mass Wall-5,ExteriorWall,BTAP-ExteriorWall-Mass-5,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
|
17
|
+
BTAP - Typical Insulated Exterior Mass Wall-6,ExteriorWall,BTAP-ExteriorWall-Mass-6,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
|
18
|
+
BTAP - Typical Insulated Exterior Mass Wall-7,ExteriorWall,BTAP-ExteriorWall-Mass-7,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
|
19
|
+
BTAP - Typical Insulated Exterior Mass Wall-8,ExteriorWall,BTAP-ExteriorWall-Mass-8,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
|
20
|
+
BTAP - Typical Insulated Exterior Mass Wall-9,ExteriorWall,BTAP-ExteriorWall-Mass-9,Typical Insulation,1IN Stucco,8IN CONCRETE HW RefBldg,Typical Insulation,1/2IN Gypsum,
|
21
|
+
BTAP - Typical Insulated Metal Building Wall-1,ExteriorWall,BTAP-ExteriorWall-Metal-1,Typical Insulation,Metal Siding,Typical Insulation,1/2IN Gypsum,,
|
22
|
+
BTAP - Typical Insulated Metal Building Wall-2,ExteriorWall,BTAP-ExteriorWall-Metal-2,Typical Insulation,Metal Siding,Typical Insulation,1/2IN Gypsum,,
|
23
|
+
BTAP - Typical Insulated Metal Building Wall-3,ExteriorWall,BTAP-ExteriorWall-Metal-3,Typical Insulation,Metal Siding,Typical Insulation,1/2IN Gypsum,,
|
24
|
+
BTAP - Typical Insulated Steel Framed Exterior Wall-1,ExteriorWall,BTAP-ExteriorWall-SteelFramed-1,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,
|
25
|
+
BTAP -Typical Insulated Wood Framed Exterior Wall-1,ExteriorWall,BTAP-ExteriorWall-WoodFramed-1,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,
|
26
|
+
BTAP -Typical Insulated Wood Framed Exterior Wall-2,ExteriorWall,BTAP-ExteriorWall-WoodFramed-2,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,
|
27
|
+
BTAP -Typical Insulated Wood Framed Exterior Wall-3,ExteriorWall,BTAP-ExteriorWall-WoodFramed-3,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,
|
28
|
+
BTAP -Typical Insulated Wood Framed Exterior Wall-4,ExteriorWall,BTAP-ExteriorWall-WoodFramed-4,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,
|
29
|
+
BTAP -Typical Insulated Wood Framed Exterior Wall-5,ExteriorWall,BTAP-ExteriorWall-WoodFramed-5,Typical Insulation,25mm Stucco,5/8 in. Gypsum Board,Typical Insulation,5/8 in. Gypsum Board,
|
30
|
+
BTAP - Typical Insulated Carpeted 8in Slab Floor-1,GroundContactFloor,BTAP-GroundContactFloor-Unheated-1,Typical Insulation,Typical Insulation,8 in. Normalweight Concrete Floor,Typical Carpet Pad,,
|
31
|
+
BTAP - Typical Insulated Carpeted 6in Slab Floor-1,GroundContactRoof,BTAP-GroundContactRoof-Mass-1,Typical Insulation,Typical Insulation,6 in. Normalweight Concrete Floor,Typical Carpet Pad,,
|
32
|
+
BTAP - Typical Insulated Carpeted 6in Slab Floor-2,GroundContactRoof,BTAP-GroundContactRoof-Mass-2,Typical Insulation,Typical Insulation,6 in. Normalweight Concrete Floor,Typical Carpet Pad,,
|
33
|
+
BTAP - Typical Insulated Basement Mass Wall-1,GroundContactWall,BTAP-GroundContactWall-Mass-1,Typical Insulation,Typical Insulation,8 in. Concrete Block Basement Wall,,,
|
34
|
+
BTAP - Typical Insulated Basement Mass Wall-2,GroundContactWall,BTAP-GroundContactWall-Mass-2,Typical Insulation,Typical Insulation,8 in. Concrete Block Basement Wall,,,
|
35
|
+
BTAP - Typical Interior Wall-1,InteriorWall,BTAP-InteriorWall-1,,G01 13mm gypsum board,G01 13mm gypsum board,,,
|
36
|
+
BTAP - Typical Interior Window-1,InteriorWindow,BTAP-InteriorWindow-1,,Clear 3mm,,,,
|
37
|
+
BTAP - Typical Overhead Door-1,OverheadDoor,BTAP-OverheadDoor-1,Typical Insulation,Typical Insulation,,,,
|