SUBROUTINE filgrd( mptr,msrc ) 1,15
  INCLUDE 'nodal.inc'
  INCLUDE 'agrialloc.inc'
  INCLUDE 'agrigrid.inc'
  INCLUDE 'grddsc.inc'
  INCLUDE 'agricst.inc'

  PARAMETER (lismax=200)
  INTEGER :: lisvar(lismax)
!
!-----------------------------------------------------------------------
!
!  This subroutine sets the data fields on the fine grid
!  mptr by interpolation from grid msrc.
!
!  The constants are set elsewhere.
!
!  Interpolation routines are called for each field that is to be
!  interpolated from coarse grid.
!
!  Whether a particular array needs to be initialized by interpolation,
!  is determined by parameter inixy and inixyz for 2-D and 3-D array
!  respectively.
!
!  Written by B. Skamarock and generalized by M. Xue.
!
!-----------------------------------------------------------------------
!
  IF(verbose6) WRITE(6,'(1x,a,i3,a,i3)')                                &
      'To call FILGRD to interpolate fields from grid ',msrc,           &
      ' to grid ',mptr
!
!-----------------------------------------------------------------------
!
!  Initialize 2d xy scalar arrays by interpolation
!
!-----------------------------------------------------------------------
!
  ndim = 2

  CALL inisvlst( lisvar, listno, ndim )

  IF(verbose6) THEN
    WRITE(6,'(1x,i4,i2,a)') listno,ndim,                                &
        '-D scalar variables selected to be initialized:'
    DO i = 1,listno
      WRITE(6,'(1x,a,i4)') 'ivar=',lisvar(i)
    END DO
  END IF

  IF(listno /= 0) CALL inivar( mptr,msrc,lisvar,listno,ndim )
!
!  set the t-dt fields to the values at time t
!  More accurate way is to do interpolation between t and t-dt fields.
!
  DO i=1,listno
    ivar = lisvar(i)
    ivar_dt = inixy(3,ivar)
    IF( ivar_dt /= 0 ) CALL cpyfld(mptr,ivar,ivar_dt,ndim)
  END DO
!
!-----------------------------------------------------------------------
!
!  Initialize 2d xy vector arrays by interpolation
!
!-----------------------------------------------------------------------
!
  CALL inivvlst( lisvar, listno, ndim )

  IF(verbose6) THEN
    WRITE(6,'(1x,i4,i2,a)') listno,ndim,                                &
        '-D vector variables selected to be initialized:'
    DO i = 1,listno
      WRITE(6,'(1x,a,i4)') 'ivar=',lisvar(i)
    END DO
  END IF


  IF(listno /= 0) CALL inivar( mptr,msrc,lisvar,listno,ndim )
!
!  set the t-dt fields to the values at time t
!  More accurate way is to do interpolation between t and t-dt fields.
!
  DO i=1,listno,2

    ivar = lisvar(i)
    ivar_dt = inixy(3,ivar)
    IF( ivar_dt /= 0 ) CALL cpyfld(mptr,ivar,ivar_dt,ndim)

    ivar = lisvar(i+1)
    ivar_dt = inixy(3,ivar)
    IF( ivar_dt /= 0 ) CALL cpyfld(mptr,ivar,ivar_dt,ndim)

  END DO

!
!-----------------------------------------------------------------------
!
!  Initialize 3d scalar arrays by interpolation
!
!-----------------------------------------------------------------------
!
  ndim = 3

  CALL inisvlst( lisvar, listno, ndim )

  IF(verbose6) THEN
    WRITE(6,'(1x,i4,i2,a)') listno,ndim,                                &
        '-D scalar variables selected to be initialized:'
    DO i = 1,listno
      WRITE(6,'(1x,a,i4)') 'ivar=',lisvar(i)
    END DO
  END IF

  IF(listno /= 0) CALL inivar( mptr,msrc,lisvar,listno,ndim )
!
!  set the t-dt fields to the values at time t
!  More accurate way is to do interpolation between t and t-dt fields.
!
  DO i=1,listno

    ivar = lisvar(i)
    ivar_dt = inixyz(3,ivar)
    IF( ivar_dt /= 0 ) CALL cpyfld(mptr,ivar,ivar_dt,ndim)

  END DO
