!
!--------------------------------------------------------------------------
!
SUBROUTINE updbc( mptr,samlvl,tmwght ) 1,10
!
!  Provide boundary values (conditons) for grid MPTR by
!  interpolating from course grid or from overlapping fine grids
!  at the same level depending on the value of samlvl..
!
!  MPTR is the grid needing boundary values by interpolation
!  samlvl is a logical, if true  - interp from same level
!                              (i.e., from overlapping grid)
!                       false - interp from next level
!  TMWGHT is the weight for the interpolated value, with
!
!  phi(t)=TMWGHT*phi(interp)+(1-TMWGHT)*phi(t-dt(receive))   (1)
!
!  where phi(interp) is the interpolated value from source grid
!  at t+dt(source).
!
!  This routine resets phi(t-dt(receive)) at the boundaries so that
!  formula (1) is satisfied, then linear extrapolation of phi
!  from its value at t and t-dt(receive) will set phi(t+n*dt(receive))
!  equal to the interpolated value, where n=dt(source)/dt(receive)..
!
  INCLUDE 'nodal.inc'
  INCLUDE 'agrigrid.inc'
  INCLUDE 'agrialloc.inc'
  INCLUDE 'grddsc.inc'
  INCLUDE 'agricpu.inc'
  INCLUDE 'agricst.inc'
  DIMENSION msrcs(30),ibcvar(nxy2d+nxyz3d),ibcsta(nxy2d+nxyz3d)
  LOGICAL :: samlvl,smstg2
!
! here we assume the number of source grids never exceeds 30
!
  IF( intrpodr == 2 ) THEN
    nwhts=9
  ELSE
    nwhts=4
  END IF
  level = node(4,mptr)
  IF(level > lfine.OR.level == 0) RETURN
  cpu0 = f_cputime
()
!
! Get the possible source grids for the b.c.'s of grid mptr.
!
  numscs=0
  lchk = level
  IF(.NOT.samlvl) lchk = lchk-1
!
!   do 20 lchk=max(1,level-1),level
!
  mgrid=lstart(lchk)
  15      IF(mgrid == 0) GO TO 20
  numscs=numscs+1
  msrcs(numscs)=mgrid
  mgrid=node(10,mgrid)
  GO TO 15
  20    CONTINUE
  5     CONTINUE
  nx=node(5,mptr)
  ny=node(6,mptr)
!
! --------------------------------------------------------------------
! calculate b.c.'s for 2-d scalars
! --------------------------------------------------------------------
!
  ndim=2
!
! initialize b.c. calculating status with value 1 for each scalar
!
  DO i=1,nxy2d
    ibcsta(i)=1
  END DO
  100   CONTINUE
!
! search for variables that need b.c.'s and group them according to
! their staggering
!
  nbcvar=0
  DO ibc=1,nxy2d
!
! look for 1st 2-d scalar that needs b.c. calculation
!
    IF(ibdxy(1,ibc) == 1.AND.ibcsta(ibc) == 1.AND. ibdxy(2,ibc) == 0)THEN
      nbcvar=nbcvar+1
      ibcvar(nbcvar)=ibc
      ibcsta(ibc)=0
      DO ivar=ibc+1,nxy2d
!
! list additonal variables with matching staggering to that of ibc.
!
        IF(ibdxy(1,ivar) == 1.AND.ibcsta(ivar) == 1.AND.                &
              ibdxy(2,ivar) == 0.AND.smstg2(ivar,ibc,2))THEN
          nbcvar=nbcvar+1
          ibcvar(nbcvar)=ivar
          ibcsta(ivar)=0
        END IF
      END DO
    END IF
  END DO
!
! if the b.c.'s for all 2-d scalars are calculated goto next step
!
  IF(nbcvar == 0)GO TO 200
!
! perform interpolations for 2-d scalar variables listed in ibcvar(nbcvar).
!
  mxpts=2*(nx+ny)
  iptr1=igetsp(2*mxpts)
  iptr2=igetsp(2*mxpts)
  iptr3=igetsp(2*mxpts)
  iptr4=igetsp(  mxpts)
  iptr5=igetsp(nwhts*mxpts)
  iptr6=igetsp(2*mxpts)
  iptr7=igetsp(2*mxpts)
!
  CALL itpbsl
(mptr,msrcs,numscs,a(iptr1),a(iptr2),a(iptr3),             &
       a(iptr4),a(iptr5),a(iptr6),a(iptr7),                             &
       mxpts,nwhts,ibcvar,nbcvar,ndim,samlvl,tmwght)
!
!  restore tem space
  CALL resett
!
! go back to check if any more variable needs b.c. calculation
!
  GO TO 100
  200   CONTINUE
!
! --------------------------------------------------------------------
! calculate b.c.'s for 3-d scalars
! --------------------------------------------------------------------
!
  ndim=3
!
! initialize b.c. calculating status with value 1 for each vari.
!
  DO i=1,nxyz3d
    ibcsta(i)=1
  END DO
!
! search for variables that need b.c.'s and group them according to
! their staggering
!
  300   CONTINUE
  nbcvar=0
  DO ibc=1,nxyz3d
!
! look for 1st 3-d scalar that needs b.c. calculation
!
    IF(ibdxyz(1,ibc) == 1.AND.ibcsta(ibc) == 1.AND. ibdxyz(2,ibc) == 0)THEN
      nbcvar=nbcvar+1
      ibcvar(nbcvar)=ibc
      ibcsta(ibc)=0
      DO ivar=ibc+1,nxyz3d
!
! list additonal variables with matching staggering to that of ibc.
!
        IF(ibdxyz(1,ivar) == 1.AND.ibcsta(ivar) == 1.AND.               &
              ibdxyz(2,ivar) == 0.AND.smstg2(ivar,ibc,3))THEN
          nbcvar=nbcvar+1
          ibcvar(nbcvar)=ivar
          ibcsta(ivar)=0
        END IF
      END DO
    END IF
  END DO
!
! if the b.c.'s for all 3-d scalars are calculated goto next step
!
  IF(nbcvar == 0) GO TO 400
!
! perform interpolations for 3-d scalars listed in ibcvar(nbcvar).
!
  mxpts=2*(nx+ny)
  iptr1=igetsp(2*mxpts)
  iptr2=igetsp(2*mxpts)
  iptr3=igetsp(2*mxpts)
  iptr4=igetsp(  mxpts)
  iptr5=igetsp(nwhts*mxpts)
  iptr6=igetsp(2*mxpts)
  iptr7=igetsp(2*mxpts)
!
  CALL itpbsl
(mptr,msrcs,numscs,a(iptr1),a(iptr2),a(iptr3),             &
       a(iptr4),a(iptr5),a(iptr6),a(iptr7),                             &
       mxpts,nwhts,ibcvar,nbcvar,ndim,samlvl,tmwght)
!
!  restore tem space
!
  CALL resett
!
! go back to check if any more 3-d scalars needs b.c. calculation
!
  GO TO 300
  400   CONTINUE
!
!-------------------------------------------------------------------
! calculate b.c.'s for 2-d vectors
! --------------------------------------------------------------------
!
  ndim=2
!
! initialize b.c. calculating status with value 1 for each vari.
!
  DO i=1,nxy2d
    ibcsta(i)=1
  END DO
  500   CONTINUE
!
! search for 2-d vectors that need b.c.'s
!
  nbcvar=0
  DO ibc=1,nxy2d
!
! look for 1st 2-d vector that needs b.c. calculation
!
    IF(ibdxy(1,ibc) == 1.AND.ibdxy(2,ibc) > 0.AND. ibcsta(ibc) == 1) THEN
      ibc2=ibdxy(2,ibc)
      ibcvar(nbcvar+1)=ibc
      ibcvar(nbcvar+2)=ibc2
      nbcvar=nbcvar+2
      ibcsta(ibc )=0
      ibcsta(ibc2)=0
      EXIT
    END IF
  END DO
  67    CONTINUE
!
! if the b.c.'s for all 2-d vectors are calculated goto next step
!
  IF(nbcvar == 0)GO TO 600
!
! perform interpolations for 2-d vectors listed in ibcvar(nbcvar).
!
  mxpts=2*(nx+ny)
  iptr1=igetsp(4*mxpts)
  iptr2=igetsp(4*mxpts)
  iptr3=igetsp(4*mxpts)
  iptr4=igetsp(2*mxpts)
  iptr5=igetsp(2*nwhts*mxpts)
  iptr6=igetsp(4*mxpts)
  iptr7=igetsp(4*mxpts)
!
  CALL itpbvt
(mptr,msrcs,numscs,a(iptr1),a(iptr2),a(iptr3),             &
       a(iptr4),a(iptr5),a(iptr6),a(iptr7),                             &
       mxpts,nwhts,ibcvar,nbcvar,ndim,samlvl,tmwght)
!
!  restore tem space
!
  CALL resett
!
! go back to check if any more 2-d vector needs b.c. calculation
!
  GO TO 500
  600   CONTINUE
!
!------------------------------------------------------------------
! calculate b.c.'s for 3-d vectors
!------------------------------------------------------------------
!
  ndim=3
!
! initialize b.c. calculating status with value 1 for each vari.
!
  DO i=1,nxyz3d
    ibcsta(i)=1
  END DO
!
  700   CONTINUE
!
! search for variables that need b.c.'s and group them according to
! their staggering
!
  nbcvar=0
  DO ibc=1,nxyz3d
!
! look for 1st 3-d vector that needs b.c. calculation
!
    IF(ibdxyz(1,ibc) == 1.AND.ibdxyz(2,ibc) > 0.AND. ibcsta(ibc) == 1) THEN
      ibc2=ibdxyz(2,ibc)
      ibcvar(nbcvar+1)=ibc
      ibcvar(nbcvar+2)=ibc2
      nbcvar=nbcvar+2
      ibcsta(ibc )=0
      ibcsta(ibc2)=0
      EXIT
    END IF
  END DO
  92    CONTINUE
!
! if the b.c.'s for all 3-d vectors are calculated goto next step
!
  IF(nbcvar == 0)GO TO 800
