Skip to main content

High-quality 2D mesh generator based on distmesh

Project description

dmsh

The worst mesh generator you'll ever use.

PyPi Version PyPI pyversions GitHub stars PyPi downloads

Discord

Inspired by distmesh, dmsh can be slow, requires a lot of memory, and isn't terribly robust either.

On the plus side,

  • it's got a user-friendly interface,
  • is pure Python (and hence easily installable on any system), and
  • it produces pretty high-quality meshes.

Combined with optimesh, dmsh produces the highest-quality 2D meshes in the west.

Examples

Primitives

circle circle circle
import dmsh
import meshio
import optimesh

geo = dmsh.Circle([0.0, 0.0], 1.0)
X, cells = dmsh.generate(geo, 0.1)

# optionally optimize the mesh
X, cells = optimesh.optimize_points_cells(X, cells, "CVT (full)", 1.0e-10, 100)

# visualize the mesh
dmsh.show(X, cells, geo)

# and write it to a file
meshio.Mesh(X, {"triangle": cells}).write("circle.vtk")
import dmsh

geo = dmsh.Rectangle(-1.0, +2.0, -1.0, +1.0)
X, cells = dmsh.generate(geo, 0.1)
import dmsh

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)

Combinations

Difference
import dmsh

geo = dmsh.Circle([-0.5, 0.0], 1.0) - dmsh.Circle([+0.5, 0.0], 1.0)
X, cells = dmsh.generate(geo, 0.1)
import dmsh

geo = 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.

import dmsh
import numpy as np

r = dmsh.Rectangle(-1.0, +1.0, -1.0, +1.0)
c = dmsh.Circle([0.0, 0.0], 0.3)
geo = r - c

X, cells = dmsh.generate(geo, lambda pts: np.abs(c.dist(pts)) / 5 + 0.05, tol=1.0e-10)
Union
import dmsh

geo = dmsh.Circle([-0.5, 0.0], 1.0) + dmsh.Circle([+0.5, 0.0], 1.0)
X, cells = dmsh.generate(geo, 0.15)
import dmsh

geo = 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)
import dmsh
import numpy as np

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

Intersection

import dmsh

geo = 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)
import dmsh
import numpy as np

angles = np.pi * np.array([3.0 / 6.0, 7.0 / 6.0, 11.0 / 6.0])
geo = dmsh.Intersection(
    [
        dmsh.Circle([np.cos(angles[0]), np.sin(angles[0])], 1.5),
        dmsh.Circle([np.cos(angles[1]), np.sin(angles[1])], 1.5),
        dmsh.Circle([np.cos(angles[2]), np.sin(angles[2])], 1.5),
    ]
)
X, cells = dmsh.generate(geo, 0.1, tol=1.0e-10)

The following uses the HalfSpace primtive for cutting off a circle.

import dmsh

geo = dmsh.HalfSpace([1.0, 1.0]) & dmsh.Circle([0.0, 0.0], 1.0)
X, cells = dmsh.generate(geo, 0.1)

Rotation, translation, scaling

import dmsh
import numpy as np

geo = dmsh.Rotation(dmsh.Rectangle(-1.0, +2.0, -1.0, +1.0), 0.1 * np.pi)
X, cells = dmsh.generate(geo, 0.1, tol=1.0e-10)
import dmsh

geo = dmsh.Rectangle(-1.0, +2.0, -1.0, +1.0) + [1.0, 1.0]
X, cells = dmsh.generate(geo, 0.1)
import dmsh

geo = dmsh.Rectangle(-1.0, +2.0, -1.0, +1.0) * 2.0
X, cells = dmsh.generate(geo, 0.1, tol=1.0e-5)

Local refinement

local-refinement

All objects can be used to refine the mesh according to the distance to the object; e.g. a Path:

import dmsh

geo = dmsh.Rectangle(0.0, 1.0, 0.0, 1.0)

p1 = dmsh.Path([[0.4, 0.6], [0.6, 0.4]])


def target_edge_length(x):
    return 0.03 + 0.1 * p1.dist(x)


X, cells = dmsh.generate(geo, target_edge_length, tol=1.0e-10)

Custom shapes

It is also possible to define your own geometry. Simply create a class derived from dmsh.Geometry that contains a dist method and a method to project points onto the boundary.

import dmsh
import numpy as np


class MyDisk(dmsh.Geometry):
    def __init__(self):
        self.r = 1.0
        self.x0 = [0.0, 0.0]
        bounding_box = [-1.0, 1.0, -1.0, 1.0]
        feature_points = np.array([[], []]).T
        super().__init__(bounding_box, feature_points)

    def dist(self, x):
        assert x.shape[0] == 2
        y = (x.T - self.x0).T
        return np.sqrt(np.einsum("i...,i...->...", y, y)) - self.r

    def boundary_step(self, x):
        # project onto the circle
        y = (x.T - self.x0).T
        r = np.sqrt(np.einsum("ij,ij->j", y, y))
        return ((y / r * self.r).T + self.x0).T


geo = MyDisk()
X, cells = dmsh.generate(geo, 0.1)

Debugging

level-set-poly level-set-rect-hole

