subroutine intrp3(f,g,dx,dy,dz,nx,ny,nz,n)
c$$$  subprogram documentation block
c                .      .    .                                       .
c subprogram:    intrp3      linear interpolation in 3 dimensions.
c   prgmmr: parrish          org: w/nmc22    date: 90-10-11
c
c abstract: linear interpolate in 3 dims (2nd dim always periodic).
c
c program history log:
c   90-10-11  parrish
c
c   input argument list:
c     f        - input interpolator
c     dx,dy,dz - input x,y,z-coords of interpolation points (grid units)
c     nx,ny,nz - x,y,z-dimensions of interpolator grid
c     n        - number of interpolatees
c
c   output argument list:
c     g        - output interpolatees
c
c attributes:
c   language: cft77
c   machine:  cray ymp
c
c$$$
c--------
      dimension f(nx+1,ny+2,nz),g(n),dx(n),dy(n),dz(n)
c--------
      do 100 i=1,n
        ix=dx(i)
        iy=dy(i)
        iz=dz(i)
        ix=max(1,min(ix,nx))
        iz=max(1,min(iz,nz))
        ixp=ix+1
        izp=iz+1
        ixp=min(ixp,nx)
        izp=min(izp,nz)
        delx=dx(i)-ix
        dely=dy(i)-iy
        delz=dz(i)-iz
        if(iy.lt.1) iy=iy+ny
        if(iy.gt.ny) iy=iy-ny
        iyp=iy+1
        if(iyp.gt.ny) iyp=iyp-ny
        delx=max(0.,min(delx,1.))
        delz=max(0.,min(delz,1.))
        g(i)=f(ix,iy,iz)*(1.-delx)*(1.-dely)*(1.-delz)
     *      +f(ixp,iy,iz)*delx*(1.-dely)*(1.-delz)
     *      +f(ix,iyp,iz)*(1.-delx)*dely*(1.-delz)
     *      +f(ixp,iyp,iz)*delx*dely*(1.-delz)
     *      +f(ix,iy,izp)*(1.-delx)*(1.-dely)*delz
     *      +f(ixp,iy,izp)*delx*(1.-dely)*delz
     *      +f(ix,iyp,izp)*(1.-delx)*dely*delz
     *      +f(ixp,iyp,izp)*delx*dely*delz
100   continue
      return
      end