Importing a .msh file#
Objectives
We show here how to import a ".msh" mesh file generated with Gmsh externally and define the corresponding volume and surface integration measures.
Download sources
The geometry is a square plate of size \(L\) with a circular hole of radius \(R\). In the Gmsh file plate_hole.msh, the square domain boundary has been tagged 10 and the hole inner boundary as been tagged 20. We check that the corresponding area and perimeters match the expected values.
import numpy as np
from mpi4py import MPI
from dolfinx import io, fem
import ufl
L, R = 10, 2
domain, markers, facets = io.gmshio.read_from_msh("plate_hole.msh", MPI.COMM_WORLD)
dx = ufl.Measure("dx", domain=domain, subdomain_data=markers)
ds = ufl.Measure("ds", domain=domain, subdomain_data=facets)
area = fem.assemble_scalar(fem.form(1.0 * dx))
print(f"Expected area = {L**2-np.pi*R**2:.3f} Computed area = {area:.3f}")
length_1 = fem.assemble_scalar(fem.form(1.0 * ds(10)))
print(f"Expected length = {4*L:.3f} Computed length = {length_1:.3f}")
length_2 = fem.assemble_scalar(fem.form(1.0 * ds(20)))
print(f"Expected length = {2*np.pi*R:.3f} Computed length = {length_2:.3f}")
Info : Reading 'plate_hole.msh'...
Info : 19 entities
Info : 152 nodes
Info : 304 elements
Info : Done reading 'plate_hole.msh'
Expected area = 87.434 Computed area = 87.754
Expected length = 40.000 Computed length = 40.000
Expected length = 12.566 Computed length = 12.486
Show code cell source
import pyvista
from dolfinx import plot
pyvista.set_jupyter_backend("static")
topology, cell_types, geometry = plot.vtk_mesh(domain, 2)
grid = pyvista.UnstructuredGrid(topology, cell_types, geometry)
# Create plotter and pyvista grid
p = pyvista.Plotter()
p.add_mesh(grid, show_edges=True)
p.view_xy()
p.show_axes()
p.show()