openstudio-standards 0.1.9 → 0.1.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards.xlsx +0 -0
  3. data/lib/openstudio-standards/btap/compliance.rb +17 -7
  4. data/lib/openstudio-standards/btap/hvac.rb +6 -5
  5. data/lib/openstudio-standards/btap/measures.rb +137 -102
  6. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +2 -2
  7. data/lib/openstudio-standards/prototypes/Prototype.FanVariableVolume.rb +1 -1
  8. data/lib/openstudio-standards/prototypes/Prototype.Model.rb +96 -31
  9. data/lib/openstudio-standards/prototypes/Prototype.Model.swh.rb +1 -1
  10. data/lib/openstudio-standards/prototypes/Prototype.building_specific_methods.rb +163 -0
  11. data/lib/openstudio-standards/prototypes/Prototype.full_service_restaurant.rb +54 -52
  12. data/lib/openstudio-standards/prototypes/Prototype.high_rise_apartment.rb +28 -26
  13. data/lib/openstudio-standards/prototypes/Prototype.hospital.rb +41 -39
  14. data/lib/openstudio-standards/prototypes/Prototype.large_hotel.rb +19 -17
  15. data/lib/openstudio-standards/prototypes/Prototype.large_office.rb +16 -13
  16. data/lib/openstudio-standards/prototypes/Prototype.medium_office.rb +13 -11
  17. data/lib/openstudio-standards/prototypes/Prototype.mid_rise_apartment.rb +33 -31
  18. data/lib/openstudio-standards/prototypes/Prototype.outpatient.rb +66 -64
  19. data/lib/openstudio-standards/prototypes/Prototype.primary_school.rb +8 -88
  20. data/lib/openstudio-standards/prototypes/Prototype.quick_service_restaurant.rb +54 -52
  21. data/lib/openstudio-standards/prototypes/Prototype.retail_standalone.rb +13 -11
  22. data/lib/openstudio-standards/prototypes/Prototype.retail_stripmall.rb +15 -13
  23. data/lib/openstudio-standards/prototypes/Prototype.secondary_school.rb +11 -9
  24. data/lib/openstudio-standards/prototypes/Prototype.small_hotel.rb +13 -11
  25. data/lib/openstudio-standards/prototypes/Prototype.small_office.rb +7 -5
  26. data/lib/openstudio-standards/prototypes/Prototype.utilities.rb +18 -13
  27. data/lib/openstudio-standards/prototypes/Prototype.warehouse.rb +11 -9
  28. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +23 -12
  29. data/lib/openstudio-standards/standards/Standards.Fan.rb +7 -4
  30. data/lib/openstudio-standards/standards/Standards.Model.rb +4 -4
  31. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +9 -4
  32. data/lib/openstudio-standards/utilities/simulation.rb +6 -1
  33. data/lib/openstudio-standards/version.rb +1 -1
  34. data/lib/openstudio-standards/weather/Weather.Model.rb +1 -1
  35. metadata +3 -2
@@ -1,7 +1,8 @@
1
1
 
2
- # Extend the class to add Secondary School specific stuff
3
- class OpenStudio::Model::Model
4
- def define_space_type_map(building_type, template, climate_zone)
2
+ # Modules for building-type specific methods
3
+ module PrototypeBuilding
4
+ module PrimarySchool
5
+ def self.define_space_type_map(building_type, template, climate_zone)
5
6
  space_type_map = nil
6
7
  case template
7
8
  when 'NECB 2011'
@@ -35,89 +36,9 @@ class OpenStudio::Model::Model
35
36
  return space_type_map
36
37
  end
37
38
 
38
- def define_hvac_system_map(building_type, template, climate_zone)
39
+ def self.define_hvac_system_map(building_type, template, climate_zone)
39
40
  system_to_space_map = nil
40
41
 
