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 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 FullServiceRestaurant
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'
@@ -27,7 +28,7 @@ class OpenStudio::Model::Model
27
28
  return space_type_map
28
29
  end
29
30
 
30
- def define_hvac_system_map(building_type, template, climate_zone)
31
+ def self.define_hvac_system_map(building_type, template, climate_zone)
31
32
  case template
32
33
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
33
34
  system_to_space_map = [
@@ -449,72 +450,72 @@ class OpenStudio::Model::Model
449
450
  return system_to_space_map
450
451
  end
451
452
 
452
- def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
453
+ def self.custom_hvac_tweaks(building_type, template, climate_zone, prototype_input, model)
453
454
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started building type specific adjustments')
454
455
 
455
456
  # add extra equipment for kitchen
456
- add_extra_equip_kitchen(template)
457
+ PrototypeBuilding::FullServiceRestaurant.add_extra_equip_kitchen(template, model)
457
458
  # add extra infiltration for dining room door and attic
458
- add_door_infiltration(template, climate_zone)
459
+ PrototypeBuilding::FullServiceRestaurant.add_door_infiltration(template, climate_zone, model)
459
460
  # add zone_mixing between kitchen and dining
460
- add_zone_mixing(template)
461
+ PrototypeBuilding::FullServiceRestaurant.add_zone_mixing(template, model)
461
462
  # Update Sizing Zone
462
- update_sizing_zone(template)
463
+ PrototypeBuilding::FullServiceRestaurant.update_sizing_zone(template, model)
463
464
  # adjust the cooling setpoint
464
- adjust_clg_setpoint(template, climate_zone)
465
+ PrototypeBuilding::FullServiceRestaurant.adjust_clg_setpoint(template, climate_zone, model)
465
466
  # reset the design OA of kitchen
466
- reset_kitchen_oa(template)
467
+ PrototypeBuilding::FullServiceRestaurant.reset_kitchen_oa(template, model)
467
468
 
468
469
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished building type specific adjustments')
469
470
 
470
471
  return true
471
472
  end # add hvac
472
473
 
473
- def add_door_infiltration(template, climate_zone)
474
+ def self.add_door_infiltration(template, climate_zone, model)
474
475
  # add extra infiltration for dining room door and attic (there is no attic in 'DOE Ref Pre-1980')
475
476
  unless template == 'DOE Ref 1980-2004' || template == 'DOE Ref Pre-1980' || template == 'NECB 2011'
476
- dining_space = getSpaceByName('Dining').get
477
- attic_space = getSpaceByName('Attic').get
478
- infiltration_diningdoor = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(self)
479
- infiltration_attic = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(self)
477
+ dining_space = model.getSpaceByName('Dining').get
478
+ attic_space = model.getSpaceByName('Attic').get
479
+ infiltration_diningdoor = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(model)
480
+ infiltration_attic = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(model)
480
481
  infiltration_diningdoor.setName('Dining door Infiltration')
481
482
  infiltration_per_zone_diningdoor = 0
482
483
  infiltration_per_zone_attic = 0.2378
483
484
  if template == '90.1-2004'
484
485
  infiltration_per_zone_diningdoor = 0.614474994
485
- infiltration_diningdoor.setSchedule(add_schedule('RestaurantSitDown DOOR_INFIL_SCH'))
486
+ infiltration_diningdoor.setSchedule(model.add_schedule('RestaurantSitDown DOOR_INFIL_SCH'))
486
487
  elsif template == '90.1-2007'
487
488
  case climate_zone
488
489
  when 'ASHRAE 169-2006-1A', 'ASHRAE 169-2006-2A', 'ASHRAE 169-2006-2B', 'ASHRAE 169-2006-3A', 'ASHRAE 169-2006-3B',
489
490
  'ASHRAE 169-2006-3C', 'ASHRAE 169-2006-4A', 'ASHRAE 169-2006-4B', 'ASHRAE 169-2006-4C'
490
491
  infiltration_per_zone_diningdoor = 0.614474994
491
- infiltration_diningdoor.setSchedule(add_schedule('RestaurantSitDown DOOR_INFIL_SCH'))
492
+ infiltration_diningdoor.setSchedule(model.add_schedule('RestaurantSitDown DOOR_INFIL_SCH'))
492
493
  else
493
494
  infiltration_per_zone_diningdoor = 0.389828222
494
- infiltration_diningdoor.setSchedule(add_schedule('RestaurantSitDown VESTIBULE_DOOR_INFIL_SCH'))
495
+ infiltration_diningdoor.setSchedule(model.add_schedule('RestaurantSitDown VESTIBULE_DOOR_INFIL_SCH'))
495
496
  end
496
497
  elsif template == '90.1-2010' || template == '90.1-2013'
497
498
  case climate_zone
498
499
  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'
499
500
  infiltration_per_zone_diningdoor = 0.614474994
500
- infiltration_diningdoor.setSchedule(add_schedule('RestaurantSitDown DOOR_INFIL_SCH'))
501
+ infiltration_diningdoor.setSchedule(model.add_schedule('RestaurantSitDown DOOR_INFIL_SCH'))
501
502
  else
502
503
  infiltration_per_zone_diningdoor = 0.389828222
503
- infiltration_diningdoor.setSchedule(add_schedule('RestaurantSitDown VESTIBULE_DOOR_INFIL_SCH'))
504
+ infiltration_diningdoor.setSchedule(model.add_schedule('RestaurantSitDown VESTIBULE_DOOR_INFIL_SCH'))
504
505
  end
505
506
  end
506
507
  infiltration_diningdoor.setDesignFlowRate(infiltration_per_zone_diningdoor)
507
508
  infiltration_diningdoor.setSpace(dining_space)
508
509
  infiltration_attic.setDesignFlowRate(infiltration_per_zone_attic)
509
- infiltration_attic.setSchedule(add_schedule('Always On'))
510
+ infiltration_attic.setSchedule(model.add_schedule('Always On'))
510
511
  infiltration_attic.setSpace(attic_space)
511
512
  end
512
513
  end
513
514
 
514
- def update_exhaust_fan_efficiency(template)
515
+ def self.update_exhaust_fan_efficiency(template, model)
515
516
  case template
516
517
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
517
- getFanZoneExhausts.sort.each do |exhaust_fan|
518
+ model.getFanZoneExhausts.sort.each do |exhaust_fan|
518
519
  fan_name = exhaust_fan.name.to_s
519
520
  if fan_name.include? 'Dining'
520
521
  exhaust_fan.setFanEfficiency(1)
@@ -522,21 +523,21 @@ class OpenStudio::Model::Model
522
523
  end
523
524
  end
524
525
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
525
- getFanZoneExhausts.sort.each do |exhaust_fan|
526
+ model.getFanZoneExhausts.sort.each do |exhaust_fan|
526
527
  exhaust_fan.setFanEfficiency(1)
527
528
  exhaust_fan.setPressureRise(0.000001)
528
529
  end
529
530
  end
530
531
  end
531
532
 
532
- def add_zone_mixing(template)
533
+ def self.add_zone_mixing(template, model)
533
534
  # add zone_mixing between kitchen and dining
534
- space_kitchen = getSpaceByName('Kitchen').get
535
+ space_kitchen = model.getSpaceByName('Kitchen').get
535
536
  zone_kitchen = space_kitchen.thermalZone.get
536
- space_dining = getSpaceByName('Dining').get
537
+ space_dining = model.getSpaceByName('Dining').get
537
538
  zone_dining = space_dining.thermalZone.get
538
539
  zone_mixing_kitchen = OpenStudio::Model::ZoneMixing.new(zone_kitchen)
539
- zone_mixing_kitchen.setSchedule(add_schedule('RestaurantSitDown Hours_of_operation'))
540
+ zone_mixing_kitchen.setSchedule(model.add_schedule('RestaurantSitDown Hours_of_operation'))
540
541
  case template
541
542
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
542
543
  zone_mixing_kitchen.setDesignFlowRate(1.828)
@@ -550,12 +551,12 @@ class OpenStudio::Model::Model
550
551
  end
551
552
 
552
553
  # add extra equipment for kitchen
553
- def add_extra_equip_kitchen(template)
554
- kitchen_space = getSpaceByName('Kitchen')
554
+ def self.add_extra_equip_kitchen(template, model)
555
+ kitchen_space = model.getSpaceByName('Kitchen')
555
556
  kitchen_space = kitchen_space.get
556
557
  kitchen_space_type = kitchen_space.spaceType.get
557
- elec_equip_def1 = OpenStudio::Model::ElectricEquipmentDefinition.new(self)
558
- elec_equip_def2 = OpenStudio::Model::ElectricEquipmentDefinition.new(self)
558
+ elec_equip_def1 = OpenStudio::Model::ElectricEquipmentDefinition.new(model)
559
+ elec_equip_def2 = OpenStudio::Model::ElectricEquipmentDefinition.new(model)
559
560
  elec_equip_def1.setName('Kitchen Electric Equipment Definition1')
560
561
  elec_equip_def2.setName('Kitchen Electric Equipment Definition2')
561
562
  case template
@@ -580,8 +581,8 @@ class OpenStudio::Model::Model
580
581
  elec_equip2.setName('Kitchen_Reach-in-Refrigerator')
581
582
  elec_equip1.setSpaceType(kitchen_space_type)
582
583
  elec_equip2.setSpaceType(kitchen_space_type)
583
- elec_equip1.setSchedule(add_schedule('RestaurantSitDown ALWAYS_ON'))
584
- elec_equip2.setSchedule(add_schedule('RestaurantSitDown ALWAYS_ON'))
584
+ elec_equip1.setSchedule(model.add_schedule('RestaurantSitDown ALWAYS_ON'))
585
+ elec_equip2.setSchedule(model.add_schedule('RestaurantSitDown ALWAYS_ON'))
585
586
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
586
587
  elec_equip_def1.setDesignLevel(699)
587
588
  elec_equip_def1.setFractionLatent(0)
@@ -591,42 +592,42 @@ class OpenStudio::Model::Model
591
592
  elec_equip1 = OpenStudio::Model::ElectricEquipment.new(elec_equip_def1)
592
593
  elec_equip1.setName('Kitchen_ExhFan_Equip')
593
594
  elec_equip1.setSpaceType(kitchen_space_type)
594
- elec_equip1.setSchedule(add_schedule('RestaurantSitDown Kitchen_Exhaust_SCH'))
595
+ elec_equip1.setSchedule(model.add_schedule('RestaurantSitDown Kitchen_Exhaust_SCH'))
595
596
  end
596
597
  end
597
598
 
598
- def update_sizing_zone(template)
599
+ def self.update_sizing_zone(template, model)
599
600
  case template
600
601
  when '90.1-2007', '90.1-2010', '90.1-2013'
601
- zone_sizing = getSpaceByName('Dining').get.thermalZone.get.sizingZone
602
+ zone_sizing = model.getSpaceByName('Dining').get.thermalZone.get.sizingZone
602
603
  zone_sizing.setCoolingDesignAirFlowMethod('DesignDayWithLimit')
603
604
  zone_sizing.setCoolingMinimumAirFlowperZoneFloorArea(0.003581176)
604
- zone_sizing = getSpaceByName('Kitchen').get.thermalZone.get.sizingZone
605
+ zone_sizing = model.getSpaceByName('Kitchen').get.thermalZone.get.sizingZone
605
606
  zone_sizing.setCoolingDesignAirFlowMethod('DesignDayWithLimit')
606
607
  zone_sizing.setCoolingMinimumAirFlowperZoneFloorArea(0)
607
608
  when '90.1-2004'
608
- zone_sizing = getSpaceByName('Dining').get.thermalZone.get.sizingZone
609
+ zone_sizing = model.getSpaceByName('Dining').get.thermalZone.get.sizingZone
609
610
  zone_sizing.setCoolingDesignAirFlowMethod('DesignDayWithLimit')
610
611
  zone_sizing.setCoolingMinimumAirFlowperZoneFloorArea(0.007111554)
611
- zone_sizing = getSpaceByName('Kitchen').get.thermalZone.get.sizingZone
612
+ zone_sizing = model.getSpaceByName('Kitchen').get.thermalZone.get.sizingZone
612
613
  zone_sizing.setCoolingDesignAirFlowMethod('DesignDayWithLimit')
613
614
  zone_sizing.setCoolingMinimumAirFlowperZoneFloorArea(0)
614
615
  end
615
616
  end
616
617
 
617
- def adjust_clg_setpoint(template, climate_zone)
618
+ def self.adjust_clg_setpoint(template, climate_zone, model)
618
619
  ['Dining', 'Kitchen'].each do |space_name|
619
- space_type_name = getSpaceByName(space_name).get.spaceType.get.name.get
620
+ space_type_name = model.getSpaceByName(space_name).get.spaceType.get.name.get
620
621
  thermostat_name = space_type_name + ' Thermostat'
621
- thermostat = getThermostatSetpointDualSetpointByName(thermostat_name).get
622
+ thermostat = model.getThermostatSetpointDualSetpointByName(thermostat_name).get
622
623
  case template
623
624
  when '90.1-2004', '90.1-2007', '90.1-2010'
624
625
  if climate_zone == 'ASHRAE 169-2006-2B' || climate_zone == 'ASHRAE 169-2006-1B' || climate_zone == 'ASHRAE 169-2006-3B'
625
626
  case space_name
626
627
  when 'Dining'
627
- thermostat.setCoolingSetpointTemperatureSchedule(add_schedule('RestaurantSitDown CLGSETP_SCH_NO_OPTIMUM'))
628
+ thermostat.setCoolingSetpointTemperatureSchedule(model.add_schedule('RestaurantSitDown CLGSETP_SCH_NO_OPTIMUM'))
628
629
  when 'Kitchen'
629
- thermostat.setCoolingSetpointTemperatureSchedule(add_schedule('RestaurantSitDown CLGSETP_KITCHEN_SCH_NO_OPTIMUM'))
630
+ thermostat.setCoolingSetpointTemperatureSchedule(model.add_schedule('RestaurantSitDown CLGSETP_KITCHEN_SCH_NO_OPTIMUM'))
630
631
  end
631
632
  end
632
633
  end
@@ -636,8 +637,8 @@ class OpenStudio::Model::Model
636
637
  # In order to provide sufficient OSA to replace exhaust flow through kitchen hoods (3,300 cfm),
637
638
  # modeled OSA to kitchen is different from OSA determined based on ASHRAE 62.1.
638
639
  # It takes into account the available OSA in dining as transfer air.
639
- def reset_kitchen_oa(template)
640
- space_kitchen = getSpaceByName('Kitchen').get
640
+ def self.reset_kitchen_oa(template, model)
641
+ space_kitchen = model.getSpaceByName('Kitchen').get
641
642
  ventilation = space_kitchen.designSpecificationOutdoorAir.get
642
643
  ventilation.setOutdoorAirFlowperPerson(0)
643
644
  ventilation.setOutdoorAirFlowperFloorArea(0)
@@ -651,10 +652,10 @@ class OpenStudio::Model::Model
651
652
  end
652
653
  end
653
654
 
654
- def update_waterheater_loss_coefficient(template)
655
+ def self.update_waterheater_loss_coefficient(template, model)
655
656
  case template
656
657
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', 'NECB 2011'
657
- getWaterHeaterMixeds.sort.each do |water_heater|
658
+ model.getWaterHeaterMixeds.sort.each do |water_heater|
658
659
  if water_heater.name.to_s.include?('Booster')
659
660
  water_heater.setOffCycleLossCoefficienttoAmbientTemperature(1.053159296)
660
661
  water_heater.setOnCycleLossCoefficienttoAmbientTemperature(1.053159296)
@@ -666,9 +667,10 @@ class OpenStudio::Model::Model
666
667
  end
667
668
  end
668
669
 
669
- def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
670
- update_waterheater_loss_coefficient(template)
670
+ def self.custom_swh_tweaks(building_type, template, climate_zone, prototype_input, model)
671
+ PrototypeBuilding::FullServiceRestaurant.update_waterheater_loss_coefficient(template, model)
671
672
 
672
673
  return true
673
674
  end
674
675
  end
676
+ end
@@ -1,7 +1,8 @@
1
1
 
2
-
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 HighriseApartment
5
+ def self.define_space_type_map(building_type, template, climate_zone)
5
6
  space_type_map = nil
6
7
  case template
7
8
 
@@ -187,7 +188,7 @@ class OpenStudio::Model::Model
187
188
  return space_type_map
188
189
  end
189
190
 
190
- def define_hvac_system_map(building_type, template, climate_zone)
191
+ def self.define_hvac_system_map(building_type, template, climate_zone)
191
192
  system_to_space_map = [
192
193
  { 'type' => 'PSZ-AC',
193
194
  'space_names' => ['G SW Apartment'] },
@@ -354,20 +355,20 @@ class OpenStudio::Model::Model
354
355
  return system_to_space_map
355
356
  end
356
357
 
357
- def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
358
+ def self.custom_hvac_tweaks(building_type, template, climate_zone, prototype_input, model)
358
359
  # add elevator and lights&fans for the ground floor corridor
359
- add_extra_equip_corridor(template)
360
+ PrototypeBuilding::HighriseApartment.add_extra_equip_corridor(template, model)
360
361
  # add extra infiltration for ground floor corridor
361
- add_door_infiltration(template, climate_zone)
362
+ PrototypeBuilding::HighriseApartment.add_door_infiltration(template, climate_zone, model)
362
363
 
363
364
  return true
364
365
  end # add hvac
365
366
 
366
367
  # add elevator and lights&fans for the top floor corridor
367
- def add_extra_equip_corridor(template)
368
- corridor_top_space = getSpaceByName('T Corridor').get
369
- elec_equip_def1 = OpenStudio::Model::ElectricEquipmentDefinition.new(self)
370
- elec_equip_def2 = OpenStudio::Model::ElectricEquipmentDefinition.new(self)
368
+ def self.add_extra_equip_corridor(template, model)
369
+ corridor_top_space = model.getSpaceByName('T Corridor').get
370
+ elec_equip_def1 = OpenStudio::Model::ElectricEquipmentDefinition.new(model)
371
+ elec_equip_def2 = OpenStudio::Model::ElectricEquipmentDefinition.new(model)
371
372
  elec_equip_def1.setName('T Corridor Electric Equipment Definition1')
372
373
  elec_equip_def2.setName('T Corridor Electric Equipment Definition2')
373
374
  elec_equip_def1.setFractionLatent(0)
@@ -392,19 +393,19 @@ class OpenStudio::Model::Model
392
393
  elec_equip2.setName('Elevators_Lights_Fan')
393
394
  elec_equip1.setSpace(corridor_top_space)
394
395
  elec_equip2.setSpace(corridor_top_space)
395
- elec_equip1.setSchedule(add_schedule('ApartmentMidRise BLDG_ELEVATORS'))
396
+ elec_equip1.setSchedule(model.add_schedule('ApartmentMidRise BLDG_ELEVATORS'))
396
397
  case template
397
398
  when '90.1-2004', '90.1-2007'
398
- elec_equip2.setSchedule(add_schedule('ApartmentMidRise ELEV_LIGHT_FAN_SCH_24_7'))
399
+ elec_equip2.setSchedule(model.add_schedule('ApartmentMidRise ELEV_LIGHT_FAN_SCH_24_7'))
399
400
  when '90.1-2010', '90.1-2013'
400
- elec_equip2.setSchedule(add_schedule('ApartmentMidRise ELEV_LIGHT_FAN_SCH_ADD_DF'))
401
+ elec_equip2.setSchedule(model.add_schedule('ApartmentMidRise ELEV_LIGHT_FAN_SCH_ADD_DF'))
401
402
  end
402
403
  end
403
404
 
404
- def update_waterheater_loss_coefficient(template)
405
+ def self.update_waterheater_loss_coefficient(template, model)
405
406
  case template
406
407
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
407
- getWaterHeaterMixeds.sort.each do |water_heater|
408
+ model.getWaterHeaterMixeds.sort.each do |water_heater|
408
409
  water_heater.setOffCycleLossCoefficienttoAmbientTemperature(46.288874618)
409
410
  water_heater.setOnCycleLossCoefficienttoAmbientTemperature(46.288874618)
410
411
  end
@@ -412,37 +413,38 @@ class OpenStudio::Model::Model
412
413
  end
413
414
 
414
415
  # add extra infiltration for ground floor corridor
415
- def add_door_infiltration(template, climate_zone)
416
- g_corridor = getSpaceByName('G Corridor').get
417
- infiltration_g_corridor_door = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(self)
416
+ def self.add_door_infiltration(template, climate_zone, model)
417
+ g_corridor = model.getSpaceByName('G Corridor').get
418
+ infiltration_g_corridor_door = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(model)
418
419
  infiltration_g_corridor_door.setName('G Corridor door Infiltration')
419
420
  infiltration_g_corridor_door.setSpace(g_corridor)
420
421
  case template
421
422
  when '90.1-2004'
422
423
  infiltration_g_corridor_door.setDesignFlowRate(1.523916863)
423
- infiltration_g_corridor_door.setSchedule(add_schedule('ApartmentHighRise INFIL_Door_Opening_SCH_0.144'))
424
+ infiltration_g_corridor_door.setSchedule(model.add_schedule('ApartmentHighRise INFIL_Door_Opening_SCH_0.144'))
424
425
  when '90.1-2007', '90.1-2010', '90.1-2013'
425
426
  case climate_zone
426
427
  when 'ASHRAE 169-2006-1A', 'ASHRAE 169-2006-2A', 'ASHRAE 169-2006-2B'
427
428
  infiltration_g_corridor_door.setDesignFlowRate(1.523916863)
428
- infiltration_g_corridor_door.setSchedule(add_schedule('ApartmentHighRise INFIL_Door_Opening_SCH_0.144'))
429
+ infiltration_g_corridor_door.setSchedule(model.add_schedule('ApartmentHighRise INFIL_Door_Opening_SCH_0.144'))
429
430
  else
430
431
  infiltration_g_corridor_door.setDesignFlowRate(1.008078792)
431
- infiltration_g_corridor_door.setSchedule(add_schedule('ApartmentHighRise INFIL_Door_Opening_SCH_0.131'))
432
+ infiltration_g_corridor_door.setSchedule(model.add_schedule('ApartmentHighRise INFIL_Door_Opening_SCH_0.131'))
432
433
  end
433
434
  end
434
435
  end
435
436
 
436
- def update_fan_efficiency
437
- getFanOnOffs.sort.each do |fan_onoff|
437
+ def self.update_fan_efficiency(model)
438
+ model.getFanOnOffs.sort.each do |fan_onoff|
438
439
  fan_onoff.setFanEfficiency(0.53625)
439
440
  fan_onoff.setMotorEfficiency(0.825)
440
441
  end
441
442
  end
442
443
 
443
- def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
444
- update_waterheater_loss_coefficient(template)
444
+ def self.custom_swh_tweaks(building_type, template, climate_zone, prototype_input, model)
445
+ PrototypeBuilding::HighriseApartment.update_waterheater_loss_coefficient(template, model)
445
446
 
446
447
  return true
447
448
  end
448
449
  end
450
+ 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 Hospital
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'
@@ -61,7 +62,7 @@ class OpenStudio::Model::Model
61
62
  return space_type_map
62
63
  end
63
64
 
64
- def define_hvac_system_map(building_type, template, climate_zone)
65
+ def self.define_hvac_system_map(building_type, template, climate_zone)
65
66
  case template
66
67
  when '90.1-2010', '90.1-2013'
67
68
  exhaust_flow = 7200
@@ -253,7 +254,7 @@ class OpenStudio::Model::Model
253
254
  end
254
255
  end
255
256
 
256
- def define_space_multiplier
257
+ def self.define_space_multiplier
257
258
  space_multiplier_map = {
258
259
  'ER_Exam1_Mult4_Flr_1' => 4,
259
260
  'ER_Exam3_Mult4_Flr_1' => 4,
@@ -276,13 +277,13 @@ class OpenStudio::Model::Model
276
277
  return space_multiplier_map
277
278
  end
278
279
 
279
- def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
280
+ def self.custom_hvac_tweaks(building_type, template, climate_zone, prototype_input, model)
280
281
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started Adding HVAC')
281
282
 
282
- system_to_space_map = define_hvac_system_map(building_type, template, climate_zone)
283
+ system_to_space_map = PrototypeBuilding::Hospital.define_hvac_system_map(building_type, template, climate_zone)
283
284
 
284
285
  hot_water_loop = nil
285
- getPlantLoops.each do |loop|
286
+ model.getPlantLoops.each do |loop|
286
287
  # If it has a boiler:hotwater, it is the correct loop
287
288
  unless loop.supplyComponents('OS:Boiler:HotWater'.to_IddObjectType).empty?
288
289
  hot_water_loop = loop
@@ -293,29 +294,29 @@ class OpenStudio::Model::Model
293
294
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
294
295
  space_names = ['ER_Exam3_Mult4_Flr_1', 'OR2_Mult5_Flr_2', 'ICU_Flr_2', 'PatRoom5_Mult10_Flr_4', 'Lab_Flr_3']
295
296
  space_names.each do |space_name|
296
- add_humidifier(space_name, template, hot_water_loop)
297
+ PrototypeBuilding::Hospital.add_humidifier(space_name, template, hot_water_loop, model)
297
298
  end
298
299
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
299
300
  space_names = ['ER_Exam3_Mult4_Flr_1', 'OR2_Mult5_Flr_2']
300
301
  space_names.each do |space_name|
301
- add_humidifier(space_name, template, hot_water_loop)
302
+ PrototypeBuilding::Hospital.add_humidifier(space_name, template, hot_water_loop, model)
302
303
  end
303
304
  end
304
305
  else
305
306
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Model', 'Could not find hot water loop to attach humidifier to.')
306
307
  end
307
308
 
308
- reset_kitchen_oa(template)
309
- update_exhaust_fan_efficiency(template)
310
- reset_or_room_vav_minimum_damper(prototype_input, template)
309
+ PrototypeBuilding::Hospital.reset_kitchen_oa(template, model)
310
+ PrototypeBuilding::Hospital.update_exhaust_fan_efficiency(template, model)
311
+ PrototypeBuilding::Hospital.reset_or_room_vav_minimum_damper(prototype_input, template, model)
311
312
 
312
313
  return true
313
314
  end
314
315
 
315
- def update_waterheater_loss_coefficient(template)
316
+ def self.update_waterheater_loss_coefficient(template, model)
316
317
  case template
317
318
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
318
- getWaterHeaterMixeds.sort.each do |water_heater|
319
+ model.getWaterHeaterMixeds.sort.each do |water_heater|
319
320
  if water_heater.name.to_s.include?('Booster')
320
321
  water_heater.setOffCycleLossCoefficienttoAmbientTemperature(1.053159296)
321
322
  water_heater.setOnCycleLossCoefficienttoAmbientTemperature(1.053159296)
@@ -327,13 +328,13 @@ class OpenStudio::Model::Model
327
328
  end
328
329
  end
329
330
 
330
- def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
331
- update_waterheater_loss_coefficient(template)
331
+ def self.custom_swh_tweaks(building_type, template, climate_zone, prototype_input, model)
332
+ PrototypeBuilding::Hospital.update_waterheater_loss_coefficient(template, model)
332
333
  return true
333
334
  end # add swh
334
335
 
335
- def reset_kitchen_oa(template)
336
- space_kitchen = getSpaceByName('Kitchen_Flr_5').get
336
+ def self.reset_kitchen_oa(template, model)
337
+ space_kitchen = model.getSpaceByName('Kitchen_Flr_5').get
337
338
  ventilation = space_kitchen.designSpecificationOutdoorAir.get
338
339
  ventilation.setOutdoorAirFlowperPerson(0)
339
340
  ventilation.setOutdoorAirFlowperFloorArea(0)
@@ -345,32 +346,32 @@ class OpenStudio::Model::Model
345
346
  end
346
347
  end
347
348
 
348
- def update_exhaust_fan_efficiency(template)
349
+ def self.update_exhaust_fan_efficiency(template, model)
349
350
  case template
350
351
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
351
- getFanZoneExhausts.sort.each do |exhaust_fan|
352
+ model.getFanZoneExhausts.sort.each do |exhaust_fan|
352
353
  exhaust_fan.setFanEfficiency(0.16)
353
354
  exhaust_fan.setPressureRise(125)
354
355
  end
355
356
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
356
- getFanZoneExhausts.sort.each do |exhaust_fan|
357
+ model.getFanZoneExhausts.sort.each do |exhaust_fan|
357
358
  exhaust_fan.setFanEfficiency(0.338)
358
359
  exhaust_fan.setPressureRise(125)
359
360
  end
360
361
  end
361
362
  end
362
363
 
363
- def add_humidifier(space_name, template, hot_water_loop)
364
- space = getSpaceByName(space_name).get
364
+ def self.add_humidifier(space_name, template, hot_water_loop, model)
365
+ space = model.getSpaceByName(space_name).get
365
366
  zone = space.thermalZone.get
366
- humidistat = OpenStudio::Model::ZoneControlHumidistat.new(self)
367
- humidistat.setHumidifyingRelativeHumiditySetpointSchedule(add_schedule('Hospital MinRelHumSetSch'))
368
- humidistat.setDehumidifyingRelativeHumiditySetpointSchedule(add_schedule('Hospital MaxRelHumSetSch'))
367
+ humidistat = OpenStudio::Model::ZoneControlHumidistat.new(model)
368
+ humidistat.setHumidifyingRelativeHumiditySetpointSchedule(model.add_schedule('Hospital MinRelHumSetSch'))
369
+ humidistat.setDehumidifyingRelativeHumiditySetpointSchedule(model.add_schedule('Hospital MaxRelHumSetSch'))
369
370
  zone.setZoneControlHumidistat(humidistat)
370
371
 
371
- getAirLoopHVACs.each do |air_loop|
372
+ model.getAirLoopHVACs.each do |air_loop|
372
373
  if air_loop.thermalZones.include? zone
373
- humidifier = OpenStudio::Model::HumidifierSteamElectric.new(self)
374
+ humidifier = OpenStudio::Model::HumidifierSteamElectric.new(model)
374
375
  humidifier.setRatedCapacity(3.72E-5)
375
376
  humidifier.setRatedPower(100_000)
376
377
  humidifier.setName("#{air_loop.name.get} Electric Steam Humidifier")
@@ -384,12 +385,12 @@ class OpenStudio::Model::Model
384
385
  heating_coil_outlet_node = htg_coil.airOutletModelObject.get.to_Node.get
385
386
  supply_outlet_node = air_loop.supplyOutletNode
386
387
  humidifier.addToNode(heating_coil_outlet_node)
387
- humidity_spm = OpenStudio::Model::SetpointManagerSingleZoneHumidityMinimum.new(self)
388
+ humidity_spm = OpenStudio::Model::SetpointManagerSingleZoneHumidityMinimum.new(model)
388
389
  case template
389
390
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
390
- extra_elec_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(self, alwaysOnDiscreteSchedule)
391
+ extra_elec_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, model.alwaysOnDiscreteSchedule)
391
392
  extra_elec_htg_coil.setName("#{space_name} Electric Htg Coil")
392
- extra_water_htg_coil = OpenStudio::Model::CoilHeatingWater.new(self, alwaysOnDiscreteSchedule)
393
+ extra_water_htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, model.alwaysOnDiscreteSchedule)
393
394
  extra_water_htg_coil.setName("#{space_name} Water Htg Coil")
394
395
  hot_water_loop.addDemandBranchForComponent(extra_water_htg_coil)
395
396
  extra_elec_htg_coil.addToNode(supply_outlet_node)
@@ -402,31 +403,31 @@ class OpenStudio::Model::Model
402
403
  end
403
404
  end
404
405
 
405
- def hospital_add_daylighting_controls(template)
406
+ def self.hospital_add_daylighting_controls(template, model)
406
407
  space_names = ['Office1_Flr_5', 'Office3_Flr_5', 'Lobby_Records_Flr_1']
407
408
  space_names.each do |space_name|
408
- space = getSpaceByName(space_name).get
409
+ space = model.getSpaceByName(space_name).get
409
410
  space.add_daylighting_controls(template, false, false)
410
411
  end
411
412
  end
412
413
 
413
- def reset_or_room_vav_minimum_damper(prototype_input, template)
414
+ def self.reset_or_room_vav_minimum_damper(prototype_input, template, model)
414
415
  case template
415
416
  when '90.1-2004', '90.1-2007'
416
417
  return true
417
418
  when '90.1-2010', '90.1-2013'
418
- getAirTerminalSingleDuctVAVReheats.sort.each do |airterminal|
419
+ model.getAirTerminalSingleDuctVAVReheats.sort.each do |airterminal|
419
420
  airterminal_name = airterminal.name.get
420
421
  if airterminal_name.include?('OR1') || airterminal_name.include?('OR2') || airterminal_name.include?('OR3') || airterminal_name.include?('OR4')
421
422
  airterminal.setZoneMinimumAirFlowMethod('Scheduled')
422
- airterminal.setMinimumAirFlowFractionSchedule(add_schedule('Hospital OR_MinSA_Sched'))
423
+ airterminal.setMinimumAirFlowFractionSchedule(model.add_schedule('Hospital OR_MinSA_Sched'))
423
424
  end
424
425
  end
425
426
  end
426
427
  end
427
428
 
428
- def modify_hospital_oa_controller(template)
429
- getAirLoopHVACs.each do |air_loop|
429
+ def self.modify_hospital_oa_controller(template, model)
430
+ model.getAirLoopHVACs.each do |air_loop|
430
431
  oa_sys = air_loop.airLoopHVACOutdoorAirSystem.get
431
432
  oa_control = oa_sys.getControllerOutdoorAir
432
433
  case air_loop.name.get
@@ -436,3 +437,4 @@ class OpenStudio::Model::Model
436
437
  end
437
438
  end
438
439
  end
440
+ end