openstudio-standards 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 74275c6943125d0066cd1b4cee9c5e2fa3d100a4
4
- data.tar.gz: 547becd08e014166a60b964434da9405e891a3ef
3
+ metadata.gz: 3b528f4fbfe4f287e792b723a0eca90ab045cd22
4
+ data.tar.gz: 8a5d326de020f16dc1803900c901cdbfbd94b289
5
5
  SHA512:
6
- metadata.gz: b16cdb6794213963594e9b95119fd6793bc3244805a523f4e285805c32db468f24c30319999f5e37e0f33c667b8fa5f10a8a162a6cfe1663eaf183bba444617b
7
- data.tar.gz: e77a9fdd2107b1392e6805b156bbbdbeb81e1f87f85ad8d7777f4eac4c3e2b1caa6b43c93e661daa78ba5a67fa2b45be0139c0224fcf8cc56be8841a86fabe10
6
+ metadata.gz: 993958fe7f17a8ee6ec9d5a853889965a39787e7d76fe198773da1d054bc8440712cbb5b938f1c7bff23d73a00ee59112811f18bdc8fd6f236f2a023cde4d324
7
+ data.tar.gz: c7e95e06ca70daafe9aa056ec08ef2a88ce78aee4c4f0d648512979d54c37bfe16f4c35351f6d26bcbb00f3c639ad7f2d1557859ac38b39718183e5d7d069cff
@@ -712,7 +712,7 @@
712
712
  "chiller_condenser_type": null,
713
713
  "chiller_compressor_type": "Centrifugal",
714
714
  "chiller_capacity_guess": 250.0,
715
- "pszac_cooling_type": "Two Speed DX AC",
715
+ "pszac_cooling_type": "Water",
716
716
  "pszac_heating_type": "Water",
717
717
  "pszac_fan_type": "ConstantVolume",
718
718
  "pszac_supplemental_heating_type": "Electricity",
@@ -740,27 +740,27 @@
740
740
  "main_service_water_temperature_at_fixture": 140.0,
741
741
  "main_service_water_pump_head": 29891.0,
742
742
  "main_service_water_pump_motor_efficiency": 0.3,
743
- "main_service_water_parasitic_fuel_consumption_rate": 68.24,
744
- "laundry_water_heater_volume": 200.0,
743
+ "main_service_water_parasitic_fuel_consumption_rate": 10024.0,
744
+ "laundry_water_heater_volume": 300.0,
745
745
  "laundry_water_heater_fuel": "Natural Gas",
746
- "laundry_water_heater_capacity": 200000.0,
746
+ "laundry_water_heater_capacity": 300000.0,
747
747
  "laundry_service_water_temperature": 140.0,
748
748
  "laundry_service_water_flowrate_schedule": "Hospital LAUNDRY_SWH_SCH",
749
749
  "laundry_service_water_peak_flowrate": 2.8,
750
750
  "laundry_water_use_temperature": 180.0,
751
751
  "laundry_service_water_temperature_at_fixture": 180.0,
752
- "laundry_service_water_pump_head": 0.001,
753
- "laundry_service_water_pump_motor_efficiency": 0.3,
754
- "laundry_service_water_parasitic_fuel_consumption_rate": 68.24,
752
+ "laundry_service_water_pump_head": null,
753
+ "laundry_service_water_pump_motor_efficiency": null,
754
+ "laundry_service_water_parasitic_fuel_consumption_rate": 0.0,
755
755
  "booster_water_heater_volume": 6.0,
756
756
  "booster_water_heater_fuel": "Electricity",
757
- "booster_water_heater_capacity": 64831.0,
757
+ "booster_water_heater_capacity": 10236.0,
758
758
  "booster_inlet_water_temperature": 140.0,
759
759
  "booster_service_water_flowrate_schedule": "Hospital BLDG_SWH_SCH",
760
760
  "booster_service_water_peak_flowrate": 23.7,
761
761
  "booster_water_use_temperature": 180.0,
762
762
  "booster_water_temperature": 180.0,
763
- "booster_service_water_parasitic_fuel_consumption_rate": 68.24,
763
+ "booster_service_water_parasitic_fuel_consumption_rate": 0.0,
764
764
  "typical_heating_setpoint": "Hospital Bldg HtgSetp",
765
765
  "typical_cooling_setpoint": "Hospital Bldg ClgSetp",
766
766
  "ptac_cooling_type": null,
@@ -7874,7 +7874,7 @@
7874
7874
  "gas_equipment_fraction_radiant": null,
7875
7875
  "gas_equipment_fraction_lost": null,
7876
7876
  "gas_equipment_schedule": null,
7877
- "electric_equipment_per_area": 2.0,
7877
+ "electric_equipment_per_area": 1.36,
7878
7878
  "electric_equipment_fraction_latent": 0.0,
7879
7879
  "electric_equipment_fraction_radiant": 0.5,
7880
7880
  "electric_equipment_fraction_lost": 0.0,
@@ -8434,7 +8434,7 @@
8434
8434
  "gas_equipment_fraction_radiant": null,
8435
8435
  "gas_equipment_fraction_lost": null,
8436
8436
  "gas_equipment_schedule": null,
8437
- "electric_equipment_per_area": 5.0,
8437
+ "electric_equipment_per_area": 4.0,
8438
8438
  "electric_equipment_fraction_latent": 0.0,
8439
8439
  "electric_equipment_fraction_radiant": 0.5,
8440
8440
  "electric_equipment_fraction_lost": 0.0,
@@ -25686,7 +25686,7 @@
25686
25686
  "electric_equipment_fraction_latent": 0.0,
25687
25687
  "electric_equipment_fraction_radiant": 0.5,
25688
25688
  "electric_equipment_fraction_lost": 0.0,
25689
- "electric_equipment_schedule": "Hospital BLDG_EQUIP_SCH",
25689
+ "electric_equipment_schedule": "Hospital BLDG_EQUIP_EXTD_SCH",
25690
25690
  "heating_setpoint_schedule": "Hospital HTGSETP_SCH",
25691
25691
  "cooling_setpoint_schedule": "Hospital CLGSETP_SCH",
25692
25692
  "service_water_heating_peak_flow_rate": null,
@@ -25794,7 +25794,7 @@
25794
25794
  "gas_equipment_fraction_radiant": null,
25795
25795
  "gas_equipment_fraction_lost": null,
25796
25796
  "gas_equipment_schedule": null,
25797
- "electric_equipment_per_area": 2.0,
25797
+ "electric_equipment_per_area": 1.36,
25798
25798
  "electric_equipment_fraction_latent": 0.0,
25799
25799
  "electric_equipment_fraction_radiant": 0.5,
25800
25800
  "electric_equipment_fraction_lost": 0.0,
@@ -26298,7 +26298,7 @@
26298
26298
  "gas_equipment_fraction_radiant": null,
