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.7-cp314-none-any.whl (102.8 kB view details)

Uploaded CPython 3.14

dmsh-0.3.7-cp313-none-any.whl (98.6 kB view details)

Uploaded CPython 3.13

dmsh-0.3.7-cp312-none-any.whl (98.5 kB view details)

Uploaded CPython 3.12

dmsh-0.3.7-cp311-none-any.whl (108.1 kB view details)

Uploaded CPython 3.11

dmsh-0.3.7-cp310-none-any.whl (57.0 kB view details)

Uploaded CPython 3.10

File details

Details for the file dmsh-0.3.7-cp314-none-any.whl.

File metadata

  • Download URL: dmsh-0.3.7-cp314-none-any.whl
  • Upload date:
  • Size: 102.8 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.7-cp314-none-any.whl
Algorithm Hash digest
SHA256 59e2ee5cf4d122bae7ef778a54c1d9455606b7b7e3581afa7d8645bc198b5dc5
MD5 ff6cc116de2a5739b4fad60f25952c7c
BLAKE2b-256 e5b5f8527cd5a893653393c8640dc5b33431fc5efc009b64432af300d1700362

See more details on using hashes here.

Provenance

The following attestation bundles were made for dmsh-0.3.7-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.7-cp313-none-any.whl.

File metadata

  • Download URL: dmsh-0.3.7-cp313-none-any.whl
  • Upload date:
  • Size: 98.6 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.7-cp313-none-any.whl
Algorithm Hash digest
SHA256 cbe1c5bac3d7ae6c43ad7b765fe519861b543f35e95ad13045d3a98999f4911f
MD5 aafe6f1be911743167f3b2c36ee7b5bd
BLAKE2b-256 ff34fd34c1ac4058dcb6221bac8e52f5dbdb3b983ecb12e3164f75f195d5e4c4

See more details on using hashes here.

Provenance

The following attestation bundles were made for dmsh-0.3.7-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.7-cp312-none-any.whl.

File metadata

  • Download URL: dmsh-0.3.7-cp312-none-any.whl
  • Upload date:
  • Size: 98.5 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.7-cp312-none-any.whl
Algorithm Hash digest
SHA256 1ca2fa720c1800a81b7fdb2114e38b42dbd1e38d98a8bd475ed91c3df107df6f
MD5 b40eb362b6a9c9b01d33eb09c2f3e028
BLAKE2b-256 5ff42f7ff9d7b628d9b4786e7c2219b902e028cae392876b132d2c060a93e4c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for dmsh-0.3.7-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.7-cp311-none-any.whl.

File metadata

  • Download URL: dmsh-0.3.7-cp311-none-any.whl
  • Upload date:
  • Size: 108.1 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.7-cp311-none-any.whl
Algorithm Hash digest
SHA256 757402d8175d1a03ae0328382131dc26e3ebf048acb54249335d1da13c606f2d
MD5 b22769bc9df30bb9d3dc5877206ce78e
BLAKE2b-256 2c7091d002cc7306b1b8d8ec7bf89836f6fac9cee07f8d2b86f5a5e55cf92f02

See more details on using hashes here.

Provenance

The following attestation bundles were made for dmsh-0.3.7-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.7-cp310-none-any.whl.

File metadata

  • Download URL: dmsh-0.3.7-cp310-none-any.whl
  • Upload date:
  • Size: 57.0 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.7-cp310-none-any.whl
Algorithm Hash digest
SHA256 c39ad41bdc4776b05f5760033d38711f2d2e7cb457d7f4ffa778c0ba5ebbf561
MD5 d016a4138cf5f2b194506e9f7d9bfad7
BLAKE2b-256 294b2e48f138be491018008531bab6a1e2808ef5d63a982f4a2b99006961e02f

See more details on using hashes here.

Provenance

The following attestation bundles were made for dmsh-0.3.7-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