(4) |
This objective function measures the quality of a CMP gather stack by using semblance as a quality measure. Semblance is a nonlinear function of the input parameters, the interval slowness . In algorithmic terms we can write:
for each zero-offset time
{
calculate stacking slowness wi (a)
calcluate moveout curve (b)
calculate semblance (c)
}
add up all semblance values
A subroutine (Appendix A) can be written that combines all these three steps. In order to see how we can use automatic differentiation, let's look at a subroutine for step (a):
subroutine rmsv(nt,slowint,rms,dt) #ONSTRUCT D(RMS)/D(SLOWINT) IN JACOB(NT,NT) integer nt real slowint(nt) real dt real rms(nt) integer itreal sum,tau real jacob
do it=1,nt { sum = 0. do j=1,it { sum = sum + dt/(slowint(j)*slowint(j)) } tau = it*dt rms(it) = sqrt ( tau / sum )
}
# return stacking velocities rms
return end
This subroutine calculates the RMS slowness from a given interval slowness model. The second line in the routine is a keyword construct that tells the preprocessor that we want to calculate the Jacobian of the rms-slowness model (dependent variable) with respect to the interval slowness model (independent variable). The velocity model is a taken for only one CMP gather and constant velocity, just to illustrate the process of automatic differentiation. The preprocessor produces a subroutine in Fortran77 that simultaneously evaluates the RMS velocity function and calculates the Jacobian. Figure shows the interval slowness model and the associated Jacobian for the RMS velocity model. The calculation is accurate to machine precision. We see that the Jacobian has values only below the diagonal, because an RMS slowness value at does not depend on interval slowness values below the point . As we can see, the automatic differentiation works well on that piece of the algorithm. The calculation for step (b) proceeds successfully.