This documentation is not for the latest stable Salvus version.

This tutorial is presented as Python code running inside a Jupyter Notebook, the recommended way to use Salvus. To run it yourself you can copy/type each individual cell or directly download the full notebook, including all required files.

Global and Regional Seismic Wave Propagation with Smothiesem

This tutorial demonstrates how to prepare meshes for global seismic wave simulations using the anisotropic adaptive mesh refinement rechnique (aamr), which in this context is also known as smoothiesem [1, 2]. The meshes are specifically build for a particular source location to take advantage of the lateral smoothness of the wavefield and reduce the numerical burden significantly for global and regional scale simulations.

The mesh can be refined in predefined depth, distance and azimuth regions. Additionally, the domain can be restricted to a region of interest as discussed in the separate data adaptive mesh masking tutorial.

In this tutorial we demonstrate the basic concept and most important parameters to build these meshes.

%matplotlib inline
%config Completer.use_jedi = False

from salvus.mesh.simple_mesh import SmoothieSEM
from salvus import namespace as sn

from obspy.clients.fdsn import Client

period_global = 100.0

# a quake in Turkey that we will use in this tutorial, original data from IRIS spud:
source = sn.simple_config.source.seismology.SideSetMomentTensorPoint3D(

Full Sphere Meshes

First, we build some full sphere meshes to highlight the different lateral refinement options.

1) no lateral refinement

The simplemost smoothiesem mesh is a full sphere with no lateral refinements and the symmetry axis is aligned with the seismic source location. The tensor order controls boths the accuracy of representing the seismic velocities as well as the geometry of the domain (here: the sphere). On top, the parameter nlat allows to vary the number of elements in the lateral direction that is used throughout the whole mesh. Compare Figure 9 in [1] to choose values appropriate for your application.

sm = SmoothieSEM()
sm.basic.model = "prem_iso_one_crust"
sm.basic.min_period_in_seconds = period_global
sm.basic.elements_per_wavelength = 2.0

sm.advanced.tensor_order = 2
sm.basic.number_of_lateral_elements = 4
sm.source.latitude = source._initial_arguments["latitude"]
sm.source.longitude = source._initial_arguments["longitude"]

<salvus.mesh.unstructured_mesh.UnstructuredMesh at 0x7f9c47809b10>

This type of refinement is particularly useful to increase resolution of the surface towards the equator, hence to improve resolution of surface waves as well as surface topography. Here, theta is the angular distance from the source in the range [0°, 180°]. Multiple such refinements can be combined, but refinement boundaries should not cross to ensure high quality elements: each refinement should be fully contained in all previous refinements.

sm.refinement.lateral_refinements = [
        "theta_min": 60.0,
        "theta_max": 150.0,
        "r_min": 6000.0,
        "theta_min": 80.0,
        "theta_max": 130.0,
        "r_min": 6200.0,