Full Waveform Inversion (FWI) approach based on Topology Optimization (TO) for the salt reconstruction problem.
- The wave propagation problem in the frequency domain is solved using a Finite Element (FE) model.
- Squared slowness model is split into two parts: background and salt structure.
- The Solid Isotropic Material with Penalization (SIMP) model is used to interpolate the squared slowness.
- A Helmholtz-type filter is used to smooth both control variables and gradient.
- A Heaviside projection is used to ease the identification of sharp interfaces with strong velocity contrast.
- Gradient calculation with respect to the control variables is aided by the dolfin-adjoint package.
- Control variables are updated using an L-BFGS-B algorithm.
This code is based on Python 3, relies on the installation in a Linux environment, and requires the installation of the following packages:
To run the example from the terminal:
python3 example.py
The "input_data
" class defines the problem to be solved:
class input_data:
"""Parameters to configure the FWI algorithm"""
def __init__(self):
# General Configuration ------------------------------------------------- #
self.tofwi = True # True = TO-based FWI
# False = Traditional FWI
self.example = 'b' # Synthetic true model ('a','b','c' or 'd')
self.true_salt_vel = 4.5 # Salt velocity for the true model (km/s)
self.inverse_crime = True # True = data from constant density model
# False = data from variable density model
self.r_s = 0.5 # Filter radius for gradient smoothing (km)
self.n_processes = 1 # Number of processes (int)
# Initial Model --------------------------------------------------------- #
self.initial_slope = 0.8333 # Slope for the background velocity
# (Exact slope is 0.8333)
self.estimated_salt_vel = 4.5 # Salt velocity estimate (km/s)
# TO-based FWI Configuration -------------------------------------------- #
# (These variables have no influence on the inversion if the traditional
# FWI approach was chosen).
self.update_background = False # True = reconstruct background velocity
# False = fixed background velocity
self.r_a = 0.1 # Filter radius for variable smoothing (km)
self.q = 3 # Penalty exponent for the interpolation
self.projection = True # True = Heaviside projection active
# False = Heaviside projection disabled
# ----------------------------------------------------------------------- #
Importing the main module and the "input_data
" class:
import TopOptFWI
from input_data import input_data
Preprocessing step (create Mesh, Spaces, Absorbing layer, etc):
prep = TopOptFWI.PreProcessing(TopOptFWI.model_data(),input_data())
prep.initialize_model()
Solving the Forward Problem (to generate the observed data):
obs_data = TopOptFWI.ForwardProblem(prep)
Initializing Optimization Variables:
ai,bi,mi,opts,bds = TopOptFWI.InitializeOpt(prep)
Solving the Inverse Problem:
ai,bi,mi,outer_iter = TopOptFWI.Inversion(prep,obs_data,ai,bi,mi,opts,bds)
Saving Solutions and Evaluating Errors:
TopOptFWI.PlotVelocity([ai,bi,mi],prep,outer_iter)
TopOptFWI.EvalErrors([ai,bi,mi],prep,obs_data)
True Model:
Synthetic model taken from Kadu et al. 2016 with a background velocity varying linearly with depth and salt bodies with constant velocity of 4.5 km/s. There are 21 sources with 15 Hz Ricker signature placed on top of the model and 101 receivers at 50 m depth. Frequency band between 2.5 and 3.5 Hz with a spacing of 0.125 Hz.
Initial Model:
The initial model is a velocity model with the exact linear background.
Reconstructed Model:
Solution considering the TO-based FWI with fixed background.
Synthetic models taken from Kadu et al. 2016 with a background velocity varying linearly with depth and salt bodies with constant velocity of 4.5 km/s. A different true model can be used by changing the instance variable "example
" in the "input_data
" class.
If our work is useful for your research, please consider citing:
@article{gonccalves2023salt,
title={Salt reconstruction in full-waveform inversion using topology optimization techniques},
author={Gon{\c{c}}alves, JF and Silva, ECN},
journal={Geophysical Journal International},
volume={234},
number={2},
pages={1484--1504},
year={2023},
publisher={Oxford University Press},
doi={10.1093/gji/ggad150},
url={https://doi.org/10.1093/gji/ggad150},
}
@article{gonccalves2020identification,
title={Identification problem of acoustic media in the frequency domain based on the topology optimization method},
author={Gon{\c{c}}alves, Juliano F and Moreira, Joao BD and Salas, Ruben A and Ghorbani, Mohammad M and Rubio, Wilfredo M and Silva, Em{\'\i}lio CN},
journal={Structural and Multidisciplinary Optimization},
volume={62},
number={3},
pages={1041--1059},
year={2020},
publisher={Springer},
doi={10.1007/s00158-020-02638-9},
url={https://doi.org/10.1007/s00158-020-02638-9},
}
If you have any questions, please feel free to message the authors: Juliano F. Gonçalves (julianofg@usp.br) or Emílio C.N. Silva (ecnsilva@usp.br).