!
! perform interpolations for 3-d vectors listed in ibcvar(nbcvar).
!
  mxpts=2*(nx+ny)
  iptr1=igetsp(4*mxpts)
  iptr2=igetsp(4*mxpts)
  iptr3=igetsp(4*mxpts)
  iptr4=igetsp(2*mxpts)
  iptr5=igetsp(2*nwhts*mxpts)
  iptr6=igetsp(4*mxpts)
  iptr7=igetsp(4*mxpts)
!
  IF( verbose6 ) WRITE(6,'('' ITPBVT CALLED FOR 3-D VECTORS'')')
!
  CALL itpbvt
(mptr,msrcs,numscs,a(iptr1),a(iptr2),a(iptr3),             &
       a(iptr4),a(iptr5),a(iptr6),a(iptr7),                             &
       mxpts,nwhts,ibcvar,nbcvar,ndim,samlvl,tmwght)
!
  IF( verbose6 ) THEN
    DO ib=1,nbcvar,2
      WRITE(6,'(2i5)') ibcvar(ib),ibcvar(ib+1)
    END DO
  END IF
!
!  restore tem space
!
  CALL resett
!
! go back to check if any more 3-d vector needs b.c. calculation
!
  GO TO 700
  800   CONTINUE
  cpu_bndcint = cpu_bndcint + f_cputime
() - cpu0
  RETURN
END SUBROUTINE updbc
!
!--------------------------------------------------------------------------
!
SUBROUTINE itpbsl(mrec,msrcs,numscs,ptsrec,                             & 2,10
           irec,isrc,igsrc,whts,pts,irecp,mxpts,nwhts,                  &
           ibcvar,nbcvar,ndim,samlvl,tmwght)
!
  DIMENSION msrcs(numscs),ptsrec(2,mxpts),irec(2,mxpts),                &
            isrc(2,mxpts),igsrc(mxpts),whts(nwhts,mxpts),               &
            pts(2,mxpts),irecp(2,mxpts),                                &
            ibcvar(nbcvar)
  INCLUDE 'nodal.inc'
  INCLUDE 'agrigrid.inc'
  INCLUDE 'agrialloc.inc'
  INCLUDE 'grddsc.inc'
  LOGICAL :: samlvl
  nw1=nint( SQRT(FLOAT(nwhts)) )
  nw2=nw1
!
! Calculate and store the coor's of p-points of the receive
! grid in array ptsrec with their indecies stored in irec.
!
  IF(nbcvar == 0) RETURN
  CALL chkdim
(ndim,'ITPBSL')
  nx=node(5,mrec)
  ny=node(6,mrec)
  cosr=rnode(21,mrec)
  sinr=rnode(22,mrec)
  dxr=rnode(9 ,mrec)
  dyr=rnode(10,mrec)
  xor=rnode(1,mrec)
  yor=rnode(2,mrec)
  ivar=ibcvar(1)
  IF(ndim == 2) THEN
    xshift=stgxy(1,ivar)
    yshift=stgxy(2,ivar)
    nx1=nx-idmxy(1,ivar)
    ny1=ny-idmxy(2,ivar)
  ELSE
    xshift=stgxyz(1,ivar)
    yshift=stgxyz(2,ivar)
    nx1=nx-idmxyz(1,ivar)
    ny1=ny-idmxyz(2,ivar)
  END IF
  xc=xshift*dxr*cosr
  ys=yshift*dyr*sinr
  xs=xshift*dxr*sinr
  yc=yshift*dyr*cosr
  xorp=xor+xc-ys
  yorp=yor+xs+yc
!
! To calculate the absolute coordinates of the model boundary points
!
! Attention:
!
! Here we assume that in x direction the boundaries are at i=1 and nx1.
! and at j=1 and ny1 in y direction.
! If in a particular solver (model), the boundaries for certain
! variables are defined at points other the above, the use needs to
! change the following loop accordingly (i.e. change ist, jst, iend
! and jend). As a result, the part in routine UPDSCL that calculates
! the points for interior points updating also need change.
!
  ist=1
  jst=1
  iend=nx1
  jend=ny1
  DO j=jst,jend,jend-jst
    jj=(j-jst)/(jend-jst)*(iend-ist+1)
    DO i=ist,iend
      ii=jj+i-ist+1
      x=(i-1)*dxr
      y=(j-1)*dyr
      ptsrec(1,ii) = xorp+x*cosr-y*sinr
      ptsrec(2,ii) = yorp+x*sinr+y*cosr
      irec  (1,ii) = i
      irec  (2,ii) = j
    END DO
  END DO
  numpts=MAX(0, 2*(iend-ist+1))
  DO i=ist,iend,iend-ist
    ii=(i-ist)/(iend-ist)*(jend-jst-1)
    DO j=jst+1,jend-1
      jj=ii+j-jst+numpts
      x=(i-1)*dxr
      y=(j-1)*dyr
      ptsrec(1,jj) = xorp+x*cosr-y*sinr
      ptsrec(2,jj) = yorp+x*sinr+y*cosr
      irec  (1,jj) = i
      irec  (2,jj) = j
    END DO
  END DO
  numpts=numpts+MAX(0,2*(jend-jst-1))
  npts0=numpts
!
! Find the source points for receive grid points ptsrec
!
  IF(samlvl) THEN
    ierfl=0
    iptcmp=1
  ELSE
    ierfl=1
    iptcmp=1
  END IF
  CALL getsrc
(mrec,msrcs,numscs,xshift,yshift,ptsrec,numpts,            &
       irec,igsrc,ierfl,iptcmp)
!
! if no point can draw boudary value from listed source grids, skip through
!
  IF(.NOT.samlvl) THEN
    IF(numpts /= npts0) THEN
      WRITE(6,'(i4,'' BOUNDARY POINTS DID NOT FIND SOURCE FOR B.C.S''   &
      &   )') npts0-numpts
      WRITE(6,'(''IT WAS FOR '',I1,''-D SCALAR NO. '',I4)')ndim,ivar
      WRITE(6,'(''JOB STOPPED IN ITPBSL.'')')
      STOP
    END IF
  END IF
!
! Loop through all source grids
!
  DO ks=1,numscs
    msrc=msrcs(ks)
!
! sort rec. grid points according to their source grid
!
    npts=0
    DO np=1,numpts
      IF(igsrc(np) == msrc) THEN
        npts=npts+1
        pts(1,npts)=ptsrec(1,np)
        pts(2,npts)=ptsrec(2,np)
        irecp(1,npts)=irec(1,np)
        irecp(2,npts)=irec(2,np)
      END IF
    END DO
    IF(npts == 0) CYCLE
    nxr=node(5,mrec)
    nyr=node(6,mrec)
    nzr=node(14,mrec)
    nxs=node(5,msrc)
    nys=node(6,msrc)
    nzs=node(14,msrc)
!
! Calculate weights of interpolation for points pts.
!
    CALL calwht
(mrec,msrc,pts,isrc,whts,npts,nwhts,ivar,ndim)
!
! Interpolate for the boundary values for variables in list ibcvar
!
    DO i=1,nbcvar
      ivar=ibcvar(i)
      IF(ndim == 2) THEN
        n3rd=1
        irptr=igtnxy(mrec,ivar,1)
        istmdt=igtnxy(mrec,ibdxy(3,ivar),1)
        isptr=igtnxy(msrc,ivar,1)
      ELSE
        n3rd=nzs
        irptr=igtxyz(mrec,ivar,1)
        istmdt=igtxyz(mrec,ibdxyz(3,ivar),1)
        isptr=igtxyz(msrc,ivar,1)
      END IF
      CALL intpst1
(          nxr,nyr,nxs,nys,n3rd,                                         &
          irecp,isrc,whts,npts,nw1,nw2)
      IF(ndim == 2) THEN
        CALL retnxy
(mrec,ivar,1,irptr,.true.)
        CALL retnxy
(mrec,ibdxy(3,ivar),1,istmdt,.false.)
        CALL retnxy
(msrc,ivar,1,isptr,.false.)
      ELSE
        CALL retxyz
(mrec,ivar,1,irptr,.false.)
        CALL retxyz
(mrec,ibdxyz(3,ivar),1,istmdt,.true.)
!      call retxyz(mrec,ivar,1,irptr,.true.)
!      call retxyz(mrec,ibdxyz(3,ivar),1,istmdt,.false.)
        CALL retxyz
(msrc,ivar,1,isptr,.false.)
      END IF
    END DO
!
  END DO
  500   CONTINUE
  RETURN
END SUBROUTINE itpbsl
!
!--------------------------------------------------------------------------
!
SUBROUTINE itpbvt(mrec,msrcs,numscs,ptsrec,                             & 2,15
           irec,isrc,igsrc,whts,pts,irecp,mxpts,nwhts,                  &
           ibcvar,nbcvar,ndim,samlvl,tmwght)
!
  DIMENSION msrcs(numscs),ptsrec(2,mxpts,2),irec(2,mxpts,2),            &
            isrc(2,mxpts,2),igsrc(mxpts,2),whts(nwhts,mxpts,2),         &
            pts(2,mxpts,2),irecp(2,mxpts,2),ibcvar(nbcvar),             &
            numpts(2),npts(2)
  INCLUDE 'nodal.inc'
  INCLUDE 'agrigrid.inc'
  INCLUDE 'agrialloc.inc'
  INCLUDE 'grddsc.inc'
  LOGICAL :: samstg, smstg2, samlvl
  nw1=nint( SQRT(FLOAT(nwhts)) )
  nw2=nw1
!
  IF(nbcvar == 0) RETURN
  CALL chkdim
(ndim,'ITPBVT')
  nxr=node(5,mrec)
  nyr=node(6,mrec)
  nzr=node(14,mrec)
  cosr=rnode(21,mrec)
  sinr=rnode(22,mrec)
  dxr=rnode(9 ,mrec)
  dyr=rnode(10,mrec)
  xor=rnode(1,mrec)
  yor=rnode(2,mrec)
