openstudio-standards 0.2.10 → 0.2.11.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/data/geometry/ASHRAE90120042007LargeHotel.osm +101 -0
- data/data/geometry/ASHRAE90120042007RetailStandalone.osm +220 -0
- data/data/geometry/ASHRAE9012010LargeHotel.osm +101 -0
- data/data/geometry/ASHRAE9012010RetailStandalone.osm +218 -32
- data/data/geometry/ASHRAE9012013FullServiceRestaurant.osm +17 -0
- data/data/geometry/ASHRAE9012013Hospital.osm +288 -0
- data/data/geometry/ASHRAE9012013LargeHotel.osm +113 -12
- data/data/geometry/ASHRAE9012013LargeOffice.osm +205 -1
- data/data/geometry/ASHRAE9012013MediumOffice.osm +103 -1
- data/data/geometry/ASHRAE9012013Outpatient.osm +390 -102
- data/data/geometry/ASHRAE9012013PrimarySchool.osm +424 -0
- data/data/geometry/ASHRAE9012013QuickServiceRestaurant.osm +16 -0
- data/data/geometry/ASHRAE9012013RetailStandalone.osm +220 -0
- data/data/geometry/ASHRAE9012013SecondarySchool.osm +543 -0
- data/data/geometry/ASHRAE9012013SmallHotel.osm +50 -0
- data/data/geometry/ASHRAE9012013SmallOffice.osm +33 -0
- data/data/geometry/ASHRAE9012013Warehouse.osm +475 -238
- data/data/geometry/ASHRAEFullServiceRestaurant.osm +16 -0
- data/data/geometry/ASHRAEHospital.osm +288 -0
- data/data/geometry/ASHRAELargeOffice.osm +205 -1
- data/data/geometry/ASHRAELargeOfficeDetailed.osm +32 -32
- data/data/geometry/ASHRAEMediumOffice.osm +103 -1
- data/data/geometry/ASHRAEOutpatient.osm +390 -102
- data/data/geometry/ASHRAEPrimarySchool.osm +424 -0
- data/data/geometry/ASHRAEQuickServiceRestaurant.osm +16 -0
- data/data/geometry/ASHRAESecondarySchool.osm +1011 -162
- data/data/geometry/ASHRAESmallHotel.osm +50 -0
- data/data/geometry/ASHRAESmallOffice.osm +33 -0
- data/data/geometry/ASHRAEWarehouse.osm +476 -238
- data/data/standards/manage_OpenStudio_Standards.rb +1 -1
- data/data/standards/openstudio_standards_duplicates_log.csv +16 -0
- data/data/standards/test_performance_expected_dd_results.csv +1216 -1216
- data/data/weather/ARE_Abu.Dhabi.412170_IWEC.ddy +536 -0
- data/data/weather/ARE_Abu.Dhabi.412170_IWEC.epw +8768 -0
- data/data/weather/ARE_Abu.Dhabi.412170_IWEC.stat +544 -0
- data/data/weather/ARE_Dubai.Intl.AP.411940_IWEC2.ddy +533 -0
- data/data/weather/ARE_Dubai.Intl.AP.411940_IWEC2.epw +8768 -0
- data/data/weather/ARE_Dubai.Intl.AP.411940_IWEC2.stat +553 -0
- data/data/weather/VNM_Hanoi.488200_IWEC.ddy +533 -0
- data/data/weather/VNM_Hanoi.488200_IWEC.epw +8768 -0
- data/data/weather/VNM_Hanoi.488200_IWEC.stat +544 -0
- data/data/weather/VNM_Ho.Chi.Minh.City-Tan.Son.Nhat.AP.489000_IWEC2.ddy +533 -0
- data/data/weather/VNM_Ho.Chi.Minh.City-Tan.Son.Nhat.AP.489000_IWEC2.epw +8768 -0
- data/data/weather/VNM_Ho.Chi.Minh.City-Tan.Son.Nhat.AP.489000_IWEC2.stat +546 -0
- data/lib/openstudio-standards.rb +27 -0
- data/lib/openstudio-standards/btap/btap.model.rb +4 -4
- data/lib/openstudio-standards/btap/btap_result.rb +8 -8
- data/lib/openstudio-standards/btap/economics.rb +11 -11
- data/lib/openstudio-standards/btap/envelope.rb +5 -5
- data/lib/openstudio-standards/btap/hvac.rb +55 -11
- data/lib/openstudio-standards/btap/measures.rb +7 -7
- data/lib/openstudio-standards/btap/spaceloads.rb +4 -4
- data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVAC.rb +105 -1
- data/lib/openstudio-standards/hvac_sizing/Siz.ControllerOutdoorAir.rb +2 -2
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +0 -8
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +0 -8
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +0 -8
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +0 -8
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +6 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.HeatExchangerAirToAirSensibleAndLatent.rb +9 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +3 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +22 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanConstantVolume.rb +32 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanOnOff.rb +33 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +32 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerAirToAirSensibleAndLatent.rb +9 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.elevators.rb +25 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +35 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.hvac_systems.rb +11 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +17 -3
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +22 -3
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +107 -5
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +9 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +0 -8
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +2 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +15 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +45 -5
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +21 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +251 -364
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +4 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +4 -5
- data/lib/openstudio-standards/refs/references.rb +4 -0
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +283 -97
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.BuildingStory.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +5 -5
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +3 -1
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Construction.rb +53 -45
- data/lib/openstudio-standards/standards/Standards.Fan.rb +10 -2
- data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +4 -4
- data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Model.rb +39 -18
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +8 -8
- data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +12 -12
- data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.Space.rb +190 -181
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +36 -59
- data/lib/openstudio-standards/standards/Standards.SubSurface.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.Surface.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +16 -12
- data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +16 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +159 -8
- 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 +1354 -1075
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +557 -17
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +28 -28
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ground_temperatures.json +36 -36
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +233 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +159 -8
- 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 +1356 -1077
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +480 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +28 -28
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ground_temperatures.json +36 -36
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +241 -14
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +12 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +159 -8
- 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 +1367 -1087
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +480 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ground_temperatures.json +36 -36
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +233 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +20 -27
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +8 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +159 -8
- 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 +1432 -1138
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +480 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ground_temperatures.json +36 -36
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +241 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.climate_zone_sets.json +37 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.climate_zones.json +39 -15
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +489 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +250 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.fans.json +12 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.materials.json +1920 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +5265 -9
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +159 -8
- 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 +2441 -1925
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.construction_properties.json +16658 -2578
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +212 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +11 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +159 -8
- 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 +2403 -1889
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.construction_properties.json +16664 -2584
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +209 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +11 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.construction_properties.json +4113 -513
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.construction_sets.json +40 -40
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.elevators.json +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.ground_temperatures.json +650 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.heat_pumps.json +90 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.heat_pumps_heating.json +25 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +1909 -32
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.water_heaters.json +8 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +147 -155
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +29 -10
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +45 -73
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.ZoneHVACComponent.rb +4 -72
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.boilers.json +20 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.chillers.json +400 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.construction_properties.json +4444 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.construction_sets.json +391 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.economizers.json +536 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.elevators.json +36 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.ext_ltg.json +169 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.ground_temperatures.json +650 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.heat_pumps.json +290 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.heat_pumps_heating.json +164 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.heat_rejection.json +40 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.motors.json +274 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.prototype_inputs.json +704 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.refrigeration_compressors.json +22 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +6424 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.unitary_acs.json +142 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.water_heaters.json +72 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.water_source_heat_pumps.json +31 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.water_source_heat_pumps_heating.json +13 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +829 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +24 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTower.rb +19 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerSingleSpeed.rb +5 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerTwoSpeed.rb +5 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +16 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +37 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +34 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +80 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +68 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +146 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ThermalZone.rb +23 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ZoneHVACComponent.rb +8 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.rb +16 -0
- data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.economizers.json +18 -0
- data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.heat_pumps_heating.json +1 -1
- data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.heat_pumps_heating.json +5 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +5 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +5 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +5 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +8 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +12 -12
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/Weather.Model.rb +4 -0
- metadata +102 -18
- data/data/standards/OpenStudio_Standards-ashrae_90_1(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
- data/data/standards/OpenStudio_Standards-cbes(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-cbes.xlsx +0 -0
- data/data/standards/OpenStudio_Standards-deer(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-deer-ALL-comstock(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-deer.xlsx +0 -0
- data/data/standards/OpenStudio_Standards_LA100.xlsx +0 -0
- data/data/standards/junk/legacy_dd_results - Copy.csv +0 -960
- data/data/standards/junk/legacy_dd_results.csv +0 -960
- data/data/standards/junk/legacy_dd_results_new - Copy.csv +0 -960
- data/data/standards/junk/legacy_dd_results_new.csv +0 -960
- data/data/standards/junk/legacy_dd_results_original.csv +0 -960
- data/lib/openstudio-standards/standards/necb/NECB2011/newway.json +0 -8102
@@ -44,7 +44,7 @@ class Standard
|
|
44
44
|
standards_info = construction.standardsInformation
|
45
45
|
surf_type = standards_info.intendedSurfaceType
|
46
46
|
if surf_type.empty?
|
47
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
47
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlanarSurface', "Could not determine the intended surface type for #{planar_surface.name} from #{construction.name}. This surface will not have the standard applied.")
|
48
48
|
return previous_construction_map
|
49
49
|
end
|
50
50
|
surf_type = surf_type.get
|
@@ -65,11 +65,11 @@ class Standard
|
|
65
65
|
when 'Non-Metal Framing'
|
66
66
|
stds_type = 'Nonmetal framing (all)'
|
67
67
|
else
|
68
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
68
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlanarSurface', "The standards fenestration frame type #{stds_type} cannot be used on #{surf_type} in #{planar_surface.name}. This surface will not have the standard applied.")
|
69
69
|
return previous_construction_map
|
70
70
|
end
|
71
71
|
else
|
72
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
72
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlanarSurface', "Could not determine the standards fenestration frame type for #{planar_surface.name} from #{construction.name}. This surface will not have the standard applied.")
|
73
73
|
return previous_construction_map
|
74
74
|
end
|
75
75
|
# Skylights
|
@@ -85,11 +85,11 @@ class Standard
|
|
85
85
|
when 'Plastic Skylight without Curb', 'Glass Skylight without Curb'
|
86
86
|
stds_type = 'Without Curb'
|
87
87
|
else
|
88
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
88
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlanarSurface', "The standards fenestration type #{stds_type} cannot be used on #{surf_type} in #{planar_surface.name}. This surface will not have the standard applied.")
|
89
89
|
return previous_construction_map
|
90
90
|
end
|
91
91
|
else
|
92
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
92
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlanarSurface', "Could not determine the standards fenestration type for #{planar_surface.name} from #{construction.name}. This surface will not have the standard applied.")
|
93
93
|
return previous_construction_map
|
94
94
|
end
|
95
95
|
# All other surface types
|
@@ -98,7 +98,7 @@ class Standard
|
|
98
98
|
if stds_type.is_initialized
|
99
99
|
stds_type = stds_type.get
|
100
100
|
else
|
101
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
101
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlanarSurface', "Could not determine the standards construction type for #{planar_surface.name}. This surface will not have the standard applied.")
|
102
102
|
return previous_construction_map
|
103
103
|
end
|
104
104
|
end
|
@@ -123,9 +123,9 @@ class Standard
|
|
123
123
|
# Assign the new construction to the surface
|
124
124
|
if new_construction
|
125
125
|
planar_surface.setConstruction(new_construction)
|
126
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
126
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.PlanarSurface', "Set the construction for #{planar_surface.name} to #{new_construction.name}.")
|
127
127
|
else
|
128
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
128
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlanarSurface', "Could not generate a standard construction for #{planar_surface.name}.")
|
129
129
|
return previous_construction_map
|
130
130
|
end
|
131
131
|
|
@@ -519,7 +519,7 @@ class Standard
|
|
519
519
|
elsif chiller.autosizedReferenceCapacity.is_initialized
|
520
520
|
total_cooling_capacity_w += chiller.autosizedReferenceCapacity.get
|
521
521
|
else
|
522
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.
|
522
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlantLoop', "For #{plant_loop.name} capacity of #{chiller.name} is not available, total cooling capacity of plant loop will be incorrect when applying standard.")
|
523
523
|
end
|
524
524
|
# DistrictCooling
|
525
525
|
elsif sc.to_DistrictCooling.is_initialized
|
@@ -535,7 +535,7 @@ class Standard
|
|
535
535
|
end
|
536
536
|
|
537
537
|
total_cooling_capacity_tons = OpenStudio.convert(total_cooling_capacity_w, 'W', 'ton').get
|
538
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.
|
538
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.PlantLoop', "For #{plant_loop.name}, cooling capacity is #{total_cooling_capacity_tons.round} tons of refrigeration.")
|
539
539
|
|
540
540
|
return total_cooling_capacity_w
|
541
541
|
end
|
@@ -661,7 +661,7 @@ class Standard
|
|
661
661
|
end
|
662
662
|
area_served_ft2 = OpenStudio.convert(area_served_m2, 'm^2', 'ft^2').get
|
663
663
|
|
664
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.
|
664
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.PlantLoop', "For #{plant_loop.name}, serves #{area_served_ft2.round} ft^2.")
|
665
665
|
|
666
666
|
return area_served_m2
|
667
667
|
end
|
@@ -720,11 +720,11 @@ class Standard
|
|
720
720
|
|
721
721
|
# Report out the pumping type
|
722
722
|
unless pri_control_type.nil?
|
723
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.
|
723
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.PlantLoop', "For #{plant_loop.name}, primary pump type is #{pri_control_type}.")
|
724
724
|
end
|
725
725
|
|
726
726
|
unless sec_control_type.nil?
|
727
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.
|
727
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.PlantLoop', "For #{plant_loop.name}, secondary pump type is #{sec_control_type}.")
|
728
728
|
end
|
729
729
|
|
730
730
|
# Modify all the primary pumps
|
@@ -778,7 +778,7 @@ class Standard
|
|
778
778
|
|
779
779
|
# Report out the pumping type
|
780
780
|
unless control_type.nil?
|
781
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.
|
781
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.PlantLoop', "For #{plant_loop.name}, pump type is #{control_type}.")
|
782
782
|
end
|
783
783
|
|
784
784
|
return true
|
@@ -791,7 +791,7 @@ class Standard
|
|
791
791
|
|
792
792
|
# Report out the pumping type
|
793
793
|
unless control_type.nil?
|
794
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.
|
794
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.PlantLoop', "For #{plant_loop.name}, pump type is #{control_type}.")
|
795
795
|
end
|
796
796
|
|
797
797
|
# Modify all primary pumps
|
@@ -1164,12 +1164,12 @@ class Standard
|
|
1164
1164
|
if component.to_PumpConstantSpeed.is_initialized
|
1165
1165
|
pump = component.to_PumpConstantSpeed.get
|
1166
1166
|
pump_rated_w_per_gpm = pump_rated_w_per_gpm(pump)
|
1167
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.
|
1167
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.PlantLoop', "'#{loop_type}' Loop #{plant_loop.name} - Primary (Supply) Constant Speed Pump '#{pump.name}' - pump_rated_w_per_gpm #{pump_rated_w_per_gpm} W/GPM")
|
1168
1168
|
supply_w_per_gpm += pump_rated_w_per_gpm
|
1169
1169
|
elsif component.to_PumpVariableSpeed.is_initialized
|
1170
1170
|
pump = component.to_PumpVariableSpeed.get
|
1171
1171
|
pump_rated_w_per_gpm = pump_rated_w_per_gpm(pump)
|
1172
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.
|
1172
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.PlantLoop', "'#{loop_type}' Loop #{plant_loop.name} - Primary (Supply) VSD Pump '#{pump.name}' - pump_rated_w_per_gpm #{pump_rated_w_per_gpm} W/GPM")
|
1173
1173
|
supply_w_per_gpm += pump_rated_w_per_gpm
|
1174
1174
|
end
|
1175
1175
|
end
|
@@ -1181,19 +1181,19 @@ class Standard
|
|
1181
1181
|
if component.to_PumpConstantSpeed.is_initialized
|
1182
1182
|
pump = component.to_PumpConstantSpeed.get
|
1183
1183
|
pump_rated_w_per_gpm = pump_rated_w_per_gpm(pump)
|
1184
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.
|
1184
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.PlantLoop', "'#{loop_type}' Loop #{plant_loop.name} - Secondary (Demand) Constant Speed Pump '#{pump.name}' - pump_rated_w_per_gpm #{pump_rated_w_per_gpm} W/GPM")
|
1185
1185
|
demand_w_per_gpm += pump_rated_w_per_gpm
|
1186
1186
|
elsif component.to_PumpVariableSpeed.is_initialized
|
1187
1187
|
pump = component.to_PumpVariableSpeed.get
|
1188
1188
|
pump_rated_w_per_gpm = pump_rated_w_per_gpm(pump)
|
1189
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.
|
1189
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.PlantLoop', "'#{loop_type}' Loop #{plant_loop.name} - Secondary (Demand) VSD Pump '#{pump.name}' - pump_rated_w_per_gpm #{pump_rated_w_per_gpm} W/GPM")
|
1190
1190
|
demand_w_per_gpm += pump_rated_w_per_gpm
|
1191
1191
|
end
|
1192
1192
|
end
|
1193
1193
|
|
1194
1194
|
total_rated_w_per_gpm = supply_w_per_gpm + demand_w_per_gpm
|
1195
1195
|
|
1196
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.
|
1196
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.PlantLoop', "'#{loop_type}' Loop #{plant_loop.name} - Total #{total_rated_w_per_gpm} W/GPM - Supply #{supply_w_per_gpm} W/GPM - Demand #{demand_w_per_gpm} W/GPM")
|
1197
1197
|
|
1198
1198
|
return total_rated_w_per_gpm
|
1199
1199
|
end
|
@@ -9,7 +9,7 @@ class Standard
|
|
9
9
|
# @author Andrew Parker, NREL
|
10
10
|
# return [Double] The total number of full load hours for this schedule
|
11
11
|
def schedule_constant_annual_equivalent_full_load_hrs(schedule_constant)
|
12
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.
|
12
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.ScheduleConstant', "Calculating total annual EFLH for schedule: #{schedule_constant.name}")
|
13
13
|
|
14
14
|
return annual_flh = schedule_constant.value * 8760
|
15
15
|
end
|
@@ -431,7 +431,7 @@ class Standard
|
|
431
431
|
sch_day.remove # remove day schedule for this rule
|
432
432
|
rule.remove # remove the rule
|
433
433
|
elsif !sch_day.additionalProperties.hasFeature("param_day_profile")
|
434
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ScheduleRuleset', "#{schedule.name} doesn't have a parametric
|
434
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ScheduleRuleset', "#{schedule.name} doesn't have a parametric formula for #{rule.name} This profile will not be altered.")
|
435
435
|
next
|
436
436
|
else
|
437
437
|
profiles[sch_day] = rule
|
@@ -791,7 +791,7 @@ class Standard
|
|
791
791
|
|
792
792
|
# issue warning if order was changed
|
793
793
|
if throw_order_warning
|
794
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ScheduleRuleset', "Pre-interpolated processed hash for #{sch_day.name} has one or more out of order conflicts: #{pre_fix_time_value_pairs}. Time values were
|
794
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ScheduleRuleset', "Pre-interpolated processed hash for #{sch_day.name} has one or more out of order conflicts: #{pre_fix_time_value_pairs}. Time values were adjusted as shown to crate a valid profile: #{time_value_pairs}")
|
795
795
|
end
|
796
796
|
|
797
797
|
# add interpolated values at ramp_frequency
|
@@ -19,7 +19,7 @@ class Standard
|
|
19
19
|
def space_daylighted_areas(space, draw_daylight_areas_for_debugging = false)
|
20
20
|
### Begin the actual daylight area calculations ###
|
21
21
|
|
22
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
22
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "For #{space.name}, calculating daylighted areas.")
|
23
23
|
|
24
24
|
result = { 'toplighted_area' => 0.0,
|
25
25
|
'primary_sidelighted_area' => 0.0,
|
@@ -96,7 +96,7 @@ class Standard
|
|
96
96
|
|
97
97
|
# Make sure there is one floor surface
|
98
98
|
if floor_surface.nil?
|
99
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
99
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "Could not find a floor in space #{space.name}, cannot determine daylighted areas.")
|
100
100
|
return result
|
101
101
|
end
|
102
102
|
|
@@ -113,7 +113,7 @@ class Standard
|
|
113
113
|
surface_normal_z = surface_normal.z
|
114
114
|
unless surface_normal_z.abs < 0.001
|
115
115
|
unless surface.subSurfaces.empty?
|
116
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
116
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "Cannot currently handle non-vertical walls; skipping windows on #{surface.name} in #{space.name}.")
|
117
117
|
next
|
118
118
|
end
|
119
119
|
end
|
@@ -121,7 +121,7 @@ class Standard
|
|
121
121
|
surface.subSurfaces.sort.each do |sub_surface|
|
122
122
|
next unless sub_surface.outsideBoundaryCondition == 'Outdoors' && (sub_surface.subSurfaceType == 'FixedWindow' || sub_surface.subSurfaceType == 'OperableWindow' || sub_surface.subSurfaceType == 'GlassDoor')
|
123
123
|
|
124
|
-
# OpenStudio::logFree(OpenStudio::Debug, "openstudio.
|
124
|
+
# OpenStudio::logFree(OpenStudio::Debug, "openstudio.standards.Space", "***#{sub_surface.name}***"
|
125
125
|
total_window_area += sub_surface.netArea
|
126
126
|
|
127
127
|
# Find the head height and sill height of the window
|
@@ -132,12 +132,12 @@ class Standard
|
|
132
132
|
end
|
133
133
|
sill_height_m = vertex_heights_above_floor.min
|
134
134
|
head_height_m = vertex_heights_above_floor.max
|
135
|
-
# OpenStudio::logFree(OpenStudio::Debug, "openstudio.
|
135
|
+
# OpenStudio::logFree(OpenStudio::Debug, "openstudio.standards.Space", "head height = #{head_height_m.round(2)}m, sill height = #{sill_height_m.round(2)}m")
|
136
136
|
|
137
137
|
# Find the width of the window
|
138
138
|
rot_origin = nil
|
139
139
|
unless sub_surface.vertices.size == 4
|
140
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
140
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "A sub-surface in space #{space.name} has other than 4 vertices; this sub-surface will not be included in the daylighted area calculation.")
|
141
141
|
next
|
142
142
|
end
|
143
143
|
prev_vertex_on_floorplane = nil
|
@@ -163,7 +163,7 @@ class Standard
|
|
163
163
|
elsif width_method == 'fixed'
|
164
164
|
extra_width_m = OpenStudio.convert(2, 'ft', 'm').get
|
165
165
|
end
|
166
|
-
# OpenStudio::logFree(OpenStudio::Debug, "openstudio.
|
166
|
+
# OpenStudio::logFree(OpenStudio::Debug, "openstudio.standards.Space", "Adding #{extra_width_m.round(2)}m to the width for the sidelighted area.")
|
167
167
|
|
168
168
|
# Align the vertices with face coordinate system
|
169
169
|
face_transform = OpenStudio::Transformation.alignFace(sub_surface.vertices)
|
@@ -182,7 +182,7 @@ class Standard
|
|
182
182
|
max_x_val = vertex.x
|
183
183
|
end
|
184
184
|
end
|
185
|
-
# OpenStudio::logFree(OpenStudio::Debug, "openstudio.
|
185
|
+
# OpenStudio::logFree(OpenStudio::Debug, "openstudio.standards.Space", "min_x_val = #{min_x_val.round(2)}, max_x_val = #{max_x_val.round(2)}")
|
186
186
|
|
187
187
|
# Create polygons that are adjusted
|
188
188
|
# to expand from the window shape to the sidelighteded areas.
|
@@ -197,7 +197,7 @@ class Standard
|
|
197
197
|
new_x = vertex.x + extra_width_m
|
198
198
|
else
|
199
199
|
new_x = 99.9
|
200
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
200
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "A window in space #{space.name} is non-rectangular; this sub-surface will not be included in the primary daylighted area calculation. #{vertex.x} != #{min_x_val} or #{max_x_val}")
|
201
201
|
end
|
202
202
|
|
203
203
|
# Zero-out the y for the bottom edge because the
|
@@ -214,7 +214,7 @@ class Standard
|
|
214
214
|
# Make the new vertex
|
215
215
|
new_vertex = OpenStudio::Point3d.new(new_x, new_y, new_z)
|
216
216
|
pri_sidelit_sub_polygon << new_vertex
|
217
|
-
# OpenStudio::logFree(OpenStudio::Info, "openstudio.
|
217
|
+
# OpenStudio::logFree(OpenStudio::Info, "openstudio.standards.Space", "#{vertex.x.round(2)}, #{vertex.y.round(2)}, #{vertex.z.round(2)} to #{new_vertex.x.round(2)}, #{new_vertex.y.round(2)}, #{new_vertex.z.round(2)}")
|
218
218
|
|
219
219
|
# Secondary sidelighted area
|
220
220
|
# Move the x vertices outward by the specified amount.
|
@@ -224,7 +224,7 @@ class Standard
|
|
224
224
|
new_x = vertex.x + extra_width_m
|
225
225
|
else
|
226
226
|
new_x = 99.9
|
227
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
227
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "A window in space #{space.name} is non-rectangular; this sub-surface will not be included in the secondary daylighted area calculation.")
|
228
228
|
end
|
229
229
|
|
230
230
|
# Add the head height of the window to all points
|
@@ -271,8 +271,8 @@ class Standard
|
|
271
271
|
straight_upward = OpenStudio::Vector3d.new(0, 0, 1)
|
272
272
|
unless surface_normal.to_s == straight_upward.to_s
|
273
273
|
unless surface.subSurfaces.empty?
|
274
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
275
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
274
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "Cannot currently handle non-horizontal roofs; skipping skylights on #{surface.name} in #{space.name}.")
|
275
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---Surface #{surface.name} has outward normal of #{surface_normal.to_s.gsub(/\[|\]/, '|')}; up is #{straight_upward.to_s.gsub(/\[|\]/, '|')}.")
|
276
276
|
next
|
277
277
|
end
|
278
278
|
end
|
@@ -280,7 +280,7 @@ class Standard
|
|
280
280
|
surface.subSurfaces.sort.each do |sub_surface|
|
281
281
|
next unless sub_surface.outsideBoundaryCondition == 'Outdoors' && sub_surface.subSurfaceType == 'Skylight'
|
282
282
|
|
283
|
-
# OpenStudio::logFree(OpenStudio::Debug, "openstudio.
|
283
|
+
# OpenStudio::logFree(OpenStudio::Debug, "openstudio.standards.Space", "***#{sub_surface.name}***")
|
284
284
|
total_skylight_area += sub_surface.netArea
|
285
285
|
|
286
286
|
# Project the skylight onto the floor plane
|
@@ -338,7 +338,7 @@ class Standard
|
|
338
338
|
new_x = vertex.x + additional_extent_m
|
339
339
|
else
|
340
340
|
new_x = 99.9
|
341
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
341
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "A skylight in space #{space.name} is non-rectangular; this sub-surface will not be included in the daylighted area calculation.")
|
342
342
|
end
|
343
343
|
|
344
344
|
# Move the y vertices outward by the specified amount.
|
@@ -348,7 +348,7 @@ class Standard
|
|
348
348
|
new_y = vertex.y + additional_extent_m
|
349
349
|
else
|
350
350
|
new_y = 99.9
|
351
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
351
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "A skylight in space #{space.name} is non-rectangular; this sub-surface will not be included in the daylighted area calculation.")
|
352
352
|
end
|
353
353
|
|
354
354
|
# Set z = 0 so that intersection works.
|
@@ -384,7 +384,7 @@ class Standard
|
|
384
384
|
space_check_z_zero(space, sec_sidelit_polygons, 'sec_sidelit_polygons')
|
385
385
|
|
386
386
|
# Join, then subtract
|
387
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
387
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', '***Joining polygons***')
|
388
388
|
|
389
389
|
# Join toplighted polygons into a single set
|
390
390
|
combined_toplit_polygons = space_join_polygons(space, toplit_polygons, 0.01, 'toplit_polygons')
|
@@ -405,7 +405,7 @@ class Standard
|
|
405
405
|
space_check_z_zero(space, combined_sec_sidelit_polygons, 'combined_sec_sidelit_polygons')
|
406
406
|
|
407
407
|
# Make a new surface for each of the resulting polygons to visually inspect it
|
408
|
-
# OpenStudio::logFree(OpenStudio::Debug, "openstudio.
|
408
|
+
# OpenStudio::logFree(OpenStudio::Debug, "openstudio.standards.Space", "***Making Surfaces to view in SketchUp***")
|
409
409
|
|
410
410
|
# combined_toplit_polygons.each do |polygon|
|
411
411
|
# dummy_space = OpenStudio::Model::Space.new(model)
|
@@ -443,7 +443,7 @@ class Standard
|
|
443
443
|
# daylt_surf.setName("Flr")
|
444
444
|
# end
|
445
445
|
|
446
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
446
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', '***Subtracting overlapping areas***')
|
447
447
|
|
448
448
|
# Subtract lower-priority daylighting areas from higher priority ones
|
449
449
|
pri_minus_top_polygons = space_a_polygons_minus_b_polygons(space, combined_pri_sidelit_polygons, combined_toplit_polygons, 'combined_pri_sidelit_polygons', 'combined_toplit_polygons')
|
@@ -466,7 +466,7 @@ class Standard
|
|
466
466
|
sec_minus_top_minus_pri_polygons_at_floor = space_polygons_set_z(space, sec_minus_top_minus_pri_polygons, floor_z)
|
467
467
|
combined_floor_polygons_at_floor = space_polygons_set_z(space, combined_floor_polygons, floor_z)
|
468
468
|
|
469
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
469
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', '***Making Surfaces to view in SketchUp***')
|
470
470
|
dummy_space = OpenStudio::Model::Space.new(space.model)
|
471
471
|
|
472
472
|
combined_toplit_polygons_at_floor.each do |polygon|
|
@@ -506,12 +506,12 @@ class Standard
|
|
506
506
|
end
|
507
507
|
end
|
508
508
|
|
509
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
509
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', '***Calculating Daylighted Areas***')
|
510
510
|
|
511
511
|
# Get the total floor area
|
512
512
|
total_floor_area_m2 = space_total_area_of_polygons(space, combined_floor_polygons)
|
513
513
|
total_floor_area_ft2 = OpenStudio.convert(total_floor_area_m2, 'm^2', 'ft^2').get
|
514
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
514
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "total_floor_area_ft2 = #{total_floor_area_ft2.round(1)}")
|
515
515
|
|
516
516
|
# Toplighted area
|
517
517
|
toplighted_area_m2 = space_area_a_polygons_overlap_b_polygons(space, combined_toplit_polygons, combined_floor_polygons, 'combined_toplit_polygons', 'combined_floor_polygons')
|
@@ -527,9 +527,9 @@ class Standard
|
|
527
527
|
primary_sidelighted_area_ft2 = OpenStudio.convert(primary_sidelighted_area_m2, 'm^2', 'ft^2').get
|
528
528
|
secondary_sidelighted_area_ft2 = OpenStudio.convert(secondary_sidelighted_area_m2, 'm^2', 'ft^2').get
|
529
529
|
|
530
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
531
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
532
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
530
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "toplighted_area_ft2 = #{toplighted_area_ft2.round(1)}")
|
531
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "primary_sidelighted_area_ft2 = #{primary_sidelighted_area_ft2.round(1)}")
|
532
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "secondary_sidelighted_area_ft2 = #{secondary_sidelighted_area_ft2.round(1)}")
|
533
533
|
|
534
534
|
result['toplighted_area'] = toplighted_area_m2
|
535
535
|
result['primary_sidelighted_area'] = primary_sidelighted_area_m2
|
@@ -581,63 +581,67 @@ class Standard
|
|
581
581
|
construction_name = nil
|
582
582
|
construction = sub_surface.construction
|
583
583
|
if construction.is_initialized
|
584
|
-
|
584
|
+
construction = construction.get
|
585
|
+
construction_name = construction.name.get.upcase
|
585
586
|
else
|
586
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
587
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "For #{space.name}, could not determine construction for #{sub_surface.name}, will not be included in space_sidelighting_effective_aperture(space) calculation.")
|
587
588
|
next
|
588
589
|
end
|
589
590
|
|
590
591
|
# Store VT for this construction in map if not already looked up
|
591
592
|
if construction_name_to_vt_map[construction_name].nil?
|
592
593
|
|
593
|
-
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
|
604
|
-
|
605
|
-
|
606
|
-
|
607
|
-
|
608
|
-
|
594
|
+
# Get the VT from construction (Simple Glazing) if available
|
595
|
+
if construction.visibleTransmittance.is_initialized
|
596
|
+
construction_name_to_vt_map[construction_name] = construction.visibleTransmittance.get
|
597
|
+
else
|
598
|
+
# get the VT from the sql file
|
599
|
+
sql = space.model.sqlFile
|
600
|
+
if sql.is_initialized
|
601
|
+
sql = sql.get
|
602
|
+
|
603
|
+
row_query = "SELECT RowName
|
604
|
+
FROM tabulardatawithstrings
|
605
|
+
WHERE ReportName='EnvelopeSummary'
|
606
|
+
AND ReportForString='Entire Facility'
|
607
|
+
AND TableName='Exterior Fenestration'
|
608
|
+
AND Value='#{construction_name.upcase}'"
|
609
|
+
|
610
|
+
row_id = sql.execAndReturnFirstString(row_query)
|
611
|
+
|
612
|
+
if row_id.is_initialized
|
613
|
+
row_id = row_id.get
|
614
|
+
else
|
615
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Model', "VT row ID not found for construction: #{construction_name}, #{sub_surface.name} will not be included in space_sidelighting_effective_aperture(space) calculation.")
|
616
|
+
row_id = 9999
|
617
|
+
end
|
618
|
+
|
619
|
+
vt_query = "SELECT Value
|
620
|
+
FROM tabulardatawithstrings
|
621
|
+
WHERE ReportName='EnvelopeSummary'
|
622
|
+
AND ReportForString='Entire Facility'
|
623
|
+
AND TableName='Exterior Fenestration'
|
624
|
+
AND ColumnName='Glass Visible Transmittance'
|
625
|
+
AND RowName='#{row_id}'"
|
626
|
+
|
627
|
+
vt = sql.execAndReturnFirstDouble(vt_query)
|
628
|
+
|
629
|
+
vt = if vt.is_initialized
|
630
|
+
vt.get
|
631
|
+
end
|
632
|
+
|
633
|
+
# Record the VT
|
634
|
+
construction_name_to_vt_map[construction_name] = vt
|
609
635
|
else
|
610
|
-
OpenStudio.logFree(OpenStudio::
|
611
|
-
row_id = 9999
|
636
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Space', 'Model has no sql file containing results, cannot lookup data.')
|
612
637
|
end
|
613
|
-
|
614
|
-
vt_query = "SELECT Value
|
615
|
-
FROM tabulardatawithstrings
|
616
|
-
WHERE ReportName='EnvelopeSummary'
|
617
|
-
AND ReportForString='Entire Facility'
|
618
|
-
AND TableName='Exterior Fenestration'
|
619
|
-
AND ColumnName='Glass Visible Transmittance'
|
620
|
-
AND RowName='#{row_id}'"
|
621
|
-
|
622
|
-
vt = sql.execAndReturnFirstDouble(vt_query)
|
623
|
-
|
624
|
-
vt = if vt.is_initialized
|
625
|
-
vt.get
|
626
|
-
end
|
627
|
-
|
628
|
-
# Record the VT
|
629
|
-
construction_name_to_vt_map[construction_name] = vt
|
630
|
-
|
631
|
-
else
|
632
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Space', 'Model has no sql file containing results, cannot lookup data.')
|
633
638
|
end
|
634
|
-
|
635
639
|
end
|
636
640
|
|
637
641
|
# Get the VT from the map
|
638
642
|
vt = construction_name_to_vt_map[construction_name]
|
639
643
|
if vt.nil?
|
640
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
644
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "For #{space.name}, could not determine VLT for #{construction_name}, will not be included in sidelighting effective aperture calculation.")
|
641
645
|
vt = 0
|
642
646
|
end
|
643
647
|
|
@@ -672,7 +676,7 @@ class Standard
|
|
672
676
|
num_sub_surfaces = 0
|
673
677
|
|
674
678
|
# Assume that well factor (WF) is 0.9 (all wells are less than 2 feet deep)
|
675
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.
|
679
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Space', 'Assuming that all skylight wells are less than 2 feet deep to calculate skylight effective aperture.')
|
676
680
|
wf = 0.9
|
677
681
|
|
678
682
|
# Loop through all windows and add up area * VT
|
@@ -692,63 +696,68 @@ class Standard
|
|
692
696
|
construction_name = nil
|
693
697
|
construction = sub_surface.construction
|
694
698
|
if construction.is_initialized
|
695
|
-
|
699
|
+
construction = construction.get
|
700
|
+
construction_name = construction.name.get.upcase
|
696
701
|
else
|
697
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
702
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "For #{space.name}, could not determine construction for #{sub_surface.name}, will not be included in space_skylight_effective_aperture(space) calculation.")
|
698
703
|
next
|
699
704
|
end
|
700
705
|
|
701
706
|
# Store VT for this construction in map if not already looked up
|
702
707
|
if construction_name_to_vt_map[construction_name].nil?
|
703
708
|
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
709
|
+
# Get the VT from construction (Simple Glazing) if available
|
710
|
+
if construction.visibleTransmittance.is_initialized
|
711
|
+
construction_name_to_vt_map[construction_name] = construction.visibleTransmittance.get
|
712
|
+
else
|
713
|
+
# get the VT from the sql file
|
714
|
+
sql = space.model.sqlFile
|
715
|
+
if sql.is_initialized
|
716
|
+
sql = sql.get
|
717
|
+
|
718
|
+
row_query = "SELECT RowName
|
719
|
+
FROM tabulardatawithstrings
|
720
|
+
WHERE ReportName='EnvelopeSummary'
|
721
|
+
AND ReportForString='Entire Facility'
|
722
|
+
AND TableName='Exterior Fenestration'
|
723
|
+
AND Value='#{construction_name}'"
|
724
|
+
|
725
|
+
row_id = sql.execAndReturnFirstString(row_query)
|
726
|
+
|
727
|
+
if row_id.is_initialized
|
728
|
+
row_id = row_id.get
|
729
|
+
else
|
730
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "Data not found for query: #{row_query}")
|
731
|
+
next
|
732
|
+
end
|
733
|
+
|
734
|
+
vt_query = "SELECT Value
|
735
|
+
FROM tabulardatawithstrings
|
736
|
+
WHERE ReportName='EnvelopeSummary'
|
737
|
+
AND ReportForString='Entire Facility'
|
738
|
+
AND TableName='Exterior Fenestration'
|
739
|
+
AND ColumnName='Glass Visible Transmittance'
|
740
|
+
AND RowName='#{row_id}'"
|
741
|
+
|
742
|
+
vt = sql.execAndReturnFirstDouble(vt_query)
|
743
|
+
|
744
|
+
vt = if vt.is_initialized
|
745
|
+
vt.get
|
746
|
+
end
|
747
|
+
|
748
|
+
# Record the VT
|
749
|
+
construction_name_to_vt_map[construction_name] = vt
|
717
750
|
|
718
|
-
if row_id.is_initialized
|
719
|
-
row_id = row_id.get
|
720
751
|
else
|
721
|
-
OpenStudio.logFree(OpenStudio::
|
722
|
-
next
|
752
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Space', 'Model has no sql file containing results, cannot lookup data.')
|
723
753
|
end
|
724
|
-
|
725
|
-
vt_query = "SELECT Value
|
726
|
-
FROM tabulardatawithstrings
|
727
|
-
WHERE ReportName='EnvelopeSummary'
|
728
|
-
AND ReportForString='Entire Facility'
|
729
|
-
AND TableName='Exterior Fenestration'
|
730
|
-
AND ColumnName='Glass Visible Transmittance'
|
731
|
-
AND RowName='#{row_id}'"
|
732
|
-
|
733
|
-
vt = sql.execAndReturnFirstDouble(vt_query)
|
734
|
-
|
735
|
-
vt = if vt.is_initialized
|
736
|
-
vt.get
|
737
|
-
end
|
738
|
-
|
739
|
-
# Record the VT
|
740
|
-
construction_name_to_vt_map[construction_name] = vt
|
741
|
-
|
742
|
-
else
|
743
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', 'Model has no sql file containing results, cannot lookup data.')
|
744
754
|
end
|
745
|
-
|
746
755
|
end
|
747
756
|
|
748
757
|
# Get the VT from the map
|
749
758
|
vt = construction_name_to_vt_map[construction_name]
|
750
759
|
if vt.nil?
|
751
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
760
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "For #{space.name}, could not determine VLT for #{construction_name}, will not be included in skylight effective aperture calculation.")
|
752
761
|
vt = 0
|
753
762
|
end
|
754
763
|
|
@@ -793,7 +802,7 @@ class Standard
|
|
793
802
|
# @todo Determine the illuminance setpoint for the controls based on space type
|
794
803
|
# @todo rotate sensor to face window (only needed for glare calcs)
|
795
804
|
def space_add_daylighting_controls(space, remove_existing_controls, draw_daylight_areas_for_debugging = false)
|
796
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
805
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "******For #{space.name}, adding daylight controls.")
|
797
806
|
|
798
807
|
# Check for existing daylighting controls
|
799
808
|
# and remove if specified in the input
|
@@ -801,9 +810,9 @@ class Standard
|
|
801
810
|
unless existing_daylighting_controls.empty?
|
802
811
|
if remove_existing_controls
|
803
812
|
existing_daylighting_controls.each(&:remove)
|
804
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.
|
813
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Space', "For #{space.name}, removed #{existing_daylighting_controls.size} existing daylight controls before adding new controls.")
|
805
814
|
else
|
806
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.
|
815
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Space', "For #{space.name}, daylight controls were already present, no additional controls added.")
|
807
816
|
return false
|
808
817
|
end
|
809
818
|
end
|
@@ -818,7 +827,7 @@ class Standard
|
|
818
827
|
end
|
819
828
|
end
|
820
829
|
if ext_fen_area_m2.zero?
|
821
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.
|
830
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Space', "For #{space.name}, daylighting control not applicable because no exterior fenestration is present.")
|
822
831
|
return false
|
823
832
|
end
|
824
833
|
|
@@ -842,14 +851,14 @@ class Standard
|
|
842
851
|
end
|
843
852
|
|
844
853
|
# Output the daylight control requirements
|
845
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
846
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
847
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
854
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "For #{space.name}, toplighting control required = #{req_top_ctrl}")
|
855
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "For #{space.name}, primary sidelighting control required = #{req_pri_ctrl}")
|
856
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "For #{space.name}, secondary sidelighting control required = #{req_sec_ctrl}")
|
848
857
|
|
849
858
|
# Stop here if no lighting controls are required.
|
850
859
|
# Do not put daylighting control points into the space.
|
851
860
|
if !req_top_ctrl && !req_pri_ctrl && !req_sec_ctrl
|
852
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
861
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "For #{space.name}, no daylighting control is required.")
|
853
862
|
return false
|
854
863
|
end
|
855
864
|
|
@@ -875,7 +884,7 @@ class Standard
|
|
875
884
|
# TODO: stop skipping non-vertical walls
|
876
885
|
unless surface_normal.z.abs < 0.001
|
877
886
|
unless surface.subSurfaces.empty?
|
878
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
887
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "Cannot currently handle non-vertical walls; skipping windows on #{surface.name} in #{space.name} for daylight sensor positioning.")
|
879
888
|
next
|
880
889
|
end
|
881
890
|
end
|
@@ -883,8 +892,8 @@ class Standard
|
|
883
892
|
# TODO: stop skipping non-horizontal roofs
|
884
893
|
unless surface_normal.to_s == straight_upward.to_s
|
885
894
|
unless surface.subSurfaces.empty?
|
886
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
887
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
895
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "Cannot currently handle non-horizontal roofs; skipping skylights on #{surface.name} in #{space.name} for daylight sensor positioning.")
|
896
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---Surface #{surface.name} has outward normal of #{surface_normal.to_s.gsub(/\[|\]/, '|')}; up is #{straight_upward.to_s.gsub(/\[|\]/, '|')}.")
|
888
897
|
next
|
889
898
|
end
|
890
899
|
end
|
@@ -899,7 +908,7 @@ class Standard
|
|
899
908
|
site_vertices = site_transformation * surface.vertices
|
900
909
|
site_outward_normal = OpenStudio.getOutwardNormal(site_vertices)
|
901
910
|
if site_outward_normal.empty?
|
902
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.
|
911
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Space', "Could not compute outward normal for #{surface.name.get}")
|
903
912
|
next
|
904
913
|
end
|
905
914
|
site_outward_normal = site_outward_normal.get
|
@@ -945,7 +954,7 @@ class Standard
|
|
945
954
|
vertex_heights_above_floor << (vertex - vertex_on_floorplane).length
|
946
955
|
end
|
947
956
|
head_height_m = vertex_heights_above_floor.max
|
948
|
-
# OpenStudio::logFree(OpenStudio::Info, "openstudio.
|
957
|
+
# OpenStudio::logFree(OpenStudio::Info, "openstudio.standards.Space", "---head height = #{head_height_m}m, sill height = #{sill_height_m}m")
|
949
958
|
|
950
959
|
# Log the window properties to use when creating daylight sensors
|
951
960
|
properties = { facade: facade, area_m2: net_area_m2, handle: sub_surface.handle, head_height_m: head_height_m, name: sub_surface.name.get.to_s }
|
@@ -1014,7 +1023,7 @@ class Standard
|
|
1014
1023
|
# Get the zone that the space is in
|
1015
1024
|
zone = space.thermalZone
|
1016
1025
|
if zone.empty?
|
1017
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.
|
1026
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Space', "Space #{space.name} has no thermal zone")
|
1018
1027
|
else
|
1019
1028
|
zone = zone.get
|
1020
1029
|
end
|
@@ -1025,15 +1034,15 @@ class Standard
|
|
1025
1034
|
sorted_skylights = skylights.sort_by { |_skylight, vals| [vals[:facade], vals[:area], vals[:name]] }
|
1026
1035
|
|
1027
1036
|
# Report out the sorted skylights for debugging
|
1028
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
1037
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "For #{space.name}, Skylights:")
|
1029
1038
|
sorted_skylights.each do |sky, p|
|
1030
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
1039
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---#{sky.name} #{p[:facade]}, area = #{p[:area_m2].round(2)} m^2")
|
1031
1040
|
end
|
1032
1041
|
|
1033
1042
|
# Report out the sorted windows for debugging
|
1034
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
1043
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "For #{space.name}, Windows:")
|
1035
1044
|
sorted_windows.each do |win, p|
|
1036
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
1045
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---#{win.name} #{p[:facade]}, area = #{p[:area_m2].round(2)} m^2")
|
1037
1046
|
end
|
1038
1047
|
|
1039
1048
|
# Determine the sensor fractions and the attached windows
|
@@ -1057,7 +1066,7 @@ class Standard
|
|
1057
1066
|
# get the zone that the space is in
|
1058
1067
|
zone = space.thermalZone
|
1059
1068
|
if zone.empty?
|
1060
|
-
OpenStudio.logFree(OpenStudio::Error, 'openstudio.
|
1069
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Space', "Space #{space.name}, cannot determine daylighted areas.")
|
1061
1070
|
return false
|
1062
1071
|
else
|
1063
1072
|
zone = space.thermalZone.get
|
@@ -1078,15 +1087,15 @@ class Standard
|
|
1078
1087
|
|
1079
1088
|
# Sensors
|
1080
1089
|
if sensor_1_frac > 0.0
|
1081
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.
|
1090
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Space', "For #{space.name}: sensor 1 controls #{(sensor_1_frac * 100).round}% of the zone lighting.")
|
1082
1091
|
end
|
1083
1092
|
if sensor_2_frac > 0.0
|
1084
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.
|
1093
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Space', "For #{space.name}: sensor 2 controls #{(sensor_2_frac * 100).round}% of the zone lighting.")
|
1085
1094
|
end
|
1086
1095
|
|
1087
1096
|
# First sensor
|
1088
1097
|
if sensor_1_window
|
1089
|
-
# OpenStudio::logFree(OpenStudio::Info, "openstudio.
|
1098
|
+
# OpenStudio::logFree(OpenStudio::Info, "openstudio.standards.Space", "For #{self.name}, calculating daylighted areas.")
|
1090
1099
|
# runner.registerInfo("Daylight sensor 1 inside of #{sensor_1_frac.name}")
|
1091
1100
|
sensor_1 = OpenStudio::Model::DaylightingControl.new(space.model)
|
1092
1101
|
sensor_1.setName("#{space.name} Daylt Sensor 1")
|
@@ -1128,7 +1137,7 @@ class Standard
|
|
1128
1137
|
|
1129
1138
|
# Second sensor
|
1130
1139
|
if sensor_2_window
|
1131
|
-
# OpenStudio::logFree(OpenStudio::Info, "openstudio.
|
1140
|
+
# OpenStudio::logFree(OpenStudio::Info, "openstudio.standards.Space", "For #{self.name}, calculating daylighted areas.")
|
1132
1141
|
# runner.registerInfo("Daylight sensor 2 inside of #{sensor_2_frac.name}")
|
1133
1142
|
sensor_2 = OpenStudio::Model::DaylightingControl.new(space.model)
|
1134
1143
|
sensor_2.setName("#{space.name} Daylt Sensor 2")
|
@@ -1247,10 +1256,10 @@ class Standard
|
|
1247
1256
|
|
1248
1257
|
# Don't create an object if there is no exterior wall area
|
1249
1258
|
if exterior_wall_and_window_area_m2 <= 0.0
|
1250
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.
|
1259
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Space', "For #{space.name}, no exterior wall area was found, no infiltration will be added.")
|
1251
1260
|
return true
|
1252
1261
|
end
|
1253
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.
|
1262
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Space', "For #{space.name}, set infiltration rate to #{adj_infil_rate_cfm_per_ft2.round(3)} cfm/ft2 exterior wall area (aka #{basic_infil_rate_cfm_per_ft2} cfm/ft2 @75Pa).")
|
1254
1263
|
|
1255
1264
|
# Calculate the total infiltration, assuming
|
1256
1265
|
# that it only occurs through exterior walls
|
@@ -1260,7 +1269,7 @@ class Standard
|
|
1260
1269
|
# exterior surface areas (for the E+ input field)
|
1261
1270
|
all_ext_infil_m3_per_s_per_m2 = tot_infil_m3_per_s / space.exteriorArea
|
1262
1271
|
|
1263
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
1272
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "For #{space.name}, adj infil = #{all_ext_infil_m3_per_s_per_m2.round(8)} m^3/s*m^2.")
|
1264
1273
|
|
1265
1274
|
# Get any infiltration schedule already assigned to this space or its space type
|
1266
1275
|
# If not, the always on schedule will be applied.
|
@@ -1547,9 +1556,9 @@ class Standard
|
|
1547
1556
|
act_sch = act_sch.get.to_ScheduleRuleset.get
|
1548
1557
|
w_per_person = schedule_ruleset_annual_min_max_value(act_sch)['max']
|
1549
1558
|
else
|
1550
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
1559
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "#{space.name} people activity schedule is not a Schedule:Ruleset. Assuming #{w_per_person}W/person.")
|
1551
1560
|
end
|
1552
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
1561
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "#{space.name} people activity schedule not found. Assuming #{w_per_person}W/person.")
|
1553
1562
|
end
|
1554
1563
|
|
1555
1564
|
num_ppl = people.getNumberOfPeople(space.floorArea)
|
@@ -1568,7 +1577,7 @@ class Standard
|
|
1568
1577
|
# Gas Equipment
|
1569
1578
|
load_w += space.gasEquipmentPower
|
1570
1579
|
|
1571
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
1580
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "#{space.name} has #{load_w.round}W of design internal loads.")
|
1572
1581
|
|
1573
1582
|
return load_w
|
1574
1583
|
end
|
@@ -1649,12 +1658,12 @@ class Standard
|
|
1649
1658
|
default_sch_type = OpenStudio::Model::DefaultScheduleType.new('HoursofOperationSchedule')
|
1650
1659
|
hours_of_operation = space.getDefaultSchedule(default_sch_type)
|
1651
1660
|
if !hours_of_operation.is_initialized
|
1652
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
1661
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "Hours of Operation Schedule is not set for #{space.name}.")
|
1653
1662
|
return nil
|
1654
1663
|
end
|
1655
1664
|
hours_of_operation = hours_of_operation.get
|
1656
1665
|
if !hours_of_operation.to_ScheduleRuleset.is_initialized
|
1657
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
1666
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "Hours of Operation Schedule #{hours_of_operation.name} is not a ScheduleRuleset.")
|
1658
1667
|
return nil
|
1659
1668
|
end
|
1660
1669
|
hours_of_operation = hours_of_operation.to_ScheduleRuleset.get
|
@@ -1692,7 +1701,7 @@ class Standard
|
|
1692
1701
|
|
1693
1702
|
# some validation
|
1694
1703
|
if times.size > 3 || unexpected_val || hoo_start.nil? || hoo_end.nil?
|
1695
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
1704
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "#{hours_of_operation.name} does not look like a valid hours of operation schedule for parametric schedule generation.")
|
1696
1705
|
return nil
|
1697
1706
|
end
|
1698
1707
|
|
@@ -1748,7 +1757,7 @@ class Standard
|
|
1748
1757
|
|
1749
1758
|
# some validation
|
1750
1759
|
if times.size > 3 || unexpected_val || hoo_start.nil? || hoo_end.nil?
|
1751
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
1760
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "#{hours_of_operation.name} does not look like a valid hours of operation schedule for parametric schedule generation.")
|
1752
1761
|
return nil
|
1753
1762
|
end
|
1754
1763
|
|
@@ -1855,7 +1864,7 @@ class Standard
|
|
1855
1864
|
fails = []
|
1856
1865
|
errs = 0
|
1857
1866
|
polygons.each do |polygon|
|
1858
|
-
# OpenStudio::logFree(OpenStudio::Error, "openstudio.
|
1867
|
+
# OpenStudio::logFree(OpenStudio::Error, "openstudio.standards.Space", "Checking z=0: #{name} is greater than or equal to #{polygon.to_s.gsub(/\[|\]/,'|')}.")
|
1859
1868
|
polygon.each do |vertex|
|
1860
1869
|
# clsss << vertex.class
|
1861
1870
|
unless vertex.z == 0.0
|
@@ -1864,9 +1873,9 @@ class Standard
|
|
1864
1873
|
end
|
1865
1874
|
end
|
1866
1875
|
end
|
1867
|
-
# OpenStudio::logFree(OpenStudio::Error, "openstudio.
|
1876
|
+
# OpenStudio::logFree(OpenStudio::Error, "openstudio.standards.Space", "Checking z=0: #{name} is greater than or equal to #{clsss.uniq.to_s.gsub(/\[|\]/,'|')}.")
|
1868
1877
|
if errs > 0
|
1869
|
-
OpenStudio.logFree(OpenStudio::Info, 'openstudio.
|
1878
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Space', "***FAIL*** #{space.name} z=0 failed for #{errs} vertices in #{name}; #{fails.join(', ')}.")
|
1870
1879
|
end
|
1871
1880
|
end
|
1872
1881
|
|
@@ -1891,7 +1900,7 @@ class Standard
|
|
1891
1900
|
# A method to zero-out the z vertex of an array of polygons
|
1892
1901
|
# @api private
|
1893
1902
|
def space_polygons_set_z(space, polygons, new_z)
|
1894
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
1903
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "### #{polygons}")
|
1895
1904
|
|
1896
1905
|
# Convert the final polygons back to OpenStudio
|
1897
1906
|
new_polygons = []
|
@@ -1911,17 +1920,17 @@ class Standard
|
|
1911
1920
|
# TODO does not actually wor
|
1912
1921
|
# @api private
|
1913
1922
|
def space_find_duplicate_vertices(space, ruby_polygon, tol = 0.001)
|
1914
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
1923
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', '***')
|
1915
1924
|
duplicates = []
|
1916
1925
|
|
1917
1926
|
combos = ruby_polygon.combination(2).to_a
|
1918
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
1927
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "########{combos.size}")
|
1919
1928
|
combos.each do |i, j|
|
1920
1929
|
i_vertex = OpenStudio::Point3d.new(i[0], i[1], i[2])
|
1921
1930
|
j_vertex = OpenStudio::Point3d.new(j[0], j[1], j[2])
|
1922
1931
|
|
1923
1932
|
distance = OpenStudio.getDistance(i_vertex, j_vertex)
|
1924
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
1933
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "------- #{i} to #{j} = #{distance}")
|
1925
1934
|
if distance < tol
|
1926
1935
|
duplicates << i
|
1927
1936
|
end
|
@@ -1936,14 +1945,14 @@ class Standard
|
|
1936
1945
|
def space_a_polygons_minus_b_polygons(space, a_polygons, b_polygons, a_name, b_name)
|
1937
1946
|
final_polygons_ruby = []
|
1938
1947
|
|
1939
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
1948
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "#{a_polygons.size} #{a_name} minus #{b_polygons.size} #{b_name}")
|
1940
1949
|
|
1941
1950
|
# Don't try to subtract anything if either set is empty
|
1942
1951
|
if a_polygons.size.zero?
|
1943
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
1952
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---#{a_name} - #{b_name}: #{a_name} contains no polygons.")
|
1944
1953
|
return space_polygons_set_z(space, a_polygons, 0.0)
|
1945
1954
|
elsif b_polygons.size.zero?
|
1946
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
1955
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---#{a_name} - #{b_name}: #{b_name} contains no polygons.")
|
1947
1956
|
return space_polygons_set_z(space, a_polygons, 0.0)
|
1948
1957
|
end
|
1949
1958
|
|
@@ -1991,13 +2000,13 @@ class Standard
|
|
1991
2000
|
end
|
1992
2001
|
|
1993
2002
|
if num_small_polygons > 0
|
1994
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2003
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---Dropped #{num_small_polygons} small or invalid polygons resulting from subtraction.")
|
1995
2004
|
end
|
1996
2005
|
|
1997
2006
|
# Remove duplicate polygons
|
1998
2007
|
unique_a_minus_b_polygons_ruby = a_minus_b_polygons_ruby.uniq
|
1999
2008
|
|
2000
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2009
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---Remove duplicates: #{a_minus_b_polygons_ruby.size} to #{unique_a_minus_b_polygons_ruby.size}")
|
2001
2010
|
|
2002
2011
|
# TODO: bug workaround?
|
2003
2012
|
# If the result includes the a polygon, the a polygon
|
@@ -2007,16 +2016,16 @@ class Standard
|
|
2007
2016
|
if unique_a_minus_b_polygons_ruby.include?(a_polygon_ruby)
|
2008
2017
|
if unique_a_minus_b_polygons_ruby.size == 1
|
2009
2018
|
final_polygons_ruby.concat([a_polygon_ruby])
|
2010
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2019
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', '---includes only original polygon, keeping that one')
|
2011
2020
|
else
|
2012
2021
|
# Remove the original polygon
|
2013
2022
|
unique_a_minus_b_polygons_ruby.delete(a_polygon_ruby)
|
2014
2023
|
final_polygons_ruby.concat(unique_a_minus_b_polygons_ruby)
|
2015
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2024
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', '---includes the original and others; keeping all other polygons')
|
2016
2025
|
end
|
2017
2026
|
else
|
2018
2027
|
final_polygons_ruby.concat(unique_a_minus_b_polygons_ruby)
|
2019
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2028
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', '---does not include original, keeping all resulting polygons')
|
2020
2029
|
end
|
2021
2030
|
end
|
2022
2031
|
|
@@ -2030,13 +2039,13 @@ class Standard
|
|
2030
2039
|
# next if unique_final_polygon_ruby.size == 4 # Don't check 4-sided polygons
|
2031
2040
|
# dupes = space_find_duplicate_vertices(space, unique_final_polygon_ruby)
|
2032
2041
|
# if dupes.size > 0
|
2033
|
-
# OpenStudio::logFree(OpenStudio::Error, "openstudio.
|
2042
|
+
# OpenStudio::logFree(OpenStudio::Error, "openstudio.standards.Space", "---Two polygons attached by line = #{unique_final_polygon_ruby.to_s.gsub(/\[|\]/,'|')}")
|
2034
2043
|
# end
|
2035
2044
|
# end
|
2036
2045
|
|
2037
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2046
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---Remove final duplicates: #{final_polygons_ruby.size} to #{unique_final_polygons_ruby.size}")
|
2038
2047
|
|
2039
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2048
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---#{a_name} minus #{b_name} = #{unique_final_polygons_ruby.size} polygons.")
|
2040
2049
|
|
2041
2050
|
# Convert the final polygons back to OpenStudio
|
2042
2051
|
unique_final_polygons = space_ruby_polygons_to_point3d_z_zero(space, unique_final_polygons_ruby)
|
@@ -2048,13 +2057,13 @@ class Standard
|
|
2048
2057
|
# [utilities.geometry.joinAll] <1> Expected polygons to join together
|
2049
2058
|
# @api private
|
2050
2059
|
def space_join_polygons(space, polygons, tol, name)
|
2051
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2060
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "Joining #{name} from #{space.name}")
|
2052
2061
|
|
2053
2062
|
combined_polygons = []
|
2054
2063
|
|
2055
2064
|
# Don't try to combine an empty array of polygons
|
2056
2065
|
if polygons.size.zero?
|
2057
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2066
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---#{name} contains no polygons, not combining.")
|
2058
2067
|
return combined_polygons
|
2059
2068
|
end
|
2060
2069
|
|
@@ -2114,7 +2123,7 @@ class Standard
|
|
2114
2123
|
msg_log_2.disable
|
2115
2124
|
|
2116
2125
|
if join_errs_2 > 0 || inner_loop_errs_2 > 0
|
2117
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2126
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "For #{space.name}, the workaround for joining polygons failed.")
|
2118
2127
|
else
|
2119
2128
|
|
2120
2129
|
# First polygon minus the already combined polygons
|
@@ -2131,15 +2140,15 @@ class Standard
|
|
2131
2140
|
|
2132
2141
|
# Report logged errors to user
|
2133
2142
|
if join_errs > 0
|
2134
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2135
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
2143
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "For #{space.name}, #{join_errs} of #{polygons.size} #{space.name} were not joined properly due to limitations of the geometry calculation methods. The resulting daylighted areas will be smaller than they should be.")
|
2144
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "For #{space.name}, the #{name.gsub('_polygons', '')} daylight area calculations hit limitations. Double-check and possibly correct the fraction of lights controlled by each daylight sensor.")
|
2136
2145
|
end
|
2137
2146
|
if inner_loop_errs > 0
|
2138
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2139
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
2147
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "For #{space.name}, #{inner_loop_errs} of #{polygons.size} #{space.name} were not joined properly because the joined polygons have an internal hole. The resulting daylighted areas will be smaller than they should be.")
|
2148
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "For #{space.name}, the #{name.gsub('_polygons', '')} daylight area calculations hit limitations. Double-check and possibly correct the fraction of lights controlled by each daylight sensor.")
|
2140
2149
|
end
|
2141
2150
|
|
2142
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2151
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---Joined #{polygons.size} #{space.name} into #{combined_polygons.size} polygons.")
|
2143
2152
|
|
2144
2153
|
return combined_polygons
|
2145
2154
|
end
|
@@ -2153,7 +2162,7 @@ class Standard
|
|
2153
2162
|
if area_m2.is_initialized
|
2154
2163
|
total_area_m2 += area_m2.get
|
2155
2164
|
else
|
2156
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
2165
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "Could not get area for a polygon in #{space.name}, daylighted area calculation will not be accurate.")
|
2157
2166
|
end
|
2158
2167
|
end
|
2159
2168
|
|
@@ -2164,39 +2173,39 @@ class Standard
|
|
2164
2173
|
# Assumes that a_polygons don't overlap one another, and that b_polygons don't overlap one another
|
2165
2174
|
# @api private
|
2166
2175
|
def space_area_a_polygons_overlap_b_polygons(space, a_polygons, b_polygons, a_name, b_name)
|
2167
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2176
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "#{a_polygons.size} #{a_name} overlaps #{b_polygons.size} #{b_name}")
|
2168
2177
|
|
2169
2178
|
overlap_area = 0
|
2170
2179
|
|
2171
2180
|
# Don't try anything if either set is empty
|
2172
2181
|
if a_polygons.size.zero?
|
2173
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2182
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---#{a_name} overlaps #{b_name}: #{a_name} contains no polygons.")
|
2174
2183
|
return overlap_area
|
2175
2184
|
elsif b_polygons.size.zero?
|
2176
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2185
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "---#{a_name} overlaps #{b_name}: #{b_name} contains no polygons.")
|
2177
2186
|
return overlap_area
|
2178
2187
|
end
|
2179
2188
|
|
2180
2189
|
# Loop through each base surface
|
2181
2190
|
b_polygons.each do |b_polygon|
|
2182
|
-
# OpenStudio::logFree(OpenStudio::Info, "openstudio.
|
2191
|
+
# OpenStudio::logFree(OpenStudio::Info, "openstudio.standards.Space", "---b polygon = #{b_polygon_ruby.to_s.gsub(/\[|\]/,'|')}")
|
2183
2192
|
|
2184
2193
|
# Loop through each overlap surface and determine if it overlaps this base surface
|
2185
2194
|
a_polygons.each do |a_polygon|
|
2186
|
-
# OpenStudio::logFree(OpenStudio::Info, "openstudio.
|
2195
|
+
# OpenStudio::logFree(OpenStudio::Info, "openstudio.standards.Space", "------a polygon = #{a_polygon_ruby.to_s.gsub(/\[|\]/,'|')}")
|
2187
2196
|
|
2188
2197
|
# If the entire a polygon is within the b polygon, count 100% of the area
|
2189
2198
|
# as overlapping and remove a polygon from the list
|
2190
2199
|
if OpenStudio.within(a_polygon, b_polygon, 0.01)
|
2191
2200
|
|
2192
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2201
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', '---------a overlaps b ENTIRELY.')
|
2193
2202
|
|
2194
2203
|
area = OpenStudio.getArea(a_polygon)
|
2195
2204
|
if area.is_initialized
|
2196
2205
|
overlap_area += area.get
|
2197
2206
|
next
|
2198
2207
|
else
|
2199
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2208
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "Could not determine the area of #{a_polygon.to_s.gsub(/\[|\]/, '|')} in #{a_name}; #{a_name} overlaps #{b_name}.")
|
2200
2209
|
end
|
2201
2210
|
|
2202
2211
|
# If part of a polygon overlaps b polygon, determine the
|
@@ -2204,7 +2213,7 @@ class Standard
|
|
2204
2213
|
# then add the difference in area to the total.
|
2205
2214
|
elsif OpenStudio.intersects(a_polygon, b_polygon, 0.01)
|
2206
2215
|
|
2207
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2216
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', '---------a overlaps b PARTIALLY.')
|
2208
2217
|
|
2209
2218
|
# Get the initial area
|
2210
2219
|
area_initial = 0
|
@@ -2212,7 +2221,7 @@ class Standard
|
|
2212
2221
|
if area.is_initialized
|
2213
2222
|
area_initial = area.get
|
2214
2223
|
else
|
2215
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2224
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "Could not determine the area of #{a_polygon.to_s.gsub(/\[|\]/, '|')} in #{a_name}; #{a_name} overlaps #{b_name}.")
|
2216
2225
|
end
|
2217
2226
|
|
2218
2227
|
# Perform the subtraction
|
@@ -2224,7 +2233,7 @@ class Standard
|
|
2224
2233
|
# Skip polygons that have no vertices
|
2225
2234
|
# resulting from the subtraction.
|
2226
2235
|
if polygon.size.zero?
|
2227
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2236
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "Zero-vertex polygon resulting from #{b_polygon.to_s.gsub(/\[|\]/, '|')} minus #{a_polygon.to_s.gsub(/\[|\]/, '|')}.")
|
2228
2237
|
next
|
2229
2238
|
end
|
2230
2239
|
# Find the area of real polygons
|
@@ -2232,7 +2241,7 @@ class Standard
|
|
2232
2241
|
if area.is_initialized
|
2233
2242
|
area_final += area.get
|
2234
2243
|
else
|
2235
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.
|
2244
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Space', "Could not determine the area of #{polygon.to_s.gsub(/\[|\]/, '|')} in #{a_name}; #{a_name} overlaps #{b_name}.")
|
2236
2245
|
end
|
2237
2246
|
end
|
2238
2247
|
|
@@ -2242,7 +2251,7 @@ class Standard
|
|
2242
2251
|
# There is no overlap
|
2243
2252
|
else
|
2244
2253
|
|
2245
|
-
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.
|
2254
|
+
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', '---------a does not overlaps b at all.')
|
2246
2255
|
|
2247
2256
|
end
|
2248
2257
|
end
|