openstudio-standards 0.2.10 → 0.2.11.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +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
|