!
! To loop through all vectors, which has two components stored consecutively
! in nbcvar. The 1st compt. has to be the one in x direction.
!
  DO ivtr=1,nbcvar,2
    ivar1=ibcvar(ivtr)
    ivar2=ibcvar(ivtr+1)
    samstg=smstg2(ivar1,ivar2,ndim)
    IF(ndim == 2) THEN
      xshft = MAX( stgxy(1,ivar1),stgxy(1,ivar2) )
      yshft = MAX( stgxy(2,ivar1),stgxy(2,ivar2) )
    ELSE IF(ndim == 3)THEN
      xshft = MAX( stgxyz(1,ivar1),stgxyz(1,ivar2) )
      yshft = MAX( stgxyz(2,ivar1),stgxyz(2,ivar2) )
    END IF
!
! Find the points on rec. grid for both compnts. and the source grid for
! them.If the two compnts have the same staggering, they have the
! same coordinate points and the source grid, therefore those for the
! 2nd compnt. do not need to be recalculated.
!
    DO icmpr=1,2
!
! icmpr=1 for the 1st component of vectors
!   =2 for the 2nd component of vectors
!
      IF(icmpr == 2.AND.samstg)THEN
        numpts(2)=numpts(1)
        DO ip=1,numpts(2)
          ptsrec(1,ip,2)=ptsrec(1,ip,1)
          ptsrec(2,ip,2)=ptsrec(2,ip,1)
          irec(1,ip,2)=irec(1,ip,1)
          irec(2,ip,2)=irec(2,ip,1)
          igsrc(ip,2)=igsrc(ip,1)
        END DO
        CYCLE
      END IF
      ivar=ibcvar(ivtr+icmpr-1)
      IF(ndim == 2) THEN
        xshift=stgxy(1,ivar)
        yshift=stgxy(2,ivar)
        nx1=nxr-idmxy(1,ivar)
        ny1=nyr-idmxy(2,ivar)
      ELSE IF(ndim == 3)THEN
        xshift=stgxyz(1,ivar)
        yshift=stgxyz(2,ivar)
        nx1=nxr-idmxyz(1,ivar)
        ny1=nyr-idmxyz(2,ivar)
      END IF
      xc=xshift*dxr*cosr
      ys=yshift*dyr*sinr
      xs=xshift*dxr*sinr
      yc=yshift*dyr*cosr
      xorp=xor+xc-ys
      yorp=yor+xs+yc
!
! To calculate the absolute coordinates of the model boundary points
!
! Attention:
!
! Here we assume that in x direction the boundaries are at i=1 and nx1.
! and at j=1 and ny1 in y direction.
! If in a particular solver (model), the boundaries for certain
! variables are defined at points other the above, the use needs to
! change the following loop accordingly (i.e. change ist, jst, iend
! and jend). As a result, the part in routine UPDVTR that calculates
! the points for interior points updating also need change.
!
      ist=1
      jst=1
      iend=nx1
      jend=ny1
      DO j=jst,jend,jend-jst
        jj=(j-jst)/(jend-jst)*(iend-ist+1)
        DO i=ist,iend
          ii=jj+i-ist+1
          x=(i-1)*dxr
          y=(j-1)*dyr
          ptsrec(1,ii,icmpr) = xorp+x*cosr-y*sinr
          ptsrec(2,ii,icmpr) = yorp+x*sinr+y*cosr
          irec  (1,ii,icmpr) = i
          irec  (2,ii,icmpr) = j
        END DO
      END DO
      numpts(icmpr)=MAX(0,2*(iend-ist+1))
      DO i=ist,iend,iend-ist
        ii=(i-ist)/(iend-ist)*(jend-jst-1)
        DO j=jst+1,jend-1
          jj=ii+j-jst+numpts(icmpr)
          x=(i-1)*dxr
          y=(j-1)*dyr
          ptsrec(1,jj,icmpr) = xorp+x*cosr-y*sinr
          ptsrec(2,jj,icmpr) = yorp+x*sinr+y*cosr
          irec  (1,jj,icmpr) = i
          irec  (2,jj,icmpr) = j
        END DO
      END DO
      numpts(icmpr)=numpts(icmpr)+MAX(0,2*(jend-jst-1))
      npts0=numpts(icmpr)
!
! Find the source grid for receive grid points ptsrec
!
      IF(samlvl) THEN
        ierfl=0
        iptcmp=1
      ELSE
        ierfl=1
        iptcmp=1
      END IF
      CALL getsrc
(mrec,msrcs,numscs,xshft,yshft,ptsrec(1,1,icmpr),      &
          numpts(icmpr),irec(1,1,icmpr),igsrc(1,icmpr),ierfl,iptcmp)
!
      IF(.NOT.samlvl) THEN
        IF(numpts(icmpr) /= npts0) THEN
          WRITE(6,'(i4,'' BOUNDARY POINTS DID NOT FIND SOURCE FOR B.C.S'' &
          &   )') npts0-numpts(icmpr)
          WRITE(6,'(''IT WAS FOR '',I1,''-D VECTOR COMPNT. '',2I4)')    &
              ndim,ivar
          WRITE(6,'(''JOB STOPPED IN ITPBVT.'')')
          STOP
        END IF
      END IF
    END DO
!
! find storage pointers for the receive grid variables (2 compnts of vector).
! uppack them if neccesary.
!
    IF(ndim == 2) THEN
      irptr1=igtnxy(mrec,ivar1,1)
      irptr2=igtnxy(mrec,ivar2,1)
      mrptr1=igtnxy(mrec,ibdxy(3,ivar1),1)
      mrptr2=igtnxy(mrec,ibdxy(3,ivar2),1)
    ELSE
      irptr1=igtxyz(mrec,ivar1,1)
      irptr2=igtxyz(mrec,ivar2,1)
      mrptr1=igtxyz(mrec,ibdxyz(3,ivar1),1)
      mrptr2=igtxyz(mrec,ibdxyz(3,ivar2),1)
    END IF
!
! Loop through all source grids
!
    DO ks=1,numscs
      msrc=msrcs(ks)
      nxs=node(5,msrc)
      nys=node(6,msrc)
      nzs=node(14,msrc)
      coss=rnode(21,msrc)
      sins=rnode(22,msrc)
      cossr= coss*cosr+sins*sinr
      sinsr= coss*sinr-sins*cosr
      DO icmps=1,2
        DO  icmpr=1,2
          IF(icmpr == 2.AND.samstg)THEN
            npts(2)=npts(1)
            DO ip=1,npts(2)
              pts  (1,ip,2)=pts  (1,ip,1)
              pts  (2,ip,2)=pts  (2,ip,1)
              isrc (1,ip,2)=isrc (1,ip,1)
              isrc (2,ip,2)=isrc (2,ip,1)
              irecp(1,ip,2)=irecp(1,ip,1)
              irecp(2,ip,2)=irecp(2,ip,1)
            END DO
            DO iw=1,nwhts
              DO ip=1,npts(2)
                whts(iw,ip,2)=whts(iw,ip,1)
              END DO
            END DO
            CYCLE
          END IF
!
! sort rec. grid points according to their source grid
!
          npt=0
          DO np=1,numpts(icmpr)
            IF(igsrc(np,icmpr) == msrc) THEN
              npt=npt+1
              pts(1,npt,icmpr)=ptsrec(1,np,icmpr)
              pts(2,npt,icmpr)=ptsrec(2,np,icmpr)
              irecp(1,npt,icmpr)=irec(1,np,icmpr)
              irecp(2,npt,icmpr)=irec(2,np,icmpr)
            END IF
          END DO
          npts(icmpr)=npt
          IF(npts(icmpr) == 0) CYCLE
!
! Calculate weights of interpolation for points pts.
!
          ivsrc=ibcvar(ivtr+icmps-1)
          CALL calwht
(mrec,msrc,pts(1,1,icmpr),isrc(1,1,icmpr),         &
                      whts(1,1,icmpr),npts(icmpr),nwhts,ivsrc,ndim)
        END DO
        IF(npts(1) == 0.AND.npts(2) == 0) CYCLE
!
! find pointer for one of the components (icmps) of the source grid
! vector. If it is packed, do uppacking for this variable.
!
        ivsrc=ibcvar(ivtr+icmps-1)
        IF(ndim == 2) THEN
          n3rd=1
          isptr=igtnxy(msrc,ivsrc,1)
        ELSE
          n3rd=nzs
          isptr=igtxyz(msrc,ivsrc,1)
        END IF
        IF(icmps == 1)THEN
          proj1=cossr
          proj2=-sinsr
        ELSE
          proj1=sinsr
          proj2=cossr
        END IF
        icmpr=1
        IF(npts(icmpr) /= 0) THEN
          CALL intpvt1
(              nxr,nyr,nxs,nys,n3rd,                                     &
              irecp(1,1,icmpr),isrc(1,1,icmpr),whts(1,1,icmpr),         &
              npts(icmpr),nw1,nw2,icmps,proj1)
        END IF
        icmpr=2
        IF(npts(icmpr) /= 0) THEN
          CALL intpvt1
(              nxr,nyr,nxs,nys,n3rd,                                     &
              irecp(1,1,icmpr),isrc(1,1,icmpr),whts(1,1,icmpr),         &
              npts(icmpr),nw1,nw2,icmps,proj2)
        END IF
        IF(ndim == 2) THEN
          CALL retnxy
(msrc,ivsrc,1,isptr,.false.)
        ELSE
          CALL retxyz
(msrc,ivsrc,1,isptr,.false.)
        END IF
      END DO
!
    END DO
    IF(ndim == 2) THEN
      CALL retnxy
(mrec,ivar1,1,irptr1,.false.)
      CALL retnxy
(mrec,ivar2,1,irptr2,.false.)
      CALL retnxy
(mrec,ibdxy(3,ivar1),1,mrptr1,.true.)
      CALL retnxy
(mrec,ibdxy(3,ivar2),1,mrptr2,.true.)
    ELSE
      CALL retxyz
(mrec,ivar1,1,irptr1,.false.)
      CALL retxyz