26299
26299
  "gas_equipment_fraction_lost": null,
26300
26300
  "gas_equipment_schedule": null,
26301
- "electric_equipment_per_area": 2.0,
26301
+ "electric_equipment_per_area": 1.04,
26302
26302
  "electric_equipment_fraction_latent": 0.0,
26303
26303
  "electric_equipment_fraction_radiant": 0.5,
26304
26304
  "electric_equipment_fraction_lost": 0.0,
@@ -26354,7 +26354,7 @@
26354
26354
  "gas_equipment_fraction_radiant": null,
26355
26355
  "gas_equipment_fraction_lost": null,
26356
26356
  "gas_equipment_schedule": null,
26357
- "electric_equipment_per_area": 2.92,
26357
+ "electric_equipment_per_area": 4.0,
26358
26358
  "electric_equipment_fraction_latent": 0.0,
26359
26359
  "electric_equipment_fraction_radiant": 0.5,
26360
26360
  "electric_equipment_fraction_lost": 0.0,
@@ -26384,7 +26384,7 @@
26384
26384
  "lighting_standard": "ASHRAE 90.1-2010",
26385
26385
  "lighting_primary_space_type": "Office-Enclosed",
26386
26386
  "lighting_secondary_space_type": "General",
26387
- "lighting_per_area": 1.11,
26387
+ "lighting_per_area": 1.0,
26388
26388
  "lighting_per_person": null,
26389
26389
  "additional_lighting_per_area": null,
26390
26390
  "lighting_fraction_to_return_air": 0.0,
@@ -26410,7 +26410,7 @@
26410
26410
  "gas_equipment_fraction_radiant": null,
26411
26411
  "gas_equipment_fraction_lost": null,
26412
26412
  "gas_equipment_schedule": null,
26413
- "electric_equipment_per_area": 0.73,
26413
+ "electric_equipment_per_area": 1.0,
26414
26414
  "electric_equipment_fraction_latent": 0.0,
26415
26415
  "electric_equipment_fraction_radiant": 0.5,
26416
26416
  "electric_equipment_fraction_lost": 0.0,
@@ -26526,7 +26526,7 @@
26526
26526
  "electric_equipment_fraction_latent": 0.0,
26527
26527
  "electric_equipment_fraction_radiant": 0.5,
26528
26528
  "electric_equipment_fraction_lost": 0.0,
26529
- "electric_equipment_schedule": "Hospital BLDG_EQUIP_SCH",
26529
+ "electric_equipment_schedule": "Hospital BLDG_EQUIP_EXTD_SCH",
26530
26530
  "heating_setpoint_schedule": "Hospital HTGSETP_SCH",
26531
26531
  "cooling_setpoint_schedule": "Hospital CLGSETP_SCH",
26532
26532
  "service_water_heating_peak_flow_rate": 1.0,
@@ -36960,62 +36960,6 @@
36960
36960
  "balanced_exhaust_fraction_schedule": null,
36961
36961
  "is_residential": null
36962
36962
  },
