The worst mesh generator you'll ever use.
Inspired by distmesh, dmsh
- is slow,
- requires a lot of memory, and
- isn't terribly robust either.
On the plus side,
- it's got a usable interface,
- is pure Python (and hence easily installable on any system), and
- if it works, it produces pretty high-quality meshes.
Combined with optimesh, dmsh produces the highest-quality 2D meshes in the west.
import dmsh
geo = dmsh.Circle([0.0, 0.0], 1.0)
X, cells = dmsh.generate(geo, 0.1)
# optionally optimize the mesh
import optimesh
X, cells = optimesh.cvt.quasi_newton_uniform_full(X, cells, 1.0e-10, 100)
# and write it to a file
import meshio
meshio.write_points_cells("circle.vtk", X, {"triangle": cells})geo = dmsh.Rectangle(-1.0, +2.0, -1.0, +1.0)
X, cells = dmsh.generate(geo, 0.1)geo = dmsh.Polygon(
[
[0.0, 0.0],
[1.1, 0.0],
[1.2, 0.5],
[0.7, 0.6],
[2.0, 1.0],
[1.0, 2.0],
[0.5, 1.5],
]
)
X, cells = dmsh.generate(geo, 0.1)


geo = dmsh.Difference(dmsh.Circle([-0.5, 0.0], 1.0), dmsh.Circle([+0.5, 0.0], 1.0))
X, cells = dmsh.generate(geo, 0.1)geo = dmsh.Difference(
dmsh.Circle([0.0, 0.0], 1.0),
dmsh.Polygon([[0.0, 0.0], [1.5, 0.4], [1.5, -0.4]]),
)
X, cells = dmsh.generate(geo, 0.1, tol=1.0e-10)The following example uses a nonconstant edge length; it depends on the distance to the
circle c.
r = dmsh.Rectangle(-1.0, +1.0, -1.0, +1.0)
c = dmsh.Circle([0.0, 0.0], 0.3)
geo = dmsh.Difference(r, c)
numpy.random.seed(0)
X, cells = dmsh.generate(
geo, lambda pts: numpy.abs(c.dist(pts)) / 5 + 0.05, tol=1.0e-10
)


geo = dmsh.Union([dmsh.Circle([-0.5, 0.0], 1.0), dmsh.Circle([+0.5, 0.0], 1.0)])
X, cells = dmsh.generate(geo, 0.15)geo = dmsh.Union(
[dmsh.Rectangle(-1.0, +0.5, -1.0, +0.5), dmsh.Rectangle(-0.5, +1.0, -0.5, +1.0)]
)
X, cells = dmsh.generate(geo, 0.15)angles = numpy.pi * numpy.array([3.0 / 6.0, 7.0 / 6.0, 11.0 / 6.0])
geo = dmsh.Union(
[
dmsh.Circle([numpy.cos(angles[0]), numpy.sin(angles[0])], 1.0),
dmsh.Circle([numpy.cos(angles[1]), numpy.sin(angles[1])], 1.0),
dmsh.Circle([numpy.cos(angles[2]), numpy.sin(angles[2])], 1.0),
]
)
X, cells = dmsh.generate(geo, 0.15)


geo = dmsh.Intersection(
[dmsh.Circle([0.0, -0.5], 1.0), dmsh.Circle([0.0, +0.5], 1.0)]
)
X, cells = dmsh.generate(geo, 0.1, tol=1.0e-10)angles = numpy.pi * numpy.array([3.0 / 6.0, 7.0 / 6.0, 11.0 / 6.0])
geo = dmsh.Intersection(
[
dmsh.Circle([numpy.cos(angles[0]), numpy.sin(angles[0])], 1.5),
dmsh.Circle([numpy.cos(angles[1]), numpy.sin(angles[1])], 1.5),
dmsh.Circle([numpy.cos(angles[2]), numpy.sin(angles[2])], 1.5),
]
)
X, cells = dmsh.generate(geo, 0.1, tol=1.0e-10)The following uses the HalfSpace primtive for cutting of a circle.
geo = dmsh.Intersection(
[
dmsh.HalfSpace(numpy.sqrt(0.5) * numpy.array([1.0, 1.0]), 0.0),
dmsh.Circle([0.0, 0.0], 1.0),
]
)
X, cells = dmsh.generate(geo, 0.1)geo = dmsh.Rotation(dmsh.Rectangle(-1.0, +2.0, -1.0, +1.0), 0.1 * numpy.pi)
X, cells = dmsh.generate(geo, 0.1, tol=1.0e-10)geo = dmsh.Translation(dmsh.Rectangle(-1.0, +2.0, -1.0, +1.0), [1.0, 1.0])
X, cells = dmsh.generate(geo, 0.1, show=show)geo = dmsh.Scaling(dmsh.Rectangle(-1.0, +2.0, -1.0, +1.0), 2.0)
X, cells = dmsh.generate(geo, 0.1, show=show, tol=1.0e-5)All objects can be used to refine the mesh according to the distance to the object;
e.g. a Path:
geo = dmsh.Rectangle(0.0, 1.0, 0.0, 1.0)
p1 = dmsh.Path([[0.4, 0.6], [0.6, 0.4]])
def edge_size(x):
return 0.03 + 0.1 * p1.dist(x)
X, cells = dmsh.generate(geo, edge_size, show=show, tol=1.0e-10)dmsh is available from the Python Package Index, so simply type
pip3 install dmsh --user
to install.
To run the dmsh unit tests, check out this repository and type
pytest
dmsh is published under the MIT license.





