Question-and-Answer Resource for the Building Energy Modeling Community
Get started with the Help page

# How do I describe a roof surface with a hole (a 'ringed' surface)?

Is there a way to describe in the IDF file a surface with a hole?

My model has a hole in a roof, as in the images below. This hole is actually another building component - the ceiling of the space beneath or floor of a space above).

The model

The surface

I am trying to figure out if there's a way to describe this hole purely by describing the coordinates of the roof and the hole in the BuildingSurface:Detailed object.

edit retag close merge delete

Sort by ยป oldest newest most voted

You can fix this situation using geomeppy (PyPI, GitHub). The function geomeppy.polygons.break_polygons splits the larger surface into two surfaces that surround the hole.

To use it you need to convert the surfaces to geomeppy.Polygon3D objects.

from geomeppy import IDF
from geomeppy.polygons import Polygon3D
from geomeppy.polygons import break_polygons

# set your IDF up as normal, but using the IDF object imported from geomeppy

# larger_surface is the one which has a hole
# smaller_surface is the one which is a hole

surface = Polygon3D(larger_surface.coords)
hole = Polygon3D(smaller_surface.coords)

new_surfaces = break_polygons(surface, hole)  # produces two sets of coords for the split surface

# get the global geometry rules for your IDF
try:
ggr = idf.idfobjects['GLOBALGEOMETRYRULES'][0]
except IndexError:
ggr = None

for i, new_coords in enumerate(new_surfaces, 1):
new = idf.copyidfobject(larger_surface)
new.Name = "%s_%i" % (larger_surface.Name, i)
set_coords(new, new_coords, ggr)

# remove the old surface
idf.removeidfobject(larger_surface)


Alternatively, if you read your IDF into geomeppy then it will take care of all the surface intersections for you. Just call idf.intersect() on your geomeppy.IDF object.

Here's the result of calling idf.intersect() on a test building similar to the one in your example.

more

Hi Jamie and Yair,

Another approach can be to subtract the hole from the base surface by adding the coordinates of the hole in the opposite direction from the Vertex Entry Direction specified in the GlobalGeometryRules object. For example if the Vertex Entry Direction is Counterclockwise than the hole coordinates direction has to be Clockwise. However, the outer ring has to be connected to the inner ring somewhere (red line in the chart bellow). The surface with hole presented in the chart, in order to be recognized by E+, should have the following coordinates:

(0,0,Z),(4,0,Z),(4,3,Z),(0,3,Z),(0,0,Z),(1,1,Z),(1,2,Z),(3,2,Z),(3,1,Z),(1,1,Z)

This can get a bit more complex if there is more than one hole. In that case there have to be more than one connection between the inner ring and the outer ring. I found the most suitable place to connect inner ring with outer ring to be the shortest distance between coordinates of these two rings as shown in the second figure.

more

1

Thanks Ivan, I remember you describe this approach when we met. One issue with it is that the results is a non-convex polygons. This, in turn, will cause sever errors when EnergyPlus calculates shadows (while Ive found that these errors seem to have a minimal impact on results, if any at all, they are still Sever Errors).

( 2016-09-16 08:00:41 -0500 )edit
1

I am not sure that a non-convex surface causes severe error. It raises a warning, however, L-shape is also non-convex polygon which results in warning when determining shadowing combinations (in case when there is a shading from other zone or detached shading element).

( 2016-09-16 08:15:39 -0500 )edit

No, you can't put a hole in a BuildingSurfaces:Detailed object (other than as a sub-surface). You can however put two or more BuildingSurfaces:Detailed objects together that result in a hole.

Look at the stacked spaces on the left of the screenshots in this post. It shows how to model a "hole" in the roof by having 4 non-convex surfaces.

more

@yair I know you're interested in doing this automatically (as am I) so the important part of the linked post is the link to the ruby code in the BCL, which leads you on to the C++ code in OpenStudio here.

( 2016-08-24 17:28:09 -0500 )edit

Thanks @David Goldwasser, I tried the first approach (hole as a sub-surface): describing it as a "FenestrationSurface:Detailed",(door) but got some issues: There seems to be an issue with the contradiction between the fenestrations "Outside_Boundary_Condition_Object" (which I tried either "blank" or the name of the matching surface the floor above) and its source Building_Surface_Name (i.e., the roof, which is exposed to the sun and wind):* Severe * GetSurfaceData: Subsurface="W0" exterior condition [interzone surface] in a base surface="14" with exterior condition [ExternalEnvironment]

( 2016-09-14 12:46:12 -0500 )edit

"FenestrationSurface:Detailed" inherits its outside boundary condition from the base surface that hosts it. You can't have a base surface with "Outdoors" and have a sub-surface with something different. The "Outside Boundary Condition Object" for the sub-surface is only used if it is on a base surface has outside boundary condition of "Surface".

( 2016-09-14 13:04:36 -0500 )edit

So, if this is the case, I understand that I can not use a sub-surface to describe the ceiling of the case above? Is there any other approach, other than braking the roof into 4 non-convex surfaces as you described in your post above?

( 2016-09-14 13:14:36 -0500 )edit

Not that I can think of, other some variations on how specifically you break up the surface.

( 2016-09-14 13:23:40 -0500 )edit