From ee9364d7045727ed9354699a6c0f15a512c0316c Mon Sep 17 00:00:00 2001 From: Guille Date: Mon, 26 Oct 2020 10:00:42 -0400 Subject: [PATCH] Idf corrections and intermediate solution --- city_model_structure/building.py | 2 +- city_model_structure/polyhedron.py | 1 - geometry/geometry_feeders/city_gml.py | 4 +- helpers/idf_helper.py | 69 +++-- tests/test_idf.py | 9 +- tests_data/minimal.idf | 360 +++++++++++--------------- 6 files changed, 215 insertions(+), 230 deletions(-) diff --git a/city_model_structure/building.py b/city_model_structure/building.py index af09f207..c3b4391f 100644 --- a/city_model_structure/building.py +++ b/city_model_structure/building.py @@ -36,7 +36,7 @@ class Building(CityObject): self._function = function self._lower_corner = lower_corner self._average_storey_height = None - self._storeys_above_ground = None + self._storeys_above_ground = 1 self._foot_print = None self._usage_zones = [] self._building_units = [] diff --git a/city_model_structure/polyhedron.py b/city_model_structure/polyhedron.py index 0749b7e3..a3ba84db 100644 --- a/city_model_structure/polyhedron.py +++ b/city_model_structure/polyhedron.py @@ -71,7 +71,6 @@ class Polyhedron: @property def _polyhedron_mesh(self): - if self._mesh is None: self._mesh = Trimesh(vertices=self.vertices, faces=self.faces) return self._mesh diff --git a/geometry/geometry_feeders/city_gml.py b/geometry/geometry_feeders/city_gml.py index c782b8f7..ddd1e437 100644 --- a/geometry/geometry_feeders/city_gml.py +++ b/geometry/geometry_feeders/city_gml.py @@ -50,8 +50,8 @@ class CityGml: else: self._lower_corner = np.fromstring(envelope['lowerCorner'], dtype=float, sep=' ') self._upper_corner = np.fromstring(envelope['upperCorner'], dtype=float, sep=' ') - - self._srs_name = envelope['@srsName'] + if '@srsName' in envelope: + self._srs_name = envelope['@srsName'] @property def content(self): diff --git a/helpers/idf_helper.py b/helpers/idf_helper.py index 66b8d644..65f44337 100644 --- a/helpers/idf_helper.py +++ b/helpers/idf_helper.py @@ -9,6 +9,11 @@ from pathlib import Path class IdfHelper: + idf_surfaces = { + 'Wall': 'wall', + 'Ground': 'floor', + 'Roof': 'roof' + } def __init__(self, idf_file_path, idd_file_path, epw_file_path, eso_file_path): self._idd_file_path = str(idd_file_path) @@ -17,12 +22,30 @@ class IdfHelper: self._eso_file_path = str(eso_file_path) IDF.setiddname(self._idd_file_path) self._idf = IDF(self._idf_file_path) - self._idf.epw = epw_file_path + self._idf.epw = self._epw_file_path self._eso_file_path = str((Path.cwd() / 'eplusout.eso').resolve()) def add_zone(self, building_name): + self._idf.newidfobject(key='ZONE', Name=building_name, Ceiling_Height='autocalculate', Volume='autocalculate', - Floor_Area='autocalculate', Part_of_Total_Floor_Area='yes', ) + Floor_Area='autocalculate', Part_of_Total_Floor_Area='yes', ) + self._idf.newidfobject("HVACTEMPLATE:ZONE:IDEALLOADSAIRSYSTEM", Zone_Name=building_name, + Template_Thermostat_Name='', Outdoor_Air_Method="DetailedSpecification", ) + + def add_heating_system(self): + self._idf.intersect_match() + self._idf.set_default_constructions() + stat = self._idf.newidfobject( + "HVACTEMPLATE:THERMOSTAT", + Name="Zone Stat", + Constant_Heating_Setpoint=20, + Constant_Cooling_Setpoint=25, + ) + for zone in self._idf.idfobjects["ZONE"]: + self._idf.newidfobject("HVACTEMPLATE:ZONE:IDEALLOADSAIRSYSTEM", + Zone_Name=zone.Name, + Template_Thermostat_Name=stat.Name + ) @staticmethod def _matrix_to_list(points): @@ -30,31 +53,47 @@ class IdfHelper: for point in points: point_tuple = (point[0], point[1], point[2]) points_list.append(point_tuple) + print(points_list) return points_list - def add_surface(self, surface, building_name): - wall = self._idf.newidfobject('BUILDINGSURFACE:DETAILED', Name=surface.name, Surface_Type=surface.type, - Zone_Name=building_name, ) - self._matrix_to_list(surface.points) - wall.setcoords(IdfHelper._matrix_to_list(surface.points)) + @staticmethod + def _matrix_to_2d_list(points): + points_list = [] + for point in points: + point_tuple = (point[0], point[1]) + points_list.append(point_tuple) + points_list.reverse() + return points_list + + def add_block(self, building): + _points = IdfHelper._matrix_to_2d_list(building.foot_print.points) + self._idf.add_block(name=building.name, coordinates=_points, + height=building.max_height, num_stories=building.storeys_above_ground) + + def add_surfaces(self, building): + for surface in building.surfaces: + wall = self._idf.newidfobject('BUILDINGSURFACE:DETAILED', Name=surface.name, + Surface_Type=self.idf_surfaces[surface.type], Zone_Name=building.name) + wall.setcoords(IdfHelper._matrix_to_list(surface.ground_points)) def run(self, window_ratio=0.35, display_render=False): - self._idf.set_default_constructions() - self._idf.intersect_match() + self._idf.set_wwr(window_ratio) - self._idf.translate_to_origin() + # self._idf.translate_to_origin() + if display_render: self._idf.view_model() - self._idf.newidfobject("HVACTEMPLATE:THERMOSTAT", Name="Zone Stat", Constant_Heating_Setpoint=20, - Constant_Cooling_Setpoint=24, ) - for zone in self._idf.idfobjects["ZONE"]: - self._idf.newidfobject("HVACTEMPLATE:ZONE:IDEALLOADSAIRSYSTEM", Zone_Name=zone.Name, - Template_Thermostat_Name='', Outdoor_Air_Method="DetailedSpecification", ) + else: + self._idf.to_obj('city.obj') # Run + self._idf.newidfobject("OUTPUT:METER", Key_Name="Heating:DistrictHeating", Reporting_Frequency="hourly", ) + self._idf.newidfobject("OUTPUT:METER", Key_Name="Cooling:DistrictCooling", Reporting_Frequency="hourly", ) self._idf.run() + """ dd, data = esoreader.read(self._eso_file_path) list_values = [v for v in data.values()] heating = [(float(x)) / 3600000.0 for x in list_values[0]] cooling = [(float(x)) / 3600000.0 for x in list_values[1]] print("text") return heating, cooling + """ diff --git a/tests/test_idf.py b/tests/test_idf.py index a7376baa..99bfc359 100644 --- a/tests/test_idf.py +++ b/tests/test_idf.py @@ -37,8 +37,13 @@ class TestIdf(TestCase): _idf = IdfHelper(idf_file_path, idd_file_path, epw_file_path, self._example_path) city = self._get_citygml() for building in city.buildings: + _idf.add_block(building) _idf.add_zone(building.name) - for surface in building.surfaces: - _idf.add_surface(surface, building.name) + # _idf.add_surfaces(building) + # for surface in building.surfaces: + # _idf.add_surface(surface, building.name) + _idf.add_heating_system() _idf.run() + self.assertTrue(True) + diff --git a/tests_data/minimal.idf b/tests_data/minimal.idf index eeaee524..7b2519b3 100644 --- a/tests_data/minimal.idf +++ b/tests_data/minimal.idf @@ -1,209 +1,151 @@ -!-Generator IDFEditor 1.50 -!-Option SortedOrder - -!-NOTE: All comments with '!-' are ignored by the IDFEditor and are generated automatically. -!- Use '!' comments if they need to be retained when using the IDFEditor. - - -!- =========== ALL OBJECTS IN CLASS: VERSION =========== - -! Minimal.idf -! Basic file description: This is a minimal configuration necessary to run. -! Highlights: Illustrates minimal items necessary to perform run. -! BUILDING, SURFACEGEOMETRY, LOCATION and DESIGNDAY (or RUNPERIOD) are the absolute minimal required input objects. -! TIME STEP IN HOUR is included so as to not get warning error. -! Including two design days, Run Control object and RunPeriod to facilitate use. -! Although not incredibly useful, this could be used as a weather/solar calculator. -! Simulation Location/Run: Denver is included. Any could be used. -! Building: None. -! -! Internal gains description: None. -! -! HVAC: None. -! -Version, - 9.2; !- Version Identifier - - -!- =========== ALL OBJECTS IN CLASS: SIMULATIONCONTROL =========== - -SimulationControl, - No, !- Do Zone Sizing Calculation - No, !- Do System Sizing Calculation - No, !- Do Plant Sizing Calculation - No, !- Run Simulation for Sizing Periods - Yes; !- Run Simulation for Weather File Run Periods - - -!- =========== ALL OBJECTS IN CLASS: BUILDING =========== - -Building, - None, !- Name - 0, !- North Axis {deg} - Suburbs, !- Terrain - 0.04, !- Loads Convergence Tolerance Value - 0.40, !- Temperature Convergence Tolerance Value {deltaC} - FullInteriorAndExterior, !- Solar Distribution - 25, !- Maximum Number of Warmup Days - 6; !- Minimum Number of Warmup Days - - -!- =========== ALL OBJECTS IN CLASS: SHADOWCALCULATION =========== - -ShadowCalculation, - AverageOverDaysInFrequency, !- Calculation Method - 20, !- Calculation Frequency - 15000, !- Maximum Figures in Shadow Overlap Calculations - SutherlandHodgman, !- Polygon Clipping Algorithm - SimpleSkyDiffuseModeling,!- Sky Diffuse Modeling Algorithm - InternalCalculation, !- External Shading Calculation Method - No, !- Output External Shading Calculation Results - No, !- Disable Self-Shading Within Shading Zone Groups - No; !- Disable Self-Shading From Shading Zone Groups to Other Zones - - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:INSIDE =========== - -SurfaceConvectionAlgorithm:Inside, - TARP; !- Algorithm - - -!- =========== ALL OBJECTS IN CLASS: SURFACECONVECTIONALGORITHM:OUTSIDE =========== - -SurfaceConvectionAlgorithm:Outside, - DOE-2; !- Algorithm - - -!- =========== ALL OBJECTS IN CLASS: HEATBALANCEALGORITHM =========== - -HeatBalanceAlgorithm, - ConductionTransferFunction, !- Algorithm - 200, !- Surface Temperature Upper Limit {C} - 0.1, !- Minimum Surface Convection Heat Transfer Coefficient Value {W/m2-K} - 1000; !- Maximum Surface Convection Heat Transfer Coefficient Value {W/m2-K} - - -!- =========== ALL OBJECTS IN CLASS: TIMESTEP =========== - -Timestep, - 4; !- Number of Timesteps per Hour - - -!- =========== ALL OBJECTS IN CLASS: SITE:LOCATION =========== - -Site:Location, - DENVER_STAPLETON_CO_USA_WMO_724690, !- Name - 45.508888, !- Latitude {deg} - -73.561668, !- Longitude {deg} - -5, !- Time Zone {hr} - 44; !- Elevation {m} - - -!- =========== ALL OBJECTS IN CLASS: SIZINGPERIOD:DESIGNDAY =========== - -! DENVER_STAPLETON_CO_USA Annual Heating Design Conditions Wind Speed=2.3m/s Wind Dir=180 -! Coldest Month=December -! DENVER_STAPLETON_CO_USA Annual Heating 99.6%, MaxDB=-20°C -SizingPeriod:DesignDay, - DENVER_STAPLETON Ann Htg 99.6% Condns DB, !- Name - 12, !- Month - 21, !- Day of Month - WinterDesignDay, !- Day Type - -20, !- Maximum Dry-Bulb Temperature {C} - 0.0, !- Daily Dry-Bulb Temperature Range {deltaC} - , !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - Wetbulb, !- Humidity Condition Type - -20, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 83411., !- Barometric Pressure {Pa} - 2.3, !- Wind Speed {m/s} - 180, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAEClearSky, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - 0.00; !- Sky Clearness - -! DENVER_STAPLETON Annual Cooling Design Conditions Wind Speed=4m/s Wind Dir=120 -! Hottest Month=July -! DENVER_STAPLETON_CO_USA Annual Cooling (DB=>MWB) .4%, MaxDB=34.1°C MWB=15.8°C -SizingPeriod:DesignDay, - DENVER_STAPLETON Ann Clg .4% Condns DB=>MWB, !- Name - 7, !- Month - 21, !- Day of Month - SummerDesignDay, !- Day Type - 34.1, !- Maximum Dry-Bulb Temperature {C} - 15.2, !- Daily Dry-Bulb Temperature Range {deltaC} - , !- Dry-Bulb Temperature Range Modifier Type - , !- Dry-Bulb Temperature Range Modifier Day Schedule Name - Wetbulb, !- Humidity Condition Type - 15.8, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} - , !- Humidity Condition Day Schedule Name - , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} - , !- Enthalpy at Maximum Dry-Bulb {J/kg} - , !- Daily Wet-Bulb Temperature Range {deltaC} - 83411., !- Barometric Pressure {Pa} - 4, !- Wind Speed {m/s} - 120, !- Wind Direction {deg} - No, !- Rain Indicator - No, !- Snow Indicator - No, !- Daylight Saving Time Indicator - ASHRAEClearSky, !- Solar Model Indicator - , !- Beam Solar Day Schedule Name - , !- Diffuse Solar Day Schedule Name - , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} - , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} - 1.00; !- Sky Clearness - - -!- =========== ALL OBJECTS IN CLASS: RUNPERIOD =========== - -RunPeriod, - Run Period 1, !- Name - 1, !- Begin Month - 1, !- Begin Day of Month - , !- Begin Year - 12, !- End Month - 31, !- End Day of Month - , !- End Year - Sunday, !- Day of Week for Start Day - Yes, !- Use Weather File Holidays and Special Days - Yes, !- Use Weather File Daylight Saving Period - No, !- Apply Weekend Holiday Rule - Yes, !- Use Weather File Rain Indicators - Yes; !- Use Weather File Snow Indicators - - -!- =========== ALL OBJECTS IN CLASS: GLOBALGEOMETRYRULES =========== - -GlobalGeometryRules, - UpperLeftCorner, !- Starting Vertex Position - CounterClockWise, !- Vertex Entry Direction - World; !- Coordinate System - - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:VARIABLEDICTIONARY =========== - -Output:VariableDictionary, - IDF; !- Key Field - - -!- =========== ALL OBJECTS IN CLASS: OUTPUT:TABLE:SUMMARYREPORTS =========== - -Output:Table:SummaryReports, - AllSummary; !- Report 1 Name - - -!- =========== ALL OBJECTS IN CLASS: OUTPUTCONTROL:TABLE:STYLE =========== - -OutputControl:Table:Style, - HTML; !- Column Separator - +! Minimal.idf +! Basic file description: This is a minimal configuration necessary to run. +! Highlights: Illustrates minimal items necessary to perform run. +! BUILDING, SURFACEGEOMETRY, LOCATION and DESIGNDAY (or RUNPERIOD) are the absolute minimal required input objects. +! TIME STEP IN HOUR is included so as to not get warning error. +! Including two design days, Run Control object and RunPeriod to facilitate use. +! Although not incredibly useful, this could be used as a weather/solar calculator. +! Simulation Location/Run: Denver is included. Any could be used. +! Building: None. +! +! Internal gains description: None. +! +! HVAC: None. +! + + Version,9.4; + + Timestep,4; + + Building, + None, !- Name + 0.0000000E+00, !- North Axis {deg} + Suburbs, !- Terrain + 0.04, !- Loads Convergence Tolerance Value {W} + 0.40, !- Temperature Convergence Tolerance Value {deltaC} + FullInteriorAndExterior, !- Solar Distribution + 25, !- Maximum Number of Warmup Days + 6; !- Minimum Number of Warmup Days + + GlobalGeometryRules, + UpperLeftCorner, !- Starting Vertex Position + CounterClockWise, !- Vertex Entry Direction + World; !- Coordinate System + + Site:Location, + DENVER_STAPLETON_CO_USA_WMO_724690, !- Name + 39.77, !- Latitude {deg} + -104.87, !- Longitude {deg} + -7.00, !- Time Zone {hr} + 1611.00; !- Elevation {m} + + ! DENVER_STAPLETON_CO_USA Annual Heating Design Conditions Wind Speed=2.3m/s Wind Dir=180 + ! Coldest Month=December + ! DENVER_STAPLETON_CO_USA Annual Heating 99.6%, MaxDB=-20°C + + SizingPeriod:DesignDay, + DENVER_STAPLETON Ann Htg 99.6% Condns DB, !- Name + 12, !- Month + 21, !- Day of Month + WinterDesignDay, !- Day Type + -20, !- Maximum Dry-Bulb Temperature {C} + 0.0, !- Daily Dry-Bulb Temperature Range {deltaC} + , !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + -20, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} + , !- Humidity Condition Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 83411., !- Barometric Pressure {Pa} + 2.3, !- Wind Speed {m/s} + 180, !- Wind Direction {deg} + No, !- Rain Indicator + No, !- Snow Indicator + No, !- Daylight Saving Time Indicator + ASHRAEClearSky, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} + , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} + 0.00; !- Sky Clearness + + ! DENVER_STAPLETON Annual Cooling Design Conditions Wind Speed=4m/s Wind Dir=120 + ! Hottest Month=July + ! DENVER_STAPLETON_CO_USA Annual Cooling (DB=>MWB) .4%, MaxDB=34.1°C MWB=15.8°C + + SizingPeriod:DesignDay, + DENVER_STAPLETON Ann Clg .4% Condns DB=>MWB, !- Name + 7, !- Month + 21, !- Day of Month + SummerDesignDay, !- Day Type + 34.1, !- Maximum Dry-Bulb Temperature {C} + 15.2, !- Daily Dry-Bulb Temperature Range {deltaC} + , !- Dry-Bulb Temperature Range Modifier Type + , !- Dry-Bulb Temperature Range Modifier Day Schedule Name + Wetbulb, !- Humidity Condition Type + 15.8, !- Wetbulb or DewPoint at Maximum Dry-Bulb {C} + , !- Humidity Condition Day Schedule Name + , !- Humidity Ratio at Maximum Dry-Bulb {kgWater/kgDryAir} + , !- Enthalpy at Maximum Dry-Bulb {J/kg} + , !- Daily Wet-Bulb Temperature Range {deltaC} + 83411., !- Barometric Pressure {Pa} + 4, !- Wind Speed {m/s} + 120, !- Wind Direction {deg} + No, !- Rain Indicator + No, !- Snow Indicator + No, !- Daylight Saving Time Indicator + ASHRAEClearSky, !- Solar Model Indicator + , !- Beam Solar Day Schedule Name + , !- Diffuse Solar Day Schedule Name + , !- ASHRAE Clear Sky Optical Depth for Beam Irradiance (taub) {dimensionless} + , !- ASHRAE Clear Sky Optical Depth for Diffuse Irradiance (taud) {dimensionless} + 1.00; !- Sky Clearness + + RunPeriod, + Run Period 1, !- Name + 1, !- Begin Month + 1, !- Begin Day of Month + , !- Begin Year + 12, !- End Month + 31, !- End Day of Month + , !- End Year + Tuesday, !- Day of Week for Start Day + Yes, !- Use Weather File Holidays and Special Days + Yes, !- Use Weather File Daylight Saving Period + No, !- Apply Weekend Holiday Rule + Yes, !- Use Weather File Rain Indicators + Yes; !- Use Weather File Snow Indicators + + SimulationControl, + No, !- Do Zone Sizing Calculation + No, !- Do System Sizing Calculation + No, !- Do Plant Sizing Calculation + Yes, !- Run Simulation for Sizing Periods + No, !- Run Simulation for Weather File Run Periods + No, !- Do HVAC Sizing Simulation for Sizing Periods + 1; !- Maximum Number of HVAC Sizing Simulation Passes + + Output:VariableDictionary,Regular; + + Output:Variable,*,Site Outdoor Air Drybulb Temperature,Timestep; + + Output:Variable,*,Site Outdoor Air Wetbulb Temperature,Timestep; + + Output:Variable,*,Site Outdoor Air Dewpoint Temperature,Timestep; + + Output:Variable,*,Site Solar Azimuth Angle,Timestep; + + Output:Variable,*,Site Solar Altitude Angle,Timestep; + + Output:Variable,*,Site Direct Solar Radiation Rate per Area,Timestep; + + Output:Variable,*,Site Diffuse Solar Radiation Rate per Area,Timestep; + + OutputControl:Table:Style, + HTML; !- Column Separator + + Output:Table:SummaryReports, + AllSummary; !- Report 1 Name +