openstudio-standards 0.7.1 → 0.8.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/data/geometry/ASHRAE90120162019LargeHotel.json +58 -13
- data/data/geometry/ASHRAELargeHotel.json +58 -13
- data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
- data/data/standards/export_OpenStudio_libraries.rb +2 -2
- data/data/standards/manage_OpenStudio_Standards.rb +6 -6
- data/data/standards/openstudio_standards_duplicates_log.csv +7961 -1
- data/data/standards/test_performance_expected_dd_results.csv +2016 -2004
- data/lib/openstudio-standards/btap/fileio.rb +171 -5
- data/lib/openstudio-standards/constructions/create.rb +38 -4
- data/lib/openstudio-standards/constructions/modify.rb +10 -3
- data/lib/openstudio-standards/create_typical/create_typical.rb +42 -28
- data/lib/openstudio-standards/create_typical/space_type_information.rb +160 -0
- data/lib/openstudio-standards/create_typical/space_type_ratios.rb +16 -19
- data/lib/openstudio-standards/exterior_lighting/create.rb +454 -0
- data/lib/openstudio-standards/exterior_lighting/data/entryways.csv +52 -0
- data/lib/openstudio-standards/exterior_lighting/data/parking.csv +54 -0
- data/lib/openstudio-standards/exterior_lighting/data/typical_exterior_lighting.json +37 -0
- data/lib/openstudio-standards/exterior_lighting/information.rb +202 -0
- data/lib/openstudio-standards/geometry/information.rb +49 -2
- data/lib/openstudio-standards/hvac/components/create.rb +169 -0
- data/lib/openstudio-standards/hvac/components/modify.rb +42 -0
- data/lib/openstudio-standards/hvac/exhaust/create_exhaust_fan.rb +108 -0
- data/lib/openstudio-standards/hvac/exhaust/data/convert_data.rb +86 -0
- data/lib/openstudio-standards/hvac/exhaust/data/typical_exhaust.csv +18 -0
- data/lib/openstudio-standards/hvac/exhaust/data/typical_exhaust.json +89 -0
- data/lib/openstudio-standards/infiltration/nist_infiltration.rb +25 -13
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +0 -64
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +0 -25
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +0 -25
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +1 -11
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +5 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +0 -7
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +36 -18
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +121 -239
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +179 -151
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +0 -466
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +18 -2
- data/lib/openstudio-standards/refrigeration/create_case.rb +125 -0
- data/lib/openstudio-standards/refrigeration/create_compressor.rb +78 -0
- data/lib/openstudio-standards/refrigeration/create_compressor_rack.rb +48 -0
- data/lib/openstudio-standards/refrigeration/create_refrigeration_system.rb +74 -0
- data/lib/openstudio-standards/refrigeration/create_typical_refrigeration.rb +161 -0
- data/lib/openstudio-standards/refrigeration/create_walkin.rb +116 -0
- data/lib/openstudio-standards/refrigeration/data/refrigerated_cases.csv +31 -0
- data/lib/openstudio-standards/refrigeration/data/refrigerated_walkins.csv +76 -0
- data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +13 -0
- data/lib/openstudio-standards/refrigeration/data/typical_refrigerated_cases.csv +17 -0
- data/lib/openstudio-standards/refrigeration/data/typical_refrigerated_walkins.csv +53 -0
- data/lib/openstudio-standards/refrigeration/information.rb +130 -0
- data/lib/openstudio-standards/schedules/parametric.rb +1 -1
- data/lib/openstudio-standards/service_water_heating/create_typical.rb +299 -0
- data/lib/openstudio-standards/service_water_heating/create_water_heating_loop.rb +16 -14
- data/lib/openstudio-standards/service_water_heating/data/convert_data.rb +119 -0
- data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.csv +54 -0
- data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.json +810 -0
- data/lib/openstudio-standards/service_water_heating/information.rb +69 -0
- data/lib/openstudio-standards/sql_file/fenestration.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +154 -0
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +35 -12
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +110 -61
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +128 -29
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +103 -38
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +106 -5
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +8 -8
- data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +44 -17
- data/lib/openstudio-standards/standards/Standards.Fan.rb +32 -21
- data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +45 -18
- data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +14 -9
- data/lib/openstudio-standards/standards/Standards.Model.rb +294 -76
- data/lib/openstudio-standards/standards/Standards.Motor.rb +66 -0
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.Pump.rb +34 -20
- data/lib/openstudio-standards/standards/Standards.ServiceWaterHeating.rb +0 -353
- data/lib/openstudio-standards/standards/Standards.Space.rb +3 -107
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +2 -57
- data/lib/openstudio-standards/standards/Standards.Surface.rb +11 -3
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +1 -120
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.computer_room_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +1006 -596
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.energy_recovery.json +724 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +1258 -163
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +1070 -140
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +33 -3374
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +1400 -340
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.vrfs.json +769 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +2 -5338
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.computer_room_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +1006 -596
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.energy_recovery.json +724 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +1258 -163
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +1070 -140
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +15 -3343
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +1840 -372
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.vrfs.json +769 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +20 -10
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +0 -9
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +0 -5382
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.computer_room_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +1006 -628
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +718 -712
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +1438 -163
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +2552 -182
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +14 -3368
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +2348 -352
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.vrfs.json +769 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +47 -61
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +6 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Motor.rb +11 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +0 -9
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +2 -5522
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.computer_room_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +1006 -628
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +1358 -1346
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +1438 -163
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +1359 -189
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +19 -3451
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +2176 -616
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.vrfs.json +616 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +47 -61
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +9 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Motor.rb +11 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +0 -9
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +8 -6055
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.computer_room_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.economizers.json +1006 -628
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +1188 -1424
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ext_ltg.json +1498 -163
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.motors.json +1769 -189
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +15 -3422
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +1807 -408
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.vrfs.json +1024 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +70 -87
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +9 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Motor.rb +11 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +0 -9
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +8 -6080
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.computer_room_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.economizers.json +1006 -628
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +2806 -3296
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ext_ltg.json +1558 -163
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.motors.json +1759 -189
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +16 -3448
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +2758 -422
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.vrfs.json +684 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +14 -3318
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +2 -4786
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.chillers.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +953 -207
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.energy_recovery.json +724 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +11 -2858
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirConditionerVariableRefrigerantFlow.rb +13 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +0 -18
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +1 -4739
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.chillers.json +0 -51
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +953 -207
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.energy_recovery.json +724 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +9 -2830
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirConditionerVariableRefrigerantFlow.rb +13 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +0 -18
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.economizers.json +1006 -564
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.energy_recovery.json +1264 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +0 -1079
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +132 -288
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +44 -20
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +11 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.economizers.json +1006 -564
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.energy_recovery.json +1264 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +0 -1079
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +137 -288
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +44 -20
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +11 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +0 -9
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +12 -10
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +8 -6
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +8 -6
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +9 -3
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Fan.rb +6 -40
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +30 -337
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +4 -5
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +56 -3
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +80 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +0 -10
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +35 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.economizers.json +550 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.energy_recovery.json +724 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.ext_ltg.json +1216 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.motors.json +225 -245
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.unitary_acs.json +174 -78
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.water_heaters.json +354 -317
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +19 -3
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_airloop_hvac.json +185 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_airloop_hvac_doas.json +127 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_building.json +121 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_design_specification_outdoor_air.json +49 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_electric_equipment.json +113 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_exterior_lights.json +120 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_space.json +388 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_spacetype.json +367 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_thermal_zone.json +56 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_connections.json +37 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_equipment.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_equipment_definition.json +37 -0
- data/lib/openstudio-standards/standards/cbes/cbes_pre_1978/data/cbes_pre_1978.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes_t24_1978/data/cbes_t24_1978.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes_t24_1992/data/cbes_t24_1992.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2001/data/cbes_t24_2001.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/data/cbes_t24_2005.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/data/cbes_t24_2008.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/data/comstock_deer_1985.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/data/comstock_deer_1996.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/data/comstock_deer_2003.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/data/comstock_deer_2007.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/data/comstock_deer_2011.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/data/comstock_deer_2014.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/data/comstock_deer_2015.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/data/comstock_deer_2017.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2020/comstock_deer_2020/data/comstock_deer_2020.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2025/comstock_deer_2025/data/comstock_deer_2025.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2030/comstock_deer_2030/data/comstock_deer_2030.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2035/comstock_deer_2035/data/comstock_deer_2035.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2040/comstock_deer_2040/data/comstock_deer_2040.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2045/comstock_deer_2045/data/comstock_deer_2045.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2050/comstock_deer_2050/data/comstock_deer_2050.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2055/comstock_deer_2055/data/comstock_deer_2055.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2060/comstock_deer_2060/data/comstock_deer_2060.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2065/comstock_deer_2065/data/comstock_deer_2065.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2070/comstock_deer_2070/data/comstock_deer_2070.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2075/comstock_deer_2075/data/comstock_deer_2075.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/data/comstock_deer_pre_1975.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ext_ltg.json +5 -5
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +10 -1
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/unitary_acs.json +20 -20
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +379 -27
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +1 -4
- data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +0 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/unitary_acs.json +20 -20
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +34 -22
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +76 -23
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_shw_calculation.xlsx +0 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +6 -2
- data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +26 -24
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +2 -1
- data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +38 -32
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +215 -18
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +190 -15
- data/lib/openstudio-standards/standards/necb/common/national_carbon_price_sched_feb_2025.json +60 -0
- data/lib/openstudio-standards/standards/necb/common/utility_pricing_2025-02-20.csv +92 -0
- data/lib/openstudio-standards/utilities/ruleset_check.rb +204 -0
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/information.rb +1 -1
- data/lib/openstudio-standards.rb +32 -12
- metadata +78 -80
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.refrigeration.rb +0 -13
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb +0 -13
- data/lib/openstudio-standards/prototypes/cbes/cbes.refrigeration.rb +0 -13
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +0 -432
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +0 -11
- 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 +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.spc_typ.json +0 -20804
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +0 -11
- 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 +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ref_lnup.json +0 -562
- 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 +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ref_lnup.json +0 -562
- 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 +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ext_ltg.json +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ref_cases.json +0 -763
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ext_ltg.json +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ref_cases.json +0 -763
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ref_lnup.json +0 -562
- 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 +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ref_lnup.json +0 -562
- 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 +0 -169
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_economizers.json +0 -213
- data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +0 -11
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +0 -11
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +0 -11
- data/lib/openstudio-standards/standards/deer/deer.Space.rb +0 -20
- data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ref_lnup.json +0 -562
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ref_cases.json +0 -1456
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ref_lnup.json +0 -562
@@ -388,472 +388,6 @@ class Standard
|
|
388
388
|
return compressor
|
389
389
|
end
|
390
390
|
|
391
|
-
# Find the thermal zone that is best for adding refrigerated display cases into.
|
392
|
-
# First, check for space types that typically have refrigeration.
|
393
|
-
# Fall back to largest zone in the model if no typical space types are found.
|
394
|
-
#
|
395
|
-
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
396
|
-
# @return [OpenStudio::Model::ThermalZone] returns a thermal zone if found, nil if not.
|
397
|
-
def model_typical_display_case_zone(model)
|
398
|
-
# Ideally, look for one of the space types
|
399
|
-
# that would typically have refrigeration.
|
400
|
-
display_case_zone = nil
|
401
|
-
display_case_zone_area_m2 = 0
|
402
|
-
model.getThermalZones.each do |zone|
|
403
|
-
space_type = OpenstudioStandards::ThermalZone.thermal_zone_get_space_type(zone)
|
404
|
-
next if space_type.empty?
|
405
|
-
|
406
|
-
space_type = space_type.get
|
407
|
-
next if space_type.standardsSpaceType.empty?
|
408
|
-
next if space_type.standardsBuildingType.empty?
|
409
|
-
|
410
|
-
stds_spc_type = space_type.standardsSpaceType.get
|
411
|
-
stds_bldg_type = space_type.standardsBuildingType.get
|
412
|
-
case "#{stds_bldg_type} #{stds_spc_type}"
|
413
|
-
when 'PrimarySchool Kitchen',
|
414
|
-
'SecondarySchool Kitchen',
|
415
|
-
'SuperMarket Sales',
|
416
|
-
'QuickServiceRestaurant Kitchen',
|
417
|
-
'FullServiceRestaurant Kitchen',
|
418
|
-
'LargeHotel Kitchen',
|
419
|
-
'Hospital Kitchen',
|
420
|
-
'EPr Kitchen',
|
421
|
-
'ESe Kitchen',
|
422
|
-
'Gro GrocSales',
|
423
|
-
'RFF StockRoom',
|
424
|
-
'RSD StockRoom',
|
425
|
-
'Htl Kitchen',
|
426
|
-
'Hsp Kitchen'
|
427
|
-
if zone.floorArea > display_case_zone_area_m2
|
428
|
-
display_case_zone = zone
|
429
|
-
display_case_zone_area_m2 = zone.floorArea
|
430
|
-
end
|
431
|
-
end
|
432
|
-
end
|
433
|
-
|
434
|
-
unless display_case_zone.nil?
|
435
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "Display case zone is #{display_case_zone.name}, the largest zone with a space type typical for display cases.")
|
436
|
-
return display_case_zone
|
437
|
-
end
|
438
|
-
|
439
|
-
# If no typical space type was found,
|
440
|
-
# choose the largest zone in the model.
|
441
|
-
display_case_zone = nil
|
442
|
-
display_case_zone_area_m2 = 0
|
443
|
-
model.getThermalZones.each do |zone|
|
444
|
-
if zone.floorArea > display_case_zone_area_m2
|
445
|
-
display_case_zone = zone
|
446
|
-
display_case_zone_area_m2 = zone.floorArea
|
447
|
-
end
|
448
|
-
end
|
449
|
-
|
450
|
-
unless display_case_zone.nil?
|
451
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "No space types typical for display cases were found, so the display cases will be placed in #{display_case_zone.name}, the largest zone.")
|
452
|
-
return display_case_zone
|
453
|
-
end
|
454
|
-
|
455
|
-
return display_case_zone
|
456
|
-
end
|
457
|
-
|
458
|
-
# Find the thermal zone that is best for adding refrigerated walkins into.
|
459
|
-
# First, check for space types that typically have refrigeration.
|
460
|
-
# Fall back to largest zone in the model if no typical space types are found.
|
461
|
-
#
|
462
|
-
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
463
|
-
# @return [OpenStudio::Model::ThermalZone] returns a thermal zone if found, nil if not.
|
464
|
-
def model_typical_walkin_zone(model)
|
465
|
-
# Ideally, look for one of the space types
|
466
|
-
# that would typically have refrigeration walkins.
|
467
|
-
walkin_zone = nil
|
468
|
-
walkin_zone_area_m2 = 0
|
469
|
-
model.getThermalZones.each do |zone|
|
470
|
-
space_type = OpenstudioStandards::ThermalZone.thermal_zone_get_space_type(zone)
|
471
|
-
next if space_type.empty?
|
472
|
-
|
473
|
-
space_type = space_type.get
|
474
|
-
next if space_type.standardsSpaceType.empty?
|
475
|
-
next if space_type.standardsBuildingType.empty?
|
476
|
-
|
477
|
-
stds_spc_type = space_type.standardsSpaceType.get
|
478
|
-
stds_bldg_type = space_type.standardsBuildingType.get
|
479
|
-
case "#{stds_bldg_type} #{stds_spc_type}"
|
480
|
-
when 'PrimarySchool Kitchen',
|
481
|
-
'SecondarySchool Kitchen',
|
482
|
-
'SuperMarket DryStorage',
|
483
|
-
'QuickServiceRestaurant Kitchen',
|
484
|
-
'FullServiceRestaurant Kitchen',
|
485
|
-
'LargeHotel Kitchen',
|
486
|
-
'Hospital Kitchen',
|
487
|
-
'EPr Kitchen',
|
488
|
-
'ESe Kitchen',
|
489
|
-
'Gro RefWalkInCool',
|
490
|
-
'Gro RefWalkInFreeze',
|
491
|
-
'RFF StockRoom',
|
492
|
-
'RSD StockRoom',
|
493
|
-
'Htl Kitchen',
|
494
|
-
'Hsp Kitchen'
|
495
|
-
if zone.floorArea > walkin_zone_area_m2
|
496
|
-
walkin_zone = zone
|
497
|
-
walkin_zone_area_m2 = zone.floorArea
|
498
|
-
end
|
499
|
-
end
|
500
|
-
end
|
501
|
-
|
502
|
-
unless walkin_zone.nil?
|
503
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "Walkin zone is #{walkin_zone.name}, the largest zone with a space type typical for walkins.")
|
504
|
-
return walkin_zone
|
505
|
-
end
|
506
|
-
|
507
|
-
# If no typical space type was found,
|
508
|
-
# choose the largest zone in the model.
|
509
|
-
walkin_zone = nil
|
510
|
-
walkin_zone_area_m2 = 0
|
511
|
-
model.getThermalZones.each do |zone|
|
512
|
-
if zone.floorArea > walkin_zone_area_m2
|
513
|
-
walkin_zone = zone
|
514
|
-
walkin_zone_area_m2 = zone.floorArea
|
515
|
-
end
|
516
|
-
end
|
517
|
-
|
518
|
-
unless walkin_zone.nil?
|
519
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "No space types typical for walkins were found, so the walkins will be placed in #{walkin_zone.name}, the largest zone.")
|
520
|
-
return walkin_zone
|
521
|
-
end
|
522
|
-
|
523
|
-
return walkin_zone
|
524
|
-
end
|
525
|
-
|
526
|
-
# Add a typical refrigeration system to the model, including cases, walkins,
|
527
|
-
# compressors, and condensors. For small stores, each case and walkin is served
|
528
|
-
# by one compressor and one condenser. For larger stores, all medium temp cases and walkins
|
529
|
-
# are served by one multi-compressor rack, and all low temp cases and walkins another.
|
530
|
-
#
|
531
|
-
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
532
|
-
# @param building_type [String] building type
|
533
|
-
# @return [Boolean] returns true if successful, false if not
|
534
|
-
def model_add_typical_refrigeration(model, building_type)
|
535
|
-
# Define system category and scaling factor
|
536
|
-
floor_area_ft2 = OpenStudio.convert(model.getBuilding.floorArea, 'm^2', 'ft^2').get
|
537
|
-
case building_type
|
538
|
-
when 'SuperMarket', 'Gro'
|
539
|
-
if floor_area_ft2 < 35_000 # this is in m2
|
540
|
-
size_category = '<35k ft2'
|
541
|
-
floor_area_scaling_factor = floor_area_ft2 / 35_000
|
542
|
-
elsif floor_area_ft2 < 50_000
|
543
|
-
size_category = '35k - 50k ft2'
|
544
|
-
floor_area_scaling_factor = floor_area_ft2 / 50_000
|
545
|
-
else
|
546
|
-
size_category = '>50k ft2'
|
547
|
-
floor_area_scaling_factor = floor_area_ft2 / 50_000
|
548
|
-
end
|
549
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Refrigeration size category is #{size_category}, with a scaling factor of #{floor_area_scaling_factor} because the floor area is #{floor_area_ft2.round} ft2. All cases and walkins added later will subsequently be scaled by this factor.")
|
550
|
-
else
|
551
|
-
size_category = 'Kitchen'
|
552
|
-
floor_area_scaling_factor = 1 # Do not scale kitchen systems
|
553
|
-
end
|
554
|
-
|
555
|
-
# Add a low and medium temperature system
|
556
|
-
['Medium Temperature', 'Low Temperature'].each do |system_type|
|
557
|
-
# Find refrigeration system lineup
|
558
|
-
search_criteria = {
|
559
|
-
'template' => template,
|
560
|
-
'building_type' => building_type,
|
561
|
-
'size_category' => size_category,
|
562
|
-
'system_type' => system_type
|
563
|
-
}
|
564
|
-
props_lineup = model_find_object(standards_data['refrigeration_system_lineup'], search_criteria)
|
565
|
-
if props_lineup.nil?
|
566
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "No refrigeration system lineup found for #{search_criteria}, no system will be added.")
|
567
|
-
next
|
568
|
-
end
|
569
|
-
number_of_display_cases = props_lineup['number_of_display_cases']
|
570
|
-
number_of_walkins = props_lineup['number_of_walkins']
|
571
|
-
compressor_name = props_lineup['compressor_name']
|
572
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Refrigeration system lineup found for #{search_criteria}: #{number_of_display_cases} display cases and #{number_of_walkins} walkins, with compressor '#{compressor_name}'.")
|
573
|
-
|
574
|
-
# Find the thermal zones most suited for holding the display cases
|
575
|
-
thermal_zone_case = nil
|
576
|
-
if number_of_display_cases > 0
|
577
|
-
thermal_zone_case = model_typical_display_case_zone(model)
|
578
|
-
if thermal_zone_case.nil?
|
579
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Attempted to add #{number_of_display_cases} display cases to the model, but could find no thermal zone to put them into.")
|
580
|
-
return false
|
581
|
-
end
|
582
|
-
end
|
583
|
-
|
584
|
-
# Add display cases
|
585
|
-
display_cases = []
|
586
|
-
(1..number_of_display_cases).each_with_index do |display_case_number, def_start_hr_iterator|
|
587
|
-
case_type = props_lineup["case_type_#{display_case_number}"]
|
588
|
-
|
589
|
-
# Add the basic case
|
590
|
-
ref_case = model_add_refrigeration_case(model, thermal_zone_case, case_type, size_category)
|
591
|
-
return false if ref_case.nil?
|
592
|
-
|
593
|
-
# Scale based on floor area
|
594
|
-
ref_case.setCaseLength(ref_case.caseLength * floor_area_scaling_factor)
|
595
|
-
|
596
|
-
# Find defrost and dripdown properties
|
597
|
-
search_criteria = {
|
598
|
-
'template' => template,
|
599
|
-
'case_type' => case_type,
|
600
|
-
'size_category' => size_category
|
601
|
-
}
|
602
|
-
props_case = model_find_object(standards_data['refrigerated_cases'], search_criteria)
|
603
|
-
if props_case.nil?
|
604
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find refrigerated case properties for: #{search_criteria}.")
|
605
|
-
next
|
606
|
-
end
|
607
|
-
numb_defrosts_per_day = props_case['defrost_per_day']
|
608
|
-
minutes_defrost = props_case['minutes_defrost']
|
609
|
-
minutes_dripdown = props_case['minutes_dripdown']
|
610
|
-
minutes_defrost = 59 if minutes_defrost > 59 # Just to make sure to remain in the same hour
|
611
|
-
minutes_dripdown = 59 if minutes_dripdown > 59 # Just to make sure to remain in the same hour
|
612
|
-
|
613
|
-
# Add defrost and dripdown schedules
|
614
|
-
defrost_sch = OpenStudio::Model::ScheduleRuleset.new(model)
|
615
|
-
defrost_sch.setName("#{ref_case.name} Defrost")
|
616
|
-
defrost_sch.defaultDaySchedule.setName("#{ref_case.name} Defrost Default")
|
617
|
-
dripdown_sch = OpenStudio::Model::ScheduleRuleset.new(model)
|
618
|
-
dripdown_sch.setName("#{ref_case.name} Dripdown")
|
619
|
-
dripdown_sch.defaultDaySchedule.setName("#{ref_case.name} Dripdown Default")
|
620
|
-
|
621
|
-
# Stagger the defrosts for cases by 1 hr
|
622
|
-
interval_defrost = (24 / numb_defrosts_per_day).floor # Hour interval between each defrost period
|
623
|
-
if (def_start_hr_iterator + (interval_defrost * numb_defrosts_per_day)) > 23
|
624
|
-
first_def_start_hr = 0 # Start over again at midnight when time reaches 23hrs
|
625
|
-
else
|
626
|
-
first_def_start_hr = def_start_hr_iterator
|
627
|
-
end
|
628
|
-
|
629
|
-
# Add the specified number of defrost periods to the daily schedule
|
630
|
-
(1..numb_defrosts_per_day).each do |defrost_of_day|
|
631
|
-
def_start_hr = first_def_start_hr + ((1 - defrost_of_day) * interval_defrost)
|
632
|
-
defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, 0, 0), 0)
|
633
|
-
defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, minutes_defrost.to_int, 0), 1)
|
634
|
-
dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, 0, 0), 0) # Dripdown is synced with defrost
|
635
|
-
dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, minutes_dripdown.to_int, 0), 1)
|
636
|
-
end
|
637
|
-
defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
|
638
|
-
dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
|
639
|
-
|
640
|
-
# Assign the defrost and dripdown schedules
|
641
|
-
ref_case.setCaseDefrostSchedule(defrost_sch)
|
642
|
-
ref_case.setCaseDefrostDripDownSchedule(dripdown_sch)
|
643
|
-
|
644
|
-
display_cases << ref_case
|
645
|
-
end
|
646
|
-
|
647
|
-
# Find the thermal zones most suited for holding the walkins
|
648
|
-
thermal_zone_walkin = nil
|
649
|
-
if number_of_walkins > 0
|
650
|
-
thermal_zone_walkin = model_typical_walkin_zone(model)
|
651
|
-
if thermal_zone_walkin.nil?
|
652
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Attempted to add #{number_of_walkins} walkins to the model, but could find no thermal zone to put them into.")
|
653
|
-
return false
|
654
|
-
end
|
655
|
-
end
|
656
|
-
|
657
|
-
# Add walkin cases
|
658
|
-
walkins = []
|
659
|
-
(1..number_of_walkins).each_with_index do |walkin_number, def_start_hr_iterator|
|
660
|
-
walkin_type = props_lineup["walkin_type_#{walkin_number}"]
|
661
|
-
|
662
|
-
# Add the basic walkin
|
663
|
-
ref_walkin = model_add_refrigeration_walkin(model, thermal_zone_walkin, size_category, walkin_type)
|
664
|
-
return false if ref_walkin.nil?
|
665
|
-
|
666
|
-
# Scale based on floor area
|
667
|
-
ref_walkin.setRatedTotalLightingPower(ref_walkin.ratedTotalLightingPower * floor_area_scaling_factor)
|
668
|
-
ref_walkin.setRatedCoolingCoilFanPower(ref_walkin.ratedCoolingCoilFanPower * floor_area_scaling_factor)
|
669
|
-
ref_walkin.setDefrostPower(ref_walkin.defrostPower.get * floor_area_scaling_factor)
|
670
|
-
ref_walkin.setRatedCoilCoolingCapacity(ref_walkin.ratedCoilCoolingCapacity * floor_area_scaling_factor)
|
671
|
-
ref_walkin.setZoneBoundaryTotalInsulatedSurfaceAreaFacingZone(ref_walkin.zoneBoundaryTotalInsulatedSurfaceAreaFacingZone.get * floor_area_scaling_factor)
|
672
|
-
ref_walkin.setInsulatedFloorSurfaceArea(ref_walkin.insulatedFloorSurfaceArea * floor_area_scaling_factor)
|
673
|
-
|
674
|
-
# Check that walkin physically fits inside the thermal zone.
|
675
|
-
# If not, remove the walkin and warn.
|
676
|
-
walkin_floor_area_ft2 = OpenStudio.convert(ref_walkin.insulatedFloorSurfaceArea, 'm^2', 'ft^2').get.round
|
677
|
-
walkin_zone_floor_area_ft2 = OpenStudio.convert(thermal_zone_walkin.floorArea, 'm^2', 'ft^2').get.round
|
678
|
-
if walkin_floor_area_ft2 > walkin_zone_floor_area_ft2
|
679
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "Walkin #{ref_walkin.name} has an area of #{walkin_floor_area_ft2} ft^2, which is larger than the #{walkin_zone_floor_area_ft2} ft^2 zone. Walkin will be kept in the model, but considered re-sizing the zone '#{thermal_zone_walkin.name}'.")
|
680
|
-
end
|
681
|
-
|
682
|
-
# Find defrost and dripdown properties
|
683
|
-
search_criteria = {
|
684
|
-
'template' => template,
|
685
|
-
'walkin_type' => walkin_type,
|
686
|
-
'size_category' => size_category
|
687
|
-
}
|
688
|
-
props_walkin = model_find_object(standards_data['refrigeration_walkins'], search_criteria)
|
689
|
-
if props_walkin.nil?
|
690
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find walkin properties for: #{search_criteria}.")
|
691
|
-
next
|
692
|
-
end
|
693
|
-
numb_defrosts_per_day = props_walkin['defrost_per_day']
|
694
|
-
minutes_defrost = props_walkin['minutes_defrost']
|
695
|
-
minutes_dripdown = props_walkin['minutes_dripdown']
|
696
|
-
minutes_defrost = 59 if minutes_defrost > 59 # Just to make sure to remain in the same hour
|
697
|
-
minutes_dripdown = 59 if minutes_dripdown > 59 # Just to make sure to remain in the same hour
|
698
|
-
|
699
|
-
# Add defrost and dripdown schedules
|
700
|
-
defrost_sch_walkin = OpenStudio::Model::ScheduleRuleset.new(model)
|
701
|
-
defrost_sch_walkin.setName("#{ref_walkin.name} Defrost")
|
702
|
-
defrost_sch_walkin.defaultDaySchedule.setName("#{ref_walkin.name} Defrost Default")
|
703
|
-
dripdown_sch_walkin = OpenStudio::Model::ScheduleRuleset.new(model)
|
704
|
-
dripdown_sch_walkin.setName("#{ref_walkin.name} Dripdown")
|
705
|
-
dripdown_sch_walkin.defaultDaySchedule.setName("#{ref_walkin.name} Dripdown Default")
|
706
|
-
|
707
|
-
# Stagger the defrosts for cases by 1 hr
|
708
|
-
interval_defrost = (24 / numb_defrosts_per_day).floor # Hour interval between each defrost period
|
709
|
-
if (def_start_hr_iterator + (interval_defrost * numb_defrosts_per_day)) > 23
|
710
|
-
first_def_start_hr = 0 # Start over again at midnight when time reaches 23hrs
|
711
|
-
else
|
712
|
-
first_def_start_hr = def_start_hr_iterator
|
713
|
-
end
|
714
|
-
|
715
|
-
# Add the specified number of defrost periods to the daily schedule
|
716
|
-
(1..numb_defrosts_per_day).each do |defrost_of_day|
|
717
|
-
def_start_hr = first_def_start_hr + ((1 - defrost_of_day) * interval_defrost)
|
718
|
-
defrost_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, 0, 0), 0)
|
719
|
-
defrost_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, minutes_defrost.to_int, 0), 1)
|
720
|
-
dripdown_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, 0, 0), 0) # Dripdown is synced with defrost
|
721
|
-
dripdown_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, minutes_dripdown.to_int, 0), 1)
|
722
|
-
end
|
723
|
-
defrost_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
|
724
|
-
dripdown_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
|
725
|
-
|
726
|
-
# Assign the defrost and dripdown schedules
|
727
|
-
ref_walkin.setDefrostSchedule(defrost_sch_walkin)
|
728
|
-
ref_walkin.setDefrostDripDownSchedule(dripdown_sch_walkin)
|
729
|
-
|
730
|
-
walkins << ref_walkin
|
731
|
-
end
|
732
|
-
|
733
|
-
# Divide cases and walkins into one or more refrigeration systems depending on store type
|
734
|
-
# For small stores and kitchens one system with one compressor and one condenser per case is employed.
|
735
|
-
# For larger stores, multiple cases and walkins are served by a rack with multiple compressors.
|
736
|
-
ref_system_lineups = []
|
737
|
-
case system_type
|
738
|
-
when '<35k ft2', 'Kitchen'
|
739
|
-
# Put each case on its own system
|
740
|
-
display_cases.each do |ref_case|
|
741
|
-
ref_system_lineups << { 'ref_cases' => [ref_case], 'walkins' => [] }
|
742
|
-
end
|
743
|
-
# Put each walkin on its own system
|
744
|
-
walkins.each do |walkin|
|
745
|
-
ref_system_lineups << { 'ref_cases' => [], 'walkins' => [walkin] }
|
746
|
-
end
|
747
|
-
else
|
748
|
-
# Put all cases and walkins on one system
|
749
|
-
ref_system_lineups << { 'ref_cases' => display_cases, 'walkins' => walkins }
|
750
|
-
end
|
751
|
-
|
752
|
-
# Find refrigeration system properties
|
753
|
-
search_criteria = {
|
754
|
-
'template' => template,
|
755
|
-
'building_type' => building_type,
|
756
|
-
'size_category' => size_category,
|
757
|
-
'system_type' => system_type
|
758
|
-
}
|
759
|
-
props_ref_system = model_find_object(standards_data['refrigeration_system'], search_criteria)
|
760
|
-
if props_ref_system.nil?
|
761
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find refrigeration system properties for: #{search_criteria}.")
|
762
|
-
next
|
763
|
-
end
|
764
|
-
|
765
|
-
# Add refrigeration systems
|
766
|
-
ref_system_lineups.each do |ref_system_lineup|
|
767
|
-
# Skip if no cases or walkins are attached to the system
|
768
|
-
next if ref_system_lineup['ref_cases'].empty? && ref_system_lineup['walkins'].empty?
|
769
|
-
|
770
|
-
# Add refrigeration system
|
771
|
-
ref_system = OpenStudio::Model::RefrigerationSystem.new(model)
|
772
|
-
ref_system.setName(system_type)
|
773
|
-
ref_system.setRefrigerationSystemWorkingFluidType(props_ref_system['refrigerant'])
|
774
|
-
ref_system.setSuctionTemperatureControlType(props_ref_system['refrigerant'])
|
775
|
-
|
776
|
-
# Sum the capacity required by all cases and walkins
|
777
|
-
# and attach the cases and walkins to the system.
|
778
|
-
rated_case_capacity_w = 0
|
779
|
-
ref_system_lineup['ref_cases'].each do |ref_case|
|
780
|
-
rated_case_capacity_w += ref_case.ratedTotalCoolingCapacityperUnitLength * ref_case.caseLength
|
781
|
-
ref_system.addCase(ref_case)
|
782
|
-
end
|
783
|
-
ref_system_lineup['walkins'].each do |walkin|
|
784
|
-
rated_case_capacity_w += walkin.ratedCoilCoolingCapacity
|
785
|
-
ref_system.addWalkin(walkin)
|
786
|
-
end
|
787
|
-
|
788
|
-
# Find the compressor properties
|
789
|
-
search_criteria = {
|
790
|
-
'template' => template,
|
791
|
-
'compressor_name' => compressor_name
|
792
|
-
}
|
793
|
-
props_compressor = model_find_object(standards_data['refrigeration_compressors'], search_criteria)
|
794
|
-
if props_compressor.nil?
|
795
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find refrigeration compressor properties for: #{search_criteria}.")
|
796
|
-
next
|
797
|
-
end
|
798
|
-
|
799
|
-
# Calculate the number of compressors required to meet the
|
800
|
-
# combined rated capacity of all the cases
|
801
|
-
# and add them to the system
|
802
|
-
rated_compressor_capacity_btu_per_hr = props_compressor['rated_capacity']
|
803
|
-
number_of_compressors = (rated_case_capacity_w / OpenStudio.convert(rated_compressor_capacity_btu_per_hr, 'Btu/h', 'W').get).ceil
|
804
|
-
(1..number_of_compressors).each do |compressor_number|
|
805
|
-
compressor = model_add_refrigeration_compressor(model, compressor_name)
|
806
|
-
ref_system.addCompressor(compressor)
|
807
|
-
end
|
808
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Added #{number_of_compressors} compressors, each with a capacity of #{rated_compressor_capacity_btu_per_hr.round} Btu/hr to serve #{OpenStudio.convert(rated_case_capacity_w, 'W', 'Btu/hr').get.round} Btu/hr of case and walkin load.")
|
809
|
-
|
810
|
-
# Find the condenser properties
|
811
|
-
search_criteria = {
|
812
|
-
'template' => template,
|
813
|
-
'building_type' => building_type,
|
814
|
-
'system_type' => system_type,
|
815
|
-
'size_category' => size_category
|
816
|
-
}
|
817
|
-
props_condenser = model_find_object(standards_data['refrigeration_condenser'], search_criteria)
|
818
|
-
if props_condenser.nil?
|
819
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find refrigeration condenser properties for: #{search_criteria}.")
|
820
|
-
next
|
821
|
-
end
|
822
|
-
|
823
|
-
# Heat rejection as a function of temperature
|
824
|
-
heat_rejection_curve = OpenStudio::Model::CurveLinear.new(model)
|
825
|
-
heat_rejection_curve.setName('Condenser Heat Rejection Function of Temperature')
|
826
|
-
heat_rejection_curve.setCoefficient1Constant(0)
|
827
|
-
heat_rejection_curve.setCoefficient2x(props_condenser['heatrejectioncurve_c1'])
|
828
|
-
heat_rejection_curve.setMinimumValueofx(-50)
|
829
|
-
heat_rejection_curve.setMaximumValueofx(50)
|
830
|
-
|
831
|
-
# Add condenser
|
832
|
-
condenser = OpenStudio::Model::RefrigerationCondenserAirCooled.new(model)
|
833
|
-
condenser.setRatedEffectiveTotalHeatRejectionRateCurve(heat_rejection_curve)
|
834
|
-
condenser.setRatedSubcoolingTemperatureDifference(OpenStudio.convert(props_condenser['subcool_t'], 'F', 'C').get)
|
835
|
-
condenser.setMinimumFanAirFlowRatio(props_condenser['min_airflow'])
|
836
|
-
condenser.setRatedFanPower(props_condenser['fan_power_per_q_rejected'].to_f * rated_case_capacity_w)
|
837
|
-
condenser.setCondenserFanSpeedControlType(props_condenser['fan_speed_control'])
|
838
|
-
ref_system.setRefrigerationCondenser(condenser)
|
839
|
-
|
840
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "Added #{system_type} refrigeration system")
|
841
|
-
end
|
842
|
-
end
|
843
|
-
|
844
|
-
return true
|
845
|
-
end
|
846
|
-
|
847
|
-
# Determine the latent case credit curve to use for walkins. Defaults to values after 90.1-2007.
|
848
|
-
# @todo Should probably use the model_add_refrigeration_walkin and lookups from the spreadsheet instead of hard-coded values
|
849
|
-
#
|
850
|
-
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
851
|
-
# @return [Boolean] returns true if successful, false if not
|
852
|
-
def model_walkin_freezer_latent_case_credit_curve(model)
|
853
|
-
latent_case_credit_curve_name = 'Single Shelf Horizontal Latent Energy Multiplier_After2004'
|
854
|
-
return latent_case_credit_curve_name
|
855
|
-
end
|
856
|
-
|
857
391
|
# Adds a full commercial refrigeration rack to the model, as would be found in a supermarket
|
858
392
|
# @todo Move refrigeration compressors to spreadsheet
|
859
393
|
#
|
@@ -321,7 +321,7 @@ class Standard
|
|
321
321
|
return cop
|
322
322
|
end
|
323
323
|
|
324
|
-
# Convert from EER to COP
|
324
|
+
# Convert from EER to COP (no fan)
|
325
325
|
# @ref [References::USDOEPrototypeBuildings] If capacity is not supplied, use DOE Prototype Building method.
|
326
326
|
# @ref [References::ASHRAE9012013] If capacity is supplied, use the 90.1-2013 method
|
327
327
|
#
|
@@ -345,7 +345,7 @@ class Standard
|
|
345
345
|
return cop
|
346
346
|
end
|
347
347
|
|
348
|
-
# Convert from COP to EER
|
348
|
+
# Convert from COP (no fan) to EER
|
349
349
|
# @ref [References::USDOEPrototypeBuildings]
|
350
350
|
#
|
351
351
|
# @param cop [Double] COP
|
@@ -367,6 +367,22 @@ class Standard
|
|
367
367
|
return eer
|
368
368
|
end
|
369
369
|
|
370
|
+
# Convert from IEER to COP (no fan)
|
371
|
+
#
|
372
|
+
# @note IEER is a weighted-average efficiency metrics at different load percentages, operataional and environemental conditions
|
373
|
+
# @note IEER should be modeled by using performance curves that match a targeted efficiency values
|
374
|
+
# @note This method estimates what a reasonable full load rated EER would be for a targeted IEER value
|
375
|
+
# @note The regression used in this method is based on a survey of over 1,000 rated AHRI units with IEER ranging from 11.8 to 25.6
|
376
|
+
# @todo Implement methods to handle IEER modeling
|
377
|
+
#
|
378
|
+
# @param ieer [Double] Energy Efficiency Ratio (EER)
|
379
|
+
# @return [Double] Coefficient of Performance (COP)
|
380
|
+
def ieer_to_cop_no_fan(ieer)
|
381
|
+
eer = 0.0183 * ieer * ieer - 0.4552 * ieer + 13.21
|
382
|
+
|
383
|
+
return eer_to_cop_no_fan(eer)
|
384
|
+
end
|
385
|
+
|
370
386
|
# Convert from EER to COP
|
371
387
|
#
|
372
388
|
# @param eer [Double] Energy Efficiency Ratio (EER)
|
@@ -0,0 +1,125 @@
|
|
1
|
+
module OpenstudioStandards
|
2
|
+
# The Refrigeration module provides methods to create, modify, and get information about refrigeration
|
3
|
+
module Refrigeration
|
4
|
+
# @!group Create Case
|
5
|
+
# Methods to add refrigerated cases
|
6
|
+
|
7
|
+
# Adds a refrigerated case to the model.
|
8
|
+
#
|
9
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
10
|
+
# @param template [String] Technology or standards level, either 'old', 'new', or 'advanced'
|
11
|
+
# @param case_type [String] The case type. See refrigeration_cases data for valid options under case_name.
|
12
|
+
# @param case_length [String] The case length in meters.
|
13
|
+
# @param thermal_zone [OpenStudio::Model::ThermalZone] Thermal zone with the case. If nil, will look up from the model.
|
14
|
+
# @return [OpenStudio::Model::RefrigerationCase] the refrigeration case
|
15
|
+
def self.create_case(model,
|
16
|
+
template: 'new',
|
17
|
+
case_type: 'Vertical Open - All',
|
18
|
+
case_length: nil,
|
19
|
+
thermal_zone: nil)
|
20
|
+
# get thermal zone if not provided
|
21
|
+
if thermal_zone.nil?
|
22
|
+
# Find the thermal zones most suited for holding the display cases
|
23
|
+
thermal_zone = OpenstudioStandards::Refrigeration.refrigeration_case_zone(model)
|
24
|
+
if thermal_zone.nil?
|
25
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Refrigeration', 'Attempted to add display cases to the model, but could find no thermal zone to put them into.')
|
26
|
+
return nil
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# load refrigeration cases data
|
31
|
+
cases_csv = "#{__dir__}/data/refrigerated_cases.csv"
|
32
|
+
unless File.exist?(cases_csv)
|
33
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Refrigeration', "Unable to find file: #{cases_csv}")
|
34
|
+
return nil
|
35
|
+
end
|
36
|
+
cases_tbl = CSV.table(cases_csv, encoding: 'ISO8859-1:utf-8')
|
37
|
+
cases_hsh = cases_tbl.map(&:to_hash)
|
38
|
+
|
39
|
+
# get case properties
|
40
|
+
case_properties = cases_hsh.select { |r| (r[:template] == template) && (r[:case_name] == case_type) }[0]
|
41
|
+
|
42
|
+
if case_properties.nil?
|
43
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Refrigeration', "Unable to find case data for template #{template} case type #{case_type}.")
|
44
|
+
return nil
|
45
|
+
end
|
46
|
+
|
47
|
+
# add case
|
48
|
+
ref_case = OpenStudio::Model::RefrigerationCase.new(model, model.alwaysOnDiscreteSchedule)
|
49
|
+
ref_case.setName(case_type)
|
50
|
+
case_length_m = case_length.nil? ? case_properties[:unit_length] : case_length
|
51
|
+
ref_case.setCaseLength(case_length_m)
|
52
|
+
ref_case.setRatedTotalCoolingCapacityperUnitLength(case_properties[:rated_capacity])
|
53
|
+
ref_case.setCaseOperatingTemperature(case_properties[:case_operating_temperature])
|
54
|
+
ref_case.setDesignEvaporatorTemperatureorBrineInletTemperature(case_properties[:evaporator_temperature])
|
55
|
+
ref_case.setRatedLatentHeatRatio(case_properties[:rated_latent_heat_ratio])
|
56
|
+
ref_case.setRatedRuntimeFraction(case_properties[:rated_runtime_fraction])
|
57
|
+
ref_case.setLatentCaseCreditCurveType(case_properties[:latent_case_credit_curve_type])
|
58
|
+
# TODO: replace once curves are standardized
|
59
|
+
std = Standard.build('90.1-2013')
|
60
|
+
latent_case_credit_curve = std.model_add_curve(model, case_properties[:latent_case_credit_curve_name])
|
61
|
+
ref_case.setLatentCaseCreditCurve(latent_case_credit_curve)
|
62
|
+
ref_case.setStandardCaseFanPowerperUnitLength(case_properties[:fan_power])
|
63
|
+
ref_case.setOperatingCaseFanPowerperUnitLength(case_properties[:fan_power])
|
64
|
+
ref_case.setStandardCaseLightingPowerperUnitLength(case_properties[:lighting_power])
|
65
|
+
ref_case.setInstalledCaseLightingPowerperUnitLength(case_properties[:lighting_power])
|
66
|
+
ref_case.setCaseLightingSchedule(model.alwaysOnDiscreteSchedule)
|
67
|
+
ref_case.setFractionofLightingEnergytoCase(case_properties[:fraction_of_lighting_energy_to_case]) unless case_properties[:fraction_of_lighting_energy_to_case].nil?
|
68
|
+
ref_case.setCaseAntiSweatHeaterPowerperUnitLength(case_properties[:anti_sweat_power]) unless case_properties[:anti_sweat_power].nil?
|
69
|
+
ref_case.setMinimumAntiSweatHeaterPowerperUnitLength(0.0)
|
70
|
+
ref_case.setHumidityatZeroAntiSweatHeaterEnergy(0.0)
|
71
|
+
ref_case.setAntiSweatHeaterControlType(case_properties[:anti_sweat_heater_control_type])
|
72
|
+
ref_case.setFractionofAntiSweatHeaterEnergytoCase(case_properties[:fraction_of_anti_sweat_heater_energy_to_cases]) unless case_properties[:fraction_of_anti_sweat_heater_energy_to_cases].nil?
|
73
|
+
ref_case.setCaseDefrostPowerperUnitLength(case_properties[:defrost_power]) unless case_properties[:defrost_power].nil?
|
74
|
+
ref_case.setCaseDefrostType(case_properties[:defrost_type])
|
75
|
+
ref_case.setDefrostEnergyCorrectionCurveType(case_properties[:defrost_energy_correction_curve_type]) unless case_properties[:defrost_energy_correction_curve_type].nil?
|
76
|
+
unless case_properties[:defrost_energy_correction_curve_name].nil?
|
77
|
+
# TODO: replace once curves are standardized
|
78
|
+
defrost_correction_curve_name = std.model_add_curve(model, case_properties[:defrost_energy_correction_curve_name])
|
79
|
+
ref_case.setDefrostEnergyCorrectionCurve(defrost_correction_curve_name)
|
80
|
+
end
|
81
|
+
ref_case.setUnderCaseHVACReturnAirFraction(0.0)
|
82
|
+
ref_case.resetRefrigeratedCaseRestockingSchedule
|
83
|
+
ref_case.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
|
84
|
+
ref_case.setThermalZone(thermal_zone)
|
85
|
+
ref_case.setRatedAmbientTemperature(OpenStudio.convert(75.0, 'F', 'C').get)
|
86
|
+
|
87
|
+
# place holders for schedules until data provided from ORNL
|
88
|
+
i = 0
|
89
|
+
# Defrost schedule
|
90
|
+
defrost_sch = OpenStudio::Model::ScheduleRuleset.new(model)
|
91
|
+
defrost_sch.setName("#{ref_case.name} Defrost")
|
92
|
+
defrost_sch.defaultDaySchedule.setName("#{ref_case.name} Defrost Default")
|
93
|
+
defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, i, 0, 0), 0)
|
94
|
+
defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, i, 59, 0), 1)
|
95
|
+
defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
|
96
|
+
|
97
|
+
# Dripdown schedule
|
98
|
+
dripdown_sch = OpenStudio::Model::ScheduleRuleset.new(model)
|
99
|
+
dripdown_sch.setName("#{ref_case.name} Defrost")
|
100
|
+
dripdown_sch.defaultDaySchedule.setName("#{ref_case.name} Defrost Default")
|
101
|
+
dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, i, 0, 0), 0)
|
102
|
+
dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, i, 59, 0), 1)
|
103
|
+
dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
|
104
|
+
|
105
|
+
# Case Credit Schedule
|
106
|
+
case_credit_sch = OpenStudio::Model::ScheduleRuleset.new(model)
|
107
|
+
case_credit_sch.setName("#{ref_case.name} Case Credit")
|
108
|
+
case_credit_sch.defaultDaySchedule.setName("#{ref_case.name} Case Credit Default")
|
109
|
+
case_credit_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 7, 0, 0), 0.2)
|
110
|
+
case_credit_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 21, 0, 0), 0.4)
|
111
|
+
case_credit_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0.2)
|
112
|
+
ref_case.setCaseDefrostSchedule(defrost_sch)
|
113
|
+
ref_case.setCaseDefrostDripDownSchedule(dripdown_sch)
|
114
|
+
ref_case.setCaseCreditFractionSchedule(case_credit_sch)
|
115
|
+
|
116
|
+
# reporting
|
117
|
+
length_ft = OpenStudio.convert(ref_case.caseLength, 'm', 'ft').get
|
118
|
+
cooling_capacity_w = ref_case.caseLength * ref_case.ratedTotalCoolingCapacityperUnitLength
|
119
|
+
cooling_capacity_btu_per_hr = OpenStudio.convert(cooling_capacity_w, 'W', 'Btu/hr').get
|
120
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Refrigeration', "Added #{length_ft.round} ft display case called #{case_type} with a cooling capacity of #{cooling_capacity_btu_per_hr.round} Btu/hr to #{thermal_zone&.name}.")
|
121
|
+
|
122
|
+
return ref_case
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|