Migration with surface-related multiples: examples and results

Examples included in the software.

Author: Ning Tu (tning@eos.ubc.ca) Date: Dec/16/2015

Contents

The salt dome examples

In this part, we demonstrate the following points using the salt dome examples:

These are the background model and model perturbation:

vel_bg = ['../data/vel_bg_saltdome_mini_slowness2.mat'];
vel_true = ['../data/vel_true_saltdome_mini_slowness2.mat'];
options_file = ['../results/saltdome/precooked/L1Inv_totaldata_2ss15Freq_SourceFreqRenewal_305iter_preview.mat'];
load(vel_bg,'vel_bg')
load(vel_true,'vel_true')
load(options_file,'options')
figure
plot_utils.show_model(vel_bg,options)
title('Background model')
colormap jet
plot_utils.set_my_figure(gca,12)
figure
plot_utils.show_model(1./vel_true.^2-1./vel_bg.^2,options)
title('Model perturbation')
plot_utils.set_my_figure(gca,12)
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...

This one shows what you will get if multiples are not correctly handled. In this case, they are simply ignored (pretending there are only primary events, which is not true). We can see the phantom reflectors imaged from them. This shows why you should avoid this scenario and also why conventionally practitioners remove multiples before imaging.

phantom_ref_image = ['../results/saltdome/precooked/RTM_IgnoreMul_FullAcq.mat'];
load(phantom_ref_image,'dm_RTM')
dm_RTM = diff(dm_RTM);
dm_RTM = [dm_RTM(1,:);dm_RTM];
figure
plot_utils.show_model(dm_RTM,options)
caxis([-1 1]*1e10)
title('To avoid: RTM of total data. Multiples are IGNORED')
plot_utils.set_my_figure(gca,12)
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...

This one shows the non-causal artifacts, by doing cross-correlation migration of the total data by recognizing the total downgoing wavefield as the source. This shows why you should avoid a cross-correlation approach and resort to an inversion approach. Refer to [3] and [4] for more details.

RTM_totaldata_image = ['../results/saltdome/precooked/RTM_totaldata_FullAcq.mat'];
load(RTM_totaldata_image,'dm_RTM')
dm_RTM = diff(dm_RTM);
dm_RTM = [dm_RTM(1,:);dm_RTM];
figure
plot_utils.show_model(dm_RTM,options)
caxis([-1 1]*1e10)
title('To avoid: RTM of totaldata. Total downgoing wavefield is used as source.')
plot_utils.set_my_figure(gca,12)
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...

Inversion with sparsity promotion using all sources. The result is clean but the computation is prohibitively expensive.

L1inv_totaldata = ['../results/saltdome/precooked/L1Inv_totaldata_FullAcq_NoRenewal_60iter_preview.mat'];
load(L1inv_totaldata,'dm')
figure
plot_utils.show_model(dm,options)
caxis([-0.2 0.2])
title('L1 migration of total data without subsampling')
plot_utils.set_my_figure(gca,12)
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...

Inversion with sparsity promotion using 10 simultaneous sources and all frequencies. Compared with the above result, a 15X speed up is achieved. Crosstalks from simultaneous sources, shown in the RTM image, are suppressed in the inverted image.

Totaldata_smallbatch = ['../results/saltdome/precooked/L1Inv_totaldata_2ss15Freq_SourceFreqRenewal_305iter_preview.mat'];
load(Totaldata_smallbatch,'dm_RTM')
dm_RTM = diff(dm_RTM);
dm_RTM = [dm_RTM(1,:);dm_RTM];
figure
plot_utils.show_model(dm_RTM,options)
plot_utils.set_my_figure(gca,12)
caxis([-1 1]*1e10)
title('Migration with 10 simultaneous sources. Notice the crosstalk noise from simultaneous sources.')
load(Totaldata_smallbatch,'dm')
figure
plot_utils.show_model(dm,options)
plot_utils.set_my_figure(gca,12)
caxis([-0.2 0.2])
title('Fast L1 migration of total data with 10 simultansource sources.')
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...

Inversion with sparsity promotion using 2 simultaneous sources, 15 frequencies, and 305 iterations. This combination leads to a number of PDE solves that is the same as a single reverse time migration with full data. However, this subsampling ratio leads to significant artifacts in the image. We propose to remove these artifacts by drawing new subsets of sources and freqs for each subproblem.

L1inv_totaldata_minibatch_norenew = ['../results/saltdome/precooked/L1Inv_totaldata_2ss15Freq_NoRenewal_305iter_preview.mat'];
load(L1inv_totaldata_minibatch_norenew,'dm')
figure
plot_utils.show_model(dm,options)
plot_utils.set_my_figure(gca,12)
caxis([-0.2 0.2])
title('Fast L1 migration of total data with subsampling without rerandomization')

L1inv_totaldata_minibatch = ['../results/saltdome/precooked/L1Inv_totaldata_2ss15Freq_SourceFreqRenewal_305iter_preview.mat'];
load(L1inv_totaldata_minibatch,'dm')
figure
plot_utils.show_model(dm,options)
plot_utils.set_my_figure(gca,12)
caxis([-0.2 0.2])
title('Fast L1 migration of total data with subsampling and rerandomization')
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...

We show that the l1 sparsity constraint is necessary, by comparing with the image obtained using l2 constraint

