2D/3D serial and parallel triangular mesh generation and mesh improvement for seismology
Project description
SeismicMesh: Mesh generation for Seismology in Python
2D/3D triangular meshing for a slab of Earth based on modifications to the DistMesh algorithm. SeismicMesh is distributed under GPL3.
Installation
For installation, SeismicMesh needs CGAL (https://www.cgal.org/):
sudo apt install libcgal-dev
and pybind11 (https://github.com/pybind/pybind11):
sudo apt-get install python-pybind11
After that, SeismicMesh can be installed from the Python Package Index (https://pypi.org/project/SeismicMesh/), so with:
pip install -U SeismicMesh
For more detailed information about installation and requirements see:
Install - How to install SeismicMesh.
Example
The user can quickly build quality 2D/3D meshes from seismic velocity models in serial/parallel like so…
import numpy as np
import zipfile
from mpi4py import MPI
import meshio
import SeismicMesh
comm = MPI.COMM_WORLD
size = comm.Get_size()
rank = comm.Get_rank()
# Here we download a benchmark 3D velocity model and turn it into a Numpy array
# https://s3.amazonaws.com/open.source.geoscience/open_data/seg_eage_models_cd/Salt_Model_3D.tar.gz
if rank == 0:
# Dimensions of model (number of grid points in z, x, and y)
nx, ny, nz = 676, 676, 210
path = "velocity_models/Salt_Model_3D/3-D_Salt_Model/VEL_GRIDS/"
# Extract Saltf@@ from SALTF.ZIP
zipfile.ZipFile(path + "SALTF.ZIP", "r").extract("Saltf@@", path=path)
# Load data into a numpy array
with open(path + "Saltf@@", "r") as file:
vp = np.fromfile(file, dtype=np.dtype("float32").newbyteorder(">"))
vp = vp.reshape(nx, ny, nz, order="F")
vp = np.flipud(vp.transpose((2, 0, 1))) # z, x and then y
else:
vp = np.zeros(shape=(1, 1, 1))
vp[:] = 1500.0
# The domain is defined (in this case) as a cube and domain extents are provided in meters
# Bounding box describing domain extents (corner coordinates)
bbox = (-4200, 0, 0, 13520, 0, 13520)
# 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 for the :class:`MeshSizeFunction` can be found here
# https://seismicmesh.readthedocs.io/en/par3d/api.html#seimsicmesh-meshsizefunction
ef = SeismicMesh.MeshSizeFunction(
bbox=bbox,
velocity_grid=vp,
dt=0.001,
freq=2,
wl=5,
grade=0.25,
hmin=150,
hmax=5e3,
domain_ext=250,
padstyle="linear_ramp",
)
ef = ef.build()
# The user then calls the mesh generator
# Construct a mesh generator object
mshgen = SeismicMesh.MeshGenerator(ef)
# Build the mesh
points, cells = mshgen.build(max_iter=75, axis=1)
# For 3D mesh generation, we provide an implementation to bound the minimum dihedral angle::
points, cells = mshgen.build(
points=points, mesh_improvement=True, max_iter=50, min_dh_bound=5,
)
# Meshes can be written quickly to disk using meshio and visualized with Paraview::
if rank == 0:
meshio.write_points_cells(
"EAGE_Salt.vtk", points / 1000.0, [("tetra", cells)],
)
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.
Gallery:
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for SeismicMesh-1.2.43-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c419c7d7fbbd94c8ce7dc6de938dfb58df9d7a58fc6bc06bd2f0e30859e317bb |
|
MD5 | 83877fcc571c8490dc51d6db798774f5 |
|
BLAKE2b-256 | bea5e5acc3b9b64eeb7a32c8dc9125356b110594545046338b181d0d91178843 |