openstudio-standards 0.2.12.rc4 → 0.2.13.rc3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/data/geometry/ASHRAE90120162019HighriseApartment.json +1042 -0
- data/data/geometry/ASHRAE90120162019Hospital.json +199 -0
- data/data/geometry/ASHRAE90120162019LargeHotel.json +73 -0
- data/data/geometry/ASHRAE90120162019LargeOffice.json +109 -0
- data/data/geometry/ASHRAE90120162019SecondarySchool.json +205 -0
- data/data/geometry/ASHRAECourthouse.json +112 -0
- data/data/geometry/ASHRAECourthouse.osm +26470 -0
- data/data/geometry/ASHRAELargeHotel.osm +11 -1
- data/data/geometry/ASHRAELargeOffice.json +4 -0
- data/data/geometry/ASHRAESmallDataCenter.json +1 -1
- data/data/standards/OpenStudio_Standards-ashrae_90_1(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
- data/data/standards/exclude_list.csv +19 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.boilers.json +49 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.chillers.json +293 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +25426 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +1600 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +564 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.elevators.json +349 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +164 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ground_temperatures.json +10663 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +508 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +156 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_rejection.json +44 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +184 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +3094 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_cases.json +829 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_lnup.json +562 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_compressors.json +52 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_condenser.json +220 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +156 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_walkins.json +1316 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +21446 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +554 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +68 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps.json +28 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps_heating.json +12 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.boilers.json +49 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.chillers.json +293 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +12487 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +1600 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +564 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.elevators.json +349 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +164 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ground_temperatures.json +10663 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +466 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +137 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_rejection.json +44 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +184 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +3094 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_cases.json +829 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_lnup.json +562 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_compressors.json +52 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_condenser.json +220 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +156 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_walkins.json +1316 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +21380 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +554 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +68 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps.json +28 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps_heating.json +12 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.boilers.json +49 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.chillers.json +395 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +12487 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +1600 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +592 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.elevators.json +349 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +550 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +164 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ground_temperatures.json +10663 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +466 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +137 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_rejection.json +44 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +238 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +3094 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_cases.json +829 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_lnup.json +562 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_compressors.json +52 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_condenser.json +220 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +156 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_walkins.json +1316 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +21548 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +554 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +68 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps.json +28 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps_heating.json +12 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +64 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.chillers.json +871 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +12487 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +1600 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +592 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.elevators.json +349 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +1096 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +164 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ground_temperatures.json +10663 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +886 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +194 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_rejection.json +44 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +247 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +3094 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_cases.json +829 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_lnup.json +562 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_compressors.json +52 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_condenser.json +220 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +156 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_walkins.json +1316 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +22079 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +994 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +68 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps.json +28 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps_heating.json +12 -0
- data/data/standards/manage_OpenStudio_Standards.rb +87 -37
- data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1-ALL-comstockspace_types.csv +236 -0
- data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1.csv +622 -0
- data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1space_types.csv +191 -0
- data/data/standards/openstudio_standards_duplicates_log.csv +17 -0
- data/data/standards/test_performance_expected_dd_results.csv +1971 -1171
- data/lib/openstudio-standards.rb +76 -18
- data/lib/openstudio-standards/btap/btap.model.rb +1 -1
- data/lib/openstudio-standards/btap/economics.rb +14 -11
- data/lib/openstudio-standards/btap/envelope.rb +185 -257
- data/lib/openstudio-standards/btap/fileio.rb +1 -0
- data/lib/openstudio-standards/btap/geometry.rb +21 -1
- data/lib/openstudio-standards/btap/measures.rb +12 -11
- data/lib/openstudio-standards/btap/schedules.rb +3 -12
- data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.rb +178 -0
- data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +8 -8
- data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +3 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +28 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +0 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +28 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +53 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +29 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +157 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +29 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +24 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanConstantVolume.rb +32 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanOnOff.rb +33 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +32 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.elevators.rb +25 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +366 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +144 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +11 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +24 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanConstantVolume.rb +32 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanOnOff.rb +33 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +32 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.elevators.rb +25 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +367 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +144 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +11 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +0 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +0 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.HeatExchangerAirToAirSensibleAndLatent.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerAirToAirSensibleAndLatent.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +3 -3
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +74 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +46 -30
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +23 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +26 -15
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +8 -11
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +54 -60
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +56 -60
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +38 -12
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +218 -134
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +6 -2
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +230 -134
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +60 -62
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +25 -15
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +34 -22
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +31 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +43 -28
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +48 -38
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +9 -5
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +575 -345
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +13 -19
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +13 -17
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +9 -5
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +79 -51
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +60 -60
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +2 -4
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +133 -120
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +124 -112
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +138 -66
- data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +7275 -199
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +35 -35
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +3 -3
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +4 -3
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +7 -8
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +7 -8
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +13 -14
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +7 -5
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.elevators.rb +4 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +0 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +25 -14
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +474 -89
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +35 -33
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +72 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +120 -120
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +142 -154
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +9 -3
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +11 -5
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +26 -14
- data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +270 -247
- data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
- data/lib/openstudio-standards/refs/references.rb +5 -2
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +70 -51
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.BuildingStory.rb +1 -0
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +2 -4
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +91 -2
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +4 -5
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +30 -9
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +3 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +0 -3
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +37 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +1 -3
- data/lib/openstudio-standards/standards/Standards.Construction.rb +124 -118
- data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.Fan.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.FanConstantVolume.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.FanOnOff.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +2 -4
- data/lib/openstudio-standards/standards/Standards.FanZoneExhaust.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +10 -3
- data/lib/openstudio-standards/standards/Standards.HeaderedPumpsConstantSpeed.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.Model.rb +305 -247
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -0
- data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +11 -9
- data/lib/openstudio-standards/standards/Standards.Pump.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.PumpConstantSpeed.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.ScheduleCompact.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +103 -121
- data/lib/openstudio-standards/standards/Standards.Space.rb +42 -35
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +9 -17
- data/lib/openstudio-standards/standards/Standards.SubSurface.rb +25 -27
- data/lib/openstudio-standards/standards/Standards.Surface.rb +97 -52
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +76 -25
- data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +6 -7
- data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +85 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.Standards.FanVariableVolume.rb +0 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +10 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Model.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +63 -99
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ext_ltg.json +7 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +2420 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +32 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_rejection.json +9 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +70 -40
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +105 -40
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +15 -15
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirLoopHVAC.rb +5 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +63 -99
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ext_ltg.json +7 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +1460 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +32 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_rejection.json +9 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +123 -39
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +104 -17
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +15 -15
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +32 -15
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +63 -99
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ext_ltg.json +7 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +1460 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +64 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +52 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_rejection.json +9 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +123 -39
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +112 -25
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +37 -14
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +63 -99
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ext_ltg.json +7 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.chillers.json +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +1460 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +64 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +104 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_rejection.json +9 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +125 -41
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +172 -55
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +15 -15
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps_heating.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +456 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +24 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTower.rb +19 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerSingleSpeed.rb +5 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerTwoSpeed.rb +5 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +16 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +37 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +189 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ThermalZone.rb +57 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +22 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.rb +16 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.boilers.json +68 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.chillers.json +490 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_properties.json +21244 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_sets.json +2111 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.economizers.json +676 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.elevators.json +372 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +1096 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ext_ltg.json +169 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps.json +532 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +164 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_rejection.json +49 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.motors.json +274 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.prototype_inputs.json +3094 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ref_cases.json +854 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ref_lnup.json +562 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_compressors.json +58 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_condenser.json +238 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_system.json +12 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_walkins.json +1316 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +23067 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +648 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_heaters.json +72 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_source_heat_pumps.json +31 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_source_heat_pumps_heating.json +13 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +456 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +24 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTower.rb +19 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerSingleSpeed.rb +5 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerTwoSpeed.rb +5 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +16 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +37 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +189 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ThermalZone.rb +57 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +22 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.rb +16 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.boilers.json +68 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.chillers.json +490 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_properties.json +21244 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_sets.json +2111 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.economizers.json +676 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.elevators.json +372 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +1096 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ext_ltg.json +169 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps.json +664 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +204 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_rejection.json +49 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.motors.json +274 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.prototype_inputs.json +3094 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ref_cases.json +854 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ref_lnup.json +562 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_compressors.json +58 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_condenser.json +238 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_system.json +12 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_walkins.json +1316 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +23067 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +671 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_heaters.json +72 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_source_heat_pumps.json +31 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_source_heat_pumps_heating.json +13 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +1662 -332
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.fans.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.materials.json +4994 -234
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +1743 -161
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +63 -99
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ext_ltg.json +11 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.heat_rejection.json +9 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +8 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +5967 -2727
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +63 -99
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.ext_ltg.json +10 -10
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.heat_rejection.json +9 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +7 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +5920 -2700
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.heat_rejection.json +9 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +2011 -1112
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +0 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.heat_rejection.json +9 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +1946 -1106
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.water_heaters.json +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +3 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes.Model.rb +1 -3
- data/lib/openstudio-standards/standards/cbes/cbes.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +8 -13
- data/lib/openstudio-standards/standards/deer/deer.Model.rb +2 -2
- data/lib/openstudio-standards/standards/deer/deer.PlanarSurface.rb +2 -0
- data/lib/openstudio-standards/standards/deer/deer.Space.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +0 -1
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +0 -1
- data/lib/openstudio-standards/standards/icc_iecc/icc_iecc_2015/icc_iecc_2015.rb +0 -1
- data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/btap_1980to2010.rb +2 -18
- data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +1677 -1005
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +87 -15
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +31 -19
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/curves.json +75 -0
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps.json +16 -16
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +1677 -1005
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +16 -2
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +15 -0
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +14 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/boiler_set.json +29 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +913 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/equip_eff_lim.json +52 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/erv.json +109 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/furnace_set.json +23 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +803 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +787 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/pv.json +112 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/shw_set.json +29 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/unitary_acs.json +50 -0
- data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +100 -0
- data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +33 -0
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +1729 -0
- data/lib/openstudio-standards/standards/necb/ECMS/nv.rb +189 -0
- data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +104 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +68 -33
- data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +24 -13
- data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +110 -99
- data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +24 -24
- data/lib/openstudio-standards/standards/necb/NECB2011/data/curves.json +50 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/erv.json +31 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +39278 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/led_lighting_data.json +2028 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +1745 -1297
- data/lib/openstudio-standards/standards/necb/NECB2011/daylighting_control.md +70 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/demand_controlled_ventilation.md +46 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +69 -107
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +41 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +15 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +139 -141
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +38 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +13 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +12 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +492 -240
- data/lib/openstudio-standards/standards/necb/NECB2011/led_lighting.md +51 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/lighting.rb +75 -9
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +1229 -37
- data/lib/openstudio-standards/standards/necb/NECB2011/nv.md +74 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/pv_ground.md +44 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +11 -3
- data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/qaqc_resources/neb_end_use_prices.csv +39 -84
- data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2015/data/led_lighting_data.json +2883 -0
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +2554 -1916
- data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +32 -1
- data/lib/openstudio-standards/standards/necb/NECB2017/data/led_lighting_data.json +2883 -0
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +2554 -1916
- data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +29 -0
- data/lib/openstudio-standards/standards/oeesc/oeesc_2014/oeesc_2014.rb +0 -1
- data/lib/openstudio-standards/standards/standard.rb +6 -5
- data/lib/openstudio-standards/utilities/Add_template_field_to_json.rb +3 -3
- data/lib/openstudio-standards/utilities/convert_surfaces_to_adiabatic_necb_8426.rb +54 -54
- data/lib/openstudio-standards/utilities/generate_prototype_database.rb +2 -2
- data/lib/openstudio-standards/utilities/generate_space_types.rb +3 -3
- data/lib/openstudio-standards/utilities/logging.rb +7 -7
- data/lib/openstudio-standards/utilities/necb_to_epw_map.rb +14 -14
- data/lib/openstudio-standards/utilities/os_sim_extract.rb +25 -25
- data/lib/openstudio-standards/utilities/rename_surfaces.rb +10 -13
- data/lib/openstudio-standards/utilities/round_surf_coords.rb +18 -20
- data/lib/openstudio-standards/utilities/sched_create.rb +39 -41
- data/lib/openstudio-standards/utilities/set_mult_to_adiabatic.rb +31 -31
- data/lib/openstudio-standards/utilities/simulation.rb +13 -21
- data/lib/openstudio-standards/utilities/speacetype_map_converter.rb +10 -11
- data/lib/openstudio-standards/utilities/sqlfile.rb +6 -8
- data/lib/openstudio-standards/utilities/template_measure/measure.rb +108 -0
- data/lib/openstudio-standards/utilities/template_measure/measure.xml +162 -0
- data/lib/openstudio-standards/utilities/template_measure/resources/BTAPMeasureHelper.rb +448 -0
- data/lib/openstudio-standards/utilities/template_measure/tests/test.rb +160 -0
- data/lib/openstudio-standards/utilities/weatherData1_xlsx_to_json.rb +23 -26
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/Weather.Model.rb +112 -87
- data/lib/openstudio-standards/weather/Weather.stat_file.rb +17 -17
- metadata +236 -2
@@ -99,10 +99,10 @@ class Standard
|
|
99
99
|
end_use_subcategory: nil)
|
100
100
|
fan = OpenStudio::Model::FanOnOff.new(model)
|
101
101
|
PrototypeFan.apply_base_fan_variables(fan,
|
102
|
-
fan_name:fan_name,
|
102
|
+
fan_name: fan_name,
|
103
103
|
fan_efficiency: fan_efficiency,
|
104
104
|
pressure_rise: pressure_rise,
|
105
|
-
end_use_subcategory:end_use_subcategory)
|
105
|
+
end_use_subcategory: end_use_subcategory)
|
106
106
|
fan.setMotorEfficiency(motor_efficiency) unless motor_efficiency.nil?
|
107
107
|
fan.setMotorInAirstreamFraction(motor_in_airstream_fraction) unless motor_in_airstream_fraction.nil?
|
108
108
|
return fan
|
@@ -117,10 +117,10 @@ class Standard
|
|
117
117
|
motor_in_airstream_fraction: nil,
|
118
118
|
end_use_subcategory: nil)
|
119
119
|
# check values to use
|
120
|
-
fan_efficiency
|
121
|
-
pressure_rise
|
122
|
-
motor_efficiency
|
123
|
-
motor_in_airstream_fraction
|
120
|
+
fan_efficiency ||= fan_json['fan_efficiency']
|
121
|
+
pressure_rise ||= fan_json['pressure_rise']
|
122
|
+
motor_efficiency ||= fan_json['motor_efficiency']
|
123
|
+
motor_in_airstream_fraction ||= fan_json['motor_in_airstream_fraction']
|
124
124
|
|
125
125
|
# convert values
|
126
126
|
pressure_rise = pressure_rise ? OpenStudio.convert(pressure_rise, 'inH_{2}O', 'Pa').get : nil
|
@@ -135,5 +135,4 @@ class Standard
|
|
135
135
|
end_use_subcategory: end_use_subcategory)
|
136
136
|
return fan
|
137
137
|
end
|
138
|
-
|
139
|
-
end
|
138
|
+
end
|
@@ -130,24 +130,24 @@ class Standard
|
|
130
130
|
fan_power_coefficient_4: nil,
|
131
131
|
fan_power_coefficient_5: nil)
|
132
132
|
# check values to use
|
133
|
-
fan_efficiency
|
134
|
-
pressure_rise
|
135
|
-
motor_efficiency
|
136
|
-
motor_in_airstream_fraction
|
137
|
-
fan_power_minimum_flow_rate_input_method
|
138
|
-
fan_power_minimum_flow_rate_fraction
|
139
|
-
fan_power_coefficient_1
|
140
|
-
fan_power_coefficient_2
|
141
|
-
fan_power_coefficient_3
|
142
|
-
fan_power_coefficient_4
|
143
|
-
fan_power_coefficient_5
|
133
|
+
fan_efficiency ||= fan_json['fan_efficiency']
|
134
|
+
pressure_rise ||= fan_json['pressure_rise']
|
135
|
+
motor_efficiency ||= fan_json['motor_efficiency']
|
136
|
+
motor_in_airstream_fraction ||= fan_json['motor_in_airstream_fraction']
|
137
|
+
fan_power_minimum_flow_rate_input_method ||= fan_json['fan_power_minimum_flow_rate_input_method']
|
138
|
+
fan_power_minimum_flow_rate_fraction ||= fan_json['fan_power_minimum_flow_rate_fraction']
|
139
|
+
fan_power_coefficient_1 ||= fan_json['fan_power_coefficient_1']
|
140
|
+
fan_power_coefficient_2 ||= fan_json['fan_power_coefficient_2']
|
141
|
+
fan_power_coefficient_3 ||= fan_json['fan_power_coefficient_3']
|
142
|
+
fan_power_coefficient_4 ||= fan_json['fan_power_coefficient_4']
|
143
|
+
fan_power_coefficient_5 ||= fan_json['fan_power_coefficient_5']
|
144
144
|
|
145
145
|
# convert values
|
146
146
|
pressure_rise_pa = OpenStudio.convert(pressure_rise, 'inH_{2}O', 'Pa').get unless pressure_rise.nil?
|
147
147
|
|
148
148
|
# create fan
|
149
149
|
fan = create_fan_variable_volume(model,
|
150
|
-
fan_name:fan_name,
|
150
|
+
fan_name: fan_name,
|
151
151
|
fan_efficiency: fan_efficiency,
|
152
152
|
pressure_rise: pressure_rise_pa,
|
153
153
|
motor_efficiency: motor_efficiency,
|
@@ -162,5 +162,4 @@ class Standard
|
|
162
162
|
fan_power_coefficient_5: fan_power_coefficient_5)
|
163
163
|
return fan
|
164
164
|
end
|
165
|
-
|
166
|
-
end
|
165
|
+
end
|
@@ -5,6 +5,9 @@ class Standard
|
|
5
5
|
|
6
6
|
# Sets the fan pressure rise based on the Prototype buildings inputs
|
7
7
|
def fan_zone_exhaust_apply_prototype_fan_pressure_rise(fan_zone_exhaust)
|
8
|
+
# Do not modify dummy exhaust fans
|
9
|
+
return true if fan_zone_exhaust.name.to_s.downcase.include? 'dummy'
|
10
|
+
|
8
11
|
# All exhaust fans are assumed to have a pressure rise of
|
9
12
|
# 0.5 in w.c. in the prototype building models.
|
10
13
|
pressure_rise_in_h2o = 0.5
|
@@ -27,9 +30,9 @@ class Standard
|
|
27
30
|
end_use_subcategory: nil)
|
28
31
|
|
29
32
|
# check values to use
|
30
|
-
fan_efficiency
|
31
|
-
pressure_rise
|
32
|
-
system_availability_manager_coupling_mode
|
33
|
+
fan_efficiency ||= fan_json['fan_efficiency']
|
34
|
+
pressure_rise ||= fan_json['pressure_rise']
|
35
|
+
system_availability_manager_coupling_mode ||= fan_json['system_availability_manager_coupling_mode']
|
33
36
|
|
34
37
|
# convert values
|
35
38
|
pressure_rise = pressure_rise ? OpenStudio.convert(pressure_rise, 'inH_{2}O', 'Pa').get : nil
|
@@ -59,5 +62,4 @@ class Standard
|
|
59
62
|
fan.setSystemAvailabilityManagerCouplingMode(system_availability_manager_coupling_mode) unless system_availability_manager_coupling_mode.nil?
|
60
63
|
return fan
|
61
64
|
end
|
62
|
-
|
63
|
-
end
|
65
|
+
end
|
@@ -166,6 +166,7 @@ class Standard
|
|
166
166
|
bottom_story = effective_num_stories[:story_hash].keys.first
|
167
167
|
bottom_story.spaces.each do |space|
|
168
168
|
next if space.multiplier > 1
|
169
|
+
|
169
170
|
bottom_spaces[space] = space.floorArea
|
170
171
|
end
|
171
172
|
target_space = bottom_spaces.key(bottom_spaces.values.max)
|
@@ -342,6 +343,7 @@ class Standard
|
|
342
343
|
elevator_hourly_fractions[0]
|
343
344
|
end
|
344
345
|
next if value == value_plus
|
346
|
+
|
345
347
|
day_schedule.addValue(t, elevator_hourly_fractions[hr])
|
346
348
|
end
|
347
349
|
end
|
@@ -412,8 +414,9 @@ class Standard
|
|
412
414
|
|
413
415
|
# check fraction lost on heat from elevator if traction, change to 100% lost if not setup that way.
|
414
416
|
if elevator_type == 'Traction'
|
415
|
-
elevator.definition.to_ElectricEquipmentDefinition.get.
|
417
|
+
elevator.definition.to_ElectricEquipmentDefinition.get.setFractionLatent(0.0)
|
416
418
|
elevator.definition.to_ElectricEquipmentDefinition.get.setFractionRadiant(0.0)
|
419
|
+
elevator.definition.to_ElectricEquipmentDefinition.get.setFractionLost(1.0)
|
417
420
|
end
|
418
421
|
|
419
422
|
return elevator
|
@@ -284,7 +284,6 @@ class Standard
|
|
284
284
|
# @todo - add code in to determine number of entries and canopy area from model geoemtry
|
285
285
|
# @todo - come up with better logic for entry widths
|
286
286
|
def model_create_exterior_lighting_area_length_count_hash(model, space_type_hash, use_model_for_entries_and_canopies)
|
287
|
-
|
288
287
|
# populate building_type_hashes from space_type_hash
|
289
288
|
building_type_hashes = {}
|
290
289
|
space_type_hash.each do |space_type, hash|
|
@@ -1,6 +1,5 @@
|
|
1
1
|
class Standard
|
2
2
|
def model_add_hvac(model, building_type, climate_zone, prototype_input, epw_file)
|
3
|
-
|
4
3
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started Adding HVAC')
|
5
4
|
|
6
5
|
# Get the list of HVAC systems, as defined for each building in the Prototype.building_name files
|
@@ -33,17 +32,17 @@ class Standard
|
|
33
32
|
else
|
34
33
|
# get num_chillers from prototype_input
|
35
34
|
num_chillers = prototype_input['chw_number_chillers']
|
36
|
-
if num_chillers
|
35
|
+
if num_chillers.nil? || num_chillers.to_i < 1
|
37
36
|
num_chillers = 1
|
38
37
|
end
|
39
38
|
# update num_chillers if specified in @system_to_space_map
|
40
|
-
if system['chw_number_chillers']
|
39
|
+
if !system['chw_number_chillers'].nil? && system['chw_number_chillers'].to_i > 0
|
41
40
|
num_chillers = system['chw_number_chillers']
|
42
41
|
end
|
43
42
|
|
44
43
|
# get number_cooling_towers if specified in @system_to_space_map
|
45
44
|
number_cooling_towers = 1
|
46
|
-
if system['number_cooling_towers']
|
45
|
+
if !system['number_cooling_towers'].nil? && system['number_cooling_towers'].to_i > 0
|
47
46
|
number_cooling_towers = system['number_cooling_towers']
|
48
47
|
end
|
49
48
|
|
@@ -133,7 +132,15 @@ class Standard
|
|
133
132
|
# Special logic to make a heat pump loop if necessary
|
134
133
|
heat_pump_loop = nil
|
135
134
|
if system['heating_type'] == 'Water To Air Heat Pump'
|
136
|
-
|
135
|
+
# @code_sections [90.1-2016_6.5.5.2.1]
|
136
|
+
# change highrise apartment heat rejection fan (< 5hp) from single speed to two speed evaporative fluid cooler
|
137
|
+
# TODO: this is temporary fix, it should be applied to all heat rejection devices smaller than 5hp.
|
138
|
+
if system['heat_pump_loop_cooling_type'].nil?
|
139
|
+
hp_loop_cooling_type = 'EvaporativeFluidCooler'
|
140
|
+
else
|
141
|
+
hp_loop_cooling_type = system['heat_pump_loop_cooling_type']
|
142
|
+
end
|
143
|
+
heat_pump_loop = model_get_or_add_heat_pump_loop(model, 'NaturalGas', 'Electricity', heat_pump_loop_cooling_type: hp_loop_cooling_type)
|
137
144
|
end
|
138
145
|
# if water to air heat pump is using existing chilled water loop and hot water loop as source
|
139
146
|
# get existing loops, and assign heat_pump_cool_loop = chilled_water_loop, heat_pump_heat_loop = hot_water_loop
|
@@ -159,7 +166,7 @@ class Standard
|
|
159
166
|
model.getPlantLoopByName('Hot Water Loop').get
|
160
167
|
elsif building_type == 'MediumOffice'
|
161
168
|
nil
|
162
|
-
|
169
|
+
elsif building_type == 'MediumOfficeDetailed'
|
163
170
|
nil
|
164
171
|
else
|
165
172
|
model_add_hw_loop(model,
|
@@ -196,7 +203,7 @@ class Standard
|
|
196
203
|
chilled_water_loop = model.getPlantLoopByName('Chilled Water Loop').get
|
197
204
|
else
|
198
205
|
num_chillers = 1
|
199
|
-
if
|
206
|
+
if !system['num_chillers'].nil? && system['num_chillers'].to_i > 0
|
200
207
|
num_chillers = system['num_chillers'].to_i
|
201
208
|
end
|
202
209
|
condenser_water_loop = nil
|
@@ -248,11 +255,11 @@ class Standard
|
|
248
255
|
model_add_hw_loop(model, 'NaturalGas')
|
249
256
|
end
|
250
257
|
# check inputs
|
251
|
-
doas_type = system['doas_type']
|
252
|
-
econo_ctrl_mthd = system['economizer_control_method']
|
253
|
-
doas_control_strategy = system['doas_control_strategy']
|
254
|
-
clg_dsgn_sup_air_temp = system['cooling_design_supply_air_temperature']
|
255
|
-
htg_dsgn_sup_air_temp = system['heating_design_supply_air_temperature']
|
258
|
+
doas_type = system['doas_type'] || 'DOASCV'
|
259
|
+
econo_ctrl_mthd = system['economizer_control_method'] || 'NoEconomizer'
|
260
|
+
doas_control_strategy = system['doas_control_strategy'] || 'NeutralSupplyAir'
|
261
|
+
clg_dsgn_sup_air_temp = system['cooling_design_supply_air_temperature'] || 60.0
|
262
|
+
htg_dsgn_sup_air_temp = system['heating_design_supply_air_temperature'] || 70.0
|
256
263
|
|
257
264
|
# for boolean input, this makes sure we get the correct input translation
|
258
265
|
if system['include_exhaust_fan'].nil? || true?(system['include_exhaust_fan'])
|
@@ -286,8 +293,12 @@ class Standard
|
|
286
293
|
when 'DC' # Data Center in Large Office building
|
287
294
|
# Retrieve the existing hot water loop or add a new one if necessary.
|
288
295
|
hot_water_loop = model_get_or_add_hot_water_loop(model, 'NaturalGas')
|
289
|
-
|
290
|
-
|
296
|
+
|
297
|
+
# Set heat pump loop cooling type to CoolingTowerTwoSpeed if not specified in system hash
|
298
|
+
heat_pump_loop_cooling_type = system['heat_pump_loop_cooling_type'].nil? ? 'CoolingTowerTwoSpeed' : system['heat_pump_loop_cooling_type']
|
299
|
+
|
300
|
+
heat_pump_loop = model_get_or_add_heat_pump_loop(model, 'NaturalGas', 'Electricity',
|
301
|
+
heat_pump_loop_cooling_type: heat_pump_loop_cooling_type)
|
291
302
|
model_add_data_center_hvac(model,
|
292
303
|
thermal_zones,
|
293
304
|
hot_water_loop,
|
@@ -4,11 +4,12 @@ Standard.class_eval do
|
|
4
4
|
def model_create_prototype_model(climate_zone, epw_file, sizing_run_dir = Dir.pwd, debug = false, measure_model = nil)
|
5
5
|
building_type = @instvarbuilding_type
|
6
6
|
raise 'no building_type!' if @instvarbuilding_type.nil?
|
7
|
+
|
7
8
|
model = nil
|
8
9
|
# There are no reference models for HighriseApartment and data centers at vintages Pre-1980 and 1980-2004,
|
9
10
|
# nor for NECB2011. This is a quick check.
|
10
11
|
case @instvarbuilding_type
|
11
|
-
when 'HighriseApartment','SmallDataCenterLowITE','SmallDataCenterHighITE','LargeDataCenterLowITE','LargeDataCenterHighITE','Laboratory','TallBuilding','SuperTallBuilding'
|
12
|
+
when 'HighriseApartment', 'SmallDataCenterLowITE', 'SmallDataCenterHighITE', 'LargeDataCenterLowITE', 'LargeDataCenterHighITE', 'Laboratory', 'TallBuilding', 'SuperTallBuilding'
|
12
13
|
if template == 'DOE Ref Pre-1980' || template == 'DOE Ref 1980-2004'
|
13
14
|
OpenStudio.logFree(OpenStudio::Error, 'Not available', "DOE Reference models for #{@instvarbuilding_type} at are not available, the measure is disabled for this specific type.")
|
14
15
|
return false
|
@@ -17,8 +18,6 @@ Standard.class_eval do
|
|
17
18
|
# delete this case statement once the College model is complete
|
18
19
|
OpenStudio.logFree(OpenStudio::Error, 'Not available', 'While this release includes data for colleges, this only an early draft and should not be used for anything other that early testing or work to improve the college prototype.')
|
19
20
|
return false
|
20
|
-
else
|
21
|
-
# do nothing
|
22
21
|
end
|
23
22
|
# optionally determine the climate zone from the epw and stat files.
|
24
23
|
if climate_zone == 'NECB HDD Method'
|
@@ -36,12 +35,15 @@ Standard.class_eval do
|
|
36
35
|
model_add_loads(model)
|
37
36
|
model_apply_infiltration_standard(model)
|
38
37
|
model_modify_infiltration_coefficients(model, @instvarbuilding_type, climate_zone)
|
38
|
+
model_add_door_infiltration(model, climate_zone)
|
39
39
|
model_modify_surface_convection_algorithm(model)
|
40
40
|
model_create_thermal_zones(model, @space_multiplier_map)
|
41
41
|
model_add_design_days_and_weather_file(model, climate_zone, epw_file)
|
42
42
|
model_add_hvac(model, @instvarbuilding_type, climate_zone, @prototype_input, epw_file)
|
43
43
|
model_add_constructions(model, @instvarbuilding_type, climate_zone)
|
44
|
+
model_fenestration_orientation(model, climate_zone)
|
44
45
|
model_custom_hvac_tweaks(building_type, climate_zone, @prototype_input, model)
|
46
|
+
model_add_transfer_air(model)
|
45
47
|
model_add_internal_mass(model, @instvarbuilding_type)
|
46
48
|
model_add_swh(model, @instvarbuilding_type, climate_zone, @prototype_input, epw_file)
|
47
49
|
model_add_exterior_lights(model, @instvarbuilding_type, climate_zone, @prototype_input)
|
@@ -52,8 +54,10 @@ Standard.class_eval do
|
|
52
54
|
model.yearDescription.get.setDayofWeekforStartDay('Sunday')
|
53
55
|
model.getBuilding.setStandardsBuildingType(building_type)
|
54
56
|
model_set_climate_zone(model, climate_zone)
|
57
|
+
model_add_lights_shutoff(model)
|
55
58
|
# Perform a sizing model_run(model)
|
56
59
|
return false if model_run_sizing_run(model, "#{sizing_run_dir}/SR1") == false
|
60
|
+
|
57
61
|
# If there are any multizone systems, reset damper positions
|
58
62
|
# to achieve a 60% ventilation effectiveness minimum for the system
|
59
63
|
# following the ventilation rate procedure from 62.1
|
@@ -65,7 +69,7 @@ Standard.class_eval do
|
|
65
69
|
# custom economizer controls
|
66
70
|
# For 90.1-2010 Outpatient, AHU1 doesn't have economizer and AHU2 set minimum outdoor air flow rate as 0
|
67
71
|
model_modify_oa_controller(model)
|
68
|
-
# For operating room 1&2 in 2010 and
|
72
|
+
# For operating room 1&2 in 2010, 2013, 2016, and 2019, VAV minimum air flow is set by schedule
|
69
73
|
model_reset_or_room_vav_minimum_damper(@prototype_input, model)
|
70
74
|
# Apply the HVAC efficiency standard
|
71
75
|
model_apply_hvac_efficiency_standard(model, climate_zone)
|
@@ -111,7 +115,7 @@ Standard.class_eval do
|
|
111
115
|
|
112
116
|
# put contents of new_model into model_to_replace
|
113
117
|
model_to_replace.addObjects(new_model.toIdfFile.objects)
|
114
|
-
BTAP
|
118
|
+
BTAP.runner_register('Info', "Model name is now #{model_to_replace.building.get.name}.", runner)
|
115
119
|
end
|
116
120
|
|
117
121
|
# Replaces all objects in the current model
|
@@ -124,7 +128,7 @@ Standard.class_eval do
|
|
124
128
|
# Take the existing model and remove all the objects
|
125
129
|
# (this is cheesy), but need to keep the same memory block
|
126
130
|
handles = OpenStudio::UUIDVector.new
|
127
|
-
model.objects.each {|objects| handles << objects.handle}
|
131
|
+
model.objects.each { |objects| handles << objects.handle }
|
128
132
|
model.removeObjects(handles)
|
129
133
|
model = nil
|
130
134
|
if File.dirname(__FILE__)[0] == ':'
|
@@ -182,6 +186,7 @@ Standard.class_eval do
|
|
182
186
|
if all_space_types_have_standard_space_types
|
183
187
|
return space_type_map
|
184
188
|
end
|
189
|
+
|
185
190
|
return nil
|
186
191
|
end
|
187
192
|
|
@@ -210,6 +215,7 @@ Standard.class_eval do
|
|
210
215
|
space_names.each do |space_name|
|
211
216
|
space = model.getSpaceByName(space_name)
|
212
217
|
next if space.empty?
|
218
|
+
|
213
219
|
space = space.get
|
214
220
|
space.setBuildingStory(stub_building_story)
|
215
221
|
end
|
@@ -293,8 +299,6 @@ Standard.class_eval do
|
|
293
299
|
floor_adiabatic_construction.setLayers(floor_layers)
|
294
300
|
|
295
301
|
return floor_adiabatic_construction
|
296
|
-
|
297
|
-
|
298
302
|
end
|
299
303
|
|
300
304
|
# Checks to see if the an adiabatic wall construction has been constructed in an OpenStudio model.
|
@@ -329,8 +333,6 @@ Standard.class_eval do
|
|
329
333
|
wall_adiabatic_construction.setLayers(wall_layers)
|
330
334
|
|
331
335
|
return wall_adiabatic_construction
|
332
|
-
|
333
|
-
|
334
336
|
end
|
335
337
|
|
336
338
|
# Adds code-minimum constructions based on the building type
|
@@ -460,6 +462,7 @@ Standard.class_eval do
|
|
460
462
|
if new_lookup_building_type == 'SmallHotel' && template != 'NECB2011'
|
461
463
|
model.getBuildingStorys.sort.each do |story|
|
462
464
|
next if story.name.get == 'AtticStory'
|
465
|
+
|
463
466
|
# puts "story = #{story.name}"
|
464
467
|
is_residential = 'No' # default for building story level
|
465
468
|
exterior_spaces_area = 0
|
@@ -468,13 +471,14 @@ Standard.class_eval do
|
|
468
471
|
# calculate the propotion of residential area in exterior spaces, see if this story is residential or not
|
469
472
|
story.spaces.each do |space|
|
470
473
|
next if space.exteriorWallArea.zero?
|
474
|
+
|
471
475
|
space_type = space.spaceType.get
|
472
476
|
if space_type.standardsSpaceType.is_initialized
|
473
477
|
space_type_name = space_type.standardsSpaceType.get
|
474
478
|
end
|
475
|
-
data = standards_lookup_table_first(table_name: 'space_types', search_criteria: {'template' => template,
|
476
|
-
|
477
|
-
|
479
|
+
data = standards_lookup_table_first(table_name: 'space_types', search_criteria: { 'template' => template,
|
480
|
+
'building_type' => new_lookup_building_type,
|
481
|
+
'space_type' => space_type_name })
|
478
482
|
exterior_spaces_area += space.floorArea
|
479
483
|
story_exterior_residential_area += space.floorArea if data['is_residential'] == 'Yes' # "Yes" is residential, "No" or nil is nonresidential
|
480
484
|
end
|
@@ -495,6 +499,7 @@ Standard.class_eval do
|
|
495
499
|
# loop through ceiling surfaces and assign the plenum acoustical tile construction if the adjacent surface is a plenum floor
|
496
500
|
model.getSurfaces.each do |surface|
|
497
501
|
next unless surface.surfaceType == 'RoofCeiling' && surface.outsideBoundaryCondition == 'Surface'
|
502
|
+
|
498
503
|
adj_surface = surface.adjacentSurface.get
|
499
504
|
adj_space = adj_surface.space.get
|
500
505
|
if adj_space.spaceType.is_initialized && adj_space.spaceType.get.standardsSpaceType.is_initialized
|
@@ -526,7 +531,6 @@ Standard.class_eval do
|
|
526
531
|
# @param building_type [string] the type of building
|
527
532
|
# @return [void]
|
528
533
|
def model_set_below_grade_wall_constructions(model, building_type, climate_zone)
|
529
|
-
|
530
534
|
# Find ground contact wall building category
|
531
535
|
construction_set_data = model_get_construction_set(building_type)
|
532
536
|
building_type_category = construction_set_data['exterior_wall_building_category']
|
@@ -546,7 +550,6 @@ Standard.class_eval do
|
|
546
550
|
|
547
551
|
# iterate through spaces and set any necessary CFactorUndergroundWallConstructions
|
548
552
|
model.getSpaces.each do |space|
|
549
|
-
|
550
553
|
# Get height of the first below grade wall in this space. Will return nil if none are found.
|
551
554
|
below_grade_wall_height = model_get_space_below_grade_wall_height(space)
|
552
555
|
next if below_grade_wall_height.nil?
|
@@ -579,7 +582,6 @@ Standard.class_eval do
|
|
579
582
|
# @param space [OpenStudio::Model::Space] space to determine below grade wall height
|
580
583
|
# @return [Numeric, nil]
|
581
584
|
def model_get_space_below_grade_wall_height(space)
|
582
|
-
|
583
585
|
# find height of first below-grade wall adjacent to the ground
|
584
586
|
space.surfaces.each do |surface|
|
585
587
|
next unless surface.surfaceType == 'Wall'
|
@@ -605,20 +607,19 @@ Standard.class_eval do
|
|
605
607
|
# @param building_type [string] the type of building
|
606
608
|
# @param climate_zone [string] climate zone as described for prototype models. F-Factor is based on this parameter
|
607
609
|
def model_set_floor_constructions(model, building_type, climate_zone)
|
608
|
-
|
609
|
-
#Find ground contact wall building category
|
610
|
+
# Find ground contact wall building category
|
610
611
|
construction_set_data = model_get_construction_set(building_type)
|
611
612
|
building_type_category = construction_set_data['ground_contact_floor_building_category']
|
612
613
|
|
613
614
|
# Find Floor F factor
|
614
615
|
floor_construction_properties = model_get_construction_properties(model, 'GroundContactFloor', 'Unheated', building_type_category, climate_zone)
|
615
616
|
|
616
|
-
#If no construction properties are found at all, return and allow code to use default constructions
|
617
|
+
# If no construction properties are found at all, return and allow code to use default constructions
|
617
618
|
return if floor_construction_properties.nil?
|
618
619
|
|
619
620
|
f_factor_ip = floor_construction_properties['assembly_maximum_f_factor']
|
620
621
|
|
621
|
-
#If no f-factor is found in construction properties, return and allow code to use defaults
|
622
|
+
# If no f-factor is found in construction properties, return and allow code to use defaults
|
622
623
|
return if f_factor_ip.nil?
|
623
624
|
|
624
625
|
f_factor_si = f_factor_ip * OpenStudio.convert(1.0, 'Btu/ft*h*R', 'W/m*K').get
|
@@ -659,7 +660,6 @@ Standard.class_eval do
|
|
659
660
|
# @param space[OpenStudio::Model::Space]
|
660
661
|
# @return [Numeric, Numeric]
|
661
662
|
def model_get_f_floor_geometry(space)
|
662
|
-
|
663
663
|
perimeter = 0
|
664
664
|
|
665
665
|
floors = []
|
@@ -673,8 +673,8 @@ Standard.class_eval do
|
|
673
673
|
|
674
674
|
# Raise a warning for any space with more than 1 ground contact floor surface.
|
675
675
|
if floors.length > 1
|
676
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Model', "Space: #{space.name
|
677
|
-
elsif floors.empty? #If this space has no ground contact floors, return 0
|
676
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Model', "Space: #{space.name} has more than one ground contact floor. FFactorGroundFloorConstruction constructions in this space may be incorrect")
|
677
|
+
elsif floors.empty? # If this space has no ground contact floors, return 0
|
678
678
|
return 0, 0
|
679
679
|
end
|
680
680
|
|
@@ -682,10 +682,8 @@ Standard.class_eval do
|
|
682
682
|
|
683
683
|
# cycle through surfaces in space
|
684
684
|
space.surfaces.each do |surface|
|
685
|
-
|
686
685
|
# find perimeter of floor by finding intersecting outdoor walls and measuring the intersection
|
687
686
|
if surface.surfaceType == 'Wall' && surface.outsideBoundaryCondition == 'Outdoors'
|
688
|
-
|
689
687
|
perimeter += model_calculate_wall_and_floor_intersection(surface, floor)
|
690
688
|
end
|
691
689
|
end
|
@@ -706,7 +704,6 @@ Standard.class_eval do
|
|
706
704
|
# @param floor[OpenStudio::Model::Surface] floor occupying same space as wall. Edges checked for interesections with wall
|
707
705
|
# @return [Numeric] returns the intersection/overlap length of the wall and floor of interest
|
708
706
|
def model_calculate_wall_and_floor_intersection(wall, floor)
|
709
|
-
|
710
707
|
# Used for determining if two points are 'equal' if within this length
|
711
708
|
tolerance = 0.0001
|
712
709
|
|
@@ -719,7 +716,6 @@ Standard.class_eval do
|
|
719
716
|
|
720
717
|
# Iterate through wall edges
|
721
718
|
wall_edge_array.each do |wall_edge|
|
722
|
-
|
723
719
|
wall_edge_p1 = wall_edge[0]
|
724
720
|
wall_edge_p2 = wall_edge[1]
|
725
721
|
|
@@ -737,14 +733,12 @@ Standard.class_eval do
|
|
737
733
|
|
738
734
|
# If the edge is parallel with the floor and in the same x-y plane as the floor, assume an intersection the
|
739
735
|
# length of the wall edge
|
740
|
-
edge_vector = OpenStudio::Vector3d.new(wall_edge_p1-wall_edge_p2)
|
736
|
+
edge_vector = OpenStudio::Vector3d.new(wall_edge_p1 - wall_edge_p2)
|
741
737
|
return(edge_vector.length)
|
742
|
-
|
743
738
|
end
|
744
739
|
|
745
740
|
# If no edges intersected, return 0
|
746
741
|
return 0
|
747
|
-
|
748
742
|
end
|
749
743
|
|
750
744
|
# Returns an array of OpenStudio::Point3D pairs of an OpenStudio::Model::Surface's edges. Used to calculate surface
|
@@ -752,7 +746,6 @@ Standard.class_eval do
|
|
752
746
|
# @param surface[OpenStudio::Model::Surface] - surface whose edges are being returned
|
753
747
|
# @return [Array<Array(OpenStudio::Point3D, OpenStudio::Point3D)>] - array of pair of points describing the line segment of an edge
|
754
748
|
def model_get_surface_edges(surface)
|
755
|
-
|
756
749
|
vertices = surface.vertices
|
757
750
|
n_vertices = vertices.length
|
758
751
|
|
@@ -764,7 +757,7 @@ Standard.class_eval do
|
|
764
757
|
for edge_counter in 0..n_vertices - 1
|
765
758
|
|
766
759
|
# If not the last vertex in surface
|
767
|
-
if edge_counter < n_vertices-1
|
760
|
+
if edge_counter < n_vertices - 1
|
768
761
|
edge_array << [vertices[edge_counter], vertices[edge_counter + 1]]
|
769
762
|
else # Make index adjustments for final index in vertices array
|
770
763
|
edge_array << [vertices[edge_counter], vertices[0]]
|
@@ -779,7 +772,6 @@ Standard.class_eval do
|
|
779
772
|
# @param building_type [String] the type of building
|
780
773
|
# @return [Bool] returns true if successful, false if not
|
781
774
|
def model_add_internal_mass(model, building_type)
|
782
|
-
|
783
775
|
# Assign a material to all internal mass objects
|
784
776
|
material = OpenStudio::Model::StandardOpaqueMaterial.new(model)
|
785
777
|
material.setName('Std Wood 6inch')
|
@@ -808,10 +800,10 @@ Standard.class_eval do
|
|
808
800
|
|
809
801
|
# add internal mass
|
810
802
|
# not required for NECB2011
|
811
|
-
unless
|
812
|
-
|
803
|
+
unless template == 'NECB2011' ||
|
804
|
+
building_type.include?('DataCenter') ||
|
813
805
|
((building_type == 'SmallHotel') &&
|
814
|
-
(template == '90.1-2004' || template == '90.1-2007' || template == '90.1-2010' || template == '90.1-2013' || template == 'NREL ZNE Ready 2017'))
|
806
|
+
(template == '90.1-2004' || template == '90.1-2007' || template == '90.1-2010' || template == '90.1-2013' || template == '90.1-2016' || template == '90.1-2019' || template == 'NREL ZNE Ready 2017'))
|
815
807
|
internal_mass_def = OpenStudio::Model::InternalMassDefinition.new(model)
|
816
808
|
internal_mass_def.setSurfaceAreaperSpaceFloorArea(2.0)
|
817
809
|
internal_mass_def.setConstruction(construction)
|
@@ -819,6 +811,7 @@ Standard.class_eval do
|
|
819
811
|
# only add internal mass objects to conditioned spaces
|
820
812
|
next unless space_cooled?(space)
|
821
813
|
next unless space_heated?(space)
|
814
|
+
|
822
815
|
internal_mass = OpenStudio::Model::InternalMass.new(internal_mass_def)
|
823
816
|
internal_mass.setName("#{space.name} Mass")
|
824
817
|
internal_mass.setSpace(space)
|
@@ -860,13 +853,13 @@ Standard.class_eval do
|
|
860
853
|
end
|
861
854
|
space.setThermalZone(zone)
|
862
855
|
|
863
|
-
|
864
|
-
|
856
|
+
# Skip thermostat for spaces with no space type
|
857
|
+
next if space.spaceType.empty?
|
865
858
|
|
866
|
-
|
867
|
-
|
868
|
-
|
869
|
-
|
859
|
+
# Add a thermostat
|
860
|
+
space_type_name = space.spaceType.get.name.get
|
861
|
+
thermostat_name = space_type_name + ' Thermostat'
|
862
|
+
thermostat = model.getThermostatSetpointDualSetpointByName(thermostat_name)
|
870
863
|
if thermostat.empty?
|
871
864
|
OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Thermostat #{thermostat_name} not found for space name: #{space.name}")
|
872
865
|
else
|
@@ -877,7 +870,7 @@ Standard.class_eval do
|
|
877
870
|
ideal_loads = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(model)
|
878
871
|
ideal_loads.addToThermalZone(zone)
|
879
872
|
end
|
880
|
-
|
873
|
+
end
|
881
874
|
end
|
882
875
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished creating thermal zones')
|
883
876
|
end
|
@@ -927,6 +920,7 @@ Standard.class_eval do
|
|
927
920
|
thermal_zone.spaces.each do |space|
|
928
921
|
next unless space.spaceType.is_initialized
|
929
922
|
next unless space.partofTotalFloorArea
|
923
|
+
|
930
924
|
space_type = space.spaceType.get
|
931
925
|
next unless space_type.standardsBuildingType.is_initialized
|
932
926
|
next unless space_type.standardsSpaceType.is_initialized
|
@@ -1017,6 +1011,7 @@ Standard.class_eval do
|
|
1017
1011
|
|
1018
1012
|
# add exhaust
|
1019
1013
|
next if zones_applied.include?(largest_target_zone) # would only hit this if zone has two space types each requesting makeup air
|
1014
|
+
|
1020
1015
|
zone_exhaust_hash = thermal_zone_add_exhaust(largest_target_zone, exhaust_makeup_inputs)
|
1021
1016
|
zones_applied << largest_target_zone
|
1022
1017
|
zone_exhaust_fans.merge!(zone_exhaust_hash)
|
@@ -1102,6 +1097,136 @@ Standard.class_eval do
|
|
1102
1097
|
return zone_exhaust_fans
|
1103
1098
|
end
|
1104
1099
|
|
1100
|
+
# Add guestroom vacancy controls
|
1101
|
+
#
|
1102
|
+
# @code_sections [90.1-2016_6.4.3.3.5]
|
1103
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
1104
|
+
# @param building_type [String] Building type
|
1105
|
+
# @return [Boolean] Returns true if successful, false otherwise
|
1106
|
+
def model_add_guestroom_vacancy_controls(model, building_type)
|
1107
|
+
# Guestrooms are currently only included in the small and large hotel prototypes
|
1108
|
+
return true unless (building_type == 'LargeHotel') || (building_type == 'SmallHotel')
|
1109
|
+
|
1110
|
+
# Guestrooms controls only required for 90.1-2016 and onward
|
1111
|
+
return true unless (template == '90.1-2016') || (template == '90.1-2019')
|
1112
|
+
|
1113
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started Adding Guestroom Vacancy Controls')
|
1114
|
+
|
1115
|
+
# Define guestroom vacancy maps
|
1116
|
+
# List of all spaces that represent vacant rooms
|
1117
|
+
guestroom_vacancy_map = {
|
1118
|
+
'LargeHotel' => [
|
1119
|
+
'Room_3_Mult19_Flr_3'
|
1120
|
+
],
|
1121
|
+
'SmallHotel' => [
|
1122
|
+
'GuestRoom101',
|
1123
|
+
'GuestRoom102',
|
1124
|
+
'GuestRoom201',
|
1125
|
+
'GuestRoom215_218',
|
1126
|
+
'GuestRoom301',
|
1127
|
+
'GuestRoom302_305',
|
1128
|
+
'GuestRoom313',
|
1129
|
+
'GuestRoom319',
|
1130
|
+
'GuestRoom324',
|
1131
|
+
'GuestRoom402_405',
|
1132
|
+
'GuestRoom406_408',
|
1133
|
+
'GuestRoom413',
|
1134
|
+
'GuestRoom414'
|
1135
|
+
]
|
1136
|
+
}
|
1137
|
+
|
1138
|
+
# Iterate through spaces and apply for guestroom vacancy controls
|
1139
|
+
thermostat_schedules = {}
|
1140
|
+
thermostat_schedules['Heating'] = []
|
1141
|
+
thermostat_schedules['Cooling'] = []
|
1142
|
+
model.getSpaces.sort.each do |space|
|
1143
|
+
# Get space name
|
1144
|
+
space_name = space.name
|
1145
|
+
|
1146
|
+
# Get space type
|
1147
|
+
space_type = space.spaceType.get
|
1148
|
+
|
1149
|
+
# Skip space types with no standards building type
|
1150
|
+
next if space_type.standardsBuildingType.empty?
|
1151
|
+
|
1152
|
+
stds_bldg_type = space_type.standardsBuildingType.get
|
1153
|
+
|
1154
|
+
# Skip space types with no standards space type
|
1155
|
+
next if space_type.standardsSpaceType.empty?
|
1156
|
+
|
1157
|
+
stds_spc_type = space_type.standardsSpaceType.get
|
1158
|
+
|
1159
|
+
# Skip building types and space types that aren't listed in the guestroom vacancy maps
|
1160
|
+
next unless guestroom_vacancy_map.key?(stds_bldg_type)
|
1161
|
+
next unless guestroom_vacancy_map[stds_bldg_type].include?(space_name.to_s)
|
1162
|
+
|
1163
|
+
# Get thermal zone and thermostat schedules associated with space
|
1164
|
+
thermal_zone = space.thermalZone.get
|
1165
|
+
if thermal_zone.thermostatSetpointDualSetpoint.is_initialized
|
1166
|
+
thermostat = thermal_zone.thermostatSetpointDualSetpoint.get
|
1167
|
+
if thermostat.heatingSetpointTemperatureSchedule.is_initialized && thermostat.heatingSetpointTemperatureSchedule.get.to_ScheduleRuleset.is_initialized
|
1168
|
+
thermostat_schedules['Heating'] << thermostat.heatingSetpointTemperatureSchedule.get.to_ScheduleRuleset.get
|
1169
|
+
end
|
1170
|
+
if thermostat.coolingSetpointTemperatureSchedule.is_initialized && thermostat.coolingSetpointTemperatureSchedule.get.to_ScheduleRuleset.is_initialized
|
1171
|
+
thermostat_schedules['Cooling'] << thermostat.coolingSetpointTemperatureSchedule.get.to_ScheduleRuleset.get
|
1172
|
+
end
|
1173
|
+
end
|
1174
|
+
|
1175
|
+
# Get zone equipment fan
|
1176
|
+
# Currently prototypes with guestrooms use PTAC and 4PFC
|
1177
|
+
# TODO: Implement additional system type (zonal and air loop-based)
|
1178
|
+
thermal_zone.equipment.sort.each do |zone_equipment|
|
1179
|
+
if zone_equipment.to_ZoneHVACPackagedTerminalAirConditioner.is_initialized
|
1180
|
+
equipment = zone_equipment.to_ZoneHVACPackagedTerminalAirConditioner.get
|
1181
|
+
elsif zone_equipment.to_ZoneHVACFourPipeFanCoil.is_initialized
|
1182
|
+
equipment = zone_equipment.to_ZoneHVACFourPipeFanCoil.get
|
1183
|
+
else
|
1184
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "#{thermal_zone} is not served by either a packaged terminal air-conditioner or four pipe fan coil, vacancy fan schedule has not been adjusted")
|
1185
|
+
next
|
1186
|
+
end
|
1187
|
+
|
1188
|
+
# Change fan operation schedule
|
1189
|
+
fan = if equipment.supplyAirFan.to_FanConstantVolume.is_initialized
|
1190
|
+
equipment.supplyAirFan.to_FanConstantVolume.get
|
1191
|
+
elsif equipment.supplyAirFan.to_FanVariableVolume.is_initialized
|
1192
|
+
equipment.supplyAirFan.to_FanVariableVolume.get
|
1193
|
+
elsif equipment.supplyAirFan.to_FanOnOff.is_initialized
|
1194
|
+
equipment.supplyAirFan.to_FanOnOff.get
|
1195
|
+
end
|
1196
|
+
fan.setAvailabilitySchedule(model_add_schedule(model, 'GuestroomVacantFanSchedule'))
|
1197
|
+
end
|
1198
|
+
|
1199
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished Adding Guestroom Vacancy Controls')
|
1200
|
+
end
|
1201
|
+
|
1202
|
+
# Adjust thermostat schedules:
|
1203
|
+
# Increase set-up/back to comply with code requirements
|
1204
|
+
thermostat_schedules.keys.each do |sch_type|
|
1205
|
+
thermostat_schedules[sch_type].uniq.each do |sch|
|
1206
|
+
# Skip non-ruleset schedules
|
1207
|
+
next if sch.to_ScheduleRuleset.empty?
|
1208
|
+
|
1209
|
+
# Get schedule modifier
|
1210
|
+
case template
|
1211
|
+
when '90.1-2016', '90.1-2019'
|
1212
|
+
case sch_type
|
1213
|
+
when 'Heating'
|
1214
|
+
sch_mult = 15.556 / 18.889 # Set thermostat to 15.556
|
1215
|
+
when 'Cooling'
|
1216
|
+
sch_mult = 26.667 / 23.333 # Set thermostat to 26.667
|
1217
|
+
else
|
1218
|
+
sch_mult = 1 # No adjustments
|
1219
|
+
end
|
1220
|
+
else
|
1221
|
+
shc_mult = 1 # No adjustments
|
1222
|
+
end
|
1223
|
+
|
1224
|
+
# Modify schedules
|
1225
|
+
model_multiply_schedule(model, sch.defaultDaySchedule, sch_mult, 0)
|
1226
|
+
end
|
1227
|
+
end
|
1228
|
+
end
|
1229
|
+
|
1105
1230
|
# Adds occupancy sensors to certain space types per
|
1106
1231
|
# the PNNL documentation.
|
1107
1232
|
#
|
@@ -1110,26 +1235,35 @@ Standard.class_eval do
|
|
1110
1235
|
# @todo genericize and move this method to Standards.Space
|
1111
1236
|
def model_add_occupancy_sensors(model, building_type, climate_zone)
|
1112
1237
|
# Only add occupancy sensors for 90.1-2010
|
1238
|
+
# Currently deactivated for all 90.1 versions
|
1239
|
+
# of the prototype because occupancy sensor is
|
1240
|
+
# currently modeled using different schedules
|
1241
|
+
# hence this code double counts savings from
|
1242
|
+
# sensors.
|
1243
|
+
# TODO: Move occupancy sensor modeling from
|
1244
|
+
# schedule to code.
|
1113
1245
|
case template
|
1114
|
-
when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004', '90.1-2004', '90.1-2007'
|
1246
|
+
when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004', '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', '90.1-2016', '90.1-2019'
|
1115
1247
|
return true
|
1116
1248
|
end
|
1117
1249
|
|
1118
1250
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started Adding Occupancy Sensors')
|
1119
1251
|
|
1120
1252
|
space_type_reduction_map = {
|
1121
|
-
|
1122
|
-
|
1253
|
+
'SecondarySchool' => { 'Classroom' => 0.32, 'Restroom' => 0.34, 'Office' => 0.22 },
|
1254
|
+
'PrimarySchool' => { 'Classroom' => 0.32, 'Restroom' => 0.34, 'Office' => 0.22 }
|
1123
1255
|
}
|
1124
1256
|
|
1125
1257
|
# Loop through all the space types and reduce lighting operation schedule fractions as-specified
|
1126
1258
|
model.getSpaceTypes.sort.each do |space_type|
|
1127
1259
|
# Skip space types with no standards building type
|
1128
1260
|
next if space_type.standardsBuildingType.empty?
|
1261
|
+
|
1129
1262
|
stds_bldg_type = space_type.standardsBuildingType.get
|
1130
1263
|
|
1131
1264
|
# Skip space types with no standards space type
|
1132
1265
|
next if space_type.standardsSpaceType.empty?
|
1266
|
+
|
1133
1267
|
stds_spc_type = space_type.standardsSpaceType.get
|
1134
1268
|
|
1135
1269
|
# Skip building types and space types that aren't listed in the hash
|
@@ -1148,6 +1282,7 @@ Standard.class_eval do
|
|
1148
1282
|
space_type.lights.each do |light|
|
1149
1283
|
# Skip lights that don't have a schedule
|
1150
1284
|
next if light.schedule.empty?
|
1285
|
+
|
1151
1286
|
lights_sch = light.schedule.get
|
1152
1287
|
lights_schs[lights_sch.name.to_s] = lights_sch
|
1153
1288
|
lights_sch_names << lights_sch.name.to_s
|
@@ -1173,13 +1308,14 @@ Standard.class_eval do
|
|
1173
1308
|
new_lights_sch.scheduleRules.each do |sch_rule|
|
1174
1309
|
model_multiply_schedule(model, sch_rule.daySchedule, red_multiplier, 0.25)
|
1175
1310
|
end
|
1176
|
-
end
|
1311
|
+
end
|
1177
1312
|
|
1178
1313
|
# Loop through all lights instances, replacing old lights
|
1179
1314
|
# schedules with the reduced schedules.
|
1180
1315
|
space_type.lights.each do |light|
|
1181
1316
|
# Skip lights that don't have a schedule
|
1182
1317
|
next if light.schedule.empty?
|
1318
|
+
|
1183
1319
|
old_lights_sch_name = light.schedule.get.name.to_s
|
1184
1320
|
if reduced_lights_schs[old_lights_sch_name]
|
1185
1321
|
light.setSchedule(reduced_lights_schs[old_lights_sch_name])
|
@@ -1271,8 +1407,6 @@ Standard.class_eval do
|
|
1271
1407
|
return true
|
1272
1408
|
end
|
1273
1409
|
|
1274
|
-
# add exterior lights
|
1275
|
-
|
1276
1410
|
# Changes the infiltration coefficients for the prototype vintages.
|
1277
1411
|
#
|
1278
1412
|
# @param (see #add_constructions)
|
@@ -1283,7 +1417,7 @@ Standard.class_eval do
|
|
1283
1417
|
# impacts wind speed, and in turn infiltration
|
1284
1418
|
terrain = 'City'
|
1285
1419
|
case template
|
1286
|
-
when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', 'NREL ZNE Ready 2017'
|
1420
|
+
when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', '90.1-2016', '90.1-2019', 'NREL ZNE Ready 2017'
|
1287
1421
|
case building_type
|
1288
1422
|
when 'Warehouse'
|
1289
1423
|
terrain = 'Urban'
|
@@ -1338,10 +1472,8 @@ Standard.class_eval do
|
|
1338
1472
|
end
|
1339
1473
|
|
1340
1474
|
# Set up daylight savings
|
1341
|
-
#
|
1342
1475
|
def model_add_daylight_savings(model)
|
1343
|
-
|
1344
|
-
start_date = '2nd Sunday in March'
|
1476
|
+
start_date = '2nd Sunday in March'
|
1345
1477
|
end_date = '1st Sunday in November'
|
1346
1478
|
|
1347
1479
|
runperiodctrl_daylgtsaving = model.getRunPeriodControlDaylightSavingTime
|
@@ -1365,7 +1497,7 @@ Standard.class_eval do
|
|
1365
1497
|
thanksgiving.setName('Thanksgiving')
|
1366
1498
|
thanksgiving.setSpecialDayType('Holiday')
|
1367
1499
|
|
1368
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.prototype.Model',
|
1500
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.prototype.Model', 'Added holidays: New Years, Thanksgiving.')
|
1369
1501
|
end
|
1370
1502
|
|
1371
1503
|
# Changes the infiltration coefficients for the prototype vintages.
|
@@ -1388,12 +1520,12 @@ Standard.class_eval do
|
|
1388
1520
|
clg = 1.33
|
1389
1521
|
htg = 1.33
|
1390
1522
|
end
|
1391
|
-
when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
|
1523
|
+
when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', '90.1-2016', '90.1-2019'
|
1392
1524
|
# exit if is one of the 90.1 templates as their sizing paramters are explicitly specified in geometry osms
|
1393
1525
|
return
|
1394
1526
|
when 'CBES Pre-1978', 'CBES T24 1978', 'CBES T24 1992', 'CBES T24 2001', 'CBES T24 2005', 'CBES T24 2008'
|
1395
1527
|
case building_type
|
1396
|
-
when 'Hospital', 'LargeHotel', 'MediumOffice', 'LargeOffice', 'MediumOfficeDetailed','LargeOfficeDetailed', 'Outpatient', 'PrimarySchool'
|
1528
|
+
when 'Hospital', 'LargeHotel', 'MediumOffice', 'LargeOffice', 'MediumOfficeDetailed', 'LargeOfficeDetailed', 'Outpatient', 'PrimarySchool'
|
1397
1529
|
clg = 1.0
|
1398
1530
|
htg = 1.0
|
1399
1531
|
end
|
@@ -1415,34 +1547,33 @@ Standard.class_eval do
|
|
1415
1547
|
def model_apply_prototype_hvac_assumptions(model, building_type, climate_zone)
|
1416
1548
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started applying prototype HVAC assumptions.')
|
1417
1549
|
|
1418
|
-
|
1419
|
-
|
1420
|
-
|
1421
|
-
|
1422
|
-
|
1423
|
-
model.getFanConstantVolumes.sort.each {|obj| fan_constant_volume_apply_prototype_fan_pressure_rise(obj)}
|
1424
|
-
model.getFanVariableVolumes.sort.each {|obj| fan_variable_volume_apply_prototype_fan_pressure_rise(obj)}
|
1425
|
-
model.getFanOnOffs.sort.each {|obj| fan_on_off_apply_prototype_fan_pressure_rise(obj)}
|
1426
|
-
model.getFanZoneExhausts.sort.each {|obj| fan_zone_exhaust_apply_prototype_fan_pressure_rise(obj)}
|
1550
|
+
# Fan pressure rise
|
1551
|
+
model.getFanConstantVolumes.sort.each { |obj| fan_constant_volume_apply_prototype_fan_pressure_rise(obj) }
|
1552
|
+
model.getFanVariableVolumes.sort.each { |obj| fan_variable_volume_apply_prototype_fan_pressure_rise(obj) }
|
1553
|
+
model.getFanOnOffs.sort.each { |obj| fan_on_off_apply_prototype_fan_pressure_rise(obj) }
|
1554
|
+
model.getFanZoneExhausts.sort.each { |obj| fan_zone_exhaust_apply_prototype_fan_pressure_rise(obj) }
|
1427
1555
|
|
1428
|
-
#
|
1429
|
-
model.getFanConstantVolumes.sort.each {|obj| prototype_fan_apply_prototype_fan_efficiency(obj)}
|
1430
|
-
model.getFanVariableVolumes.sort.each {|obj| prototype_fan_apply_prototype_fan_efficiency(obj)}
|
1431
|
-
model.getFanOnOffs.sort.each {|obj| prototype_fan_apply_prototype_fan_efficiency(obj)}
|
1432
|
-
model.getFanZoneExhausts.sort.each {|obj| prototype_fan_apply_prototype_fan_efficiency(obj)}
|
1556
|
+
# Fan motor efficiency
|
1557
|
+
model.getFanConstantVolumes.sort.each { |obj| prototype_fan_apply_prototype_fan_efficiency(obj) }
|
1558
|
+
model.getFanVariableVolumes.sort.each { |obj| prototype_fan_apply_prototype_fan_efficiency(obj) }
|
1559
|
+
model.getFanOnOffs.sort.each { |obj| prototype_fan_apply_prototype_fan_efficiency(obj) }
|
1560
|
+
model.getFanZoneExhausts.sort.each { |obj| prototype_fan_apply_prototype_fan_efficiency(obj) }
|
1433
1561
|
|
1434
1562
|
# Gas Heating Coil
|
1435
|
-
model.getCoilHeatingGass.sort.each {|obj| coil_heating_gas_apply_prototype_efficiency(obj)}
|
1563
|
+
model.getCoilHeatingGass.sort.each { |obj| coil_heating_gas_apply_prototype_efficiency(obj) }
|
1436
1564
|
|
1437
|
-
|
1565
|
+
# Add Economizers
|
1438
1566
|
apply_economizers(climate_zone, model)
|
1439
1567
|
|
1440
1568
|
# TODO: What is the logic behind hard-sizing
|
1441
1569
|
# hot water coil convergence tolerances?
|
1442
|
-
model.getControllerWaterCoils.sort.each {|obj| controller_water_coil_set_convergence_limits(obj)}
|
1570
|
+
model.getControllerWaterCoils.sort.each { |obj| controller_water_coil_set_convergence_limits(obj) }
|
1443
1571
|
|
1444
|
-
#
|
1445
|
-
model.getCoilHeatingDXSingleSpeeds.sort.each {|obj| coil_heating_dx_single_speed_apply_defrost_eir_curve_limits(obj)}
|
1572
|
+
# Adjust defrost curve limits for coil heating dx single speed
|
1573
|
+
model.getCoilHeatingDXSingleSpeeds.sort.each { |obj| coil_heating_dx_single_speed_apply_defrost_eir_curve_limits(obj) }
|
1574
|
+
|
1575
|
+
# Pump part load performances
|
1576
|
+
model.getPumpVariableSpeeds.sort.each { |obj| pump_variable_speed_control_type(obj) }
|
1446
1577
|
|
1447
1578
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished applying prototype HVAC assumptions.')
|
1448
1579
|
end
|
@@ -1452,12 +1583,10 @@ Standard.class_eval do
|
|
1452
1583
|
#
|
1453
1584
|
# @param model [OpenStudio::Model::Model] the model
|
1454
1585
|
def model_apply_prototype_hvac_efficiency_adjustments(model)
|
1455
|
-
|
1456
1586
|
# ERVs
|
1457
1587
|
# Applies the DOE Prototype Building assumption that ERVs use
|
1458
1588
|
# enthalpy wheels and therefore exceed the minimum effectiveness specified by 90.1
|
1459
|
-
model.getHeatExchangerAirToAirSensibleAndLatents.each {|obj| heat_exchanger_air_to_air_sensible_and_latent_apply_prototype_efficiency(obj)}
|
1460
|
-
|
1589
|
+
model.getHeatExchangerAirToAirSensibleAndLatents.each { |obj| heat_exchanger_air_to_air_sensible_and_latent_apply_prototype_efficiency(obj) }
|
1461
1590
|
return true
|
1462
1591
|
end
|
1463
1592
|
|
@@ -1807,12 +1936,12 @@ Standard.class_eval do
|
|
1807
1936
|
|
1808
1937
|
# Return the dominant standards building type
|
1809
1938
|
def model_get_standards_building_type(model)
|
1810
|
-
|
1811
1939
|
# determine areas of each building type
|
1812
1940
|
building_type_areas = {}
|
1813
1941
|
model.getSpaces.each do |space|
|
1814
1942
|
# ignore space if not part of total area
|
1815
1943
|
next unless space.partofTotalFloorArea
|
1944
|
+
|
1816
1945
|
if space.spaceType.is_initialized
|
1817
1946
|
space_type = space.spaceType.get
|
1818
1947
|
if space_type.standardsBuildingType.is_initialized
|
@@ -1830,7 +1959,7 @@ Standard.class_eval do
|
|
1830
1959
|
building_type = building_type_areas.key(building_type_areas.values.max)
|
1831
1960
|
|
1832
1961
|
if building_type.nil?
|
1833
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.prototype.Model',
|
1962
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.prototype.Model', 'Model has no dominant standards building type.')
|
1834
1963
|
else
|
1835
1964
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.prototype.Model', "#{building_type} is the dominant standards building type.")
|
1836
1965
|
end
|
@@ -1860,8 +1989,8 @@ Standard.class_eval do
|
|
1860
1989
|
end
|
1861
1990
|
|
1862
1991
|
# Group the zones by occupancy type
|
1863
|
-
type_to_area = Hash.new {0.0}
|
1864
|
-
zones_grouped_by_occ = zones.group_by {|z| z['occ']}
|
1992
|
+
type_to_area = Hash.new { 0.0 }
|
1993
|
+
zones_grouped_by_occ = zones.group_by { |z| z['occ'] }
|
1865
1994
|
|
1866
1995
|
# Determine the dominant occupancy type by area
|
1867
1996
|
zones_grouped_by_occ.each do |occ_type, zns|
|
@@ -1869,7 +1998,7 @@ Standard.class_eval do
|
|
1869
1998
|
type_to_area[occ_type] += zn['area']
|
1870
1999
|
end
|
1871
2000
|
end
|
1872
|
-
dom_occ = type_to_area.sort_by {|k, v| v}.reverse[0][0]
|
2001
|
+
dom_occ = type_to_area.sort_by { |k, v| v }.reverse[0][0]
|
1873
2002
|
|
1874
2003
|
# Get the dominant occupancy type group
|
1875
2004
|
dom_occ_group = zones_grouped_by_occ[dom_occ]
|
@@ -1957,8 +2086,8 @@ Standard.class_eval do
|
|
1957
2086
|
end
|
1958
2087
|
|
1959
2088
|
# Group the zones by building type
|
1960
|
-
type_to_area = Hash.new {0.0}
|
1961
|
-
zones_grouped_by_bldg_type = zones.group_by {|z| z['bldg_type']}
|
2089
|
+
type_to_area = Hash.new { 0.0 }
|
2090
|
+
zones_grouped_by_bldg_type = zones.group_by { |z| z['bldg_type'] }
|
1962
2091
|
|
1963
2092
|
# Determine the dominant building type by area
|
1964
2093
|
zones_grouped_by_bldg_type.each do |bldg_type, zns|
|
@@ -1966,7 +2095,7 @@ Standard.class_eval do
|
|
1966
2095
|
type_to_area[bldg_type] += zn['area']
|
1967
2096
|
end
|
1968
2097
|
end
|
1969
|
-
dom_bldg_type = type_to_area.sort_by {|k, v| v}.reverse[0][0]
|
2098
|
+
dom_bldg_type = type_to_area.sort_by { |k, v| v }.reverse[0][0]
|
1970
2099
|
|
1971
2100
|
# Get the dominant building type group
|
1972
2101
|
dom_bldg_type_group = zones_grouped_by_bldg_type[dom_bldg_type]
|
@@ -2097,9 +2226,17 @@ Standard.class_eval do
|
|
2097
2226
|
economizer_required = false
|
2098
2227
|
|
2099
2228
|
if air_loop_hvac_humidifier_count(air_loop) > 0
|
2100
|
-
# If airloop includes it is assumed
|
2101
|
-
#
|
2102
|
-
|
2229
|
+
# If airloop includes a humidifier it is assumed
|
2230
|
+
# that exception c to 90.1-2004/7 Section 6.5.1 applies.
|
2231
|
+
if template == '90.1-2004' || template == '90.1-2007'
|
2232
|
+
economizer_required = false
|
2233
|
+
end
|
2234
|
+
# This exception exist through 90.1-2019, for hospitals
|
2235
|
+
# see Section 6.5.1 exception 4
|
2236
|
+
if @instvarbuilding_type == 'Hospital' &&
|
2237
|
+
(template == '90.1-2013' || template == '90.1-2016' || template == '90.1-2019')
|
2238
|
+
economizer_required = false
|
2239
|
+
end
|
2103
2240
|
elsif @instvarbuilding_type == 'LargeOffice' &&
|
2104
2241
|
air_loop.name.to_s.downcase.include?('datacenter') &&
|
2105
2242
|
air_loop.name.to_s.downcase.include?('basement') &&
|
@@ -2161,4 +2298,252 @@ Standard.class_eval do
|
|
2161
2298
|
end
|
2162
2299
|
end
|
2163
2300
|
|
2301
|
+
# Implement occupancy based lighting level threshold (0.02 W/sqft). This is only for ASHRAE 90.1 2016 onwards.
|
2302
|
+
#
|
2303
|
+
# @code_sections [90.1-2016_9.4.1.1.h/i]
|
2304
|
+
# @author Xuechen (Jerry) Lei, PNNL
|
2305
|
+
# @param model [OpenStudio::Model::Model] OpenStudio Model
|
2306
|
+
#
|
2307
|
+
def model_add_lights_shutoff(model)
|
2308
|
+
return false
|
2309
|
+
end
|
2310
|
+
|
2311
|
+
# Get building door information to update infiltration
|
2312
|
+
#
|
2313
|
+
# return [Hash] Door infiltration information
|
2314
|
+
def get_building_door_info(model)
|
2315
|
+
get_building_door_info = {}
|
2316
|
+
|
2317
|
+
return get_building_door_info
|
2318
|
+
end
|
2319
|
+
|
2320
|
+
# Metal coiling door code minimum infiltration rate at 75 Pa
|
2321
|
+
#
|
2322
|
+
# @param [String] Climate zone
|
2323
|
+
# @return [Float] Minimum infiltration rate for metal coiling doors
|
2324
|
+
def model_door_infil_flow_rate_metal_coiling_cfm_ft2(climate_zone)
|
2325
|
+
case climate_zone
|
2326
|
+
when 'ASHRAE 169-2006-7A',
|
2327
|
+
'ASHRAE 169-2006-7B',
|
2328
|
+
'ASHRAE 169-2006-8A',
|
2329
|
+
'ASHRAE 169-2006-8B'
|
2330
|
+
return 0.4
|
2331
|
+
else
|
2332
|
+
return 4.4
|
2333
|
+
end
|
2334
|
+
end
|
2335
|
+
|
2336
|
+
# Metal rollup door code minimum infiltration rate at 75 Pa
|
2337
|
+
#
|
2338
|
+
# @param [String] Climate zone
|
2339
|
+
# @return [Float] Minimum infiltration rate for metal coiling doors
|
2340
|
+
def model_door_infil_flow_rate_rollup_cfm_ft2(climate_zone)
|
2341
|
+
return 0.4
|
2342
|
+
end
|
2343
|
+
|
2344
|
+
# Open door infiltration rate at 75 Pa
|
2345
|
+
#
|
2346
|
+
# @param [String] Climate zone
|
2347
|
+
# @return [Float] Open door infiltration rate
|
2348
|
+
def model_door_infil_flow_rate_open_cfm_ft2(climate_zone)
|
2349
|
+
return 9.7875
|
2350
|
+
end
|
2351
|
+
|
2352
|
+
# Add door infiltration
|
2353
|
+
#
|
2354
|
+
# @param [OpenStudio:Model::Model] OpenStudio model object
|
2355
|
+
# @climate_zone [String] Climate zone
|
2356
|
+
# @return [Boolean] Returns true if successful, false otherwise or not applicable
|
2357
|
+
def model_add_door_infiltration(model, climate_zone)
|
2358
|
+
# Get door parameters for the building model
|
2359
|
+
bldg_door_types = get_building_door_info(model)
|
2360
|
+
return false if bldg_door_types.empty?
|
2361
|
+
|
2362
|
+
bldg_door_types.each do |door_type, door_info|
|
2363
|
+
# Get infiltration flow rate at 75 Pa
|
2364
|
+
case door_type
|
2365
|
+
when 'Metal coiling'
|
2366
|
+
door_infil_flow_rate_cfm_per_ft2 = model_door_infil_flow_rate_metal_coiling_cfm_ft2(climate_zone)
|
2367
|
+
when 'Rollup'
|
2368
|
+
door_infil_flow_rate_cfm_per_ft2 = model_door_infil_flow_rate_rollup_cfm_ft2(climate_zone)
|
2369
|
+
when 'Open'
|
2370
|
+
door_infil_flow_rate_cfm_per_ft2 = model_door_infil_flow_rate_open_cfm_ft2(climate_zone)
|
2371
|
+
else
|
2372
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.prototype.Model', "The #{door_type.downcase} type of door is not currently supported.")
|
2373
|
+
next
|
2374
|
+
end
|
2375
|
+
|
2376
|
+
# Calculate door infiltration
|
2377
|
+
door_infil_cfm = door_info['number_of_doors'] * door_info['door_area_ft2'] * door_infil_flow_rate_cfm_per_ft2
|
2378
|
+
|
2379
|
+
# Conversion factor
|
2380
|
+
conv_fact = OpenStudio.convert(1, 'm^3/s', 'ft^3/min').to_f
|
2381
|
+
|
2382
|
+
# Adjust the infiltration rate to the average pressure for the prototype buildings.
|
2383
|
+
adj_door_infil_cfm = adjust_infiltration_to_prototype_building_conditions(door_infil_cfm)
|
2384
|
+
adj_door_infil_m3_per_s = adj_door_infil_cfm / conv_fact
|
2385
|
+
|
2386
|
+
# Create door infiltration object
|
2387
|
+
door_infil_obj = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(model)
|
2388
|
+
door_infil_obj.setName("#{door_info['number_of_doors']} #{door_info['door_area_ft2']} ft2 #{door_type.downcase} Door Infiltration")
|
2389
|
+
door_infil_obj.setSchedule(door_info['schedule'])
|
2390
|
+
door_infil_obj.setDesignFlowRate(adj_door_infil_m3_per_s)
|
2391
|
+
door_infil_obj.setSpace(model.getSpaceByName(door_info['space']).get)
|
2392
|
+
door_infil_obj.setConstantTermCoefficient(0.0)
|
2393
|
+
door_infil_obj.setTemperatureTermCoefficient 0.0
|
2394
|
+
door_infil_obj.setVelocityTermCoefficient(0.224)
|
2395
|
+
door_infil_obj.setVelocitySquaredTermCoefficient(0.0)
|
2396
|
+
end
|
2397
|
+
|
2398
|
+
return true
|
2399
|
+
end
|
2400
|
+
|
2401
|
+
# Set the model's north axis (degrees from true North)
|
2402
|
+
#
|
2403
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
2404
|
+
# @param north_axis [Float] Degrees from true North
|
2405
|
+
# @return [Boolean] Returns true if successful, false otherwise
|
2406
|
+
def model_set_building_north_axis(model, north_axis)
|
2407
|
+
return false if north_axis.nil?
|
2408
|
+
|
2409
|
+
building = model.getBuilding
|
2410
|
+
building.setNorthAxis(north_axis)
|
2411
|
+
|
2412
|
+
return true
|
2413
|
+
end
|
2414
|
+
|
2415
|
+
# Calculate a model's window or WWR for a specific orientation
|
2416
|
+
# Disregard space conditioning (assume all spaces are conditioned)
|
2417
|
+
# which is true for most of not all prototypes
|
2418
|
+
#
|
2419
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model objetc
|
2420
|
+
# @param orientation [String] Orientation: "N", "E", "S", "W"
|
2421
|
+
# @return [Boolean] Returns true if successful, false otherwise
|
2422
|
+
def model_get_window_area_info_for_orientation(model, orientation, wwr: true)
|
2423
|
+
return false unless ['N', 'E', 'S', 'W'].include? orientation
|
2424
|
+
|
2425
|
+
window_area = 0
|
2426
|
+
wall_area = 0
|
2427
|
+
|
2428
|
+
model.getSpaces.each do |space|
|
2429
|
+
# Get zone multiplier
|
2430
|
+
multiplier = space.thermalZone.get.multiplier
|
2431
|
+
|
2432
|
+
space.surfaces.each do |surface|
|
2433
|
+
next if surface.surfaceType != 'Wall'
|
2434
|
+
next if surface.outsideBoundaryCondition != 'Outdoors'
|
2435
|
+
|
2436
|
+
case orientation
|
2437
|
+
when 'N'
|
2438
|
+
next unless surface_cardinal_direction(surface) == 'N'
|
2439
|
+
when 'E'
|
2440
|
+
next unless surface_cardinal_direction(surface) == 'E'
|
2441
|
+
when 'S'
|
2442
|
+
next unless surface_cardinal_direction(surface) == 'S'
|
2443
|
+
when 'W'
|
2444
|
+
next unless surface_cardinal_direction(surface) == 'W'
|
2445
|
+
end
|
2446
|
+
|
2447
|
+
# Get wall and window area
|
2448
|
+
wall_area += surface.grossArea * multiplier
|
2449
|
+
surface.subSurfaces.each do |subsurface|
|
2450
|
+
subsurface_type = subsurface.subSurfaceType.to_s.downcase
|
2451
|
+
# Do not count doors
|
2452
|
+
next unless (subsurface_type.include? 'window') || (subsurface_type.include? 'glass')
|
2453
|
+
|
2454
|
+
window_area += subsurface.grossArea * subsurface.multiplier * multiplier
|
2455
|
+
end
|
2456
|
+
end
|
2457
|
+
end
|
2458
|
+
|
2459
|
+
if wwr
|
2460
|
+
return window_area / wall_area
|
2461
|
+
else
|
2462
|
+
window_area
|
2463
|
+
end
|
2464
|
+
end
|
2465
|
+
|
2466
|
+
# Adjust model to comply with fenestration orientation
|
2467
|
+
#
|
2468
|
+
# @param [OpenStudio::Model::Model] OpenStudio model object
|
2469
|
+
# @return [Boolean] Returns true if successful, false otherwise
|
2470
|
+
def model_fenestration_orientation(model, climate_zone)
|
2471
|
+
return true
|
2472
|
+
end
|
2473
|
+
|
2474
|
+
# Is transfer air required?
|
2475
|
+
#
|
2476
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
2477
|
+
# @return [Boolean] true if transfer air is required, false otherwise
|
2478
|
+
def model_transfer_air_required?(model)
|
2479
|
+
return false
|
2480
|
+
end
|
2481
|
+
|
2482
|
+
# List transfer air target and source zones, and air flow (cfm)
|
2483
|
+
#
|
2484
|
+
# code_sections [90.1-2019_6.5.7.1], [90.1-2016_6.5.7.1]
|
2485
|
+
# @return [Hash] target zones (key) and source zones (value) and air flow (value)
|
2486
|
+
def model_transfer_air_target_and_source_zones(model)
|
2487
|
+
model_transfer_air_target_and_source_zones_hash = {}
|
2488
|
+
|
2489
|
+
return model_transfer_air_target_and_source_zones_hash
|
2490
|
+
end
|
2491
|
+
|
2492
|
+
# Add transfer to prototype for spaces that require it
|
2493
|
+
#
|
2494
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
2495
|
+
# @return [Boolean] true if successful, false otherwise
|
2496
|
+
def model_add_transfer_air(model)
|
2497
|
+
# Do not add transfer air if not required
|
2498
|
+
return true unless model_transfer_air_required?(model)
|
2499
|
+
|
2500
|
+
# Get target and source zones
|
2501
|
+
target_and_source_zones = model_transfer_air_target_and_source_zones(model)
|
2502
|
+
return true if target_and_source_zones.empty?
|
2503
|
+
|
2504
|
+
model.getFanZoneExhausts.sort.each do |exhaust_fan|
|
2505
|
+
# Target zone (zone with exhaust fan)
|
2506
|
+
target_zone = exhaust_fan.thermalZone.get
|
2507
|
+
|
2508
|
+
# Get zone name of an exhaust fan
|
2509
|
+
exhaust_fan_zone_name = target_zone.name.to_s
|
2510
|
+
|
2511
|
+
# Go to next exhaust fan if this zone isn't using transfer air
|
2512
|
+
next unless target_and_source_zones.keys.include? exhaust_fan_zone_name
|
2513
|
+
|
2514
|
+
# Add dummy exhaust fan in source zone
|
2515
|
+
source_zone_name, transfer_air_flow_cfm = target_and_source_zones[exhaust_fan_zone_name]
|
2516
|
+
source_zone = model.getThermalZoneByName(source_zone_name).get
|
2517
|
+
transfer_air_source_zone_exhaust_fan = OpenStudio::Model::FanZoneExhaust.new(model)
|
2518
|
+
transfer_air_source_zone_exhaust_fan.setName(source_zone.name.to_s + ' Dummy Transfer Air (Source) Fan')
|
2519
|
+
transfer_air_source_zone_exhaust_fan.setAvailabilitySchedule(exhaust_fan.availabilitySchedule.get)
|
2520
|
+
# Convert transfer air flow to m3/s
|
2521
|
+
transfer_air_flow_m3s = OpenStudio.convert(transfer_air_flow_cfm, 'cfm', 'm^3/s').get
|
2522
|
+
transfer_air_source_zone_exhaust_fan.setMaximumFlowRate(transfer_air_flow_m3s)
|
2523
|
+
transfer_air_source_zone_exhaust_fan.setFanEfficiency(1.0)
|
2524
|
+
transfer_air_source_zone_exhaust_fan.setPressureRise(0.0)
|
2525
|
+
transfer_air_source_zone_exhaust_fan.addToThermalZone(source_zone)
|
2526
|
+
|
2527
|
+
# Set exhaust fan balanced air flow schedule to only consider the transfer air to be balanced air flow
|
2528
|
+
balanced_air_flow_schedule = exhaust_fan.availabilitySchedule.get.clone(model).to_ScheduleRuleset.get
|
2529
|
+
balanced_air_flow_schedule.setName("#{exhaust_fan_zone_name} Exhaust Fan Balanced Air Flow Schedule")
|
2530
|
+
model_multiply_schedule(model, balanced_air_flow_schedule.defaultDaySchedule, transfer_air_flow_m3s / exhaust_fan.maximumFlowRate.get, 0)
|
2531
|
+
balanced_air_flow_schedule.scheduleRules.each do |sch_rule|
|
2532
|
+
model_multiply_schedule(model, sch_rule.daySchedule, transfer_air_flow_m3s / exhaust_fan.maximumFlowRate.get, 0)
|
2533
|
+
end
|
2534
|
+
transfer_air_source_zone_exhaust_fan.setBalancedExhaustFractionSchedule(balanced_air_flow_schedule)
|
2535
|
+
|
2536
|
+
# Modify design specification OA to take into account transfer air for sizing only
|
2537
|
+
# OA is zero'd out for other days
|
2538
|
+
target_zone.spaces.sort.each do |space|
|
2539
|
+
target_zone_ventilation = space.designSpecificationOutdoorAir.get
|
2540
|
+
target_zone_ventilation.setOutdoorAirFlowperPerson(0)
|
2541
|
+
target_zone_ventilation.setOutdoorAirFlowperFloorArea(0)
|
2542
|
+
target_zone_ventilation.setOutdoorAirFlowRate(exhaust_fan.maximumFlowRate.get - transfer_air_flow_m3s)
|
2543
|
+
target_zone_ventilation.setOutdoorAirFlowRateFractionSchedule(model_add_schedule(model, 'DesignDaysOnly'))
|
2544
|
+
end
|
2545
|
+
end
|
2546
|
+
|
2547
|
+
return true
|
2548
|
+
end
|
2164
2549
|
end
|