36963
- {
36964
- "template": "90.1-2013",
36965
- "building_type": "Office",
36966
- "space_type": "Attic",
36967
- "rgb": "120_149_230",
36968
- "lighting_standard": "ASHRAE 189.1-2009",
36969
- "lighting_primary_space_type": "Attics",
36970
- "lighting_secondary_space_type": "General",
36971
- "lighting_per_area": 0,
36972
- "lighting_per_person": null,
36973
- "additional_lighting_per_area": null,
36974
- "lighting_fraction_to_return_air": null,
36975
- "lighting_fraction_radiant": null,
36976
- "lighting_fraction_visible": null,
36977
- "lighting_schedule": null,
36978
- "ventilation_standard": null,
36979
- "ventilation_primary_space_type": null,
36980
- "ventilation_secondary_space_type": null,
36981
- "ventilation_per_area": null,
36982
- "ventilation_per_person": null,
36983
- "ventilation_air_changes": null,
36984
- "minimum_total_air_changes": null,
36985
- "occupancy_per_area": null,
36986
- "occupancy_schedule": null,
36987
- "occupancy_activity_schedule": null,
36988
- "infiltration_per_exterior_area": 0.112,
36989
- "infiltration_per_exterior_wall_area": null,
36990
- "infiltration_air_changes": null,
36991
- "infiltration_schedule": "OfficeMedium INFIL_SCH_PNNL",
36992
- "gas_equipment_per_area": null,
36993
- "gas_equipment_fraction_latent": null,
36994
- "gas_equipment_fraction_radiant": null,
36995
- "gas_equipment_fraction_lost": null,
36996
- "gas_equipment_schedule": null,
36997
- "electric_equipment_per_area": null,
36998
- "electric_equipment_fraction_latent": null,
36999
- "electric_equipment_fraction_radiant": null,
37000
- "electric_equipment_fraction_lost": null,
37001
- "electric_equipment_schedule": null,
37002
- "heating_setpoint_schedule": null,
37003
- "cooling_setpoint_schedule": null,
37004
- "service_water_heating_peak_flow_rate": null,
37005
- "service_water_heating_area": null,
37006
- "service_water_heating_peak_flow_per_area": "",
37007
- "service_water_heating_target_temperature": null,
37008
- "service_water_heating_fraction_sensible": null,
37009
- "service_water_heating_fraction_latent": null,
37010
- "service_water_heating_schedule": null,
37011
- "exhaust_fan_efficiency": null,
37012
- "exhaust_fan_power": null,
37013
- "exhaust_fan_pressure_rise": null,
37014
- "exhaust_fan_maximum_flow_rate": null,
37015
- "exhaust_schedule": null,
37016
- "balanced_exhaust_fraction_schedule": null,
37017
- "is_residential": null
37018
- },
37019
36963
  {
37020
36964
  "template": "90.1-2013",
37021
36965
  "building_type": "Office",
@@ -60467,7 +60411,7 @@
60467
60411
  "cooling_setpoint_schedule": "NECB-A-Thermostat Setpoint-Cooling",
60468
60412
  "service_water_heating_peak_flow_rate": null,
60469
60413
  "service_water_heating_area": null,
60470
- "service_water_heating_peak_flow_per_area": null,
60414
+ "service_water_heating_peak_flow_per_area": "",
60471
60415
  "service_water_heating_target_temperature": null,
60472
60416
  "service_water_heating_fraction_sensible": null,
60473
60417
  "service_water_heating_fraction_latent": null,
@@ -60523,7 +60467,7 @@
60523
60467
  "cooling_setpoint_schedule": "NECB-A-Thermostat Setpoint-Cooling",
60524
60468
  "service_water_heating_peak_flow_rate": null,
60525
60469
  "service_water_heating_area": null,
60526
- "service_water_heating_peak_flow_per_area": "",
60470
+ "service_water_heating_peak_flow_per_area": null,
60527
60471
  "service_water_heating_target_temperature": null,
60528
60472
  "service_water_heating_fraction_sensible": null,
60529
60473
  "service_water_heating_fraction_latent": null,
@@ -27,7 +27,7 @@ class OpenStudio::Model::Model
27
27
  if self.getPlantLoopByName('Hot Water Loop').is_initialized
28
28
  hot_water_loop = self.getPlantLoopByName('Hot Water Loop').get
29
29
  else
30
- hot_water_loop = self.add_hw_loop('NaturalGas')
30
+ hot_water_loop = self.add_hw_loop('NaturalGas',building_type)
31
31
  end
32
32
 
33
33
  # Retrieve the existing chilled water loop
@@ -73,7 +73,7 @@ class OpenStudio::Model::Model
73
73
  if self.getPlantLoopByName('Hot Water Loop').is_initialized
74
74
  hot_water_loop = self.getPlantLoopByName('Hot Water Loop').get
75
75
  else
76
- hot_water_loop = self.add_hw_loop('NaturalGas')
76
+ hot_water_loop = self.add_hw_loop('NaturalGas',building_type)
77
77
  end
78
78
 
79
79
  # Add the CAV
@@ -142,7 +142,7 @@ class OpenStudio::Model::Model
142
142
  elsif building_type == 'MediumOffice'
143
143
  hot_water_loop = nil
144
144
  else
145
- hot_water_loop = self.add_hw_loop('NaturalGas')
145
+ hot_water_loop = self.add_hw_loop('NaturalGas',building_type)
146
146
  end
147
147
 
148
148
  self.add_pvav(building_vintage,
@@ -162,7 +162,7 @@ class OpenStudio::Model::Model
162
162
  if self.getPlantLoopByName('Hot Water Loop').is_initialized
163
163
  hot_water_loop = self.getPlantLoopByName('Hot Water Loop').get
164
164
  else
165
- hot_water_loop = self.add_hw_loop('NaturalGas')
165
+ hot_water_loop = self.add_hw_loop('NaturalGas',building_type)
166
166
  end
167
167
 
168
168
  # Retrieve the existing chilled water loop
@@ -204,7 +204,7 @@ class OpenStudio::Model::Model
204
204
  if self.getPlantLoopByName('Hot Water Loop').is_initialized
205
205
  hot_water_loop = self.getPlantLoopByName('Hot Water Loop').get
206
206
  else
207
- hot_water_loop = self.add_hw_loop('NaturalGas')
207
+ hot_water_loop = self.add_hw_loop('NaturalGas',building_type)
208
208
  end
209
209
 
210
210
  # Retrieve the existing heat pump loop
@@ -95,14 +95,6 @@ class OpenStudio::Model::Model
95
95
  # on the flow rate of the system.
96
96
  self.applyPrototypeHVACAssumptions(building_type, building_vintage, climate_zone)
97
97
 
98
- # for 90.1-2010 Outpatient, AHU2 set minimum outdoor air flow rate as 0
99
- # AHU1 doesn't have economizer
100
- if building_type == "Outpatient"
101
- self.modify_OAcontroller(building_vintage)
102
- # For operating room 1&2 in 2010 and 2013, VAV minimum air flow is set by schedule
103
- self.reset_or_room_vav_minimum_damper(prototype_input, building_vintage)
104
- end
105
-
106
98
  # Apply the HVAC efficiency standard
107
99
  self.applyHVACEfficiencyStandard(building_vintage, climate_zone)
108
100
 
@@ -115,7 +107,7 @@ class OpenStudio::Model::Model
115
107
  self.add_daylighting_controls(building_vintage)
116
108
  end
117
109
 
118
- if building_type == "QuickServiceRestaurant" || building_type == "FullServiceRestaurant"
110
+ if building_type == "QuickServiceRestaurant" || building_type == "FullServiceRestaurant" || building_type == "Outpatient"
119
111
  self.update_exhaust_fan_efficiency(building_vintage)
120
112
  end
121
113
 
@@ -123,6 +115,15 @@ class OpenStudio::Model::Model
123
115
  self.update_fan_efficiency
124
116
  end
125
117
 
118
+ # for 90.1-2010 Outpatient, AHU2 set minimum outdoor air flow rate as 0
119
+ # AHU1 doesn't have economizer
120
+ if building_type == "Outpatient"
121
+ # remove the controller:mechanical ventilation for AHU1 OA
122
+ self.modify_OAcontroller(building_vintage)
123
+ # For operating room 1&2 in 2010 and 2013, VAV minimum air flow is set by schedule
124
+ self.reset_or_room_vav_minimum_damper(prototype_input, building_vintage)
125
+ end
126
+
126
127
  # Add output variables for debugging
127
128
  if debug
128
129
  self.request_timeseries_outputs
@@ -42,17 +42,16 @@ class OpenStudio::Model::Model
42
42
  sizing_plant.setLoopDesignTemperatureDifference(hw_delta_t_k)
43
43
 
44
44
  #hot water pump
45
- hw_pump = OpenStudio::Model::PumpVariableSpeed.new(self)
45
+ if building_type == "Outpatient"
46
+ hw_pump = OpenStudio::Model::PumpConstantSpeed.new(self)
47
+ else
48
+ hw_pump = OpenStudio::Model::PumpVariableSpeed.new(self)
49
+ end
46
50
  hw_pump.setName('Hot Water Loop Pump')
47
51
  hw_pump_head_ft_h2o = 60.0
48
52
  hw_pump_head_press_pa = OpenStudio.convert(hw_pump_head_ft_h2o, 'ftH_{2}O','Pa').get
49
53
  hw_pump.setRatedPumpHead(hw_pump_head_press_pa)
50
54
  hw_pump.setMotorEfficiency(0.9)
51
- hw_pump.setFractionofMotorInefficienciestoFluidStream(0)
52
- hw_pump.setCoefficient1ofthePartLoadPerformanceCurve(0)
53
- hw_pump.setCoefficient2ofthePartLoadPerformanceCurve(1)
54
- hw_pump.setCoefficient3ofthePartLoadPerformanceCurve(0)
55
- hw_pump.setCoefficient4ofthePartLoadPerformanceCurve(0)
56
55
  hw_pump.setPumpControlType('Intermittent')
57
56
  hw_pump.addToNode(hot_water_loop.supplyInletNode)
58
57
 
@@ -911,11 +910,7 @@ class OpenStudio::Model::Model
911
910
  zn_dsn_htg_sa_temp_f = 122 # Design VAV box to reheat to 122F
912
911
  rht_rated_air_in_temp_f = 62 # Reheat coils designed to receive 62F
913
912
  rht_rated_air_out_temp_f = 90 # Reheat coils designed to supply 90F...but zone expects 122F...?
914
- if sys_name == 'PVAV Outpatient F1'
915
- clg_sa_temp_f = 52 # for AHU1 in Outpatient, SAT is 52F
916
- else
917
- clg_sa_temp_f = 55 # Central deck clg temp operates at 55F
918
- end
913
+ clg_sa_temp_f = 55 # Central deck clg temp operates at 55F
919
914
 
920
915
  sys_dsn_prhtg_temp_c = OpenStudio.convert(sys_dsn_prhtg_temp_f,'F','C').get
921
916
  sys_dsn_clg_sa_temp_c = OpenStudio.convert(sys_dsn_clg_sa_temp_f,'F','C').get
@@ -941,12 +936,33 @@ class OpenStudio::Model::Model
941
936
  end
942
937
  air_loop.setAvailabilitySchedule(hvac_op_sch)
943
938
 
939
+ # Some exceptions for the Outpatient
940
+ if sys_name.include? "PVAV Outpatient F1"
941
+ # Outpatient two AHU1 and AHU2 have different HVAC schedule
942
+ hvac_op_sch = self.add_schedule('OutPatientHealthCare AHU1-Fan_Pre2004')
943
+ # Outpatient has different temperature settings for sizing
944
+ clg_sa_temp_f = 52 # for AHU1 in Outpatient, SAT is 52F
945
+ if standard == 'DOE Ref 1980-2004' || standard == 'DOE Ref Pre-1980'
946
+ sys_dsn_clg_sa_temp_f = 52
947
+ else
948
+ sys_dsn_clg_sa_temp_f = 45
949
+ end
950
+ zn_dsn_clg_sa_temp_f = 52 # zone cooling design SAT
951
+ zn_dsn_htg_sa_temp_f = 104 # zone heating design SAT
952
+ elsif sys_name.include? 'PVAV Outpatient F2 F3'
953
+ hvac_op_sch = self.add_schedule('OutPatientHealthCare AHU2-Fan_Pre2004')
954
+ clg_sa_temp_f = 55 # for AHU2 in Outpatient, SAT is 55F
955
+ sys_dsn_clg_sa_temp_f = 52
956
+ zn_dsn_clg_sa_temp_f = 55 # zone cooling design SAT
957
+ zn_dsn_htg_sa_temp_f = 104 # zone heating design SAT
958
+ end
959
+
944
960
  # Air handler controls
945
961
  stpt_manager = OpenStudio::Model::SetpointManagerScheduled.new(self,sa_temp_sch)
946
962
  stpt_manager.addToNode(air_loop.supplyOutletNode)
947
963
  sizing_system = air_loop.sizingSystem
948
964
  # sizing_system.setPreheatDesignTemperature(sys_dsn_prhtg_temp_c)
949
- # sizing_system.setCentralCoolingDesignSupplyAirTemperature(sys_dsn_clg_sa_temp_c)
965
+ sizing_system.setCentralCoolingDesignSupplyAirTemperature(sys_dsn_clg_sa_temp_c)
950
966
  sizing_system.setCentralHeatingDesignSupplyAirTemperature(sys_dsn_htg_sa_temp_c)
951
967
  sizing_system.setSizingOption('Coincident')
952
968
  sizing_system.setAllOutdoorAirinCooling(false)
@@ -982,10 +998,10 @@ class OpenStudio::Model::Model
982
998
 
983
999
  # Outdoor air intake system
984
1000
  oa_intake_controller = OpenStudio::Model::ControllerOutdoorAir.new(self)
985
- oa_intake = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(self, oa_intake_controller)
986
- oa_intake.setName("#{air_loop.name} OA Sys")
987
1001
  oa_intake_controller.setMinimumLimitType('FixedMinimum')
988
1002
  oa_intake_controller.setMinimumOutdoorAirSchedule(oa_damper_sch)
1003
+ oa_intake = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(self, oa_intake_controller)
1004
+ oa_intake.setName("#{air_loop.name} OA Sys")
989
1005
  oa_intake.addToNode(air_loop.supplyInletNode)
990
1006
  controller_mv = oa_intake_controller.controllerMechanicalVentilation
991
1007
  controller_mv.setName("#{air_loop.name} Ventilation Controller")
@@ -3277,7 +3293,7 @@ class OpenStudio::Model::Model
3277
3293
  swh_pump_motor_efficiency = 1
3278
3294
  end
3279
3295
 
3280
- if building_type.nil? && ( 'template' == 'DOE Ref 1980-2004' || 'template' == 'DOE Ref Pre-1980' )
3296
+ if standard == 'DOE Ref 1980-2004' || 'template' == 'DOE Ref Pre-1980'
3281
3297
  if building_type == 'Medium Office'
3282
3298
  swh_pump = OpenStudio::Model::PumpConstantSpeed.new(self)
3283
3299
  else
@@ -4142,7 +4158,17 @@ class OpenStudio::Model::Model
4142
4158
  fan = OpenStudio::Model::FanZoneExhaust.new(self)
4143
4159
  fan.setName("#{zone.name} Exhaust Fan")
4144
4160
  fan.setAvailabilitySchedule(self.add_schedule(availability_sch_name))
4145
- fan.setMaximumFlowRate(flow_rate)
4161
+ # two ways to input the flow rate: Number of Array.
4162
+ # For number: assign directly. For Array: assign each flow rate to each according zone.
4163
+ if flow_rate.is_a? Numeric
4164
+ fan.setMaximumFlowRate(flow_rate)
4165
+ elsif flow_rate.class.to_s == 'Array'
4166
+ index = thermal_zones.index(zone)
4167
+ flow_rate_zone = flow_rate[index]
4168
+ fan.setMaximumFlowRate(flow_rate_zone)
4169
+ else
4170
+ OpenStudio::logFree(OpenStudio::Warn, "openstudio.model.Model", "Wrong format of flow rate")
4171
+ end
4146
4172
  unless flow_fraction_schedule_name.nil?
4147
4173
  fan.setFlowFractionSchedule(self.add_schedule(flow_fraction_schedule_name))
4148
4174
  end
@@ -102,7 +102,68 @@ class OpenStudio::Model::Model
102
102
  'Floor 3 Storage 1', 'Floor 3 Storage 2', 'Floor 3 Treatment', 'Floor 3 Undeveloped 1', 'Floor 3 Undeveloped 2',
103
103
  'Floor 3 Utility', 'Floor 3 Work', 'NE Stair', 'NW Elevator', 'NW Stair', 'SW Stair'
104
104
  ]
105
+ },
106
+ {
107
+ 'type' => 'Exhaust Fan',
108
+ 'name' => 'Outpatient AHU1 Exhaust Fans',
109
+ 'availability_sch_name' => 'OutPatientHealthCare Hours_of_operation',
110
+ 'flow_rate' =>
111
+ [
112
+ 6.79561743E-02, # Floor 1 Anesthesia
113
+ 4.24726077E-02, # Floor 1 Lobby Toilet
114
+ 0.1586, # Floor 1 MRI Control Room
115
+ 0.4153, # Floor 1 MRI Room
116
+ 4.24726077E-02, # Floor 1 MRI Toilet
117
+ 4.24726077E-02, # Floor 1 Nurse Toilet
118
+ 4.24726077E-02, # Floor 1 Pre-Op Toilet
119
+ 9.91027512E-02, # Floor 1 Soil
120
+ 4.40456672E-02, # Floor 1 Soil Hold
121
+ 1.41575359E-01, # Floor 1 Soil Work
122
+ ],
123
+ 'flow_fraction_schedule_name' => nil,
124
+ 'balanced_exhaust_fraction_schedule_name' => nil,
125
+ 'space_names' =>
126
+ [
127
+ 'Floor 1 Anesthesia',
128
+ 'Floor 1 Lobby Toilet',
129
+ 'Floor 1 MRI Control Room',
130
+ 'Floor 1 MRI Room',
131
+ 'Floor 1 MRI Toilet',
132
+ 'Floor 1 Nurse Toilet',
133
+ 'Floor 1 Pre-Op Toilet',
134
+ 'Floor 1 Soil',
135
+ 'Floor 1 Soil Hold',
136
+ 'Floor 1 Soil Work'
137
+ ]
138
+ },
139
+ {
140
+ 'type' => 'Exhaust Fan',
141
+ 'name' => 'Outpatient AHU2&3 Exhaust Fans',
142
+ 'availability_sch_name' => 'OutPatientHealthCare BLDG_OA_SCH',
143
+ 'flow_rate' =>
144
+ [
145
+ 5.03379054E-02, # Floor 2 Conference Toilet
146
+ 9.91027512E-02, # Floor 2 Reception Toilet
147
+ 4.24726077E-02, # Floor 2 Work Toilet
148
+ 0.8495, # Floor 2 X-Ray
149
+ 1.51013716E-01, # Floor 3 Lounge Toilet
150
+ 4.24726077E-02, # Floor 3 Office Toilet
151
+ 6.60685008E-02, # Floor 3 Physical Therapy Toilet
152
+ ],
153
+ 'flow_fraction_schedule_name' => nil,
154
+ 'balanced_exhaust_fraction_schedule_name' => nil,
155
+ 'space_names' =>
156
+ [
157
+ 'Floor 2 Conference Toilet',
158
+ 'Floor 2 Reception Toilet',
159
+ 'Floor 2 Work Toilet',
160
+ 'Floor 2 X-Ray',
161
+ 'Floor 3 Lounge Toilet',
162
+ 'Floor 3 Office Toilet',
163
+ 'Floor 3 Physical Therapy Toilet',
164
+ ]
105
165
  }
