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 and pybind11:
sudo apt install libcgal-dev python-pybind11
After that, SeismicMesh can be installed from the Python Package Index (pypi), 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. For example in 3D::
First, to run this code below you must download the benchmark 3D EAGE velocity model from here
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()
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.
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.44-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7091bef1fbec01eb0d401dc25d6c64c15cf87558a609023c6d56bc9562764ba9 |
|
MD5 | 2e6a176ddad4e3b5b3a0227576e2baac |
|
BLAKE2b-256 | 9a6f9addc27f0985356e14d782ae57c1b93b9e5e87a2a0e6316c717ec41f6286 |