!
!-----------------------------------------------------------------------
!
!  Initialize 3d vector arrays by interpolation
!
!-----------------------------------------------------------------------
!
  ndim = 3

  CALL inivvlst( lisvar, listno, ndim )

  IF(verbose6) THEN
    WRITE(6,'(1x,i4,i2,a)') listno,ndim,                                &
        '-D vector variables selected to be initialized:'
    DO i = 1,listno
      WRITE(6,'(1x,a,i4)') 'ivar=',lisvar(i)
    END DO
  END IF

  IF(listno /= 0) CALL inivar( mptr,msrc,lisvar,listno,ndim )
!
!  set the t-dt fields to the values at time t
!  More accurate way is to do interpolation between t and t-dt fields.
!
  DO i=1,listno,2

    ivar = lisvar(i)
    ivar_dt = inixyz(3,ivar)
    IF( ivar_dt /= 0 ) CALL cpyfld(mptr,ivar,ivar_dt,ndim)

    ivar = lisvar(i+1)
    ivar_dt = inixyz(3,ivar)
    IF( ivar_dt /= 0 ) CALL cpyfld(mptr,ivar,ivar_dt,ndim)

  END DO
!
!-----------------------------------------------------------------------
!
!  A number of vairables need to be initialized/defined by the user.
!  For ARPS, they include x,y,z,j1,j2,j3,wcont,rhostr and km.
!
!  Also many constants/parameters need to be set by the user for
!  the new grid.
!
!  These are done inside initngrd.
!
!-----------------------------------------------------------------------
!
  CALL initngrd(mptr,msrc)

  RETURN
END SUBROUTINE filgrd


SUBROUTINE inisvlst( lisvar, listno, ndim ) 2
!
!-----------------------------------------------------------------------
!
!  Get a list of 2d xy or 3d xyz scalar arrays that
!  need initialization by interpolation in lisvar(listno)
!
!  Author: Ming Xue
!
!-----------------------------------------------------------------------
!
  INCLUDE 'nodal.inc'
  INCLUDE 'agrialloc.inc'
  INCLUDE 'agrigrid.inc'
  INCLUDE 'grddsc.inc'

  PARAMETER (lismax=200)
  INTEGER :: lisvar(lismax)

  IF( ndim == 2 ) THEN
!
    listno = 0
    DO ivar=1,nxy2d
      IF( inixy(1,ivar) == 1 .AND. inixy(2,ivar) == 0 ) THEN
        IF( listno+1 > lismax ) GO TO 999
        listno = listno + 1
        lisvar(listno) = ivar
      END IF
    END DO

  ELSE IF( ndim == 3 ) THEN

    listno = 0
    DO ivar=1,nxyz3d
      IF( inixyz(1,ivar) == 1 .AND. inixyz(2,ivar) == 0 ) THEN
        IF( listno+1 > lismax ) GO TO 999
        listno = listno + 1
        lisvar(listno) = ivar
      END IF
    END DO

  END IF

  RETURN

  999   WRITE(6,'(1x,a,a)') 'Array lisvar in INISVLST defined too small,', &
          'Job stopped.'
END SUBROUTINE inisvlst
!


SUBROUTINE inivvlst( lisvar, listno, ndim ) 2
!
!-----------------------------------------------------------------------
!
!  Return a list of 2d xy or 3d xyz vector arrays that
!  need initialization by interpolation in lisvar(listno)
!
!-----------------------------------------------------------------------
!
  INCLUDE 'nodal.inc'
  INCLUDE 'agrialloc.inc'
  INCLUDE 'agrigrid.inc'
  INCLUDE 'grddsc.inc'

  PARAMETER (lismax=200)
  INTEGER :: lisvar(lismax)

  IF( ndim == 2 ) THEN
!
    listno = 0
    DO ivar=1,nxy2d
      IF( inixy(1,ivar) == 1 .AND. inixy(2,ivar) > 0 ) THEN
        IF( listno+2 > lismax ) GO TO 999
        listno = listno + 1
        lisvar(listno) = ivar
        listno = listno + 1
        lisvar(listno) = inixy(2,ivar)
      END IF
    END DO

  ELSE IF( ndim == 3 ) THEN

    listno = 0
    DO ivar=1,nxyz3d
      IF( inixyz(1,ivar) == 1 .AND. inixyz(2,ivar) > 0 ) THEN
        IF( listno+2 > lismax ) GO TO 999
        listno = listno + 1
        lisvar(listno) = ivar
        listno = listno + 1
        lisvar(listno) = inixyz(2,ivar)
      END IF
    END DO

  END IF


  RETURN

  999   WRITE(6,'(1x,a,a)') 'Array lisvar in INIVVLST defined too small,', &
          'Job stopped.'
  STOP

END SUBROUTINE inivvlst