L2Pinv_totaldata_minibatch = ['../results/saltdome/precooked/L2PInv_totaldata_2ss15Freq_SourceFreqRenewal_305iter_preview.mat'];
load(L2Pinv_totaldata_minibatch,'dm')
figure
plot_utils.show_model(dm,options)
plot_utils.set_my_figure(gca,12)
caxis([-0.2 0.2])
title('Image obtained using the l2-norm constraint.')
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...

Examples using the sedimentary part of the Sigsbee 2B model

data modelling using iWave w/ free-surface boundary condition data inversion using our in-house frequency-domain modelling

options.color_model = 'gray';
options.dx = 7.62;
options.dz = 7.62;

The true and background models.

vel = ['../data/sigsbee_nosalt_model.mat'];
load(vel,'vel_bg')
load(vel,'vel_true')
figure
plot_utils.show_model(vel_true,options)
title('True model')
colormap jet
plot_utils.set_my_figure(gca,12)
figure
plot_utils.show_model(vel_bg,options)
title('Background model')
colormap jet
plot_utils.set_my_figure(gca,12)
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...

Again RTM with multiples leads to spurious artifacts

RTM_totaldata_SGB = ['../results/sigsbee/precooked/RTMTotalFD_iwave_TrueQ.mat'];
load(RTM_totaldata_SGB,'dm_RTM')
figure
plot_utils.show_model(dm_RTM,options)
caxis([-1 1]*1e4)
title('RTM of fully sampled total data')
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...

Inversion with multiples leads to a clean image. Computational cost again roughly rivals one RTM w/ all the data. Ignoring the presence of multiples leads again to spurious artifacts.

L1inv_totaldata_SGB = ['../results/sigsbee/precooked/MigTotalFD_iwave_26ss31freq_bg_TrueQ_GaussianEnc_denoised.mat'];
load(L1inv_totaldata_SGB,'dm')
figure
plot_utils.show_model(dm,options)
caxis([-0.1 0.1])
title('Fast migration with multiples')

L1inv_totaldata_IgnMul_SGB = ['../results/sigsbee/precooked/MigTotalFD_iwave_26ss31freq_bg_TrueQ_GaussianEnc_IgnoreMul_denoised.mat'];
load(L1inv_totaldata_IgnMul_SGB,'dm')
figure
plot_utils.show_model(dm,options)
caxis([-0.1 0.1])
title('Fast migration with multiples: ignoring multiples')
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...

When exact knowledge of the source wavelet is not known, we can either estimate the source wavelet or, if a good primary/multiple separation can be achieved, image multiple-only data.

L1inv_totaldata_EQ_SGB = ['../results/sigsbee/precooked/MigTotalFD_iwave_26ss31freq_EstQ_GausEnc_denoised.mat'];
load(L1inv_totaldata_EQ_SGB,'dm')
figure
plot_utils.show_model(dm,options)
caxis([-0.1 0.1]*0.025)
title('Fast migration with multiples, with source estimation')

L1inv_mul_SGB = ['../results/sigsbee/precooked/MigTotalFD_Mul_iwave_26ss31freq_bg_GaussianEncoding_denoised.mat'];
load(L1inv_mul_SGB,'dm')
figure
plot_utils.show_model(dm,options)
caxis([-0.1 0.1])
title('Fast migration of multiples only')
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...

When the velocity model is wrong, how does the proposed method behave? We find that sparsity promotion in the curvelet domain improves the robustness of the method to velocity errors. The following results show the comparison with and without curvelet-domain sparsity promotion, with and without the velocity errors.

L1inv_totaldata_SGB = ['../results/sigsbee/precooked/MigTotalFD_iwave_26ss31freq_bg_TrueQ_GaussianEnc_denoised.mat'];
load(L1inv_totaldata_SGB,'dm')
figure
plot_utils.show_model(dm,options)
caxis([-0.1 0.1])
title('Image of data with multiples: with curvelet sparsity, no velocity error')

L1inv_totaldata_KWM_SGB = ['../results/sigsbee/precooked/KWModelUnder2X_MigTotalFD_iwave_26ss31freq_bg_TrueQ_GaussianEnc_denoised.mat'];
load(L1inv_totaldata_KWM_SGB,'dm')
figure
plot_utils.show_model(dm,options)
caxis([-0.1 0.1])
title('Image of data with multiples: with curvelet sparsity, with velocity error')

RBK_totaldata_SGB = ['../results/sigsbee/precooked/MigTotalFD_iwave_26ss31freq_bg_TrueQ_GaussianEnc_RBK_NoCurv_denoised.mat'];
load(RBK_totaldata_SGB,'dm')
figure
plot_utils.show_model(dm,options)
caxis([-0.1 0.1])
title('Image of data with multiples: no curvelet sparsity, no velocity error')

RBK_totaldata_KWM_SGB = ['../results/sigsbee/precooked/KWModelUnder2X_MigTotalFD_iwave_26ss31freq_bg_TrueQ_GaussianEnc_RBK_NoCurv_denoised.mat'];
load(RBK_totaldata_KWM_SGB,'dm')
figure
plot_utils.show_model(dm,options)
caxis([-0.1 0.1])
title('Image of data with multiples: no curvelet sparsity, with velocity error')
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...
Showing model...You need to make sure that the model is of correct dimension.
Showing a velocity or density model...
Showing model...You need to make sure that the model is of correct dimension.
Model data contain complex numbers. Only real part is shown
Showing a velocity or density model...
Showing model...You need to make sure that the model is of correct dimension.
Model data contain complex numbers. Only real part is shown
Showing a velocity or density model...