166
+
106
167
  ]
107
168
 
108
169
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
@@ -140,10 +201,32 @@ class OpenStudio::Model::Model
140
201
  'Floor 3 Physical Therapy 1', 'Floor 3 Physical Therapy 2',
141
202
  'Floor 3 Treatment', 'Floor 3 Work'
142
203
  ]
204
+ },
205
+ {
206
+ 'type' => 'Exhaust Fan',
207
+ 'name' => 'Outpatient AHU1 Exhaust Fans',
208
+ 'availability_sch_name' => 'OutPatientHealthCare AHU1-Fan_Pre2004',
209
+ 'flow_rate' =>
210
+ [
211
+ 0.068, # Floor 1 Anesthesia
212
+ 0.0793, # Floor 1 MRI Control Room
213
+ 0.2077, # Floor 1 MRI Room
214
+ 0.0991, # Floor 1 Soil
215
+ 0.044, # Floor 1 Soil Hold
216
+ 0.1416, # Floor 1 Soil Work
217
+ ],
218
+ 'flow_fraction_schedule_name' => nil,
219
+ 'balanced_exhaust_fraction_schedule_name' => nil,
220
+ 'space_names' =>
221
+ [
222
+ 'Floor 1 Anesthesia',
223
+ 'Floor 1 MRI Control Room',
224
+ 'Floor 1 MRI Room',
225
+ 'Floor 1 Soil',
226
+ 'Floor 1 Soil Hold',
227
+ 'Floor 1 Soil Work'
228
+ ]
143
229
  }
