SeismicMesh

SeismicMesh: Triangular meshing for seismology - Published in JOSS (2021)

https://github.com/krober10nd/seismicmesh

Science Score: 95.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
    Found 5 DOI reference(s) in README and JOSS metadata
  • Academic publication links
    Links to: acm.org, joss.theoj.org
  • Committers with academic emails
    2 of 9 committers (22.2%) from academic institutions
  • Institutional organization owner
  • JOSS paper metadata
    Published in Journal of Open Source Software

Keywords

distmesh meshing parallel seismic-velocity-models

Scientific Fields

Engineering Computer Science - 60% confidence
Artificial Intelligence and Machine Learning Computer Science - 40% confidence
Last synced: 4 months ago · JSON representation

Repository

2D/3D serial and parallel triangular mesh generation tool for finite element methods.

Basic Info
Statistics
  • Stars: 135
  • Watchers: 9
  • Forks: 35
  • Open Issues: 14
  • Releases: 27
Archived
Topics
distmesh meshing parallel seismic-velocity-models
Created about 6 years ago · Last pushed over 2 years ago
Metadata Files
Readme License Code of conduct

README.md

SeismicMesh

Create high-quality, simulation-ready 2D/3D meshes.

status CircleCI ReadTheDocs CodeCov Code style: black PyPI pyversions PyPi GPL

SeismicMesh: Triangular Mesh generation in Python

SeismicMesh is a Python package for simplex mesh generation in two or three dimensions. As an implementation of DistMesh, it produces high-geometric quality meshes at the expense of speed. For increased efficiency, the core package is written in C++, works in parallel, and uses the Computational Geometry Algorithms Library. SeismicMesh can also produce mesh-density functions from seismological data to be used in the mesh generator.

SeismicMesh is distributed under the GPL3 license and more details can be found in our short paper.

Table of contents

Installation

For installation, SeismicMesh needs CGAL:

sudo apt install libcgal-dev

After that, SeismicMesh can be installed from the Python Package Index (pypi), so with:

pip install -U SeismicMesh

If you'd like to read and write velocity models from segy/h5 format, you can install like:

pip install -U SeismicMesh[io]

For more detailed information about installation and requirements see:

Install - How to install SeismicMesh.

Contributing

All contributions are welcome!

To contribute to the software:

  1. Fork the repository.
  2. Clone the forked repository, add your contributions and push the changes to your fork.
  3. Create a Pull request

Before creating the pull request, make sure that the tests pass by running tox Some things that will increase the chance that your pull request is accepted: - Write tests. - Add Python docstrings that follow the Sphinx. - Write good commit and pull request messages.

Codebase

Here is a visual overview of the repository. An interactive version of this image can be found here: https://octo-repo-visualization.vercel.app/?repo=krober10nd%2FSeismicMesh

Visualization of this repo

Citing