dmsh is rather fragile, but sometimes the break-downs are due to an incorrectly defined geometry. Use

geo.show()

to inspect the level set function of your domain. (It must be negative inside the domain and positive outside. The 0-level set forms the domain boundary.)

Installation

dmsh is available from the Python Package Index, so simply type

pip install dmsh

to install.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

dmsh-0.3.8a1-cp314-none-any.whl (103.7 kB view details)

Uploaded CPython 3.14

dmsh-0.3.8a1-cp313-none-any.whl (99.3 kB view details)

Uploaded CPython 3.13

dmsh-0.3.8a1-cp312-none-any.whl (99.1 kB view details)

Uploaded CPython 3.12

dmsh-0.3.8a1-cp311-none-any.whl (108.8 kB view details)

Uploaded CPython 3.11

dmsh-0.3.8a1-cp310-none-any.whl (57.4 kB view details)

Uploaded CPython 3.10

File details

Details for the file dmsh-0.3.8a1-cp314-none-any.whl.

File metadata

  • Download URL: dmsh-0.3.8a1-cp314-none-any.whl
  • Upload date:
  • Size: 103.7 kB
  • Tags: CPython 3.14
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dmsh-0.3.8a1-cp314-none-any.whl
Algorithm Hash digest
SHA256 38be71827d485340f81ea8a2ec2831bf6b60ad559145f2c98496ae078e2c9f47
MD5 3e2a147a019091007a7fee94fe6ff737
BLAKE2b-256 00b9d7d0baa18b8b804efc5caf2d25b4f3c67baa6c4e5c57fb63e0794e9c5508

See more details on using hashes here.

Provenance

The following attestation bundles were made for dmsh-0.3.8a1-cp314-none-any.whl:

Publisher: release.yml on meshpro/dmsh-dev

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dmsh-0.3.8a1-cp313-none-any.whl.

File metadata

  • Download URL: dmsh-0.3.8a1-cp313-none-any.whl
  • Upload date:
  • Size: 99.3 kB
  • Tags: CPython 3.13
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dmsh-0.3.8a1-cp313-none-any.whl
Algorithm Hash digest
SHA256 7d8585213685cbef8f60652085e9802d390623568224738d6389376a604c29f2
MD5 9bef792e5bd1d5dd8bae233681b67ee1
BLAKE2b-256 2997103d669ca9b43bbc7a950a9971385e7db3d2ecc04a0aba5342b1aef19f39

See more details on using hashes here.

Provenance

The following attestation bundles were made for dmsh-0.3.8a1-cp313-none-any.whl:

Publisher: release.yml on meshpro/dmsh-dev

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dmsh-0.3.8a1-cp312-none-any.whl.

File metadata

  • Download URL: dmsh-0.3.8a1-cp312-none-any.whl
  • Upload date:
  • Size: 99.1 kB
  • Tags: CPython 3.12
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dmsh-0.3.8a1-cp312-none-any.whl
Algorithm Hash digest
SHA256 11d3f93f893d4a47f1852d44f360ab615aa4bfbfbd7c1df9f003a6732290e29e
MD5 a5d1d6a4ce2eec7267c2678a78065055
BLAKE2b-256 f75a08098051754d5e32a665fe4da9762e768dfa0f72e05e2096d70631eec77e

See more details on using hashes here.

Provenance

The following attestation bundles were made for dmsh-0.3.8a1-cp312-none-any.whl:

Publisher: release.yml on meshpro/dmsh-dev

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dmsh-0.3.8a1-cp311-none-any.whl.

File metadata

  • Download URL: dmsh-0.3.8a1-cp311-none-any.whl
  • Upload date:
  • Size: 108.8 kB
  • Tags: CPython 3.11
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dmsh-0.3.8a1-cp311-none-any.whl
Algorithm Hash digest
SHA256 c18757f4cff08b46fbec0fd43ec77654abc3e6fd8399e44c22b3c250aa89252e
MD5 70cd010bba22784259bd128157706422
BLAKE2b-256 088c7e0f643b96e02bbe4161faea2e76f69fdff8c376283d2a2a66f0007aa34e

See more details on using hashes here.

Provenance

The following attestation bundles were made for dmsh-0.3.8a1-cp311-none-any.whl:

Publisher: release.yml on meshpro/dmsh-dev

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dmsh-0.3.8a1-cp310-none-any.whl.

File metadata

  • Download URL: dmsh-0.3.8a1-cp310-none-any.whl
  • Upload date:
  • Size: 57.4 kB
  • Tags: CPython 3.10
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for dmsh-0.3.8a1-cp310-none-any.whl
Algorithm Hash digest
SHA256 2fb0c7049260fa34807fae0834c2582e83665ff1c53574bd46e0d152a936417d
MD5 1629fa4df7285674d05c7a8ee822a417
BLAKE2b-256 816a76beea42742509bb3f4ac928cf7979e8dded1dc8c1d90bbcc01e923e3597

See more details on using hashes here.

Provenance

The following attestation bundles were made for dmsh-0.3.8a1-cp310-none-any.whl:

Publisher: release.yml on meshpro/dmsh-dev

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page