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.optionsUsage:
# 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*vjudiJacobian
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
Fis a modeling operator without source/receiver projections: J = judiJacobian(PrFPs',q)Fis the combined operatorPr*F*Ps': J = judiJacobian(F,q)
Construction:
- A
judiJacobianoperator can be create from an exisiting forward modeling operator and a source vector:
J = judiJacobian(F, q) # F w/ geometriesJ = judiJacobian(Pr*F*Ps', q) # F w/o geometrieswhere 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.optionsUsage:
# Linearized modeilng
d_lin = J*dm
# RTM
rtm = J'*d_lin
# Matrix-free normal operator
H = J'*JjudiProjection
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.geometryUsage:
# 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_obsjudiLRWF
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