(mrec,ivar2,1,irptr2,.false.)
      CALL retxyz
(mrec,ibdxyz(3,ivar1),1,mrptr1,.true.)
      CALL retxyz
(mrec,ibdxyz(3,ivar2),1,mrptr2,.true.)
    END IF
  END DO
  RETURN
END SUBROUTINE itpbvt
!
!--------------------------------------------------------------------------
!
SUBROUTINE intpst(varrec,varsrc,varmdt,tmwght,                          &
           nxr,nyr,nxs,nys,nz,                                          &
           irec,isrc,whts,numpts,nw1,nw2)
  DIMENSION varrec(nxr,nyr,nz),varsrc(nxs,nys,nz),                      &
            varmdt(nxr,nyr,nz),                                         &
            irec(2,numpts),isrc(2,numpts),whts(nw1,nw2,numpts)
!
  itest = 0
  IF(itest == 1) THEN
    WRITE(6,'(''  DATA DUMP IN INTRPS '',8I6)')                         &
        nxr,nyr,nxs,nys,nz,numpts,nw1,nw2
    DO ip=1,20
      WRITE(7,1114) irec(1,ip),irec(2,ip),isrc(1,ip),isrc(2,ip),        &
            whts(1,1,ip),whts(2,1,ip),whts(1,2,ip),whts(2,2,ip)
    END DO
    1114    FORMAT(1X,4I7,4E10.3)
  END IF
!
!  set weights for temporal linear interp
!
  w1 = tmwght
  w2 = 1.-w1
!
  IF(nw1 == 2.AND.nw2 == 2) THEN
!
! The interpolation calculations are all independent of each other,
! they can be vecotrized in inner loop and parellelized in outer loop.
!
    nzswap=2
!
! if nz if small, swap the loop order
!
    IF(nz <= nzswap)THEN
!fpp$ nodepchk
      DO ks=1,nz
!DIR$ IVDEP
        DO np=1,numpts
          ir = irec(1,np)
          jr = irec(2,np)
          is = isrc(1,np)
          js = isrc(2,np)
          varrec(ir,jr,ks)=w1*(varsrc(is,js,ks)*whts(1,1,np)            &
              +varsrc(is+1,js,ks)*whts(2,1,np)                          &
              +varsrc(is,js+1,ks)*whts(1,2,np)                          &
              +varsrc(is+1,js+1,ks)*whts(2,2,np))                       &
              +w2*varmdt(ir,jr,ks)
        END DO
      END DO
    ELSE
!fpp$ nodepchk
      DO np=1,numpts
        ir = irec(1,np)
        jr = irec(2,np)
        is = isrc(1,np)
        js = isrc(2,np)
!DIR$ IVDEP
        DO ks=1,nz
          varrec(ir,jr,ks)=w1*(varsrc(is,js,ks)*whts(1,1,np)            &
              +varsrc(is+1,js,ks)*whts(2,1,np)                          &
              +varsrc(is,js+1,ks)*whts(1,2,np)                          &
              +varsrc(is+1,js+1,ks)*whts(2,2,np))                       &
              +w2*varmdt(ir,jr,ks)
        END DO
      END DO
    END IF
  ELSE
    IF(nz <= nzswap)THEN
!fpp$ nodepchk
      DO ks=1,nz
!DIR$ IVDEP
        DO np=1,numpts
          ir = irec(1,np)
          jr = irec(2,np)
          is = isrc(1,np)
          js = isrc(2,np)
          varrec(ir,jr,ks)=   w1*(                                      &
              varsrc(is-1,js-1,ks)*whts(1,1,np)                         &
              +varsrc(is  ,js-1,ks)*whts(2,1,np)                        &
              +varsrc(is+1,js-1,ks)*whts(3,1,np)                        &
              +varsrc(is-1,js  ,ks)*whts(1,2,np)                        &
              +varsrc(is  ,js  ,ks)*whts(2,2,np)                        &
              +varsrc(is+1,js  ,ks)*whts(3,2,np)                        &
              +varsrc(is-1,js+1,ks)*whts(1,3,np)                        &
              +varsrc(is  ,js+1,ks)*whts(2,3,np)                        &
              +varsrc(is+1,js+1,ks)*whts(3,3,np)  )                     &
              +w2*varmdt(ir,jr,ks)
        END DO
      END DO
    ELSE
!fpp$ nodepchk
      DO np=1,numpts
        ir = irec(1,np)
        jr = irec(2,np)
        is = isrc(1,np)
        js = isrc(2,np)
!DIR$ IVDEP
        DO ks=1,nz
          varrec(ir,jr,ks)=   w1*(                                      &
              varsrc(is-1,js-1,ks)*whts(1,1,np)                         &
              +varsrc(is  ,js-1,ks)*whts(2,1,np)                        &
              +varsrc(is+1,js-1,ks)*whts(3,1,np)                        &
              +varsrc(is-1,js  ,ks)*whts(1,2,np)                        &
              +varsrc(is  ,js  ,ks)*whts(2,2,np)                        &
              +varsrc(is+1,js  ,ks)*whts(3,2,np)                        &
              +varsrc(is-1,js+1,ks)*whts(1,3,np)                        &
              +varsrc(is  ,js+1,ks)*whts(2,3,np)                        &
              +varsrc(is+1,js+1,ks)*whts(3,3,np)  )                     &
              +w2*varmdt(ir,jr,ks)
        END DO
      END DO
    END IF
  END IF
  RETURN
END SUBROUTINE intpst
!
!--------------------------------------------------------------------------
!
SUBROUTINE intpvt(varrec,varsrc,varmdt,tmwght,                          &
           nxr,nyr,nxs,nys,nz,                                          &
           irec,isrc,whts,numpts,nw1,nw2,mode,proj)
  DIMENSION varrec(nxr,nyr,nz),varsrc(nxs,nys,nz),                      &
            varmdt(nxr,nyr,nz),                                         &
            irec(2,numpts),isrc(2,numpts),whts(nw1,nw2,numpts)
!
  itest = 0
  IF(itest == 1) THEN
    WRITE(6,'(''  DATA DUMP IN INTRPV '',8I6)')                         &
        nxr,nyr,nxs,nys,nz,numpts,nw1,nw2
    DO ip=1,20
      WRITE(7,1114) irec(1,ip),irec(2,ip),isrc(1,ip),isrc(2,ip),        &
            whts(1,1,ip),whts(2,1,ip),whts(1,2,ip),whts(2,2,ip)
    END DO
    1114    FORMAT(1X,4I7,4E10.3)
  END IF
  iaccum=0
  IF(mode == 2) iaccum=1
  w1 = tmwght
  w2 = 1.-w1
  IF(nw1 == 2.AND.nw2 == 2) THEN
!
! The interpolation calculations are all independent of each other,
! they can be vecotrized in inner loop and parellelized in outer loop.
!
    nzswap=2
!
! if nz if small, swap the loop order
!
    IF(nz <= nzswap)THEN
!fpp$ nodepchk
      DO ks=1,nz
!DIR$ IVDEP
        DO np=1,numpts
          ir = irec(1,np)
          jr = irec(2,np)
          is = isrc(1,np)
          js = isrc(2,np)
          varrec(ir,jr,ks)=varrec(ir,jr,ks)*iaccum                      &
              +(varsrc(is,js,ks)*whts(1,1,np)                           &
              +varsrc(is+1,js,ks)*whts(2,1,np)                          &
              +varsrc(is,js+1,ks)*whts(1,2,np)                          &
              +varsrc(is+1,js+1,ks)*whts(2,2,np))*proj*w1               &
              +w2*iaccum*varmdt(ir,jr,ks)
        END DO
      END DO
    ELSE
!fpp$ nodepchk
      DO np=1,numpts
        ir = irec(1,np)
        jr = irec(2,np)
        is = isrc(1,np)
        js = isrc(2,np)
!DIR$ IVDEP
        DO ks=1,nz
          varrec(ir,jr,ks)=varrec(ir,jr,ks)*iaccum                      &
              +(varsrc(is,js,ks)*whts(1,1,np)                           &
              +varsrc(is+1,js,ks)*whts(2,1,np)                          &
              +varsrc(is,js+1,ks)*whts(1,2,np)                          &
              +varsrc(is+1,js+1,ks)*whts(2,2,np))*proj*w1               &
              +w2*iaccum*varmdt(ir,jr,ks)
        END DO
      END DO
    END IF
  ELSE
    IF(nz <= nzswap)THEN
!fpp$ nodepchk
      DO ks=1,nz
!DIR$ IVDEP
        DO np=1,numpts
          ir = irec(1,np)
          jr = irec(2,np)
          is = isrc(1,np)
          js = isrc(2,np)
          varrec(ir,jr,ks)=varrec(ir,jr,ks)*iaccum                      &
              +(varsrc(is-1,js-1,ks)*whts(1,1,np)                       &
              +varsrc(is  ,js-1,ks)*whts(2,1,np)                        &
              +varsrc(is+1,js-1,ks)*whts(3,1,np)                        &
              +varsrc(is-1,js  ,ks)*whts(1,2,np)                        &
              +varsrc(is  ,js  ,ks)*whts(2,2,np)                        &
              +varsrc(is+1,js  ,ks)*whts(3,2,np)                        &
              +varsrc(is-1,js+1,ks)*whts(1,3,np)                        &
              +varsrc(is  ,js+1,ks)*whts(2,3,np)                        &
              +varsrc(is+1,js+1,ks)*whts(3,3,np))*proj*w1               &
              +w2*iaccum*varmdt(ir,jr,ks)
        END DO
      END DO
    ELSE
!fpp$ nodepchk
      DO np=1,numpts
        ir = irec(1,np)
        jr = irec(2,np)
        is = isrc(1,np)
        js = isrc(2,np)
