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

Uploaded CPython 3.14

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

Uploaded CPython 3.13

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

Uploaded CPython 3.12

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

Uploaded CPython 3.11

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

Uploaded CPython 3.10

File details

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

File metadata

  • Download URL: dmsh-0.3.8-cp314-none-any.whl
  • Upload date:
  • Size: 103.6 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.8-cp314-none-any.whl
Algorithm Hash digest
SHA256 f3eb6c9f051ba0f53bcd1def46b251afe5e9ede10f0f44877df5c39db6cc73db
MD5 23eb44cc1c84054b0bbf5c008b291e55
BLAKE2b-256 9bb69c0e3249d724fc6f6690452ac7801f40acc273d9d37f8eed20fa1601baa7

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: dmsh-0.3.8-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.8-cp313-none-any.whl
Algorithm Hash digest
SHA256 5a109ecd92ecfbe2d3bee130d2056a4c77753cedc384852683aecaa6ba31cf2e
MD5 9abdc8e3a4f8505aeda45ced226bb677
BLAKE2b-256 6a7eb8c4fae84a8d407d0d43db32bd84dadca7ec2fc1218f403cfb1324cb17c2

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: dmsh-0.3.8-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.8-cp312-none-any.whl
Algorithm Hash digest
SHA256 56674037b1ae0fe64fb00efda91103360ac570ff448a78f0b2270dbb6fa910e2
MD5 70064b863763c8d9b6b19b510e8131c8
BLAKE2b-256 20410fbce2f33a295eab9c90ba3ddab24c4706b312e9c13926b85ff592d5f0e8

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: dmsh-0.3.8-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.8-cp311-none-any.whl
Algorithm Hash digest
SHA256 cb6dc559fd349c3d44d2a43e6b7c1f2834ff237d3aaff8f9ad78a48f49d77b2c
MD5 fede2e225781c6e03bee248ebf07e371
BLAKE2b-256 c3feca683e8eec88749e3cb549368fce98277e394208ceada013c8422fd78b5a

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: dmsh-0.3.8-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.8-cp310-none-any.whl
Algorithm Hash digest
SHA256 45366706a2fe245594c9e123ac061871019bd82f6807d72dde56133570e593e3
MD5 b8728f29cb4967ca6ca90544d715270f
BLAKE2b-256 3e21a1f8c20f5048e3704e37ada7bc21b5f77dadd4d12dd55093c442ce300e02

See more details on using hashes here.

Provenance

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