Examples

Acoustic wave simulation example

using SeismicWaves

# numerics
nt = 1500
dt = 0.0012
dh = 8.0
t = collect(Float64, range(0.0; step=dt, length=nt)) ## time vector

# create a velocity model (gradient from top to bottom)
nx = 211
nz = 120
velmod = zeros(nx, nz)
for i in 1:nx
    for j in 1:nz
        velmod[i, j] = 2000.0 + 12.0 * (j - 1)
    end
end
matprop = VpAcousticCDMaterialProperties(velmod)

# shots definition
nshots = 6
shots = Vector{ScalarShot{Float64}}()
# sources x-position (in grid points) (different for every shot)
ixsrc = round.(Int, LinRange(32, nx - 31, nshots))
for i in 1:nshots
    # sources definition
    nsrc = 1
    possrcs = zeros(1, 2)                ## 1 source, 2 dimensions
    possrcs[:, 1] .= (ixsrc[i] - 1) * dh    ## x-positions in meters
    possrcs[:, 2] .= 2 * dh                 ## y-positions in meters
    # source time functions
    srcstf = zeros(nt, nsrc)
    for s in 1:nsrc
        srcstf[:, s] .= 1000.0 .* rickerstf.(t, 1.20 / 12.0, 12.0)
    end
    srcs = ScalarSources(possrcs, srcstf, 12.0)

    # receivers definition
    nrecs = 20
    # receivers x-positions (in grid points) (same for every shot)
    ixrec = round.(Int, LinRange(30, nx - 29, nrecs))
    posrecs = zeros(nrecs, 2)              ## 20 receivers, 2 dimensions
    posrecs[:, 1] .= (ixrec .- 1) .* dh    ## x-positions in meters
    posrecs[:, 2] .= 2 * dh                ## y-positions in meters
    recs = ScalarReceivers(posrecs, nt)

    # add pair as shot
    push!(shots, ScalarShot(; srcs=srcs, recs=recs)) ## srcs => recs)
end

# Input parameters for acoustic simulation
snapevery = 100
boundcond = CPMLBoundaryConditionParameters(; halo=20, rcoef=0.0001, freeboundtop=true)
params = InputParametersAcoustic(nt, dt, (nx, nz), (dh, dh), boundcond)

# Compute the seismograms
runparams = RunParameters(parall=:threads,snapevery=snapevery)