144
- # {
145
- # TODO exhaust fans
146
- # }
147
230
  ]
148
231
  end
149
232
 
@@ -165,7 +248,8 @@ class OpenStudio::Model::Model
165
248
  hot_water_loop = nil
166
249
  self.getPlantLoops.each do |loop|
167
250
  # If it has a boiler:hotwater, it is the correct loop
168
- if loop.supplyComponents('Boiler:HotWater'.to_IddObjectType).size > 0
251
+ if loop.supplyComponents(OpenStudio::Model::BoilerHotWater::iddObjectType).size > 0
252
+ # if loop.supplyComponents('OS_Boiler_HotWater'.to_IddObjectType).size > 0 # Another feasible expression way
169
253
  hot_water_loop = loop
170
254
  end
171
255
  end
@@ -181,6 +265,8 @@ class OpenStudio::Model::Model
181
265
  self.add_door_infiltration(building_vintage,climate_zone)
182
266
  # reset boiler sizing factor to 0.3 (default 1)
183
267
  self.reset_boiler_sizing_factor
268
+ # assign the minimum total air changes to the cooling minimum air flow in Sizing:Zone
269
+ self.apply_minimum_total_ach(building_type,building_vintage)
184
270
 
185
271
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished adding HVAC')
186
272
 
@@ -307,14 +393,6 @@ class OpenStudio::Model::Model
307
393
  end
308
394
  end
309
395
 
310
- def custom_swh_tweaks(building_type, building_vintage, climate_zone, prototype_input)
311
-
312
- self.update_waterheater_loss_coefficient(building_vintage)
313
-
314
- return true
315
-
316
- end
317
-
318
396
  # add humidifier to AHU1 (contains operating room1)
319
397
  def add_humidifier(building_vintage, hot_water_loop)
320
398
  operatingroom1_space = self.getSpaceByName('Floor 1 Operating Room 1').get
@@ -361,17 +439,20 @@ class OpenStudio::Model::Model
361
439
  # AHU1 doesn't have economizer
362
440
  def modify_OAcontroller(building_vintage)
363
441
  self.getAirLoopHVACs.each do |air_loop|
