![]() |
The binning of the seismic data in Figure 6
is not really satisfactory when we have available
the techniques of missing data estimation
to fill the empty bins.
Using the ideas of subroutine mis1() ,
we can extend the seismic data into the empty part of the plane.
We use the same principle that we minimize the energy in
the filtered map where the map must match the data where it is known.
I chose the filter
to be the Laplacian operator (actually, its negative)
to obtain the result in Figure 7.
![]() |
Figure 7 also involves a boundary condition calculation. Many differential equations have a solution that becomes infinite at infinite distance, and in practice this means that the largest solutions may often be found on the boundaries of the plot, exactly where there is the least information. To obtain a more pleasing result, I placed artificial ``average'' data along the outer boundary. Each boundary point was given the value of an average of the interior data values. The average was weighted, each weight being an inverse power of the separation distance of the boundary point from the interior point.
Parenthetically, we notice that all the unknown interior points could be guessed by the same method we used on the outer boundary. After some experience guessing what inverse power would be best for the weighting functions, I do not recommend this method. Like gravity, the forces of interpolation from the weighted sums are not blocked by intervening objects. But the temperature in a house is not a function of temperature in its neighbor's house. To further isolate the more remote points, I chose weights to be the inverse fourth power of distance.
After the gaps are filled in the seismic information ,we are prepared to find another map
that matches the wells
exactly
and tries to match the seismic information elsewhere.
Now we must beware that the seismic information is likely
to be inconsistent with the wells.
We presume that the two should fit at high spatial frequencies
but mismatch where there are wells.
Think of a map of a model space
of infinitely many hypothetical wells that must match the real wells,
where we have real wells.
Otherwise, we seek the minimum residual
which is the filtered difference between the seismic data
and the map
of hypothetical omnipresent wells.
Thus we seek to fit
![]() |
(14) |
![]() |
(15) |
![]() |
(16) |
![]() |
(17) |
Initialize so that
where(known) y0=(w-s),
in other words,
![]() |
(18) |
We have already coded a 2-D gradient operator
igrad2 .
Let us combine it with its adjoint to get the 2-D laplacian operator.
(You might notice that the laplacian operator is ``self-adjoint'' meaning
that the operator does the same calculation that its adjoint does.
Any operator of the form
is self-adjoint because
. )
module laplac2 { # Laplacian operator in 2-D
logical, parameter, private :: T = .true., F = .false.
use igrad2
real, dimension (m1*m2*2), allocatable :: tmp
#%_init (m1, m2)
integer m1, m2
call igrad2_init (m1, m2)
#%_lop (x, y)
integer stat1, stat2
if( adj) {
stat1 = igrad2_lop ( F, F, y, tmp) # tmp = grad y
stat2 = igrad2_lop ( T, T, x, tmp) # x = x + grad' tmp
} else {
stat1 = igrad2_lop ( F, F, x, tmp) # tmp = grad x
stat2 = igrad2_lop ( T, T, y, tmp) # y = y + grad' tmp
}
}
Subroutine lapfill2()
is the same idea as mis1()
except that
the filter
has been specialized to the
laplacian
implemented by module laplac2
.
Subroutine lapfill2() solves two problems: (1) extending the seismic data to fill space, and (2) fitting the map approximately to the seismic data while exactly to the wells.
call solver ( laplac2_lop, cgstep, yy, zero, niter,
x0 = yy, known = mfixed)
call laplac2_close () # garbage collection
call cgstep_close () # garbage collection
}
}
module lapfill { # fill empty 2-D bins by minimum output of Laplacian operator
use laplac2
use cgstep_mod
use solver_mod
contains
subroutine lapfill2( niter, m1, m2, yy, mfixed) {
integer, intent (in) :: niter # iterations
integer, intent (in) :: m1,m2 # data size
logical, dimension (m1*m2), intent (in) :: mfixed # mask for known
real, dimension (m1*m2), intent (in out) :: yy # model
real, dimension (m1*m2) :: zero # laplacian output
call laplac2_init ( m1,m2); zero = 0. # initialize
The final map is shown in Figure 8.
![]() |
Results can be computed with various filters.
I tried both and
.There are disadvantages of each,
being too cautious and
perhaps being too aggressive.
Figure 9 shows the difference between
the extended seismic data and the extended wells.
Notice that for
the difference shows
a localized ``tent pole'' disturbance about each well.
For
there could be large overshoot between wells,
especially if two nearby wells have significantly different values.
I don't see that problem here.
![]() |
To understand the behavior theoretically,
recall that in one dimension
the filter interpolates with straight lines
and
interpolates with cubics.
This is because the fitting goal
,leads to
or
, whereas the fitting goal
leads to
which is satisfied by cubics.
In two dimensions, minimizing the output of
gives us solutions of Laplace's equation with sources at the known data.
It is as if
stretches a rubber sheet over poles at each well,
whereas
bends a stiff plate.
Just because gives smoother maps than
does not mean those maps are closer to reality.
This is a deeper topic, addressed in later chapters.
It is the same issue we noticed when comparing
figures
-
.