41
- # case template
42
- # when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
43
- # system_to_space_map = [
44
- # {
45
- # 'type' => 'PVAV',
46
- # 'name' => 'PVAV_POD_1',
47
- # 'space_names' =>
48
- # [
49
- # 'Corner_Class_1_Pod_1_ZN_1_FLR_1',
50
- # 'Mult_Class_1_Pod_1_ZN_1_FLR_1',
51
- # 'Corridor_Pod_1_ZN_1_FLR_1',
52
- # 'Corner_Class_2_Pod_1_ZN_1_FLR_1',
53
- # 'Mult_Class_2_Pod_1_ZN_1_FLR_1',
54
- # 'Corner_Class_1_Pod_2_ZN_1_FLR_1'
55
- # ]
56
- # },
57
- # {
58
- # 'type' => 'PVAV',
59
- # 'name' => 'PVAV_POD_2',
60
- # 'space_names' =>
61
- # [
62
- # 'Mult_Class_1_Pod_2_ZN_1_FLR_1',
63
- # 'Corridor_Pod_2_ZN_1_FLR_1',
64
- # 'Corner_Class_2_Pod_2_ZN_1_FLR_1',
65
- # 'Mult_Class_2_Pod_2_ZN_1_FLR_1'
66
- # ]
67
- # },
68
- # {
69
- # 'type' => 'PVAV',
70
- # 'name' => 'PVAV_POD_3',
71
- # 'space_names' =>
72
- # [
73
- # 'Corner_Class_1_Pod_3_ZN_1_FLR_1',
74
- # 'Mult_Class_1_Pod_3_ZN_1_FLR_1',
75
- # 'Corridor_Pod_3_ZN_1_FLR_1',
76
- # 'Corner_Class_2_Pod_3_ZN_1_FLR_1',
77
- # 'Mult_Class_2_Pod_3_ZN_1_FLR_1'
78
- # ]
79
- # },
80
- # {
81
- # 'type' => 'PVAV',
82
- # 'name' => 'PVAV_OTHER',
83
- # 'space_names' =>
84
- # [
85
- # 'Computer_Class_ZN_1_FLR_1',
86
- # 'Main_Corridor_ZN_1_FLR_1',
87
- # 'Lobby_ZN_1_FLR_1',
88
- # 'Mech_ZN_1_FLR_1',
89
- # 'Bath_ZN_1_FLR_1',
90
- # 'Offices_ZN_1_FLR_1',
91
- # 'Library_Media_Center_ZN_1_FLR_1'
92
- # ]
93
- # },
94
- # {
95
- # 'type' => 'PSZ-AC',
96
- # 'name' => 'PSZ-AC_1-6',
97
- # 'space_names' =>
98
- # [
99
- # 'Kitchen_ZN_1_FLR_1'
100
- # ]
101
- # },
102
- # {
103
- # 'type' => 'PSZ-AC',
104
- # 'name' => 'PSZ-AC_2-5',
105
- # 'space_names' =>
106
- # [
107
- # 'Gym_ZN_1_FLR_1'
108
- # ]
109
- # },
110
- # {
111
- # 'type' => 'PSZ-AC',
112
- # 'name' => 'PSZ-AC_2-7',
113
- # 'space_names' =>
114
- # [
115
- # 'Cafeteria_ZN_1_FLR_1'
116
- # ]
117
- # }
118
- # ]
119
-
120
- # when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
121
42
  system_to_space_map = [
122
43
  {
123
44
  'type' => 'PVAV',
@@ -229,16 +150,15 @@ class OpenStudio::Model::Model
229
150
  }
230
151
  ]
231
152
 
232
- # end
233
-
234
153
  return system_to_space_map
235
154
  end
236
155
 
237
- def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
156
+ def self.custom_hvac_tweaks(building_type, template, climate_zone, prototype_input, model)
238
157
  return true
239
158
  end
240
159
 
241
- def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
160
+ def self.custom_swh_tweaks(building_type, template, climate_zone, prototype_input, model)
242
161
  return true
243
162
  end
244
163
  end
164
+ end
@@ -1,7 +1,8 @@
1
1
 
2
- # Extend the class to add Medium Office specific stuff
3
- class OpenStudio::Model::Model
4
- def define_space_type_map(building_type, template, climate_zone)
2
+ # Modules for building-type specific methods
3
+ module PrototypeBuilding
4
+ module QuickServiceRestaurant
5
+ def self.define_space_type_map(building_type, template, climate_zone)
5
6
  space_type_map = nil