!DIR$ IVDEP
        DO ks=1,nz
          varrec(ir,jr,ks)=varrec(ir,jr,ks)*iaccum                      &
              +(varsrc(is-1,js-1,ks)*whts(1,1,np)                       &
              +varsrc(is  ,js-1,ks)*whts(2,1,np)                        &
              +varsrc(is+1,js-1,ks)*whts(3,1,np)                        &
              +varsrc(is-1,js  ,ks)*whts(1,2,np)                        &
              +varsrc(is  ,js  ,ks)*whts(2,2,np)                        &
              +varsrc(is+1,js  ,ks)*whts(3,2,np)                        &
              +varsrc(is-1,js+1,ks)*whts(1,3,np)                        &
              +varsrc(is  ,js+1,ks)*whts(2,3,np)                        &
              +varsrc(is+1,js+1,ks)*whts(3,3,np))*proj*w1               &
              +w2*iaccum*varmdt(ir,jr,ks)
        END DO
      END DO
    END IF
  END IF
  RETURN
END SUBROUTINE intpvt
!
!--------------------------------------------------------------------------
!
SUBROUTINE intpst1(varrec,varsrc,varmdt,tmwght,                         & 1
           nxr,nyr,nxs,nys,nz,                                          &
           irec,isrc,whts,numpts,nw1,nw2)
  DIMENSION varrec(nxr,nyr,nz),varsrc(nxs,nys,nz),                      &
            varmdt(nxr,nyr,nz),                                         &
            irec(2,numpts),isrc(2,numpts),whts(nw1,nw2,numpts)
!
  itest = 0
  IF(itest == 1) THEN
    WRITE(6,'(''  DATA DUMP IN INTRPS '',8I6)')                         &
        nxr,nyr,nxs,nys,nz,numpts,nw1,nw2
    DO ip=1,20
      WRITE(7,1114) irec(1,ip),irec(2,ip),isrc(1,ip),isrc(2,ip),        &
            whts(1,1,ip),whts(2,1,ip),whts(1,2,ip),whts(2,2,ip)
    END DO
    1114    FORMAT(1X,4I7,4E10.3)
  END IF
!
!  set weights for temporal linear interp
!
  w1 = tmwght
  w2 = 1.-w1
!
  IF(nw1 == 2.AND.nw2 == 2) THEN
!
! The interpolation calculations are all independent of each other,
! they can be vecotrized in inner loop and parellelized in outer loop.
!
    nzswap=2
!
! if nz if small, swap the loop order
!
    IF(nz <= nzswap)THEN
!fpp$ nodepchk
      DO ks=1,nz
!DIR$ IVDEP
        DO np=1,numpts
          ir = irec(1,np)
          jr = irec(2,np)
          is = isrc(1,np)
          js = isrc(2,np)
          varmdt(ir,jr,ks)=(varrec(ir,jr,ks)-w1*                        &
              (varsrc(is,js,ks)*whts(1,1,np)                            &
              +varsrc(is+1,js,ks)*whts(2,1,np)                          &
              +varsrc(is,js+1,ks)*whts(1,2,np)                          &
              +varsrc(is+1,js+1,ks)*whts(2,2,np)))/w2
        END DO
      END DO
    ELSE
!fpp$ nodepchk
      DO np=1,numpts
        ir = irec(1,np)
        jr = irec(2,np)
        is = isrc(1,np)
        js = isrc(2,np)
!DIR$ IVDEP
        DO ks=1,nz
          varmdt(ir,jr,ks)=(varrec(ir,jr,ks)-w1*                        &
              (varsrc(is,js,ks)*whts(1,1,np)                            &
              +varsrc(is+1,js,ks)*whts(2,1,np)                          &
              +varsrc(is,js+1,ks)*whts(1,2,np)                          &
              +varsrc(is+1,js+1,ks)*whts(2,2,np)))/w2
        END DO
      END DO
    END IF
  ELSE
    IF(nz <= nzswap)THEN
!fpp$ nodepchk
      DO ks=1,nz
!DIR$ IVDEP
        DO np=1,numpts
          ir = irec(1,np)
          jr = irec(2,np)
          is = isrc(1,np)
          js = isrc(2,np)
          varmdt(ir,jr,ks)=(varrec(ir,jr,ks)-w1*(                       &
              varsrc(is-1,js-1,ks)*whts(1,1,np)                         &
              +varsrc(is  ,js-1,ks)*whts(2,1,np)                        &
              +varsrc(is+1,js-1,ks)*whts(3,1,np)                        &
              +varsrc(is-1,js  ,ks)*whts(1,2,np)                        &
              +varsrc(is  ,js  ,ks)*whts(2,2,np)                        &
              +varsrc(is+1,js  ,ks)*whts(3,2,np)                        &
              +varsrc(is-1,js+1,ks)*whts(1,3,np)                        &
              +varsrc(is  ,js+1,ks)*whts(2,3,np)                        &
              +varsrc(is+1,js+1,ks)*whts(3,3,np)))/w2
        END DO
      END DO
    ELSE
!fpp$ nodepchk
      DO np=1,numpts
        ir = irec(1,np)
        jr = irec(2,np)
        is = isrc(1,np)
        js = isrc(2,np)
!DIR$ IVDEP
        DO ks=1,nz
          varmdt(ir,jr,ks)=(varrec(ir,jr,ks)-w1*(                       &
              varsrc(is-1,js-1,ks)*whts(1,1,np)                         &
              +varsrc(is  ,js-1,ks)*whts(2,1,np)                        &
              +varsrc(is+1,js-1,ks)*whts(3,1,np)                        &
              +varsrc(is-1,js  ,ks)*whts(1,2,np)                        &
              +varsrc(is  ,js  ,ks)*whts(2,2,np)                        &
              +varsrc(is+1,js  ,ks)*whts(3,2,np)                        &
              +varsrc(is-1,js+1,ks)*whts(1,3,np)                        &
              +varsrc(is  ,js+1,ks)*whts(2,3,np)                        &
              +varsrc(is+1,js+1,ks)*whts(3,3,np)))/w2
        END DO
      END DO
    END IF
  END IF
  RETURN
END SUBROUTINE intpst1
!
!--------------------------------------------------------------------------
!
SUBROUTINE intpvt1(varrec,varsrc,varmdt,tmwght,                         & 2
           nxr,nyr,nxs,nys,nz,                                          &
           irec,isrc,whts,numpts,nw1,nw2,mode,proj)
  DIMENSION varrec(nxr,nyr,nz),varsrc(nxs,nys,nz),                      &
            varmdt(nxr,nyr,nz),                                         &
            irec(2,numpts),isrc(2,numpts),whts(nw1,nw2,numpts)
!
  itest = 0
  IF(itest == 1) THEN
    WRITE(6,'(''  DATA DUMP IN INTRPV '',8I6)')                         &
        nxr,nyr,nxs,nys,nz,numpts,nw1,nw2
    DO ip=1,20
      WRITE(7,1114) irec(1,ip),irec(2,ip),isrc(1,ip),isrc(2,ip),        &
            whts(1,1,ip),whts(2,1,ip),whts(1,2,ip),whts(2,2,ip)
    END DO
    1114    FORMAT(1X,4I7,4E10.3)
  END IF
  iaccum=0
  IF(mode == 2) iaccum=1
  w1 = tmwght
  w2 = 1.-w1
  IF(nw1 == 2.AND.nw2 == 2) THEN
!
! The interpolation calculations are all independent of each other,
! they can be vecotrized in inner loop and parellelized in outer loop.
!
    nzswap=2
!
! if nz if small, swap the loop order
!
    IF(nz <= nzswap)THEN
!fpp$ nodepchk
      DO ks=1,nz
!DIR$ IVDEP
        DO np=1,numpts
          ir = irec(1,np)
          jr = irec(2,np)
          is = isrc(1,np)
          js = isrc(2,np)
          varmdt(ir,jr,ks)=varmdt(ir,jr,ks)*iaccum                      &
              +(varrec(ir,jr,ks)*iaccum                                 &
              -(varsrc(is,js,ks)*whts(1,1,np)                           &
              +varsrc(is+1,js,ks)*whts(2,1,np)                          &
              +varsrc(is,js+1,ks)*whts(1,2,np)                          &
              +varsrc(is+1,js+1,ks)*whts(2,2,np))*proj*w1)/w2
        END DO
      END DO
    ELSE
!fpp$ nodepchk
      DO np=1,numpts
        ir = irec(1,np)
        jr = irec(2,np)
        is = isrc(1,np)
        js = isrc(2,np)
!DIR$ IVDEP
        DO ks=1,nz
          varmdt(ir,jr,ks)=varmdt(ir,jr,ks)*iaccum                      &
              +(varrec(ir,jr,ks)*iaccum                                 &
              -(varsrc(is,js,ks)*whts(1,1,np)                           &
              +varsrc(is+1,js,ks)*whts(2,1,np)                          &
              +varsrc(is,js+1,ks)*whts(1,2,np)                          &
              +varsrc(is+1,js+1,ks)*whts(2,2,np))*proj*w1)/w2
        END DO
      END DO
    END IF
  ELSE
    IF(nz <= nzswap)THEN
!fpp$ nodepchk
      DO ks=1,nz
!DIR$ IVDEP
        DO np=1,numpts
          ir = irec(1,np)
          jr = irec(2,np)
          is = isrc(1,np)
          js = isrc(2,np)
          varmdt(ir,jr,ks)=varmdt(ir,jr,ks)*iaccum                      &
              +(varrec(ir,jr,ks)*iaccum                                 &
              -(varsrc(is-1,js-1,ks)*whts(1,1,np)                       &
              +varsrc(is  ,js-1,ks)*whts(2,1,np)                        &
              +varsrc(is+1,js-1,ks)*whts(3,1,np)                        &
              +varsrc(is-1,js  ,ks)*whts(1,2,np)                        &
              +varsrc(is  ,js  ,ks)*whts(2,2,np)                        &
              +varsrc(is+1,js  ,ks)*whts(3,2,np)                        &
              +varsrc(is-1,js+1,ks)*whts(1,3,np)                        &
              +varsrc(is  ,js+1,ks)*whts(2,3,np)                        &
              +varsrc(is+1,js+1,ks)*whts(3,3,np))*proj*w1)/w2
        END DO
      END DO
    ELSE
