10. Generate mesh

This demo is implemented in a single Python file, demo_mesh_generaton.py, and the 3D geometries are described in two .off file (Object File Format), tetrahedron.off and cube.off.

This demo illustrates how to:

  • Generate a 2D mesh of a polygon
  • Generate a 3D mesh of a polyhedral using .off files

10.1. Problem definition

This demo focuses purely on generating meshes. In this demo we will use the following classes in DOLFIN:

  • PolygonalMeshGenerator
  • PolyhedralMeshGenerator

10.2. Implementation

First, the dolfin module is imported:

from dolfin import *

PolygonalMeshGenerator and PolyhedralMeshGenerator need CGAL to generate

the meshes, so we check that DOLFIN is compiled with CGAL.
if not has_cgal():
    print "DOLFIN must be compiled with CGAL to run this demo."
    exit(0)

We create an empty mesh using Mesh. We need this mesh as an argument to PolygonalMeshGenerator and PolyhedralMeshGenerator.

# Create empty Mesh
mesh = Mesh()

We are now ready to make the geometries. We start with a polygon and define it by making a list of its vertices. We need a closed contour, so the first and the last element in the list is the same point. We represent the points with instances of Point. Point takes \((x,y,z)\) as arguments, but since they all have default value 0, and we have a 2D-geometry, we can omit \(z\).

# Create list of polygonal domain vertices
domain_vertices = [Point(0.0, 0.0),
                   Point(10.0, 0.0),
                   Point(10.0, 2.0),
                   Point(8.0, 2.0),
                   Point(7.5, 1.0),
                   Point(2.5, 1.0),
                   Point(2.0, 4.0),
                   Point(0.0, 4.0),
                   Point(0.0, 0.0)]

We send our list of points to PolygonalMeshGenerator along with the empty mesh and the cell size. The cell size decides the resolution of the mesh. We set interactive to True so that we are able to rotate, resize and translate the mesh.

# Generate mesh and plot
PolygonalMeshGenerator.generate(mesh, domain_vertices, 0.25);
plot(mesh, interactive=True)
../../../../_images/plot_polygonmesh.png

The geometry for the next two meshes are described by .off-files. It is easy to make off-files, so we will go through the four parts of the files:

  • The first line is just OFF
  • The second line consist of three numbers: the first one is the number of vertices, the second is the number of faces and the third is the number of edges. The number of edges will not be used so we set it to 0.
  • On line three we start listing the vertices, one vertex is described by its coordinates (three numbers) on each line.
  • The last part of the file describes the faces (facets, sides) of the geometry. One face is described on one line where the first number says how many vertices we need to represent the face (in a cube we need four, but in a tetrahedron we need three). We then list the vertices describing the face. We use the vertices defined above and start our “indexing” at 0.
OFF
Number_of_vertices(n) Number_of_faces(q) Number_of_edges
x1 y1 z1
x2 y2 z2
...
...
xn yn zn
number_of_vertices_on_face_1(m) vertex_1 vertex_2 vertex_3 ... vertex_m
number_of_vertices_on_face_2(k) vertex_1 vertex_2 vertex_3 ... vertex_k
number_of_vertices_on_face_3(l) vertex_1 vertex_2 vertex_3 ... vertex_l
...
...
number_of_vertices_on_face_q(i) vertex_1 vertex_2 vertex_3 ... vertex_i

We send the empty mesh, the off-file and the resolution (cell size) to PolyhedralMeshGenerator

# Generate 3D mesh from OFF file input (tetrahedron)
PolyhedralMeshGenerator.generate(mesh, "../tetrahedron.off", 0.05)
plot(mesh, interactive=True)

# Generate 3D mesh from OFF file input (cube)
PolyhedralMeshGenerator.generate(mesh, "../cube.off", 0.05)
plot(mesh, interactive=True)
../../../../_images/plot_tetrahedronmesh.png ../../../../_images/plot_cubemesh.png

10.3. Complete code



from dolfin import *

if not has_cgal():
    print "DOLFIN must be compiled with CGAL to run this demo."
    exit(0)

# Create empty Mesh
mesh = Mesh()

# Create list of polygonal domain vertices
domain_vertices = [Point(0.0, 0.0),
                   Point(10.0, 0.0),
                   Point(10.0, 2.0),
                   Point(8.0, 2.0),
                   Point(7.5, 1.0),
                   Point(2.5, 1.0),
                   Point(2.0, 4.0),
                   Point(0.0, 4.0),
                   Point(0.0, 0.0)]

# Generate mesh and plot
PolygonalMeshGenerator.generate(mesh, domain_vertices, 0.25);
plot(mesh, interactive=True)

# Generate 3D mesh from OFF file input (tetrahedron)
PolyhedralMeshGenerator.generate(mesh, "../tetrahedron.off", 0.05)
plot(mesh, interactive=True)

# Generate 3D mesh from OFF file input (cube)
PolyhedralMeshGenerator.generate(mesh, "../cube.off", 0.05)
plot(mesh, interactive=True)