How to convert a CERFACS mesh?
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 (
To show the simplest way of doing it, let’s start by creating a mesh using
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();
yamio (a wrapper of
meshio with added functionality) allows the conversion of the mesh to a format readable by
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'][()]]
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)
Check this out to understand how boundary patch information can be used to apply boundary conditions.