364
- oa_sys = air_loop.airLoopHVACOutdoorAirSystem.get
365
- oa_control = oa_sys.getControllerOutdoorAir
366
- if air_loop.name.get == 'PVAV Outpatient F1'
367
- oa_control.setEconomizerControlType('NoEconomizer')
368
- elsif air_loop.name.get == 'PVAV Outpatient F2 F3'
369
- case building_vintage
370
- when '90.1-2010'
371
- oa_control.setMinimumOutdoorAirFlowRate(0)
372
- else
373
- next
374
- end
442
+ oa_system = air_loop.airLoopHVACOutdoorAirSystem.get
443
+ controller_oa = oa_system.getControllerOutdoorAir
444
+ controller_mv = controller_oa.controllerMechanicalVentilation
445
+ # AHU1 OA doesn't have controller:mechanicalventilation
446
+ if air_loop.name.to_s.include? "Outpatient F1"
447
+ controller_mv.setAvailabilitySchedule(self.alwaysOffDiscreteSchedule)
448
+ # add minimum fraction of outdoor air schedule to AHU1
449
+ controller_oa.setMinimumFractionofOutdoorAirSchedule(self.add_schedule('OutPatientHealthCare AHU-1_OAminOAFracSchedule'))
450
+ # for AHU2, at vintages '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', the minimum OA schedule is not the same as
451
+ # airloop availability schedule, but separately assigned.
452
+ elsif building_vintage=='90.1-2004' || building_vintage=='90.1-2007' || building_vintage=='90.1-2010' || building_vintage=='90.1-2013'
453
+ controller_oa.setMinimumOutdoorAirSchedule(self.add_schedule('OutPatientHealthCare BLDG_OA_SCH'))
454
+ # add minimum fraction of outdoor air schedule to AHU2
455
+ controller_oa.setMinimumFractionofOutdoorAirSchedule(self.add_schedule('OutPatientHealthCare BLDG_OA_FRAC_SCH'))
375
456
  end
376
457
  end
377
458
  end
@@ -397,5 +478,67 @@ class OpenStudio::Model::Model
397
478
  boiler.setSizingFactor(0.3)
398
479
  end
399
480
  end
481
+
482
+ def update_exhaust_fan_efficiency(building_vintage)
483
+ case building_vintage
484
+ when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
485
+ self.getFanZoneExhausts.sort.each do |exhaust_fan|
486
+ fan_name = exhaust_fan.name.to_s
487
+ if (fan_name.include? "X-Ray") || (fan_name.include? "MRI Room")
488
+ exhaust_fan.setFanEfficiency(0.16)
489
+ exhaust_fan.setPressureRise(125)
490
+ else
491
+ exhaust_fan.setFanEfficiency(0.31)
492
+ exhaust_fan.setPressureRise(249)
493
+ end
494
+ end
495
+ when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
496
+ self.getFanZoneExhausts.sort.each do |exhaust_fan|
497
+ exhaust_fan.setFanEfficiency(0.338)
498
+ exhaust_fan.setPressureRise(125)
499
+ end
500
+ end
501
+ end
502
+
503
+ # assign the minimum total air changes to the cooling minimum air flow in Sizing:Zone
504
+ def apply_minimum_total_ach(building_type,building_vintage)
505
+ self.getSpaces.each do |space|
506
+ space_type_name = space.spaceType.get.standardsSpaceType.get
507
+ search_criteria = {
508
+ 'template' => building_vintage,
509
+ 'building_type' => building_type,
510
+ 'space_type' => space_type_name
511
+ }
512
+ data = find_object($os_standards['space_types'],search_criteria)
513
+
514
+ # skip space type without minimum total air changes
515
+ next if data['minimum_total_air_changes'].nil?
516
+
517
+ # calculate the minimum total air flow
518
+ minimum_total_ach = data['minimum_total_air_changes'].to_f
519
+ space_volume = space.volume
520
+ space_area = space.floorArea
521
+ minimum_airflow_per_zone = minimum_total_ach * space_volume / 3600
522
+ minimum_airflow_per_zone_floor_area = minimum_airflow_per_zone / space_area
523
+ # add minimum total air flow limit to sizing:zone
524
+ zone = space.thermalZone.get
525
+ sizingzone = zone.sizingZone
526
+ sizingzone.setCoolingDesignAirFlowMethod('DesignDayWithLimit')
527
+ case building_vintage
528
+ when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
529
+ sizingzone.setCoolingMinimumAirFlow(minimum_airflow_per_zone)
530
+ when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
531
+ sizingzone.setCoolingMinimumAirFlowperZoneFloorArea(minimum_airflow_per_zone_floor_area)
532
+ end
533
+ end
534
+ end
535
+
536
+ def custom_swh_tweaks(building_type, building_vintage, climate_zone, prototype_input)
537
+
538
+ self.update_waterheater_loss_coefficient(building_vintage)
539
+
540
+ return true
541
+
542
+ end
400
543
 
401
544
  end
@@ -17,11 +17,21 @@ class OpenStudio::Model::AirLoopHVAC
17
17
  return true
18
18
  end
19
19
 
20
+ # First time adjustment:
20
21
  # Only applies to multi-zone vav systems
21
- if self.is_multizone_vav_system
22
+ # exclusion: for Outpatient: (1) both AHU1 and AHU2 in 'DOE Ref Pre-1980' and 'DOE Ref 1980-2004'
23
+ # (2) AHU1 in 2004-2013
24
+ if self.is_multizone_vav_system && !(self.name.to_s.include? "Outpatient F1")
22
25
  self.adjust_minimum_vav_damper_positions
23
26
  end
24
27
 
28
+ # Second time adjustment:
29
+ # Only apply to 2010 and 2013 Outpatient (both AHU1 and AHU2)
30
+ # TODO maybe apply to hospital as well?
31
+ if (self.name.to_s.include? "Outpatient") && (template == '90.1-2010' || template == '90.1-2013')
32
+ self.adjust_minimum_vav_damper_positions_outpatient
33
+ end
34
+
25
35
  return true
26
36
 
27
37
  end
@@ -52,10 +62,13 @@ class OpenStudio::Model::AirLoopHVAC
52
62
  self.set_vav_damper_action(template)
53
63
 
54
64
  # Multizone VAV Optimization
55
- if self.is_multizone_vav_optimization_required(template, climate_zone)
56
- self.enable_multizone_vav_optimization
57
- else
58
- self.disable_multizone_vav_optimization
65
+ # This rule does not apply to two hospital and one outpatient systems (TODO add hospital two systems as exception)
66
+ if !(self.name.to_s.include? "Outpatient F1")
67
+ if self.is_multizone_vav_optimization_required(template, climate_zone)
68
+ self.enable_multizone_vav_optimization
69
+ else
70
+ self.disable_multizone_vav_optimization
71
+ end
59
72
  end
60
73
 
61
74
  # VAV Static Pressure Reset
@@ -665,6 +678,8 @@ class OpenStudio::Model::AirLoopHVAC
665
678
 
666
679
  economizer_required = false
667
680
 
681
+ return economizer_required if self.name.to_s.include? "Outpatient F1"
682
+
668
683
  # A big number of btu per hr as the minimum requirement
669
684
  infinity_btu_per_hr = 999999999999
670
685
  minimum_capacity_btu_per_hr = infinity_btu_per_hr
@@ -1335,6 +1350,13 @@ class OpenStudio::Model::AirLoopHVAC
1335
1350
  # return false
