openstudio-standards 0.2.14 → 0.2.15.pre.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|