!fpp$ nodepchk
      DO np=1,numpts
        ir = irec(1,np)
        jr = irec(2,np)
        is = isrc(1,np)
        js = isrc(2,np)
!DIR$ IVDEP
        DO ks=1,nz
          varmdt(ir,jr,ks)=varmdt(ir,jr,ks)*iaccum                      &
              +(varrec(ir,jr,ks)*iaccum                                 &
              -(varsrc(is-1,js-1,ks)*whts(1,1,np)                       &
              +varsrc(is  ,js-1,ks)*whts(2,1,np)                        &
              +varsrc(is+1,js-1,ks)*whts(3,1,np)                        &
              +varsrc(is-1,js  ,ks)*whts(1,2,np)                        &
              +varsrc(is  ,js  ,ks)*whts(2,2,np)                        &
              +varsrc(is+1,js  ,ks)*whts(3,2,np)                        &
              +varsrc(is-1,js+1,ks)*whts(1,3,np)                        &
              +varsrc(is  ,js+1,ks)*whts(2,3,np)                        &
              +varsrc(is+1,js+1,ks)*whts(3,3,np))*proj*w1)/w2
        END DO
      END DO
    END IF
  END IF
  RETURN
END SUBROUTINE intpvt1
!
!--------------------------------------------------------------------------
!
SUBROUTINE exchbc( mptr1,mptr2 ) 1,8
!
!  Exchange boundary values (conditons) by interpolation bwtween
!  two overlapping grids at the same level. mptr1 and mptr2 are the
!  grid number.
!
!  Calling this once instead of calling updbc(mptr) twice so that each
!  grid do not need to be unpacked and packed twice.
!
  INCLUDE 'nodal.inc'
  INCLUDE 'agrigrid.inc'
  INCLUDE 'agrialloc.inc'
  INCLUDE 'grddsc.inc'
  INCLUDE 'agricst.inc'
  DIMENSION ibcvar(nxy2d+nxyz3d),ibcsta(nxy2d+nxyz3d)
  LOGICAL :: smstg2
!
  IF( intrpodr == 2 ) THEN
    nwhts=9
  ELSE
    nwhts=4
  END IF
  level1 = node(4,mptr1)
  IF(level1 > lfine.OR.level1 == 0) GO TO 999
  level2 = node(4,mptr2)
  IF(level2 > lfine.OR.level2 == 0) GO TO 998
  IF(level1 /= level2) GO TO 997
  nx1=node(5,mptr1)
  ny1=node(6,mptr1)
  nx2=node(5,mptr2)
  ny2=node(6,mptr2)
!
! --------------------------------------------------------------------
! calculate b.c.'s for 2-d scalars
! --------------------------------------------------------------------
!
  ndim=2
!
! initialize b.c. calculating status with value 1 for each scalar
!
  DO i=1,nxy2d
    ibcsta(i)=1
  END DO
  100   CONTINUE
!
! search for variables that need b.c.'s and group them according to
! their staggering
!
  nbcvar=0
  DO ibc=1,nxy2d
!
! look for 1st 2-d scalar that needs b.c. calculation
!
    IF(ibdxy(1,ibc) == 1.AND.ibcsta(ibc) == 1.AND. ibdxy(2,ibc) == 0)THEN
      nbcvar=nbcvar+1
      ibcvar(nbcvar)=ibc
      ibcsta(ibc)=0
      DO ivar=ibc+1,nxy2d
!
! list additonal variables with matching staggering to that of ibc.
!
        IF(ibdxy(1,ivar) == 1.AND.ibcsta(ivar) == 1.AND.                &
              ibdxy(2,ivar) == 0.AND.smstg2(ivar,ibc,ndim))THEN
          nbcvar=nbcvar+1
          ibcvar(nbcvar)=ivar
          ibcsta(ivar)=0
        END IF
      END DO
    END IF
  END DO
!
! if the b.c.'s for all 2-d scalars are calculated goto next step
!
  IF(nbcvar == 0)GO TO 200
!
! perform interpolations for 2-d scalar variables listed in ibcvar(nbcvar).
!
  mxpts=2*MAX( nx1+ny1,nx2+ny2 )
  iptr1=igetsp(2*mxpts)
  iptr2=igetsp(2*mxpts*2)
  iptr3=igetsp(2*mxpts*2)
  iptr4=igetsp(  mxpts)
  iptr5=igetsp(nwhts*mxpts*2)
  iptr6=igetsp(2*mxpts)
!
  CALL itpbs2
(mptr1,mptr2,a(iptr1),a(iptr2),a(iptr3),a(iptr4),          &
       a(iptr5),a(iptr6),mxpts,nwhts,ibcvar,nbcvar,ndim)
!
!  restore tem space
  CALL resett
!
! go back to check if any more variable needs b.c. calculation
!
  GO TO 100
  200   CONTINUE
!
! --------------------------------------------------------------------
! calculate b.c.'s for 3-d scalars
! --------------------------------------------------------------------
!
  ndim=3
!
! initialize b.c. calculating status with value 1 for each vari.
!
  DO i=1,nxyz3d
    ibcsta(i)=1
  END DO
!
! search for variables that need b.c.'s and group them according to
! their staggering
!
  300   CONTINUE
  nbcvar=0
  DO ibc=1,nxyz3d
!
! look for 1st 3-d scalar that needs b.c. calculation
!
    IF(ibdxyz(1,ibc) == 1.AND.ibcsta(ibc) == 1.AND. ibdxyz(2,ibc) == 0)THEN
      nbcvar=nbcvar+1
      ibcvar(nbcvar)=ibc
      ibcsta(ibc)=0
      DO ivar=ibc+1,nxyz3d
!
! list additonal variables with matching staggering to that of ibc.
!
        IF(ibdxyz(1,ivar) == 1.AND.ibcsta(ivar) == 1.AND.               &
              ibdxyz(2,ivar) == 0.AND.smstg2(ivar,ibc,ndim))THEN
          nbcvar=nbcvar+1
          ibcvar(nbcvar)=ivar
          ibcsta(ivar)=0
        END IF
      END DO
    END IF
  END DO
!
! if the b.c.'s for all 3-d scalars are calculated goto next step
!
  IF(nbcvar == 0) GO TO 400
!
! perform interpolations for 3-d scalars listed in ibcvar(nbcvar).
!
  mxpts=2*MAX( nx1+ny1,nx2+ny2 )
  iptr1=igetsp(2*mxpts)
  iptr2=igetsp(2*mxpts*2)
  iptr3=igetsp(2*mxpts*2)
  iptr4=igetsp(  mxpts)
  iptr5=igetsp(nwhts*mxpts*2)
  iptr6=igetsp(2*mxpts)
!
  CALL itpbs2
(mptr1,mptr2,a(iptr1),a(iptr2),a(iptr3),a(iptr4),          &
       a(iptr5),a(iptr6),mxpts,nwhts,ibcvar,nbcvar,ndim)
!
!  restore tem space
!
  CALL resett
!
! go back to check if any more 3-d scalars needs b.c. calculation
!
  GO TO 300
  400   CONTINUE
!
!-------------------------------------------------------------------
! calculate b.c.'s for 2-d vectors
! --------------------------------------------------------------------
!
  ndim=2
!
! initialize b.c. calculating status with value 1 for each vari.
!
  DO i=1,nxy2d
    ibcsta(i)=1
  END DO
  500   CONTINUE
!
! search for 2-d vectors that need b.c.'s
!
  nbcvar=0
  DO ibc=1,nxy2d
!
! look for 1st 2-d vector that needs b.c. calculation
!
    IF(ibdxy(1,ibc) == 1.AND.ibdxy(2,ibc) > 0.AND. ibcsta(ibc) == 1) THEN
      ibc2=ibdxy(2,ibc)
      ibcvar(nbcvar+1)=ibc
      ibcvar(nbcvar+2)=ibc2
      nbcvar=nbcvar+2
      ibcsta(ibc )=0
      ibcsta(ibc2)=0
      EXIT
    END IF
  END DO
  67    CONTINUE
!
! if the b.c.'s for all 2-d vectors are calculated goto next step
!
  IF(nbcvar == 0)GO TO 600
!
! perform interpolations for 2-d vectors listed in ibcvar(nbcvar).
!
  mxpts=2*MAX( nx1+ny1,nx2+ny2 )
  iptr1=igetsp(4*mxpts)
  iptr2=igetsp(4*mxpts)
  iptr3=igetsp(4*mxpts)
  iptr4=igetsp(2*mxpts)
  iptr5=igetsp(nwhts*mxpts*2)
  iptr6=igetsp(4*mxpts)
!
  CALL itpbv2
(mptr1,mptr2,a(iptr1),a(iptr2),a(iptr3),a(iptr4),          &
       a(iptr5),a(iptr6),mxpts,nwhts,ibcvar,nbcvar,ndim)
!
!  restore tem space
!
  CALL resett
!
! go back to check if any more 2-d vector needs b.c. calculation
!
  GO TO 500
  600   CONTINUE
!
!------------------------------------------------------------------
! calculate b.c.'s for 3-d vectors
!------------------------------------------------------------------
!
  ndim=3
!
! initialize b.c. calculating status with value 1 for each vari.
!
  DO i=1,nxyz3d
    ibcsta(i)=1
  END DO
!
  700   CONTINUE
!
! search for variables that need b.c.'s and group them according to
! their staggering
!
  nbcvar=0
  DO ibc=1,nxyz3d
!
! look for 1st 3-d vector that needs b.c. calculation
!
    IF(ibdxyz(1,ibc) == 1.AND.ibdxyz(2,ibc) > 0.AND. ibcsta(ibc) == 1) THEN
      ibc2=ibdxyz(2,ibc)
      ibcvar(nbcvar+1)=ibc
      ibcvar(nbcvar+2)=ibc2
      nbcvar=nbcvar+2
      ibcsta(ibc )=0
      ibcsta(ibc2)=0
      EXIT
    END IF
  END DO
  92    CONTINUE
!
! if the b.c.'s for all 3-d vectors are calculated goto next step
!
  IF(nbcvar == 0)GO TO 800
