openstudio-standards 0.2.14 → 0.2.15.pre.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/data/geometry/ASHRAECollege.json +0 -19
- data/data/geometry/ASHRAEMidriseApartment.json +47 -47
- data/data/geometry/ASHRAESecondarySchool.osm +2 -2
- data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
- data/data/standards/export_OpenStudio_libraries.rb +1 -1
- data/data/standards/manage_OpenStudio_Standards.rb +43 -87
- data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1.csv +9 -0
- data/data/standards/openstudio_standards_duplicates_log.csv +142 -27
- data/data/standards/test_performance_expected_dd_results.csv +2016 -2016
- data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.ddy +2316 -0
- data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.epw +8768 -0
- data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.stat +697 -0
- data/lib/openstudio-standards/btap/WeatherData1.json +54 -0
- data/lib/openstudio-standards/btap/WeatherData1.xlsx +0 -0
- data/lib/openstudio-standards/btap/btap_result.rb +12 -10
- data/lib/openstudio-standards/btap/envelope.rb +2 -2
- data/lib/openstudio-standards/btap/geometry.rb +96 -49
- data/lib/openstudio-standards/{utilities → btap/utilities}/Add_template_field_to_json.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/convert_surfaces_to_adiabatic_necb_8426.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/generate_space_types.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/necb_to_epw_map.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/os_sim_extract.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/rename_surfaces.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/round_surf_coords.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/sched_create.rb +0 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/set_mult_to_adiabatic.rb +0 -0
- data/lib/openstudio-standards/btap/utilities/space_type.rb +78 -0
- data/lib/openstudio-standards/{utilities → btap/utilities}/weatherData1_xlsx_to_json.rb +0 -0
- data/lib/openstudio-standards/hvac_sizing/Siz.AirConditionerVariableRefrigerantFlow.rb +1 -1
- data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +1 -1
- data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +20 -6
- data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +6 -6
- data/lib/openstudio-standards/hvac_sizing/Siz.WaterHeaterMixed.rb +2 -2
- data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACTerminalUnitVariableRefrigerantFlow.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +6 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +6 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.elevators.rb +6 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +10 -9
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +9 -11
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.elevators.rb +11 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +17 -16
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +9 -11
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +4 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.elevators.rb +11 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +23 -22
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +9 -10
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +4 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.elevators.rb +11 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +23 -22
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +89 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +9 -10
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +76 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +22 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +11 -11
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.refrigeration.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +11 -11
- data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.HeatExchangerAirToAirSensibleAndLatent.rb +2 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.elevators.rb +11 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +10 -10
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.hvac_systems.rb +4 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanConstantVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanOnOff.rb +5 -5
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +5 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerAirToAirSensibleAndLatent.rb +2 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.elevators.rb +11 -7
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +10 -10
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.hvac_systems.rb +4 -2
- data/lib/openstudio-standards/prototypes/cbes/cbes.Model.elevators.rb +3 -6
- data/lib/openstudio-standards/prototypes/cbes/cbes.refrigeration.rb +5 -4
- data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanConstantVolume.rb +5 -3
- data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanOnOff.rb +5 -4
- data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanVariableVolume.rb +5 -3
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +65 -30
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +54 -23
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +135 -147
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +42 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +85 -12
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +42 -30
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +39 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +39 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +60 -12
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +33 -265
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +41 -3
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +69 -297
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +68 -25
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +88 -59
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +88 -9
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +48 -10
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +130 -145
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +29 -101
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +24 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +48 -589
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +38 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +38 -8
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +40 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +85 -171
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +87 -44
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +46 -5
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +105 -17
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +97 -15
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +26 -167
- data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +3828 -1131
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +2 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +2 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +2 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +4 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +4 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +9 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +4 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +4 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +23 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +29 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +29 -5
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +43 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +22 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +46 -3
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.elevators.rb +27 -22
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +15 -8
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +22 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +429 -59
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +18 -11
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +11 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +1 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +8 -10
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +37 -28
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +24 -6
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +251 -65
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +46 -31
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +62 -10
- data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +76 -33
- data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +445 -275
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +26 -21
- data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +5 -2
- data/lib/openstudio-standards/standards/Standards.BuildingStory.rb +7 -9
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +8 -2
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +10 -6
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +5 -1
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +6 -1
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +45 -4
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +18 -8
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +9 -7
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +8 -4
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +86 -3
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +5 -2
- data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +6 -2
- data/lib/openstudio-standards/standards/Standards.Construction.rb +66 -35
- data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +7 -7
- data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.Fan.rb +53 -35
- data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +22 -16
- data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +77 -19
- data/lib/openstudio-standards/standards/Standards.Model.rb +387 -245
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +13 -15
- data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -48
- data/lib/openstudio-standards/standards/Standards.Pump.rb +28 -20
- data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +3 -4
- data/lib/openstudio-standards/standards/Standards.ScheduleCompact.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -0
- data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +34 -24
- data/lib/openstudio-standards/standards/Standards.Space.rb +179 -116
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +23 -12
- data/lib/openstudio-standards/standards/Standards.SubSurface.rb +55 -25
- data/lib/openstudio-standards/standards/Standards.Surface.rb +57 -32
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +157 -107
- data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +9 -6
- data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +52 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.Standards.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +28 -18
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/comstock_ashrae_90_1_2004.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ext_ltg.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.spc_typ.json +123 -123
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +11 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +395 -384
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirLoopHVAC.rb +20 -13
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/comstock_ashrae_90_1_2007.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ext_ltg.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +122 -122
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +11 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +413 -401
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +42 -53
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +3 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.CoolingTower.rb +5 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanVariableVolume.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +6 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/comstock_ashrae_90_1_2010.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ext_ltg.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +129 -129
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +210 -42
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +11 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +460 -320
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +45 -51
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +3 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTower.rb +5 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +2 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +8 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ThermalZone.rb +2 -1
- 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 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/comstock_ashrae_90_1_2013.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ext_ltg.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +121 -121
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +420 -84
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +12 -12
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +475 -335
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +40 -50
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +3 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTower.rb +5 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +2 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +8 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ThermalZone.rb +2 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/comstock_ashrae_90_1_2016.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ext_ltg.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +152 -128
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +488 -84
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +47 -47
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +342 -56
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +3 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTower.rb +5 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +2 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +25 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ThermalZone.rb +2 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +30 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/comstock_ashrae_90_1_2019.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ext_ltg.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +151 -127
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.boilers.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +2307 -101
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_compressors.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +47 -47
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +69 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +25 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +286 -224
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/comstock_doe_ref_1980_2004.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ext_ltg.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +126 -126
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.furnaces.json +26 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +11 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +405 -393
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +15 -11
- 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 +3 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/comstock_doe_ref_pre_1980.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +696 -2938
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +121 -121
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.furnaces.json +37 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +11 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +403 -391
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +15 -11
- 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 +3 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.furnaces.json +15 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +64 -42
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +3 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTower.rb +5 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +2 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +4 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +5 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.ZoneHVACComponent.rb +3 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.rb +4 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.furnaces.json +15 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +61 -36
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +3 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTower.rb +5 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +2 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +4 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +6 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ZoneHVACComponent.rb +3 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +20 -14
- data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +3 -0
- data/lib/openstudio-standards/standards/cbes/cbes.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes_pre_1978/cbes_pre_1978.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes_t24_1978/cbes_t24_1978.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes_t24_1992/cbes_t24_1992.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2001/cbes_t24_2001.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.rb +4 -0
- data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +10 -5
- data/lib/openstudio-standards/standards/deer/deer.PlanarSurface.rb +1 -1
- data/lib/openstudio-standards/standards/deer/deer.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/comstock_deer_1985.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/data/comstock_deer_1985.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_1985/deer_1985.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/comstock_deer_1996.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/data/comstock_deer_1996.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_1996/deer_1996.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/comstock_deer_2003.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/data/comstock_deer_2003.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/comstock_deer_2007.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/data/comstock_deer_2007.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/comstock_deer_2011.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/data/comstock_deer_2011.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/comstock_deer_2014.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/data/comstock_deer_2014.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/comstock_deer_2015.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/data/comstock_deer_2015.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/comstock_deer_2017.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/data/comstock_deer_2017.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2020/comstock_deer_2020/comstock_deer_2020.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2025/comstock_deer_2025/comstock_deer_2025.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2030/comstock_deer_2030/comstock_deer_2030.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2035/comstock_deer_2035/comstock_deer_2035.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2040/comstock_deer_2040/comstock_deer_2040.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2045/comstock_deer_2045/comstock_deer_2045.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2050/comstock_deer_2050/comstock_deer_2050.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2055/comstock_deer_2055/comstock_deer_2055.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2060/comstock_deer_2060/comstock_deer_2060.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2065/comstock_deer_2065/comstock_deer_2065.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2070/comstock_deer_2070/comstock_deer_2070.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2075/comstock_deer_2075/comstock_deer_2075.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +9 -5
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +3 -0
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +5 -3
- data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/comstock_deer_pre_1975.rb +4 -0
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/data/comstock_deer_pre_1975.ext_ltg.json +2 -2
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/deer_pre_1975.rb +4 -0
- data/lib/openstudio-standards/standards/icc_iecc/icc_iecc_2015/icc_iecc_2015.rb +4 -0
- data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/btap_1980to2010.rb +6 -28
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +25 -110
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +45 -60
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +19 -23
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +84 -83
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +52 -47
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +43 -40
- data/lib/openstudio-standards/standards/necb/ECMS/data/boiler_set.json +18 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_set.json +211 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +1195 -20
- data/lib/openstudio-standards/standards/necb/ECMS/data/furnace_set.json +18 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +244 -182
- data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +232 -185
- data/lib/openstudio-standards/standards/necb/ECMS/data/shw_set.json +20 -2
- data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +18 -25
- data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +12 -13
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +1647 -466
- data/lib/openstudio-standards/standards/necb/ECMS/loads.rb +93 -0
- data/lib/openstudio-standards/standards/necb/ECMS/nv.rb +40 -47
- data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +26 -25
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +303 -305
- data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +45 -45
- data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +90 -120
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Hospital.osm +1176 -1115
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +8279 -28923
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +1173 -1173
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +15 -13
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +32 -29
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +25 -26
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +14 -14
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +24 -29
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +85 -84
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +41 -42
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +209 -197
- data/lib/openstudio-standards/standards/necb/NECB2011/lighting.rb +87 -82
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +510 -406
- data/lib/openstudio-standards/standards/necb/NECB2011/nv.md +3 -3
- data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +686 -683
- data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +129 -82
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +1608 -1608
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +25 -18
- data/lib/openstudio-standards/standards/necb/NECB2015/lighting.rb +73 -67
- data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +18 -22
- data/lib/openstudio-standards/standards/necb/NECB2015/qaqc/necb_2015_qaqc.rb +59 -63
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +1608 -1608
- data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -4
- data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +10 -14
- data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +779 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/boilers.json +122 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +335 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/constants.json +13 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/furnaces.json +41 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps.json +452 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +164 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_rejection.json +228 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/led_lighting_data.json +2883 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +25851 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/surface_thermal_transmittance.json +60 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +585 -0
- data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +175 -0
- data/lib/openstudio-standards/standards/necb/common/bc_step_code_indicators.md +10 -0
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +1963 -0
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +410 -0
- data/lib/openstudio-standards/standards/necb/common/neb_end_use_prices.csv +42 -0
- data/lib/openstudio-standards/standards/necb/common/necb_reference_runs.csv +28705 -0
- data/lib/openstudio-standards/standards/necb/common/phius.md +23 -0
- data/lib/openstudio-standards/standards/necb/common/space_type_upgrade_map.json +1158 -386
- data/lib/openstudio-standards/standards/oeesc/oeesc_2014/oeesc_2014.rb +4 -0
- data/lib/openstudio-standards/standards/standard.rb +2 -1
- data/lib/openstudio-standards/utilities/define_thermal_zone_and_mulitpliers.rb +1 -1
- data/lib/openstudio-standards/utilities/logging.rb +6 -0
- data/lib/openstudio-standards/utilities/simulation.rb +30 -14
- data/lib/openstudio-standards/utilities/{speacetype_map_converter.rb → spacetype_map_converter.rb} +0 -0
- data/lib/openstudio-standards/utilities/sqlfile.rb +112 -71
- data/lib/openstudio-standards/version.rb +2 -2
- data/lib/openstudio-standards/weather/Weather.Model.rb +209 -9
- data/lib/openstudio-standards/weather/Weather.stat_file.rb +1 -1
- data/lib/openstudio-standards.rb +9 -0
- metadata +106 -205
- data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.boilers.json +0 -49
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.chillers.json +0 -293
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +0 -25426
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +0 -1600
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +0 -564
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.elevators.json +0 -349
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +0 -164
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ground_temperatures.json +0 -10663
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +0 -508
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +0 -156
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_rejection.json +0 -44
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +0 -184
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +0 -3094
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_cases.json +0 -829
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_lnup.json +0 -562
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_compressors.json +0 -52
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_condenser.json +0 -220
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +0 -156
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_walkins.json +0 -1316
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +0 -21446
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +0 -554
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +0 -68
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps.json +0 -28
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps_heating.json +0 -12
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.boilers.json +0 -49
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.chillers.json +0 -293
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +0 -12487
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +0 -1600
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +0 -564
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.elevators.json +0 -349
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +0 -164
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ground_temperatures.json +0 -10663
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +0 -466
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +0 -137
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_rejection.json +0 -44
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +0 -184
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +0 -3094
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_cases.json +0 -829
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_lnup.json +0 -562
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_compressors.json +0 -52
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_condenser.json +0 -220
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +0 -156
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_walkins.json +0 -1316
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +0 -21380
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +0 -554
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +0 -68
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps.json +0 -28
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps_heating.json +0 -12
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.boilers.json +0 -49
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.chillers.json +0 -395
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +0 -12487
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +0 -1600
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +0 -592
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.elevators.json +0 -349
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +0 -550
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +0 -164
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ground_temperatures.json +0 -10663
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +0 -466
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +0 -137
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_rejection.json +0 -44
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +0 -238
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +0 -3094
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_cases.json +0 -829
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_lnup.json +0 -562
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_compressors.json +0 -52
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_condenser.json +0 -220
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +0 -156
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_walkins.json +0 -1316
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +0 -21548
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +0 -554
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +0 -68
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps.json +0 -28
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps_heating.json +0 -12
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +0 -64
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.chillers.json +0 -871
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +0 -12487
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +0 -1600
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +0 -592
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.elevators.json +0 -349
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +0 -1096
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +0 -164
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ground_temperatures.json +0 -10663
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +0 -886
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +0 -194
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_rejection.json +0 -44
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +0 -247
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +0 -3094
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_cases.json +0 -829
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_lnup.json +0 -562
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_compressors.json +0 -52
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_condenser.json +0 -220
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +0 -156
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_walkins.json +0 -1316
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +0 -22079
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +0 -994
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +0 -68
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps.json +0 -28
- data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps_heating.json +0 -12
- data/lib/openstudio-standards/utilities/convert_costing_constructions.rb +0 -105
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# This class holds methods that apply NECB2011 rules.
|
|
2
2
|
# @ref [References::NECB2011]
|
|
3
3
|
class NECB2011 < Standard
|
|
4
|
-
@template =
|
|
4
|
+
@template = new.class.name
|
|
5
5
|
register_standard(@template)
|
|
6
6
|
attr_reader :template
|
|
7
7
|
attr_accessor :standards_data
|
|
@@ -9,67 +9,63 @@ class NECB2011 < Standard
|
|
|
9
9
|
attr_accessor :space_multiplier_map
|
|
10
10
|
|
|
11
11
|
# This is a helper method to convert arguments that may support 'NECB_Default, and nils to convert to float'
|
|
12
|
-
def convert_arg_to_f(variable:,default:)
|
|
13
|
-
if variable.
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return default
|
|
17
|
-
elsif variable.instance_of?(String)
|
|
18
|
-
variable = variable.strip
|
|
19
|
-
return variable.to_f
|
|
20
|
-
end
|
|
21
|
-
end
|
|
12
|
+
def convert_arg_to_f(variable:, default:)
|
|
13
|
+
return variable if variable.kind_of?(Numeric)
|
|
14
|
+
return default if variable.nil? || (variable == 'NECB_Default')
|
|
15
|
+
return unless variable.kind_of?(String)
|
|
22
16
|
|
|
17
|
+
variable = variable.strip
|
|
18
|
+
return variable.to_f
|
|
19
|
+
end
|
|
23
20
|
|
|
24
21
|
def get_standards_table(table_name:)
|
|
25
|
-
if @standards_data[
|
|
22
|
+
if @standards_data['tables'][table_name].nil?
|
|
26
23
|
message = "Could not find table #{table_name} in database."
|
|
27
24
|
OpenStudio.logFree(OpenStudio::Error, 'openstudio.Standards.NECB', message)
|
|
28
25
|
end
|
|
29
|
-
@standards_data[
|
|
26
|
+
@standards_data['tables'][table_name]
|
|
30
27
|
end
|
|
31
28
|
|
|
32
29
|
def get_standard_constant_value(constant_name:)
|
|
33
|
-
puts
|
|
30
|
+
puts 'do nothing'
|
|
34
31
|
end
|
|
35
32
|
|
|
36
|
-
|
|
37
33
|
# Combine the data from the JSON files into a single hash
|
|
38
34
|
# Load JSON files differently depending on whether loading from
|
|
39
35
|
# the OpenStudio CLI embedded filesystem or from typical gem installation
|
|
40
|
-
def load_standards_database_new
|
|
36
|
+
def load_standards_database_new
|
|
41
37
|
@standards_data = {}
|
|
42
|
-
@standards_data[
|
|
38
|
+
@standards_data['tables'] = {}
|
|
43
39
|
|
|
44
40
|
if __dir__[0] == ':' # Running from OpenStudio CLI
|
|
45
41
|
embedded_files_relative('../common', /.*\.json/).each do |file|
|
|
46
42
|
data = JSON.parse(EmbeddedScripting.getFileAsString(file))
|
|
47
|
-
if
|
|
48
|
-
@standards_data[
|
|
43
|
+
if !data['tables'].nil?
|
|
44
|
+
@standards_data['tables'] = [*@standards_data['tables'], *data['tables']].to_h
|
|
49
45
|
else
|
|
50
46
|
@standards_data[data.keys.first] = data[data.keys.first]
|
|
51
47
|
end
|
|
52
48
|
end
|
|
53
49
|
else
|
|
54
50
|
path = "#{File.dirname(__FILE__)}/../common/"
|
|
55
|
-
raise
|
|
51
|
+
raise 'Could not find common folder' unless Dir.exist?(path)
|
|
52
|
+
|
|
56
53
|
files = Dir.glob("#{path}/*.json").select { |e| File.file? e }
|
|
57
54
|
files.each do |file|
|
|
58
55
|
data = JSON.parse(File.read(file))
|
|
59
|
-
if
|
|
60
|
-
@standards_data[
|
|
56
|
+
if !data['tables'].nil?
|
|
57
|
+
@standards_data['tables'] = [*@standards_data['tables'], *data['tables']].to_h
|
|
61
58
|
else
|
|
62
59
|
@standards_data[data.keys.first] = data[data.keys.first]
|
|
63
60
|
end
|
|
64
61
|
end
|
|
65
62
|
end
|
|
66
63
|
|
|
67
|
-
|
|
68
64
|
if __dir__[0] == ':' # Running from OpenStudio CLI
|
|
69
65
|
embedded_files_relative('data/', /.*\.json/).each do |file|
|
|
70
66
|
data = JSON.parse(EmbeddedScripting.getFileAsString(file))
|
|
71
|
-
if
|
|
72
|
-
@standards_data[
|
|
67
|
+
if !data['tables'].nil?
|
|
68
|
+
@standards_data['tables'] = [*@standards_data['tables'], *data['tables']].to_h
|
|
73
69
|
else
|
|
74
70
|
@standards_data[data.keys.first] = data[data.keys.first]
|
|
75
71
|
end
|
|
@@ -78,8 +74,8 @@ class NECB2011 < Standard
|
|
|
78
74
|
files = Dir.glob("#{File.dirname(__FILE__)}/data/*.json").select { |e| File.file? e }
|
|
79
75
|
files.each do |file|
|
|
80
76
|
data = JSON.parse(File.read(file))
|
|
81
|
-
if
|
|
82
|
-
@standards_data[
|
|
77
|
+
if !data['tables'].nil?
|
|
78
|
+
@standards_data['tables'] = [*@standards_data['tables'], *data['tables']].to_h
|
|
83
79
|
else
|
|
84
80
|
@standards_data[data.keys.first] = data[data.keys.first]
|
|
85
81
|
end
|
|
@@ -98,14 +94,13 @@ class NECB2011 < Standard
|
|
|
98
94
|
# @return [ScheduleRuleset] the resulting schedule ruleset
|
|
99
95
|
# @todo make return an OptionalScheduleRuleset
|
|
100
96
|
def model_add_schedule(model, schedule_name)
|
|
101
|
-
|
|
102
97
|
super(model, schedule_name)
|
|
103
98
|
end
|
|
104
99
|
|
|
105
100
|
def get_standards_constant(name)
|
|
106
101
|
object = @standards_data['constants'][name]
|
|
107
102
|
|
|
108
|
-
if object.nil?
|
|
103
|
+
if object.nil? || object['value'].nil?
|
|
109
104
|
raise("could not find #{name} in standards constants database. ")
|
|
110
105
|
end
|
|
111
106
|
|
|
@@ -114,19 +109,19 @@ class NECB2011 < Standard
|
|
|
114
109
|
|
|
115
110
|
def get_standards_formula(name)
|
|
116
111
|
object = @standards_data['formulas'][name]
|
|
117
|
-
raise("could not find #{name} in standards formual database. ") if object.nil?
|
|
112
|
+
raise("could not find #{name} in standards formual database. ") if object.nil? || object['value'].nil?
|
|
113
|
+
|
|
118
114
|
return object['value']
|
|
119
115
|
end
|
|
120
116
|
|
|
121
|
-
|
|
122
117
|
def initialize
|
|
123
118
|
super()
|
|
124
119
|
@template = self.class.name
|
|
125
|
-
@standards_data =
|
|
126
|
-
|
|
127
|
-
#puts "loaded these tables..."
|
|
128
|
-
#puts @standards_data.keys.size
|
|
129
|
-
#raise("tables not all loaded in parent #{}") if @standards_data.keys.size < 24
|
|
120
|
+
@standards_data = load_standards_database_new
|
|
121
|
+
corrupt_standards_database
|
|
122
|
+
# puts "loaded these tables..."
|
|
123
|
+
# puts @standards_data.keys.size
|
|
124
|
+
# raise("tables not all loaded in parent #{}") if @standards_data.keys.size < 24
|
|
130
125
|
end
|
|
131
126
|
|
|
132
127
|
def get_all_spacetype_names
|
|
@@ -145,37 +140,37 @@ class NECB2011 < Standard
|
|
|
145
140
|
lat1_rad, lon1_rad = loc1.map { |i| i * rad_per_deg }
|
|
146
141
|
lat2_rad, lon2_rad = loc2.map { |i| i * rad_per_deg }
|
|
147
142
|
|
|
148
|
-
a = Math.sin(dlat_rad / 2)
|
|
149
|
-
c = 2 * Math
|
|
143
|
+
a = Math.sin(dlat_rad / 2)**2 + Math.cos(lat1_rad) * Math.cos(lat2_rad) * Math.sin(dlon_rad / 2)**2
|
|
144
|
+
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))
|
|
150
145
|
rm * c # Delta in meters
|
|
151
146
|
end
|
|
152
147
|
|
|
153
|
-
|
|
154
148
|
def get_necb_hdd18(model)
|
|
155
149
|
max_distance_tolerance = 500000
|
|
156
150
|
min_distance = 100000000000000.0
|
|
157
151
|
necb_closest = nil
|
|
158
152
|
epw = BTAP::Environment::WeatherFile.new(model.weatherFile.get.path.get)
|
|
159
|
-
#this extracts the table from the json database.
|
|
153
|
+
# this extracts the table from the json database.
|
|
160
154
|
necb_2015_table_c1 = @standards_data['tables']['necb_2015_table_c1']['table']
|
|
161
155
|
necb_2015_table_c1.each do |necb|
|
|
162
|
-
next if necb['lat_long'].nil? #Need this until Tyson cleans up table.
|
|
156
|
+
next if necb['lat_long'].nil? # Need this until Tyson cleans up table.
|
|
157
|
+
|
|
163
158
|
dist = distance([epw.latitude.to_f, epw.longitude.to_f], necb['lat_long'])
|
|
164
159
|
if min_distance > dist
|
|
165
160
|
min_distance = dist
|
|
166
161
|
necb_closest = necb
|
|
167
162
|
end
|
|
168
163
|
end
|
|
169
|
-
if (min_distance / 1000.0) > max_distance_tolerance
|
|
164
|
+
if ((min_distance / 1000.0) > max_distance_tolerance) && !epw.hdd18.nil?
|
|
170
165
|
puts "Could not find close NECB HDD from Table C1 < #{max_distance_tolerance}km. Closest city is #{min_distance / 1000.0}km away. Using epw hdd18 instead."
|
|
171
166
|
return epw.hdd18.to_f
|
|
172
167
|
else
|
|
173
|
-
|
|
168
|
+
dist_clause = "%.2f % #{(min_distance / 1000.0)}"
|
|
169
|
+
puts "INFO:NECB HDD18 of #{necb_closest['degree_days_below_18_c'].to_f} at nearest city #{necb_closest['city']},#{necb_closest['province']}, at a distance of " + dist_clause + 'km from epw location. Ref:necb_2015_table_c1'
|
|
174
170
|
return necb_closest['degree_days_below_18_c'].to_f
|
|
175
171
|
end
|
|
176
172
|
end
|
|
177
173
|
|
|
178
|
-
|
|
179
174
|
# This method is a wrapper to create the 16 archetypes easily. # 37 args
|
|
180
175
|
def model_create_prototype_model(template:,
|
|
181
176
|
building_type:,
|
|
@@ -212,8 +207,8 @@ class NECB2011 < Standard
|
|
|
212
207
|
srr_set: -1.0,
|
|
213
208
|
nv_type: nil,
|
|
214
209
|
nv_opening_fraction: nil,
|
|
215
|
-
|
|
216
|
-
|
|
210
|
+
nv_temp_out_min: nil,
|
|
211
|
+
nv_delta_temp_in_out: nil,
|
|
217
212
|
scale_x: nil,
|
|
218
213
|
scale_y: nil,
|
|
219
214
|
scale_z: nil,
|
|
@@ -221,9 +216,15 @@ class NECB2011 < Standard
|
|
|
221
216
|
pv_ground_total_area_pv_panels_m2: nil,
|
|
222
217
|
pv_ground_tilt_angle: nil,
|
|
223
218
|
pv_ground_azimuth_angle: nil,
|
|
224
|
-
pv_ground_module_description: nil
|
|
225
|
-
|
|
226
|
-
|
|
219
|
+
pv_ground_module_description: nil,
|
|
220
|
+
chiller_type: nil,
|
|
221
|
+
occupancy_loads_scale: nil,
|
|
222
|
+
electrical_loads_scale: nil,
|
|
223
|
+
oa_scale: nil,
|
|
224
|
+
infiltration_scale: nil,
|
|
225
|
+
output_variables: nil,
|
|
226
|
+
output_meters: nil,
|
|
227
|
+
airloop_economizer_type: nil)
|
|
227
228
|
|
|
228
229
|
model = load_building_type_from_library(building_type: building_type)
|
|
229
230
|
return model_apply_standard(model: model,
|
|
@@ -257,30 +258,39 @@ class NECB2011 < Standard
|
|
|
257
258
|
rotation_degrees: rotation_degrees,
|
|
258
259
|
fdwr_set: fdwr_set,
|
|
259
260
|
srr_set: srr_set,
|
|
260
|
-
nv_type:
|
|
261
|
-
nv_opening_fraction: nv_opening_fraction, #options: (1) nil/none/false (2) 'NECB_Default' (i.e. 0.1)
|
|
262
|
-
|
|
263
|
-
|
|
261
|
+
nv_type: nv_type, # Two options: (1) nil/none/false/'NECB_Default', (2) 'add_nv'
|
|
262
|
+
nv_opening_fraction: nv_opening_fraction, # options: (1) nil/none/false (2) 'NECB_Default' (i.e. 0.1)
|
|
263
|
+
nv_temp_out_min: nv_temp_out_min, # options: (1) nil/none/false(2) 'NECB_Default' (i.e. 13.0 based on inputs from Michel Tardif re a real school in QC)
|
|
264
|
+
nv_delta_temp_in_out: nv_delta_temp_in_out, # options: (1) nil/none/false (2) 'NECB_Default' (i.e. 1.0 based on inputs from Michel Tardif re a real school in QC)
|
|
264
265
|
scale_x: scale_x,
|
|
265
266
|
scale_y: scale_y,
|
|
266
267
|
scale_z: scale_z,
|
|
267
|
-
pv_ground_type:
|
|
268
|
+
pv_ground_type: pv_ground_type, # Two options: (1) nil/none/false/'NECB_Default', (2) 'add_pv_ground'
|
|
268
269
|
pv_ground_total_area_pv_panels_m2: pv_ground_total_area_pv_panels_m2, # Options: (1) nil/none/false, (2) 'NECB_Default' (i.e. building footprint), (3) area value (e.g. 50)
|
|
269
270
|
pv_ground_tilt_angle: pv_ground_tilt_angle, # Options: (1) nil/none/false, (2) 'NECB_Default' (i.e. latitude), (3) tilt angle value (e.g. 20)
|
|
270
271
|
pv_ground_azimuth_angle: pv_ground_azimuth_angle, # Options: (1) nil/none/false, (2) 'NECB_Default' (i.e. south), (3) azimuth angle value (e.g. 90)
|
|
271
|
-
pv_ground_module_description: pv_ground_module_description # Options: (1) nil/none/false, (2) 'NECB_Default' (i.e. Standard), (3) other options ('Standard', 'Premium', ThinFilm')
|
|
272
|
-
|
|
272
|
+
pv_ground_module_description: pv_ground_module_description, # Options: (1) nil/none/false, (2) 'NECB_Default' (i.e. Standard), (3) other options ('Standard', 'Premium', ThinFilm')
|
|
273
|
+
occupancy_loads_scale: occupancy_loads_scale,
|
|
274
|
+
electrical_loads_scale: electrical_loads_scale,
|
|
275
|
+
oa_scale: oa_scale,
|
|
276
|
+
infiltration_scale: infiltration_scale,
|
|
277
|
+
chiller_type: chiller_type, # Options: (1) 'NECB_Default'/nil/'none'/false (i.e. do nothing), (2) e.g. 'VSD'
|
|
278
|
+
output_variables: output_variables,
|
|
279
|
+
output_meters: output_meters,
|
|
280
|
+
airloop_economizer_type: airloop_economizer_type) # (1) 'NECB_Default'/nil/' (2) 'DifferentialEnthalpy' (3) 'DifferentialTemperature'
|
|
273
281
|
|
|
274
282
|
end
|
|
275
283
|
|
|
276
284
|
def load_building_type_from_library(building_type:)
|
|
277
285
|
osm_model_path = File.absolute_path(File.join(__FILE__, '..', '..', '..', "necb/NECB2011/data/geometry/#{building_type}.osm"))
|
|
278
|
-
model =
|
|
279
|
-
|
|
286
|
+
model = false
|
|
287
|
+
if File.file?(osm_model_path)
|
|
288
|
+
model = BTAP::FileIO.load_osm(osm_model_path)
|
|
289
|
+
model.getBuilding.setName(building_type)
|
|
290
|
+
end
|
|
280
291
|
return model
|
|
281
292
|
end
|
|
282
293
|
|
|
283
|
-
|
|
284
294
|
# Created this method so that additional methods can be addded for bulding the prototype model in later
|
|
285
295
|
# code versions without modifying the build_protoype_model method or copying it wholesale for a few changes.
|
|
286
296
|
def model_apply_standard(model:,
|
|
@@ -319,43 +329,33 @@ class NECB2011 < Standard
|
|
|
319
329
|
scale_z: nil,
|
|
320
330
|
nv_type: nil,
|
|
321
331
|
nv_opening_fraction: nil,
|
|
322
|
-
|
|
323
|
-
|
|
332
|
+
nv_temp_out_min: nil,
|
|
333
|
+
nv_delta_temp_in_out: nil,
|
|
324
334
|
pv_ground_type: nil,
|
|
325
|
-
pv_ground_total_area_pv_panels_m2: nil
|
|
335
|
+
pv_ground_total_area_pv_panels_m2: nil,
|
|
326
336
|
pv_ground_tilt_angle: nil,
|
|
327
337
|
pv_ground_azimuth_angle: nil,
|
|
328
|
-
pv_ground_module_description: nil
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
model
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
model.getWaterUseConnectionss.each(&:remove)
|
|
342
|
-
|
|
343
|
-
rotation_degrees = convert_arg_to_f(variable: rotation_degrees,default: 0.0)
|
|
344
|
-
BTAP::Geometry::rotate_building(model: model,degrees: rotation_degrees) unless rotation_degrees == 0.0
|
|
345
|
-
scale_x = convert_arg_to_f(variable: scale_x,default: 1.0)
|
|
346
|
-
scale_y = convert_arg_to_f(variable: scale_y,default: 1.0)
|
|
347
|
-
scale_z = convert_arg_to_f(variable: scale_z,default: 1.0)
|
|
348
|
-
if scale_x != 1.0 || scale_y != 1.0 || scale_z != 1.0
|
|
349
|
-
BTAP::Geometry::scale_model(model, scale_x, scale_x, scale_x)
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
fdwr_set = convert_arg_to_f(variable: fdwr_set,default: -1)
|
|
354
|
-
srr_set = convert_arg_to_f(variable: srr_set,default: -1)
|
|
355
|
-
|
|
338
|
+
pv_ground_module_description: nil,
|
|
339
|
+
chiller_type: nil,
|
|
340
|
+
occupancy_loads_scale: nil,
|
|
341
|
+
electrical_loads_scale: nil,
|
|
342
|
+
oa_scale: nil,
|
|
343
|
+
infiltration_scale: nil,
|
|
344
|
+
output_variables: nil,
|
|
345
|
+
output_meters: nil,
|
|
346
|
+
airloop_economizer_type: nil)
|
|
347
|
+
|
|
348
|
+
clean_and_scale_model(model: model, rotation_degrees: rotation_degrees, scale_x: scale_x, scale_y: scale_y, scale_z: scale_z)
|
|
349
|
+
fdwr_set = convert_arg_to_f(variable: fdwr_set, default: -1)
|
|
350
|
+
srr_set = convert_arg_to_f(variable: srr_set, default: -1)
|
|
356
351
|
|
|
357
352
|
apply_weather_data(model: model, epw_file: epw_file)
|
|
358
|
-
apply_loads(model: model,
|
|
353
|
+
apply_loads(model: model,
|
|
354
|
+
lights_type: lights_type,
|
|
355
|
+
lights_scale: lights_scale,
|
|
356
|
+
occupancy_loads_scale: occupancy_loads_scale,
|
|
357
|
+
electrical_loads_scale: electrical_loads_scale,
|
|
358
|
+
oa_scale: oa_scale)
|
|
359
359
|
apply_envelope(model: model,
|
|
360
360
|
ext_wall_cond: ext_wall_cond,
|
|
361
361
|
ext_floor_cond: ext_floor_cond,
|
|
@@ -370,7 +370,8 @@ class NECB2011 < Standard
|
|
|
370
370
|
skylight_cond: skylight_cond,
|
|
371
371
|
glass_door_solar_trans: glass_door_solar_trans,
|
|
372
372
|
fixed_wind_solar_trans: fixed_wind_solar_trans,
|
|
373
|
-
skylight_solar_trans: skylight_solar_trans
|
|
373
|
+
skylight_solar_trans: skylight_solar_trans,
|
|
374
|
+
infiltration_scale: infiltration_scale)
|
|
374
375
|
apply_fdwr_srr_daylighting(model: model,
|
|
375
376
|
fdwr_set: fdwr_set,
|
|
376
377
|
srr_set: srr_set)
|
|
@@ -391,18 +392,61 @@ class NECB2011 < Standard
|
|
|
391
392
|
daylighting_type: daylighting_type,
|
|
392
393
|
nv_type: nv_type,
|
|
393
394
|
nv_opening_fraction: nv_opening_fraction,
|
|
394
|
-
|
|
395
|
-
|
|
395
|
+
nv_temp_out_min: nv_temp_out_min,
|
|
396
|
+
nv_delta_temp_in_out: nv_delta_temp_in_out,
|
|
396
397
|
pv_ground_type: pv_ground_type,
|
|
397
398
|
pv_ground_total_area_pv_panels_m2: pv_ground_total_area_pv_panels_m2,
|
|
398
399
|
pv_ground_tilt_angle: pv_ground_tilt_angle,
|
|
399
400
|
pv_ground_azimuth_angle: pv_ground_azimuth_angle,
|
|
400
|
-
pv_ground_module_description: pv_ground_module_description
|
|
401
|
-
|
|
401
|
+
pv_ground_module_description: pv_ground_module_description,
|
|
402
|
+
chiller_type: chiller_type,
|
|
403
|
+
airloop_economizer_type: airloop_economizer_type)
|
|
404
|
+
self.set_output_variables(model: model, output_variables: output_variables)
|
|
405
|
+
self.set_output_meters(model: model, output_meters: output_meters)
|
|
402
406
|
|
|
403
407
|
return model
|
|
404
408
|
end
|
|
405
409
|
|
|
410
|
+
# This method cleans the model of any existing HVAC systems and applies any desired ratation or scaling to the model.
|
|
411
|
+
def clean_and_scale_model(model:, rotation_degrees: nil, scale_x: nil, scale_y: nil, scale_z: nil)
|
|
412
|
+
# clean model..
|
|
413
|
+
BTAP::Resources::Envelope::remove_all_envelope_information(model)
|
|
414
|
+
model = remove_all_hvac(model)
|
|
415
|
+
model.getThermalZones.sort.each { |zone| zone.setUseIdealAirLoads(true) }
|
|
416
|
+
model.getZoneHVACPackagedTerminalAirConditioners.each(&:remove)
|
|
417
|
+
model.getCoilCoolingDXSingleSpeeds.each(&:remove)
|
|
418
|
+
model.getZoneHVACBaseboardConvectiveWaters.each(&:remove)
|
|
419
|
+
model.getAirLoopHVACZoneMixers.each(&:remove)
|
|
420
|
+
model.getAirLoopHVACZoneSplitters.each(&:remove)
|
|
421
|
+
model.getAirTerminalSingleDuctConstantVolumeNoReheats.each(&:remove)
|
|
422
|
+
model.getWaterUseEquipmentDefinitions.each(&:remove)
|
|
423
|
+
model.getWaterUseEquipments.each(&:remove)
|
|
424
|
+
model.getWaterUseConnectionss.each(&:remove)
|
|
425
|
+
model.getPumpConstantSpeeds.each(&:remove)
|
|
426
|
+
model.getPumpVariableSpeeds.each(&:remove)
|
|
427
|
+
model.getBoilerHotWaters.each(&:remove)
|
|
428
|
+
model.getBoilerSteams.each(&:remove)
|
|
429
|
+
model.getPlantLoops.each(&:remove)
|
|
430
|
+
model.getSchedules.each(&:remove)
|
|
431
|
+
model.getThermalZones.sort.each { |zone| zone.thermostat(&:remove) }
|
|
432
|
+
model.getSpaces.sort.each { |space| space.designSpecificationOutdoorAir(&:remove) }
|
|
433
|
+
model.getThermostatSetpointDualSetpoints.each(&:remove)
|
|
434
|
+
|
|
435
|
+
scale_x = 1.0
|
|
436
|
+
scale_y = 1.0
|
|
437
|
+
scale_z = 1.0
|
|
438
|
+
# Rotate to model if requested
|
|
439
|
+
rotation_degrees = convert_arg_to_f(variable: rotation_degrees, default: 0.0)
|
|
440
|
+
BTAP::Geometry.rotate_building(model: model, degrees: rotation_degrees) unless rotation_degrees == 0.0
|
|
441
|
+
|
|
442
|
+
# Scale model if requested
|
|
443
|
+
scale_x = convert_arg_to_f(variable: scale_x, default: 1.0)
|
|
444
|
+
scale_y = convert_arg_to_f(variable: scale_y, default: 1.0)
|
|
445
|
+
scale_z = convert_arg_to_f(variable: scale_z, default: 1.0)
|
|
446
|
+
return unless scale_x != 1.0 || scale_y != 1.0 || scale_z != 1.0
|
|
447
|
+
|
|
448
|
+
BTAP::Geometry.scale_model(model, scale_x, scale_y, scale_z)
|
|
449
|
+
end
|
|
406
450
|
|
|
407
451
|
def apply_systems_and_efficiencies(model:,
|
|
408
452
|
primary_heating_fuel:,
|
|
@@ -417,14 +461,15 @@ class NECB2011 < Standard
|
|
|
417
461
|
daylighting_type: 'NECB_Default',
|
|
418
462
|
nv_type: nil,
|
|
419
463
|
nv_opening_fraction: nil,
|
|
420
|
-
|
|
421
|
-
|
|
464
|
+
nv_temp_out_min: nil,
|
|
465
|
+
nv_delta_temp_in_out: nil,
|
|
422
466
|
pv_ground_type:,
|
|
423
467
|
pv_ground_total_area_pv_panels_m2:,
|
|
424
468
|
pv_ground_tilt_angle:,
|
|
425
469
|
pv_ground_azimuth_angle:,
|
|
426
|
-
pv_ground_module_description
|
|
427
|
-
|
|
470
|
+
pv_ground_module_description:,
|
|
471
|
+
chiller_type: 'NECB_Default',
|
|
472
|
+
airloop_economizer_type: nil)
|
|
428
473
|
|
|
429
474
|
# Create ECM object.
|
|
430
475
|
ecm = ECMS.new
|
|
@@ -439,15 +484,12 @@ class NECB2011 < Standard
|
|
|
439
484
|
|
|
440
485
|
# Apply ERV equipment as required.
|
|
441
486
|
ecm.apply_erv_ecm(model: model, erv_package: erv_package)
|
|
442
|
-
|
|
443
|
-
|
|
444
487
|
# -------- Performace, Efficiencies, Controls and Sensors ------------
|
|
445
488
|
#
|
|
446
489
|
# Set code standard equipment charecteristics.
|
|
447
490
|
sql_db_vars_map = apply_standard_efficiencies(model: model, sizing_run_dir: sizing_run_dir)
|
|
448
491
|
# Apply System
|
|
449
492
|
ecm.apply_system_efficiencies_ecm(model: model, ecm_system_name: ecm_system_name)
|
|
450
|
-
|
|
451
493
|
# Apply ECM ERV charecteristics as required. Part 2 of above ECM.
|
|
452
494
|
ecm.apply_erv_ecm_efficiency(model: model, erv_package: erv_package)
|
|
453
495
|
# Apply DCV as required
|
|
@@ -457,12 +499,15 @@ class NECB2011 < Standard
|
|
|
457
499
|
# Apply Furnace Efficiency
|
|
458
500
|
ecm.modify_furnace_efficiency(model: model, furnace_eff: furnace_eff)
|
|
459
501
|
# Apply Unitary efficiency
|
|
460
|
-
ecm.modify_unitary_cop(model: model,unitary_cop: unitary_cop,sql_db_vars_map: sql_db_vars_map)
|
|
502
|
+
ecm.modify_unitary_cop(model: model, unitary_cop: unitary_cop, sql_db_vars_map: sql_db_vars_map)
|
|
461
503
|
# Apply SHW Efficiency
|
|
462
504
|
ecm.modify_shw_efficiency(model: model, shw_eff: shw_eff)
|
|
463
505
|
# Apply daylight controls.
|
|
464
506
|
model_add_daylighting_controls(model) if daylighting_type == 'add_daylighting_controls'
|
|
465
|
-
|
|
507
|
+
# Apply Chiller efficiency
|
|
508
|
+
ecm.modify_chiller_efficiency(model: model, chiller_type: chiller_type)
|
|
509
|
+
# Apply airloop economizer
|
|
510
|
+
ecm.add_airloop_economizer(model: model, airloop_economizer_type: airloop_economizer_type)
|
|
466
511
|
|
|
467
512
|
# -------Pump sizing required by some vintages----------------
|
|
468
513
|
# Apply Pump power as required.
|
|
@@ -470,34 +515,47 @@ class NECB2011 < Standard
|
|
|
470
515
|
|
|
471
516
|
# -------Natural ventilation----------------
|
|
472
517
|
# Apply natural ventilation using simplified method.
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
518
|
+
if nv_type == 'add_nv'
|
|
519
|
+
ecm.apply_nv(model: model,
|
|
520
|
+
nv_type: nv_type,
|
|
521
|
+
nv_opening_fraction: nv_opening_fraction,
|
|
522
|
+
nv_temp_out_min: nv_temp_out_min,
|
|
523
|
+
nv_delta_temp_in_out: nv_delta_temp_in_out)
|
|
524
|
+
end
|
|
478
525
|
|
|
479
|
-
# -------Ground-mounted PV panels----------------
|
|
526
|
+
# -------Ground-mounted PV panels----------------
|
|
480
527
|
# Apply ground-mounted PV panels as required.
|
|
528
|
+
return unless pv_ground_type == 'add_pv_ground'
|
|
529
|
+
|
|
481
530
|
ecm.apply_pv_ground(model: model,
|
|
482
531
|
pv_ground_type: pv_ground_type,
|
|
483
532
|
pv_ground_total_area_pv_panels_m2: pv_ground_total_area_pv_panels_m2,
|
|
484
533
|
pv_ground_tilt_angle: pv_ground_tilt_angle,
|
|
485
534
|
pv_ground_azimuth_angle: pv_ground_azimuth_angle,
|
|
486
535
|
pv_ground_module_description: pv_ground_module_description)
|
|
487
|
-
|
|
488
536
|
end
|
|
489
537
|
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
538
|
+
def apply_loads(model:,
|
|
539
|
+
lights_type: 'NECB_Default',
|
|
540
|
+
lights_scale: 1.0,
|
|
541
|
+
validate: true,
|
|
542
|
+
occupancy_loads_scale: nil,
|
|
543
|
+
electrical_loads_scale: nil,
|
|
544
|
+
oa_scale: nil)
|
|
545
|
+
# Create ECM object.
|
|
546
|
+
ecm = ECMS.new
|
|
547
|
+
lights_scale = convert_arg_to_f(variable: lights_scale, default: 1.0)
|
|
493
548
|
if validate
|
|
494
549
|
raise('validation of model failed.') unless validate_initial_model(model)
|
|
495
550
|
raise('validation of spacetypes failed.') unless validate_and_upate_space_types(model)
|
|
496
551
|
end
|
|
497
|
-
#this sets/stores the template version loads that the model uses.
|
|
552
|
+
# this sets/stores the template version loads that the model uses.
|
|
498
553
|
model.getBuilding.setStandardsTemplate(self.class.name)
|
|
499
554
|
set_occ_sensor_spacetypes(model, @space_type_map)
|
|
500
555
|
model_add_loads(model, lights_type, lights_scale)
|
|
556
|
+
ecm.scale_occupancy_loads(model: model, scale: occupancy_loads_scale)
|
|
557
|
+
ecm.scale_electrical_loads(model: model, scale: electrical_loads_scale)
|
|
558
|
+
ecm.scale_oa_loads(model: model, scale: oa_scale)
|
|
501
559
|
end
|
|
502
560
|
|
|
503
561
|
def apply_weather_data(model:, epw_file:)
|
|
@@ -524,9 +582,13 @@ class NECB2011 < Standard
|
|
|
524
582
|
skylight_cond: nil,
|
|
525
583
|
glass_door_solar_trans: nil,
|
|
526
584
|
fixed_wind_solar_trans: nil,
|
|
527
|
-
skylight_solar_trans: nil
|
|
585
|
+
skylight_solar_trans: nil,
|
|
586
|
+
infiltration_scale: nil)
|
|
528
587
|
raise('validation of model failed.') unless validate_initial_model(model)
|
|
588
|
+
|
|
529
589
|
model_apply_infiltration_standard(model)
|
|
590
|
+
ecm = ECMS.new
|
|
591
|
+
ecm.scale_infiltration_loads(model: model, scale: infiltration_scale)
|
|
530
592
|
model.getInsideSurfaceConvectionAlgorithm.setAlgorithm('TARP')
|
|
531
593
|
model.getOutsideSurfaceConvectionAlgorithm.setAlgorithm('TARP')
|
|
532
594
|
model_add_constructions(model)
|
|
@@ -545,10 +607,7 @@ class NECB2011 < Standard
|
|
|
545
607
|
glass_door_solar_trans: glass_door_solar_trans,
|
|
546
608
|
fixed_wind_solar_trans: fixed_wind_solar_trans,
|
|
547
609
|
skylight_solar_trans: skylight_solar_trans)
|
|
548
|
-
|
|
549
|
-
|
|
550
610
|
model_create_thermal_zones(model, @space_multiplier_map)
|
|
551
|
-
|
|
552
611
|
end
|
|
553
612
|
|
|
554
613
|
# Thermal zones need to be set to determine conditioned spaces when applying fdwr and srr limits.
|
|
@@ -561,8 +620,8 @@ class NECB2011 < Standard
|
|
|
561
620
|
# # <-3.1: Remove all the windows/skylights
|
|
562
621
|
# # > 1: Do nothing
|
|
563
622
|
def apply_fdwr_srr_daylighting(model:, fdwr_set: -1.0, srr_set: -1.0)
|
|
564
|
-
fdwr_set = -1.0 if fdwr_set == 'NECB_default'
|
|
565
|
-
srr_set = -1.0 if srr_set == 'NECB_default'
|
|
623
|
+
fdwr_set = -1.0 if (fdwr_set == 'NECB_default') || fdwr_set.nil?
|
|
624
|
+
srr_set = -1.0 if (srr_set == 'NECB_default') || srr_set.nil?
|
|
566
625
|
fdwr_set = fdwr_set.to_f
|
|
567
626
|
srr_set = srr_set.to_f
|
|
568
627
|
apply_standard_window_to_wall_ratio(model: model, fdwr_set: fdwr_set)
|
|
@@ -572,8 +631,10 @@ class NECB2011 < Standard
|
|
|
572
631
|
|
|
573
632
|
def apply_standard_efficiencies(model:, sizing_run_dir:, dcv_type: 'NECB_Default')
|
|
574
633
|
raise('validation of model failed.') unless validate_initial_model(model)
|
|
634
|
+
|
|
575
635
|
climate_zone = 'NECB HDD Method'
|
|
576
636
|
raise("sizing run 1 failed! check #{sizing_run_dir}") if model_run_sizing_run(model, "#{sizing_run_dir}/plant_loops") == false
|
|
637
|
+
|
|
577
638
|
# This is needed for NECB2011 as a workaround for sizing the reheat boxes
|
|
578
639
|
model.getAirTerminalSingleDuctVAVReheats.each { |iobj| air_terminal_single_duct_vav_reheat_set_heating_cap(iobj) }
|
|
579
640
|
# Apply the prototype HVAC assumptions
|
|
@@ -640,23 +701,22 @@ class NECB2011 < Standard
|
|
|
640
701
|
return model
|
|
641
702
|
end
|
|
642
703
|
|
|
643
|
-
|
|
644
|
-
#this method will determine the vintage of NECB spacetypes the model contains. It will return nil if it can't
|
|
704
|
+
# this method will determine the vintage of NECB spacetypes the model contains. It will return nil if it can't
|
|
645
705
|
# determine it.
|
|
646
706
|
def determine_spacetype_vintage(model)
|
|
647
707
|
#this code is the list of available vintages
|
|
648
|
-
space_type_vintage_list = ['NECB2011', 'NECB2015', 'NECB2017', 'BTAPPRE1980', 'BTAP1980TO2010']
|
|
708
|
+
space_type_vintage_list = ['NECB2011', 'NECB2015', 'NECB2017', 'NECB2020', 'BTAPPRE1980', 'BTAP1980TO2010']
|
|
649
709
|
#this reorders the list to do the current class first.
|
|
650
710
|
space_type_vintage_list.insert(0, space_type_vintage_list.delete(self.class.name))
|
|
651
|
-
#Set the space_type
|
|
711
|
+
# Set the space_type
|
|
652
712
|
space_type_vintage = nil
|
|
653
713
|
# get list of space types used in model and a mapped string.
|
|
654
714
|
model_space_type_names = model.getSpaceTypes.map do |spacetype|
|
|
655
715
|
[spacetype.standardsBuildingType.get.to_s + '-' + spacetype.standardsSpaceType.get.to_s]
|
|
656
716
|
end
|
|
657
|
-
#Now iterate though each vintage
|
|
717
|
+
# Now iterate though each vintage
|
|
658
718
|
space_type_vintage_list.each do |template|
|
|
659
|
-
#Create the standard object and get a list of all the spacetypes available for that vintage.
|
|
719
|
+
# Create the standard object and get a list of all the spacetypes available for that vintage.
|
|
660
720
|
standard_space_type_list = Standard.build(template).get_all_spacetype_names.map { |spacetype| [spacetype[0].to_s + '-' + spacetype[1].to_s] }
|
|
661
721
|
# set array to contain unknown spacetypes.
|
|
662
722
|
unknown_spacetypes = []
|
|
@@ -666,7 +726,7 @@ class NECB2011 < Standard
|
|
|
666
726
|
unknown_spacetypes << space_type_name unless standard_space_type_list.include?(space_type_name)
|
|
667
727
|
end
|
|
668
728
|
if unknown_spacetypes.empty?
|
|
669
|
-
#No unknowns, so return the template and don't bother looking for others.
|
|
729
|
+
# No unknowns, so return the template and don't bother looking for others.
|
|
670
730
|
return template
|
|
671
731
|
end
|
|
672
732
|
end
|
|
@@ -686,7 +746,7 @@ class NECB2011 < Standard
|
|
|
686
746
|
# no translation neccesary.
|
|
687
747
|
return true
|
|
688
748
|
else
|
|
689
|
-
#Need to translate to current vintage.
|
|
749
|
+
# Need to translate to current vintage.
|
|
690
750
|
no_errors = true
|
|
691
751
|
st_model_vintage_string = "#{space_type_vintage}_space_type"
|
|
692
752
|
bt_model_vintage_string = "#{space_type_vintage}_building_type"
|
|
@@ -698,14 +758,14 @@ class NECB2011 < Standard
|
|
|
698
758
|
st.setStandardsBuildingType(space_type_map[bt_target_vintage_string].to_s.strip)
|
|
699
759
|
raise('could not set buildingtype') unless st.setStandardsBuildingType(space_type_map[bt_target_vintage_string].to_s.strip)
|
|
700
760
|
raise('could not set this') unless st.setStandardsSpaceType(space_type_map[st_target_vintage_string].to_s.strip)
|
|
701
|
-
|
|
702
|
-
|
|
761
|
+
|
|
762
|
+
# Set name of spacetype to new name.
|
|
763
|
+
st.setName("#{st.standardsBuildingType.get} #{st.standardsSpaceType.get}")
|
|
703
764
|
end
|
|
704
765
|
return no_errors
|
|
705
766
|
end
|
|
706
767
|
end
|
|
707
768
|
|
|
708
|
-
|
|
709
769
|
# Determine whether or not water fixtures are attached to spaces
|
|
710
770
|
def model_attach_water_fixtures_to_spaces?(model)
|
|
711
771
|
return true
|
|
@@ -735,7 +795,7 @@ class NECB2011 < Standard
|
|
|
735
795
|
# that it only occurs through exterior walls and roofs (not floors as
|
|
736
796
|
# explicit stated in the NECB2011 so overhang/cantilevered floors will
|
|
737
797
|
# have no effective infiltration)
|
|
738
|
-
tot_infil_m3_per_s =
|
|
798
|
+
tot_infil_m3_per_s = get_standards_constant('infiltration_rate_m3_per_s_per_m2') * exterior_wall_and_roof_and_subsurface_area
|
|
739
799
|
# Now spread the total infiltration rate over all
|
|
740
800
|
# exterior surface area (for the E+ input field) this will include the exterior floor if present.
|
|
741
801
|
all_ext_infil_m3_per_s_per_m2 = tot_infil_m3_per_s / space.exteriorArea
|
|
@@ -771,10 +831,10 @@ class NECB2011 < Standard
|
|
|
771
831
|
infiltration.setName("#{space.name} Infiltration")
|
|
772
832
|
infiltration.setFlowperExteriorSurfaceArea(all_ext_infil_m3_per_s_per_m2)
|
|
773
833
|
infiltration.setSchedule(infil_sch)
|
|
774
|
-
infiltration.setConstantTermCoefficient(
|
|
775
|
-
infiltration.setTemperatureTermCoefficient(
|
|
776
|
-
infiltration.setVelocityTermCoefficient(
|
|
777
|
-
infiltration.setVelocitySquaredTermCoefficient(
|
|
834
|
+
infiltration.setConstantTermCoefficient(get_standards_constant('infiltration_constant_term_coefficient'))
|
|
835
|
+
infiltration.setTemperatureTermCoefficient(get_standards_constant('infiltration_constant_term_coefficient'))
|
|
836
|
+
infiltration.setVelocityTermCoefficient(get_standards_constant('infiltration_velocity_term_coefficient'))
|
|
837
|
+
infiltration.setVelocitySquaredTermCoefficient(get_standards_constant('infiltration_velocity_squared_term_coefficient'))
|
|
778
838
|
infiltration.setSpace(space)
|
|
779
839
|
|
|
780
840
|
return true
|
|
@@ -787,12 +847,13 @@ class NECB2011 < Standard
|
|
|
787
847
|
space_names.sort.each do |space_name|
|
|
788
848
|
space = model.getSpaceByName(space_name)
|
|
789
849
|
next if space.empty?
|
|
850
|
+
|
|
790
851
|
space = space.get
|
|
791
852
|
|
|
792
853
|
# Check if space type for this space matches NECB2011 specific space type
|
|
793
854
|
# for occupancy sensor that is area dependent. Note: space.floorArea in m2.
|
|
794
855
|
|
|
795
|
-
#Evaluate the formula in the database.
|
|
856
|
+
# Evaluate the formula in the database.
|
|
796
857
|
standard_space_type_name = space_type_name
|
|
797
858
|
floor_area = space.floorArea
|
|
798
859
|
if eval(@standards_data['formulas']['occupancy_sensors_space_types_formula']['value'])
|
|
@@ -831,79 +892,81 @@ class NECB2011 < Standard
|
|
|
831
892
|
# criteria. NECB standards assumes that the 'standards_lookup_table_first' method is used. This does basically the
|
|
832
893
|
# some thing as 'model_find_objects' only it assumes that you are looking in the standards hash and you tell it which
|
|
833
894
|
# table in the standards hash to look for.
|
|
834
|
-
def corrupt_standards_database
|
|
895
|
+
def corrupt_standards_database
|
|
835
896
|
@standards_data['tables'].each do |table|
|
|
836
897
|
@standards_data[table[0]] = table[1]['table']
|
|
837
898
|
end
|
|
838
899
|
end
|
|
839
900
|
|
|
840
|
-
#This model gets the climate zone column index from tables 3.2.2.x
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
901
|
+
# This model gets the climate zone column index from tables 3.2.2.x
|
|
902
|
+
# @author phylroy.lopez@nrcan.gc.ca
|
|
903
|
+
# @param hdd [Float]
|
|
904
|
+
# @return [Fixnum] climate zone 4-8
|
|
844
905
|
def get_climate_zone_index(hdd)
|
|
845
|
-
#check for climate zone index from NECB 3.2.2.X
|
|
906
|
+
# check for climate zone index from NECB 3.2.2.X
|
|
846
907
|
case hdd
|
|
847
908
|
when 0..2999 then
|
|
848
|
-
return 0 #climate zone 4
|
|
909
|
+
return 0 # climate zone 4
|
|
849
910
|
when 3000..3999 then
|
|
850
|
-
return 1 #climate zone 5
|
|
911
|
+
return 1 # climate zone 5
|
|
851
912
|
when 4000..4999 then
|
|
852
|
-
return 2 #climate zone 6
|
|
913
|
+
return 2 # climate zone 6
|
|
853
914
|
when 5000..5999 then
|
|
854
|
-
return 3 #climate zone 7a
|
|
915
|
+
return 3 # climate zone 7a
|
|
855
916
|
when 6000..6999 then
|
|
856
|
-
return 4 #climate zone 7b
|
|
917
|
+
return 4 # climate zone 7b
|
|
857
918
|
when 7000..1000000 then
|
|
858
|
-
return 5 #climate zone 8
|
|
919
|
+
return 5 # climate zone 8
|
|
859
920
|
end
|
|
860
921
|
end
|
|
861
922
|
|
|
862
|
-
#This model gets the climate zone name and returns the climate zone string.
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
923
|
+
# This model gets the climate zone name and returns the climate zone string.
|
|
924
|
+
# @author phylroy.lopez@nrcan.gc.ca
|
|
925
|
+
# @param hdd [Float]
|
|
926
|
+
# @return [Fixnum] climate zone 4-8
|
|
866
927
|
def get_climate_zone_name(hdd)
|
|
867
|
-
case
|
|
928
|
+
case get_climate_zone_index(hdd)
|
|
868
929
|
when 0 then
|
|
869
|
-
return
|
|
930
|
+
return '4'
|
|
870
931
|
when 1 then
|
|
871
|
-
return
|
|
932
|
+
return '5' # climate zone 5
|
|
872
933
|
when 2 then
|
|
873
|
-
return
|
|
934
|
+
return '6' # climate zone 6
|
|
874
935
|
when 3 then
|
|
875
|
-
return
|
|
936
|
+
return '7a' # climate zone 7a
|
|
876
937
|
when 4 then
|
|
877
|
-
return
|
|
938
|
+
return '7b' # climate zone 7b
|
|
878
939
|
when 5 then
|
|
879
|
-
return
|
|
940
|
+
return '8' # climate zone 8
|
|
880
941
|
end
|
|
881
942
|
end
|
|
882
943
|
|
|
944
|
+
##### Ask user's inputs for daylighting controls illuminance setpoint and number of stepped control steps.
|
|
945
|
+
##### Note that the minimum number of stepped control steps is two steps as per NECB2011.
|
|
946
|
+
def daylighting_controls_settings(illuminance_setpoint: 500.0,
|
|
947
|
+
number_of_stepped_control_steps: 2)
|
|
948
|
+
return illuminance_setpoint, number_of_stepped_control_steps
|
|
949
|
+
end
|
|
883
950
|
|
|
884
951
|
def model_add_daylighting_controls(model)
|
|
885
|
-
|
|
886
|
-
##### Ask user's inputs for daylighting controls illuminance setpoint and number of stepped control steps.
|
|
887
|
-
##### Note that the minimum number of stepped control steps is two steps as per NECB2011.
|
|
888
|
-
def daylighting_controls_settings(illuminance_setpoint: 500.0,
|
|
889
|
-
number_of_stepped_control_steps: 2)
|
|
890
|
-
return illuminance_setpoint, number_of_stepped_control_steps
|
|
891
|
-
end
|
|
892
|
-
|
|
893
952
|
##### Find spaces with exterior fenestration including fixed window, operable window, and skylight.
|
|
894
953
|
daylight_spaces = []
|
|
895
954
|
model.getSpaces.sort.each do |space|
|
|
896
955
|
space.surfaces.sort.each do |surface|
|
|
897
956
|
surface.subSurfaces.sort.each do |subsurface|
|
|
898
|
-
if subsurface.outsideBoundaryCondition ==
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
957
|
+
if subsurface.outsideBoundaryCondition == 'Outdoors' &&
|
|
958
|
+
(subsurface.subSurfaceType == 'FixedWindow' ||
|
|
959
|
+
subsurface.subSurfaceType == 'OperableWindow' ||
|
|
960
|
+
subsurface.subSurfaceType == 'Skylight')
|
|
902
961
|
daylight_spaces << space
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
962
|
+
# subsurface.outsideBoundaryCondition == "Outdoors" && (subsurface.subSurfaceType == "FixedWindow" || "OperableWindow")
|
|
963
|
+
end
|
|
964
|
+
# surface.subSurfaces.each do |subsurface|
|
|
965
|
+
end
|
|
966
|
+
# space.surfaces.each do |surface|
|
|
967
|
+
end
|
|
968
|
+
# model.getSpaces.sort.each do |space|
|
|
969
|
+
end
|
|
907
970
|
|
|
908
971
|
##### Remove duplicate spaces from the "daylight_spaces" array, as a daylighted space may have various fenestration types.
|
|
909
972
|
daylight_spaces = daylight_spaces.uniq
|
|
@@ -931,7 +994,7 @@ class NECB2011 < Standard
|
|
|
931
994
|
floor_area = 0.0
|
|
932
995
|
floor_vertices = []
|
|
933
996
|
daylight_space.surfaces.sort.each do |surface|
|
|
934
|
-
if surface.surfaceType ==
|
|
997
|
+
if surface.surfaceType == 'Floor'
|
|
935
998
|
floor_surface = surface
|
|
936
999
|
floor_area += surface.netArea
|
|
937
1000
|
floor_vertices << surface.vertices
|
|
@@ -941,22 +1004,21 @@ class NECB2011 < Standard
|
|
|
941
1004
|
##### Loop through the surfaces of each daylight_space to calculate primary_sidelighted_area and
|
|
942
1005
|
##### area-weighted visible transmittance and window_area_sum which are used to calculate sidelighting_effective_aperture
|
|
943
1006
|
primary_sidelighted_area, area_weighted_vt_handle, window_area_sum =
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
1007
|
+
get_parameters_sidelighting(daylight_space: daylight_space,
|
|
1008
|
+
floor_surface: floor_surface,
|
|
1009
|
+
floor_vertices: floor_vertices,
|
|
1010
|
+
floor_area: floor_area,
|
|
1011
|
+
primary_sidelighted_area: primary_sidelighted_area,
|
|
1012
|
+
area_weighted_vt_handle: area_weighted_vt_handle,
|
|
1013
|
+
window_area_sum: window_area_sum)
|
|
951
1014
|
|
|
952
1015
|
primary_sidelighted_area_hash[daylight_space.name.to_s] = primary_sidelighted_area
|
|
953
1016
|
|
|
954
1017
|
##### Calculate area-weighted VT of glazing (this is used to calculate sidelighting effective aperture; see NECB2011: 4.2.2.10.).
|
|
955
1018
|
area_weighted_vt = area_weighted_vt_handle / window_area_sum
|
|
956
1019
|
sidelighting_effective_aperture_hash[daylight_space.name.to_s] = window_area_sum * area_weighted_vt / primary_sidelighted_area
|
|
957
|
-
|
|
958
|
-
end
|
|
959
|
-
|
|
1020
|
+
# daylight_spaces.each do |daylight_space|
|
|
1021
|
+
end
|
|
960
1022
|
|
|
961
1023
|
##### Calculate "Daylighted Area Under Skylights" AND "Skylight Effective Aperture"
|
|
962
1024
|
daylight_spaces.sort.each do |daylight_space|
|
|
@@ -969,10 +1031,10 @@ class NECB2011 < Standard
|
|
|
969
1031
|
|
|
970
1032
|
##### Loop through the surfaces of each daylight_space to calculate daylighted_area_under_skylights and skylight_effective_aperture for each daylight_space
|
|
971
1033
|
daylighted_under_skylight_area, skylight_area_weighted_vt_handle, skylight_area_sum =
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
1034
|
+
get_parameters_skylight(daylight_space: daylight_space,
|
|
1035
|
+
skylight_area_weighted_vt_handle: skylight_area_weighted_vt_handle,
|
|
1036
|
+
skylight_area_sum: skylight_area_sum,
|
|
1037
|
+
daylighted_under_skylight_area: daylighted_under_skylight_area)
|
|
976
1038
|
|
|
977
1039
|
daylighted_area_under_skylights_hash[daylight_space.name.to_s] = daylighted_under_skylight_area
|
|
978
1040
|
|
|
@@ -980,9 +1042,8 @@ class NECB2011 < Standard
|
|
|
980
1042
|
##### Note that it was assumed that the skylight is flush with the ceiling. Therefore, area-weighted average well factor (WF) was set to 0.9 in the below Equation.
|
|
981
1043
|
skylight_area_weighted_vt = skylight_area_weighted_vt_handle / skylight_area_sum
|
|
982
1044
|
skylight_effective_aperture_hash[daylight_space.name.to_s] = 0.85 * skylight_area_sum * skylight_area_weighted_vt * 0.9 / daylighted_under_skylight_area
|
|
983
|
-
|
|
984
|
-
end
|
|
985
|
-
|
|
1045
|
+
# daylight_spaces.each do |daylight_space|
|
|
1046
|
+
end
|
|
986
1047
|
# puts primary_sidelighted_area_hash
|
|
987
1048
|
# puts sidelighting_effective_aperture_hash
|
|
988
1049
|
# puts daylighted_area_under_skylights_hash
|
|
@@ -991,7 +1052,6 @@ class NECB2011 < Standard
|
|
|
991
1052
|
##### Find office spaces >= 25m2 among daylight_spaces
|
|
992
1053
|
offices_larger_25m2 = []
|
|
993
1054
|
daylight_spaces.sort.each do |daylight_space|
|
|
994
|
-
|
|
995
1055
|
## The following steps are for in case an office has multiple floors at various heights
|
|
996
1056
|
## 1. Calculate number of floors of each daylight_space
|
|
997
1057
|
## 2. Find the lowest z among all floors of each daylight_space
|
|
@@ -1039,12 +1099,12 @@ class NECB2011 < Standard
|
|
|
1039
1099
|
floor_vertices = surface.vertices
|
|
1040
1100
|
if floor_vertices[0].z == lowest_floor_z
|
|
1041
1101
|
lowest_floors_vertices << floor_vertices
|
|
1042
|
-
daylight_space_area
|
|
1102
|
+
daylight_space_area += surface.netArea
|
|
1043
1103
|
end
|
|
1044
1104
|
end
|
|
1045
1105
|
end
|
|
1046
1106
|
|
|
1047
|
-
if daylight_space.spaceType.get.standardsSpaceType.get.to_s ==
|
|
1107
|
+
if daylight_space.spaceType.get.standardsSpaceType.get.to_s == 'Office - enclosed' && daylight_space_area >= 25.0
|
|
1048
1108
|
offices_larger_25m2 << daylight_space.name.to_s
|
|
1049
1109
|
end
|
|
1050
1110
|
end
|
|
@@ -1145,7 +1205,7 @@ class NECB2011 < Standard
|
|
|
1145
1205
|
floor_vertices = surface.vertices
|
|
1146
1206
|
if floor_vertices[0].z == lowest_floor_z
|
|
1147
1207
|
lowest_floors_vertices << floor_vertices
|
|
1148
|
-
daylight_space_area
|
|
1208
|
+
daylight_space_area += surface.netArea
|
|
1149
1209
|
end
|
|
1150
1210
|
end
|
|
1151
1211
|
end
|
|
@@ -1160,8 +1220,8 @@ class NECB2011 < Standard
|
|
|
1160
1220
|
xmax = lowest_floors_vertices[0][0].x
|
|
1161
1221
|
ymax = lowest_floors_vertices[0][0].y
|
|
1162
1222
|
zmin = lowest_floor_z
|
|
1163
|
-
for i in 0..lowest_floors_vertices.count - 1 #this loops through each of the lowers floors of daylight_space
|
|
1164
|
-
for j in 0..lowest_floors_vertices[i].count - 1 #this loops through each of vertices of each of the lowers floors of daylight_space
|
|
1223
|
+
for i in 0..lowest_floors_vertices.count - 1 # this loops through each of the lowers floors of daylight_space
|
|
1224
|
+
for j in 0..lowest_floors_vertices[i].count - 1 # this loops through each of vertices of each of the lowers floors of daylight_space
|
|
1165
1225
|
|
|
1166
1226
|
if xmin > lowest_floors_vertices[i][j].x
|
|
1167
1227
|
xmin = lowest_floors_vertices[i][j].x
|
|
@@ -1190,7 +1250,7 @@ class NECB2011 < Standard
|
|
|
1190
1250
|
##### Get the floor of the daylight_space
|
|
1191
1251
|
floors = []
|
|
1192
1252
|
daylight_space.surfaces.sort.each do |surface|
|
|
1193
|
-
if surface.surfaceType ==
|
|
1253
|
+
if surface.surfaceType == 'Floor'
|
|
1194
1254
|
floors << surface
|
|
1195
1255
|
end
|
|
1196
1256
|
end
|
|
@@ -1208,168 +1268,162 @@ class NECB2011 < Standard
|
|
|
1208
1268
|
##### Furthermore, the one daylighting sensor in each thermal zone (where the thermal zone needs daylighting sensor),
|
|
1209
1269
|
##### the sensor has been put at the intersection of the minimum and maximum x and y of the lowest floor of that thermal zones.
|
|
1210
1270
|
sensor = OpenStudio::Model::DaylightingControl.new(daylight_space.model)
|
|
1211
|
-
sensor.setName("#{daylight_space.name
|
|
1271
|
+
sensor.setName("#{daylight_space.name} daylighting control")
|
|
1212
1272
|
sensor.setSpace(daylight_space)
|
|
1213
1273
|
sensor.setIlluminanceSetpoint(illuminance_setpoint)
|
|
1214
1274
|
sensor.setLightingControlType('Stepped')
|
|
1215
1275
|
sensor.setNumberofSteppedControlSteps(number_of_stepped_control_steps)
|
|
1216
1276
|
x_pos = (xmin + xmax) / 2.0
|
|
1217
1277
|
y_pos = (ymin + ymax) / 2.0
|
|
1218
|
-
z_pos = zmin + 0.8 #put it 0.8 meter above the floor
|
|
1278
|
+
z_pos = zmin + 0.8 # put it 0.8 meter above the floor
|
|
1219
1279
|
sensor_vertex = OpenStudio::Point3d.new(x_pos, y_pos, z_pos)
|
|
1220
1280
|
sensor.setPosition(sensor_vertex)
|
|
1221
1281
|
zone.setPrimaryDaylightingControl(sensor)
|
|
1222
1282
|
zone.setFractionofZoneControlledbyPrimaryDaylightingControl(1.0)
|
|
1283
|
+
# if !zone.empty?
|
|
1284
|
+
end
|
|
1285
|
+
# daylight_spaces.each do |daylight_space|
|
|
1286
|
+
end
|
|
1287
|
+
end
|
|
1223
1288
|
|
|
1224
|
-
|
|
1225
|
-
|
|
1289
|
+
##### Define ScheduleTypeLimits for Any_Number_ppm
|
|
1290
|
+
##### TODO: (upon other BTAP tasks) This function can be added to btap/schedules.rb > module StandardScheduleTypeLimits
|
|
1291
|
+
def get_any_number_ppm(model)
|
|
1292
|
+
name = 'Any_Number_ppm'
|
|
1293
|
+
any_number_ppm_schedule_type_limits = model.getScheduleTypeLimitsByName(name)
|
|
1294
|
+
return any_number_ppm_schedule_type_limits.get unless any_number_ppm_schedule_type_limits.empty?
|
|
1295
|
+
|
|
1296
|
+
any_number_ppm_schedule_type_limits = OpenStudio::Model::ScheduleTypeLimits.new(model)
|
|
1297
|
+
any_number_ppm_schedule_type_limits.setName(name)
|
|
1298
|
+
any_number_ppm_schedule_type_limits.setNumericType('CONTINUOUS')
|
|
1299
|
+
any_number_ppm_schedule_type_limits.setUnitType('Dimensionless')
|
|
1300
|
+
any_number_ppm_schedule_type_limits.setLowerLimitValue(400.0)
|
|
1301
|
+
any_number_ppm_schedule_type_limits.setUpperLimitValue(1000.0)
|
|
1302
|
+
return any_number_ppm_schedule_type_limits
|
|
1226
1303
|
end
|
|
1227
1304
|
|
|
1228
|
-
#
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
if dcv_type
|
|
1233
|
-
|
|
1234
|
-
|
|
1235
|
-
|
|
1236
|
-
|
|
1237
|
-
|
|
1238
|
-
|
|
1239
|
-
|
|
1240
|
-
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1305
|
+
# Note: Values for dcv_type are: 'Occupancy_based_DCV', 'CO2_based_DCV', 'No_DCV', 'NECB_Default'
|
|
1306
|
+
def model_enable_demand_controlled_ventilation(model, dcv_type = 'No_DCV')
|
|
1307
|
+
return if dcv_type == 'NECB_Defualt'
|
|
1308
|
+
|
|
1309
|
+
if dcv_type == 'Occupancy_based_DCV' || dcv_type == 'CO2_based_DCV'
|
|
1310
|
+
# TODO: IMPORTANT: (upon other BTAP tasks) Set a value for the "Outdoor Air Flow per Person" field of the "OS:DesignSpecification:OutdoorAir" object
|
|
1311
|
+
# Note: The "Outdoor Air Flow per Person" field is required for occupancy-based DCV.
|
|
1312
|
+
# Note: The "Outdoor Air Flow per Person" values should be based on ASHRAE 62.1: Article 6.2.2.1.
|
|
1313
|
+
# Note: The "Outdoor Air Flow per Person" should be entered for "ventilation_per_person" in "lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json"
|
|
1314
|
+
|
|
1315
|
+
##### Define indoor CO2 availability schedule (required for CO2-based DCV)
|
|
1316
|
+
##### Reference: see page B.13 of PNNL (2017), "Impacts of Commercial Building Controls on Energy Savings and Peak Load Reduction", available a: https://www.energy.gov/eere/buildings/downloads/impacts-commercial-building-controls-energy-savings-and-peak-load-reduction
|
|
1317
|
+
##### Note: the defined schedule here is redundant as the schedule says it is always on AND
|
|
1318
|
+
##### the "ZoneControl:ContaminantController" object says that "If this field is left blank, the schedule has a value of 1 for all time periods".
|
|
1319
|
+
indoor_co2_availability_schedule = OpenStudio::Model::ScheduleCompact.new(model)
|
|
1320
|
+
indoor_co2_availability_schedule.setName('indoor_co2_availability_schedule')
|
|
1321
|
+
indoor_co2_availability_schedule.setScheduleTypeLimits(BTAP::Resources::Schedules::StandardScheduleTypeLimits.get_fraction(model))
|
|
1322
|
+
indoor_co2_availability_schedule.to_ScheduleCompact.get
|
|
1323
|
+
# indoor_co2_availability_schedule.setString(1,"indoor_co2_availability_schedule")
|
|
1324
|
+
indoor_co2_availability_schedule.setString(3, 'Through: 12/31')
|
|
1325
|
+
indoor_co2_availability_schedule.setString(4, 'For: Weekdays SummerDesignDay')
|
|
1326
|
+
indoor_co2_availability_schedule.setString(5, 'Until: 07:00')
|
|
1327
|
+
indoor_co2_availability_schedule.setString(6, '0.0')
|
|
1328
|
+
indoor_co2_availability_schedule.setString(7, 'Until: 22:00')
|
|
1329
|
+
indoor_co2_availability_schedule.setString(8, '1.0')
|
|
1330
|
+
indoor_co2_availability_schedule.setString(9, 'Until: 24:00')
|
|
1331
|
+
indoor_co2_availability_schedule.setString(10, '0.0')
|
|
1332
|
+
indoor_co2_availability_schedule.setString(11, 'For: Saturday WinterDesignDay')
|
|
1333
|
+
indoor_co2_availability_schedule.setString(12, 'Until: 07:00')
|
|
1334
|
+
indoor_co2_availability_schedule.setString(13, '0.0')
|
|
1335
|
+
indoor_co2_availability_schedule.setString(14, 'Until: 18:00')
|
|
1336
|
+
indoor_co2_availability_schedule.setString(15, '1.0')
|
|
1337
|
+
indoor_co2_availability_schedule.setString(16, 'Until: 24:00')
|
|
1338
|
+
indoor_co2_availability_schedule.setString(17, '0.0')
|
|
1339
|
+
indoor_co2_availability_schedule.setString(18, 'For: AllOtherDays')
|
|
1340
|
+
indoor_co2_availability_schedule.setString(19, 'Until: 24:00')
|
|
1341
|
+
indoor_co2_availability_schedule.setString(20, '0.0')
|
|
1342
|
+
|
|
1343
|
+
##### Define indoor CO2 setpoint schedule (required for CO2-based DCV)
|
|
1344
|
+
##### Reference: see page B.13 of PNNL (2017), "Impacts of Commercial Building Controls on Energy Savings and Peak Load Reduction", available a: https://www.energy.gov/eere/buildings/downloads/impacts-commercial-building-controls-energy-savings-and-peak-load-reduction
|
|
1345
|
+
indoor_co2_setpoint_schedule = OpenStudio::Model::ScheduleCompact.new(model)
|
|
1346
|
+
indoor_co2_setpoint_schedule.setName('indoor_co2_setpoint_schedule')
|
|
1347
|
+
indoor_co2_setpoint_schedule.setScheduleTypeLimits(get_any_number_ppm(model))
|
|
1348
|
+
indoor_co2_setpoint_schedule.to_ScheduleCompact.get
|
|
1349
|
+
indoor_co2_setpoint_schedule.setString(3, 'Through: 12/31')
|
|
1350
|
+
indoor_co2_setpoint_schedule.setString(4, 'For: AllDays')
|
|
1351
|
+
indoor_co2_setpoint_schedule.setString(5, 'Until: 24:00')
|
|
1352
|
+
indoor_co2_setpoint_schedule.setString(6, '1000.0')
|
|
1353
|
+
# indoor_co2_setpoint_schedule.setToConstantValue(1000.0) #1000 ppm
|
|
1354
|
+
|
|
1355
|
+
##### Define outdoor CO2 schedule (required for CO2-based DCV
|
|
1356
|
+
##### Reference: see page B.13 of PNNL (2017), "Impacts of Commercial Building Controls on Energy Savings and Peak Load Reduction", available a: https://www.energy.gov/eere/buildings/downloads/impacts-commercial-building-controls-energy-savings-and-peak-load-reduction
|
|
1357
|
+
outdoor_co2_schedule = OpenStudio::Model::ScheduleCompact.new(model)
|
|
1358
|
+
outdoor_co2_schedule.setName('outdoor_co2_schedule')
|
|
1359
|
+
outdoor_co2_schedule.setScheduleTypeLimits(get_any_number_ppm(model))
|
|
1360
|
+
outdoor_co2_schedule.to_ScheduleCompact.get
|
|
1361
|
+
outdoor_co2_schedule.setString(3, 'Through: 12/31')
|
|
1362
|
+
outdoor_co2_schedule.setString(4, 'For: AllDays')
|
|
1363
|
+
outdoor_co2_schedule.setString(5, 'Until: 24:00')
|
|
1364
|
+
outdoor_co2_schedule.setString(6, '400.0')
|
|
1365
|
+
# outdoor_co2_schedule.setToConstantValue(400.0) #400 ppm
|
|
1366
|
+
|
|
1367
|
+
##### Define ZoneAirContaminantBalance (required for CO2-based DCV)
|
|
1368
|
+
zone_air_contaminant_balance = model.getZoneAirContaminantBalance
|
|
1369
|
+
zone_air_contaminant_balance.setCarbonDioxideConcentration(true)
|
|
1370
|
+
zone_air_contaminant_balance.setOutdoorCarbonDioxideSchedule(outdoor_co2_schedule)
|
|
1371
|
+
|
|
1372
|
+
##### Set CO2 controller in each space (required for CO2-based DCV)
|
|
1373
|
+
model.getSpaces.sort.each do |space|
|
|
1374
|
+
# puts space.name.to_s
|
|
1375
|
+
zone = space.thermalZone
|
|
1376
|
+
if !zone.empty?
|
|
1377
|
+
zone = space.thermalZone.get
|
|
1255
1378
|
end
|
|
1379
|
+
zone_control_co2 = OpenStudio::Model::ZoneControlContaminantController.new(zone.model)
|
|
1380
|
+
zone_control_co2.setName("#{space.name} Zone Control Contaminant Controller")
|
|
1381
|
+
zone_control_co2.setCarbonDioxideControlAvailabilitySchedule(indoor_co2_availability_schedule)
|
|
1382
|
+
zone_control_co2.setCarbonDioxideSetpointSchedule(indoor_co2_setpoint_schedule)
|
|
1383
|
+
zone.setZoneControlContaminantController(zone_control_co2)
|
|
1384
|
+
end
|
|
1385
|
+
# if dcv_type == "Occupancy_based_DCV" || dcv_type == "CO2_based_DCV"
|
|
1386
|
+
end
|
|
1256
1387
|
|
|
1257
|
-
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
|
|
1263
|
-
|
|
1264
|
-
|
|
1265
|
-
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
1273
|
-
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
1279
|
-
|
|
1280
|
-
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
##### Reference: see page B.13 of PNNL (2017), "Impacts of Commercial Building Controls on Energy Savings and Peak Load Reduction", available a: https://www.energy.gov/eere/buildings/downloads/impacts-commercial-building-controls-energy-savings-and-peak-load-reduction
|
|
1287
|
-
indoor_co2_setpoint_schedule = OpenStudio::Model::ScheduleCompact.new(model)
|
|
1288
|
-
indoor_co2_setpoint_schedule.setName('indoor_co2_setpoint_schedule')
|
|
1289
|
-
indoor_co2_setpoint_schedule.setScheduleTypeLimits(get_any_number_ppm(model))
|
|
1290
|
-
indoor_co2_setpoint_schedule.to_ScheduleCompact.get
|
|
1291
|
-
indoor_co2_setpoint_schedule.setString(3, "Through: 12/31")
|
|
1292
|
-
indoor_co2_setpoint_schedule.setString(4, "For: AllDays")
|
|
1293
|
-
indoor_co2_setpoint_schedule.setString(5, "Until: 24:00")
|
|
1294
|
-
indoor_co2_setpoint_schedule.setString(6, "1000.0")
|
|
1295
|
-
# indoor_co2_setpoint_schedule.setToConstantValue(1000.0) #1000 ppm
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
##### Define outdoor CO2 schedule (required for CO2-based DCV
|
|
1299
|
-
##### Reference: see page B.13 of PNNL (2017), "Impacts of Commercial Building Controls on Energy Savings and Peak Load Reduction", available a: https://www.energy.gov/eere/buildings/downloads/impacts-commercial-building-controls-energy-savings-and-peak-load-reduction
|
|
1300
|
-
outdoor_co2_schedule = OpenStudio::Model::ScheduleCompact.new(model)
|
|
1301
|
-
outdoor_co2_schedule.setName('outdoor_co2_schedule')
|
|
1302
|
-
outdoor_co2_schedule.setScheduleTypeLimits(get_any_number_ppm(model))
|
|
1303
|
-
outdoor_co2_schedule.to_ScheduleCompact.get
|
|
1304
|
-
outdoor_co2_schedule.setString(3, "Through: 12/31")
|
|
1305
|
-
outdoor_co2_schedule.setString(4, "For: AllDays")
|
|
1306
|
-
outdoor_co2_schedule.setString(5, "Until: 24:00")
|
|
1307
|
-
outdoor_co2_schedule.setString(6, "400.0")
|
|
1308
|
-
# outdoor_co2_schedule.setToConstantValue(400.0) #400 ppm
|
|
1309
|
-
|
|
1310
|
-
##### Define ZoneAirContaminantBalance (required for CO2-based DCV)
|
|
1311
|
-
zone_air_contaminant_balance = model.getZoneAirContaminantBalance()
|
|
1312
|
-
zone_air_contaminant_balance.setCarbonDioxideConcentration(true)
|
|
1313
|
-
zone_air_contaminant_balance.setOutdoorCarbonDioxideSchedule(outdoor_co2_schedule)
|
|
1314
|
-
|
|
1315
|
-
##### Set CO2 controller in each space (required for CO2-based DCV)
|
|
1316
|
-
model.getSpaces.sort.each do |space|
|
|
1317
|
-
# puts space.name.to_s
|
|
1318
|
-
zone = space.thermalZone
|
|
1319
|
-
if !zone.empty?
|
|
1320
|
-
zone = space.thermalZone.get
|
|
1388
|
+
##### Loop through AirLoopHVACs
|
|
1389
|
+
model.getAirLoopHVACs.sort.each do |air_loop|
|
|
1390
|
+
##### Loop through AirLoopHVAC's supply nodes to:
|
|
1391
|
+
##### (1) Find its AirLoopHVAC:OutdoorAirSystem using the supply node;
|
|
1392
|
+
##### (2) Find Controller:OutdoorAir using AirLoopHVAC:OutdoorAirSystem;
|
|
1393
|
+
##### (3) Get "Controller Mechanical Ventilation" from Controller:OutdoorAir.
|
|
1394
|
+
air_loop.supplyComponents.sort.each do |supply_component|
|
|
1395
|
+
##### Find AirLoopHVAC:OutdoorAirSystem of AirLoopHVAC using the supply node.
|
|
1396
|
+
hvac_component = supply_component.to_AirLoopHVACOutdoorAirSystem
|
|
1397
|
+
|
|
1398
|
+
if !hvac_component.empty?
|
|
1399
|
+
##### Find Controller:OutdoorAir using AirLoopHVAC:OutdoorAirSystem.
|
|
1400
|
+
hvac_component = hvac_component.get
|
|
1401
|
+
controller_oa = hvac_component.getControllerOutdoorAir
|
|
1402
|
+
|
|
1403
|
+
##### Get "Controller Mechanical Ventilation" from Controller:OutdoorAir.
|
|
1404
|
+
controller_mv = controller_oa.controllerMechanicalVentilation
|
|
1405
|
+
|
|
1406
|
+
##### Set "Demand Controlled Ventilation" to "Yes" or "No" in Controller:MechanicalVentilation depending on dcv_type.
|
|
1407
|
+
if (dcv_type == 'CO2_based_DCV') || (dcv_type == 'Occupancy_based_DCV') # Occupancy
|
|
1408
|
+
controller_mv.setDemandControlledVentilation(true)
|
|
1409
|
+
##### Set the "System Outdoor Air Method" field based on dcv_type in the Controller:MechanicalVentilation object
|
|
1410
|
+
if dcv_type == 'CO2_based_DCV'
|
|
1411
|
+
controller_mv.setSystemOutdoorAirMethod('IndoorAirQualityProcedure')
|
|
1412
|
+
else # dcv_type == 'Occupancy_based_DCV'
|
|
1413
|
+
controller_mv.setSystemOutdoorAirMethod('ZoneSum')
|
|
1414
|
+
end
|
|
1415
|
+
elsif dcv_type == 'No_DCV'
|
|
1416
|
+
controller_mv.setDemandControlledVentilation(false)
|
|
1321
1417
|
end
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
zone_control_co2.setCarbonDioxideControlAvailabilitySchedule(indoor_co2_availability_schedule)
|
|
1325
|
-
zone_control_co2.setCarbonDioxideSetpointSchedule(indoor_co2_setpoint_schedule)
|
|
1326
|
-
zone.setZoneControlContaminantController(zone_control_co2)
|
|
1418
|
+
# puts controller_mv
|
|
1419
|
+
# if !hvac_component.empty?
|
|
1327
1420
|
end
|
|
1328
|
-
|
|
1329
|
-
end
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
model.getAirLoopHVACs.sort.each do |air_loop|
|
|
1333
|
-
##### Loop through AirLoopHVAC's supply nodes to:
|
|
1334
|
-
##### (1) Find its AirLoopHVAC:OutdoorAirSystem using the supply node;
|
|
1335
|
-
##### (2) Find Controller:OutdoorAir using AirLoopHVAC:OutdoorAirSystem;
|
|
1336
|
-
##### (3) Get "Controller Mechanical Ventilation" from Controller:OutdoorAir.
|
|
1337
|
-
air_loop.supplyComponents.sort.each do |supply_component|
|
|
1338
|
-
##### Find AirLoopHVAC:OutdoorAirSystem of AirLoopHVAC using the supply node.
|
|
1339
|
-
hvac_component = supply_component.to_AirLoopHVACOutdoorAirSystem
|
|
1340
|
-
|
|
1341
|
-
if !hvac_component.empty?
|
|
1342
|
-
##### Find Controller:OutdoorAir using AirLoopHVAC:OutdoorAirSystem.
|
|
1343
|
-
hvac_component = hvac_component.get
|
|
1344
|
-
controller_oa = hvac_component.getControllerOutdoorAir
|
|
1345
|
-
|
|
1346
|
-
##### Get "Controller Mechanical Ventilation" from Controller:OutdoorAir.
|
|
1347
|
-
controller_mv = controller_oa.controllerMechanicalVentilation
|
|
1348
|
-
|
|
1349
|
-
##### Set "Demand Controlled Ventilation" to "Yes" or "No" in Controller:MechanicalVentilation depending on dcv_type.
|
|
1350
|
-
if (dcv_type == 'CO2_based_DCV') || (dcv_type == 'Occupancy_based_DCV') #Occupancy
|
|
1351
|
-
controller_mv.setDemandControlledVentilation(true)
|
|
1352
|
-
##### Set the "System Outdoor Air Method" field based on dcv_type in the Controller:MechanicalVentilation object
|
|
1353
|
-
if dcv_type == 'CO2_based_DCV'
|
|
1354
|
-
controller_mv.setSystemOutdoorAirMethod('IndoorAirQualityProcedure')
|
|
1355
|
-
else #dcv_type == 'Occupancy_based_DCV'
|
|
1356
|
-
controller_mv.setSystemOutdoorAirMethod('ZoneSum')
|
|
1357
|
-
end
|
|
1358
|
-
elsif dcv_type == 'No_DCV'
|
|
1359
|
-
controller_mv.setDemandControlledVentilation(false)
|
|
1360
|
-
end
|
|
1361
|
-
# puts controller_mv
|
|
1362
|
-
|
|
1363
|
-
end #if !hvac_component.empty?
|
|
1364
|
-
|
|
1365
|
-
end #air_loop.supplyComponents.each do |supply_component|
|
|
1366
|
-
end #model.getAirLoopHVACs.each do |air_loop|
|
|
1367
|
-
end #if dcv_type != 'NECB_Default'
|
|
1421
|
+
# air_loop.supplyComponents.each do |supply_component|
|
|
1422
|
+
end
|
|
1423
|
+
# model.getAirLoopHVACs.each do |air_loop|
|
|
1424
|
+
end
|
|
1368
1425
|
end
|
|
1369
1426
|
|
|
1370
|
-
#def model_enable_demand_controlled_ventilation
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
1427
|
def set_lighting_per_area_led_lighting(space_type:, definition:, lighting_per_area_led_lighting:, lights_scale:)
|
|
1374
1428
|
# puts "#{space_type.name.to_s} - 'space_height' - #{space_height.to_s}"
|
|
1375
1429
|
occ_sens_lpd_frac = 1.0
|
|
@@ -1390,11 +1444,11 @@ class NECB2011 < Standard
|
|
|
1390
1444
|
|
|
1391
1445
|
# ##### Since Atrium's LPD for LED lighting depends on atrium's height, the height of the atrium (if applicable) should be found.
|
|
1392
1446
|
standards_space_type = space_type.standardsSpaceType.is_initialized ? space_type.standardsSpaceType.get : nil
|
|
1393
|
-
if standards_space_type.include? 'Atrium' #TODO: Note that since none of the archetypes has Atrium, this was tested for 'Dining'. #Atrium
|
|
1394
|
-
puts "#{standards_space_type} - has atrium" #space_type.name.to_s
|
|
1447
|
+
if standards_space_type.include? 'Atrium' # TODO: Note that since none of the archetypes has Atrium, this was tested for 'Dining'. #Atrium
|
|
1448
|
+
puts "#{standards_space_type} - has atrium" # space_type.name.to_s
|
|
1395
1449
|
# Get the max height for the spacetype.
|
|
1396
1450
|
max_space_height_for_spacetype = get_max_space_height_for_space_type(space_type: space_type)
|
|
1397
|
-
if max_space_height_for_spacetype < 12.0 #TODO: Note that since none of the archetypes has Atrium, this was tested for 'Dining' with the threshold of 5.0 m for space_height.
|
|
1451
|
+
if max_space_height_for_spacetype < 12.0 # TODO: Note that since none of the archetypes has Atrium, this was tested for 'Dining' with the threshold of 5.0 m for space_height.
|
|
1398
1452
|
# TODO: Regarding the below equations, identify which version of ASHRAE 90.1 was used in NECB2015.
|
|
1399
1453
|
atrium_lpd_eq_smaller_12_intercept = 0
|
|
1400
1454
|
atrium_lpd_eq_smaller_12_slope = 1.06
|
|
@@ -1403,13 +1457,13 @@ class NECB2011 < Standard
|
|
|
1403
1457
|
lighting_per_area_led_lighting_atrium = (atrium_lpd_eq_smaller_12_intercept + atrium_lpd_eq_smaller_12_slope * 12.0) * 0.092903 # W/ft2 TODO: Note that for NECB2011, a constant LPD is used for atrium based on NECB2015's equations. NECB2011's threshold for height is 13.0 m.
|
|
1404
1458
|
elsif max_space_height_for_spacetype >= 12.0 && max_space_height_for_spacetype < 13.0
|
|
1405
1459
|
lighting_per_area_led_lighting_atrium = (atrium_lpd_eq_larger_12_intercept + atrium_lpd_eq_larger_12_slope * 12.5) * 0.092903 # W/ft2
|
|
1406
|
-
else #i.e. space_height >= 13.0
|
|
1460
|
+
else # i.e. space_height >= 13.0
|
|
1407
1461
|
lighting_per_area_led_lighting_atrium = (atrium_lpd_eq_larger_12_intercept + atrium_lpd_eq_larger_12_slope * 13.0) * 0.092903 # W/ft2
|
|
1408
1462
|
end
|
|
1409
1463
|
puts "#{standards_space_type} - has lighting_per_area_led_lighting_atrium - #{lighting_per_area_led_lighting_atrium}"
|
|
1410
1464
|
lighting_per_area_led_lighting = lighting_per_area_led_lighting_atrium
|
|
1411
1465
|
end
|
|
1412
|
-
lighting_per_area_led_lighting
|
|
1466
|
+
lighting_per_area_led_lighting *= lights_scale
|
|
1413
1467
|
definition.setWattsperSpaceFloorArea(OpenStudio.convert(lighting_per_area_led_lighting.to_f * occ_sens_lpd_frac, 'W/ft^2', 'W/m^2').get)
|
|
1414
1468
|
|
|
1415
1469
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.SpaceType', "#{space_type.name} set LPD to #{lighting_per_area_led_lighting} W/ft^2.")
|
|
@@ -1463,13 +1517,11 @@ class NECB2011 < Standard
|
|
|
1463
1517
|
|
|
1464
1518
|
##### The below method is for the 'model_add_daylighting_controls' method
|
|
1465
1519
|
def get_parameters_sidelighting(daylight_space:, floor_surface:, floor_vertices:, floor_area:, primary_sidelighted_area:, area_weighted_vt_handle:, window_area_sum:)
|
|
1466
|
-
|
|
1467
1520
|
daylight_space.surfaces.sort.each do |surface|
|
|
1468
|
-
|
|
1469
1521
|
##### Get the vertices of each exterior wall of the daylight_space on the floor
|
|
1470
1522
|
##### (these vertices will be used to calculate daylight_space depth in relation to the exterior wall, and
|
|
1471
1523
|
##### the distance of the window to vertical walls on each side of the window)
|
|
1472
|
-
if surface.outsideBoundaryCondition ==
|
|
1524
|
+
if surface.outsideBoundaryCondition == 'Outdoors' && surface.surfaceType == 'Wall'
|
|
1473
1525
|
wall_vertices_x_on_floor = []
|
|
1474
1526
|
wall_vertices_y_on_floor = []
|
|
1475
1527
|
surface_z_min = [surface.vertices[0].z, surface.vertices[1].z, surface.vertices[2].z, surface.vertices[3].z].min
|
|
@@ -1482,7 +1534,7 @@ class NECB2011 < Standard
|
|
|
1482
1534
|
end
|
|
1483
1535
|
end
|
|
1484
1536
|
|
|
1485
|
-
if surface.outsideBoundaryCondition ==
|
|
1537
|
+
if surface.outsideBoundaryCondition == 'Outdoors' && surface.surfaceType == 'Wall' && surface_z_min == floor_vertices[0][0].z
|
|
1486
1538
|
|
|
1487
1539
|
##### Calculate the daylight_space depth in relation to the considered exterior wall.
|
|
1488
1540
|
##### To calculate daylight_space depth, first get the floor vertices which are on the opposite side of the considered exterior wall.
|
|
@@ -1496,8 +1548,8 @@ class NECB2011 < Standard
|
|
|
1496
1548
|
end
|
|
1497
1549
|
|
|
1498
1550
|
##### To calculate daylight_space depth, second calculate floor length on both sides: (1) exterior wall side, (2) on the opposite side of the exterior wall
|
|
1499
|
-
floor_width_wall_side = Math.sqrt((wall_vertices_x_on_floor[0] - wall_vertices_x_on_floor[1])
|
|
1500
|
-
floor_width_wall_opposite = Math.sqrt((floor_vertices_x_wall_opposite[0] - floor_vertices_x_wall_opposite[1])
|
|
1551
|
+
floor_width_wall_side = Math.sqrt((wall_vertices_x_on_floor[0] - wall_vertices_x_on_floor[1])**2 + (wall_vertices_y_on_floor[0] - wall_vertices_y_on_floor[1])**2)
|
|
1552
|
+
floor_width_wall_opposite = Math.sqrt((floor_vertices_x_wall_opposite[0] - floor_vertices_x_wall_opposite[1])**2 + (floor_vertices_y_wall_opposite[0] - floor_vertices_y_wall_opposite[1])**2)
|
|
1501
1553
|
|
|
1502
1554
|
##### Now, daylight_space depth can be calculated using the floor area and two lengths of the floor (note that these two lengths are in parallel to each other).
|
|
1503
1555
|
daylight_space_depth = 2 * floor_area / (floor_width_wall_side + floor_width_wall_opposite)
|
|
@@ -1505,7 +1557,7 @@ class NECB2011 < Standard
|
|
|
1505
1557
|
##### Loop through the windows (including fixed and operable ones) to get window specification (width, height, area, visible transmittance (VT)), and area-weighted VT
|
|
1506
1558
|
surface.subSurfaces.sort.each do |subsurface|
|
|
1507
1559
|
# puts subsurface.name.to_s
|
|
1508
|
-
if subsurface.subSurfaceType ==
|
|
1560
|
+
if subsurface.subSurfaceType == 'FixedWindow' || subsurface.subSurfaceType == 'OperableWindow'
|
|
1509
1561
|
window_vt = subsurface.visibleTransmittance
|
|
1510
1562
|
window_vt = window_vt.get
|
|
1511
1563
|
window_area = subsurface.netArea
|
|
@@ -1513,46 +1565,49 @@ class NECB2011 < Standard
|
|
|
1513
1565
|
area_weighted_vt_handle += window_area * window_vt
|
|
1514
1566
|
window_vertices = subsurface.vertices
|
|
1515
1567
|
if window_vertices[0].z.round(2) == window_vertices[1].z.round(2)
|
|
1516
|
-
window_width = Math.sqrt((window_vertices[0].x - window_vertices[1].x)
|
|
1568
|
+
window_width = Math.sqrt((window_vertices[0].x - window_vertices[1].x)**2.0 + (window_vertices[0].y - window_vertices[1].y)**2.0)
|
|
1517
1569
|
else
|
|
1518
|
-
window_width = Math.sqrt((window_vertices[1].x - window_vertices[2].x)
|
|
1570
|
+
window_width = Math.sqrt((window_vertices[1].x - window_vertices[2].x)**2.0 + (window_vertices[1].y - window_vertices[2].y)**2.0)
|
|
1519
1571
|
end
|
|
1520
1572
|
window_head_height = [window_vertices[0].z, window_vertices[1].z, window_vertices[2].z, window_vertices[3].z].max.round(2)
|
|
1521
|
-
primary_sidelighted_area_depth = [window_head_height, daylight_space_depth].min #as per NECB2011: 4.2.2.9.
|
|
1573
|
+
primary_sidelighted_area_depth = [window_head_height, daylight_space_depth].min # as per NECB2011: 4.2.2.9.
|
|
1522
1574
|
|
|
1523
1575
|
##### Calculate the distance of the window to vertical walls on each side of the window (this is used to determine the sidelighted area's width).
|
|
1524
1576
|
window_vertices_on_floor = []
|
|
1525
1577
|
window_vertices.each do |vertex|
|
|
1526
1578
|
window_vertices_on_floor << floor_surface.plane.project(vertex)
|
|
1527
1579
|
end
|
|
1528
|
-
window_wall_distance_side1 = [Math.sqrt((wall_vertices_x_on_floor[0] - window_vertices_on_floor[0].x)
|
|
1529
|
-
Math.sqrt((wall_vertices_x_on_floor[0] - window_vertices_on_floor[2].x)
|
|
1580
|
+
window_wall_distance_side1 = [Math.sqrt((wall_vertices_x_on_floor[0] - window_vertices_on_floor[0].x)**2.0 + (wall_vertices_y_on_floor[0] - window_vertices_on_floor[0].y)**2.0),
|
|
1581
|
+
Math.sqrt((wall_vertices_x_on_floor[0] - window_vertices_on_floor[2].x)**2.0 + (wall_vertices_y_on_floor[0] - window_vertices_on_floor[2].y)**2.0),
|
|
1530
1582
|
0.6].min # 0.6 m as per NECB2011: 4.2.2.9.
|
|
1531
|
-
window_wall_distance_side2 = [Math.sqrt((wall_vertices_x_on_floor[1] - window_vertices_on_floor[0].x)
|
|
1532
|
-
Math.sqrt((wall_vertices_x_on_floor[1] - window_vertices_on_floor[2].x)
|
|
1583
|
+
window_wall_distance_side2 = [Math.sqrt((wall_vertices_x_on_floor[1] - window_vertices_on_floor[0].x)**2.0 + (wall_vertices_y_on_floor[1] - window_vertices_on_floor[0].y)**2.0),
|
|
1584
|
+
Math.sqrt((wall_vertices_x_on_floor[1] - window_vertices_on_floor[2].x)**2.0 + (wall_vertices_y_on_floor[1] - window_vertices_on_floor[2].y)**2.0),
|
|
1533
1585
|
0.6].min # 0.6 m as per NECB2011: 4.2.2.9.
|
|
1534
1586
|
primary_sidelighted_area_width = window_wall_distance_side1 + window_width + window_wall_distance_side2
|
|
1535
|
-
primary_sidelighted_area
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
|
|
1539
|
-
|
|
1587
|
+
primary_sidelighted_area += primary_sidelighted_area_depth * primary_sidelighted_area_width
|
|
1588
|
+
# if subsurface.subSurfaceType == "FixedWindow" || subsurface.subSurfaceType == "OperableWindow"
|
|
1589
|
+
end
|
|
1590
|
+
# surface.subSurfaces.each do |subsurface|
|
|
1591
|
+
end
|
|
1592
|
+
# if surface.outsideBoundaryCondition == "Outdoors" && surface.surfaceType == "Wall" && surface_z_min == floor_vertices[0][0].z
|
|
1593
|
+
end
|
|
1594
|
+
# daylight_space.surfaces.each do |surface|
|
|
1595
|
+
end
|
|
1540
1596
|
|
|
1541
1597
|
return primary_sidelighted_area, area_weighted_vt_handle, window_area_sum
|
|
1542
1598
|
end
|
|
1543
1599
|
|
|
1544
1600
|
##### The below method is for the 'model_add_daylighting_controls' method
|
|
1545
1601
|
def get_parameters_skylight(daylight_space:, skylight_area_weighted_vt_handle:, skylight_area_sum:, daylighted_under_skylight_area:)
|
|
1546
|
-
|
|
1547
1602
|
daylight_space.surfaces.sort.each do |surface|
|
|
1548
1603
|
##### Get roof vertices
|
|
1549
|
-
if surface.outsideBoundaryCondition ==
|
|
1604
|
+
if surface.outsideBoundaryCondition == 'Outdoors' && surface.surfaceType == 'RoofCeiling'
|
|
1550
1605
|
roof_vertices = surface.vertices
|
|
1551
1606
|
end
|
|
1552
1607
|
|
|
1553
|
-
##### Loop through each
|
|
1608
|
+
##### Loop through each subsurface to calculate daylighted_area_under_skylights and skylight_effective_aperture for each daylight_space
|
|
1554
1609
|
surface.subSurfaces.sort.each do |subsurface|
|
|
1555
|
-
if subsurface.subSurfaceType ==
|
|
1610
|
+
if subsurface.subSurfaceType == 'Skylight'
|
|
1556
1611
|
skylight_vt = subsurface.visibleTransmittance
|
|
1557
1612
|
skylight_vt = skylight_vt.get
|
|
1558
1613
|
skylight_area = subsurface.netArea
|
|
@@ -1563,25 +1618,25 @@ class NECB2011 < Standard
|
|
|
1563
1618
|
skylight_vertices = subsurface.vertices
|
|
1564
1619
|
|
|
1565
1620
|
##### Calculate skylight width and height
|
|
1566
|
-
skylight_width = Math.sqrt((skylight_vertices[0].x - skylight_vertices[1].x)
|
|
1567
|
-
skylight_length = Math.sqrt((skylight_vertices[0].x - skylight_vertices[3].x)
|
|
1621
|
+
skylight_width = Math.sqrt((skylight_vertices[0].x - skylight_vertices[1].x)**2.0 + (skylight_vertices[0].y - skylight_vertices[1].y)**2.0)
|
|
1622
|
+
skylight_length = Math.sqrt((skylight_vertices[0].x - skylight_vertices[3].x)**2.0 + (skylight_vertices[0].y - skylight_vertices[3].y)**2.0)
|
|
1568
1623
|
|
|
1569
1624
|
##### Get ceiling height assuming the skylight is flush with the ceiling
|
|
1570
1625
|
ceiling_height = skylight_vertices[0].z
|
|
1571
1626
|
|
|
1572
1627
|
##### Calculate roof lengths
|
|
1573
1628
|
##### (Note: used OpenStudio BCL measure called "assign_ashrae_9012010_daylighting_controls" with some changes/correcctions)
|
|
1574
|
-
roof_length_0 = Math.sqrt((roof_vertices[0].x - roof_vertices[1].x)
|
|
1575
|
-
roof_length_1 = Math.sqrt((roof_vertices[1].x - roof_vertices[2].x)
|
|
1576
|
-
roof_length_2 = Math.sqrt((roof_vertices[2].x - roof_vertices[3].x)
|
|
1577
|
-
roof_length_3 = Math.sqrt((roof_vertices[3].x - roof_vertices[0].x)
|
|
1629
|
+
roof_length_0 = Math.sqrt((roof_vertices[0].x - roof_vertices[1].x)**2.0 + (roof_vertices[0].y - roof_vertices[1].y)**2.0)
|
|
1630
|
+
roof_length_1 = Math.sqrt((roof_vertices[1].x - roof_vertices[2].x)**2.0 + (roof_vertices[1].y - roof_vertices[2].y)**2.0)
|
|
1631
|
+
roof_length_2 = Math.sqrt((roof_vertices[2].x - roof_vertices[3].x)**2.0 + (roof_vertices[2].y - roof_vertices[3].y)**2.0)
|
|
1632
|
+
roof_length_3 = Math.sqrt((roof_vertices[3].x - roof_vertices[0].x)**2.0 + (roof_vertices[3].y - roof_vertices[0].y)**2.0)
|
|
1578
1633
|
|
|
1579
1634
|
##### Find the skylight point that is the closest one to roof_vertex_0
|
|
1580
1635
|
##### (Note: used OpenStudio BCL measure called "assign_ashrae_9012010_daylighting_controls" with some changes/correcctions)
|
|
1581
|
-
roof_vertex_0_skylight_vertex_0 = Math.sqrt((roof_vertices[0].x - skylight_vertices[0].x)
|
|
1582
|
-
roof_vertex_0_skylight_vertex_1 = Math.sqrt((roof_vertices[0].x - skylight_vertices[1].x)
|
|
1583
|
-
roof_vertex_0_skylight_vertex_2 = Math.sqrt((roof_vertices[0].x - skylight_vertices[2].x)
|
|
1584
|
-
roof_vertex_0_skylight_vertex_3 = Math.sqrt((roof_vertices[0].x - skylight_vertices[3].x)
|
|
1636
|
+
roof_vertex_0_skylight_vertex_0 = Math.sqrt((roof_vertices[0].x - skylight_vertices[0].x)**2.0 + (roof_vertices[0].y - skylight_vertices[0].y)**2.0)
|
|
1637
|
+
roof_vertex_0_skylight_vertex_1 = Math.sqrt((roof_vertices[0].x - skylight_vertices[1].x)**2.0 + (roof_vertices[0].y - skylight_vertices[1].y)**2.0)
|
|
1638
|
+
roof_vertex_0_skylight_vertex_2 = Math.sqrt((roof_vertices[0].x - skylight_vertices[2].x)**2.0 + (roof_vertices[0].y - skylight_vertices[2].y)**2.0)
|
|
1639
|
+
roof_vertex_0_skylight_vertex_3 = Math.sqrt((roof_vertices[0].x - skylight_vertices[3].x)**2.0 + (roof_vertices[0].y - skylight_vertices[3].y)**2.0)
|
|
1585
1640
|
roof_vertex_0_closest_distance = [roof_vertex_0_skylight_vertex_0, roof_vertex_0_skylight_vertex_1, roof_vertex_0_skylight_vertex_2, roof_vertex_0_skylight_vertex_3].min
|
|
1586
1641
|
if roof_vertex_0_closest_distance == roof_vertex_0_skylight_vertex_0
|
|
1587
1642
|
roof_vertex_0_closest_point = skylight_vertices[0]
|
|
@@ -1595,10 +1650,10 @@ class NECB2011 < Standard
|
|
|
1595
1650
|
|
|
1596
1651
|
##### Find the skylight point that is the closest one to roof_vertex_2
|
|
1597
1652
|
##### (Note: used OpenStudio BCL measure called "assign_ashrae_9012010_daylighting_controls" with some changes/correcctions)
|
|
1598
|
-
roof_vertex_2_skylight_vertex_0 = Math.sqrt((roof_vertices[2].x - skylight_vertices[0].x)
|
|
1599
|
-
roof_vertex_2_skylight_vertex_1 = Math.sqrt((roof_vertices[2].x - skylight_vertices[1].x)
|
|
1600
|
-
roof_vertex_2_skylight_vertex_2 = Math.sqrt((roof_vertices[2].x - skylight_vertices[2].x)
|
|
1601
|
-
roof_vertex_2_skylight_vertex_3 = Math.sqrt((roof_vertices[2].x - skylight_vertices[3].x)
|
|
1653
|
+
roof_vertex_2_skylight_vertex_0 = Math.sqrt((roof_vertices[2].x - skylight_vertices[0].x)**2.0 + (roof_vertices[2].y - skylight_vertices[0].y)**2.0)
|
|
1654
|
+
roof_vertex_2_skylight_vertex_1 = Math.sqrt((roof_vertices[2].x - skylight_vertices[1].x)**2.0 + (roof_vertices[2].y - skylight_vertices[1].y)**2.0)
|
|
1655
|
+
roof_vertex_2_skylight_vertex_2 = Math.sqrt((roof_vertices[2].x - skylight_vertices[2].x)**2.0 + (roof_vertices[2].y - skylight_vertices[2].y)**2.0)
|
|
1656
|
+
roof_vertex_2_skylight_vertex_3 = Math.sqrt((roof_vertices[2].x - skylight_vertices[3].x)**2.0 + (roof_vertices[2].y - skylight_vertices[3].y)**2.0)
|
|
1602
1657
|
roof_vertex_2_closest_distance = [roof_vertex_2_skylight_vertex_0, roof_vertex_2_skylight_vertex_1, roof_vertex_2_skylight_vertex_2, roof_vertex_2_skylight_vertex_3].min
|
|
1603
1658
|
if roof_vertex_2_closest_distance == roof_vertex_2_skylight_vertex_0
|
|
1604
1659
|
roof_vertex_2_closest_point = skylight_vertices[0]
|
|
@@ -1641,11 +1696,11 @@ class NECB2011 < Standard
|
|
|
1641
1696
|
|
|
1642
1697
|
##### As noted above, the width and length of the daylighted area under the skylight are re-calculated (as per NECB2011: 4.2.2.5.), if any exterior walls has window(s).
|
|
1643
1698
|
##### To this end, the window_head_height should be calculated, as below:
|
|
1644
|
-
daylight_space.surfaces.sort.each do |
|
|
1645
|
-
if
|
|
1699
|
+
daylight_space.surfaces.sort.each do |curr_surface|
|
|
1700
|
+
if curr_surface.outsideBoundaryCondition == 'Outdoors' && curr_surface.surfaceType == 'Wall'
|
|
1646
1701
|
wall_vertices_on_floor_x = []
|
|
1647
1702
|
wall_vertices_on_floor_y = []
|
|
1648
|
-
wall_vertices =
|
|
1703
|
+
wall_vertices = curr_surface.vertices
|
|
1649
1704
|
if wall_vertices[0].z == wall_vertices[1].z
|
|
1650
1705
|
wall_vertices_on_floor_x << wall_vertices[0].x
|
|
1651
1706
|
wall_vertices_on_floor_x << wall_vertices[1].x
|
|
@@ -1661,7 +1716,7 @@ class NECB2011 < Standard
|
|
|
1661
1716
|
window_head_height = [window_vertices[0].z, window_vertices[1].z, window_vertices[2].z, window_vertices[3].z].max.round(2)
|
|
1662
1717
|
|
|
1663
1718
|
##### Calculate the exterior wall length (on the floor)
|
|
1664
|
-
exterior_wall_length = Math.sqrt((wall_vertices_on_floor_x[0] - wall_vertices_on_floor_x[1])
|
|
1719
|
+
exterior_wall_length = Math.sqrt((wall_vertices_on_floor_x[0] - wall_vertices_on_floor_x[1])**2.0 + (wall_vertices_on_floor_y[0] - wall_vertices_on_floor_y[1])**2.0)
|
|
1665
1720
|
|
|
1666
1721
|
##### Calculate the vertical distance of skylight_vertices[0] projection onto the roof/floor to the exterior wall
|
|
1667
1722
|
skylight_vertex_0_triangle_area = 0.5 * (((wall_vertices_on_floor_x[0] - wall_vertices_on_floor_x[1]) * (wall_vertices_on_floor_y[0] - skylight_vertices[0].y)) -
|
|
@@ -1679,35 +1734,84 @@ class NECB2011 < Standard
|
|
|
1679
1734
|
skylight_vertex_3_distance = (2.0 * skylight_vertex_3_triangle_area) / exterior_wall_length
|
|
1680
1735
|
|
|
1681
1736
|
##### Loop through the subsurfaces that has exterior windows to re-calculate the width and length of the daylighted area under the skylight
|
|
1682
|
-
|
|
1683
|
-
if
|
|
1737
|
+
curr_surface.subSurfaces.sort.each do |curr_subsurface|
|
|
1738
|
+
if curr_subsurface.subSurfaceType == 'FixedWindow' || curr_subsurface.subSurfaceType == 'OperableWindow'
|
|
1684
1739
|
|
|
1685
|
-
if skylight_vertex_0_distance == skylight_vertex_1_distance #skylight_01 is in parellel to the exterior wall
|
|
1740
|
+
if skylight_vertex_0_distance == skylight_vertex_1_distance # skylight_01 is in parellel to the exterior wall
|
|
1686
1741
|
if skylight_vertex_0_distance.round(2) == distance_2.round(2)
|
|
1687
1742
|
daylighted_under_skylight_length = skylight_length + [0.7 * ceiling_height, distance_2, distance_2 - window_head_height].min + [0.7 * ceiling_height, distance_3].min
|
|
1688
1743
|
elsif skylight_vertex_0_distance.round(2) == distance_3.round(2)
|
|
1689
1744
|
daylighted_under_skylight_length = skylight_length + [0.7 * ceiling_height, distance_2].min + [0.7 * ceiling_height, distance_3, distance_3 - window_head_height].min
|
|
1690
1745
|
end
|
|
1691
|
-
elsif skylight_vertex_0_distance == skylight_vertex_3_distance #skylight_03 is in parellel to the exterior wall
|
|
1746
|
+
elsif skylight_vertex_0_distance == skylight_vertex_3_distance # skylight_03 is in parellel to the exterior wall
|
|
1692
1747
|
if skylight_vertex_0_distance.round(2) == distance_1.round(2)
|
|
1693
1748
|
daylighted_under_skylight_width = skylight_width + [0.7 * ceiling_height, distance_1, distance_1 - window_head_height].min + [0.7 * ceiling_height, distance_4].min
|
|
1694
1749
|
elsif skylight_vertex_0_distance.round(2) == distance_4.round(2)
|
|
1695
1750
|
daylighted_under_skylight_width = skylight_width + [0.7 * ceiling_height, distance_1].min + [0.7 * ceiling_height, distance_4, distance_4 - window_head_height].min
|
|
1696
1751
|
end
|
|
1697
|
-
|
|
1752
|
+
# if skylight_vertex_0_distance == skylight_vertex_1_distance
|
|
1753
|
+
end
|
|
1698
1754
|
|
|
1699
1755
|
daylighted_under_skylight_area += daylighted_under_skylight_length * daylighted_under_skylight_width
|
|
1756
|
+
# if subsurface.subSurfaceType == "FixedWindow" || subsurface.subSurfaceType == "OperableWindow"
|
|
1757
|
+
end
|
|
1758
|
+
# surface.subSurfaces.each do |subsurface|
|
|
1759
|
+
end
|
|
1760
|
+
# if surface.outsideBoundaryCondition == "Outdoors" && surface.surfaceType == "Wall"
|
|
1761
|
+
end
|
|
1762
|
+
# daylight_space.surfaces.each do |surface|
|
|
1763
|
+
end
|
|
1764
|
+
# if subsurface.subSurfaceType == "Skylight"
|
|
1765
|
+
end
|
|
1766
|
+
# surface.subSurfaces.each do |subsurface|
|
|
1767
|
+
end
|
|
1768
|
+
# daylight_space.surfaces.each do |surface|
|
|
1769
|
+
end
|
|
1700
1770
|
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
end #if surface.outsideBoundaryCondition == "Outdoors" && surface.surfaceType == "Wall"
|
|
1704
|
-
end #daylight_space.surfaces.each do |surface|
|
|
1771
|
+
return daylighted_under_skylight_area, skylight_area_weighted_vt_handle, skylight_area_sum
|
|
1772
|
+
end
|
|
1705
1773
|
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1774
|
+
def set_output_variables(model:,output_variables:)
|
|
1775
|
+
unless output_variables.nil? or output_variables.empty?
|
|
1776
|
+
output_variables.each do |output_variable|
|
|
1777
|
+
puts output_variable
|
|
1778
|
+
puts output_variable['frequency']
|
|
1779
|
+
raise("Frequency is not valid. Must by \"hourly\" or \"timestep\" but got #{output_variable}.") unless ["timestep","hourly",'daily','monthly','annual'].include?(output_variable['frequency'])
|
|
1780
|
+
output = OpenStudio::Model::OutputVariable.new(output_variable['variable'],model)
|
|
1781
|
+
output.setKeyValue(output_variable['key'])
|
|
1782
|
+
output.setReportingFrequency(output_variable['frequency'])
|
|
1783
|
+
end
|
|
1784
|
+
end
|
|
1785
|
+
return model
|
|
1786
|
+
end
|
|
1709
1787
|
|
|
1710
|
-
|
|
1788
|
+
def set_output_meters(model:,output_meters:)
|
|
1789
|
+
unless output_meters.nil? or output_meters.empty?
|
|
1790
|
+
# remove existing output meters
|
|
1791
|
+
existing_meters = model.getOutputMeters
|
|
1792
|
+
|
|
1793
|
+
# OpenStudio doesn't seemt to like two meters of the same name, even if they have different reporting frequencies.
|
|
1794
|
+
output_meters.each do |new_meter|
|
|
1795
|
+
#check if meter already exists
|
|
1796
|
+
result = existing_meters.select { |e_m| e_m.name == new_meter['name'] }
|
|
1797
|
+
puts("More and one output meter named #{new_meter['name']}") if result.size > 1
|
|
1798
|
+
if result.size >= 1
|
|
1799
|
+
existing_meter = result[0]
|
|
1800
|
+
puts("A meter named #{new_meter['name']} already exists. One will not be added to the model.")
|
|
1801
|
+
if existing_meter.reportingFrequency != new_meter['frequency']
|
|
1802
|
+
existing_meter.setReportingFrequency(new_meter['frequency'])
|
|
1803
|
+
puts("Changing reporting frequency of existing meter to #{new_meter['frequency']}.")
|
|
1804
|
+
end
|
|
1805
|
+
end
|
|
1806
|
+
if result.size == 0
|
|
1807
|
+
meter = OpenStudio::Model::OutputMeter.new(model)
|
|
1808
|
+
meter.setName(new_meter['name'])
|
|
1809
|
+
meter.setReportingFrequency(new_meter['frequency'])
|
|
1810
|
+
puts("Adding meter for #{meter.name} reporting #{new_meter['frequency']}")
|
|
1811
|
+
end
|
|
1812
|
+
end
|
|
1813
|
+
end
|
|
1814
|
+
return model
|
|
1711
1815
|
end
|
|
1712
1816
|
|
|
1713
|
-
end
|
|
1817
|
+
end
|