Skip to main content

Mesh optimization/smoothing

Project description

optimesh

Triangular mesh optimization.

PyPi Version PyPI pyversions DOI GitHub stars PyPi downloads

Discord

Several mesh smoothing/optimization methods with one simple interface. optimesh

  • is fast,
  • preserves submeshes,
  • only works for triangular meshes, flat and on a surface, (for now; upvote this issue if you're interested in tetrahedral mesh smoothing), and
  • supports all mesh formats that meshio can handle.

Installation

Install optimesh from PyPI with

pip install optimesh

How to get a license

Licenses for personal and academic use can be purchased here. You'll receive a confirmation email with a license key. Install the key with

slim install <your-license-key>

on your machine and you're good to go.

For commercial use, please contact support@mondaytech.com.

Using optimesh

Example call:

optimesh in.e out.vtk

Output: terminal-screenshot

The left hand-side graph shows the distribution of angles (the grid line is at the optimal 60 degrees). The right hand-side graph shows the distribution of simplex quality, where quality is twice the ratio of circumcircle and incircle radius.

All command-line options are documented at

optimesh -h

Showcase

disk-step0

The following examples show the various algorithms at work, all starting from the same randomly generated disk mesh above. The cell coloring indicates quality; dark green is bad, yellow is good.

CVT (centroidal Voronoi tessellation)

cvt-uniform-lloyd2 cvt-uniform-qnb cvt-uniform-qnf
uniform-density relaxed Lloyd's algorithm (--method lloyd --omega 2.0) uniform-density quasi-Newton iteration (block-diagonal Hessian, --method cvt-block-diagonal) uniform-density quasi-Newton iteration (default method, full Hessian, --method cvt-full)

Centroidal Voronoi tessellation smoothing (Du et al.) is one of the oldest and most reliable approaches. optimesh provides classical Lloyd smoothing as well as several variants that result in better meshes.

CPT (centroidal patch tessellation)

cpt-cp cpt-uniform-fp cpt-uniform-qn
density-preserving linear solve (Laplacian smoothing, --method cpt-linear-solve) uniform-density fixed-point iteration (--method cpt-fixed-point) uniform-density quasi-Newton (--method cpt-quasi-newton)

A smoothing method suggested by Chen and Holst, mimicking CVT but much more easily implemented. The density-preserving variant leads to the exact same equation system as Laplacian smoothing, so CPT smoothing can be thought of as a generalization.

The uniform-density variants are implemented classically as a fixed-point iteration and as a quasi-Newton method. The latter typically converges faster.

ODT (optimal Delaunay tessellation)

odt-dp-fp odt-uniform-fp odt-uniform-bfgs
density-preserving fixed-point iteration (--method odt-dp-fp) uniform-density fixed-point iteration (--method odt-fixed-point) uniform-density BFGS (--method odt-bfgs)

Optimal Delaunay Triangulation (ODT) as suggested by Chen and Holst. Typically superior to CPT, but also more expensive to compute.

Implemented once classically as a fixed-point iteration, once as a nonlinear optimization method. The latter typically leads to better results.

Using optimesh from Python

You can also use optimesh in a Python program. Try

import optimesh

# [...] create points, cells [...]

points, cells = optimesh.optimize_points_cells(
    points, cells, "CVT (block-diagonal)", 1.0e-5, 100
)

# or create a meshplex Mesh
import meshplex

mesh = meshplex.MeshTri(points, cells)
optimesh.optimize(mesh, "CVT (block-diagonal)", 1.0e-5, 100)
# mesh.points, mesh.cells, ...

If you only want to do one optimization step, do

points = optimesh.get_new_points(mesh, "CVT (block-diagonal)")

Surface mesh smoothing

optimesh also supports optimization of triangular meshes on surfaces which are defined implicitly by a level set function (e.g., spheres). You'll need to specify the function and its gradient, so you'll have to do it in Python:

import meshzoo
import optimesh

points, cells = meshzoo.tetra_sphere(20)


class Sphere:
    def f(self, x):
        return 1.0 - (x[0] ** 2 + x[1] ** 2 + x[2] ** 2)

    def grad(self, x):
        return -2 * x


# You can use all methods in optimesh:
points, cells = optimesh.optimize_points_cells(
    points,
    cells,
    "CVT (full)",
    1.0e-2,
    100,
    verbose=False,
    implicit_surface=Sphere(),
    # step_filename_format="out{:03d}.vtk"
)

This code first generates a mediocre mesh on a sphere using meshzoo,

and then optimizes. Some results:

odt-dp-fp odt-uniform-fp odt-uniform-bfgs
CPT ODT CVT (full Hessian)

Which method is best?

From practical experiments, it seems that the CVT smoothing variants, e.g.,

optimesh in.vtk out.vtk -m cvt-uniform-qnf

give very satisfactory results. (This is also the default method, so you don't need to specify it explicitly.) Here is a comparison of all uniform-density methods applied to the random circle mesh seen above:

(Mesh quality is twice the ratio of incircle and circumcircle radius, with the maximum being 1.)

Why optimize?

Gmsh mesh Gmsh mesh after optimesh dmsh mesh

Let us compare the properties of the Poisson problem (Δu = f with Dirichlet boundary conditions) when solved on different meshes of the unit circle. The first mesh is the on generated by Gmsh, the second the same mesh but optimized with optimesh, the third a very high-quality dmsh mesh.

We consider meshings of the circle with an increasing number of points:

gmsh-quality gmsh-cond gmsh-cg
average cell quality condition number of the Poisson matrix number of CG steps for Poisson problem

Quite clearly, the dmsh generator produces the highest-quality meshes (left). The condition number of the corresponding Poisson matrices is lowest for the high quality meshes (middle); one would hence suspect faster convergence with Krylov methods. Indeed, most CG iterations are necessary on the Gmsh mesh (right). After optimesh, one saves between 10 and 20 percent of iterations/computing time. The dmsh mesh cuts the number of iterations in half.

Access from Python

All optimesh functions can also be accessed from Python directly, for example:

import optimesh

X, cells = optimesh.odt.fixed_point(X, cells, 1.0e-2, 100, verbose=False)

Relevant publications

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.

optimesh-0.12.6a1-cp314-none-any.whl (83.8 kB view details)

Uploaded CPython 3.14

optimesh-0.12.6a1-cp313-none-any.whl (80.4 kB view details)

Uploaded CPython 3.13

optimesh-0.12.6a1-cp312-none-any.whl (80.6 kB view details)

Uploaded CPython 3.12

optimesh-0.12.6a1-cp311-none-any.whl (89.0 kB view details)

Uploaded CPython 3.11

optimesh-0.12.6a1-cp310-none-any.whl (52.3 kB view details)

Uploaded CPython 3.10

File details

Details for the file optimesh-0.12.6a1-cp314-none-any.whl.

File metadata

  • Download URL: optimesh-0.12.6a1-cp314-none-any.whl
  • Upload date:
  • Size: 83.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 optimesh-0.12.6a1-cp314-none-any.whl
Algorithm Hash digest
SHA256 1f221a23ae93ebe585421348dcb7f2fa305377e69c94022b6d2625c893b4f8d8
MD5 83812e1565c1970cf22e6355520ba50e
BLAKE2b-256 95ecb7cb2262ee5f2a3aaa4777e325eda913772846bd4d52f638f803a3b02aa8

See more details on using hashes here.

Provenance

The following attestation bundles were made for optimesh-0.12.6a1-cp314-none-any.whl:

Publisher: release.yml on meshpro/optimesh-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 optimesh-0.12.6a1-cp313-none-any.whl.

File metadata

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

File hashes

Hashes for optimesh-0.12.6a1-cp313-none-any.whl
Algorithm Hash digest
SHA256 541affcfbcbbf1b419d442d26d38ed3cd96fba4347c1a7ca93e3d7375a4a6777
MD5 880e6d644063fe4607ee3934ed262890
BLAKE2b-256 9347d80a779429f0c1bfbda9dcb891a07d1805c780a7f38bc885ce318d6deb50

See more details on using hashes here.

Provenance

The following attestation bundles were made for optimesh-0.12.6a1-cp313-none-any.whl:

Publisher: release.yml on meshpro/optimesh-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 optimesh-0.12.6a1-cp312-none-any.whl.

File metadata

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

File hashes

Hashes for optimesh-0.12.6a1-cp312-none-any.whl
Algorithm Hash digest
SHA256 428aab001b544e89d42ee3b7e0569b5718f9fddd98eb44419b1a798ede7202a9
MD5 c0f77dafcd11fe5c2b6e856dfeac12db
BLAKE2b-256 070fedca5dc63c53a0f5b33d5c53f908d5237fcf307377c34d32cb67e261ca0e

See more details on using hashes here.

Provenance

The following attestation bundles were made for optimesh-0.12.6a1-cp312-none-any.whl:

Publisher: release.yml on meshpro/optimesh-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 optimesh-0.12.6a1-cp311-none-any.whl.

File metadata

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

File hashes

Hashes for optimesh-0.12.6a1-cp311-none-any.whl
Algorithm Hash digest
SHA256 9b6ccfdc2cd014f9afd1caaef3e1b762c542967b7a1ecdafa06c252cd285a135
MD5 d9e1e0795f65f40d8f05d1bc157c4e35
BLAKE2b-256 b9f150a20c63b60c84e182fdedeed1f0a7a2590a3dbc569b82fcdaf561b22504

See more details on using hashes here.

Provenance

The following attestation bundles were made for optimesh-0.12.6a1-cp311-none-any.whl:

Publisher: release.yml on meshpro/optimesh-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 optimesh-0.12.6a1-cp310-none-any.whl.

File metadata

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

File hashes

Hashes for optimesh-0.12.6a1-cp310-none-any.whl
Algorithm Hash digest
SHA256 3c4563d5c8f7dc9ea8234d01db3fe6ab5ebcccbdb3397fb66173462dce986c34
MD5 f25db19939c0b47d3f79bfd67290146f
BLAKE2b-256 2f1f875ec07257954006afcaca41577733601bba0db3a8b5a421c8784aac2077

See more details on using hashes here.

Provenance

The following attestation bundles were made for optimesh-0.12.6a1-cp310-none-any.whl:

Publisher: release.yml on meshpro/optimesh-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