!
! perform interpolations for 3-d vectors listed in ibcvar(nbcvar).
!
  mxpts=2*MAX( nx1+ny1,nx2+ny2 )
  iptr1=igetsp(4*mxpts)
  iptr2=igetsp(4*mxpts)
  iptr3=igetsp(4*mxpts)
  iptr4=igetsp(2*mxpts)
  iptr5=igetsp(nwhts*mxpts*2)
  iptr6=igetsp(4*mxpts)
!
  CALL itpbv2
(mptr1,mptr2,a(iptr1),a(iptr2),a(iptr3),a(iptr4),          &
       a(iptr5),a(iptr6),mxpts,nwhts,ibcvar,nbcvar,ndim)
!
!  restore tem space
!
  CALL resett
!
! go back to check if any more 3-d vector needs b.c. calculation
!
  GO TO 700
  800   CONTINUE
  RETURN
  999   WRITE(6,'(''ERROR IN EXCHBC: THE LEVEL OF INPUT GRID'',         &
        & '' <1 OR >lfine, the grid was #'',i3)') mptr1
  RETURN
  998   WRITE(6,'(''ERROR IN EXCHBC: THE LEVEL OF INPUT GRID'',         &
        & '' <1 OR >lfine, the grid was #'',i3)') mptr2
  RETURN
  997   WRITE(6,'(''ERROR IN EXCHBC: THE INPUT GRIDS MUST ON SAME LEVEL'' &
        &  ,'' the levels were '',2I4)') level1, level2
  RETURN
END SUBROUTINE exchbc
!
!--------------------------------------------------------------------------
!
SUBROUTINE itpbs2(mptr1,mptr2,pts,irec,isrc,igsrc,whts,                 & 2,9
           pts1,mxpts,nwhts,ibcvar,nbcvar,ndim)
!
! exchange boundary values for scalar varibales in IBCVAR(NBCVAR)
! between two overlapping grids at the same level by interpolation.
!
  DIMENSION pts(2,mxpts),irec(2,mxpts,2),isrc(2,mxpts,2),               &
      igsrc(mxpts),whts(nwhts,mxpts,2),pts1(2,mxpts),ibcvar(nbcvar)
  INTEGER :: npts(2)
  LOGICAL :: change(2)
  INCLUDE 'nodal.inc'
  INCLUDE 'agrigrid.inc'
  INCLUDE 'agrialloc.inc'
  INCLUDE 'grddsc.inc'
  nw1=nint( SQRT(FLOAT(nwhts)) )
  nw2=nw1
!
! Calculate and store the coor's of p-points of the receive
! grid in array pts with their indecies stored in irec.
!
  IF(nbcvar == 0) RETURN
  CALL chkdim
(ndim,'ITPBS2')
  ivar=ibcvar(1)
  DO igrid=1,2
    ig=igrid
    IF( igrid == 1) THEN
      mrec=mptr1
      msrc=mptr2
    ELSE
      mrec=mptr2
      msrc=mptr1
    END IF
    nx=node(5,mrec)
    ny=node(6,mrec)
    cosr=rnode(21,mrec)
    sinr=rnode(22,mrec)
    dxr=rnode(9 ,mrec)
    dyr=rnode(10,mrec)
    xor=rnode(1,mrec)
    yor=rnode(2,mrec)
    IF(ndim == 2) THEN
      xshift=stgxy(1,ivar)
      yshift=stgxy(2,ivar)
      nx1=nx-idmxy(1,ivar)
      ny1=ny-idmxy(2,ivar)
    ELSE
      xshift=stgxyz(1,ivar)
      yshift=stgxyz(2,ivar)
      nx1=nx-idmxyz(1,ivar)
      ny1=ny-idmxyz(2,ivar)
    END IF
    xc=xshift*dxr*cosr
    ys=yshift*dyr*sinr
    xs=xshift*dxr*sinr
    yc=yshift*dyr*cosr
    xorp=xor+xc-ys
    yorp=yor+xs+yc
!
! To calculate the absolute coordinates of the model boundary points
!
! Attention:
!
! Here we assume that in x direction the boundaries are at i=1 and nx1.
! and at j=1 and ny1 in y direction.
! If in a particular solver (model), the boundaries for certain
! variables are defined at points other the above, the use needs to
! change the following loop accordingly (i.e. change ist, jst, iend
! and jend). As a result, the part in routine UPDSCL that calculates
! the points for interior points updating also need change.
!
    ist=1
    jst=1
    iend=nx1
    jend=ny1
    DO j=jst,jend,jend-jst
      jj=(j-jst)/(jend-jst)*(iend-ist+1)
      DO i=ist,iend
        ii=jj+i-ist+1
        x=(i-1)*dxr
        y=(j-1)*dyr
        pts (1,ii) = xorp+x*cosr-y*sinr
        pts (2,ii) = yorp+x*sinr+y*cosr
        irec(1,ii,ig) = i
        irec(2,ii,ig) = j
      END DO
    END DO
    numpts=MAX(0, 2*(iend-ist+1))
    DO i=ist,iend,iend-ist
      ii=(i-ist)/(iend-ist)*(jend-jst-1)
      DO j=jst+1,jend-1
        jj=ii+j-jst+numpts
        x=(i-1)*dxr
        y=(j-1)*dyr
        pts (1,jj) = xorp+x*cosr-y*sinr
        pts (2,jj) = yorp+x*sinr+y*cosr
        irec(1,jj,ig) = i
        irec(2,jj,ig) = j
      END DO
    END DO
    numpts=numpts+MAX(0,2*(jend-jst-1))
!
! Find the source points for receive grid points pts
!
    ierfl=0
    iptcmp=1
    CALL getsrc
(mrec,msrc,1,xshift,yshift,pts,numpts,                   &
                irec(1,1,ig),igsrc,ierfl,iptcmp)
!
    npts(ig)=numpts
    change(ig) = .true.
    IF(npts(ig) == 0) change(ig)=.false.
    IF(npts(ig) == 0) CYCLE
    DO ip=1,npts(ig)
      pts1(1,ip)=pts(1,ip)
      pts1(2,ip)=pts(2,ip)
    END DO
!
! Calculate weights of interpolation for points pts. The points are
! stored in pts1 so that pts remained unchanged after calwht.
!
    CALL calwht
(mrec,msrc,pts1,isrc(1,1,ig),whts(1,1,ig),npts(ig),      &
                nwhts,ivar,ndim)
  END DO
!
! now we have receive points in irec, source points in isrc and interpolation
! weights wghts, for both interp from grid 2 to 1 and from grid 1 to 2.
! The actual interpolations are done in INTPSL for scalars listed in
! ibcvar. Interp bwteen the two grids are done at the same time
! so that packing unpacking only has to be done once.
!
  nx1=node(5 ,mptr1)
  ny1=node(6 ,mptr1)
  nz1=node(14,mptr1)
  nx2=node(5 ,mptr2)
  ny2=node(6 ,mptr2)
  nz2=node(14,mptr2)
  IF(nz1 /= nz2)GO TO 999
!
! Interpolate for the boundary values for variables in list ibcvar
!
  IF(npts(1) == 0.AND.npts(2) == 0) GO TO 500
  DO i=1,nbcvar
    ivar=ibcvar(i)
    IF(ndim == 2) THEN
      n3rd=1
      iptr1=igtnxy(mptr1,ivar,1)
      iptr2=igtnxy(mptr2,ivar,1)
    ELSE
      n3rd=nz1
      iptr1=igtxyz(mptr1,ivar,1)
      iptr2=igtxyz(mptr2,ivar,1)
    END IF
    IF(change(1)) CALL intrps
(         irec(1,1,1),isrc(1,1,1),whts(1,1,1),npts(1),nw1,nw2)
    IF(change(2)) CALL intrps
(         irec(1,1,2),isrc(1,1,2),whts(1,1,2),npts(2),nw1,nw2)
!
! if change is false, no need to pack the data back.
!
    IF(ndim == 2) THEN
      CALL retnxy
(mptr1,ivar,1,iptr1,change(1))
      CALL retnxy
(mptr2,ivar,1,iptr2,change(2))
    ELSE
      CALL retxyz
(mptr1,ivar,1,iptr1,change(1))
      CALL retxyz
(mptr2,ivar,1,iptr2,change(2))
    END IF
  END DO
  500   CONTINUE
  RETURN
  999   WRITE(6,'(''ERROR IN INTPS2: NZ FOR TWO GRIDS NOT EQUAL,'')')
  WRITE(6,'(''THEY WERE '',2I5,'', JOB ABORTED.'')')nz1,nz2
  STOP
END SUBROUTINE itpbs2
!
!--------------------------------------------------------------------------
!
SUBROUTINE itpbv2(mptr1,mptr2,pts,irec,isrc,igsrc,whts,                 & 2,13
           pts1,mxpts,nwhts,ibcvar,nbcvar,ndim)
!
! exchange boundary values for vectors in IBCVAR(NBCVAR)
! between two overlapping grids at the same level by interpolation.
!
! input list: mptr1, mptr2,mxpts,nwhts,ibcvar,nbcvar,ndim
! working arrays: pts,irec,isrc,igsrc,whts
! index implication for e.g. irec:
!
!   irec(2,     mxpts,      2     )
!     |        |         |
!  x or y   points   components
!
! similarly for isrc, igsrc,whts.
!
  DIMENSION pts(2,mxpts,2),irec(2,mxpts,2),isrc(2,mxpts,2),             &
            igsrc(mxpts,2),whts(nwhts,mxpts,2),pts1(2,mxpts,2),         &
            ibcvar(nbcvar),numpts(2),npts(2)
  INCLUDE 'nodal.inc'
  INCLUDE 'agrigrid.inc'
  INCLUDE 'agrialloc.inc'
  INCLUDE 'grddsc.inc'
  LOGICAL :: samstg, smstg2, change(2)
  nw1=nint( SQRT(FLOAT(nwhts)) )
  nw2=nw1
!
  IF(nbcvar == 0) RETURN
  CALL chkdim
(ndim,'ITPBV2')
!
! To loop through all vectors, which has two components stored consecutively
! in nbcvar. The 1st compt. has to be the one in x direction.
! Here, interp weights are calculated for each vector.
!
  DO ivtr=1,nbcvar,2
    ivar1=ibcvar(ivtr)
    ivar2=ibcvar(ivtr+1)
    samstg=smstg2(ivar1,ivar2,ndim)
!
! find storage pointers for the receive grid variables (2 compnts of vector).
! uppack them if neccesary.
!
    IF(ndim == 2) THEN
      xshft = MAX( stgxy(1,ivar1),stgxy(1,ivar2) )
      yshft = MAX( stgxy(2,ivar1),stgxy(2,ivar2) )
      iptr11=igtnxy(mptr1,ivar1,1)
      iptr12=igtnxy(mptr1,ivar2,1)
      iptr21=igtnxy(mptr2,ivar1,1)
      iptr22=igtnxy(mptr2,ivar2,1)
    ELSE
      xshft = MAX( stgxyz(1,ivar1),stgxyz(1,ivar2) )
      yshft = MAX( stgxyz(2,ivar1),stgxyz(2,ivar2) )
      iptr11=igtxyz(mptr1,ivar1,1)
      iptr12=igtxyz(mptr1,ivar2,1)
      iptr21=igtxyz(mptr2,ivar1,1)
      iptr22=igtxyz(mptr2,ivar2,1)
    END IF
    DO igrid=1,2
      ig=igrid
      change(ig)=.true.
      IF(ig == 1)THEN
        mrec=mptr1
        msrc=mptr2
      ELSE
        mrec=mptr2
        msrc=mptr1
      END IF
      nxr=node(5,mrec)
      nyr=node(6,mrec)
      nzr=node(14,mrec)
      cosr=rnode(21,mrec)
      sinr=rnode(22,mrec)
      dxr=rnode(9 ,mrec)
      dyr=rnode(10,mrec)
      xor=rnode(1,mrec)
      yor=rnode(2,mrec)
      nxs=node(5,msrc)
      nys=node(6,msrc)
      nzs=node(14,msrc)
      coss=rnode(21,msrc)
      sins=rnode(22,msrc)
      cossr= coss*cosr+sins*sinr
      sinsr= coss*sinr-sins*cosr
      IF(nzr /= nzs) GO TO 999
      n3rd=nzs
      IF(ndim == 2) n3rd=1
!
! Find the points on rec. grid for both compnts. and the source grid for
! them.If the two compnts have the same staggering, they have the
! same coordinate points and the source grid, therefore those for the
! 2nd compnt. do not need to be recalculated.
!
      DO icmpr=1,2
!
! icmpr=1 for the 1st component of vectors
!   =2 for the 2nd component of vectors
!
        IF(icmpr == 2.AND.samstg)THEN
          numpts(2)=numpts(1)
          DO ip=1,numpts(2)
            pts (1,ip,2)=pts (1,ip,1)
            pts (2,ip,2)=pts (2,ip,1)
            irec(1,ip,2)=irec(1,ip,1)
            irec(2,ip,2)=irec(2,ip,1)
            igsrc(ip,2)=igsrc(ip,1)
          END DO
          CYCLE
        END IF
        ivar=ibcvar(ivtr+icmpr-1)
        IF(ndim == 2) THEN
          xshift=stgxy(1,ivar)
          yshift=stgxy(2,ivar)
          nx1=nxr-idmxy(1,ivar)
          ny1=nyr-idmxy(2,ivar)
        ELSE IF(ndim == 3)THEN
          xshift=stgxyz(1,ivar)
          yshift=stgxyz(2,ivar)
          nx1=nxr-idmxyz(1,ivar)
          ny1=nyr-idmxyz(2,ivar)
        END IF
        xc=xshift*dxr*cosr
        ys=yshift*dyr*sinr
        xs=xshift*dxr*sinr
        yc=yshift*dyr*cosr
        xorp=xor+xc-ys
        yorp=yor+xs+yc
!
! To calculate the absolute coordinates of the model boundary points
!
! Attention:
!
! Here we assume that in x direction the boundaries are at i=1 and nx1.
! and at j=1 and ny1 in y direction.
! If in a particular solver (model), the boundaries for certain
! variables are defined at points other the above, the use needs to
! change the following loop accordingly (i.e. change ist, jst, iend
! and jend). As a result, the part in routine UPDVTR that calculates
! the points for interior points updating also need change.
!
        ist=1
        jst=1
        iend=nx1
        jend=ny1
        DO j=jst,jend,jend-jst
          jj=(j-jst)/(jend-jst)*(iend-ist+1)
          DO i=ist,iend
            ii=jj+i-ist+1
            x=(i-1)*dxr
            y=(j-1)*dyr
            pts (1,ii,icmpr) = xorp+x*cosr-y*sinr
            pts (2,ii,icmpr) = yorp+x*sinr+y*cosr
            irec(1,ii,icmpr) = i
            irec(2,ii,icmpr) = j
          END DO
        END DO
        numpts(icmpr)=MAX(0,2*(iend-ist+1))
        DO i=ist,iend,iend-ist
          ii=(i-ist)/(iend-ist)*(jend-jst-1)
          DO j=jst+1,jend-1
            jj=ii+j-jst+numpts(icmpr)
            x=(i-1)*dxr
            y=(j-1)*dyr
            pts (1,jj,icmpr) = xorp+x*cosr-y*sinr
            pts (2,jj,icmpr) = yorp+x*sinr+y*cosr
            irec(1,jj,icmpr) = i
            irec(2,jj,icmpr) = j
          END DO
        END DO
        numpts(icmpr)=numpts(icmpr)+MAX(0,2*(jend-jst-1))
!
! Find the source grid for receive grid points pts
!
        ierfl=0
        iptcmp=1
        CALL getsrc
(mrec,msrc,1,xshft,yshft,pts(1,1,icmpr),             &
            numpts(icmpr),irec(1,1,icmpr),igsrc(1,icmpr),ierfl,iptcmp)
        npts(icmpr)=numpts(icmpr)
        IF(npts(icmpr) == 0) change(ig)=.false.
!
      END DO
      DO icmps=1,2
        DO  icmpr=1,2
          IF(icmpr == 2.AND.samstg)THEN
! if the two components have the same staggering, simply make a copy for the
! 2nd component.
            npts(2)=npts(1)
            IF(npts(2) == 0) CYCLE
            DO ip=1,npts(2)
              pts (1,ip,2)=pts (1,ip,1)
              pts (2,ip,2)=pts (2,ip,1)
              isrc(1,ip,2)=isrc(1,ip,1)
              isrc(2,ip,2)=isrc(2,ip,1)
              irec(1,ip,2)=irec(1,ip,1)
              irec(2,ip,2)=irec(2,ip,1)
            END DO
            DO iw=1,nwhts
              DO ip=1,npts(2)
                whts(iw,ip,2)=whts(iw,ip,1)
              END DO
            END DO
            CYCLE
          END IF
          IF(npts(icmpr) == 0) CYCLE
          DO ip=1,npts(icmpr)
            pts1(1,ip,icmpr)=pts(1,ip,icmpr)
            pts1(2,ip,icmpr)=pts(2,ip,icmpr)
          END DO
!
! Calculate weights of interpolation for points pts. The points are
! stored in pts1 so that pts remained unchanged after calwht.
!
          ivsrc=ibcvar(ivtr+icmps-1)
          CALL calwht
(mrec,msrc,pts1(1,1,icmpr),isrc(1,1,icmpr),        &
                      whts(1,1,icmpr),npts(icmpr),nwhts,ivsrc,ndim)
        END DO
        IF(npts(1) == 0.AND.npts(2) == 0) CYCLE
!
! find pointer for one of the components (icmps) of the source grid
! vector. If it is packed, do uppacking for this variable.
!
        ivsrc=ibcvar(ivtr+icmps-1)
        IF(icmps == 1)THEN
          proj1=cossr
          proj2=-sinsr
        ELSE
          proj1=sinsr
          proj2=cossr
        END IF
        IF(ig == 1)THEN
          irptr1=iptr11
          irptr2=iptr12
          isptr1=iptr21
          isptr2=iptr22
        ELSE
          irptr1=iptr21
          irptr2=iptr22
          isptr1=iptr11
          isptr2=iptr12
        END IF
        IF(icmps == 1) THEN
          isptr=isptr1
        ELSE
          isptr=isptr2
        END IF
        icmpr=1
        IF(npts(icmpr) /= 0) THEN
          CALL intrpv
(              irec(1,1,icmpr),isrc(1,1,icmpr),whts(1,1,icmpr),          &
              npts(icmpr),nw1,nw2,icmps,proj1)
        END IF
        icmpr=2
        IF(npts(icmpr) /= 0) THEN
          CALL intrpv
(              irec(1,1,icmpr),isrc(1,1,icmpr),whts(1,1,icmpr),          &
              npts(icmpr),nw1,nw2,icmps,proj2)
        END IF
      END DO
    END DO
    IF(ndim == 2) THEN
      CALL retnxy
(mptr1,ivar1,1,iptr11,change(1))
      CALL retnxy
(mptr1,ivar2,1,iptr12,change(1))
      CALL retnxy
(mptr2,ivar1,1,iptr21,change(2))
      CALL retnxy
(mptr2,ivar2,1,iptr22,change(2))
    ELSE
      CALL retxyz
(mptr1,ivar1,1,iptr11,change(1))
      CALL retxyz
(mptr1,ivar2,1,iptr12,change(1))
      CALL retxyz
(mptr2,ivar1,1,iptr21,change(2))
      CALL retxyz
(mptr2,ivar2,1,iptr22,change(2))
    END IF
  END DO
  RETURN
  999   WRITE(6,'(''ERROR IN INTPV2: NZ FOR TWO GRIDS NOT EQUAL,'')')
  WRITE(6,'(''THEY WERE '',2I5,'', JOB ABORTED.'')')nzr,nzs
  STOP
END SUBROUTINE itpbv2