Sparsity promoting LSRTM with linearized Bregman

Example script for running least-squares RTM with sparsity promotion and source subsampling on the Marmousi model.

Author: Philipp Witte Date: February 2016

Contents

Set paths to result,data,model etc.

clear all; clc;
rng('default')

% Load software release functions
% SLIM_APPS.tools.algorithms.TimeModeling
addpath(genpath('~/SLIM-release-apps'));

% paths  and name of results and snapshots
snapshotX = 'UpdateTest_X.mat';
snapshotZ = 'UpdateTest_Z.mat';
result = 'Result.mat';
params = 'Parameters.mat';

% pull data and model
% if ~exist('../data/modelMarmousi.mat','file')
% 	cd ../data/; ! scons; cd ../examples/;
% end

% Marmousi slowness^2 model [s^2/km^2]
load modelMarmousi.mat

% Load 2D data cube [ns x nrec x nsrc]
% load ../data/linDataMarmousi.mat

Modeling parameters

Set up a structure that contains information about the velocity model and the source/receiver geometry of the input data.

% model parameters
model.o = [0, 0, 0];  % Origin [m]
model.n = [320, 800, 1];  % no. of grid points [z,x,y]
model.d = [10, 10, 10];   % grid spacing [m]
model.freesurface = 0;

% data parameters
model.f0   = 0.030; % peak frequency [MHz]
model.T= 4000;  % Recording length [ms]
model.NyqT=0:4:model.T; % Shot record time axis [ms]

% source/receiver position [m]
model.xsrc = 25:25:(n(2)*d(2));
model.zsrc = 10*ones(size(model.xsrc));
model.ysrc =  0*ones(size(model.xsrc));
model.xrec = 5:10:n(2)*d(2)-5;
model.zrec = 210;
model.yrec = 0;

% Code specific options
model.save = 'RAM'; % save wavefields in memory
model.type='full'; % acquisition geometry
model.space_order=4; % Order of Laplacian

% Domain decomposition
model.ddcompx = 1;
model.ddcompz = 1;
model.ddcompy = 1;

LSRTM parameters

Define the number of iterations for the linearized Bregman method, as well as the L2 norm of the noise , the thresholding value and the number of sources per iteration. Furthermore, set up a structure that defines which preconditioners are used. All preconditioners are disabled as default and can be enabled by setting them to '1'.

% LSRTM options
options.iterations = 40;
options.lambda = [];
options.sigma = 0;
options.numShots = 8;   % No. of shots per Bregman iteration
options.snapshotX = snapshotX;
options.snapshotZ = snapshotZ;

% Preconditioners
precon.modelDepth = 1;
precon.modelTopmute = 1;
precon.dataScaling = 1;
precon.dataTopmute = 1;

Setup grid and modeling options

% Calculate optimal grid size and time step
[m,model,dmTrue]=Setup_CFL(m,model,dm);

% Source wavelet
q=sp_RickerWavelet(model.f0,1/model.f0,model.dt,model.T);
CFL conditions gives dt = 0.57736ms and d = 5  5  5 m 
Velocity interpolated on new grid

Call algorithm and save results

Runtime per iteration (one demigration and one migration) for this example was ~20 minutes.

% [dm,info] = linbregLSRTM(dData,model,m0,q,precon,options);
% save(result,'dm','info');
% save(params,'model');

Plot results

load Result.mat
load Parameters.mat

x = linspace(0,7.995,model.n(2));
z = linspace(0,3.195,model.n(1));

% true image
figure('Position',[400,400,1200,400]);
imagesc(x,z,reshape(-dmTrue,model.n));
xlabel('Lateral Position [km]'); ylabel('Depth [km]');
colormap gray; caxis([-1 1]*8e-2);  colorbar
title('True dm');

% lsrtm image
figure('Position',[400,400,1200,400]);
imagesc(x,z,dm);
xlabel('Lateral Position [km]'); ylabel('Depth [km]');
colormap gray; caxis([-1 1]*8e-2);  colorbar
title('Inverted dm');

figure('Position',[400,400,800,400]);
plot(info.residual)
xlabel('Iteration number'); ylabel('Relative residual');
axis([1 40 0 18]);