You may use the following BibTeX entry: @article{Roberts2021, doi = {10.21105/joss.02687}, url = {https://doi.org/10.21105/joss.02687}, year = {2021}, publisher = {The Open Journal}, volume = {6}, number = {57}, pages = {2687}, author = {Keith J. Roberts and Rafael dos Santos Gioria and William J. Pringle}, title = {SeismicMesh: Triangular meshing for seismology}, journal = {Journal of Open Source Software} }

Problems?

If something isn't working as it should or you'd like to recommend a new addition/feature to the software, please let me know by starting an issue through the issues tab. I'll try to get to it as soon as possible.

Examples

The user can quickly build quality 2D/3D meshes from seismic velocity models in serial/parallel.

BP2004

WARNING: To run the code snippet below you must download the 2D BP2004 seismic velocity model and then you must uncompress it (e.g., gunzip). This file can be downloaded from here

Above shows the mesh in ParaView that results from running the code below

```python from mpi4py import MPI import meshio

from SeismicMesh import getsizingfunctionfromsegy, generate_mesh, Rectangle

comm = MPI.COMM_WORLD

""" Build a mesh of the BP2004 benchmark velocity model in serial or parallel Takes roughly 1 minute with 2 processors and less than 1 GB of RAM. """

Name of SEG-Y file containg velocity model.

fname = "velz6.25mx12.5m_exact.segy"

Bounding box describing domain extents (corner coordinates)

bbox = (-12000.0, 0.0, 0.0, 67000.0)

Desired minimum mesh size in domain

hmin = 75.0

rectangle = Rectangle(bbox)

Construct mesh sizing object from velocity model

ef = getsizingfunctionfromsegy( fname, bbox, hmin=hmin, wl=10, freq=2, dt=0.001, grade=0.15, domainpad=1e3, padstyle="edge", )

points, cells = generatemesh(domain=rectangle, edgelength=ef)

if comm.rank == 0: # Write the mesh in a vtk format for visualization in ParaView # NOTE: SeismicMesh outputs assumes the domain is (z,x) so for visualization # in ParaView, we swap the axes so it appears as in the (x,z) plane. meshio.writepointscells( "BP2004.vtk", points[:, [1, 0]] / 1000, [("triangle", cells)], file_format="vtk", ) ```

Note SeismicMesh can also be used to write velocity models to disk in a hdf5 format using the function write_velocity_model. Following the previous example above with the BP2004 velocity model, we create an hdf5 file with a domain pad of 1000 m.

```python from SeismicMesh import writevelocitymodel

Name of SEG-Y file containg velocity model.

fname = "velz6.25mx12.5m_exact.segy"

Bounding box describing domain extents (corner coordinates)

bbox = (-12000.0, 0.0, 0.0, 67000.0)

writevelocitymodel( fname, ofname="bp2004velocitymodel", # how the file will be called (with a .hdf5 extension) bbox=bbox, domainpad=500, # the width of the domain pad in meters padstyle="edge", # how the velocity data will be extended into the layer units="m-s", # the units that the velocity model is in. ) ```

EAGE

WARNING: To run the code snippet below you must download (and uncompress) the 3D EAGE seismic velocity model from (WARNING: File is ~500 MB) here

WARNING: Computationaly demanding! Running this example takes around 3 minutes in serial and requires around 2 GB of RAM due to the 3D nature of the problem and the domain size.

Above shows the mesh in ParaView that results from running the code below.

```python from mpi4py import MPI import zipfile import meshio

from SeismicMesh import ( getsizingfunctionfromsegy, generatemesh, sliverremoval, Cube, )

comm = MPI.COMM_WORLD

Bounding box describing domain extents (corner coordinates)

bbox = (-4200.0, 0.0, 0.0, 13520.0, 0.0, 13520.0)

Desired minimum mesh size in domain.

hmin = 150.0

This file is in a big Endian binary format, so we must tell the program the shape of the velocity model.

path = "SaltModel3D/3-DSaltModel/VEL_GRIDS/" if comm.rank == 0: # Extract binary file Saltf@@ from SALTF.ZIP zipfile.ZipFile(path + "SALTF.ZIP", "r").extract("Saltf@@", path=path)

fname = path + "Saltf@@"

Dimensions of model (number of grid points in z, x, and y)

nx, ny, nz = 676, 676, 210

cube = Cube(bbox)

A graded sizing function is created from the velocity model along with a signed distance function by passing

the velocity grid that we created above.

More details can be found here: https://seismicmesh.readthedocs.io/en/master/api.html

ef = getsizingfunctionfromsegy( fname, bbox, hmin=hmin, dt=0.001, freq=2, wl=5, grade=0.15, hmax=5e3, domainpad=250, padstyle="linearramp", nz=nz, nx=nx, ny=ny, byteorder="big", axesorder=(2, 0, 1), # order for EAGE (x, y, z) to default order (z,x,y) axesorder_sort="F", # binary is packed in a FORTRAN-style )

points, cells = generatemesh(domain=cube, edgelength=ef, max_iter=75)

For 3D mesh generation, we provide an implementation to bound the minimum dihedral angle::

We use the preserve kwarg to ensure the level-set is very accurately preserved.

points, cells = sliverremoval( points=points, bbox=bbox, domain=cube, edgelength=ef, preserve=True )

Meshes can be written quickly to disk using meshio and visualized with ParaView::

if comm.rank == 0:

# NOTE: SeismicMesh outputs assumes the domain is (z,x,y) so for visualization
# in ParaView, we swap the axes so it appears as in the (x,y,z) plane.
meshio.write_points_cells(
    "EAGE_Salt.vtk",
    points[:, [1, 2, 0]] / 1000.0,
    [("tetra", cells)],
)

```

The user can still specify their own signed distance functions and sizing functions to generate_mesh (in serial or parallel) just like the original DistMesh algorithm but now with quality bounds in 3D. Try the codes below!

Cylinder

Cylinder

```python

Mesh a cylinder

from mpi4py import MPI import meshio

import SeismicMesh

comm = MPI.COMM_WORLD

hmin = 0.10

cylinder = SeismicMesh.Cylinder(h=1.0, r=0.5)

points, cells = SeismicMesh.generatemesh( domain=cylinder, edgelength=hmin, )

points, cells = SeismicMesh.sliverremoval( points=points, domain=cylinder, edgelength=hmin, )

if comm.rank == 0: meshio.writepointscells( "Cylinder.vtk", points, [("tetra", cells)], file_format="vtk", ) ```

Disk

Disk

```python

mesh a disk

import meshio import SeismicMesh

disk = SeismicMesh.Disk([0.0, 0.0], 1.0) points, cells = SeismicMesh.generatemesh(domain=disk, edgelength=0.1) meshio.writepointscells( "disk.vtk", points, [("triangle", cells)], file_format="vtk", ) ```

Square

Square

```python

mesh a square/rectangle

import meshio import SeismicMesh

bbox = (0.0, 1.0, 0.0, 1.0) square = SeismicMesh.Rectangle(bbox) points, cells = SeismicMesh.generatemesh(domain=square, edgelength=0.05) meshio.writepointscells( "square.vtk", points, [("triangle", cells)], file_format="vtk", ) ```

Cube

Cube

```python

mesh a cuboid/cube

import meshio import SeismicMesh

bbox = (0.0, 1.0, 0.0, 1.0, 0.0, 1.0) cube = SeismicMesh.Cube(bbox) points, cells = SeismicMesh.generatemesh(domain=cube, edgelength=0.05) points, cells = SeismicMesh.sliverremoval(points=points, domain=cube, edgelength=0.05) meshio.writepointscells( "cube.vtk", points, [("tetra", cells)], file_format="vtk", ) ```

Torus

Torus

```python

mesh a torus

import meshio import SeismicMesh

hmin = 0.10

torus = SeismicMesh.Torus(r1=1.0, r2=0.5) points, cells = SeismicMesh.generatemesh( domain=torus, edgelength=hmin, ) points, cells = SeismicMesh.sliverremoval( points=points, domain=torus, edgelength=hmin ) meshio.writepointscells( "torus.vtk", points, [("tetra", cells)], ) ```

Torus

Prism

```python

mesh a prism

import meshio

import SeismicMesh

hmin = 0.05 prism = SeismicMesh.Prism(b=0.5, h=0.5)

points, cells = SeismicMesh.generatemesh( domain=prism, edgelength=hmin, ) points, cells = SeismicMesh.sliverremoval( points=points, domain=prism, edgelength=hmin ) meshio.writepointscells( "prism.vtk", points, [("tetra", cells)], file_format="vtk", ) ```

Union

Union

```python

Compute the union of several SDFs to create more complex geometries

import meshio import SeismicMesh

h = 0.10 rect0 = SeismicMesh.Rectangle((0.0, 1.0, 0.0, 0.5)) rect1 = SeismicMesh.Rectangle((0.0, 0.5, 0.0, 1.0)) disk0 = SeismicMesh.Disk([0.5, 0.5], 0.5) union = SeismicMesh.Union([rect0, rect1, disk0])

Visualize the signed distance function

union.show() points, cells = SeismicMesh.generatemesh(domain=union, edgelength=h) meshio.writepointscells( "LshapewDisk.vtk", points, [("triangle", cells)], fileformat="vtk", ) ```

Intersection

Leaf

```python

Compute the intersection of several SDFs to create more complex geometries

import meshio import SeismicMesh

h = 0.05 rect0 = SeismicMesh.Rectangle((0.0, 1.0, 0.0, 1.0)) disk0 = SeismicMesh.Disk([0.25, 0.25], 0.5) disk1 = SeismicMesh.Disk([0.75, 0.75], 0.5) intersection = SeismicMesh.Intersection([rect0, disk0, disk1]) points, cells = SeismicMesh.generatemesh(domain=intersection, edgelength=h) meshio.writepointscells( "Leaf.vtk", points, [("triangle", cells)], file_format="vtk", ) ```

Difference

Hole

```python

Compute the difference of two SDFs to create more complex geometries.

import meshio import SeismicMesh

h = 0.05 rect0 = SeismicMesh.Rectangle((0.0, 1.0, 0.0, 1.0)) disk0 = SeismicMesh.Disk([0.5, 0.5], 0.1) disk1 = SeismicMesh.Disk([0.75, 0.75], 0.20) difference = SeismicMesh.Difference([rect0, disk0, disk1]) points, cells = SeismicMesh.generatemesh(domain=difference, edgelength=h) meshio.writepointscells( "Hole.vtk", points, [("triangle", cells)], file_format="vtk", ) ```

Difference of Signed Distance Functions in 3-D

Cube wHoles

```python

Compute the difference of several SDFs in 3D

import meshio import SeismicMesh

h = 0.10 cube0 = SeismicMesh.Cube((0.0, 1.0, 0.0, 1.0, 0.0, 1.0)) ball1 = SeismicMesh.Ball([0.5, 0.0, 0.5], 0.30) ball2 = SeismicMesh.Ball([0.5, 0.5, 0.0], 0.30) ball3 = SeismicMesh.Ball([0.0, 0.5, 0.5], 0.30) ball4 = SeismicMesh.Ball([0.5, 0.5, 0.5], 0.45) difference = SeismicMesh.Difference([cube0, ball1, ball2, ball3, ball4]) points, cells = SeismicMesh.generatemesh(domain=difference, edgelength=h, verbose=1) points, cells = SeismicMesh.sliverremoval( points=points, domain=difference, edgelength=h, verbose=1 ) meshio.writepointscells( "CubewHoles.vtk", points, [("tetra", cells)], fileformat="vtk", ) ```

Immersion

Immersed disk

```python

Immerse a subdomain so that it's boundary is conforming in the mesh.

import numpy as np

import meshio

import SeismicMesh

box0 = SeismicMesh.Rectangle((-1.25, 0.0, -0.250, 1.250)) disk0 = SeismicMesh.Disk([-0.5, 0.5], 0.25)

hmin = 0.10

fh = lambda p: 0.05 * np.abs(disk0.eval(p)) + hmin

points, cells = SeismicMesh.generatemesh( domain=box0, edgelength=fh, h0=hmin, subdomains=[disk0], maxiter=100, ) meshio.writepointscells( "Squarewsubdomain.vtk", points, [("triangle", cells)], file_format="vtk", ) ```

Boundaries

Boundary conditions can also be prescribed and written to gmsh compatible files using mehsio. In the following example, we immerse a disk into the connectivity and then prescribe boundary conditions around the circle and each wall of the domain for later usage inside a finite element solver.

Screen Shot 2021-02-12 at 12 04 03 PM

```python import numpy as np import meshio import SeismicMesh as sm

bbox = (0.0, 10.0, 0.0, 1.0) channel = sm.Rectangle(bbox) suspension = sm.Disk([0.5, 0.5], 0.25)

hmin = 0.10 fh = lambda p: 0.05 * np.abs(suspension.eval(p)) + hmin points, cells = sm.generatemesh( domain=channel, edgelength=fh, h0=hmin, subdomains=[suspension], max_iter=1000, )

This gets the edges of the mesh in a winding order (clockwise or counterclockwise).

orderedbnde = sm.geometry.getwindedboundaryedges(cells)

We use the midpoint of the edge to determine its boundary label

mdpt = points[orderedbnde].sum(1) / 2 infl = orderedbnde[mdpt[:, 0] < 1e-6, :] # x=0.0 outfl = orderedbnde[mdpt[:, 0] > 9.9 + 1e-6, :] # x=10.0 walls = orderedbnde[ (mdpt[:, 1] < 1e-6) | (mdpt[:, 1] > 0.99 + 1e-6), : ] # y=0.0 or y=1.0 cellsprune = cells[suspension.eval(sm.geometry.getcentroids(points, cells)) < 0] circle = sm.geometry.getwindedboundaryedges(cellsprune)

Write to gmsh22 format with boundary conditions for the walls and disk/circle.

meshio.writepointscells( "example.msh", points, cells=[ ("triangle", cells), ("line", np.array(infl)), ("line", np.array(outfl)), ("line", np.array(walls)), ("line", np.array(circle)), ], fielddata={ "InFlow": np.array([11, 1]), "OutFlow": np.array([12, 1]), "Walls": np.array([13, 1]), "Circle": np.array([14, 1]), }, celldata={ "gmsh:physical": [ np.repeat(3, len(cells)), np.repeat(11, len(infl)), np.repeat(12, len(outfl)), np.repeat(13, len(walls)), np.repeat(14, len(circle)), ], "gmsh:geometrical": [ np.repeat(1, len(cells)), np.repeat(1, len(infl)), np.repeat(1, len(outfl)), np.repeat(1, len(walls)), np.repeat(1, len(circle)), ], }, file_format="gmsh22", binary=False, ) ```

Periodic

Periodic torus

```python

Repeat primitives to create more complex domains/shapes.

import SeismicMesh import meshio

hmin = 0.30 bbox = (0.0, 10.0, 0.0, 10.0, 0.0, 10.0) torus = SeismicMesh.Torus(r1=1.0, r2=0.5)

the Repeat function takes a list specifying the repetition period in each dim

periodictorus = SeismicMesh.Repeat(bbox, torus, [2.0, 2.0, 2.0]) points, cells = SeismicMesh.generatemesh(domain=periodictorus, edgelength=hmin) points, cells = SeismicMesh.sliverremoval( points=points, domain=periodictorus, edgelength=hmin ) meshio.writepointscells( "periodictorus.vtk", points, [("tetra", cells)], file_format="vtk", ) ```

Rotations

Rotated squares

```python

Rotate squares in 2D

import numpy as np

import meshio import SeismicMesh

bbox = (0.0, 1.0, 0.0, 1.0) rotations = np.linspace(-3.14, 3.14, 40) squares = [] for _, rotate in enumerate(rotations): squares.append(SeismicMesh.Rectangle(bbox, rotate=[rotate,0,0]))

rotated_squares = SeismicMesh.Union(squares)

points, cells = SeismicMesh.generatemesh(domain=rotatedsquares, edgelength=0.05) meshio.writepointscells( "rotatedsquares" + str(rotate) + ".vtk", points, [("triangle", cells)], file_format="vtk", )

```

Rotated cubes

```python

Same as above but for cubes

import numpy as np

import meshio import SeismicMesh

bbox = (0.0, 1.0, 0.0, 1.0, 0.0, 1.0) rotations = np.linspace(-3.14, 3.14, 40) cubes = [] for _, rotate in enumerate(rotations): cubes.append(SeismicMesh.Cube(bbox, rotate=[rotate,0,0]))

rotated_cubes = SeismicMesh.Union(cubes)

points, cells = SeismicMesh.generatemesh(domain=rotatedcubes, edgelength=0.10) meshio.writepointscells( "rotatedcubes.vtk", points, [("tetra", cells)], file_format="vtk", ) ```

Stretching

Stretched squares

```python

Geometric primitives can be stretched (while being rotated)

import meshio

from SeismicMesh import *

domain = Rectangle((0.0, 1.0, 0.0, 1.0), stretch=[0.5, 2.0], rotate=0.1*3.14)

points, cells = generatemesh(domain=domain, edgelength=0.1, verbose=2)

meshio.writepointscells( "stretchedsquare.vtk", points, [("triangle", cells)], fileformat="vtk", ) ```

Translation

A translated cuboid

```python

Geometric primitives can be translated (while being rotated and stretched)

import meshio

from SeismicMesh import *

cuboid = Cube( (0.0, 1.0, 0.0, 1.0, 0.1, 1.0), stretch=[1.5, 1.5, 1.5], translate=[0.5, 4.0, 1.0], rotate=4.5 * 3.14, ) points, cells = generatemesh(domain=cuboid, edgelength=0.10, maxiter=200) points, cells = sliverremoval(points=points, domain=cuboid, edge_length=0.10, preserve=True)

meshio.writepointscells( "stretchedsquare.vtk", points, [("tetra", cells)], fileformat="vtk", ) ```

Checking

Example of checking

SeismicMesh's mesh generator is sensitive to poor geometry definitions and thus you should probably check it prior to complex expensive meshing. We enable all signed distance functions to be visualized via the domain.show() method where domain is an instance of a signed distance function primitive from SeismicMesh.geometry. Note: you can increase the number of samples to visualize the signed distance function by increasing the kwarg samples to the show method, which is by default set to 10000.

Parallelism

A simplified version of the parallel Delaunay algorithm proposed by Peterka et. al 2014 is implemented inside the DistMesh algorithm, which does not consider sophisticated domain decomposition or load balancing yet. A peak speed-up of approximately 6 times using 11 cores when performing 50 meshing iterations is observed to generate the 33M cell mesh of the EAGE P-wave velocity model. Parallel performance in 2D is better with peak speedups around 8 times using 11 cores. While the parallel performance is not perfect at this stage of development, the capability reduces the generation time of this relatively large example (e.g., 33 M cells) from 91.0 minutes to approximately 15.6 minutes. Results indicate that the simple domain decomposition approach inhibit perfect scalability. The machine used for this experiment was an Intel Xeon Gold 6148 machine clocked at 2.4 GHz with 192 GB of RAM connected together with a 100 Gb/s InfiniBand network.

To use parallelism see the docs

See the paper/paper.md and associated figures for more details.

Performance

**How does performance and cell quality compare to Gmsh and CGAL mesh generators?

Here we use SeismicMesh 3.1.4, pygalmesh 0.8.2, and pygmsh 7.0.0 (more details in the benchmarks folder).

Some key findings:

  • Mesh generation in 2D and 3D using analytical sizing functions is quickest when using Gmsh but a closer competition for CGAL and SeismicMesh.
  • However, using mesh sizing functions defined on gridded interpolants significantly slow down both Gmsh and CGAL. In these cases, SeismicMesh and Gmsh perform similarly both outperforming CGAL's 3D mesh generator in terms of mesh generation time.
  • All methods produce 3D triangulations that have a minimum dihedral angle > 10 degrees enabling stable numerical simulation (not shown)
  • Head over to the benchmarks folder for more detailed information on these experiments.

Summary of the benchmarks

  • In the figure for the panels that show cell quality, solid lines indicate the mean and dashed lines indicate the minimum cell quality in the mesh.

  • Note: it's important to point out here that a significant speed-up can be achieved for moderate to large problems using the parallel capabilities provided in SeismicMesh.

*For an additional comparison of *SeismicMesh against several other popular mesh generators head over to meshgen-comparison.

Changelog

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

Unreleased

Added

  • Short blurb about using write_velocity_model
  • Adding read_velocity_model to public API ### Fixed
  • Bug fix to gradient limiting of mesh size functions

[3.6.1]-2021-05-22

Added

  • Smoothed sets (e.g., intersections, differences, and unions)
  • Conversion of velocity data from feet-second to meters-second
  • Support for fixed points in iterative Laplacian mesh smoother. ### Improved
  • Simplified pybind11 build system.
  • Now using pytest-codeblocks instead of exdown

[3.5.0]-2021-03-09

Added

  • Rotations for all geometric primitives
  • Stretching for all geometric primitives
  • Visuzlization of signed distance functions ### Fixed
  • Support for Python 3.9 ### Improved
  • Fixed points in iterative Laplacian smooth

[3.4.0]-2021-02-14

Added

  • Mesh improvement now solves Lapl. smoothing as a fixed-point problem using AMG solver.
  • User can now mesh user-defined sizing functions in parallel (not from :class:SizeFunction)
  • Ability to specify data type dtype of floating point number inside binary files.
  • Example how to specify and write boundary conditions. ### Improved
  • Faster unique edge calculation.

[3.3.0]-2021-01-08

Added

  • Ability to improve accuracy of level-set when performing 3d sliver removal. ### Improved
  • Marginally faster parallel speedup at scale in 2d/3d

[3.2.0] -2020-12-14

Added

  • Adding basic periodic domains with the Repeat SDF.
  • sliver_removal has optional variable step size when perturbing vertices. Helps to remove the "last sliver". ### Improved
  • Faster rectangle and cube primitives.
  • Reworking CPP code and bottlenecks...20-30% faster generate_mesh in parallel for 2D/3D from previous versions.

[3.1.7] - 2020-11-27

Improved

  • Table of contents in README

Added

  • More testing of sliver removal and 2d mesh generation qualities.

Fixed

  • Disabled bug when doing Newton boundary projection at the end of 3d sliver_removal.

[3.1.6] - 2020-11-26

Bug present with sliver removal. Recommend to not use.

Added

  • Unit testing three versions of Python (3.6.1, 3.7.4, 3.8.1)

[3.1.5] - 2020-11-24

  • Support for constraining/immersing subdomains represented as signed distance functions.
  • Faster cell manipulation operations for ~5-10% better speedups in parallel.
  • Projection of points back onto level set.

[3.1.4] - 2020-11-15

  • Laplacian smoothing at termination for 2D meshing...significantly improves minimum cell quality.
  • Made hmin a field of the SizeFunction class, which implies the user no longer needs to pass h0 to generate_mesh or sliver_removal.

[3.1.3] - 2020-11-06

Fixed

  • Cylinder radius and height are now correct.
  • Torus, Prism, and Cylinder now have dim tag.

Improved

  • More control over the grad option in the mesh sizing function.

[3.1.2] - 2020-11-04

Improved

  • Faster calculation of boundary vertices.
  • More robust sliver removal in 3D. ### Fixed
  • Corners are only constrained for constant resolution meshes

[3.1.0] - 2020-10-28

Added

  • New geometric primitives--torus, wedge/prism, and cylinder.
  • Updated images on README. ### Fixed
  • Only constrain corners near 0-level set.
  • Bug fix to 3D binary velocity reading.

[3.0.6] - 2020-10-21

Fixed

  • Silence messages about pfix when verbose=0 ### Added
  • Added more examples on README
  • New unions/intersections/differences with several SDF primivitives
  • Automatic corner constraints in serial

[3.0.5] - 2020-10-18

Fixed

  • Preserving fixed points in serial.
  • Units in km-s detection warning bug.
  • Docstring fixes to generate_mesh
  • Improved mesh quality in 3D

Added

  • Automatic corner point extraction for cubes and rectangles.
  • More support for reading binary files packed in a binary format.
  • Check to make sure bbox is composed of all floats.

[3.0.4] - 2020-10-12

Added

  • Improve conformity of level-set in final mesh through additional set of Newton boundary projection iterations.

More information

All other information is available at: https://seismicmesh.readthedocs.io

Getting started - Learn the basics about the program and the application domain.

Tutorials - Tutorials that will guide you through the main features.

Owner

  • Name: Keith Roberts
  • Login: krober10nd
  • Kind: user
  • Company: W.F. Baird

Researcher/numerical modeler

JOSS Publication

SeismicMesh: Triangular meshing for seismology
Published
January 19, 2021
Volume 6, Issue 57, Page 2687
Authors
Keith J. Roberts
Research Center for Gas Innovation, Escola Politécnica da Universidade de São Paulo, São Paulo, Brazil.
Rafael dos Santos Gioria
Research Center for Gas Innovation, Escola Politécnica da Universidade de São Paulo, São Paulo, Brazil.
William J. Pringle
Dept. of Civil and Environmental Engineering and Earth Sciences, University of Notre Dame, 156 Fitzpatrick Hall, Notre Dame, IN, U.S.A.
Editor
Marie E. Rognes ORCID
Tags
Seismology Mesh generation DistMesh Parallel mesh generation

GitHub Events

Total
  • Watch event: 9
  • Fork event: 3
Last Year
  • Watch event: 9
  • Fork event: 3

Committers

Last synced: 5 months ago

All Time
  • Total Commits: 674
  • Total Committers: 9
  • Avg Commits per committer: 74.889
  • Development Distribution Score (DDS): 0.343
Past Year
  • Commits: 0
  • Committers: 0
  • Avg Commits per committer: 0.0
  • Development Distribution Score (DDS): 0.0
Top Committers
Name Email Commits
Keith Roberts k****0@n****u 443
Keith Roberts k****r@u****r 208
repo-visualizer r****r 8
krober10 k****0@g****m 6
Keith Roberts k****r@u****u 4
santos-td 8****d 2
dependabot[bot] 4****] 1
Matteo m****b 1
Keith Roberts k****h@h****r 1
Committer Domains (Top 20 + Academic)

Issues and Pull Requests

Last synced: 4 months ago

All Time
  • Total issues: 38
  • Total pull requests: 64
  • Average time to close issues: 14 days
  • Average time to close pull requests: 8 days
  • Total issue authors: 9
  • Total pull request authors: 5
  • Average comments per issue: 5.97
  • Average comments per pull request: 2.05
  • Merged pull requests: 59
  • Bot issues: 0
  • Bot pull requests: 3
Past Year
  • Issues: 0
  • Pull requests: 0
  • Average time to close issues: N/A
  • Average time to close pull requests: N/A
  • Issue authors: 0
  • Pull request authors: 0
  • Average comments per issue: 0
  • Average comments per pull request: 0
  • Merged pull requests: 0
  • Bot issues: 0
  • Bot pull requests: 0
Top Authors
Issue Authors
  • krober10nd (19)
  • nschloe (9)
  • jorgensd (3)
  • HamishB (2)
  • Olender (1)
  • skypalat (1)
  • Yuri-Albuquerque (1)
  • BinWang0213 (1)
  • Zhang-Ziwen (1)
Pull Request Authors
  • krober10nd (58)
  • dependabot[bot] (2)
  • santos-td (2)
  • matteounimib (1)
  • lgtm-com[bot] (1)
Top Labels
Issue Labels
enhancement (2)
Pull Request Labels
dependencies (2) enhancement (1)

Packages

  • Total packages: 1
  • Total downloads:
    • pypi 41 last-month
  • Total dependent packages: 0
  • Total dependent repositories: 1
  • Total versions: 32
  • Total maintainers: 1
pypi.org: seismicmesh

2D/3D serial and parallel triangular mesh generation for seismology

  • Versions: 32
  • Dependent Packages: 0
  • Dependent Repositories: 1
  • Downloads: 41 Last month
Rankings
Stargazers count: 7.0%
Forks count: 7.4%
Dependent packages count: 10.1%
Average: 12.4%
Downloads: 15.6%
Dependent repos count: 21.6%
Maintainers (1)
Last synced: 4 months ago

Dependencies

benchmarks/requirements.txt pypi
  • meshio ==4.2.2
  • meshplex ==0.13.3
  • pygalmesh ==0.8.2
  • pygmsh ==7.0.0
  • termplotlib ==0.3.2
docs/requirements.txt pypi
  • matplotlib *
  • meshio ==4.0.10
  • numpy ==1.22.0
  • pybind11 ==2.5.0
  • scikit-fmm *
  • scipy ==1.4.1
  • segyio *
.github/workflows/create-diagram.yml actions
  • actions/checkout master composite
  • githubocto/repo-visualizer main composite
.github/workflows/testing.yml actions
  • actions/checkout v2 composite
  • actions/setup-python v2 composite
  • codecov/codecov-action v1 composite
pyproject.toml pypi
setup.py pypi