EarthModels.jl is wholly replaced by SeisModels.jl.
EarthModels.jl will continue to work, but will not be updated in the future.
A Julia package for dealing with models of the Earth's (and other quasi-1D planets') seismic properties.
Currently, only three kinds of one-dimensional models are supported, but all model parameterisations and models are acceptable for inclusion. Contributions are welcome.
Built in models are PREM and AK135.
Although not registered as an official package, EarthModels.jl can be added to your Julia install like so:
julia> import Pkg; Pkg.add("https://github.com/anowacki/EarthModels.jl")
(On version 0.6 of Julia, instead use the command Pkg.clone("https://github.com/anowacki/EarthModels.jl")
.)
The module defines the EarthModel type and subtypes of this specify the kind of model (i.e., symmetry, nature of basis function, etc.).
julia> using EarthModels
julia> subtypes(EarthModel)
1-element Array{Any,1}:
EarthModel1D
julia> subtypes(EarthModel1D)
3-element Array{Any,1}:
LinearLayeredModel
PREMPolyModel
SteppedLayeredModel
So, there are currently three types of models implemented, all 1D models, with polynomial, linear or constant basis within each layer.
You can either create your own models by creating a new instance of one of the immutable types, or use the inbuilt models. For instance, for PREM, one can evaluate at an arbitrary radius:
- VP
- VS
- density ρ
- anisotropic parameters VPH, VPV, VSH, VSV and η
Calculate these by calling the function with the model as the first argument:
julia> vp(PREM, 3500)
13.71171655163979
julia> Qκ(PREM, 1000)
1327.7
julia> density(AK135, radius(AK135, 20))
2.449
In the last example, we used the radius
function to convert depth in the AK135 model
to radius and calculate the density at 20 km depth. Some functions also accept the
depth
keyword argument to instead evaluate properties at a point below the surface:
julia> density(AK135, radius(AK135, 20)) == density(AK135, 20, depth=true)
true
You can also evaluate values programmatically (i.e., where the parameter of
interest is a variable) by using the exported evaluate
function, and broadcast
the call to get multiple values:
julia> evaluate(AK135, :vp, 3580)
13.653094354838709
julia> parameters = (:vp, :vs, :density);
julia> evaluate.(AK135, parameters, 3680)
(13.591187999999999, 7.226264, 5.4003499999999995)
Support for reading and writing model files is currently limited. However, EarthModels
does support reading and writing of
Mineos-format ‘tabular’ models
(i.e., SteppedLayeredModel
s) via the read_mineos
and write_mineos
functions.
EarthModel
: Abstract supertype of all modelsEarthModel1D
: Abstract supertype of 1D modelsLinearLayeredModel
: 1D model with linearly-varying properties between node pointsPREMPolyModel
: 1D model defined by PREM-style polynomials (of arbitrary degree)SteppedLayeredModel
: 1D model with constant properties between node points
AK135
PREM
depth
: Return depth in km given a radius and modelhasattenuation
: Whether a model includes attenuationisanisotropic
: Whether a model is anisotropicradius
: Return radius in km given a depth and modelsurface_radius
: Radius in km of planet
evaluate
: Evaluate a given field for a model at any radiusvp
: P-wave velocity in km/svs
: S-wave velocity in km/sdensity
: Density in g/cm^3vph
: Horizontal P-wave velocity in km/svpv
: Vertical (radial) P-wave velocity in km/svsh
: Horizontally-polarised S-wave velocity in km/svsv
: Vertically-polarised S-wave velocity in km/seta
: Anisotropic parameterQμ
,Qmu
: Shear quality factorQκ
,Qkappa
: Bulk quality factor
bulk_modulus
: Bulk modulus (K) in Pagravity
: Acceleration due to gravity in m/s^2 at a given radiusmass
: Mass in kg from centre of model to a given radiusmoment_of_inertia
: MOI in kg m^2poissons_ratio
: Poisson's ratiopressure
: Pressure in Pashear_modulus
: Shear modulus (G) in Pasurface_mass
: Mass between two radiiyoungs_modulus
: Young's modulus in Pa
read_mineos
: Read Mineos tabular-format filewrite_mineos
: Write Mineos tabular-format file
Types and methods are documented, so at the REPL type ?
to get a help?>
prompt, and type the name of the function:
help?> PREMPolyModel
search: PREMPolyModel
PREMPolyModel <: EarthModel1D
Type describing the Earth as a set of layers within which properties vary according to a set of
polynomials.
Physical parameters are represented by arrays of size (order+1,n), where n is the number of
layers, and order is the order of polynomial which is used to represent the parameter. Hence a
constant layer has size (1,n), and to compute the value of x in layer i, for an Earth radius of
a km, at a radius of r km, the expression is:
val_x = x[i,1] + (r/a)*x[i,2] + (r/a)^2*x[i,3] ... (r/a)^order*x[i,order+1]