7. Create CSG 3D-geometry

This demo is implemented in a single Python file, demo_csg-3D.py, and demonstrates usage of 3D geometries in DOLFIN.

This demo illustrates how to:

  • Define Constructive Solid Geometry (CSG)
  • Generate meshes from geometries

The domain looks as follows:

../../../../_images/csg3D_boundary.png

and the mesh:

../../../../_images/csg3D_mesh.png

7.1. Problem definition

We do not have any equation in this demo. The demo focuses purely on the geometry and how to generate a mesh from it.

7.2. Implementation

This description goes through how to make 3-dimensional geometries and meshes in DOLFIN, as implemented in demo_csg-3D.py.

First, the dolfin module is imported:

from dolfin import *

Then we check if CGAL is installed, as it is needed to run this demo:

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

Now we define 3D geometries. We start with defining a box by sending the coordinates of two opposite corners as arguments to the class Box.

box = Box(0, 0, 0, 1, 1, 1)

We create a sphere by sending the center and radius to Sphere. The center \((x_0, y_0, z_0)\) is represented by an instance of Point.

sphere = Sphere(Point(0, 0, 0), 0.3)

We define a Cone by four arguments, the center at one end Point (\(x_1,y_1,z_1\)), the center at the other end Point (\(x_2,y_2,z_2\)), and the radii at these points.

cone = Cone(Point(0, 0, -1), Point(0, 0, 1), 1., .5)

Now we have some geometries that we can play with:

g3d = box + cone - sphere

This simple line makes a geometry of the union of the box and the cone, from which the sphere is subtracted.

To get information about our new geometry we use the function info. This function takes a string or a DOLFIN object as argument, and optionally we can give a second argument to indicate whether verbose object data should be printed. If the second argument is False (which is default), a one-line summary is printed. If True, verbose and sometimes very exhaustive object data are printed.

# Test printing
info("\nCompact output of 3D geometry:")
info(g3d)
info("\nVerbose output of 3D geometry:")
info(g3d, True)

To visualize our geometry we plot it:

plot(g3d, "3D geometry (surface)")

The second argument is optional and it specifies title of the plot.

Finally, we generate a mesh using Mesh and plot it.

mesh3d = Mesh(g3d, 32)
info(mesh3d)
plot(mesh3d, "3D mesh")

Note that when we create a mesh from a CSG geometry, the resolution must be specified as a second argument to the Mesh constructor.

7.3. Complete code


from dolfin import *

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


# Define 3D geometry
box = Box(0, 0, 0, 1, 1, 1)
sphere = Sphere(Point(0, 0, 0), 0.3)
cone = Cone(Point(0, 0, -1), Point(0, 0, 1), 1., .5)

g3d = box + cone - sphere

# Test printing
info("\nCompact output of 3D geometry:")
info(g3d)
info("\nVerbose output of 3D geometry:")
info(g3d, True)

# Plot geometry
plot(g3d, "3D geometry (surface)")

# Generate and plot mesh
mesh3d = Mesh(g3d, 32)
info(mesh3d)
plot(mesh3d, "3D mesh")

interactive()