6
7
  case template
7
8
  when 'DOE Ref Pre-1980'
@@ -26,7 +27,7 @@ class OpenStudio::Model::Model
26
27
  return space_type_map
27
28
  end
28
29
 
29
- def define_hvac_system_map(building_type, template, climate_zone)
30
+ def self.define_hvac_system_map(building_type, template, climate_zone)
30
31
  case template
31
32
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
32
33
  system_to_space_map = [
@@ -309,75 +310,75 @@ class OpenStudio::Model::Model
309
310
  return system_to_space_map
310
311
  end
311
312
 
312
- def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
313
+ def self.custom_hvac_tweaks(building_type, template, climate_zone, prototype_input, model)
313
314
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started building type specific adjustments')
314
315
 
315
316
  # add extra equipment for kitchen
316
- add_extra_equip_kitchen(template)
317
+ PrototypeBuilding::QuickServiceRestaurant.add_extra_equip_kitchen(template, model)
317
318
  # add extra infiltration for dining room door and attic
318
- add_door_infiltration(template, climate_zone)
319
+ PrototypeBuilding::QuickServiceRestaurant.add_door_infiltration(template, climate_zone, model)
319
320
  # add zone_mixing between kitchen and dining
320
- add_zone_mixing(template)
321
+ PrototypeBuilding::QuickServiceRestaurant.add_zone_mixing(template, model)
321
322
  # Update Sizing Zone
322
- update_sizing_zone(template)
323
+ PrototypeBuilding::QuickServiceRestaurant.update_sizing_zone(template, model)
323
324
  # adjust the cooling setpoint
324
- adjust_clg_setpoint(template, climate_zone)
325
+ PrototypeBuilding::QuickServiceRestaurant.adjust_clg_setpoint(template, climate_zone, model)
325
326
  # reset the design OA of kitchen
326
- reset_kitchen_oa(template)
327
+ PrototypeBuilding::QuickServiceRestaurant.reset_kitchen_oa(template, model)
327
328
 
328
329
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished building type specific adjustments')
329
330
 
330
331
  return true
331
332
  end
332
333
 
333
- def add_door_infiltration(template, climate_zone)
334
+ def self.add_door_infiltration(template, climate_zone, model)
334
335
  # add extra infiltration for dining room door and attic (there is no attic in 'DOE Ref Pre-1980')
335
336
  unless template == 'DOE Ref 1980-2004' || template == 'DOE Ref Pre-1980'
336
- dining_space = getSpaceByName('Dining').get
337
- attic_space = getSpaceByName('Attic').get
338
- infiltration_diningdoor = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(self)
339
- infiltration_attic = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(self)
337
+ dining_space = model.getSpaceByName('Dining').get
338
+ attic_space = model.getSpaceByName('Attic').get
339
+ infiltration_diningdoor = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(model)
340
+ infiltration_attic = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(model)
340
341
  infiltration_diningdoor.setName('Dining door Infiltration')
341
342
  infiltration_per_zone_diningdoor = 0
342
343
  infiltration_per_zone_attic = 0.0729
343
344
  if template == '90.1-2004'
344
345
  infiltration_per_zone_diningdoor = 0.902834611
345
- infiltration_diningdoor.setSchedule(add_schedule('RestaurantFastFood DOOR_INFIL_SCH'))
346
+ infiltration_diningdoor.setSchedule(model.add_schedule('RestaurantFastFood DOOR_INFIL_SCH'))
346
347
  elsif template == '90.1-2007'
347
348
  case climate_zone
348
349
  when 'ASHRAE 169-2006-1A', 'ASHRAE 169-2006-2A', 'ASHRAE 169-2006-2B', 'ASHRAE 169-2006-3A', 'ASHRAE 169-2006-3B',
349
350
  'ASHRAE 169-2006-3C', 'ASHRAE 169-2006-4A', 'ASHRAE 169-2006-4B', 'ASHRAE 169-2006-4C'
350
351
  infiltration_per_zone_diningdoor = 0.902834611
351
- infiltration_diningdoor.setSchedule(add_schedule('RestaurantFastFood DOOR_INFIL_SCH'))
352
+ infiltration_diningdoor.setSchedule(model.add_schedule('RestaurantFastFood DOOR_INFIL_SCH'))
352
353
  else
353
354
  infiltration_per_zone_diningdoor = 0.583798439
354
- infiltration_diningdoor.setSchedule(add_schedule('RestaurantFastFood VESTIBULE_DOOR_INFIL_SCH'))
355
+ infiltration_diningdoor.setSchedule(model.add_schedule('RestaurantFastFood VESTIBULE_DOOR_INFIL_SCH'))
355
356
  end
356
357
  elsif template == '90.1-2010' || template == '90.1-2013'
357
358
  case climate_zone
358
359
  when 'ASHRAE 169-2006-1A', 'ASHRAE 169-2006-2A', 'ASHRAE 169-2006-2B', 'ASHRAE 169-2006-3A', 'ASHRAE 169-2006-3B', 'ASHRAE 169-2006-3C'
359
360
  infiltration_per_zone_diningdoor = 0.902834611
360
- infiltration_diningdoor.setSchedule(add_schedule('RestaurantFastFood DOOR_INFIL_SCH'))
361
+ infiltration_diningdoor.setSchedule(model.add_schedule('RestaurantFastFood DOOR_INFIL_SCH'))
361
362
  else
362
363
  infiltration_per_zone_diningdoor = 0.583798439
363
- infiltration_diningdoor.setSchedule(add_schedule('RestaurantFastFood VESTIBULE_DOOR_INFIL_SCH'))
364
+ infiltration_diningdoor.setSchedule(model.add_schedule('RestaurantFastFood VESTIBULE_DOOR_INFIL_SCH'))
364
365
  end
365
366
  end
366
367
  infiltration_diningdoor.setDesignFlowRate(infiltration_per_zone_diningdoor)
367
368
  infiltration_diningdoor.setSpace(dining_space)
368
369
  infiltration_attic.setDesignFlowRate(infiltration_per_zone_attic)
369
- infiltration_attic.setSchedule(add_schedule('Always On'))
370
+ infiltration_attic.setSchedule(model.add_schedule('Always On'))
370
371
  infiltration_attic.setSpace(attic_space)
371
372
  end
372
373
  end
373
374
 
374
375
  # add extra equipment for kitchen
375
- def add_extra_equip_kitchen(template)
376
- kitchen_space = getSpaceByName('Kitchen')
376
+ def self.add_extra_equip_kitchen(template, model)
377
+ kitchen_space = model.getSpaceByName('Kitchen')
377
378
  kitchen_space = kitchen_space.get
378
379
  kitchen_space_type = kitchen_space.spaceType.get
379
- elec_equip_def1 = OpenStudio::Model::ElectricEquipmentDefinition.new(self)
380
- elec_equip_def2 = OpenStudio::Model::ElectricEquipmentDefinition.new(self)
380
+ elec_equip_def1 = OpenStudio::Model::ElectricEquipmentDefinition.new(model)
381
+ elec_equip_def2 = OpenStudio::Model::ElectricEquipmentDefinition.new(model)
381
382
  elec_equip_def1.setName('Kitchen Electric Equipment Definition1')
382
383
  elec_equip_def2.setName('Kitchen Electric Equipment Definition2')
383
384
  case template
@@ -402,8 +403,8 @@ class OpenStudio::Model::Model
402
403
  elec_equip2.setName('Kitchen_Reach-in-Refrigerator')
403
404
  elec_equip1.setSpaceType(kitchen_space_type)
404
405
  elec_equip2.setSpaceType(kitchen_space_type)
405
- elec_equip1.setSchedule(add_schedule('RestaurantFastFood ALWAYS_ON'))
406
- elec_equip2.setSchedule(add_schedule('RestaurantFastFood ALWAYS_ON'))
406
+ elec_equip1.setSchedule(model.add_schedule('RestaurantFastFood ALWAYS_ON'))
407
+ elec_equip2.setSchedule(model.add_schedule('RestaurantFastFood ALWAYS_ON'))
407
408
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
408
409
  elec_equip_def1.setDesignLevel(577)
409
410
  elec_equip_def1.setFractionLatent(0)
@@ -413,42 +414,42 @@ class OpenStudio::Model::Model
413
414
  elec_equip1 = OpenStudio::Model::ElectricEquipment.new(elec_equip_def1)
414
415
  elec_equip1.setName('Kitchen_ExhFan_Equip')
415
416
  elec_equip1.setSpaceType(kitchen_space_type)
416
- elec_equip1.setSchedule(add_schedule('RestaurantFastFood Kitchen_Exhaust_SCH'))
417
+ elec_equip1.setSchedule(model.add_schedule('RestaurantFastFood Kitchen_Exhaust_SCH'))
417
418
  end
418
419
  end
419
420
 
420
- def update_sizing_zone(template)
421
+ def self.update_sizing_zone(template, model)
421
422
  case template
422
423
  when '90.1-2007', '90.1-2010', '90.1-2013'
423
- zone_sizing = getSpaceByName('Dining').get.thermalZone.get.sizingZone
424
+ zone_sizing = model.getSpaceByName('Dining').get.thermalZone.get.sizingZone
424
425
  zone_sizing.setCoolingDesignAirFlowMethod('DesignDayWithLimit')
425
426
  zone_sizing.setCoolingMinimumAirFlowperZoneFloorArea(0.003581176)
426
- zone_sizing = getSpaceByName('Kitchen').get.thermalZone.get.sizingZone
427
+ zone_sizing = model.getSpaceByName('Kitchen').get.thermalZone.get.sizingZone
427
428
  zone_sizing.setCoolingDesignAirFlowMethod('DesignDayWithLimit')
428
429
  zone_sizing.setCoolingMinimumAirFlowperZoneFloorArea(0)
429
430
  when '90.1-2004'
430
- zone_sizing = getSpaceByName('Dining').get.thermalZone.get.sizingZone
431
+ zone_sizing = model.getSpaceByName('Dining').get.thermalZone.get.sizingZone
431
432
  zone_sizing.setCoolingDesignAirFlowMethod('DesignDayWithLimit')
432
433
  zone_sizing.setCoolingMinimumAirFlowperZoneFloorArea(0.007111554)
433
- zone_sizing = getSpaceByName('Kitchen').get.thermalZone.get.sizingZone
434
+ zone_sizing = model.getSpaceByName('Kitchen').get.thermalZone.get.sizingZone
434
435
  zone_sizing.setCoolingDesignAirFlowMethod('DesignDayWithLimit')
435
436
  zone_sizing.setCoolingMinimumAirFlowperZoneFloorArea(0)
436
437
  end
437
438
  end
438
439
 
439
- def adjust_clg_setpoint(template, climate_zone)
440
+ def self.adjust_clg_setpoint(template, climate_zone, model)
440
441
  ['Dining', 'Kitchen'].each do |space_name|
441
- space_type_name = getSpaceByName(space_name).get.spaceType.get.name.get
442
+ space_type_name = model.getSpaceByName(space_name).get.spaceType.get.name.get
442
443
  thermostat_name = space_type_name + ' Thermostat'
443
- thermostat = getThermostatSetpointDualSetpointByName(thermostat_name).get
444
+ thermostat = model.getThermostatSetpointDualSetpointByName(thermostat_name).get
444
445
  case template
445
446
  when '90.1-2004', '90.1-2007', '90.1-2010'
446
447
  if climate_zone == 'ASHRAE 169-2006-2B' || climate_zone == 'ASHRAE 169-2006-1B' || climate_zone == 'ASHRAE 169-2006-3B'
447
448
  case space_name
448
449
  when 'Dining'
449
- thermostat.setCoolingSetpointTemperatureSchedule(add_schedule('RestaurantFastFood CLGSETP_SCH_NO_OPTIMUM'))
450
+ thermostat.setCoolingSetpointTemperatureSchedule(model.add_schedule('RestaurantFastFood CLGSETP_SCH_NO_OPTIMUM'))
450
451
  when 'Kitchen'
451
- thermostat.setCoolingSetpointTemperatureSchedule(add_schedule('RestaurantFastFood CLGSETP_KITCHEN_SCH_NO_OPTIMUM'))
452
+ thermostat.setCoolingSetpointTemperatureSchedule(model.add_schedule('RestaurantFastFood CLGSETP_KITCHEN_SCH_NO_OPTIMUM'))
452
453
  end
453
454
  end
454
455
  end
@@ -458,8 +459,8 @@ class OpenStudio::Model::Model
458
459
  # In order to provide sufficient OSA to replace exhaust flow through kitchen hoods (3,300 cfm),
459
460
  # modeled OSA to kitchen is different from OSA determined based on ASHRAE 62.1.
460
461
  # It takes into account the available OSA in dining as transfer air.
461
- def reset_kitchen_oa(template)
462
- space_kitchen = getSpaceByName('Kitchen').get
462
+ def self.reset_kitchen_oa(template, model)
463
+ space_kitchen = model.getSpaceByName('Kitchen').get
463
464
  ventilation = space_kitchen.designSpecificationOutdoorAir.get
464
465
  ventilation.setOutdoorAirFlowperPerson(0)
465
466
  ventilation.setOutdoorAirFlowperFloorArea(0)
@@ -471,10 +472,10 @@ class OpenStudio::Model::Model
471
472
  end
472
473
  end
473
474
 
474
- def update_exhaust_fan_efficiency(template)
475
+ def self.update_exhaust_fan_efficiency(template, model)
475
476
  case template
476
477
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
477
- getFanZoneExhausts.sort.each do |exhaust_fan|
478
+ model.getFanZoneExhausts.sort.each do |exhaust_fan|
478
479
  fan_name = exhaust_fan.name.to_s
479
480
  if fan_name.include? 'Dining'
480
481
  exhaust_fan.setFanEfficiency(1)
@@ -482,21 +483,21 @@ class OpenStudio::Model::Model
482
483
  end
483
484
  end
484
485
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
485
- getFanZoneExhausts.sort.each do |exhaust_fan|
486
+ model.getFanZoneExhausts.sort.each do |exhaust_fan|
486
487
  exhaust_fan.setFanEfficiency(1)
487
488
  exhaust_fan.setPressureRise(0.000001)
488
489
  end
489
490
  end
490
491
  end
491
492
 
492
- def add_zone_mixing(template)
493
+ def self.add_zone_mixing(template, model)
493
494
  # add zone_mixing between kitchen and dining
494
- space_kitchen = getSpaceByName('Kitchen').get
495
+ space_kitchen = model.getSpaceByName('Kitchen').get
495
496
  zone_kitchen = space_kitchen.thermalZone.get
496
- space_dining = getSpaceByName('Dining').get
497
+ space_dining = model.getSpaceByName('Dining').get
497
498
  zone_dining = space_dining.thermalZone.get
498
499
  zone_mixing_kitchen = OpenStudio::Model::ZoneMixing.new(zone_kitchen)
499
- zone_mixing_kitchen.setSchedule(add_schedule('RestaurantFastFood Hours_of_operation'))
500
+ zone_mixing_kitchen.setSchedule(model.add_schedule('RestaurantFastFood Hours_of_operation'))
500
501
  case template
501
502
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
502
503
  zone_mixing_kitchen.setDesignFlowRate(0.834532374)
@@ -509,19 +510,20 @@ class OpenStudio::Model::Model
509
510
  zone_mixing_kitchen.setDeltaTemperature(0)
510
511
  end
511
512
 
512
- def update_waterheater_loss_coefficient(template)
513
+ def self.update_waterheater_loss_coefficient(template, model)
513
514
  case template
514
515
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', 'NECB 2011'
515
- getWaterHeaterMixeds.sort.each do |water_heater|
516
+ model.getWaterHeaterMixeds.sort.each do |water_heater|
516
517
  water_heater.setOffCycleLossCoefficienttoAmbientTemperature(7.561562668)
517
518
  water_heater.setOnCycleLossCoefficienttoAmbientTemperature(7.561562668)
518
519
  end
519
520
  end
520
521
  end
521
522
 
522
- def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
523
- update_waterheater_loss_coefficient(template)
523
+ def self.custom_swh_tweaks(building_type, template, climate_zone, prototype_input, model)
524
+ PrototypeBuilding::QuickServiceRestaurant.update_waterheater_loss_coefficient(template, model)
524
525
 
525
526
  return true
526
527
  end
527
528
  end
529
+ end
@@ -1,12 +1,13 @@
1
1
 
2
2
  # Extend the class to add Medium Office specific stuff
3
- class OpenStudio::Model::Model
3
+ module PrototypeBuilding
4
+ module RetailStandalone
4
5
  # TODO: The ElectricEquipment schedules are wrong in OpenStudio Standards... It needs to be 'RetailStandalone BLDG_EQUIP_SCH' for 90.1-2010 at least but probably all
5
6
  # TODO: There is an OpenStudio bug where two heat exchangers are on the equipment list and it references the same single heat exchanger for both. This doubles the heat recovery energy.
6
7
  # TODO: The HeatExchangerAirToAir is not calculating correctly. It does not equal the legacy IDF and has higher energy usage due to that.
7
8
  # TODO: Need to determine if WaterHeater can be alone or if we need to 'fake' it.
8
9
 
9
- def define_space_type_map(building_type, template, climate_zone)
10
+ def self.define_space_type_map(building_type, template, climate_zone)
10
11
  space_type_map = nil
11
12
  case template
12
13
  when 'NECB 2011'
@@ -28,7 +29,7 @@ class OpenStudio::Model::Model
28
29
  return space_type_map
29
30
  end
30
31
 
31
- def define_hvac_system_map(building_type, template, climate_zone)
32
+ def self.define_hvac_system_map(building_type, template, climate_zone)
32
33
  system_to_space_map = [
33
34
  {
34
35
  'type' => 'PSZ-AC',
@@ -42,18 +43,18 @@ class OpenStudio::Model::Model
42
43
  return system_to_space_map
43
44
  end
44
45
 
45
- def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
46
+ def self.custom_hvac_tweaks(building_type, template, climate_zone, prototype_input, model)
46
47
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started building type specific adjustments')
47
48
 
48
49
  # Add the door infiltration for template 2004,2007,2010,2013
49
50
  case template
50
51
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
51
- entry_space = getSpaceByName('Front_Entry').get
52
- infiltration_entry = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(self)
52
+ entry_space = model.getSpaceByName('Front_Entry').get
53
+ infiltration_entry = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(model)
53
54
  infiltration_entry.setName('Entry door Infiltration')
54
55
  infiltration_per_zone = 1.418672682
55
56
  infiltration_entry.setDesignFlowRate(infiltration_per_zone)
56
- infiltration_entry.setSchedule(add_schedule('RetailStandalone INFIL_Door_Opening_SCH'))
57
+ infiltration_entry.setSchedule(model.add_schedule('RetailStandalone INFIL_Door_Opening_SCH'))
57
58
  infiltration_entry.setSpace(entry_space)
58
59
  end
59
60
 
@@ -62,19 +63,20 @@ class OpenStudio::Model::Model
62
63
  return true
63
64
  end
64
65
 
65
- def update_waterheater_loss_coefficient(template)
66
+ def self.update_waterheater_loss_coefficient(template, model)
66
67
  case template
67
68
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', 'NECB 2011'
68
- getWaterHeaterMixeds.sort.each do |water_heater|
69
+ model.getWaterHeaterMixeds.sort.each do |water_heater|
69
70
  water_heater.setOffCycleLossCoefficienttoAmbientTemperature(4.10807252)
70
71
  water_heater.setOnCycleLossCoefficienttoAmbientTemperature(4.10807252)
71
72
  end
72
73
  end
73
74
  end
74
75
 
75
- def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
76
- update_waterheater_loss_coefficient(template)
76
+ def self.custom_swh_tweaks(building_type, template, climate_zone, prototype_input, model)
77
+ PrototypeBuilding::RetailStandalone.update_waterheater_loss_coefficient(template, model)
77
78
 
78
79
  return true
79
80
  end
80
81
  end
82
+ end
@@ -1,7 +1,8 @@
1
1
 
2
- # Extend the class to add Medium Office specific stuff
3
- class OpenStudio::Model::Model
4
- def define_space_type_map(building_type, template, climate_zone)
2
+ # Modules for building-type specific methods
3
+ module PrototypeBuilding
4
+ module RetailStripmall
5
+ def self.define_space_type_map(building_type, template, climate_zone)
5
6
  space_type_map = nil
6
7
  case template
7
8
 
@@ -20,7 +21,7 @@ class OpenStudio::Model::Model
20
21
  return space_type_map
21
22
  end
22
23
 
23
- def define_hvac_system_map(building_type, template, climate_zone)
24
+ def self.define_hvac_system_map(building_type, template, climate_zone)
24
25
  system_to_space_map = [
25
26
  {
26
27
  'type' => 'PSZ-AC',
@@ -84,10 +85,10 @@ class OpenStudio::Model::Model
84
85
  return system_to_space_map
85
86
  end
86
87
 
87
- def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
88
+ def self.custom_hvac_tweaks(building_type, template, climate_zone, prototype_input, model)
88
89
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started building type specific adjustments')
89
90
 
90
- system_to_space_map = define_hvac_system_map(building_type, template, climate_zone)
91
+ system_to_space_map = PrototypeBuilding::RetailStripmall.define_hvac_system_map(building_type, template, climate_zone)
91
92
 
92
93
  # Add infiltration door opening
93
94
  # Spaces names to design infiltration rates (m3/s)
@@ -98,13 +99,13 @@ class OpenStudio::Model::Model
98
99
 
99
100
  door_infiltration_map.each_pair do |space_names, infiltration_design_flowrate|
100
101
  space_names.each do |space_name|
101
- space = getSpaceByName(space_name).get
102
+ space = model.getSpaceByName(space_name).get
102
103
  # Create the infiltration object and hook it up to the space type
103
- infiltration = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(self)
104
+ infiltration = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(model)
104
105
  infiltration.setName("#{space_name} Door Open Infiltration")
105
106
  infiltration.setSpace(space)
106
107
  infiltration.setDesignFlowRate(infiltration_design_flowrate)
107
- infiltration_schedule = add_schedule('RetailStripmall INFIL_Door_Opening_SCH')
108
+ infiltration_schedule = model.add_schedule('RetailStripmall INFIL_Door_Opening_SCH')
108
109
  if infiltration_schedule.nil?
109
110
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Can't find schedule (RetailStripmall INFIL_Door_Opening_SCH).")
110
111
  return false
@@ -119,19 +120,20 @@ class OpenStudio::Model::Model
119
120
  return true
120
121
  end # add hvac
121
122
 
122
- def update_waterheater_loss_coefficient(template)
123
+ def self.update_waterheater_loss_coefficient(template, model)
123
124
  case template
124
125
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', 'NECB 2011'
125
- getWaterHeaterMixeds.sort.each do |water_heater|
126
+ model.getWaterHeaterMixeds.sort.each do |water_heater|
126
127
  water_heater.setOffCycleLossCoefficienttoAmbientTemperature(1.205980747)
127
128
  water_heater.setOnCycleLossCoefficienttoAmbientTemperature(1.205980747)
128
129
  end
129
130
  end
130
131
  end
131
132
 
132
- def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
133
- update_waterheater_loss_coefficient(template)
133
+ def self.custom_swh_tweaks(building_type, template, climate_zone, prototype_input, model)
134
+ PrototypeBuilding::RetailStripmall.update_waterheater_loss_coefficient(template, model)
134
135
 
135
136
  return true
136
137
  end
137
138
  end
139
+ end