1336
1351
  # end
1337
1352
 
1353
+ erv_required = nil
1354
+ # ERV not applicable for medical AHUs (AHU1 in Outpatient), per AIA 2001 - 7.31.D2.
1355
+ if self.name.to_s.include? "Outpatient F1"
1356
+ erv_required = false
1357
+ return erv_required
1358
+ end
1359
+
1338
1360
  # ERV Not Applicable for AHUs that have DCV
1339
1361
  # or that have no OA intake.
1340
1362
  controller_oa = nil
@@ -1527,7 +1549,7 @@ class OpenStudio::Model::AirLoopHVAC
1527
1549
  end
1528
1550
 
1529
1551
  # Determine if an ERV is required
1530
- erv_required = nil
1552
+ # erv_required = nil
1531
1553
  if erv_cfm.nil?
1532
1554
  OpenStudio::logFree(OpenStudio::Info, "openstudio.standards.AirLoopHVAC", "For #{self.name}, ERV not required based on #{(pct_oa*100).round}% OA flow, design flow of #{dsn_flow_cfm.round}cfm, and climate zone #{climate_zone}.")
1533
1555
  erv_required = false
@@ -2041,6 +2063,41 @@ class OpenStudio::Model::AirLoopHVAC
2041
2063
  return true
2042
2064
 
2043
2065
  end
2066
+
2067
+ # For critical zones of Outpatient, if the minimum airflow rate required by the accreditation standard (AIA 2001) is significantly
2068
+ # less than the autosized peak design airflow in any of the three climate zones (Houston, Baltimore and Burlington), the minimum
2069
+ # airflow fraction of the terminal units is reduced to the value: "required minimum airflow rate / autosized peak design flow"
2070
+ # Reference: <Achieving the 30% Goal: Energy and Cost Savings Analysis of ASHRAE Standard 90.1-2010> Page109-111
2071
+ # For implementation purpose, since it is time-consuming to perform autosizing in three climate zones, just use
2072
+ # the results of the current climate zone
2073
+ def adjust_minimum_vav_damper_positions_outpatient
2074
+ self.model.getSpaces.each do |space|
2075
+ zone = space.thermalZone.get
2076
+ sizingZone = zone.sizingZone
2077
+ space_area = space.floorArea
2078
+ if sizingZone.coolingDesignAirFlowMethod == 'DesignDay'
2079
+ next
2080
+ elsif sizingZone.coolingDesignAirFlowMethod == 'DesignDayWithLimit'
2081
+ minimum_airflow_per_zone_floor_area = sizingZone.coolingMinimumAirFlowperZoneFloorArea
2082
+ minimum_airflow_per_zone = minimum_airflow_per_zone_floor_area * space_area
2083
+ # get the autosized maximum air flow of the VAV terminal
2084
+ zone.equipment.each do |equip|
2085
+ if equip.to_AirTerminalSingleDuctVAVReheat.is_initialized
2086
+ vav_terminal = equip.to_AirTerminalSingleDuctVAVReheat.get
2087
+ rated_maximum_flow_rate = vav_terminal.autosizedMaximumAirFlowRate.get
2088
+ # compare the VAV autosized maximum airflow with the minimum airflow rate required by the accreditation standard
2089
+ ratio = minimum_airflow_per_zone / rated_maximum_flow_rate
2090
+ if ratio >= 0.95
2091
+ vav_terminal.setConstantMinimumAirFlowFraction(1)
2092
+ elsif ratio < 0.95
2093
+ vav_terminal.setConstantMinimumAirFlowFraction(ratio)
2094
+ end
2095
+ end
2096
+ end
2097
+ end
2098
+ end
2099
+ return true
2100
+ end
2044
2101
 
2045
2102
  # Determine if demand control ventilation (DCV) is
2046
2103
  # required for this air loop.
@@ -2097,7 +2154,7 @@ class OpenStudio::Model::AirLoopHVAC
2097
2154
  num_people += space.numberOfPeople
2098
2155
  end
2099
2156
  end
2100
-
2157
+
2101
2158
  # Check the minimum area
2102
2159
  area_served_ft2 = OpenStudio.convert(area_served_m2, 'm^2', 'ft^2').get
2103
2160
  if area_served_ft2 < min_area_ft2
@@ -2107,7 +2164,8 @@ class OpenStudio::Model::AirLoopHVAC
2107
2164
 
2108
2165
  # Check the minimum occupancy density
2109
2166
  occ_per_ft2 = num_people / area_served_ft2
2110
- occ_per_1000_ft2 = occ_per_ft2*1000
2167
+ occ_per_1000_ft2 = occ_per_ft2*1000
2168
+
2111
2169
  if occ_per_1000_ft2 < min_occ_per_1000_ft2
2112
2170
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{self.name}: DCV is not required since the system occupant density is #{occ_per_1000_ft2.round} people/1000 ft2, but the minimum occupant density is #{min_occ_per_1000_ft2.round} people/1000 ft2.")
2113
2171
  return dcv_required
@@ -2160,7 +2218,7 @@ class OpenStudio::Model::AirLoopHVAC
2160
2218
  #
2161
2219
  # @return [Bool] Returns true if required, false if not.
2162
2220
  def enable_demand_control_ventilation()
2163
-
2221
+
2164
2222
  # Get the OA intake
2165
2223
  controller_oa = nil
2166
2224
  controller_mv = nil
@@ -2447,7 +2505,13 @@ class OpenStudio::Model::AirLoopHVAC
2447
2505
  def is_motorized_oa_damper_required(template, climate_zone)
2448
2506
 
2449
2507
  motorized_oa_damper_required = false
2450
-
2508
+
2509
+ if self.name.to_s.include? "Outpatient F1"
2510
+ motorized_oa_damper_required = true
2511
+ OpenStudio::logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{self.name}: always has a damper, the minimum OA schedule is the same as airloop availability schedule.")
2512
+ return motorized_oa_damper_required
2513
+ end
2514
+
2451
2515
  # If the system has an economizer, it must have
2452
2516
  # a motorized damper.
2453
2517
  if self.has_economizer
@@ -75,9 +75,9 @@ class OpenStudio::Model::CoilCoolingDXSingleSpeed
75
75
 
76
76
  end
77
77
 
78
- # Finds capacity in tons
78
+ # Finds capacity in Btu/hr
79
79
  #
80
- # @return [Double] capacity in tons to be used for find object
80
+ # @return [Double] capacity in Btu/hr to be used for find object
81
81
  def find_capacity()
82
82
 
83
83
  # Get the coil capacity
@@ -88,8 +88,7 @@ class OpenStudio::Model::CoilCoolingDXSingleSpeed
88
88
  capacity_w = self.autosizedRatedTotalCoolingCapacity.get
89
89
  else
90
90
  OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{self.name} capacity is not available, cannot apply efficiency standard.")
