previous up next print clean
Next: The wave operator Up: MODELING STRUCTURE Previous: Acceleration calculation

Convolution operator

# conv1dc
# convolution 1 dimensional circular boundary condition
# u and w are conjugate to each other
# axis: axis over which to convolve
# stagger:  0 normal conv   
#           1 shift by one grid point
#%
subroutine conv1dc(conj,u,t,k,w,sidx,  axis, scale,bnd)
implicit none
#include "commons"
integer            conj,  t,k,  sidx 
integer                                axis
real		  	 	             scale
WFIELD(u)
WFIELDLAY(u)
TENSOR(w)
TENSORLAY(w)
BOUND(bnd)
BOUNDLAY(bnd)
integer ishift

if (conj==0) { # the gradient do ishift = nlo-stagger, nhi-stagger { w(sidx,:,:,:) = w(sidx,:,:,:) + coef(ishift+stagger)*cshift(u(t,k,:,:,:),dim=axis,shift=ishift) * scale } } else{ do ishift = nlo-stagger, nhi-stagger { # the divergence u(t,k,:,:,:) = u(t,k,:,:,:) + coef(ishift+stagger)*cshift(w(sidx,:,:,:),dim=axis,shift=ishift) * scale } } return end

The finite difference operator is implemented as a 8 point convolution. The boundary conditions are circular, but a two line change will allow absorbing one-way boundary conditions. Even a spatially changing convolution operator (variable grid spacing) is mere one line change.


previous up next print clean
Next: The wave operator Up: MODELING STRUCTURE Previous: Acceleration calculation
Stanford Exploration Project
11/17/1997