snapshots = swforward!(
    params,
    matprop,
    shots;
    runparams=runparams
)
6-element Vector{Dict{Int64, Dict{String, <:SeismicWaves.AbstractField{Float64}}}}:
 Dict(200 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -0.0008824207718527565 … -6.077836915676642e-38 0.0; … ; 0.0 -2.911114892700982e-157 … 0.0 0.0; 0.0 0.0 … 0.0 0.0])), 1100 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 0.00044749271767252543 … -6.084272925019345e-5 0.0; … ; 0.0 5.671681219065803e-6 … -0.00021792682138966786 0.0; 0.0 0.0 … 0.0 0.0])), 1000 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 1.8528187474108396e-6 … -3.305219243201502e-5 0.0; … ; 0.0 8.804321189479274e-6 … 0.0003569773135395156 0.0; 0.0 0.0 … 0.0 0.0])), 700 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 0.0028336397151790134 … -0.00011280868282694933 0.0; … ; 0.0 -2.138160161267033e-5 … 0.0007299410568311321 0.0; 0.0 0.0 … 0.0 0.0])), 300 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 1.789353273381702e-5 … -2.2420855490684763e-6 0.0; … ; 0.0 -7.225139785415074e-81 … -2.3091319227317173e-135 0.0; 0.0 0.0 … 0.0 0.0])), 1200 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 0.00045324614155693385 … -2.425514379175672e-5 0.0; … ; 0.0 4.763979619855671e-5 … -9.739573793341426e-5 0.0; 0.0 0.0 … 0.0 0.0])), 800 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -9.513160504008343e-5 … -0.00018129795081319198 0.0; … ; 0.0 -0.007144702261283479 … 0.00014007973276165513 0.0; 0.0 0.0 … 0.0 0.0])), 500 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -5.538749504746482e-6 … 0.0007221587148290577 0.0; … ; 0.0 -8.547276774864053e-15 … -1.4157307445658457e-9 0.0; 0.0 0.0 … 0.0 0.0])), 900 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -4.322255121608741e-6 … 0.0006936901241992097 0.0; … ; 0.0 -1.3197767432601548e-6 … -0.00011336982298160624 0.0; 0.0 0.0 … 0.0 0.0])), 1300 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 3.6057869823670468e-6 … -1.8279784033997402e-5 0.0; … ; 0.0 2.574223182676145e-5 … -2.6369935002561738e-5 0.0; 0.0 0.0 … 0.0 0.0]))…)
 Dict(200 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -5.932517749545567e-7 … -4.4548067632076527e-64 0.0; … ; 0.0 -2.872904184904844e-100 … 0.0 0.0; 0.0 0.0 … 0.0 0.0])), 1100 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 5.857635165683706e-5 … -8.192826518678114e-5 0.0; … ; 0.0 3.7583982987404168e-6 … -0.00017788794767037918 0.0; 0.0 0.0 … 0.0 0.0])), 1000 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -0.00013277774845174445 … -0.0001391455008901603 0.0; … ; 0.0 6.211552198625943e-6 … -0.0011257117063188337 0.0; 0.0 0.0 … 0.0 0.0])), 700 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 0.007107378151728605 … -3.766965145692696e-5 0.0; … ; 0.0 -0.001625243701895036 … 0.000425500258377502 0.0; 0.0 0.0 … 0.0 0.0])), 300 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -0.0006453581539290609 … -1.2768212998126427e-11 0.0; … ; 0.0 -3.61530285228931e-46 … -4.7887152314707104e-83 0.0; 0.0 0.0 … 0.0 0.0])), 1200 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 0.000592171950357331 … -3.6226615787300405e-5 0.0; … ; 0.0 -9.473388287659046e-5 … -7.309124618087515e-5 0.0; 0.0 0.0 … 0.0 0.0])), 800 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -3.647913299144147e-5 … -0.00015121152645378633 0.0; … ; 0.0 0.002002899736207056 … -6.089388113896651e-6 0.0; 0.0 0.0 … 0.0 0.0])), 500 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -8.866623464452951e-7 … 0.000909515458147968 0.0; … ; 0.0 -0.0002519718650135191 … -0.004429495411236907 0.0; 0.0 0.0 … 0.0 0.0])), 900 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -9.614580126521063e-7 … 0.0006335018135391376 0.0; … ; 0.0 1.537521352363752e-5 … -0.00016370177128534146 0.0; 0.0 0.0 … 0.0 0.0])), 1300 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 2.624091216106079e-6 … -8.136813864674782e-6 0.0; … ; 0.0 -0.00011362041478893608 … -1.812815243485625e-5 0.0; 0.0 0.0 … 0.0 0.0]))…)
 Dict(200 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -7.192497848641216e-25 … 0.0 0.0; … ; 0.0 -1.7976740339947922e-57 … 0.0 0.0; 0.0 0.0 … 0.0 0.0])), 1100 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -4.384375252287879e-6 … -0.00010385255233719259 0.0; … ; 0.0 2.6816198924297913e-6 … -0.00014048739342557338 0.0; 0.0 0.0 … 0.0 0.0])), 1000 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -0.00010847769326011517 … 2.128764835963002e-5 0.0; … ; 0.0 3.3547994859803765e-6 … -0.00040985999906148046 0.0; 0.0 0.0 … 0.0 0.0])), 700 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -0.002823186173240022 … 5.43164087200029e-5 0.0; … ; 0.0 0.005594713939332966 … 0.0001952689356287215 0.0; 0.0 0.0 … 0.0 0.0])), 300 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -3.9316391035756095e-6 … -1.09795856373371e-24 0.0; … ; 0.0 -7.287212433327641e-21 … -1.0332059382558158e-48 0.0; 0.0 0.0 … 0.0 0.0])), 1200 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 0.0003426077045316665 … -5.075328174914417e-5 0.0; … ; 0.0 -0.0003601195872811236 … -5.630821016170948e-5 0.0; 0.0 0.0 … 0.0 0.0])), 800 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -2.126055603851667e-5 … -0.00024726706865919396 0.0; … ; 0.0 -0.00012091249640557331 … -0.00010123628679219525 0.0; 0.0 0.0 … 0.0 0.0])), 500 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 1.263613617942429e-5 … 0.001854587116887208 0.0; … ; 0.0 -0.0006086396891299392 … 0.05866044121267509 0.0; 0.0 0.0 … 0.0 0.0])), 900 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -2.6249449302636744e-6 … -1.6109532406700823e-5 0.0; … ; 0.0 2.2488202059887735e-5 … -0.0001790311056814307 0.0; 0.0 0.0 … 0.0 0.0])), 1300 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 6.445850463020045e-6 … -1.9478430101783015e-5 0.0; … ; 0.0 2.6051289258516673e-7 … -1.2305915204510399e-5 0.0; 0.0 0.0 … 0.0 0.0]))…)
 Dict(200 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -1.2042096271624082e-57 … 0.0 0.0; … ; 0.0 -1.1433698211561869e-24 … 0.0 0.0; 0.0 0.0 … 0.0 0.0])), 1100 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 2.1820492693827987e-6 … -0.00012891363554498126 0.0; … ; 0.0 6.05061758490187e-6 … -0.00011240411802567794 0.0; 0.0 0.0 … 0.0 0.0])), 1000 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 5.365190562705885e-5 … -0.00035287333550960997 0.0; … ; 0.0 1.0410757132258226e-5 … 4.425240630815004e-7 0.0; 0.0 0.0 … 0.0 0.0])), 700 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 0.004370956929070871 … 0.000177148466348923 0.0; … ; 0.0 -0.00350886765142476 … 4.290016708464205e-5 0.0; 0.0 0.0 … 0.0 0.0])), 300 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -4.473516406653087e-21 … -7.358582116835009e-49 0.0; … ; 0.0 -6.83302139655541e-6 … -1.5303155994828094e-24 0.0; 0.0 0.0 … 0.0 0.0])), 1200 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -0.0003196447388747044 … -6.672426302317719e-5 0.0; … ; 0.0 0.00037371447554913494 … -4.164818820080105e-5 0.0; 0.0 0.0 … 0.0 0.0])), 800 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -0.00010779974985348448 … 0.0005219809016063488 0.0; … ; 0.0 -1.4753460955550403e-5 … -0.00013197978731249962 0.0; 0.0 0.0 … 0.0 0.0])), 500 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -0.00037676102229070393 … 0.042912936907561094 0.0; … ; 0.0 1.1393186449468585e-5 … 0.002459028338519416 0.0; 0.0 0.0 … 0.0 0.0])), 900 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 0.00026721249978519686 … -0.000110265783985359 0.0; … ; 0.0 5.214048252007772e-6 … 4.380673714167096e-5 0.0; 0.0 0.0 … 0.0 0.0])), 1300 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 5.942511875217753e-7 … -2.2461974032625173e-5 0.0; … ; 0.0 6.129425817001505e-6 … -8.364532338786963e-6 0.0; 0.0 0.0 … 0.0 0.0]))…)
 Dict(200 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -1.999561448567128e-100 … 0.0 0.0; … ; 0.0 -1.0362041254754317e-6 … -6.145107173884744e-64 0.0; 0.0 0.0 … 0.0 0.0])), 1100 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 2.778244379683042e-6 … -0.0001464020204893103 0.0; … ; 0.0 2.9390461225082833e-5 … -9.356105405973602e-5 0.0; 0.0 0.0 … 0.0 0.0])), 1000 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 1.6897014102667185e-6 … -0.0009149868132030793 0.0; … ; 0.0 1.8559454400203916e-5 … -0.00018142263993732355 0.0; 0.0 0.0 … 0.0 0.0])), 700 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -0.0011932079400719295 … -0.00019244207238530833 0.0; … ; 0.0 0.0077008556935704965 … -6.145676706761962e-5 0.0; 0.0 0.0 … 0.0 0.0])), 300 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -2.3371722514821782e-46 … -3.4356170286893206e-83 0.0; … ; 0.0 -0.0011857235260010373 … -1.6756525851939065e-11 0.0; 0.0 0.0 … 0.0 0.0])), 1200 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -8.038406724155317e-5 … -8.03357258029239e-5 0.0; … ; 0.0 0.0006150355363992744 … -3.354645661843686e-5 0.0; 0.0 0.0 … 0.0 0.0])), 800 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 0.0015846667605107644 … 3.91109539557365e-5 0.0; … ; 0.0 -2.6053937508508602e-5 … -0.00019211386544898477 0.0; 0.0 0.0 … 0.0 0.0])), 500 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -0.0001479535511092435 … -0.0031289909761545625 0.0; … ; 0.0 -7.817398198362957e-6 … 0.0011409875317247966 0.0; 0.0 0.0 … 0.0 0.0])), 900 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 2.148335306523324e-5 … -9.772515650724636e-5 0.0; … ; 0.0 8.781927474762942e-7 … 0.0005576253661804058 0.0; 0.0 0.0 … 0.0 0.0])), 1300 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -9.948415340454327e-5 … -2.7674892119800955e-5 0.0; … ; 0.0 1.788983520937696e-6 … -5.913547760596794e-6 0.0; 0.0 0.0 … 0.0 0.0]))…)
 Dict(200 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -2.0826225370223883e-157 … 0.0 0.0; … ; 0.0 -0.0015906463506714227 … -7.940402408824096e-38 0.0; 0.0 0.0 … 0.0 0.0])), 1100 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 3.796228687666702e-6 … -0.00021571123078370253 0.0; … ; 0.0 -1.320166627183546e-6 … -7.825086050190789e-5 0.0; 0.0 0.0 … 0.0 0.0])), 1000 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 4.801337899193394e-6 … 0.00030127335696749345 0.0; … ; 0.0 1.3949084539174771e-6 … -0.00016653302903892042 0.0; 0.0 0.0 … 0.0 0.0])), 700 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -8.814326699931269e-6 … 0.0006051527962659532 0.0; … ; 0.0 0.002640272218954313 … -0.00013865725958654986 0.0; 0.0 0.0 … 0.0 0.0])), 300 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -4.848427097122628e-81 … -1.673651174386671e-135 0.0; … ; 0.0 2.5266619426922252e-5 … -2.5933102820201527e-6 0.0; 0.0 0.0 … 0.0 0.0])), 1200 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 3.9017878586994454e-5 … -9.866675862226415e-5 0.0; … ; 0.0 0.0004932907330106057 … -2.667032568467987e-5 0.0; 0.0 0.0 … 0.0 0.0])), 800 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -0.005278986499747693 … 0.0001587614489349205 0.0; … ; 0.0 -7.308933305337429e-5 … -0.0002152125563270643 0.0; 0.0 0.0 … 0.0 0.0])), 500 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 -5.173872345260021e-15 … -9.735032819749739e-10 0.0; … ; 0.0 -1.2573251146718065e-5 … 0.0008623713445864092 0.0; 0.0 0.0 … 0.0 0.0])), 900 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 4.3252435387643485e-5 … -5.5301586844289456e-5 0.0; … ; 0.0 -2.840276406759465e-6 … 0.0006869739899051554 0.0; 0.0 0.0 … 0.0 0.0])), 1300 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("pcur" => SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}([0.0 0.0 … 0.0 0.0; 0.0 2.0832881105105242e-5 … -3.5004034531779724e-5 0.0; … ; 0.0 -5.030025083101855e-7 … -1.1254474267930108e-6 0.0; 0.0 0.0 … 0.0 0.0]))…)

