openstudio-standards 0.4.0 → 0.5.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/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
|