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 SecondarySchool
5
+ def self.define_space_type_map(building_type, template, climate_zone)
5
6
  space_type_map = nil
6
7
 
7
8
  case template
@@ -25,7 +26,7 @@ class OpenStudio::Model::Model
25
26
  space_type_map = {
26
27
  'Audience - auditorium' => ['Auditorium_ZN_1_FLR_1'],
27
28
  'Gym - play' => ['Aux_Gym_ZN_1_FLR_1', 'Gym_ZN_1_FLR_1'],
28
- 'Washroom' => ['Bathrooms_ZN_1_FLR_1', 'Bathrooms_ZN_1_FLR_2'],
29
+ "Washroom-sch-#{sch}" => ['Bathrooms_ZN_1_FLR_1', 'Bathrooms_ZN_1_FLR_2'],
29
30
  'Conf./meet./multi-purpose' => ['Cafeteria_ZN_1_FLR_1'],
30
31
  'Classroom/lecture/training' => ['Corner_Class_1_Pod_1_ZN_1_FLR_1', 'Corner_Class_1_Pod_1_ZN_1_FLR_2', 'Corner_Class_1_Pod_2_ZN_1_FLR_1', 'Corner_Class_1_Pod_2_ZN_1_FLR_2', 'Corner_Class_1_Pod_3_ZN_1_FLR_1', 'Corner_Class_1_Pod_3_ZN_1_FLR_2', 'Corner_Class_2_Pod_1_ZN_1_FLR_1', 'Corner_Class_2_Pod_1_ZN_1_FLR_2', 'Corner_Class_2_Pod_2_ZN_1_FLR_1', 'Corner_Class_2_Pod_2_ZN_1_FLR_2', 'Corner_Class_2_Pod_3_ZN_1_FLR_1', 'Corner_Class_2_Pod_3_ZN_1_FLR_2', 'Mult_Class_1_Pod_1_ZN_1_FLR_1', 'Mult_Class_1_Pod_1_ZN_1_FLR_2', 'Mult_Class_1_Pod_2_ZN_1_FLR_1', 'Mult_Class_1_Pod_2_ZN_1_FLR_2', 'Mult_Class_1_Pod_3_ZN_1_FLR_1', 'Mult_Class_1_Pod_3_ZN_1_FLR_2', 'Mult_Class_2_Pod_1_ZN_1_FLR_1', 'Mult_Class_2_Pod_1_ZN_1_FLR_2', 'Mult_Class_2_Pod_2_ZN_1_FLR_1', 'Mult_Class_2_Pod_2_ZN_1_FLR_2', 'Mult_Class_2_Pod_3_ZN_1_FLR_1', 'Mult_Class_2_Pod_3_ZN_1_FLR_2'],
31
32
  "Corr. >= 2.4m wide-sch-#{sch}" => ['Corridor_Pod_1_ZN_1_FLR_1', 'Corridor_Pod_1_ZN_1_FLR_2', 'Corridor_Pod_2_ZN_1_FLR_1', 'Corridor_Pod_2_ZN_1_FLR_2', 'Corridor_Pod_3_ZN_1_FLR_1', 'Corridor_Pod_3_ZN_1_FLR_2', 'Main_Corridor_ZN_1_FLR_1', 'Main_Corridor_ZN_1_FLR_2'],
@@ -54,7 +55,7 @@ class OpenStudio::Model::Model
54
55
  return space_type_map
55
56
  end
56
57
 
57
- def define_hvac_system_map(building_type, template, climate_zone)
58
+ def self.define_hvac_system_map(building_type, template, climate_zone)
58
59
  system_to_space_map = nil
59
60
 
60
61
  case template
@@ -337,12 +338,12 @@ class OpenStudio::Model::Model
337
338
  return system_to_space_map
338
339
  end
339
340
 
340
- def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
341
+ def self.custom_hvac_tweaks(building_type, template, climate_zone, prototype_input, model)
341
342
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started building type specific adjustments')
342
343
 
343
- getSpaces.each do |space|
344
+ model.getSpaces.each do |space|
344
345
  if space.name.get.to_s == 'Mech_ZN_1_FLR_1'
345
- add_elevator(template,
346
+ model.add_elevator(template,
346
347
  space,
347
348
  prototype_input['number_of_elevators'],
348
349
  prototype_input['elevator_type'],
@@ -358,7 +359,8 @@ class OpenStudio::Model::Model
358
359
  return true
359
360
  end
360
361
 
361
- def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
362
+ def self.custom_swh_tweaks(building_type, template, climate_zone, prototype_input, model)
362
363
  return true
363
364
  end
364
365
  end
366
+ end
@@ -1,7 +1,8 @@
1
1
 
2
- # Extend the class to add Small Hotel 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 SmallHotel
5
+ def self.define_space_type_map(building_type, template, climate_zone)
5
6
  space_type_map = nil
6
7
 
7
8
  case template
@@ -90,7 +91,7 @@ class OpenStudio::Model::Model
90
91
  return space_type_map
91
92
  end
92
93
 
93
- def define_hvac_system_map(building_type, template, climate_zone)
94
+ def self.define_hvac_system_map(building_type, template, climate_zone)
94
95
  system_to_space_map = nil
95
96
 
96
97
  case template
@@ -469,7 +470,7 @@ class OpenStudio::Model::Model
469
470
  return system_to_space_map
470
471
  end
471
472
 
472
- def define_building_story_map(building_type, template, climate_zone)
473
+ def self.define_building_story_map(building_type, template, climate_zone)
473
474
  building_story_map = nil
474
475
 
475
476
  building_story_map = {
@@ -486,14 +487,14 @@ class OpenStudio::Model::Model
486
487
  return building_story_map
487
488
  end
488
489
 
489
- def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
490
+ def self.custom_hvac_tweaks(building_type, template, climate_zone, prototype_input, model)
490
491
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started building type specific adjustments')
491
492
 
492
493
  # add extra infiltration for corridor1 door
493
- corridor_space = getSpaceByName('CorridorFlr1')
494
+ corridor_space = model.getSpaceByName('CorridorFlr1')
494
495
  corridor_space = corridor_space.get
495
496
  unless template == 'DOE Ref 1980-2004' || template == 'DOE Ref Pre-1980'
496
- infiltration_corridor = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(self)
497
+ infiltration_corridor = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(model)
497
498
  infiltration_corridor.setName('Corridor1 door Infiltration')
498
499
  infiltration_per_zone = 0
499
500
  infiltration_per_zone = if template == '90.1-2010' || template == '90.1-2007'
@@ -502,13 +503,13 @@ class OpenStudio::Model::Model
502
503
  0.91557718
503
504
  end
504
505
  infiltration_corridor.setDesignFlowRate(infiltration_per_zone)
505
- infiltration_corridor.setSchedule(add_schedule('HotelSmall INFIL_Door_Opening_SCH'))
506
+ infiltration_corridor.setSchedule(model.add_schedule('HotelSmall INFIL_Door_Opening_SCH'))
506
507
  infiltration_corridor.setSpace(corridor_space)
507
508
  end
508
509
 
509
510
  # hardsize corridor1. put in standards in the future #TODO
510
511
  unless template == 'DOE Ref 1980-2004' || template == 'DOE Ref Pre-1980'
511
- getZoneHVACPackagedTerminalAirConditioners.sort.each do |ptac|
512
+ model.getZoneHVACPackagedTerminalAirConditioners.sort.each do |ptac|
512
513
  zone = ptac.thermalZone.get
513
514
  if zone.spaces.include?(corridor_space)
514
515
  ptac.setSupplyAirFlowRateDuringCoolingOperation(0.13)
@@ -528,7 +529,8 @@ class OpenStudio::Model::Model
528
529
  return true
529
530
  end
530
531
 
531
- def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
532
+ def self.custom_swh_tweaks(building_type, template, climate_zone, prototype_input, model)
532
533
  return true
533
534
  end
534
535
  end
536
+ end
@@ -1,7 +1,8 @@
1
1
 
2
2
  # Extend the class to add Small Office specific stuff
3
- class OpenStudio::Model::Model
4
- def define_space_type_map(building_type, template, climate_zone)
3
+ module PrototypeBuilding
4
+ module SmallOffice
5
+ def self.define_space_type_map(building_type, template, climate_zone)
5
6
  space_type_map = nil
6
7
 
7
8
  space_type_map = case template
@@ -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',
@@ -67,11 +68,12 @@ class OpenStudio::Model::Model
67
68
  return system_to_space_map
68
69
  end
69
70
 
70
- def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
71
+ def self.custom_hvac_tweaks(building_type, template, climate_zone, prototype_input, model)
71
72
  return true
72
73
  end
73
74
 
74
- def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
75
+ def self.custom_swh_tweaks(building_type, template, climate_zone, prototype_input, model)
75
76
  return true
76
77
  end
77
78
  end
79
+ end
@@ -145,14 +145,8 @@ end
145
145
  # @param [Double] COP
146
146
  # @return [Double] Seasonal Energy Efficiency Ratio
147
147
  def cop_to_seer(cop)
148
- seer = nil
149
-
150
- # First convert COP to EER
151
- eer = cop_to_eer(cop)
152
-
153
- # Next convert from EER to SEER
154
- delta = 1.1088**2 - 4.0 * 0.0182 * eer
155
- seer = (-delta**0.5 + 1.1088) / (2.0 * 0.0182)
148
+ delta = 0.3796**2 - 4.0 * 0.0076 * cop
149
+ seer = (-delta**0.5 + 0.3796) / (2.0 * 0.0076)
156
150
 
157
151
  return seer
158
152
  end
@@ -202,14 +196,25 @@ end
202
196
  #
203
197
  # @param [Double] COP
204
198
  # @return [Double] Energy Efficiency Ratio (EER)
205
- def cop_to_eer(cop)
199
+ def cop_to_eer(cop, capacity_w = nil)
206
200
  eer = nil
207
201
 
208
- # r is the ratio of supply fan power to total equipment power at the rating condition,
209
- # assumed to be 0.12 for the reference buildngs per PNNL.
210
- r = 0.12
202
+ if capacity_w.nil?
203
+ # The PNNL Method.
204
+ # r is the ratio of supply fan power to total equipment power at the rating condition,
205
+ # assumed to be 0.12 for the reference buildngs per PNNL.
206
+ r = 0.12
207
+
208
+ eer = 3.413 * (cop * (1 - r) - r)
211
209
 
212
- eer = 3.413 * (cop * (1 - r) - r)
210
+ else
211
+
212
+ # The 90.1-2013 method
213
+
214
+ # Convert the capacity to Btu/hr
215
+ capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
216
+ eer = cop / (7.84E-8 * capacity_btu_per_hr + 0.338)
217
+ end
213
218
 
214
219
  return eer
215
220
  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 Warehouse
5
+ def self.define_space_type_map(building_type, template, climate_zone)
5
6
  space_type_map = nil
6
7
 
7
8
  space_type_map = case template
@@ -23,7 +24,7 @@ class OpenStudio::Model::Model
23
24
  return space_type_map
24
25
  end
25
26
 
26
- def define_hvac_system_map(building_type, template, climate_zone)
27
+ def self.define_hvac_system_map(building_type, template, climate_zone)
27
28
  case template
28
29
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
29
30
  system_to_space_map = [
@@ -90,23 +91,24 @@ class OpenStudio::Model::Model
90
91
  return system_to_space_map
91
92
  end
92
93
 
93
- def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
94
+ def self.custom_hvac_tweaks(building_type, template, climate_zone, prototype_input, model)
94
95
  return true
95
96
  end
96
97
 
97
- def update_waterheater_loss_coefficient(template)
98
+ def self.update_waterheater_loss_coefficient(template, model)
98
99
  case template
99
100
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', 'NECB 2011'
100
- getWaterHeaterMixeds.sort.each do |water_heater|
101
+ model.getWaterHeaterMixeds.sort.each do |water_heater|
101
102
  water_heater.setOffCycleLossCoefficienttoAmbientTemperature(0.798542707)
102
103
  water_heater.setOnCycleLossCoefficienttoAmbientTemperature(0.798542707)
103
104
  end
104
105
  end
105
106
  end
106
107
 
107
- def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
108
- update_waterheater_loss_coefficient(template)
108
+ def self.custom_swh_tweaks(building_type, template, climate_zone, prototype_input, model)
109
+ PrototypeBuilding::Warehouse.update_waterheater_loss_coefficient(template, model)
109
110
 
110
111
  return true
111
112
  end
112
113
  end
114
+ end
@@ -44,7 +44,7 @@ class OpenStudio::Model::AirLoopHVAC
44
44
  def apply_standard_controls(template, climate_zone)
45
45
  # Energy Recovery Ventilation
46
46
  if energy_recovery_ventilator_required?(template, climate_zone)
47
- apply_energy_recovery_ventilator
47
+ apply_energy_recovery_ventilator(template)
48
48
  end
49
49
 
50
50
  # Economizers
@@ -1787,7 +1787,7 @@ class OpenStudio::Model::AirLoopHVAC
1787
1787
  # @param (see #economizer_required?)
1788
1788
  # @return [Bool] Returns true if required, false if not.
1789
1789
  # @todo Add exception logic for systems serving parking garage, warehouse, or multifamily
1790
- def apply_energy_recovery_ventilator
1790
+ def apply_energy_recovery_ventilator(template)
1791
1791
  # Get the oa system
1792
1792
  oa_system = nil
1793
1793
  if airLoopHVACOutdoorAirSystem.is_initialized
@@ -1800,14 +1800,25 @@ class OpenStudio::Model::AirLoopHVAC
1800
1800
  # Create an ERV
1801
1801
  erv = OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.new(model)
1802
1802
  erv.setName("#{name} ERV")
1803
- erv.setSensibleEffectivenessat100HeatingAirFlow(0.7)
1804
- erv.setLatentEffectivenessat100HeatingAirFlow(0.6)
1805
- erv.setSensibleEffectivenessat75HeatingAirFlow(0.7)
1806
- erv.setLatentEffectivenessat75HeatingAirFlow(0.6)
1807
- erv.setSensibleEffectivenessat100CoolingAirFlow(0.75)
1808
- erv.setLatentEffectivenessat100CoolingAirFlow(0.6)
1809
- erv.setSensibleEffectivenessat75CoolingAirFlow(0.75)
1810
- erv.setLatentEffectivenessat75CoolingAirFlow(0.6)
1803
+ if template == 'NECB 2011'
1804
+ erv.setSensibleEffectivenessat100HeatingAirFlow(0.5)
1805
+ erv.setLatentEffectivenessat100HeatingAirFlow(0.5)
1806
+ erv.setSensibleEffectivenessat75HeatingAirFlow(0.5)
1807
+ erv.setLatentEffectivenessat75HeatingAirFlow(0.5)
1808
+ erv.setSensibleEffectivenessat100CoolingAirFlow(0.5)
1809
+ erv.setLatentEffectivenessat100CoolingAirFlow(0.5)
1810
+ erv.setSensibleEffectivenessat75CoolingAirFlow(0.5)
1811
+ erv.setLatentEffectivenessat75CoolingAirFlow(0.5)
1812
+ else
1813
+ erv.setSensibleEffectivenessat100HeatingAirFlow(0.7)
1814
+ erv.setLatentEffectivenessat100HeatingAirFlow(0.6)
1815
+ erv.setSensibleEffectivenessat75HeatingAirFlow(0.7)
1816
+ erv.setLatentEffectivenessat75HeatingAirFlow(0.6)
1817
+ erv.setSensibleEffectivenessat100CoolingAirFlow(0.75)
1818
+ erv.setLatentEffectivenessat100CoolingAirFlow(0.6)
1819
+ erv.setSensibleEffectivenessat75CoolingAirFlow(0.75)
1820
+ erv.setLatentEffectivenessat75CoolingAirFlow(0.6)
1821
+ end
1811
1822
  erv.setSupplyAirOutletTemperatureControl(true)
1812
1823
  erv.setHeatExchangerType('Rotary')
1813
1824
  erv.setFrostControlType('ExhaustOnly')
@@ -2599,9 +2610,9 @@ class OpenStudio::Model::AirLoopHVAC
2599
2610
  def apply_vav_damper_action(template)
2600
2611
  damper_action = nil
2601
2612
  case template
2602
- when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004', '90.1-2004', 'NECB 2011'
2613
+ when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004', '90.1-2004'
2603
2614
  damper_action = 'Single Maximum'
2604
- when '90.1-2007', '90.1-2010', '90.1-2013'
2615
+ when '90.1-2007', '90.1-2010', '90.1-2013', 'NECB 2011'
2605
2616
  damper_action = 'Dual Maximum'
2606
2617
  end
2607
2618
 
@@ -73,10 +73,10 @@ module Fan
73
73
  # Get design supply air flow rate (whether autosized or hard-sized)
74
74
  dsn_air_flow_m3_per_s = 0
75
75
  dsn_air_flow_m3_per_s = if to_FanZoneExhaust.empty?
76
- if autosizedMaximumFlowRate.is_initialized
77
- autosizedMaximumFlowRate.get
78
- else
76
+ if maximumFlowRate.is_initialized
79
77
  maximumFlowRate.get
78
+ else
79
+ autosizedMaximumFlowRate.get
80
80
  end
81
81
  else
82
82
  maximumFlowRate.get
@@ -190,7 +190,7 @@ module Fan
190
190
  # TODO check COMNET and T24 ACM and PNNL 90.1 doc
191
191
  fan_impeller_eff = 0.65
192
192
 
193
- if small_fan?
193
+ if small_fan? && template != 'NECB 2011'
194
194
  fan_impeller_eff = 0.55
195
195
  end
196
196
 
@@ -225,6 +225,7 @@ module Fan
225
225
  # Assuming all fan motors are 4-pole ODP
226
226
  template_mod = template.dup
227
227
  if template == 'NECB 2011'
228
+
228
229
  if self.class.name == 'OpenStudio::Model::FanConstantVolume'
229
230
  template_mod += '-CONSTANT'
230
231
  elsif self.class.name == 'OpenStudio::Model::FanVariableVolume'
@@ -247,6 +248,8 @@ module Fan
247
248
  setFanPowerCoefficient2(power_vs_flow_curve.coefficient2x)
248
249
  setFanPowerCoefficient3(power_vs_flow_curve.coefficient3xPOW2)
249
250
  setFanPowerCoefficient4(power_vs_flow_curve.coefficient4xPOW3)
251
+ else
252
+ raise("")
250
253
  end
251
254
  end
252
255
 
@@ -156,7 +156,7 @@ class OpenStudio::Model::Model
156
156
  # Run a sizing run to calculate VLT for layer-by-layer windows.
157
157
  # Only necessary for 90.1-2010 daylighting control determination.
158
158
  if template == '90.1-2010'
159
- if runSizingRun("#{sizing_run_dir}/SizingRunVLT") == false
159
+ if runSizingRun("#{sizing_run_dir}/SRVLT") == false
160
160
  return false
161
161
  end
162
162
  end
@@ -249,7 +249,7 @@ class OpenStudio::Model::Model
249
249
  apply_prm_sizing_parameters
250
250
 
251
251
  # Run sizing run with the HVAC equipment
252
- if runSizingRun("#{sizing_run_dir}/SizingRun1") == false
252
+ if runSizingRun("#{sizing_run_dir}/SR1") == false
253
253
  return false
254
254
  end
255
255
 
@@ -286,7 +286,7 @@ class OpenStudio::Model::Model
286
286
 
287
287
  # Run sizing run with the new chillers, boilers, and
288
288
  # cooling towers to determine capacities
289
- if runSizingRun("#{sizing_run_dir}/SizingRun2") == false
289
+ if runSizingRun("#{sizing_run_dir}/SR2") == false
290
290
  return false
291
291
  end
292
292
 
@@ -3899,7 +3899,7 @@ class OpenStudio::Model::Model
3899
3899
  surface.subSurfaces.sort.each do |ss|
3900
3900
  # Reduce the size of the subsurface
3901
3901
  red = 1.0 - mult
3902
- ss.reduce_area_by_percent_by_shrinking_x(red)
3902
+ ss.reduce_area_by_percent_by_shrinking_toward_centroid(red)
3903
3903
  end
3904
3904
  end
3905
3905
  end
@@ -96,7 +96,7 @@ class OpenStudio::Model::WaterHeaterMixed
96
96
 
97
97
  when 'NECB 2011'
98
98
  volume_l_per_s = volume_m3 * 1000
99
- if capacity_btu_per_hr <= OpenStudio.convert(12, 'kW', 'Btu/hr')
99
+ if capacity_btu_per_hr <= OpenStudio.convert(12, 'kW', 'Btu/hr').get
100
100
  # Fixed water heater efficiency per PNNL
101
101
  water_heater_eff = 1
102
102
  # Calculate the max allowable standby loss (SL)
@@ -129,7 +129,7 @@ class OpenStudio::Model::WaterHeaterMixed
129
129
  base_ef, vol_drt = case template
130
130
  when '90.1-2004', '90.1-2007'
131
131
  [0.62, 0.0019]
132
- when '90.1-2010'
132
+ when '90.1-2010', 'NECB 2011'
133
133
  [0.67, 0.0019]
134
134
  when '90.1-2013'
135
135
  [0.67, 0.0005]
@@ -152,12 +152,11 @@ class OpenStudio::Model::WaterHeaterMixed
152
152
  et = 0.8
153
153
  # Calculate the max allowable standby loss (SL)
154
154
  cap_adj, vol_drt = case template
155
- when '90.1-2004', '90.1-2007', '90.1-2010'
155
+ when '90.1-2004', '90.1-2007', '90.1-2010', 'NECB 2011'
156
156
  [800, 110]
157
157
  when '90.1-2013'
158
158
  [799, 16.6]
159
159
  end
160
-
161
160
  sl_btu_per_hr = (capacity_btu_per_hr / cap_adj + vol_drt * Math.sqrt(volume_gal))
162
161
  # Calculate the skin loss coefficient (UA)
163
162
  ua_btu_per_hr_per_f = (sl_btu_per_hr * et) / 70
@@ -186,6 +185,12 @@ class OpenStudio::Model::WaterHeaterMixed
186
185
  # self.setOffCycleParasiticFuelConsumptionRate(??)
187
186
  setOffCycleParasiticHeatFractiontoTank(0.8)
188
187
 
188
+ # set part-load performance curve
189
+ if template == 'NECB 2011' && fuel_type == 'NaturalGas'
190
+ plf_vs_plr_curve = model.add_curve('SWH-EFFFPLR-NECB2011')
191
+ setPartLoadFactorCurve(plf_vs_plr_curve)
192
+ end
193
+
189
194
  # Append the name with standards information
190
195
  setName("#{name} #{water_heater_eff.round(3)} Therm Eff")
191
196
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.WaterHeaterMixed', "For #{template}: #{name}; thermal efficiency = #{water_heater_eff.round(3)}, skin-loss UA = #{ua_btu_per_hr_per_f.round}Btu/hr")
@@ -82,7 +82,12 @@ class OpenStudio::Model::Model
82
82
  OpenStudio.logFree(OpenStudio::Debug, 'openstudio.model.Model', 'Running with OS 2.x WorkflowJSON.')
83
83
 
84
84
  # Copy the weather file to this directory
85
- FileUtils.copy(epw_path.to_s, run_dir)
85
+ begin
86
+ FileUtils.copy(epw_path.to_s, "#{run_dir}/in.epw")
87
+ rescue
88
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Due to limitations on Windows file path lengths, this measure won't work unless your project is located in a directory whose filepath is less than 90 characters long, including slashes.")
89
+ return false
90
+ end
86
91
 
87
92
  workflow.setSeedFile(File.absolute_path(osm_path.to_s))
88
93
  workflow.setWeatherFile(epw_path)