Elastic wave simulation example

# time stuff
nt = 3000 #1500
dt = 0.0008
t = collect(Float64, range(0.0; step=dt, length=nt)) # seconds

# create a velocity model
nx = 380 ## 211
nz = 270 ## 120
dh = 4.5 ## meters

vp = zeros(nx, nz)
vp[nx÷2+10:end, :] .= 3100.0
for i in 1:nx
    for j in 1:nz
        vp[i, j] = 2000.0 + dh * (j - 1)
    end
end
vs = vp ./ sqrt(3)

ρ = 2100.0 * ones(nx, nz)
μ = vs .^ 2 .* ρ  ## μ = Vs^2⋅ρ
λ = (vp .^ 2 .* ρ) .- (2 .* μ)  ## λ = vp^2 · ρ - 2μ

matprop = ElasticIsoMaterialProperties(; λ=λ, μ=μ, ρ=ρ)

# shots definition
nshots = 1
shots = Vector{MomentTensorShot{Float64, 2, MomentTensor2D{Float64}}}()

for i in 1:nshots
    # sources definition
    nsrc = 1
    # sources x-position (in grid points) (different for every shot)
    if nsrc == 1
        ixsrc = [nx / 2]
    else
        ixsrc = round.(Int, LinRange(30, nx - 31, nsrc))
    end
    possrcs = zeros(nsrc, 2)    ## 1 source, 2 dimensions
    for s in 1:nsrc
        possrcs[s, 1] = (ixsrc[i] - 1) * dh .+ 0.124   ## x-positions in meters
        possrcs[s, 2] = (nz / 2) * dh .+ 0.124 ## y-positions in meters
    end

    # source time functions
    f0 = 12.0
    t0 = 1.20 / f0
    srcstf = zeros(nt, nsrc)
    Mxx = zeros(nsrc)
    Mzz = zeros(nsrc)
    Mxz = zeros(nsrc)
    for s in 1:nsrc
        srcstf[:, s] .= rickerstf.(t, t0, f0)
        Mxx[s] = 5e10
        Mzz[s] = 5e10
        Mxz[s] = 0.89e10
    end

    srcs = MomentTensorSources(
        possrcs, srcstf,
        [MomentTensor2D(; Mxx=Mxx[s], Mzz=Mzz[s], Mxz=Mxz[s]) for s in 1:nsrc],
        f0
    )

    # receivers definition
    nrecs = 10
    # receivers x-positions (in grid points) (same for every shot)
    ixrec = round.(Int, LinRange(40, nx - 40, nrecs))
    posrecs = zeros(nrecs, 2)    ## 20 receivers, 2 dimensions
    posrecs[:, 1] .= (ixrec .- 1) .* dh .- 0.324   ## x-positions in meters
    posrecs[:, 2] .= 3 * dh                        ## y-positions in meters

    ndim = 2
    recs = VectorReceivers(posrecs, nt, ndim)

    # add pair as shot
    push!(shots, MomentTensorShot(; srcs=srcs, recs=recs)) # srcs => recs)
