Examples

Acoustic wave simulation example

using SeismicWaves

# numerics
nt = 1500
dt = 0.0012
dh = 10.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
snapshots = swforward!(
    params,
    matprop,
    shots;
    parall=:threads,
    snapevery=snapevery
)
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.002193899524685647 … -1.398088597228772e-61 0.0; … ; 0.0 -2.1075874495368978e-191 … 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 1.1652674618045766e-6 … -0.00014453195426934094 0.0; … ; 0.0 4.600782444524448e-6 … -7.47745406326924e-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 -2.9310641449125023e-7 … -0.00012751070741672535 0.0; … ; 0.0 0.0001502966769329916 … 2.7472413659093447e-5 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.00011598049888152348 … 0.00010494302759196615 0.0; … ; 0.0 -3.5155319253037627e-6 … -0.014226637695607074 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.6759608274176626e-5 … -3.3271669563970603e-19 0.0; … ; 0.0 -4.6711879855369723e-113 … -1.1216320564018685e-191 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.871107879944631e-7 … -8.26222993782916e-5 0.0; … ; 0.0 6.2817730750166726e-6 … -0.00010782300020486228 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.0008373859863191066 … -6.351631846089568e-5 0.0; … ; 0.0 0.0015133334605201857 … 0.001120370981062364 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 -4.276713272729032e-6 … -0.018371280027628587 0.0; … ; 0.0 -1.8663420303565812e-38 … -4.2240389011676556e-41 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 -1.5526988817080737e-5 … -0.00012226551309894515 0.0; … ; 0.0 6.545070585823875e-5 … 0.0002518951297092615 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.959308825227323e-7 … -4.34082061801397e-5 0.0; … ; 0.0 4.477062413757257e-6 … -0.00012015398945424402 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.2482699952209538e-12 … -5.9716800153007954e-96 0.0; … ; 0.0 -5.57609430609449e-128 … 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 1.9012894204701101e-6 … -0.00012580437552435828 0.0; … ; 0.0 6.085234889483313e-6 … -9.912396823955527e-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.9615421898505653e-6 … -0.00012077917605160429 0.0; … ; 0.0 -0.00011007461815833503 … -4.340404433793517e-5 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 -4.2227894037616514e-6 … 0.00023531344896616317 0.0; … ; 0.0 -0.005537766474649183 … -0.012481937482539302 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.0010671099818711743 … -5.596527696901441e-32 0.0; … ; 0.0 -2.669652685601897e-71 … -6.295401683971776e-131 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 1.3106587463456297e-6 … -8.765545716367935e-5 0.0; … ; 0.0 4.957164433511546e-6 … -0.0001553010696034165 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.0016545569806215331 … 2.2789308190777072e-6 0.0; … ; 0.0 -2.1724281219761466e-6 … 0.00040402017777040956 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 7.3972836353663455e-6 … 0.05284686089744551 0.0; … ; 0.0 -5.129343945930899e-17 … -6.8160789274707e-21 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 -5.371249072590872e-5 … -9.516753993307174e-5 0.0; … ; 0.0 -0.0001801133379941538 … 0.0001018971998236247 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.282707153029527e-7 … -5.167025412374863e-5 0.0; … ; 0.0 2.8199147145461458e-6 … -0.00010079916909906623 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 -8.07139295553276e-39 … 0.0 0.0; … ; 0.0 -9.026347419424701e-79 … 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 3.0144601140602516e-6 … -0.00011325007393596392 0.0; … ; 0.0 4.802395224710069e-6 … -0.0001093588283092514 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 3.8478266399607035e-6 … -0.00010852230982639971 0.0; … ; 0.0 4.309031536061695e-6 … -8.476526020404868e-5 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 -7.554126559055499e-6 … 0.0004011751882935478 0.0; … ; 0.0 4.1087681634619135e-6 … 0.0006399088048307744 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.533354228218573e-14 … -1.549728538708232e-54 0.0; … ; 0.0 -1.7325942391085473e-38 … -4.2969916825221156e-88 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 2.4944711729734607e-6 … -9.958281193931709e-5 0.0; … ; 0.0 3.573568645453433e-6 … -0.00020737951992443347 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.0002791663004548368 … 9.112131271563785e-5 0.0; … ; 0.0 7.205686009627562e-5 … 0.00022240501198210035 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.00021010568756184595 … -0.008271664309393629 0.0; … ; 0.0 -6.898778773008455e-5 … -2.2176854799852352e-8 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 8.336943389455812e-5 … -5.579267805574905e-5 0.0; … ; 0.0 0.00063468313176526 … 7.284055674504862e-6 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.993187048085013e-7 … -6.265960841895332e-5 0.0; … ; 0.0 1.7542813267645572e-6 … -8.051405797745688e-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 -9.026347419424699e-79 … 0.0 0.0; … ; 0.0 -8.071392955532769e-39 … 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.802395224503609e-6 … -0.00010935882831059251 0.0; … ; 0.0 3.0144601142307767e-6 … -0.000113250073935587 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.309031536134863e-6 … -8.47652602055696e-5 0.0; … ; 0.0 3.847826640504327e-6 … -0.00010852230982602034 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 4.108768165011028e-6 … 0.0006399088048301827 0.0; … ; 0.0 -7.554126559028039e-6 … 0.0004011751882938213 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.7325942391085465e-38 … -4.2969916825221145e-88 0.0; … ; 0.0 -3.5333542282185775e-14 … -1.5497285387082319e-54 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.5735686453797935e-6 … -0.00020737951992550488 0.0; … ; 0.0 2.494471173001862e-6 … -9.958281193900523e-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 7.205686009705016e-5 … 0.00022240501198096037 0.0; … ; 0.0 0.000279166300455132 … 9.112131271598588e-5 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 -6.898778773008468e-5 … -2.2176854799852365e-8 0.0; … ; 0.0 0.00021010568756204455 … -0.00827166430939364 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.0006346831317652264 … 7.284055672999136e-6 0.0; … ; 0.0 8.336943389503269e-5 … -5.579267805539785e-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 1.7542813267264185e-6 … -8.051405797823782e-5 0.0; … ; 0.0 6.993187047870868e-7 … -6.265960841878842e-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.57609430609449e-128 … 0.0 0.0; … ; 0.0 -1.248269995220954e-12 … -5.9716800153007954e-96 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 6.085234889368469e-6 … -9.91239682411693e-5 0.0; … ; 0.0 1.9012894202974844e-6 … -0.0001258043755233422 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.00011007461815829378 … -4.340404433930781e-5 0.0; … ; 0.0 1.9615421898551804e-6 … -0.00012077917605059644 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.00553776647464912 … -0.012481937482539295 0.0; … ; 0.0 -4.222789401664437e-6 … 0.00023531344896598813 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.669652685601897e-71 … -6.295401683971777e-131 0.0; … ; 0.0 -0.00106710998187117 … -5.596527696901441e-32 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 4.957164433612361e-6 … -0.00015530106960489864 0.0; … ; 0.0 1.3106587463057093e-6 … -8.765545716280399e-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.172428121533032e-6 … 0.0004040201777698395 0.0; … ; 0.0 -0.0016545569806213016 … 2.2789308191556342e-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 -5.1293439459309005e-17 … -6.816078927470705e-21 0.0; … ; 0.0 7.397283636844903e-6 … 0.05284686089744525 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.0001801133379938921 … 0.0001018971998225286 0.0; … ; 0.0 -5.37124907254236e-5 … -9.516753993246737e-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 2.8199147145664026e-6 … -0.00010079916910025693 0.0; … ; 0.0 9.282707152721209e-7 … -5.1670254123053545e-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 -2.107587449536899e-191 … 0.0 0.0; … ; 0.0 0.0021938995246855867 … -1.3980885972287721e-61 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.600782444399799e-6 … -7.477454063152127e-5 0.0; … ; 0.0 1.1652674618722941e-6 … -0.00014453195426668015 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.00015029667693304094 … 2.7472413660121386e-5 0.0; … ; 0.0 -2.9310641433621975e-7 … -0.0001275107074136168 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 -3.51553192530377e-6 … -0.014226637695607057 0.0; … ; 0.0 0.00011598049887999916 … 0.0001049430275949334 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.6711879855369723e-113 … -1.1216320564018684e-191 0.0; … ; 0.0 2.6759608273657845e-5 … -3.3271669563970603e-19 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 6.281773074878878e-6 … -0.00010782300020344315 0.0; … ; 0.0 8.871107879722277e-7 … -8.26222993760046e-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.0015133334605201027 … 0.0011203709810630284 0.0; … ; 0.0 0.0008373859863204843 … -6.351631845738482e-5 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.8663420303565817e-38 … -4.2240389011676597e-41 0.0; … ; 0.0 -4.2767132734083455e-6 … -0.018371280027627827 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 6.545070585765055e-5 … 0.0002518951297102391 0.0; … ; 0.0 -1.552698881716959e-5 … -0.0001222655130955264 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 4.477062413926399e-6 … -0.00012015398945250004 0.0; … ; 0.0 5.959308824721064e-7 … -4.340820617810656e-5 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
snapshots = swforward!(
    params,
    matprop,
    shots;
    parall=:threads,
    infoevery=infoevery,
    snapevery=snapevery
)
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}}}}("v" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.00010718605170692501 0.00011598251756037721 … 4.2198834039873085e-6 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 2.141800815382067e-5 1.747279894604888e-5 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0]])), 35 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("v" => 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]])), 425 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("v" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 8.288588951488053e-76 1.7845864899724936e-74 … 4.240330277604166e-36 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; -5.512517219359145e-75 4.329138545551217e-74 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0]])), 1175 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("v" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; -2.0910381742037108e-5 -3.9779174158041734e-5 … -3.1102586365345256e-6 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; -8.319586904967339e-6 -1.0999863461306676e-5 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0]])), 60 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("v" => 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]])), 220 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("v" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 8.205408107382562e-183 3.27646531683123e-182 … -1.220987405920707e-138 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; -4.703451587761994e-182 -4.284159771476196e-182 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0]])), 1595 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("v" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; -5.689073000078231e-5 -0.00010324110982239247 … 6.116044900473738e-6 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; -0.0001029279102370323 -0.0001162722073231625 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0]])), 1855 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("v" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 3.3813562496881037e-6 5.667810187863465e-6 … 4.650279818709951e-7 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 2.440601945007054e-5 2.3960499664171493e-5 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0]])), 1010 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("v" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; -7.271536677180032e-7 -2.607265599280159e-5 … -6.46281716728813e-6 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 8.532986954775658e-5 6.419132040994506e-5 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0]])), 1900 => Dict{String, Union{SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}, SeismicWaves.ScalarVariableField{Float64, 2, Matrix{Float64}}}}("v" => SeismicWaves.MultiVariableField{Float64, 2, Matrix{Float64}}([[0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 1.1257837353789423e-5 1.7409383012405614e-5 … 5.127183451154971e-6 0.0; 0.0 0.0 … 0.0 0.0], [0.0 0.0 … 0.0 0.0; 2.2805830791421453e-5 2.301326598193159e-5 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0]]))…)