cake
¶
Classical seismic ray theory for layered earth models (layer cake models).
This module can be used to e.g. calculate arrival times, ray paths, reflection and transmission coefficients, take-off and incidence angles and geometrical spreading factors for arbitrary seismic phases. Computations are done for a spherical earth, even though the module name may suggests something flat.
The main classes defined in this module are:
Material
- Defines an isotropic elastic material.PhaseDef
- Defines a seismic phase arrival / wave propagationhistory.
LayeredModel
- Representation of a layer cake model.Layer
- A layer in aLayeredModel
.HomogeneousLayer
- A homogeneousLayer
.GradientLayer
- A gradientLayer
.
Discontinuity
- A discontinuity in aLayeredModel
.Interface
- ADiscontinuity
between twoLayer
instances.Surface
- The surfaceDiscontinuity
on top of aLayeredModel
.
RayPath
- A fan of rays running through a common sequence of layers / interfaces.Ray
- A specific ray with a specific (ray parameter, distance, arrival time) choice.RayElement
- An element of aRayPath
.Straight
- A ray segment representing propagation through oneLayer
.Kink
- An interaction of a ray with aDiscontinuity
.
-
class
Material
(vp=None, vs=None, rho=2600.0, qp=None, qs=None, poisson=None, lame=None, qk=None, qmu=None, burgers=None)[source]¶ Isotropic elastic material.
Parameters: - vp – P-wave velocity [m/s]
- vs – S-wave velocity [m/s]
- rho – density [kg/m^3]
- qp – P-wave attenuation Qp
- qs – S-wave attenuation Qs
- poisson – Poisson ratio
- lame – tuple with Lame parameter lambda and shear modulus [Pa]
- qk – bulk attenuation Qk
- qmu – shear attenuation Qmu
- burgers (tuple) – Burgers rheology paramerters as tuple. transient viscosity [Pa], <= 0 means infinite value, steady-state viscosity [Pa] and alpha, the ratio between the effective and unreleaxed shear modulus, mu1/(mu1 + mu2).
If no velocities and no lame parameters are given, standard crustal values of vp = 5800 m/s and vs = 3200 m/s are used. If no Q values are given, standard crustal values of qp = 1456 and qs = 600 are used. If no Burgers material parameters are given, transient and steady-state viscosities are 0 and alpha=1.
Everything is in SI units (m/s, Pa, kg/m^3) unless explicitly stated.
The main material properties are considered independant and are accessible as attributes (it is allowed to assign to these):
-
vp, vs, rho, qp, qs
Other material properties are considered dependant and can be queried by instance methods.
-
astuple
()[source]¶ Get independant material properties as a tuple.
Returns a tuple with
(vp, vs, rho, qp, qs)
.
-
class
Leg
(departure=None, mode=None)[source]¶ Represents a continuous piece of wave propagation in a
PhaseDef
.Attributes:
To be considered as read-only.
-
departure
¶ One of the constants
UP
orDOWN
indicating upward or downward departure.
-
mode
¶ One of the constants
P
orS
, indicating the propagation mode.
-
depthmin
¶ None
, a number (a depth in [m]) or a string (an interface name), minimum depth.
-
depthmax
¶ None
, a number (a depth in [m]) or a string (an interface name), maximum depth.
-
-
class
Knee
(*args)[source]¶ Represents a change in wave propagation within a
PhaseDef
.Attributes:
To be considered as read-only.
-
depth
¶ Depth at which the conversion/reflection should happen. this can be a string or a number.
-
direction
¶ One of the constants
UP
orDOWN
to indicate the incoming direction.
-
in_mode
¶ One of the constants
P
orS
to indicate the type of mode of the incoming wave.
-
out_mode
¶ One of the constants
P
orS
to indicate the type of mode of the outgoing wave.
-
conversion
¶ Boolean, whether there is a mode conversion involved.
-
reflection
¶ Boolean, whether there is a reflection involved.
-
headwave
¶ Boolean, whether there is headwave propagation involved.
-
-
exception
PhaseDefParseError
(definition, position, exception)[source]¶ Exception raised when an error occures during parsing of a phase definition string.
-
class
PhaseDef
(definition=None, classicname=None)[source]¶ Definition of a seismic phase arrival, based on ray propagation path.
Parameters: definition – string representation of the phase in Cake’s phase syntax Seismic phases are conventionally named e.g. P, Pn, PP, PcP, etc. In Cake, a slightly different terminology is adapted, which allows to specify arbitrary conversion/reflection histories for seismic ray paths. The conventions used here are inspired by those used in the TauP toolkit, but are not completely compatible with those.
The definition of a seismic ray propagation path in Cake’s phase syntax is a string consisting of an alternating sequence of legs and knees.
A leg represents seismic wave propagation without any conversions, encountering only super-critical reflections. Legs are denoted by
P
,p
,S
, ors
. The capital letters are used when the take-off of the leg is in downward direction, while the lower case letters indicate a take-off in upward direction.A knee is an interaction with an interface. It can be a mode conversion, a reflection, or propagation as a headwave or diffracted wave.
- conversion is simply denoted as:
(INTERFACE)
orDEPTH
- upperside reflection:
v(INTERFACE)
orvDEPTH
- underside reflection:
^(INTERFACE)
or^DEPTH
- normal kind headwave or diffracted wave:
v_(INTERFACE)
orv_DEPTH
The interface may be given by name or by depth: INTERFACE is the name of an interface defined in the model, DEPTH is the depth of an interface in [km] (the interface closest to that depth is chosen). If two legs appear consecutively without an explicit knee, surface interaction is assumed.
The phase definition may end with a backslash
\
, to indicate that the ray should arrive at the receiver from above instead of from below. It is possible to restrict the maximum and minimum depth of a leg by appending<(INTERFACE)
or<DEPTH
or>(INTERFACE)
or>DEPTH
after the leg character, respectively.Examples:
P
- like the classical P, but includes PKP, PKIKP, PgP<(moho)
- like classical Pg, but must leave source downwardspP
- leaves source upward, reflects at surface, then travels as PP(moho)s
- conversion from P to S at the Moho on upgoing pathP(moho)S
- conversion from P to S at the Moho on downgoing pathPv12p
- P with reflection at 12 km deep interface (or the interface closest to that)Pv_(moho)p
- classical PnPv_(cmb)p
- classical PdiffP^(conrad)P
- underside reflection of P at the Conrad discontinuity
Usage:
>>> from pyrocko.cake import PhaseDef # must escape the backslash >>> my_crazy_phase = PhaseDef('pPv(moho)sP\\') >>> print my_crazy_phase Phase definition "pPv(moho)sP": - P mode propagation, departing upward - surface reflection - P mode propagation, departing downward - upperside reflection with conversion from P to S at moho - S mode propagation, departing upward - surface reflection with conversion from S to P - P mode propagation, departing downward - arriving at target from above
Note
- These conventions might be extended in a way to allow to fix wave propagation to SH mode, possibly by specifying SH, or a single character (e.g. H) instead of S. This would be benificial for the selection of conversion and reflection coefficients, which currently only deal with the P-SV case.
-
static
classic
(phasename)[source]¶ Get phase definitions based on classic phase name.
Parameters: phasename – classic name of a phase Returns: list of PhaseDef objects This returns a list of PhaseDef objects, because some classic phases (like e.g. Pg) can only be represented by two Cake style PhaseDef objects (one with downgoing and one with upgoing first leg).
-
legs
()[source]¶ Iterate over the continuous pieces of wave propagation (legs) defined within this phase definition.
- conversion is simply denoted as:
-
psv_surface_ind
(in_mode, out_mode)[source]¶ Get indices to select the appropriate element from scatter matrix for free surface.
-
psv_surface
(material, p, energy=False)[source]¶ Scatter matrix for free surface reflection/conversions.
Parameters: - material – material, object of type
Material
- p – flat ray parameter [s/m]
- energy – bool, when
True
energy normalized coefficients are returned
Returns: Scatter matrix
The scatter matrix is ordered as follows:
[[PP, PS], [SP, SS]]
The formulas given in Aki & Richards are used.
- material – material, object of type
-
psv_solid_ind
(in_direction, out_direction, in_mode, out_mode)[source]¶ Get indices to select the appropriate element from scatter matrix for solid-solid interface.
-
psv_solid
(material1, material2, p, energy=False)[source]¶ Scatter matrix for solid-solid interface.
Parameters: Returns: Scatter matrix
The scatter matrix is ordered as follows:
[[P1P1, S1P1, P2P1, S2P1], [P1S1, S1S1, P2S1, S2S1], [P1P2, S1P2, P2P2, S2P2], [P1S2, S1S2, P2S2, S2S2]]
The formulas given in Aki & Richards are used.
-
class
Layer
(ztop, zbot, name=None)[source]¶ Representation of a layer in a layered earth model.
Parameters: - ztop – depth of top of layer
- zbot – depth of bottom of layer
- name – name of layer (optional)
Subclasses are:
HomogeneousLayer
andGradientLayer
.-
potint_coefs
(mode)[source]¶ Get coefficients for potential interpolation.
Parameters: mode – mode of wave propagation, P
orS
Returns: coefficients (a, b)
-
pflat_bottom
(p)[source]¶ Convert spherical ray parameter to local flat ray parameter for bottom of layer.
-
xt_potint
(p, mode, zpart=None)[source]¶ Get travel time and distance for for traversal with given mode and ray parameter.
Parameters: - p – ray parameter (spherical)
- mode – mode of propagation (
P
orS
) - zpart – if given, tuple with two depths to restrict computation to a part of the layer
This implementation uses analytic formulas valid for a spherical earth in the case where the velocity c within the layer is given by potential interpolation of the form
c(z) = a*z^b
-
test
(p, mode, z)[source]¶ Check if wave mode can exist for given ray parameter at given depth within the layer.
-
class
HomogeneousLayer
(ztop, zbot, m, name=None)[source]¶ Representation of a homogeneous layer in a layered earth model.
Base class:
Layer
.
-
class
GradientLayer
(ztop, zbot, mtop, mbot, name=None)[source]¶ Representation of a gradient layer in a layered earth model.
Base class:
Layer
.
-
class
Interface
(z, mabove, mbelow, name=None)[source]¶ Representation of an interface in a layered earth model.
Base class:
Discontinuity
.
-
class
Surface
(z, mbelow)[source]¶ Representation of the surface discontinuity in a layered earth model.
Base class:
Discontinuity
.
-
class
Straight
(direction_in, direction_out, mode, layer)[source]¶ A ray segment representing wave propagation through one
Layer
.
-
class
Kink
(in_direction, out_direction, in_mode, out_mode, discontinuity)[source]¶ An interaction of a ray with a
Discontinuity
.
-
class
RayPath
(phase)[source]¶ Representation of a fan of rays running through a common sequence of layers / interfaces.
-
xt_endgaps
(p, endgaps, which='both')[source]¶ Get amount of distance/traveltime to be subtracted at the generic ray path’s ends.
-
iter_zxt
(p)[source]¶ Iterate over (depth, distance, traveltime) at each layer interface on ray path.
-
zxt_path_subdivided
(p, endgaps, points_per_straight=20, x_for_headwave=None)[source]¶ Get geometrical representation of ray path.
-
-
class
Ray
(path, p, x, t, endgaps, draft_pxt)[source]¶ Representation of a ray with a specific (path, ray parameter, distance, arrival time) choice.
Attributes:
-
given_phase
()[source]¶ Get phase definition which was used to create the ray.
Returns: PhaseDef
object
-
efficiency
()[source]¶ Get conversion/reflection efficiency of the ray.
A value between 0 and 1 is returned, reflecting the relative amount of energy which is transmitted along the ray and not lost by reflections or conversions.
-
zxt_path_subdivided
(points_per_straight=20)[source]¶ Get geometrical representation of ray path.
Three arrays (depth, distance, time) with points on the ray’s path of propagation are returned. The number of points which are used in each ray segment (passage through one layer) may be controlled by the
points_per_straight
parameter.
-
-
class
LayeredModel
[source]¶ Representation of a layer cake model.
There are several ways to initialize an instance of this class.
- Use the module function
load_model()
to read a model from a file. - Create an empty model with the default constructor and append layers and
discontinuities with the
append()
method (from top to bottom). - Use the constructor
LayeredModel.from_scanlines()
, to automatically create theLayer
andDiscontinuity
objects from a given velocity profile.
An earth model is represented by as stack of
Layer
andDiscontinuity
objects. The methodarrivals()
returnsRay
objects which may be e.g. queried for arrival times of specific phases. Each ray is associated with aRayPath
object. Ray objects share common ray paths if they have the same conversion/reflection/propagation history. Creating the ray path objects is relatively expensive (this is done ingather_paths()
), but they are cached for reuse in successive invocations.-
copy_with_elevation
(elevation)[source]¶ Get a copy of the model with surface layer stretched to given elevation.
Parameters: elevation – new surface elevation in [m] Elevation is positiv upward, contrary to the layered models downward z axis.
-
append
(element)[source]¶ Add a layer or discontinuity at bottom of model.
Parameters: element – object of subclass of Layer
orDiscontinuity
.
-
elements
(direction=4)[source]¶ Iterate over all elements of the model.
Parameters: direction – direction of traversal DOWN
orUP
.Objects derived from the
Discontinuity
andLayer
classes are yielded.
-
layers
(direction=4)[source]¶ Iterate over all layers of model.
Parameters: direction – direction of traversal DOWN
orUP
.Objects derived from the
Layer
class are yielded.
-
layer
(z, direction=4)[source]¶ Get layer for given depth.
Parameters: - z – depth [m]
- direction – direction of traversal
DOWN
orUP
.
Returns first layer which touches depth
z
(tolerant at boundaries).
-
material
(z, direction=4)[source]¶ Get material at given depth.
Parameters: - z – depth [m]
- direction – direction of traversal
DOWN
orUP
Returns: object of type
Material
If given depth
z
happens to be at an interface, the material of the first layer with respect to the the traversal ordering is returned.
-
discontinuity
(name_or_z)[source]¶ Get discontinuity by name or depth.
Parameters: name_or_z – name of discontinuity or depth [m] as float value
-
adapt_phase
(phase)[source]¶ Adapt a phase definition for use with this model.
This returns a copy of the phase definition, where named discontinuities are replaced with the actual depth of these, as defined in the model.
-
path
(p, phase, layer_start, layer_stop)[source]¶ Get ray path for given combination of ray parameter, phase definition, source and receiver layers.
Parameters: - p – ray parameter (spherical) [s/rad]
- phase – phase definition (
PhaseDef
object) - layer_start – layer with source
- layer_stop – layer with receiver
Returns: RayPath
objectIf it is not possible to find a solution, an exception of type
NotPhaseConform
,MinDepthReached
,MaxDepthReached
,CannotPropagate
,BottomReached
orSurfaceReached
is raised.
-
gather_paths
(phases=PhaseDef('P'), zstart=0.0, zstop=0.0)[source]¶ Get all possible ray paths for given source and receiver depths for one or more phase definitions.
Parameters: Returns: a list of
RayPath
objectsResults of this method are cached internally. Cached results are returned, when a given combination of source layer, receiver layer and phase definition has been used before.
-
arrivals
(distances=[], phases=PhaseDef('P'), zstart=0.0, zstop=0.0, refine=True)[source]¶ Compute rays and traveltimes for given distances.
Parameters: - distances – list or array of distances [deg]
- phases – a
PhaseDef
object or a list of such objects. Comma-separated strings and lists of such strings are also accepted and are converted toPhaseDef
objects for convenience. - zstart – source depth [m]
- zstop – receiver depth [m]
- refine – bool flag, whether to use bisectioning to improve (p, x, t) estimated from interpolation
Returns: a list of
Ray
objects, sorted by (distance, arrival time)
-
classmethod
from_scanlines
(producer)[source]¶ Create layer cake model from sequence of materials at depths.
Parameters: producer – iterable yielding (depth, material, name) tuples Creates a new
LayeredModel
object and uses itsappend()
method to add layers and discontinuities as needed.
-
profile
(get)[source]¶ Get parameter profile along depth of the earthmodel.
Parameters: get (string) – property to be queried ( 'vp'
,'vs'
,'rho'
,'qp'
, or'qs'
, or'z'
)
-
min
(get='vp')[source]¶ Find minimum value of a material property or depth.
Parameters: get – property to be queried ( 'vp'
,'vs'
,'rho'
,'qp'
, or'qs'
, or'z'
)
-
max
(get='vp')[source]¶ Find maximum value of a material property or depth.
Parameters: get – property to be queried ( 'vp'
,'vs'
,'rho'
,'qp'
,'qs'
, or'z'
)
-
simplify
(max_rel_error=0.001)[source]¶ Get representation of model with lower resolution.
Returns an approximation of the model. All discontinuities are kept, but layer stacks with continuous model parameters are represented, if possible, by a lower number of layers. Piecewise linear functions are fitted against the original model parameter’s piecewise linear functions. Successively larger numbers of layers are tried, until the difference to the original model is below
max_rel_error
. The difference is measured as the RMS error of the fit normalized by the mean of the input (i.e. the fitted curves should deviate, on average, less than 0.1% from the input curves ifmax_rel_error
= 0.001).
-
extract
(depth_min=None, depth_max=None)[source]¶ Extract
LayeredModel
fromLayeredModel
.Parameters: Interpolates a
GradientLayer
atdepth_min
and/ordepth_max
.
-
perturb
(rstate=None, keep_vp_vs=False, **kwargs)[source]¶ Create a perturbed variant of the earth model.
Randomly change the thickness and material parameters of the earth model from a uniform distribution.
Parameters: - kwargs (dict) – Maximum change fraction (e.g. 0.1) of the parameters.
Name the parameter, prefixed by
p
. Supported parameters areph, pvp, pvs, prho, pqs, pqp
. - rstate (
numpy.random.RandomState
, optional) – Random state to draw from, defaults toNone
- keep_vp_vs (bool, optional) – Keep the Vp/Vs ratio, defaults to False
Returns: A new, perturbed earth model
Return type: perturbed_model = model.perturb(ph=.1, pvp=.05, prho=.1)
- kwargs (dict) – Maximum change fraction (e.g. 0.1) of the parameters.
Name the parameter, prefixed by
- Use the module function
-
read_hyposat_model
(fn)[source]¶ Reader for HYPOSAT earth model files.
To be used as producer in
LayeredModel.from_scanlines()
.Interface names are translated as follows:
'MOHO'
->'moho'
,'CONR'
->'conrad'
-
read_nd_model
(fn)[source]¶ Reader for TauP style ‘.nd’ (named discontinuity) files.
To be used as producer in
LayeredModel.from_scanlines()
.Interface names are translated as follows:
'mantle'
->'moho'
,'outer-core'
->'cmb'
,'inner-core'
->'icb'
.The format has been modified to include Burgers materials parameters in columns 7 (burger_eta1), 8 (burger_eta2) and 9. eta(3).
-
load_model
(fn='ak135-f-continental.m', format='nd', crust2_profile=None)[source]¶ Load layered earth model from file.
Parameters: - fn – filename
- format – format
- crust2_profile –
(lat, lon)
orpyrocko.crust2x2.Crust2Profile
object, merge model with crustal profile. Iffn
is forced to beNone
only the converted CRUST2.0 profile is returned.
Returns: object of type
LayeredModel
The following formats are currently supported:
format description 'nd'
‘named discontinuity’ format used by the TauP programs 'hyposat'
format used by the HYPOSAT location program The naming of interfaces is translated from the file format’s native naming to Cake’s own convention (See
read_nd_model()
andread_hyposat_model()
for details). Cake likes the following internal names:'conrad'
,'moho'
,'cmb'
(core-mantle boundary),'icb'
(inner core boundary).
-
castagna_vs_to_vp
(vs)[source]¶ Calculate vp from vs using castagna’s relation.
Castagna’s relation (the mudrock line) is an empirical relation for vp/vs for siliciclastic rocks (i.e. sandstones and shales). [Castagna et al., 1985]
vp = 1.16 * vs + 1360 [m/s]Parameters: vs – S-wave velocity [m/s] Returns: P-wave velocity [m/s]
-
castagna_vp_to_vs
(vp)[source]¶ Calculate vp from vs using castagna’s relation.
Castagna’s relation (the mudrock line) is an empirical relation for vp/vs for siliciclastic rocks (i.e. sandstones and shales). [Castagna et al., 1985]
vp = 1.16 * vs + 1360 [m/s]Parameters: vp – P-wave velocity [m/s] Returns: S-wave velocity [m/s]
-
filled
(v, *args, **kwargs)[source]¶ Create NumPy array filled with given value.
This works like
numpy.ones()
but initializes the array withv
instead of ones.