Linear Operators
JUDI is building on JOLI.jl to implement matrix-free linear operators. These operators represent the discretized wave-equations and sensitivit (Jacobian) for different acquisition schemes.
judiModeling
Seismic modeling operator for solving a wave equation for a given right-hand-side.
JUDI.judiModeling
— TypejudiModeling(model; options=Options())
judiModeling(model, src_geometry, rec_geometry; options=Options())
Create seismic modeling operator for a velocity model given as a Model
structure. The function also takes the source and receiver geometries as additional input arguments, which creates a combined operator judiProjection*judiModeling*judiProjection'
.
Example
Pr
and Ps
are projection operatos of type judiProjection
and q
is a data vector of type judiVector
: F = judiModeling(model) dobs = PrFPs'q F = judiModeling(model, q.geometry, rec_geometry) dobs = Fq
Construction:
- Construct a modeling operator without source/receiver projections:
F = judiModeling(model; options=opt)
- Construct a modeling operator with source/receiver projections:
F = judiModeling(model, src_geometry, rec_geometry)
- Construct a modeling operator from an existing operator without geometries and projection operators:
F = Pr*F*Ps'
where Ps
and Pr
are source/receiver projection operators of type judiProjection
.
- Construct a modeling operator for extended source modeling:
F = Pr*F*Pw'
where Pw
is a judiLRWF
(low-rank-wavefield) projection operator.
Accessible fields:
# Model structure
F.model
# Source injection (if available) and geometry
F.qInjection
F.qInjection.geometry
# Receiver interpolation (if available) and geometry
F.rInterpolation
F.rInterpolation.geometry
# Options structure
F.options
Usage:
# Forward modeling (F w/ geometries)
d_obs = F*q
# Adjoint modeling (F w/ geometries)
q_ad = F'*d_obs
# Forward modeling (F w/o geometries)
d_obs = Pr*F*Ps'*q
# Adjoint modelng (F w/o geometries)
q_ad = Ps*F'*Pr'*d_obs
# Extended source modeling (F w/o geometries)
d_obs = Pr*F*Pw'*w
# Adjoint extended source modeling (F w/o geometries)
w_ad = Pw*F'*Pr'*d_obs
# Forward modeling and return full wavefield (F w/o geometries)
u = F*Ps'*q
# Adjoint modelnig and return wavefield (F w/o geometries)
v = F'*Pr'*d_obs
# Forward modeling with full wavefield as source (F w/o geometries)
d_obs = Pr*F*u
# Adjoint modeling with full wavefield as source (F w/o geometries)
q_ad = Ps*F*v
judiJacobian
Jacobian of a non-linear forward modeling operator. Corresponds to linearized Born modeling (forward mode) and reverse-time migration (adjoint mode).
JUDI.judiJacobian
— TypejudiJacobian(F,q)
Create a linearized modeling operator from the non-linear modeling operator F
and the source q
. q
can be either a judiVector (point source Jacobian) or a judiWeight
for extended source modeling. F
is a full modeling operator including source/receiver projections.
Examples
F
is a modeling operator without source/receiver projections: J = judiJacobian(PrFPs',q)F
is the combined operatorPr*F*Ps'
: J = judiJacobian(F,q)
Construction:
- A
judiJacobian
operator can be create from an exisiting forward modeling operator and a source vector:
J = judiJacobian(F, q) # F w/ geometries
J = judiJacobian(Pr*F*Ps', q) # F w/o geometries
where Ps
and Pr
are source/receiver projection operators of type judiProjection
.
- A Jacobian can also be created for an extended source modeling operator:
J = judiJacobian(Pr*F*Pw', w)
where Pw
is a judiLRWF
operator and w
is a judiWeights
vector (or 2D/3D Julia array).
Accessible fields::
# Model structure
J.model
# Underlying propagator
J.F
# Source injection (if available) and geometry throughpropagator
J.F.qInjection
J.F.qInjection.geometry
# Receiver interpolation (if available) and geometry through propagator
J.F.rInterpolation
J.F.rInterpolation.geometry
# Source term, can be a judiWeights, judiWavefield, or a judiVector
J.q
# Options structure
J.options
Usage:
# Linearized modeilng
d_lin = J*dm
# RTM
rtm = J'*d_lin
# Matrix-free normal operator
H = J'*J
judiProjection
Abstract linear operator for source/receiver projections. A (transposed) judiProjection
operator symbolically injects the data with which it is multiplied during modeling. If multiplied with a forward modeling operator, it samples the wavefield at the specified source/receiver locations.
JUDI.judiProjection
— TypejudiProjection(geometry)
Projection operator for sources/receivers to restrict or inject data at specified locations.
Examples
F
is a modeling operator of type judiModeling
and q
is a seismic source of type judiVector
: Pr = judiProjection(rec_geometry) Ps = judiProjection(q.geometry) dobs = PrFPs'q qad = PsF'Pr'dobs
Accessible fields:
# Source/receiver geometry
P.geometry
Usage:
# Multiply with judiVector to create a judiRHS
rhs1 = Pr'*d_obs
rhs2 = Ps'*q
# Sample wavefield at source/receiver location during modeling
d_obs = Pr*F*Ps'*q
q_ad = Ps*F*Pr'*d_obs
judiLRWF
Abstract linear operator for sampling a seismic wavefield as a sum over all time steps, weighted by a time-varying wavelet. Its transpose injects a time-varying wavelet at every grid point in the model.
JUDI.judiWavelet
— TypejudiWavelet(dt, wavelet)
Low-rank wavefield operator which injects a wavelet q at every point of the subsurface.
Examples
F
is a modeling operator of type judiModeling
and w
is a weighting matrix of type judiWeights
: Pr = judiProjection(recgeometry) Pw = judiWavelet(recgeometry.dt, q.data) # or judiLRWF(rec_geometry.dt, q.data) dobs = PrFPw'w dw = PwF'Pr'dobs
Accessible fields:
# Wavelet of i-th source location
P.wavelet[i]
Usage:
# Multiply with a judiWeight vector to create a judiExtendedSource
ex_src = Pw'*w
# Sample wavefield as a sum over time, weighted by the source
u_ex = Pw*F'*Pr'*d_obs