end

# Input parameters for elastic simulation
snapevery = 5
infoevery = 100
freetop = true
halo = 20
rcoef = 0.0001
boundcond = CPMLBoundaryConditionParameters(; halo=halo, rcoef=rcoef, freeboundtop=freetop)
params = InputParametersElastic(nt, dt, (nx, nz), (dh, dh), boundcond)

# Compute the seismograms
runparams = RunParameters(parall=:threads,infoevery=infoevery,snapevery=snapevery)

snapshots = swforward!(
    params,
    matprop,
    shots;
    runparams=runparams
)
1-element Vector{Dict{Int64, Dict{String, <:SeismicWaves.AbstractField{Float64}}}}:
 Dict(2050 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("ucur" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[2.5578940538898077e-7 2.902296498635234e-7 … 1.2165734450005397e-8 4.669078310258626e-9; 7.562902459104942e-7 7.25804926371564e-7 … 1.700132198624144e-8 -6.696562300381548e-9; … ; -6.698509863712049e-7 -6.460773886278481e-7 … -2.9068100769372254e-9 9.378672092155471e-9; -1.988476532456829e-7 -2.255697645308207e-7 … -8.300540548916312e-10 9.847884394699684e-11], [1.2397831953352095e-9 -1.9963923157727115e-8 … -2.8097813029483964e-8 -5.9577588790037295e-9; -5.004126894891366e-7 -5.022697683007373e-7 … -1.2417755044538617e-8 -1.14889565116269e-8; … ; -3.99162292914288e-7 -4.0068780681382137e-7 … -4.868513278313579e-9 -1.0554907241210377e-9; 3.2425485179330015e-9 -1.3397548744018696e-8 … -1.2453537875051252e-8 -7.101215239834078e-10]]), "σ" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; -20.774883225037556 64.20427370814541 … 0.39268225776618976 0.0; … ; -34.43072374448014 49.37164651842729 … 0.20437485401577687 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 15.448343923370068 … -0.8563049794436479 0.0; … ; 0.0 11.674252856426508 … -0.21367267024761671 0.0; 0.0 0.0 … 0.0 0.0], [-0.01672693360910305 -11.697335292670983 … 0.3621328796040452 0.05230995117634194; -8.304858179989502 -20.26555892051307 … -0.04834987492629409 -0.13998281055244496; … ; 6.538682162597264 15.942525380821147 … -0.1000283447582372 0.051512471495273604; 0.11820568211438247 9.299550514111411 … -0.08600967385721917 0.011308539580292475]])), 35 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("ucur" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0]]), "σ" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0]])), 425 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("ucur" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[1.2618957644333439e-41 -2.1789103563520635e-41 … -1.599198931457727e-11 4.242564324381961e-12; -3.033792759266795e-41 -2.531531326796787e-40 … -4.499992123062731e-11 -6.046799818403274e-12; … ; -2.1176225449516668e-41 7.00252587531371e-41 … 6.992517433648728e-11 -8.132528033524561e-12; -6.156512773584452e-43 -9.172362711518397e-42 … -1.595972189853684e-11 -2.7439168777887495e-12], [2.6958938747171938e-42 -4.3594975157159536e-42 … -1.8399890994880467e-12 -4.534667617637196e-12; -2.911786210866002e-41 -2.02967023592234e-40 … 2.4327512783183874e-11 1.7711945347997308e-11; … ; 1.3820746393237556e-41 -6.099006814966144e-41 … 9.673095769330884e-12 -1.2919940870522069e-11; 1.8685288629147793e-43 2.3676401143417837e-42 … -4.391824630830647e-12 -2.605372307318608e-12]]), "σ" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 2.948016937127903e-32 -3.545622826078363e-31 … -0.22741094287673405 0.0; … ; 1.2918576539984195e-32 -4.9218959312295155e-33 … -0.20838811038234678 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 -4.022392381556805e-31 … -0.11849239132102303 0.0; … ; 0.0 -8.402317578183893e-33 … -0.11828256626462724 0.0; 0.0 0.0 … 0.0 0.0], [1.421096310187701e-32 -1.3513402085543368e-31 … 0.044123384361036515 0.012058482824671242; -2.4805409452849273e-31 1.0855603424900676e-31 … 0.039520016381873434 0.13214589886260383; … ; -6.2828905466672174e-34 2.471475826072877e-31 … -0.13213834906415373 -0.09641153462369445; -7.820470900023024e-33 -3.585487535864982e-34 … 0.007350313446793139 0.04593192601216868]])), 1175 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("ucur" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[4.3299622637818015e-8 3.161153112169476e-8 … 8.736762290444013e-7 3.5943380501463146e-7; 2.150227128484252e-8 -2.0877359559039764e-9 … 1.088872711354322e-6 5.271211220675476e-7; … ; 1.8267915766924267e-7 1.4932985312257125e-7 … -7.921036542138432e-7 -3.7323005842214207e-7; 6.383590796288494e-8 4.7643773192275556e-8 … -6.393088353524695e-7 -2.522070327613068e-7], [1.8385116909972963e-9 4.9731881303581775e-9 … -7.5404897564563e-7 -3.678385403325374e-7; -1.560809617782934e-7 -1.6075996284576334e-7 … -1.5720734177398502e-6 -9.636207512694591e-7; … ; -1.7295379149227052e-7 -1.6662580166962038e-7 … -1.1809456927212e-6 -7.094376561464744e-7; -3.775607129074163e-9 -7.758463321447815e-9 … -5.504310270824598e-7 -2.587700316003303e-7]]), "σ" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 7.452330075529204 5.893668450090402 … 152.37983379198286 0.0; … ; 13.762244300128167 -11.843615235326041 … 143.07619258342882 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 -5.786825854904819 … 253.46614302421392 0.0; … ; 0.0 6.539845513238875 … 230.15674116825284 0.0; 0.0 0.0 … 0.0 0.0], [-0.394811752058154 -0.7995269274721081 … -309.9912022130334 -250.68009965718136; -0.4697461048734117 -1.8453657637875673 … -380.60052245814995 -276.24687312143584; … ; -0.20733857891943522 -1.4286963291872423 … 346.45710301598075 243.96699957146262; -0.0737085861911303 -0.40162311689496955 … 275.2421861951523 215.40040233309185]])), 60 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("ucur" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0]]), "σ" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0]])), 220 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("ucur" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[-5.1563670045928e-146 6.434636036709402e-145 … -1.615475607994857e-95 2.825427418720284e-97; 9.727059978661041e-145 -7.599676529654829e-144 … 2.2164768836670188e-94 -5.282839746578713e-96; … ; -8.759229175048228e-146 1.0431865860882876e-144 … -3.175192286334917e-95 4.737858940493887e-97; 1.9842069234147318e-147 -5.561269165450192e-146 … 1.5002601581965148e-96 6.164616261935044e-99], [-1.2295532369597725e-146 1.8172732049281458e-145 … 3.804434890334208e-96 -3.372984772884915e-97; 8.498048328113674e-145 -8.314055344167308e-144 … -1.2106271756688198e-94 1.4001963387144137e-95; … ; 7.35353242874858e-146 -1.1010742489520027e-144 … -1.709987192747201e-95 1.2216793251201145e-96; -4.466152505917796e-148 1.584964554426035e-146 … 3.7134441253390743e-97 2.3704873169172076e-99]]), "σ" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; -1.296294896226582e-136 4.8527786323341105e-135 … -1.597121563993249e-85 0.0; … ; 7.991402684847015e-138 2.410273563311826e-136 … -4.294568727258651e-87 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 5.696854610459216e-135 … -1.0974440510893703e-85 0.0; … ; 0.0 2.7141722263035596e-136 … -1.8096097254783526e-87 0.0; 0.0 0.0 … 0.0 0.0], [-8.198852783487561e-137 2.2612384085801944e-135 … 4.869119836453245e-86 -2.323525833032462e-87; 2.9628934158223e-135 -3.872030897324841e-134 … -7.92153361823103e-85 7.694885016437234e-86; … ; -1.5333089857397538e-136 3.7838411628230665e-135 … 8.81928636160848e-86 -2.10436216397073e-87; -6.522858745197539e-138 -1.1276554078739228e-136 … -1.5988810187126224e-87 -8.136893561723725e-88]])), 1595 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("ucur" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[-1.861593733222914e-7 -1.6397409021111665e-7 … -7.727300876917438e-8 1.9456070296766213e-9; -1.818566688700469e-7 -1.6215726601596956e-7 … -1.469886440219574e-7 -2.4488249487432942e-8; … ; 2.425118554569558e-7 2.2625104092495131e-7 … 1.3337609692028856e-7 3.013687741275232e-8; 1.98734621123553e-7 1.817743005303318e-7 … 7.610193110613583e-8 7.309424090919254e-9], [-1.0580433632794805e-8 -2.9914662111368506e-8 … -2.831506075030888e-8 -3.901285187203313e-9; -2.9891164169260327e-7 -3.04169659880751e-7 … -2.130512847094959e-7 -1.0163572582009965e-7; … ; -2.960780448422451e-7 -3.0051981954814496e-7 … -1.2211907269011965e-7 -5.287313006334299e-8; -1.1535209780611708e-8 -2.627114011275543e-8 … -1.794425700577547e-9 6.126783235630462e-9]]), "σ" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; -7.076878424718198 -8.231883276191514 … 18.744575799557623 0.0; … ; 6.81576998824605 -5.403557627231001 … 12.846670624871884 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 -11.733510880583838 … -18.33154060102689 0.0; … ; 0.0 -9.326298300264057 … -9.741206610683978 0.0; 0.0 0.0 … 0.0 0.0], [-4.944765744563869 -13.501665890564592 … -24.490284865598536 -4.8603984294122204; -5.171188683813178 -14.539780869795255 … -36.39829473857149 -2.9228878312945685; … ; 3.5682099984504405 10.538446042176773 … 26.620980856725666 2.669748719713005; 3.696652309624951 10.100243397468438 … 18.897829540852797 4.179601586186847]])), 1855 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("ucur" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[6.433789533209678e-8 5.665351516898451e-8 … -8.312279067307448e-9 7.848267579967688e-9; 5.3128355651146693e-8 4.569600803981013e-8 … -2.6039494442829157e-8 -7.294042760697524e-9; … ; 1.1533083507535094e-8 7.23149479821019e-9 … 1.3497300694988197e-8 1.8290732099308097e-8; 7.87108259739608e-8 7.178200985340902e-8 … 1.2395732932860325e-8 6.570721099685551e-9], [3.3970813495063196e-9 8.9631785273661e-9 … -3.74133393418737e-8 -9.504096547531186e-9; 1.283733099043532e-7 1.285206499342872e-7 … -8.604884096872417e-8 -4.7601302184171314e-8; … ; -1.0895422326496846e-7 -1.095118877403973e-7 … 1.198349041936077e-8 1.1088004989317295e-8; -2.1453965659250646e-9 -7.928850422122057e-9 … -4.091740090357603e-9 5.741740649243065e-9]]), "σ" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 2.797653361796149 0.8303865907913284 … -0.6689477712131819 0.0; … ; -12.81356830951701 0.5608863315181349 … 1.9870793435159997 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 0.7301607189284193 … -1.5839478626457808 0.0; … ; 0.0 -0.9617324979707429 … -0.4847340153281642 0.0; 0.0 0.0 … 0.0 0.0], [0.5433178934569305 1.789876007585081 … -1.3522092740726763 0.06081150723662948; 0.37097722240208736 1.4660194703037426 … -2.2349900402977125 0.8433597159851757; … ; 0.6826271266024748 1.9221851873310223 … -0.9865214548867152 0.8999012337072758; 0.5222613160194438 1.8478485483912621 … -1.0640617226178959 0.05964280793829009]])), 1010 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("ucur" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[2.2700880209577435e-7 2.488643876151487e-7 … 9.885080074694227e-9 6.52770943857668e-9; 2.7159327381140724e-7 3.0035066936026906e-7 … 2.8027489389721804e-9 7.155974585091324e-9; … ; -2.8099112767243763e-7 -3.1090777471921477e-7 … -2.0698175380860137e-8 -2.30055994694168e-8; -3.432582655417483e-7 -3.661302307643079e-7 … -2.6833537891856245e-8 -1.573193281654154e-8], [-1.0070996532368555e-8 -2.534481532082533e-8 … -2.4247849945571056e-9 -6.3524801946424385e-9; 1.3532820916985424e-7 1.2452600160626512e-7 … -5.066247846063864e-9 -7.2483071939394976e-9; … ; 2.319086502023213e-7 2.2320939389670412e-7 … -2.4333113901326925e-8 -2.578293324911324e-8; -1.228446151752501e-8 -2.803603062029169e-8 … -1.486329297378889e-8 -1.5430365909125462e-8]]), "σ" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 0.21869422933934768 1.1588284802258455 … -0.6740410561404399 0.0; … ; -14.980858387484016 -32.757317378311214 … -1.0692219327755967 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 -18.162811115122995 … 0.06799731653461372 0.0; … ; 0.0 -26.93844556842634 … -0.38055933733928754 0.0; 0.0 0.0 … 0.0 0.0], [-7.596849584579457 -22.804164108770838 … 0.3143796740535536 0.3830078630625883; -6.306109650806694 -24.693519701007574 … 0.8191462301559981 0.6141694535397008; … ; 13.851775737798832 38.668122196075615 … -0.9625955928981582 -0.879884361264518; 11.870227087848152 32.38257215015158 … -0.5634639624893595 -0.5198773209693975]])), 1900 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("ucur" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[3.4569967967056726e-8 4.917550591595085e-8 … 1.640564591756642e-9 3.323752984175877e-9; 7.583385868151705e-9 2.151859066330698e-8 … -2.5590673269005503e-9 -1.171643421365509e-8; … ; -3.1150602697029386e-8 -1.513298658732249e-8 … 2.0165694610160364e-8 1.1360208089132725e-8; 5.505845269331825e-8 6.983929955014313e-8 … 1.2760682330315517e-8 1.0128978747498288e-9], [-6.683489032666155e-9 -1.7371576042910274e-8 … -3.054837988816804e-8 -4.889116470269557e-9; 6.731388385024114e-8 6.794425572842102e-8 … -3.2792838777400595e-8 -1.881417644050977e-8; … ; -4.4262304240014826e-8 -4.466290041914684e-8 … -2.7003585159598002e-8 -1.1889640310494581e-8; 8.344829881417624e-9 1.846525374699777e-8 … -1.1530852321303678e-8 1.6508082358396457e-10]]), "σ" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 3.335673069674191 -3.019291270630477 … -0.7545281269889981 0.0; … ; -15.518601187943723 3.9072970282122914 … 1.2170454277239253 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 0.0 -0.4260144665156399 … 0.5429696104657231 0.0; … ; 0.0 1.0875419719733288 … -0.6826472470763923 0.0; 0.0 0.0 … 0.0 0.0], [-0.9391938957417632 -3.786521412427802 … 1.5893652074143103 0.31404744194138395; -0.6759969526221298 -2.8043284372924737 … 1.8797545935808906 -0.007830490650440367; … ; -0.6155245546838901 -3.0944405178631618 … 2.6403013851241512 0.3269738071209157; -1.227137971394428 -4.479435455211525 … 1.971904776523547 0.5629491709132769]]))…)