-
Notifications
You must be signed in to change notification settings - Fork 11
/
create_workflow.rb
469 lines (417 loc) · 24.5 KB
/
create_workflow.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
# MIT License
#
# Copyright (c) [2021]
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
require '<place_holder>/openstudio-2.9.1/Ruby/openstudio.rb' # Change to the path where OpenStudio is installed
require '<place_holder>/openstudio-standards/lib/openstudio-standards.rb' # Change to the path where openstudio-standards is cloned
require 'fileutils'
require 'parallel'
def loadOSM(pathStr)
translator = OpenStudio::OSVersion::VersionTranslator.new
path = OpenStudio::Path.new(pathStr)
model = translator.loadModel(path)
if model.empty?
raise "Input #{pathStr} is not valid, please check."
else
model = model.get
end
return model
end
def create_single_model(building_type, vintage, climate_zone, osm_directory)
model = OpenStudio::Model::Model.new
@debug = false
epw_file = 'Not Applicable'
prototype_creator = Standard.build("#{vintage}_#{building_type}")
prototype_creator.model_create_prototype_model(climate_zone, epw_file, osm_directory, @debug, model)
end
# Generate OpenStudio seed models for synthetic building operation data creation,
# create corresponding OpenStudio workflows which later will be used for simulations
# @param [Array] building_types: an array of building types to consider
# @param [Array] vintages: an array of building vintages to consider
# @param [Array] climate_zones: an array of climate zones to consider
# @param [String] root_directory: the path to root working directory
# @param [String] epws_path: the path to EPW files folder
# @param [Hash] hash_climate_epw: a Hash to map climate zones and EPW files
# @param [String] measures_dir: the path to OpenStudio measures
# @param [Integer] n_runs: number of stochastic occupancy simulation for each OpenStudio model
# @param [Integer] efficiency_level: the energy efficiency level (1: low, 2: Standard, 3: high)
# @return [Array] v_osw_paths: an array of OpenStudio workflow paths
def create_workflows(
building_types,
vintages,
climate_zones,
root_directory,
epws_path,
hash_climate_epw,
measures_dir = nil,
n_runs = 5,
efficiency_level = 2
)
unless File.directory?(File.expand_path(root_directory))
FileUtils.mkdir_p(File.expand_path(root_directory))
end
hash_eff_level = {
1 => 'Low',
2 => 'Standard',
3 => 'High',
}
out_osw_dir = File.expand_path(File.join(root_directory, "3~OSWs", "efficiency_level_#{hash_eff_level[efficiency_level]}"))
v_osw_paths = []
building_types.each do |building_type|
climate_zones.each do |climate_zone|
sub_epws_path = File.expand_path(File.join(epws_path, hash_climate_epw[climate_zone]))
vintages.each do |vintage|
## 1. Generate and prepare OSM
model_name = building_type + '_' + vintage + '_' + climate_zone.split('-').last.to_s
seed_model_folder = File.join(root_directory, '1~seeds', model_name)
new_model_folder = File.join(root_directory, '2~processed_models', "efficiency_level_#{hash_eff_level[efficiency_level]}", model_name)
old_osm_path = File.expand_path(File.join(seed_model_folder, 'SR1/in.osm'))
old_epw_path = File.expand_path(File.join(seed_model_folder, 'SR1/in.epw'))
new_osm_path = File.expand_path(File.join(new_model_folder, "#{model_name}.osm"))
new_epw_path = File.expand_path(File.join(new_model_folder, "#{model_name}.epw"))
## Create raw building model
create_single_model(building_type, vintage, climate_zone, seed_model_folder)
## Process model
process_model(old_osm_path, new_osm_path, efficiency_level)
FileUtils.mv(old_epw_path, new_epw_path)
## 2. Prepare OSW
v_epw_paths = Dir.glob("#{sub_epws_path}/*.epw")
v_osw_paths += prepare_all_osws(new_osm_path, v_epw_paths, out_osw_dir, measures_dir, n_runs)
end
end
end
f = File.new(File.join(root_directory, "job_efficiency_level_#{hash_eff_level[efficiency_level]}.txt"), "w")
f.write(v_osw_paths)
f.close
return v_osw_paths
end
def process_model(old_osm_path, new_osm_path, efficiency_level = 2)
osm_dir = File.dirname(new_osm_path)
unless File.directory?(osm_dir)
FileUtils.mkdir_p(osm_dir)
end
# Do the following:
# 1. Change the simulation run period to match weather data
model = loadOSM(old_osm_path)
model.getSimulationControl.setRunSimulationforSizingPeriods(false)
model.getSimulationControl.setRunSimulationforWeatherFileRunPeriods(true)
# 2. Enable CO2 simulations
# model.getZoneAirContaminantBalance.setCarbonDioxideConcentration(true)
# 3. Change the VAV control logic to dual-maximum
vav_reheats = model.getAirTerminalSingleDuctVAVReheats
vav_reheats.each do |vav_reheat|
vav_reheat.setDamperHeatingAction('ReverseWithLimits')
end
# 4. Change the efficiency level (TBD)
model = adjust_efficiency_level(model, efficiency_level)
# Save processed model
model.save(new_osm_path, true)
end
def adjust_efficiency_level(model, level = 2)
# Efficiency levels:
# 1 - low
# 2 - standard
# 3 - high
if level == 2
puts 'Keep the default efficiency level.'
return model
else
if level == 1
puts 'Adjusting to low efficiency level.'
factor = 1.25
elsif level == 3
puts 'Adjusting to high efficiency level.'
factor = 0.75
end
end
# 1. Lighting
v_light_defs = model.getLightsDefinitions
v_light_defs.each do |light_def|
old_lpd = light_def.wattsperSpaceFloorArea.to_f
light_def.setWattsperSpaceFloorArea(old_lpd * factor)
end
# 2. MELs
v_equip_defs = model.getElectricEquipmentDefinitions
v_equip_defs.each do |equip_def|
if equip_def.designLevelCalculationMethod == 'Watts/Area'
equip_def.setWattsperSpaceFloorArea(equip_def.wattsperSpaceFloorArea.to_f * factor)
elsif equip_def.designLevelCalculationMethod == 'EquipmentLevel'
equip_def.setDesignLevel(equip_def.designLevel.to_f * factor)
end
end
# 3. Wall insulation
v_opaque_materials = model.getStandardOpaqueMaterials
v_opaque_materials.each do |opaque_material|
opaque_material.setThermalConductivity(opaque_material.thermalConductivity.to_f * factor)
end
# 4. Windows
v_glazing_materials = model.getGlazings
v_glazing_materials.each do |glazing_material|
glazing_material.setThickness(glazing_material.thickness.to_f / factor)
end
# 5. Cooling plant
v_cooling_coils = model.getCoilCoolingDXTwoSpeeds
v_cooling_coils.each do |cooling_coil|
cooling_coil.setRatedLowSpeedCOP(cooling_coil.ratedLowSpeedCOP.to_f / factor)
cooling_coil.setRatedHighSpeedCOP(cooling_coil.ratedHighSpeedCOP.to_f / factor)
end
# 6. Heating plant
v_heating_coils = model.getCoilHeatingGass
v_heating_coils.each do |heating_coil|
# Set highest efficiency to be 0.95
heating_coil.setGasBurnerEfficiency([0.95, heating_coil.gasBurnerEfficiency.to_f / factor].min)
end
v_reheating_coils = model.getCoilHeatingElectrics
v_reheating_coils.each do |reheating_coil|
reheating_coil.setEfficiency([1, reheating_coil.efficiency.to_f / factor].min)
end
v_water_heaters = model.getWaterHeaterMixeds
v_water_heaters.each do |water_heater|
water_heater.setHeaterThermalEfficiency([0.95, water_heater.heaterThermalEfficiency.to_f / factor].min)
end
# 7. Fans
v_fans = model.getFanVariableVolumes
v_fans.each do |fan|
fan.setFanTotalEfficiency([0.8, fan.fanTotalEfficiency.to_f / factor].min)
fan.setMotorEfficiency([0.95, fan.motorEfficiency.to_f / factor].min)
end
# 8. Pumps
v_pumps = model.getPumpConstantSpeeds
v_pumps.each do |pump|
pump.setMotorEfficiency([0.6, pump.motorEfficiency.to_f / factor].min)
end
return model
end
def prepare_single_osw(seed_osm_path, epw_path, measures_dir, osw_path)
# Prepare OSW to add dynamic occupancy, lighting, MELs schedules.
osw_dir = File.dirname(osw_path)
unless File.directory?(osw_dir)
FileUtils.mkdir_p(osw_dir)
end
osw_str =
%({
"weather_file": "#{epw_path}",
"seed_file": "#{seed_osm_path}",
"measure_paths": [
"#{measures_dir}"
],
"steps": [
{"arguments": {},"measure_dir_name": "Occupancy_Simulator_Office"},
{"arguments": {},"measure_dir_name": "create_lighting_schedule_from_occupant_count"},
{"arguments": {},"measure_dir_name": "create_mels_schedule_from_occupant_count"},
{"arguments": {},"measure_dir_name": "update_hvac_setpoint_schedule"},
{"arguments": {},"measure_dir_name": "add_demand_controlled_ventilation"},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Site Outdoor Air Drybulb Temperature","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Site Outdoor Air Dewpoint Temperature","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Site Outdoor Air Wetbulb Temperature","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Site Outdoor Air Relative Humidity","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Site Horizontal Infrared Radiation Rate per Area","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Site Day Type Index","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"System Node Pressure","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"System Node Temperature","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"System Node Mass Flow Rate","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"System Node Relative Humidity","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"System Node Relative Humidity","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Zone Mean Air Temperature","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Zone Air Relative Humidity","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Zone Thermostat Heating Setpoint Temperature","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Zone Thermostat Cooling Setpoint Temperature","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Air System Outdoor Air Economizer Status","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Zone Air Terminal VAV Damper Position","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Zone People Occupant Count","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Zone Electric Equipment Electric Power","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Zone Lights Electric Power","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Fan Electric Power","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Fan Air Mass Flow Rate","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Pump Electric Power","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Pump Mass Flow Rate","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddOutputVariable","arguments":{"variable_name":"Zone Mechanical Ventilation Mass Flow Rate","key_value":"*","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddMeter","arguments":{"meter_name":"InteriorLights:Electricity","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddMeter","arguments":{"meter_name":"InteriorEquipment:Electricity","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddMeter","arguments":{"meter_name":"Fans:Electricity","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddMeter","arguments":{"meter_name":"ExteriorLights:Electricity","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddMeter","arguments":{"meter_name":"Heating:Electricity","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddMeter","arguments":{"meter_name":"Cooling:Electricity","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddMeter","arguments":{"meter_name":"Gas:HVAC","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddMeter","arguments":{"meter_name":"Electricity:HVAC","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddMeter","arguments":{"meter_name":"Pumps:Electricity","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddMeter","arguments":{"meter_name":"Electricity:Facility","reporting_frequency":"timestep"}},
{"measure_dir_name":"AddMeter","arguments":{"meter_name":"Gas:Facility","reporting_frequency":"timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Site Outdoor Air Drybulb Temperature","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Site Outdoor Air Dewpoint Temperature","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Site Outdoor Air Wetbulb Temperature","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Site Outdoor Air Relative Humidity","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Site Horizontal Infrared Radiation Rate per Area","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Site Day Type Index","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"System Node Pressure","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"System Node Temperature","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"System Node Mass Flow Rate","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"System Node Relative Humidity","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"System Node Relative Humidity","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Zone Mean Air Temperature","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Zone Air Relative Humidity","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Zone Thermostat Heating Setpoint Temperature","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Zone Thermostat Cooling Setpoint Temperature","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Air System Outdoor Air Economizer Status","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Zone Air Terminal VAV Damper Position","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Zone People Occupant Count","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Zone Electric Equipment Electric Power","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Zone Lights Electric Power","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Fan Electric Power","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Fan Air Mass Flow Rate","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Pump Electric Power","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Pump Mass Flow Rate","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportVariabletoCSV","arguments":{"variable_name":"Zone Mechanical Ventilation Mass Flow Rate","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportMetertoCSV","arguments":{"meter_name":"InteriorLights:Electricity","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportMetertoCSV","arguments":{"meter_name":"InteriorEquipment:Electricity","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportMetertoCSV","arguments":{"meter_name":"Fans:Electricity","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportMetertoCSV","arguments":{"meter_name":"ExteriorLights:Electricity","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportMetertoCSV","arguments":{"meter_name":"Heating:Electricity","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportMetertoCSV","arguments":{"meter_name":"Cooling:Electricity","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportMetertoCSV","arguments":{"meter_name":"Gas:HVAC","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportMetertoCSV","arguments":{"meter_name":"Electricity:HVAC","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportMetertoCSV","arguments":{"meter_name":"Pumps:Electricity","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportMetertoCSV","arguments":{"meter_name":"Electricity:Facility","reporting_frequency":"Zone Timestep"}},
{"measure_dir_name":"ExportMetertoCSV","arguments":{"meter_name":"Gas:Facility","reporting_frequency":"Zone Timestep"}}
]
})
f = File.new(osw_path, "w")
f.write(osw_str)
f.close
end
def prepare_all_osws(seed_osm_path, v_epw_paths, out_osw_dir, measures_dir, n_runs)
# seed_osm_path - seed OS model
# v_epw_paths - array of epw paths
# out_osw_dir - directory where osw will be grouped and saved by each year's epw
# measures_dir - directory where OS measures are saved
# n_runs - i.e. n_runs of occupancy simulator runs for each epw
v_osw_paths = []
seed_osm_name = File.basename(seed_osm_path, ".osm")
v_epw_paths.each do |epw_path|
epw_name = File.basename(epw_path, ".epw")
year = epw_name[-2..-1]
for i in 1..n_runs
temp_osw_path = "#{out_osw_dir}/#{seed_osm_name}/#{epw_name}/run_#{i}/#{seed_osm_name}_run_#{i}.osw"
prepare_single_osw(seed_osm_path, epw_path, measures_dir, temp_osw_path)
v_osw_paths << temp_osw_path
end
end
v_osw_paths
end
def run_osws(os_exe, v_osw_paths, number_of_threads)
n = v_osw_paths.length
Parallel.each_with_index(v_osw_paths, :in_threads => number_of_threads) do |osw_path, index|
puts "Running #{index + 1}/#{n}"
command = "#{os_exe} run -w '#{osw_path}'"
puts command
system command
end
end
################################################################################
## Main: set the run configurations for synthetic operation data generation
################################################################################
# Step 0. Set the working directories (no need to change if you cloned the repository)
root_directory = './Models/'
measures_dir = './OpenStudio-measures'
epws_path = './EPWs'
# Step 1. Select the climate zone(s) for simulation.
climate_zones = [
'ASHRAE 169-2006-1A',
# 'ASHRAE 169-2006-2A',
# 'ASHRAE 169-2006-2B',
# 'ASHRAE 169-2006-3A',
# 'ASHRAE 169-2006-3B',
'ASHRAE 169-2006-3C',
# 'ASHRAE 169-2006-4A',
# 'ASHRAE 169-2006-4B',
# 'ASHRAE 169-2006-4C',
'ASHRAE 169-2006-5A',
# 'ASHRAE 169-2006-5B',
# 'ASHRAE 169-2006-6A',
# 'ASHRAE 169-2006-6B',
# 'ASHRAE 169-2006-7A',
# 'ASHRAE 169-2006-8A',
]
# Step 2. Make sure you have the weather files (EPWs) and map the their folder
# to the climate zones following the example convention
hash_climate_epw = {
# 'climate zone option' => 'EPWs folder name', (example convention)
'ASHRAE 169-2006-1A' => 'Miami_AMY',
'ASHRAE 169-2006-3C' => 'SF_AMY',
'ASHRAE 169-2006-5A' => 'Chicago_AMY',
}
# Step 3. Select the vintages you want to consider
vintages = [
# '90.1-2004',
# '90.1-2007',
# '90.1-2010',
'90.1-2013'
]
# Step 4. Select the building type to consider.
# Please note that occupancy_simulator only works for office buildings.
building_types = [
###############################################################
## building types that support stochastic occupancy simulation
###############################################################
# 'SmallOffice',
# 'MediumOffice',
# 'LargeOffice',
# 'SmallOfficeDetailed',
'MediumOfficeDetailed',
# 'LargeOfficeDetailed',
###############################################################
## building types that do not support stochastic occupancy simulation
###############################################################
# 'SecondarySchool',
# 'PrimarySchool',
# 'SmallHotel',
# 'LargeHotel',
# 'Warehouse',
# 'RetailStandalone',
# 'RetailStripmall',
# 'QuickServiceRestaurant',
# 'FullServiceRestaurant',
# 'MidriseApartment',
# 'HighriseApartment',
# 'Hospital',
# 'Outpatient',
]
# Step 5. Set the number of stochastic occupancy simulations for each building model.
number_of_stochastic_occupancy_simulation = 5
# Step 6. Set the energy efficiency level (1 - low, 2 - standard, 3 - high) to run.
efficiency_level = 2
starting = Time.now
v_osws = create_workflows(building_types = building_types,
vintages = vintages,
climate_zones = climate_zones,
root_directory = root_directory,
epws_path = epws_path,
hash_climate_epw = hash_climate_epw,
measures_dir = measures_dir,
n_runs = number_of_stochastic_occupancy_simulation,
efficiency_level = efficiency_level)
run_osws(
'os291', # Change this to your command name of OpenStudio 2.9.1.
v_osws, # The array of OpenStudio workflows generated in the previous step.
31 # Change this number to set number of threads for parallel simulations.
)
ending = Time.now
elapsed = ending - starting
puts "Job started at #{starting}, finished at #{Time.now}, #{elapsed} seconds elapsed."