91
- successfully_set_all_properties = false
92
- return successfully_set_all_properties
91
+ return false
93
92
  end
94
93
 
95
94
  # Convert capacity to Btu/hr
@@ -22,55 +22,20 @@ class OpenStudio::Model::CoilHeatingDXSingleSpeed
22
22
 
23
23
  end
24
24
 
25
- # Finds capacity in tons
25
+ # Finds capacity in Btu/hr
26
26
  #
27
- # @return [Double] capacity in tons to be used for find object
27
+ # @return [Double] capacity in Btu/hr to be used for find object
28
28
  def find_capacity()
29
29
 
30
- # Determine supplemental heating type if unitary
31
- heat_pump = false
32
- if self.airLoopHVAC.empty?
33
- if self.containingHVACComponent.is_initialized
34
- containing_comp = containingHVACComponent.get
35
- if containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.is_initialized
36
- heat_pump = true
37
- end
38
- end
39
- end
40
-
41
30
  # Get the coil capacity
42
31
  capacity_w = nil
43
- if(heat_pump == true)
44
- containing_comp = self.containingHVACComponent.get
45
- heat_pump_comp = containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.get
46
- ccoil = heat_pump_comp.coolingCoil
47
- dxcoil = ccoil.to_CoilCoolingDXSingleSpeed.get
48
- dxcoil_name = dxcoil.name.to_s
49
- if sql_db_vars_map
50
- if sql_db_vars_map[dxcoil_name]
51
- dxcoil.setName(sql_db_vars_map[dxcoil_name])
52
- end
53
- end
54
- if dxcoil.ratedTotalCoolingCapacity.is_initialized
55
- capacity_w = dxcoil.ratedTotalCoolingCapacity.get
56
- elsif dxcoil.autosizedRatedTotalCoolingCapacity.is_initialized
57
- capacity_w = dxcoil.autosizedRatedTotalCoolingCapacity.get
58
- else
59
- OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{self.name} capacity is not available, cannot apply efficiency standard.")
60
- successfully_set_all_properties = false
61
- return successfully_set_all_properties
62
- end
63
- dxcoil.setName(dxcoil_name)
32
+ if self.ratedTotalHeatingCapacity.is_initialized
33
+ capacity_w = self.ratedTotalHeatingCapacity.get
34
+ elsif self.autosizedRatedTotalHeatingCapacity.is_initialized
35
+ capacity_w = self.autosizedRatedTotalHeatingCapacity.get
64
36
  else
65
- if self.ratedTotalHeatingCapacity.is_initialized
66
- capacity_w = self.ratedTotalHeatingCapacity.get
67
- elsif self.autosizedRatedTotalHeatingCapacity.is_initialized
68
- capacity_w = self.autosizedRatedTotalHeatingCapacity.get
69
- else
70
- OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{self.name} capacity is not available, cannot apply efficiency standard.")
71
- successfully_set_all_properties = false
72
- return successfully_set_all_properties
73
- end
37
+ OpenStudio::logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{self.name} capacity is not available, cannot apply efficiency standard.")
38
+ return false
74
39
  end
75
40
 
76
41
  # Convert capacity to Btu/hr
@@ -49,7 +49,7 @@ module Fan
49
49
  end
50
50
 
51
51
  # Find the motor efficiency
52
- motor_eff, nominal_hp = standard_minimum_motor_efficiency(template, allowed_hp)
52
+ motor_eff, nominal_hp = standard_minimum_motor_efficiency_and_size(template, allowed_hp)
53
53
 
54
54
  # Calculate the total fan efficiency
55
55
  total_fan_eff = fan_impeller_eff * motor_eff
@@ -74,8 +74,53 @@ class OpenStudio::Model::Model
74
74
 
75
75
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished run.')
76
76
 
77
- else # Use the openstudio-workflow gem
78
- OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Running with openstudio-workflow gem.')
77
+ elsif OpenStudio::Workflow::VERSION >= '1.0.0' # Use the OS 2.0 openstudio-workflow gem
78
+ OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Running with OS 2.0 openstudio-workflow gem.')
79
+
80
+ # Write OSW file for the simulation
81
+ require 'JSON'
82
+ osw_hash = {
83
+ run_dir: Dir.pwd,
84
+ seed_model: File.absolute_path(idf_path.to_s),
85
+ weather_file: File.absolute_path(epw_path.to_s),
86
+ steps: []
87
+ }
88
+ osw_path = File.join(Dir.pwd, 'workflow.osw')
89
+ File.open(osw_path, 'wb') { |f| f << JSON.pretty_generate(osw_hash) }
90
+
91
+ # Create local adapters
92
+ adapter_options = {workflow_filename: File.basename(osw_path), output_directory: File.join(Dir.pwd, 'run')}
93
+ input_adapter = OpenStudio::Workflow.load_input_adapter 'local', adapter_options
94
+ output_adapter = OpenStudio::Workflow.load_output_adapter 'local', adapter_options
95
+
96
+ # Run workflow.osw
97
+ run_options = Hash.new
98
+ run_options[:jobs] = [
99
+ { state: :queued, next_state: :initialization, options: { initial: true } },
100
+ { state: :initialization, next_state: :preprocess, job: :RunInitialization,
101
+ file: './jobs/run_initialization.rb', options: {} },
102
+ { state: :preprocess, next_state: :simulation, job: :RunPreprocess,
103
+ file: './jobs/run_preprocess.rb' , options: {} },
104
+ { state: :simulation, next_state: :finished, job: :RunEnergyPlus,
105
+ file: './jobs/run_energyplus.rb', options: {} },
106
+ { state: :finished },
107
+ { state: :errored }
108
+ ]
109
+ k = OpenStudio::Workflow::Run.new input_adapter, output_adapter, File.dirname(osw_path), run_options
110
+ final_state = k.run
111
+
112
+ # Check run status and return the sql_path
113
+ if final_state == :finished
114
+ OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished run.')
115
+ else
116
+ OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Run completed with errors.')
117
+ end
118
+ sql_path = OpenStudio::Path.new("#{Dir.pwd}/run/eplusout.sql")
119
+
120
+ OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished simulation.')
121
+
122
+ else # Use the pre OS 2.0 openstudio-workflow gem
123
+ OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Running with pre OS 2.0 openstudio-workflow gem.')
79
124
 
80
125
  # Copy the weather file to this directory
81
126
  FileUtils.copy(epw_path.to_s, run_dir)
@@ -1,3 +1,3 @@
1
1
  module OpenstudioStandards
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.3"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstudio-standards
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Parker
@@ -20,7 +20,7 @@ authors:
20
20
  autorequire:
21
21
  bindir: bin
22
22
  cert_chain: []
23
- date: 2016-04-20 00:00:00.000000000 Z
23
+ date: 2016-04-27 00:00:00.000000000 Z
24
24
  dependencies:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: bundler