openstudio-standards 0.4.0 → 0.5.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/data/inventory/thermal_bridging.csv +90 -0
- data/data/standards/OpenStudio_Standards-deer-comstock.xlsx +0 -0
- data/data/standards/manage_OpenStudio_Standards.rb +1 -1
- data/data/standards/test_performance_expected_dd_results.csv +2014 -1891
- data/lib/openstudio-standards/btap/analysis.rb +8 -8
- data/lib/openstudio-standards/btap/bridging.rb +664 -645
- data/lib/openstudio-standards/btap/btap.model.rb +14 -14
- data/lib/openstudio-standards/btap/btap.rb +7 -7
- data/lib/openstudio-standards/btap/btap_result.rb +1 -1
- data/lib/openstudio-standards/btap/economics.rb +23 -23
- data/lib/openstudio-standards/btap/envelope.rb +8 -8
- data/lib/openstudio-standards/btap/equest.rb +1 -1
- data/lib/openstudio-standards/btap/geometry.rb +2 -2
- data/lib/openstudio-standards/btap/mpc.rb +7 -7
- data/lib/openstudio-standards/btap/schedules.rb +1 -1
- data/lib/openstudio-standards/btap/simmanager.rb +4 -4
- data/lib/openstudio-standards/btap/spaceloads.rb +26 -26
- data/lib/openstudio-standards/btap/utilities.rb +6 -6
- data/lib/openstudio-standards/btap/vintagizer.rb +1 -1
- data/lib/openstudio-standards/constructions/information.rb +83 -0
- data/lib/openstudio-standards/constructions/materials/modify.rb +72 -0
- data/lib/openstudio-standards/constructions/modify.rb +80 -0
- data/lib/openstudio-standards/create_typical/create_typical.rb +983 -0
- data/lib/openstudio-standards/create_typical/enumerations.rb +484 -0
- data/lib/openstudio-standards/create_typical/space_type_blend.rb +791 -0
- data/lib/openstudio-standards/create_typical/space_type_ratios.rb +494 -0
- data/lib/openstudio-standards/daylighting/space.rb +47 -0
- data/lib/openstudio-standards/geometry/create.rb +801 -0
- data/lib/openstudio-standards/geometry/create_bar.rb +2171 -0
- data/lib/openstudio-standards/geometry/information.rb +462 -0
- data/lib/openstudio-standards/geometry/modify.rb +48 -0
- data/lib/openstudio-standards/hvac/air_loop/information.rb +79 -0
- data/lib/openstudio-standards/hvac/cbecs_hvac.rb +616 -0
- data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +91 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +2 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -36
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -36
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +3 -3
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +14 -14
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +16 -16
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +11 -11
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +11 -11
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +19 -19
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +10 -10
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +13 -13
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +9 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +8 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +11 -11
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +10 -10
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +19 -19
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +18 -18
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +957 -957
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +84 -16
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +61 -10
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +4 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +4 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +43 -30
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +18 -11
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +774 -117
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +340 -481
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +3 -3
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +3 -3
- data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +22 -22
- data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
- data/lib/openstudio-standards/qaqc/calibration.rb +131 -0
- data/lib/openstudio-standards/qaqc/create_results.rb +983 -0
- data/lib/openstudio-standards/qaqc/envelope.rb +399 -0
- data/lib/openstudio-standards/qaqc/eui.rb +213 -0
- data/lib/openstudio-standards/qaqc/hvac.rb +1943 -0
- data/lib/openstudio-standards/qaqc/internal_loads.rb +568 -0
- data/lib/openstudio-standards/qaqc/reporting.rb +141 -0
- data/lib/openstudio-standards/qaqc/schedules.rb +129 -0
- data/lib/openstudio-standards/qaqc/service_water_heating.rb +273 -0
- data/lib/openstudio-standards/qaqc/weather_files.rb +497 -0
- data/lib/openstudio-standards/qaqc/zone_conditions.rb +278 -0
- data/lib/openstudio-standards/schedules/create.rb +364 -0
- data/lib/openstudio-standards/schedules/information.rb +169 -0
- data/lib/openstudio-standards/schedules/modify.rb +445 -0
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +110 -71
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +16 -10
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +5 -5
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Construction.rb +17 -18
- data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +6 -6
- data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Fan.rb +6 -12
- data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.Model.rb +411 -261
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -29
- data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +14 -14
- data/lib/openstudio-standards/standards/Standards.Space.rb +37 -30
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +38 -29
- data/lib/openstudio-standards/standards/Standards.SubSurface.rb +7 -7
- data/lib/openstudio-standards/standards/Standards.Surface.rb +13 -13
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +109 -66
- data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +11 -4
- data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +5 -21
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +4 -4
- 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/ashrae_90_1_2013.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +36 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/comstock_ashrae_90_1_2016.AirLoopHVAC.rb +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +53 -10
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/comstock_ashrae_90_1_2019.AirLoopHVAC.rb +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +211 -211
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +14 -14
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +14 -14
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +1 -1
- 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.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +1 -1
- 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.Space.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +22 -28
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctParallelPIUReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctVAVReheat.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.BoilerHotWater.rb +1 -74
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +7 -59
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -21
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.DesignSpecificationOutdoorAir.rb +101 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.HeatExchangerSensLat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +643 -526
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +8 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +17 -77
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +74 -16
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +96 -44
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Surface.rb +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ThermalZone.rb +18 -6
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +328 -74
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +0 -118
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +2 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_rejection.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/baseline_outdoor_air.md +35 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_plug_load_measures.md +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +228 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +131 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_space.csv +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +5 -5
- data/lib/openstudio-standards/standards/cbes/cbes.Model.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +1 -1
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +109 -27
- data/lib/openstudio-standards/standards/deer/deer.Space.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.economizers.json +246 -4
- data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +18 -5
- 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 +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.ThermalZone.rb +18 -18
- data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +3 -3
- 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 +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.heat_pumps.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +3 -3
- 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 +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +3 -3
- 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 +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +3 -3
- 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 +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.economizers.json +260 -0
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +3 -3
- 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 +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +3 -3
- 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 +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +3 -3
- 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 +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +3 -3
- 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 +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +3 -3
- 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 +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +3 -3
- 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 +3 -3
- data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.economizers.json +248 -6
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +3 -3
- 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 +3 -3
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.economizers.json +246 -4
- data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +447 -223
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +1 -1
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +447 -223
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +5 -2
- data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_types.json +25 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/chillers.json +44 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +225 -0
- data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +2 -2
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +193 -73
- data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +10 -4
- data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +7 -7
- data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +4 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/data/chiller_types.json +32 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +36 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -7
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernEducation.osm +47587 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/NorthernHealthCare.osm +49764 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Warehouse.osm +283 -297
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_type_unit_definitions.txt +2 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +447 -223
- data/lib/openstudio-standards/standards/necb/NECB2011/data/standards_data.rb +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +49 -27
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +400 -202
- data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -4
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +637 -318
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +18 -1
- data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +637 -318
- data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +615 -307
- data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +4 -4
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +10 -5
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +1 -1
- data/lib/openstudio-standards/utilities/assertion.rb +128 -0
- data/lib/openstudio-standards/utilities/logging.rb +2 -3
- data/lib/openstudio-standards/utilities/object_info.rb +39 -18
- data/lib/openstudio-standards/utilities/schedule_translator.rb +8 -6
- data/lib/openstudio-standards/utilities/simulation.rb +24 -11
- data/lib/openstudio-standards/utilities/sqlfile.rb +10 -5
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/Weather.Model.rb +8 -9
- data/lib/openstudio-standards/weather/Weather.stat_file.rb +3 -3
- data/lib/openstudio-standards/weather/information.rb +35 -0
- data/lib/openstudio-standards.rb +69 -5
- metadata +52 -16
- data/data/standards/OpenStudio_Standards-deer-ALL-comstock(space_types).xlsx +0 -0
- data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb +0 -59
- data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingWater.rb +0 -13
- data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +0 -36
- data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +0 -898
- data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +0 -126
- data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +0 -356
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +0 -35
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb +0 -110
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTowerVariableSpeed.rb +0 -5
@@ -0,0 +1,983 @@
|
|
1
|
+
# Methods to create typical models
|
2
|
+
module OpenstudioStandards
|
3
|
+
module CreateTypical
|
4
|
+
# @!group CreateTypical
|
5
|
+
|
6
|
+
# create typical building from model
|
7
|
+
# creates a complete energy model from model with defined geometry and standards space type assignments
|
8
|
+
#
|
9
|
+
# @param template [String] standard template
|
10
|
+
# @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'.
|
11
|
+
# @param add_hvac [Boolean] Add HVAC systems to the model
|
12
|
+
# @param hvac_system_type [String] HVAC system type
|
13
|
+
# @param hvac_delivery_type [String] HVAC delivery type, how the system delivers heating or cooling to zones.
|
14
|
+
# Options are 'Forced Air' or 'Hydronic'.
|
15
|
+
# @param heating_fuel [String] The primary HVAC heating fuel type.
|
16
|
+
# Options are 'Electricity', 'NaturalGas', 'DistrictHeating', 'DistrictHeatingWater', 'DistrictHeatingSteam', 'DistrictAmbient'
|
17
|
+
# @param service_water_heating_fuel [String] The primary service water heating fuel type.
|
18
|
+
# Options are 'Inferred', 'Electricity', 'NaturalGas', 'DistrictHeating', 'DistrictHeatingWater', 'DistrictHeatingSteam', 'HeatPump'
|
19
|
+
# @param cooling_fuel [String] The primary HVAC cooling fuel type
|
20
|
+
# Options are 'Electricity', 'DistrictCooling', 'DistrictAmbient'
|
21
|
+
# @param kitchen_makeup [String] Source of makeup air for kitchen exhaust
|
22
|
+
# Options are 'None', 'Largest Zone', 'Adjacent'
|
23
|
+
# @param exterior_lighting_zone [String] The exterior lighting zone for exterior lighting allowance.
|
24
|
+
# Options are '0 - Undeveloped Areas Parks', '1 - Developed Areas Parks', '2 - Neighborhood', '3 - All Other Areas', '4 - High Activity'
|
25
|
+
# @param add_constructions [Boolean] Create and apply default construction set
|
26
|
+
# @param wall_construction_type [String] wall construction type.
|
27
|
+
# Options are 'Inferred', 'Mass', 'Metal Building', 'WoodFramed', 'SteelFramed'
|
28
|
+
# @param add_space_type_loads [Boolean] Populate existing standards space types in the model with internal loads
|
29
|
+
# @param add_daylighting_controls [Boolean] Add daylighting controls
|
30
|
+
# @param add_elevators [Boolean] Apply elevators directly to a space in the model instead of to a space type
|
31
|
+
# @param add_internal_mass [Boolean] Add internal mass to each space
|
32
|
+
# @param add_exterior_lights [Boolean] Add exterior lightings objects to parking, canopies, and facades
|
33
|
+
# @param onsite_parking_fraction [Double] Fraction of allowable exterior parking lighting applied. Set to 0 to add no parking lighting.
|
34
|
+
# @param add_exhaust [Boolean] Add exhaust fans to the models. Primarly kitchen exhaust fans.
|
35
|
+
# @param add_swh [Boolean] Add service water heating supply and demand objects
|
36
|
+
# @param add_thermostat [Boolean] Add thermostats to thermal zones based on the standards space type
|
37
|
+
# @param add_refrigeration [Boolean] Add refrigerated cases and walkin refrigeration
|
38
|
+
# @param modify_wkdy_op_hrs [Boolean] Modify the default weekday hours of operation
|
39
|
+
# @param wkdy_op_hrs_start_time [Double] Weekday operating hours start time. Enter as a fractional value, e.g. 5:15pm is 17.25. Only used if modify_wkdy_op_hrs is true.
|
40
|
+
# @param wkdy_op_hrs_duration [Double] Weekday operating hours duration from start time. Enter as a fractional value, e.g. 5:15pm is 17.25. Only used if modify_wkdy_op_hrs is true.
|
41
|
+
# @param modify_wknd_op_hrs [Boolean] Modify the default weekend hours of operation
|
42
|
+
# @param wknd_op_hrs_start_time [Double] Weekend operation hours start time. Enter as a fractional value, e.g. 5:15pm is 17.25. Only used if modify_wknd_op_hrs is true.
|
43
|
+
# @param wknd_op_hrs_duration [Double] Weekend operating hours duration from start time. Enter as a fractional value, e.g. 5:15pm is 17.25. Only used if modify_wknd_op_hrs is true.
|
44
|
+
# @param hoo_var_method [String] hours of operation variable method. Options are 'hours' or 'fractional'.
|
45
|
+
# @param enable_dst [Boolean] Enable daylight savings
|
46
|
+
# @param unmet_hours_tolerance_r [Double] Thermostat setpoint tolerance for unmet hours in degrees Rankine
|
47
|
+
# @param remove_objects [Boolean] Clean model of non-geometry objects. Only removes the same objects types as those added to the model.
|
48
|
+
# @return [Boolean] returns true if successful, false if not
|
49
|
+
def self.create_typical_building_from_model(model,
|
50
|
+
template,
|
51
|
+
climate_zone: 'Lookup From Model',
|
52
|
+
add_hvac: true,
|
53
|
+
hvac_system_type: 'Inferred',
|
54
|
+
hvac_delivery_type: 'Forced Air',
|
55
|
+
heating_fuel: 'NaturalGas',
|
56
|
+
service_water_heating_fuel: 'NaturalGas',
|
57
|
+
cooling_fuel: 'Electricity',
|
58
|
+
kitchen_makeup: 'Adjacent',
|
59
|
+
exterior_lighting_zone: '3 - All Other Areas',
|
60
|
+
add_constructions: true,
|
61
|
+
wall_construction_type: 'Inferred',
|
62
|
+
add_space_type_loads: true,
|
63
|
+
add_daylighting_controls: true,
|
64
|
+
add_elevators: true,
|
65
|
+
add_internal_mass: true,
|
66
|
+
add_exterior_lights: true,
|
67
|
+
onsite_parking_fraction: 1.0,
|
68
|
+
add_exhaust: true,
|
69
|
+
add_swh: true,
|
70
|
+
add_thermostat: true,
|
71
|
+
add_refrigeration: true,
|
72
|
+
modify_wkdy_op_hrs: false,
|
73
|
+
wkdy_op_hrs_start_time: 8.0,
|
74
|
+
wkdy_op_hrs_duration: 8.0,
|
75
|
+
modify_wknd_op_hrs: false,
|
76
|
+
wknd_op_hrs_start_time: 8.0,
|
77
|
+
wknd_op_hrs_duration: 8.0,
|
78
|
+
hoo_var_method: 'hours',
|
79
|
+
enable_dst: true,
|
80
|
+
unmet_hours_tolerance_r: 1.0,
|
81
|
+
remove_objects: true)
|
82
|
+
|
83
|
+
# report initial condition of model
|
84
|
+
initial_object_size = model.getModelObjects.size
|
85
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "The building started with #{initial_object_size} objects.")
|
86
|
+
|
87
|
+
# create a new standard class
|
88
|
+
standard = Standard.build(template)
|
89
|
+
|
90
|
+
# validate climate zone
|
91
|
+
if climate_zone == 'Lookup From Model' || climate_zone.nil?
|
92
|
+
climate_zone = standard.model_get_building_properties(model)['climate_zone']
|
93
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Using climate zone #{climate_zone} from model")
|
94
|
+
else
|
95
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Using climate zone #{climate_zone} from user arguments")
|
96
|
+
end
|
97
|
+
if climate_zone == ''
|
98
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', 'Could not determine climate zone from measure arguments or model.')
|
99
|
+
return false
|
100
|
+
end
|
101
|
+
|
102
|
+
# validate weekday hours of operation
|
103
|
+
wkdy_op_hrs_start_time_hr = nil
|
104
|
+
wkdy_op_hrs_start_time_min = nil
|
105
|
+
wkdy_op_hrs_duration_hr = nil
|
106
|
+
wkdy_op_hrs_duration_min = nil
|
107
|
+
if modify_wkdy_op_hrs
|
108
|
+
# weekday start time hr
|
109
|
+
wkdy_op_hrs_start_time_hr = wkdy_op_hrs_start_time.floor
|
110
|
+
if wkdy_op_hrs_start_time_hr < 0 || wkdy_op_hrs_start_time_hr > 24
|
111
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekday operating hours start time hrs must be between 0 and 24. #{wkdy_op_hrs_start_time} was entered.")
|
112
|
+
return false
|
113
|
+
end
|
114
|
+
|
115
|
+
# weekday start time min
|
116
|
+
wkdy_op_hrs_start_time_min = (60.0 * (wkdy_op_hrs_start_time - wkdy_op_hrs_start_time.floor)).floor
|
117
|
+
if wkdy_op_hrs_start_time_min < 0 || wkdy_op_hrs_start_time_min > 59
|
118
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekday operating hours start time mins must be between 0 and 59. #{wkdy_op_hrs_start_time} was entered.")
|
119
|
+
return false
|
120
|
+
end
|
121
|
+
|
122
|
+
# weekday duration hr
|
123
|
+
wkdy_op_hrs_duration_hr = wkdy_op_hrs_duration.floor
|
124
|
+
if wkdy_op_hrs_duration_hr < 0 || wkdy_op_hrs_duration_hr > 24
|
125
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekday operating hours duration hrs must be between 0 and 24. #{wkdy_op_hrs_duration} was entered.")
|
126
|
+
return false
|
127
|
+
end
|
128
|
+
|
129
|
+
# weekday duration min
|
130
|
+
wkdy_op_hrs_duration_min = (60.0 * (wkdy_op_hrs_duration - wkdy_op_hrs_duration.floor)).floor
|
131
|
+
if wkdy_op_hrs_duration_min < 0 || wkdy_op_hrs_duration_min > 59
|
132
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekday operating hours duration mins must be between 0 and 59. #{wkdy_op_hrs_duration} was entered.")
|
133
|
+
return false
|
134
|
+
end
|
135
|
+
|
136
|
+
# check that weekday start time plus duration does not exceed 24 hrs
|
137
|
+
if (wkdy_op_hrs_start_time_hr + wkdy_op_hrs_duration_hr + (wkdy_op_hrs_start_time_min + wkdy_op_hrs_duration_min) / 60.0) > 24.0
|
138
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Weekday start time of #{wkdy_op_hrs_start} plus duration of #{wkdy_op_hrs_duration} is more than 24 hrs, hours of operation overlap midnight.")
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
# validate weekend hours of operation
|
143
|
+
wknd_op_hrs_start_time_hr = nil
|
144
|
+
wknd_op_hrs_start_time_min = nil
|
145
|
+
wknd_op_hrs_duration_hr = nil
|
146
|
+
wknd_op_hrs_duration_min = nil
|
147
|
+
if modify_wknd_op_hrs
|
148
|
+
# weekend start time hr
|
149
|
+
wknd_op_hrs_start_time_hr = wknd_op_hrs_start_time.floor
|
150
|
+
if wknd_op_hrs_start_time_hr < 0 || wknd_op_hrs_start_time_hr > 24
|
151
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekend operating hours start time hrs must be between 0 and 24. #{wknd_op_hrs_start_time} was entered.")
|
152
|
+
return false
|
153
|
+
end
|
154
|
+
|
155
|
+
# weekend start time min
|
156
|
+
wknd_op_hrs_start_time_min = (60.0 * (wknd_op_hrs_start_time - wknd_op_hrs_start_time.floor)).floor
|
157
|
+
if wknd_op_hrs_start_time_min < 0 || wknd_op_hrs_start_time_min > 59
|
158
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekend operating hours start time mins must be between 0 and 59. #{wknd_op_hrs_start_time} was entered.")
|
159
|
+
return false
|
160
|
+
end
|
161
|
+
|
162
|
+
# weekend duration hr
|
163
|
+
wknd_op_hrs_duration_hr = wknd_op_hrs_duration.floor
|
164
|
+
if wknd_op_hrs_duration_hr < 0 || wknd_op_hrs_duration_hr > 24
|
165
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekend operating hours duration hrs must be between 0 and 24. #{wknd_op_hrs_duration} was entered.")
|
166
|
+
return false
|
167
|
+
end
|
168
|
+
|
169
|
+
# weekend duration min
|
170
|
+
wknd_op_hrs_duration_min = (60.0 * (wknd_op_hrs_duration - wknd_op_hrs_duration.floor)).floor
|
171
|
+
if wknd_op_hrs_duration_min < 0 || wknd_op_hrs_duration_min > 59
|
172
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Weekend operating hours duration min smust be between 0 and 59. #{wknd_op_hrs_duration} was entered.")
|
173
|
+
return false
|
174
|
+
end
|
175
|
+
|
176
|
+
# check that weekend start time plus duration does not exceed 24 hrs
|
177
|
+
if (wknd_op_hrs_start_time_hr + wknd_op_hrs_duration_hr + (wknd_op_hrs_start_time_min + wknd_op_hrs_duration_min) / 60.0) > 24.0
|
178
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Weekend start time of #{wknd_op_hrs_start} plus duration of #{wknd_op_hrs_duration} is more than 24 hrs, hours of operation overlap midnight.")
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
# validate unmet hours tolerance
|
183
|
+
if unmet_hours_tolerance_r < 0
|
184
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', 'unmet_hours_tolerance_r must be greater than or equal to 0 Rankine.')
|
185
|
+
return false
|
186
|
+
elsif unmet_hours_tolerance_r > 5.0
|
187
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', 'unmet_hours_tolerance_r must be less than or equal to 5 Rankine.')
|
188
|
+
return false
|
189
|
+
end
|
190
|
+
|
191
|
+
# make sure daylight savings is turned on up prior to any sizing runs being done.
|
192
|
+
if enable_dst
|
193
|
+
start_date = '2nd Sunday in March'
|
194
|
+
end_date = '1st Sunday in November'
|
195
|
+
|
196
|
+
runperiodctrl_daylightsaving = model.getRunPeriodControlDaylightSavingTime
|
197
|
+
runperiodctrl_daylightsaving.setStartDate(start_date)
|
198
|
+
runperiodctrl_daylightsaving.setEndDate(end_date)
|
199
|
+
end
|
200
|
+
|
201
|
+
# add internal loads to space types
|
202
|
+
if add_space_type_loads
|
203
|
+
|
204
|
+
# remove internal loads
|
205
|
+
if remove_objects
|
206
|
+
model.getSpaceLoads.sort.each do |instance|
|
207
|
+
# most prototype building types model exterior elevators with name Elevator
|
208
|
+
next if instance.name.to_s.include?('Elevator')
|
209
|
+
next if instance.to_InternalMass.is_initialized
|
210
|
+
next if instance.to_WaterUseEquipment.is_initialized
|
211
|
+
|
212
|
+
instance.remove
|
213
|
+
end
|
214
|
+
model.getDesignSpecificationOutdoorAirs.each(&:remove)
|
215
|
+
model.getDefaultScheduleSets.each(&:remove)
|
216
|
+
end
|
217
|
+
|
218
|
+
model.getSpaceTypes.sort.each do |space_type|
|
219
|
+
# Don't add infiltration here; will be added later in the script
|
220
|
+
test = standard.space_type_apply_internal_loads(space_type, true, true, true, true, true, false)
|
221
|
+
if test == false
|
222
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CreateTypical', "Could not add loads for #{space_type.name}. Not expected for #{template}")
|
223
|
+
next
|
224
|
+
end
|
225
|
+
|
226
|
+
# apply internal load schedules
|
227
|
+
# the last bool test it to make thermostat schedules. They are now added in HVAC section instead of here
|
228
|
+
standard.space_type_apply_internal_load_schedules(space_type, true, true, true, true, true, true, false)
|
229
|
+
|
230
|
+
# extend space type name to include the template. Consider this as well for load defs
|
231
|
+
space_type.setName("#{space_type.name} - #{template}")
|
232
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding loads to space type named #{space_type.name}")
|
233
|
+
end
|
234
|
+
|
235
|
+
# warn if spaces in model without space type
|
236
|
+
spaces_without_space_types = []
|
237
|
+
model.getSpaces.sort.each do |space|
|
238
|
+
next if space.spaceType.is_initialized
|
239
|
+
|
240
|
+
spaces_without_space_types << space
|
241
|
+
end
|
242
|
+
if !spaces_without_space_types.empty?
|
243
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CreateTypical', "#{spaces_without_space_types.size} spaces do not have space types assigned, and wont' receive internal loads from standards space type lookups.")
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
# identify primary building type (used for construction, and ideally HVAC as well)
|
248
|
+
building_types = {}
|
249
|
+
model.getSpaceTypes.sort.each do |space_type|
|
250
|
+
# populate hash of building types
|
251
|
+
if space_type.standardsBuildingType.is_initialized
|
252
|
+
bldg_type = space_type.standardsBuildingType.get
|
253
|
+
if !building_types.key?(bldg_type)
|
254
|
+
building_types[bldg_type] = space_type.floorArea
|
255
|
+
else
|
256
|
+
building_types[bldg_type] += space_type.floorArea
|
257
|
+
end
|
258
|
+
else
|
259
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CreateTypical', "Can't identify building type for #{space_type.name}")
|
260
|
+
end
|
261
|
+
end
|
262
|
+
# @todo this fails if no space types, or maybe just no space types with standards
|
263
|
+
primary_bldg_type = building_types.key(building_types.values.max)
|
264
|
+
# Used for some lookups in the standards gem
|
265
|
+
lookup_building_type = standard.model_get_lookup_name(primary_bldg_type)
|
266
|
+
model.getBuilding.setStandardsBuildingType(primary_bldg_type)
|
267
|
+
|
268
|
+
# set FC factor constructions before adding other constructions
|
269
|
+
standard.model_set_below_grade_wall_constructions(model, lookup_building_type, climate_zone)
|
270
|
+
standard.model_set_floor_constructions(model, lookup_building_type, climate_zone)
|
271
|
+
if model.getFFactorGroundFloorConstructions.empty?
|
272
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', 'Unable to determine FC factor value to use. Using default ground construction instead.')
|
273
|
+
else
|
274
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', 'Set FC factor constructions for slab and below grade walls.')
|
275
|
+
end
|
276
|
+
|
277
|
+
# make construction set and apply to building
|
278
|
+
if add_constructions
|
279
|
+
|
280
|
+
# remove default construction sets
|
281
|
+
if remove_objects
|
282
|
+
model.getDefaultConstructionSets.each(&:remove)
|
283
|
+
end
|
284
|
+
|
285
|
+
if ['SmallHotel', 'LargeHotel', 'MidriseApartment', 'HighriseApartment'].include?(primary_bldg_type)
|
286
|
+
is_residential = 'Yes'
|
287
|
+
occ_type = 'Residential'
|
288
|
+
else
|
289
|
+
is_residential = 'No'
|
290
|
+
occ_type = 'Nonresidential'
|
291
|
+
end
|
292
|
+
bldg_def_const_set = standard.model_add_construction_set(model, climate_zone, lookup_building_type, nil, is_residential)
|
293
|
+
if bldg_def_const_set.is_initialized
|
294
|
+
bldg_def_const_set = bldg_def_const_set.get
|
295
|
+
if is_residential == 'Yes'
|
296
|
+
bldg_def_const_set.setName("Res #{bldg_def_const_set.name}")
|
297
|
+
end
|
298
|
+
model.getBuilding.setDefaultConstructionSet(bldg_def_const_set)
|
299
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding default construction set named #{bldg_def_const_set.name}")
|
300
|
+
else
|
301
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "Could not create default construction set for the building type #{lookup_building_type} in climate zone #{climate_zone}.")
|
302
|
+
return false
|
303
|
+
end
|
304
|
+
|
305
|
+
# Replace the construction of exterior walls with user-specified wall construction type
|
306
|
+
unless wall_construction_type == 'Inferred'
|
307
|
+
# Check that a default exterior construction set is defined
|
308
|
+
if bldg_def_const_set.defaultExteriorSurfaceConstructions.empty?
|
309
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', 'Default construction set has no default exterior surface constructions.')
|
310
|
+
return false
|
311
|
+
end
|
312
|
+
ext_surf_consts = bldg_def_const_set.defaultExteriorSurfaceConstructions.get
|
313
|
+
|
314
|
+
# Check that a default exterior wall is defined
|
315
|
+
if ext_surf_consts.wallConstruction.empty?
|
316
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', 'Default construction set has no default exterior wall construction.')
|
317
|
+
return false
|
318
|
+
end
|
319
|
+
old_construction = ext_surf_consts.wallConstruction.get
|
320
|
+
standards_info = old_construction.standardsInformation
|
321
|
+
|
322
|
+
# Get the old wall construction type
|
323
|
+
if standards_info.standardsConstructionType.empty?
|
324
|
+
old_wall_construction_type = 'Not defined'
|
325
|
+
else
|
326
|
+
old_wall_construction_type = standards_info.standardsConstructionType.get
|
327
|
+
end
|
328
|
+
|
329
|
+
# Modify the default wall construction if different from measure input
|
330
|
+
if old_wall_construction_type == wall_construction_type
|
331
|
+
# Don't modify if the default matches the user-specified wall construction type
|
332
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Exterior wall construction type #{wall_construction_type} is the default for this building type.")
|
333
|
+
else
|
334
|
+
climate_zone_set = standard.model_find_climate_zone_set(model, climate_zone)
|
335
|
+
new_construction = standard.model_find_and_add_construction(model,
|
336
|
+
climate_zone_set,
|
337
|
+
'ExteriorWall',
|
338
|
+
wall_construction_type,
|
339
|
+
occ_type)
|
340
|
+
ext_surf_consts.setWallConstruction(new_construction)
|
341
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Set exterior wall construction to #{new_construction.name}, replacing building type default #{old_construction.name}.")
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
# Replace the construction of any outdoor-facing "AtticFloor" surfaces
|
346
|
+
# with the "ExteriorRoof" - "IEAD" construction for the specific climate zone and template.
|
347
|
+
# This prevents creation of buildings where the DOE Prototype building construction set
|
348
|
+
# assumes an attic but the supplied geometry used does not have an attic.
|
349
|
+
new_construction = nil
|
350
|
+
climate_zone_set = standard.model_find_climate_zone_set(model, climate_zone)
|
351
|
+
model.getSurfaces.sort.each do |surf|
|
352
|
+
next unless surf.outsideBoundaryCondition == 'Outdoors'
|
353
|
+
next unless surf.surfaceType == 'RoofCeiling'
|
354
|
+
next if surf.construction.empty?
|
355
|
+
|
356
|
+
construction = surf.construction.get
|
357
|
+
standards_info = construction.standardsInformation
|
358
|
+
next if standards_info.intendedSurfaceType.empty?
|
359
|
+
next unless standards_info.intendedSurfaceType.get == 'AtticFloor'
|
360
|
+
|
361
|
+
if new_construction.nil?
|
362
|
+
new_construction = standard.model_find_and_add_construction(model,
|
363
|
+
climate_zone_set,
|
364
|
+
'ExteriorRoof',
|
365
|
+
'IEAD',
|
366
|
+
occ_type)
|
367
|
+
end
|
368
|
+
surf.setConstruction(new_construction)
|
369
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Changed the construction for #{surf.name} from #{construction.name} to #{new_construction.name} to avoid outdoor-facing attic floor constructions in buildings with no attic space.")
|
370
|
+
end
|
371
|
+
|
372
|
+
# address any adiabatic surfaces that don't have hard assigned constructions
|
373
|
+
model.getSurfaces.sort.each do |surface|
|
374
|
+
next if surface.outsideBoundaryCondition != 'Adiabatic'
|
375
|
+
next if surface.construction.is_initialized
|
376
|
+
|
377
|
+
surface.setAdjacentSurface(surface)
|
378
|
+
surface.setConstruction(surface.construction.get)
|
379
|
+
surface.setOutsideBoundaryCondition('Adiabatic')
|
380
|
+
end
|
381
|
+
|
382
|
+
# modify the infiltration rates
|
383
|
+
if remove_objects
|
384
|
+
model.getSpaceInfiltrationDesignFlowRates.each(&:remove)
|
385
|
+
end
|
386
|
+
standard.model_apply_infiltration_standard(model)
|
387
|
+
standard.model_modify_infiltration_coefficients(model, primary_bldg_type, climate_zone)
|
388
|
+
|
389
|
+
# set ground temperatures from DOE prototype buildings
|
390
|
+
standard.model_add_ground_temperatures(model, primary_bldg_type, climate_zone)
|
391
|
+
end
|
392
|
+
|
393
|
+
# add elevators (returns ElectricEquipment object)
|
394
|
+
if add_elevators
|
395
|
+
|
396
|
+
# remove elevators as spaceLoads or exteriorLights
|
397
|
+
model.getSpaceLoads.sort.each do |instance|
|
398
|
+
next if !instance.name.to_s.include?('Elevator') # most prototype building types model exterior elevators with name Elevator
|
399
|
+
|
400
|
+
instance.remove
|
401
|
+
end
|
402
|
+
model.getExteriorLightss.sort.each do |ext_light|
|
403
|
+
next if !ext_light.name.to_s.include?('Fuel equipment') # some prototype building types model exterior elevators by this name
|
404
|
+
|
405
|
+
ext_light.remove
|
406
|
+
end
|
407
|
+
|
408
|
+
elevators = standard.model_add_elevators(model)
|
409
|
+
if elevators.nil?
|
410
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', 'No elevators added to the building.')
|
411
|
+
else
|
412
|
+
elevator_def = elevators.electricEquipmentDefinition
|
413
|
+
design_level = elevator_def.designLevel.get
|
414
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{elevators.multiplier.round(1)} elevators each with power of #{OpenStudio.toNeatString(design_level, 0, true)} (W), plus lights and fans.")
|
415
|
+
elevator_def.setFractionLatent(0.0)
|
416
|
+
elevator_def.setFractionRadiant(0.0)
|
417
|
+
elevator_def.setFractionLost(1.0)
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
421
|
+
# add exterior lights (returns a hash where key is lighting type and value is exteriorLights object)
|
422
|
+
if add_exterior_lights
|
423
|
+
|
424
|
+
if remove_objects
|
425
|
+
model.getExteriorLightss.sort.each do |ext_light|
|
426
|
+
next if ext_light.name.to_s.include?('Fuel equipment') # some prototype building types model exterior elevators by this name
|
427
|
+
|
428
|
+
ext_light.remove
|
429
|
+
end
|
430
|
+
end
|
431
|
+
|
432
|
+
exterior_lights = standard.model_add_typical_exterior_lights(model, exterior_lighting_zone.chars[0].to_i, onsite_parking_fraction)
|
433
|
+
exterior_lights.each do |k, v|
|
434
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding Exterior Lights named #{v.exteriorLightsDefinition.name} with design level of #{v.exteriorLightsDefinition.designLevel} * #{OpenStudio.toNeatString(v.multiplier, 0, true)}.")
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
# add_exhaust
|
439
|
+
if add_exhaust
|
440
|
+
|
441
|
+
# remove exhaust objects
|
442
|
+
if remove_objects
|
443
|
+
model.getFanZoneExhausts.each(&:remove)
|
444
|
+
end
|
445
|
+
|
446
|
+
zone_exhaust_fans = standard.model_add_exhaust(model, kitchen_makeup) # second argument is strategy for finding makeup zones for exhaust zones
|
447
|
+
zone_exhaust_fans.each do |k, v|
|
448
|
+
max_flow_rate_ip = OpenStudio.convert(k.maximumFlowRate.get, 'm^3/s', 'cfm').get
|
449
|
+
if v.key?(:zone_mixing)
|
450
|
+
zone_mixing = v[:zone_mixing]
|
451
|
+
mixing_source_zone_name = zone_mixing.sourceZone.get.name
|
452
|
+
mixing_design_flow_rate_ip = OpenStudio.convert(zone_mixing.designFlowRate.get, 'm^3/s', 'cfm').get
|
453
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{OpenStudio.toNeatString(max_flow_rate_ip, 0, true)} (cfm) of exhaust to #{k.thermalZone.get.name}, with #{OpenStudio.toNeatString(mixing_design_flow_rate_ip, 0, true)} (cfm) of makeup air from #{mixing_source_zone_name}")
|
454
|
+
else
|
455
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{OpenStudio.toNeatString(max_flow_rate_ip, 0, true)} (cfm) of exhaust to #{k.thermalZone.get.name}")
|
456
|
+
end
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
460
|
+
# add service water heating demand and supply
|
461
|
+
if add_swh
|
462
|
+
|
463
|
+
# remove water use equipment and water use connections
|
464
|
+
if remove_objects
|
465
|
+
# @todo remove plant loops used for service water heating
|
466
|
+
model.getWaterUseEquipments.each(&:remove)
|
467
|
+
model.getWaterUseConnectionss.each(&:remove)
|
468
|
+
end
|
469
|
+
|
470
|
+
# Infer the SWH type
|
471
|
+
if service_water_heating_fuel == 'Inferred'
|
472
|
+
if heating_fuel == 'NaturalGas' || heating_fuel.include?('DistrictHeating')
|
473
|
+
# If building has gas service, probably uses natural gas for SWH
|
474
|
+
service_water_heating_fuel = 'NaturalGas'
|
475
|
+
elsif heating_fuel == 'Electricity'
|
476
|
+
# If building is doing space heating with electricity, probably used for SWH
|
477
|
+
service_water_heating_fuel = 'Electricity'
|
478
|
+
elsif heating_fuel == 'DistrictAmbient'
|
479
|
+
# If building has district ambient loop, it is fancy and probably uses HPs for SWH
|
480
|
+
service_water_heating_fuel = 'HeatPump'
|
481
|
+
else
|
482
|
+
# Use inferences built into OpenStudio Standards for each building and space type
|
483
|
+
service_water_heating_fuel = nil
|
484
|
+
end
|
485
|
+
end
|
486
|
+
|
487
|
+
typical_swh = standard.model_add_typical_swh(model, water_heater_fuel: service_water_heating_fuel)
|
488
|
+
midrise_swh_loops = []
|
489
|
+
stripmall_swh_loops = []
|
490
|
+
typical_swh.each do |loop|
|
491
|
+
if loop.name.get.include?('MidriseApartment')
|
492
|
+
midrise_swh_loops << loop
|
493
|
+
elsif loop.name.get.include?('RetailStripmall')
|
494
|
+
stripmall_swh_loops << loop
|
495
|
+
else
|
496
|
+
water_use_connections = []
|
497
|
+
loop.demandComponents.each do |component|
|
498
|
+
next if !component.to_WaterUseConnections.is_initialized
|
499
|
+
|
500
|
+
water_use_connections << component
|
501
|
+
end
|
502
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{loop.name} to the building. It has #{water_use_connections.size} water use connections.")
|
503
|
+
end
|
504
|
+
end
|
505
|
+
if !midrise_swh_loops.empty?
|
506
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{midrise_swh_loops.size} MidriseApartment service water heating loops.")
|
507
|
+
end
|
508
|
+
if !stripmall_swh_loops.empty?
|
509
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Adding #{stripmall_swh_loops.size} RetailStripmall service water heating loops.")
|
510
|
+
end
|
511
|
+
end
|
512
|
+
|
513
|
+
# add_daylighting_controls
|
514
|
+
if add_daylighting_controls
|
515
|
+
# remove add_daylighting_controls objects
|
516
|
+
if remove_objects
|
517
|
+
model.getDaylightingControls.each(&:remove)
|
518
|
+
end
|
519
|
+
|
520
|
+
# add daylight controls, need to perform a sizing run for 2010
|
521
|
+
if template == '90.1-2010' || template == 'ComStock 90.1-2010'
|
522
|
+
if standard.model_run_sizing_run(model, "#{Dir.pwd}/create_typical_building_from_model_SR0") == false
|
523
|
+
return false
|
524
|
+
end
|
525
|
+
end
|
526
|
+
standard.model_add_daylighting_controls(model)
|
527
|
+
end
|
528
|
+
|
529
|
+
# add refrigeration
|
530
|
+
if add_refrigeration
|
531
|
+
|
532
|
+
# remove refrigeration equipment
|
533
|
+
if remove_objects
|
534
|
+
model.getRefrigerationSystems.each(&:remove)
|
535
|
+
end
|
536
|
+
|
537
|
+
# Add refrigerated cases and walkins
|
538
|
+
standard.model_add_typical_refrigeration(model, primary_bldg_type)
|
539
|
+
end
|
540
|
+
|
541
|
+
# @todo add slab modeling and slab insulation
|
542
|
+
# @todo fuel customization for cooking and laundry
|
543
|
+
# works by switching some fraction of electric loads to gas if requested (assuming base load is electric)
|
544
|
+
|
545
|
+
# add thermostats
|
546
|
+
if add_thermostat
|
547
|
+
|
548
|
+
# remove thermostats
|
549
|
+
if remove_objects
|
550
|
+
model.getThermostatSetpointDualSetpoints.each(&:remove)
|
551
|
+
end
|
552
|
+
|
553
|
+
model.getSpaceTypes.sort.each do |space_type|
|
554
|
+
# create thermostat schedules
|
555
|
+
# skip un-recognized space types
|
556
|
+
next if standard.space_type_get_standards_data(space_type).empty?
|
557
|
+
|
558
|
+
# the last bool test it to make thermostat schedules. They are added to the model but not assigned
|
559
|
+
standard.space_type_apply_internal_load_schedules(space_type, false, false, false, false, false, false, true)
|
560
|
+
|
561
|
+
# identify thermal thermostat and apply to zones (apply_internal_load_schedules names )
|
562
|
+
model.getThermostatSetpointDualSetpoints.sort.each do |thermostat|
|
563
|
+
next if thermostat.name.to_s != "#{space_type.name} Thermostat"
|
564
|
+
next if !thermostat.coolingSetpointTemperatureSchedule.is_initialized
|
565
|
+
next if !thermostat.heatingSetpointTemperatureSchedule.is_initialized
|
566
|
+
|
567
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Assigning #{thermostat.name} to thermal zones with #{space_type.name} assigned.")
|
568
|
+
space_type.spaces.sort.each do |space|
|
569
|
+
next if !space.thermalZone.is_initialized
|
570
|
+
|
571
|
+
space.thermalZone.get.setThermostatSetpointDualSetpoint(thermostat)
|
572
|
+
end
|
573
|
+
end
|
574
|
+
end
|
575
|
+
end
|
576
|
+
|
577
|
+
# add internal mass
|
578
|
+
if add_internal_mass
|
579
|
+
|
580
|
+
if remove_objects
|
581
|
+
model.getSpaceLoads.sort.each do |instance|
|
582
|
+
next unless instance.to_InternalMass.is_initialized
|
583
|
+
|
584
|
+
instance.remove
|
585
|
+
end
|
586
|
+
end
|
587
|
+
|
588
|
+
# add internal mass to conditioned spaces; needs to happen after thermostats are applied
|
589
|
+
standard.model_add_internal_mass(model, primary_bldg_type)
|
590
|
+
end
|
591
|
+
|
592
|
+
# add hvac system
|
593
|
+
if add_hvac
|
594
|
+
|
595
|
+
# remove HVAC objects
|
596
|
+
if remove_objects
|
597
|
+
standard.model_remove_prm_hvac(model)
|
598
|
+
end
|
599
|
+
|
600
|
+
case hvac_system_type
|
601
|
+
when 'Inferred'
|
602
|
+
|
603
|
+
# Get the hvac delivery type enum
|
604
|
+
hvac_delivery = case hvac_delivery_type
|
605
|
+
when 'Forced Air'
|
606
|
+
'air'
|
607
|
+
when 'Hydronic'
|
608
|
+
'hydronic'
|
609
|
+
end
|
610
|
+
|
611
|
+
# Group the zones by occupancy type. Only split out non-dominant groups if their total area exceeds the limit.
|
612
|
+
sys_groups = standard.model_group_zones_by_type(model, OpenStudio.convert(20_000, 'ft^2', 'm^2').get)
|
613
|
+
|
614
|
+
# For each group, infer the HVAC system type.
|
615
|
+
sys_groups.each do |sys_group|
|
616
|
+
# Infer the primary system type
|
617
|
+
sys_type, central_htg_fuel, zone_htg_fuel, clg_fuel = standard.model_typical_hvac_system_type(model,
|
618
|
+
climate_zone,
|
619
|
+
sys_group['type'],
|
620
|
+
hvac_delivery,
|
621
|
+
heating_fuel,
|
622
|
+
cooling_fuel,
|
623
|
+
OpenStudio.convert(sys_group['area_ft2'], 'ft^2', 'm^2').get,
|
624
|
+
sys_group['stories'])
|
625
|
+
|
626
|
+
# Infer the secondary system type for multizone systems
|
627
|
+
sec_sys_type = case sys_type
|
628
|
+
when 'PVAV Reheat', 'VAV Reheat'
|
629
|
+
'PSZ-AC'
|
630
|
+
when 'PVAV PFP Boxes', 'VAV PFP Boxes'
|
631
|
+
'PSZ-HP'
|
632
|
+
else
|
633
|
+
sys_type # same as primary system type
|
634
|
+
end
|
635
|
+
|
636
|
+
# group zones
|
637
|
+
story_zone_lists = standard.model_group_zones_by_story(model, sys_group['zones'])
|
638
|
+
|
639
|
+
# On each story, add the primary system to the primary zones
|
640
|
+
# and add the secondary system to any zones that are different.
|
641
|
+
story_zone_lists.each do |story_group|
|
642
|
+
# Differentiate primary and secondary zones, based on
|
643
|
+
# operating hours and internal loads (same as 90.1 PRM)
|
644
|
+
pri_sec_zone_lists = standard.model_differentiate_primary_secondary_thermal_zones(model, story_group)
|
645
|
+
system_zones = pri_sec_zone_lists['primary']
|
646
|
+
|
647
|
+
# if the primary system type is PTAC, filter to cooled zones to prevent sizing error if no cooling
|
648
|
+
if sys_type == 'PTAC'
|
649
|
+
heated_and_cooled_zones = system_zones.select { |zone| standard.thermal_zone_heated?(zone) && standard.thermal_zone_cooled?(zone) }
|
650
|
+
cooled_only_zones = system_zones.select { |zone| !standard.thermal_zone_heated?(zone) && standard.thermal_zone_cooled?(zone) }
|
651
|
+
system_zones = heated_and_cooled_zones + cooled_only_zones
|
652
|
+
end
|
653
|
+
|
654
|
+
# Add the primary system to the primary zones
|
655
|
+
unless standard.model_add_hvac_system(model, sys_type, central_htg_fuel, zone_htg_fuel, clg_fuel, system_zones)
|
656
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "HVAC system type '#{sys_type}' not recognized. Check input system type argument against Model.hvac.rb for valid hvac system type names.")
|
657
|
+
return false
|
658
|
+
end
|
659
|
+
|
660
|
+
# Add the secondary system to the secondary zones (if any)
|
661
|
+
if !pri_sec_zone_lists['secondary'].empty?
|
662
|
+
system_zones = pri_sec_zone_lists['secondary']
|
663
|
+
if (sec_sys_type == 'PTAC') || (sec_sys_type == 'PSZ-AC')
|
664
|
+
heated_and_cooled_zones = system_zones.select { |zone| standard.thermal_zone_heated?(zone) && standard.thermal_zone_cooled?(zone) }
|
665
|
+
cooled_only_zones = system_zones.select { |zone| !standard.thermal_zone_heated?(zone) && standard.thermal_zone_cooled?(zone) }
|
666
|
+
system_zones = heated_and_cooled_zones + cooled_only_zones
|
667
|
+
end
|
668
|
+
unless standard.model_add_hvac_system(model, sec_sys_type, central_htg_fuel, zone_htg_fuel, clg_fuel, system_zones)
|
669
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "HVAC system type '#{sys_type}' not recognized. Check input system type argument against Model.hvac.rb for valid hvac system type names.")
|
670
|
+
return false
|
671
|
+
end
|
672
|
+
end
|
673
|
+
end
|
674
|
+
end
|
675
|
+
|
676
|
+
else
|
677
|
+
# HVAC system_type specified
|
678
|
+
# Group the zones by occupancy type. Only split out non-dominant groups if their total area exceeds the limit.
|
679
|
+
sys_groups = standard.model_group_zones_by_type(model, OpenStudio.convert(20_000, 'ft^2', 'm^2').get)
|
680
|
+
sys_groups.each do |sys_group|
|
681
|
+
# group zones
|
682
|
+
story_zone_groups = standard.model_group_zones_by_story(model, sys_group['zones'])
|
683
|
+
|
684
|
+
# Add the user specified HVAC system for each story.
|
685
|
+
# Single-zone systems will get one per zone.
|
686
|
+
story_zone_groups.each do |zones|
|
687
|
+
unless OpenstudioStandards::HVAC.add_cbecs_hvac_system(model, standard, hvac_system_type, zones)
|
688
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "HVAC system type '#{hvac_system_type}' not recognized. Check input system type argument against cbecs_hvac.rb in the HVAC module for valid HVAC system type names.")
|
689
|
+
return false
|
690
|
+
end
|
691
|
+
end
|
692
|
+
end
|
693
|
+
end
|
694
|
+
end
|
695
|
+
|
696
|
+
# hours of operation
|
697
|
+
if modify_wkdy_op_hrs || modify_wknd_op_hrs
|
698
|
+
# Infer the current hours of operation schedule for the building
|
699
|
+
op_sch = standard.model_infer_hours_of_operation_building(model)
|
700
|
+
|
701
|
+
# Convert existing schedules in the model to parametric schedules based on current hours of operation
|
702
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Generating parametric schedules from ruleset schedules using #{hoo_var_method} variable method for hours of operation formula.")
|
703
|
+
standard.model_setup_parametric_schedules(model, hoo_var_method: hoo_var_method)
|
704
|
+
|
705
|
+
# Create start and end times from start time and duration supplied
|
706
|
+
wkdy_start_time = nil
|
707
|
+
wkdy_end_time = nil
|
708
|
+
wknd_start_time = nil
|
709
|
+
wknd_end_time = nil
|
710
|
+
# weekdays
|
711
|
+
if modify_wkdy_op_hrs
|
712
|
+
wkdy_start_time = OpenStudio::Time.new(0, wkdy_op_hrs_start_time_hr, wkdy_op_hrs_start_time_min, 0)
|
713
|
+
wkdy_end_time = wkdy_start_time + OpenStudio::Time.new(0, wkdy_op_hrs_duration_hr, wkdy_op_hrs_duration_min, 0)
|
714
|
+
end
|
715
|
+
# weekends
|
716
|
+
if modify_wknd_op_hrs
|
717
|
+
wknd_start_time = OpenStudio::Time.new(0, wknd_op_hrs_start_time_hr, wknd_op_hrs_start_time_min, 0)
|
718
|
+
wknd_end_time = wknd_start_time + OpenStudio::Time.new(0, wknd_op_hrs_duration_hr, wknd_op_hrs_duration_min, 0)
|
719
|
+
end
|
720
|
+
|
721
|
+
# Modify hours of operation, using weekdays values for all weekdays and weekend values for Saturday and Sunday
|
722
|
+
standard.schedule_ruleset_set_hours_of_operation(op_sch,
|
723
|
+
wkdy_start_time: wkdy_start_time,
|
724
|
+
wkdy_end_time: wkdy_end_time,
|
725
|
+
sat_start_time: wknd_start_time,
|
726
|
+
sat_end_time: wknd_end_time,
|
727
|
+
sun_start_time: wknd_start_time,
|
728
|
+
sun_end_time: wknd_end_time)
|
729
|
+
|
730
|
+
# Apply new operating hours to parametric schedules to make schedules in model reflect modified hours of operation
|
731
|
+
parametric_schedules = standard.model_apply_parametric_schedules(model, error_on_out_of_order: false)
|
732
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Updated #{parametric_schedules.size} schedules with new hours of operation.")
|
733
|
+
end
|
734
|
+
|
735
|
+
# set hvac controls and efficiencies (this should be last model articulation element)
|
736
|
+
if add_hvac
|
737
|
+
# set additional properties for building
|
738
|
+
props = model.getBuilding.additionalProperties
|
739
|
+
props.setFeature('hvac_system_type', hvac_system_type)
|
740
|
+
|
741
|
+
case hvac_system_type
|
742
|
+
when 'Ideal Air Loads'
|
743
|
+
|
744
|
+
else
|
745
|
+
# Set the heating and cooling sizing parameters
|
746
|
+
standard.model_apply_prm_sizing_parameters(model)
|
747
|
+
|
748
|
+
# Perform a sizing run
|
749
|
+
if standard.model_run_sizing_run(model, "#{Dir.pwd}/create_typical_building_from_model_SR1") == false
|
750
|
+
return false
|
751
|
+
end
|
752
|
+
|
753
|
+
# If there are any multizone systems, reset damper positions
|
754
|
+
# to achieve a 60% ventilation effectiveness minimum for the system
|
755
|
+
# following the ventilation rate procedure from 62.1
|
756
|
+
standard.model_apply_multizone_vav_outdoor_air_sizing(model)
|
757
|
+
|
758
|
+
# Apply the prototype HVAC assumptions
|
759
|
+
standard.model_apply_prototype_hvac_assumptions(model, primary_bldg_type, climate_zone)
|
760
|
+
|
761
|
+
# Apply the HVAC efficiency standard
|
762
|
+
standard.model_apply_hvac_efficiency_standard(model, climate_zone)
|
763
|
+
end
|
764
|
+
end
|
765
|
+
|
766
|
+
# set unmet hours tolerance
|
767
|
+
unmet_hrs_tol_k = OpenStudio.convert(unmet_hours_tolerance_r, 'R', 'K').get
|
768
|
+
tolerances = model.getOutputControlReportingTolerances
|
769
|
+
tolerances.setToleranceforTimeHeatingSetpointNotMet(unmet_hrs_tol_k)
|
770
|
+
tolerances.setToleranceforTimeCoolingSetpointNotMet(unmet_hrs_tol_k)
|
771
|
+
|
772
|
+
# remove everything but spaces, zones, and stub space types (extend as needed for additional objects, may make bool arg for this)
|
773
|
+
if remove_objects
|
774
|
+
model.purgeUnusedResourceObjects
|
775
|
+
objects_after_cleanup = initial_object_size - model.getModelObjects.size
|
776
|
+
if objects_after_cleanup > 0
|
777
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Removing #{objects_after_cleanup} objects from model")
|
778
|
+
end
|
779
|
+
end
|
780
|
+
|
781
|
+
# change night cycling control to "Thermostat" cycling and increase thermostat tolerance to 1.99999
|
782
|
+
manager_night_cycles = model.getAvailabilityManagerNightCycles
|
783
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Changing thermostat tollerance to 1.99999 for #{manager_night_cycles.size} night cycle manager objects.")
|
784
|
+
manager_night_cycles.each do |night_cycle|
|
785
|
+
night_cycle.setThermostatTolerance(1.9999)
|
786
|
+
night_cycle.setCyclingRunTimeControlType('Thermostat')
|
787
|
+
end
|
788
|
+
|
789
|
+
# disable HVAC Sizing Simulation for Sizing Periods, not used for the type of PlantLoop sizing used in ComStock
|
790
|
+
if model.version >= OpenStudio::VersionString.new('3.0.0')
|
791
|
+
sim_control = model.getSimulationControl
|
792
|
+
sim_control.setDoHVACSizingSimulationforSizingPeriodsNoFail(false)
|
793
|
+
end
|
794
|
+
|
795
|
+
# report final condition of model
|
796
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "The building finished with #{model.getModelObjects.size} objects.")
|
797
|
+
|
798
|
+
return true
|
799
|
+
end
|
800
|
+
|
801
|
+
# creates spaces types and construction objects in the model for the given
|
802
|
+
# building type, template, and climate zone
|
803
|
+
#
|
804
|
+
# @param building_type [String] standard building type
|
805
|
+
# @param template [String] standard template
|
806
|
+
# @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
|
807
|
+
# @param create_space_types [Boolean] Create space types
|
808
|
+
# @param create_construction_set [Boolean] Create the construction set
|
809
|
+
# @param set_building_defaults [Boolean] Set the climate zone, newly generated construction set,
|
810
|
+
# and first newly generated space type as the building default
|
811
|
+
# @return [Boolean] returns true if successful, false if not
|
812
|
+
def self.create_space_types_and_constructions(model,
|
813
|
+
building_type,
|
814
|
+
template,
|
815
|
+
climate_zone,
|
816
|
+
create_space_types: true,
|
817
|
+
create_construction_set: true,
|
818
|
+
set_building_defaults: true)
|
819
|
+
# reporting initial condition of model
|
820
|
+
starting_space_types = model.getSpaceTypes.sort
|
821
|
+
starting_construction_sets = model.getDefaultConstructionSets.sort
|
822
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "The building started with #{starting_space_types.size} space types and #{starting_construction_sets.size} construction sets.")
|
823
|
+
|
824
|
+
# lookup space types for specified building type (false indicates not to use whole building type only)
|
825
|
+
space_type_hash = OpenstudioStandards::CreateTypical.get_space_types_from_building_type(building_type, template: template, whole_building: false)
|
826
|
+
if space_type_hash == false
|
827
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', "#{building_type} is an unexpected building type.")
|
828
|
+
return false
|
829
|
+
end
|
830
|
+
|
831
|
+
# create space_type_map from array
|
832
|
+
space_type_map = {}
|
833
|
+
default_space_type_name = nil
|
834
|
+
space_type_hash.each do |space_type_name, hash|
|
835
|
+
# skip space types like undeveloped and basement
|
836
|
+
next if hash[:space_type_gen] == false
|
837
|
+
|
838
|
+
# no spaces to pass in
|
839
|
+
space_type_map[space_type_name] = []
|
840
|
+
if hash[:default]
|
841
|
+
default_space_type_name = space_type_name
|
842
|
+
end
|
843
|
+
end
|
844
|
+
|
845
|
+
# Make the standard applier
|
846
|
+
standard = Standard.build(template)
|
847
|
+
|
848
|
+
# mapping building_type name is needed for a few methods
|
849
|
+
lookup_building_type = standard.model_get_lookup_name(building_type)
|
850
|
+
|
851
|
+
# remap small medium and large office to office
|
852
|
+
if building_type.include?('Office')
|
853
|
+
building_type = 'Office'
|
854
|
+
end
|
855
|
+
|
856
|
+
# get array of new space types
|
857
|
+
space_types_new = []
|
858
|
+
|
859
|
+
# create_space_types
|
860
|
+
if create_space_types
|
861
|
+
|
862
|
+
# array of starting space types
|
863
|
+
space_types_starting = model.getSpaceTypes.sort
|
864
|
+
|
865
|
+
# create stub space types
|
866
|
+
space_type_hash.each do |space_type_name, hash|
|
867
|
+
# skip space types like undeveloped and basement
|
868
|
+
next if hash[:space_type_gen] == false
|
869
|
+
|
870
|
+
# create space type
|
871
|
+
space_type = OpenStudio::Model::SpaceType.new(model)
|
872
|
+
space_type.setStandardsBuildingType(lookup_building_type)
|
873
|
+
space_type.setStandardsSpaceType(space_type_name)
|
874
|
+
space_type.setName("#{lookup_building_type} #{space_type_name}")
|
875
|
+
|
876
|
+
# add to array of new space types
|
877
|
+
space_types_new << space_type
|
878
|
+
|
879
|
+
# add internal loads (the nil check isn't necessary, but I will keep it in as a warning instad of an error)
|
880
|
+
test = standard.space_type_apply_internal_loads(space_type, true, true, true, true, true, true)
|
881
|
+
if test.nil?
|
882
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CreateTypical', "Could not add loads for #{space_type.name}. Not expected for #{template} #{lookup_building_type}")
|
883
|
+
end
|
884
|
+
|
885
|
+
# the last bool test it to make thermostat schedules. They are added to the model but not assigned
|
886
|
+
standard.space_type_apply_internal_load_schedules(space_type, true, true, true, true, true, true, true)
|
887
|
+
|
888
|
+
# assign colors
|
889
|
+
standard.space_type_apply_rendering_color(space_type)
|
890
|
+
|
891
|
+
# exend space type name to include the template. Consider this as well for load defs
|
892
|
+
space_type.setName("#{space_type.name} - #{template}")
|
893
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Added space type named #{space_type.name}")
|
894
|
+
end
|
895
|
+
|
896
|
+
end
|
897
|
+
|
898
|
+
# add construction sets
|
899
|
+
bldg_def_const_set = nil
|
900
|
+
if create_construction_set
|
901
|
+
|
902
|
+
# Make the default construction set for the building
|
903
|
+
is_residential = 'No' # default is nonresidential for building level
|
904
|
+
bldg_def_const_set = standard.model_add_construction_set(model, climate_zone, lookup_building_type, nil, is_residential)
|
905
|
+
if bldg_def_const_set.is_initialized
|
906
|
+
bldg_def_const_set = bldg_def_const_set.get
|
907
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Added default construction set named #{bldg_def_const_set.name}")
|
908
|
+
else
|
909
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', 'Could not create default construction set for the building.')
|
910
|
+
return false
|
911
|
+
end
|
912
|
+
|
913
|
+
# make residential construction set as unused resource
|
914
|
+
if ['SmallHotel', 'LargeHotel', 'MidriseApartment', 'HighriseApartment'].include?(building_type)
|
915
|
+
res_const_set = standard.model_add_construction_set(model, climate_zone, lookup_building_type, nil, 'Yes')
|
916
|
+
if res_const_set.is_initialized
|
917
|
+
res_const_set = res_const_set.get
|
918
|
+
res_const_set.setName("#{bldg_def_const_set.name} - Residential ")
|
919
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Added residential construction set named #{res_const_set.name}")
|
920
|
+
else
|
921
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CreateTypical', 'Could not create residential construction set for the building.')
|
922
|
+
return false
|
923
|
+
end
|
924
|
+
end
|
925
|
+
|
926
|
+
end
|
927
|
+
|
928
|
+
# set_building_defaults
|
929
|
+
if set_building_defaults
|
930
|
+
|
931
|
+
# identify default space type
|
932
|
+
default_space_type = nil
|
933
|
+
space_types_new.each do |space_type|
|
934
|
+
standards_building_type = space_type.standardsBuildingType.is_initialized ? space_type.standardsBuildingType.get : nil
|
935
|
+
standards_space_type = space_type.standardsSpaceType.is_initialized ? space_type.standardsSpaceType.get : nil
|
936
|
+
if default_space_type_name == standards_space_type
|
937
|
+
default_space_type = space_type
|
938
|
+
end
|
939
|
+
end
|
940
|
+
|
941
|
+
# set default space type
|
942
|
+
building = model.getBuilding
|
943
|
+
if !default_space_type.nil?
|
944
|
+
building.setSpaceType(default_space_type)
|
945
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Setting default Space Type for building to #{building.spaceType.get.name}")
|
946
|
+
end
|
947
|
+
|
948
|
+
# default construction
|
949
|
+
if !bldg_def_const_set.nil?
|
950
|
+
building.setDefaultConstructionSet(bldg_def_const_set)
|
951
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Setting default Construction Set for building to #{building.defaultConstructionSet.get.name}")
|
952
|
+
end
|
953
|
+
|
954
|
+
# set climate zone
|
955
|
+
os_climate_zone = climate_zone.gsub('ASHRAE 169-2013-', '')
|
956
|
+
# trim off letter from climate zone 7 or 8
|
957
|
+
if (os_climate_zone[0] == '7') || (os_climate_zone[0] == '8')
|
958
|
+
os_climate_zone = os_climate_zone[0]
|
959
|
+
end
|
960
|
+
climate_zone = model.getClimateZones.setClimateZone('ASHRAE', os_climate_zone)
|
961
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Setting #{climate_zone.institution} Climate Zone to #{climate_zone.value}")
|
962
|
+
|
963
|
+
# set building type
|
964
|
+
# use lookup_building_type so spaces like MediumOffice will map to Office (Supports baseline automation)
|
965
|
+
building.setStandardsBuildingType(lookup_building_type)
|
966
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Setting Standards Building Type to #{building.standardsBuildingType}")
|
967
|
+
|
968
|
+
# rename building if it is named "Building 1"
|
969
|
+
if model.getBuilding.name.to_s == 'Building 1'
|
970
|
+
model.getBuilding.setName("#{building_type} #{template} #{os_climate_zone}")
|
971
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "Renaming building to #{model.getBuilding.name}")
|
972
|
+
end
|
973
|
+
end
|
974
|
+
|
975
|
+
# reporting final condition of model
|
976
|
+
finishing_space_types = model.getSpaceTypes.sort
|
977
|
+
finishing_construction_sets = model.getDefaultConstructionSets.sort
|
978
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CreateTypical', "The building finished with #{finishing_space_types.size} space types and #{finishing_construction_sets.size} construction sets.")
|
979
|
+
|
980
|
+
return true
|
981
|
+
end
|
982
|
+
end
|
983
|
+
end
|