How to convert a CERFACS mesh?#

We can create simple meshes inside FEniCS, such as rectangles (dolfin.cpp.generation.RectangleMesh) and 3D boxes (dolfin.cpp.generation.BoxMesh). Nevertheless, non-academic applications normally require more complex geometries. For such cases, you are advised to use your own favorite CAD tool and mesh generator and rely on mesh conversion tools (such as pyhip, yamio/meshio and/or dolfin-convert) to convert it to the desired format (dolfin .xml).

To show the simplest way of doing it, let’s start by creating a mesh using pyhip:

from pyhip.commands.operations import generate_mesh_2d_3d
from pyhip.commands.writers import write_hdf5

lower_corner = (0., 0.)
upper_corner = (1., 1.)
resolution = (10, 10)
convert2tri = False
extru_range = (0., 1.)
extru_axis = 'z'
extru_res = 10

generate_mesh_2d_3d(lower_corner, upper_corner, resolution,
                    convert2tri=convert2tri, extru_range=extru_range,
                    extru_axis=extru_axis, extru_res=extru_res)
write_hdf5(mesh_filename)

hip_exit();
../_images/cube.png

yamio (a wrapper of meshio with added functionality) allows the conversion of the mesh to a format readable by dolfin:

import yamio

mesh = yamio.read(mesh_filename)
mesh.write(dolfin_filename, file_format='dolfin-yamio')

Currently, this command creates two files, one containing information about mesh points and connectivities, and another containing information about the boundaries (in the future we will probably merge both files).

The mesh can now be read in FEniCS:

from dolfin.cpp.mesh import Mesh
from dolfin.cpp.io import XDMFFile

mesh = Mesh()
with XDMFFile(dolfin_filename) as file:
    file.read(mesh)

Boundary information can be loaded in the following way:

import h5py

from dolfin.cpp.mesh import MeshFunctionSizet
from dolfin.mesh.meshvaluecollection import MeshValueCollection

# define markers
mvc = MeshValueCollection("size_t", mesh)
with XDMFFile(dolfin_bnd_filename) as file:
    file.read(mvc, "bnd_patches")

boundary_markers = MeshFunctionSizet(mesh, mvc)

# load patch names
with h5py.File(h5_dolfin_bnd_filename, 'r') as h5_file:
    patch_labels = [name.decode('utf-8').strip() for name in h5_file['PatchLabels'][()]]

Note

fenics_utils contains a function that abstracts these last two blocks of code:

from fenics_utils.mesh.external import load_dolfin_mesh

mesh, boundary_markers, patch_labels = load_dolfin_mesh(dolfin_filename)

Note

Check this out to understand how boundary patch information can be used to apply boundary conditions.