!
!##################################################################
!##################################################################
!######                                                      ######
!######                  SUBROUTINE getwrfd                  ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE getwrfd(fHndl,io_form,multifile,ncmprx,ncmpry,itime,timestr, & 2,9
                   nx_ext,ny_ext,nz_ext,nzsoil_ext,                     &
                   iproj_ext,scale_ext,trlon_ext,latnot_ext,            &
                   ctrlat_ext,ctrlon_ext,dx_ext,dy_ext,x0_ext,y0_ext,   &
                   sfcphys,mp_physics,                                  &
                   lat_ext,lon_ext,latu_ext,lonu_ext,latv_ext,lonv_ext, &
                   zp_ext,hgt_ext,zpsoil_ext, p_ext,t_ext,              &
                   u_ext,v_ext,w_ext,                                   &
                   qv_ext,qc_ext,qr_ext,qi_ext,qs_ext,qh_ext,           &
                   tsoil_ext,qsoil_ext,wetcanp_ext,                     &
                   snowdpth_ext,trn_ext,soiltyp_ext,vegtyp_ext,veg_ext, &
                   raing_ext,rainc_ext,                                 &
                   tem1_ext,tem2_ext,tem2d1,tem2d2,tem2di,              &
                   istatus)

!------------------------------------------------------------------------
!
!  PURPOSE:
!
!  Read in WRF data in one time level (itime) from the opened NetCDF
!  file (fHndl) and convert those data to ARPS units if needed.
!
!------------------------------------------------------------------------
!
!  AUTHOR:
!  Yunheng Wang (12/29/2003)
!
!  MODIFICATION HISTORY:
!
!  2004-02-17 Richard Carpenter
!  Revised vegetation table.
!
!  2004-02-17 Gene Bassett
!  Revised snow and precip parameters.
!
!  03/25/2004 Yunheng Wang
!  Rewrote for message passing mode.  
!
!------------------------------------------------------------------------
  IMPLICIT NONE

  INTEGER,      INTENT(IN)  :: ncmprx, ncmpry
  INTEGER,      INTENT(IN)  :: fHndl(ncmprx,ncmpry)
  INTEGER,      INTENT(IN)  :: io_form      ! 5 - PHDF5
                                            ! 7 - NetCDF
  LOGICAL,      INTENT(IN)  :: multifile
  INTEGER,      INTENT(IN)  :: itime   ! Recorder number
  CHARACTER(*), INTENT(IN)  :: timestr
  INTEGER, INTENT(IN)  :: nx_ext       !
  INTEGER, INTENT(IN)  :: ny_ext       !
  INTEGER, INTENT(IN)  :: nz_ext       !
  INTEGER, INTENT(IN)  :: nzsoil_ext   ! WRF soil layers
                                       ! Note: it is the actual WRF soil layers
                                       !       plus the data at surface.

  INTEGER, INTENT(IN)  :: iproj_ext    ! Map projection option
                                       ! = 1, polar projection;
                                       ! = 2, Lambert projection;
                                       ! = 3, Mercator projection.
  REAL,    INTENT(IN)  :: scale_ext    ! Map scale factor (should be 1.0)
  REAL,    INTENT(IN)  :: trlon_ext    ! True longitude
  REAL,    INTENT(IN)  :: latnot_ext(2)! True latitude
  REAL,    INTENT(IN)  :: ctrlon_ext, ctrlat_ext
  REAL,    INTENT(IN)  :: dx_ext,dy_ext
  INTEGER, INTENT(IN)  :: sfcphys         ! WRF surface physics option
  INTEGER, INTENT(IN)  :: mp_physics

  REAL,    INTENT(OUT) :: x0_ext
  REAL,    INTENT(OUT) :: y0_ext
  REAL,    INTENT(OUT) :: lat_ext (nx_ext,ny_ext)
  REAL,    INTENT(OUT) :: lon_ext (nx_ext,ny_ext)
  REAL,    INTENT(OUT) :: latu_ext(nx_ext,ny_ext)
  REAL,    INTENT(OUT) :: lonu_ext(nx_ext,ny_ext)
  REAL,    INTENT(OUT) :: latv_ext(nx_ext,ny_ext)
  REAL,    INTENT(OUT) :: lonv_ext(nx_ext,ny_ext)
  REAL,    INTENT(OUT) :: zp_ext  (nx_ext,ny_ext,nz_ext)  
                                       ! physical height (m) at W points
  REAL,    INTENT(OUT) :: hgt_ext (nx_ext,ny_ext,nz_ext)  
                                       ! Physical height (m) at scalar points
  REAL,    INTENT(OUT) :: zpsoil_ext(nx_ext,ny_ext,nzsoil_ext)
  REAL,    INTENT(OUT) :: p_ext   (nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT) :: t_ext   (nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT) :: qv_ext  (nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT) :: u_ext   (nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT) :: v_ext   (nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT) :: w_ext   (nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT) :: qc_ext(nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT) :: qr_ext(nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT) :: qi_ext(nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT) :: qs_ext(nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT) :: qh_ext(nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT) :: tsoil_ext  (nx_ext,ny_ext,nzsoil_ext)
  REAL,    INTENT(OUT) :: qsoil_ext  (nx_ext,ny_ext,nzsoil_ext)
  REAL,    INTENT(OUT) :: wetcanp_ext(nx_ext,ny_ext)
  REAL,    INTENT(OUT) :: snowdpth_ext(nx_ext,ny_ext)
  REAL,    INTENT(OUT) :: raing_ext   (nx_ext,ny_ext)
                              ! PBL time-step total precipitation (mm)
                              ! whether is it "raing" in ARPS????
  REAL,    INTENT(OUT) :: rainc_ext   (nx_ext,ny_ext)
                              ! time-step cumulus precipitation (mm)
  REAL,    INTENT(OUT) :: trn_ext     (nx_ext,ny_ext)
  INTEGER, INTENT(OUT) :: soiltyp_ext (nx_ext,ny_ext)
  INTEGER, INTENT(OUT) :: vegtyp_ext  (nx_ext,ny_ext)
  REAL,    INTENT(OUT) :: veg_ext     (nx_ext,ny_ext)

  REAL,    INTENT(INOUT) :: tem1_ext (nx_ext,  ny_ext,  nz_ext)
  REAL,    INTENT(INOUT) :: tem2_ext (nx_ext,  ny_ext,  nz_ext)
  REAL,    INTENT(INOUT) :: tem2d1   (nx_ext,  ny_ext)
  REAL,    INTENT(INOUT) :: tem2d2   (nx_ext,  ny_ext)
  INTEGER, INTENT(INOUT) :: tem2di   (nx_ext,  ny_ext)
  INTEGER, INTENT(OUT) :: istatus
 
!------------------------------------------------------------------------
!
!  Include files
!
!------------------------------------------------------------------

  INCLUDE 'mp.inc'

!------------------------------------------------------------------------
!
!  Misc. local variables
!
!------------------------------------------------------------------

  INTEGER  :: nxlg_ext, nylg_ext
  INTEGER  :: nxd, nyd, nzd            ! dimensions in data file
  INTEGER  :: nxd_stag, nyd_stag, nzd_stag

  INTEGER  :: iproj_orig
  REAL     :: scale_orig
  REAL     :: latnot_orig(2)
  REAL     :: trlon_orig
  REAL     :: x0_orig, y0_orig
  REAL     :: xsub0,ysub0

  REAL, ALLOCATABLE :: x_ext(:)
  REAL, ALLOCATABLE :: y_ext(:)
  REAL, ALLOCATABLE :: xsc_ext(:)
  REAL, ALLOCATABLE :: ysc_ext(:)

  REAL, ALLOCATABLE :: temlg1(:,:,:)
  REAL, ALLOCATABLE :: temlg2(:,:,:)

  REAL, PARAMETER  :: epsl = 10E-2
  REAL, PARAMETER  :: grav = 9.81
  REAL, PARAMETER  :: rd   = 287.0
  REAL, PARAMETER  :: cp   = 1004.0        
                      ! Specific heat of dry air at constant pressure
                      ! (m**2/(s**2*K)).
  REAL, PARAMETER  :: p0   = 1.0E5     
                      ! Surface reference pressure, is 100000 Pascal.
  REAL, PARAMETER  :: rddcp= rd/cp 
  REAL, PARAMETER  :: govrd = grav/rd

!
! These two tables are needed to convert WRF soil and vegetation index
! to those used in ARPS, althought they may not correspond each other
! one to one.
! 
! WRF uses 16 soil categories and 24-category (USGS) vegetation
! ARPS uses 13-category soil  and 14-category (ND) vegetation
!
! The following two tables were provided by Jerry Brotzge on Oct. 20, 2003
!
  INTEGER, PARAMETER :: soil_table(17) = (/ 1, 2, 3, 4, 4,              &
                                            5, 6, 7, 8, 9,              &
                                           10,11, 6,13, 1,              &
                                            2, 2/)

! WDT RLC 2004-02-12 Changed veg_table(1)/Urban from 7/EvgrnForest to 1/Desert 
! WDT RLC 2004-02-12 Changed veg_table(25)/Playa from 10/Cultiv to 1/Desert 
! WDT RLC 2004-02-12 Added veg_table(26:27)
! WDT RLC 2004-02-16 Not accepting CAPS changes:
                     ! WYH - (01.16.2004) veg_table(18) = 11 =>  8
                     !                    veg_table(19) = 1  => 13
  !INTEGER, PARAMETER :: veg_table(25)  = (/ 7,10,10,10,10,              &
  !                                          5, 3,12, 4,12,              &
  !                                          6, 6, 7, 7, 6,              &
  !                                         14,11,11, 1, 2,              &
  !                                          2, 2, 2, 9,10/)
  INTEGER, PARAMETER :: veg_table(27)  = (/ 1,10,10,10,10,              &
                                            5, 3,12, 4,12,              &
                                            6, 6, 7, 7, 6,              &
                                           14,11,11, 1, 2,              &
                                            2, 2, 2, 9, 1,              &
                                            1, 1/)
  !
  ! When the variable does not exist in the NetCDF file, this constant
  ! should be return in variable "istatus" of the calling subroutine.
  !
  INTEGER, PARAMETER :: VAR_NOTEXIST = -1
  INTEGER, PARAMETER :: WRF_REAL     = 104
  INTEGER, PARAMETER :: WRF_INTEGER  = 106
  
  REAL               :: tvbot, tvtop, tvbar
  REAL               :: xctr,yctr
  INTEGER            :: i,j,k

  REAL               :: dzs(nzsoil_ext) ! WRF soil depths
  LOGICAL            :: warned

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  warned = .FALSE.

  ! remember the map projection paramters which should be restored 
  ! before return

  CALL getmapr(iproj_orig,scale_orig,latnot_orig,                       &
               trlon_orig,x0_orig,y0_orig)

!-----------------------------------------------------------------------
!
! Allocate working arrays
!
!-----------------------------------------------------------------------

  nxlg_ext = (nx_ext-1)*nproc_x + 1
  nylg_ext = (ny_ext-1)*nproc_y + 1
 
  nzd      = nz_ext - 1
  nzd_stag = nz_ext

  IF (mp_opt > 0 .AND. multifile) THEN
    nxd = (nx_ext - 1)/ncmprx
    nyd = (ny_ext - 1)/ncmpry
    nxd_stag = nxd
    nyd_stag = nyd
    IF (loc_x == nproc_x) nxd_stag = nxd + 1
    IF (loc_y == nproc_y) nyd_stag = nyd + 1

    ALLOCATE(temlg2(1,1,1),   STAT = istatus)  ! do not use it
  ELSE
    nxd = nxlg_ext - 1        
    nyd = nylg_ext - 1
    nxd_stag = nxlg_ext
    nyd_stag = nylg_ext

    ALLOCATE(temlg2(nxlg_ext,nylg_ext,nz_ext),   STAT = istatus)
  END IF

  ALLOCATE(temlg1(nxd_stag, nyd_stag, nzd_stag), STAT = istatus)

!-----------------------------------------------------------------------
!
! Set up WRF map projection
!
!-----------------------------------------------------------------------
  
  ALLOCATE(x_ext(nx_ext),   STAT = istatus)
  ALLOCATE(y_ext(ny_ext),   STAT = istatus)
  ALLOCATE(xsc_ext(nx_ext), STAT = istatus)
  ALLOCATE(ysc_ext(ny_ext), STAT = istatus)

  CALL setmapr(iproj_ext,scale_ext,latnot_ext,trlon_ext)
  CALL lltoxy(1,1,ctrlat_ext,ctrlon_ext,xctr,yctr)
  x0_ext=xctr - 0.5*nproc_x*(nx_ext-1)*dx_ext
  y0_ext=yctr - 0.5*nproc_y*(ny_ext-1)*dy_ext
  CALL setorig(1,x0_ext,y0_ext)

  xsub0 = dx_ext*(nx_ext-1)*(loc_x-1)
  ysub0 = dy_ext*(ny_ext-1)*(loc_y-1)

  DO i=1,nx_ext
    x_ext(i)= xsub0 + (i-1)*dx_ext
  END DO
  DO j=1,ny_ext
    y_ext(j)= ysub0 + (j-1)*dy_ext
  END DO

  DO i=1,nx_ext-1
    xsc_ext(i)=0.5*(x_ext(i)+x_ext(i+1))
  END DO
  xsc_ext(nx_ext)=2.*xsc_ext(nx_ext-1)-xsc_ext(nx_ext-2)
  DO j=1,ny_ext-1
    ysc_ext(j)=0.5*(y_ext(j)+y_ext(j+1))
  END DO
  ysc_ext(ny_ext)=2.*ysc_ext(ny_ext-1)-ysc_ext(ny_ext-2)

  CALL xytoll(nx_ext,ny_ext,xsc_ext,ysc_ext, lat_ext,lon_ext)
  CALL xytoll(nx_ext,ny_ext,  x_ext,ysc_ext,latu_ext,lonu_ext)
  CALL xytoll(nx_ext,ny_ext,xsc_ext,  y_ext,latv_ext,lonv_ext)

  DEALLOCATE(x_ext,y_ext)
  DEALLOCATE(xsc_ext,ysc_ext)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LU_INDEX',WRF_REAL,'XY ',' ',       &
                     'west_east','sout_north',' ',nx_ext,ny_ext,1,      &
                     nxd,nyd,1,temlg1,istatus)

!-----------------------------------------------------------------------
!
!  Horizontal wind
!
!-----------------------------------------------------------------------

  CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,               &
                   timestr,itime,1,'U','X',                             &
                   'west_east_stag','south_north','bottom_top',         &
                   nx_ext,    ny_ext,    nz_ext,  u_ext,                &
                   nxd_stag,  nyd,       nzd,     temlg1,               &
                   nxlg_ext,  nylg_ext,  nz_ext,  temlg2, istatus)

  CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,               &
                   timestr,itime,1,'V','Y',                             &
                   'west_east','south_north_stag','bottom_top',         &
                   nx_ext,    ny_ext,    nz_ext,  v_ext,                &
                   nxd,       nyd_stag,  nzd,     temlg1,               &
                   nxlg_ext,  nylg_ext,  nz_ext,  temlg2, istatus)
  
!-----------------------------------------------------------------------
!
! Vertical velocity
!
!-----------------------------------------------------------------------

  CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,               &
                   timestr,itime,1,'W','Z',                             &
                   'west_east','south_north','bottom_top_stag',         &
                   nx_ext,    ny_ext,    nz_ext,  w_ext,                &
                   nxd,       nyd,       nzd_stag,temlg1,               &
                   nxlg_ext,  nylg_ext,  nz_ext,  temlg2, istatus)

!-----------------------------------------------------------------------
!
! Physical height
!
!-----------------------------------------------------------------------

  CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,               &
                   timestr,itime,1,'PH','Z',                            &
                   'west_east','south_north','bottom_top_stag',         &
                   nx_ext,    ny_ext,    nz_ext,  zp_ext,               &
                   nxd,       nyd,       nzd_stag,temlg1,               &
                   nxlg_ext,  nylg_ext,  nz_ext,  temlg2,istatus)

  CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,               &
                   timestr,itime,1,'PHB','Z',                           &
                   'west_east','south_north','bottom_top_stag',         &
                   nx_ext,   ny_ext,    nz_ext,  tem1_ext,              &
                   nxd,      nyd,       nzd_stag,temlg1,                &
                   nxlg_ext, nylg_ext,  nz_ext,  temlg2,istatus)

  zp_ext(:,:,:) = ( zp_ext(:,:,:) + tem1_ext(:,:,:) )/grav

!
!  Move zp_ext field onto the scalar layers.
!
  DO k=1,nz_ext-1
    DO j=1,ny_ext
      DO i=1,nx_ext
        hgt_ext(i,j,k)=0.5*(zp_ext(i,j,k)+zp_ext(i,j,k+1))
      END DO
    END DO
  END DO
  DO j=1,ny_ext
    DO i=1,nx_ext
      hgt_ext(i,j,nz_ext)=(2.*hgt_ext(i,j,nz_ext-1))                    &
                             -hgt_ext(i,j,nz_ext-2)
    END DO
  END DO

!-----------------------------------------------------------------------
!
! Read potential temperature and convert to temperature
!
!-----------------------------------------------------------------------

  CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,               &
                   timestr,itime,1,'T','',                              &
                   'west_east','south_north','bottom_top',              &
                   nx_ext,    ny_ext,    nz_ext,  t_ext,                &
                   nxd,       nyd,       nzd,     temlg1,               &
                   nxlg_ext,  nylg_ext,  nz_ext,  temlg2,istatus)

!-----------------------------------------------------------------------
!
! Dummy arrays
!
!-----------------------------------------------------------------------

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'MU',                                &
                     WRF_REAL,'XY ',' ','west_east','south_north',' ',  &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'MUB',                               &
                     WRF_REAL,'XY ',' ','west_east','south_north',' ',  &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'NEST_POS',                          &
                     WRF_REAL,'XY ',' ','west_east','south_north',' ',  &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

!-----------------------------------------------------------------------
!
! Pressure
!
!-----------------------------------------------------------------------

  CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,               &
                   timestr,itime,1,'P','',                              &
                   'west_east','south_north','bottom_top',              &
                   nx_ext,    ny_ext,    nz_ext,  p_ext,                &
                   nxd,       nyd,       nzd,     temlg1,               &
                   nxlg_ext,  nylg_ext,  nz_ext,  temlg2,istatus)

  CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,               &
                   timestr,itime,1,'PB','',                             &
                   'west_east','south_north','bottom_top',              &
                   nx_ext,   ny_ext,   nz_ext,  tem1_ext,               &
                   nxd,      nyd,      nzd,     temlg1,                 &
                   nxlg_ext, nylg_ext, nz_ext,  temlg2,istatus)

  p_ext(:,:,:) = p_ext(:,:,:) + tem1_ext(:,:,:)

!-----------------------------------------------------------------------
!
! Convert potential temperature to temperature
!
!-----------------------------------------------------------------------

  t_ext(:,:,:) = (t_ext(:,:,:) + 300.) * ((p_ext(:,:,:)/p0)**rddcp)

!-----------------------------------------------------------------------
!
! Dummy arrays
!
!-----------------------------------------------------------------------

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'FNM',WRF_REAL,'Z',' ',              &
                     'bottom_top',' ',' ',                              &
                     nz_ext,1,1,nzd,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'FNP',WRF_REAL,'Z',' ',              &
                     'bottom_top',' ',' ',                              &
                     nz_ext,1,1,nzd,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'RDNW',WRF_REAL,'Z',' ',             &
                     'bottom_top',' ',' ',                              &
                     nz_ext,1,1,nzd,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'RDN',                               &
                     WRF_REAL,'Z',' ','bottom_top',' ',' ',             &
                     nz_ext,1,1,nzd,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'DNW',                               &
                     WRF_REAL,'Z',' ','bottom_top',' ',' ',             &
                     nz_ext,1,1,nzd,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'DN',                                &
                     WRF_REAL,'Z',' ','bottom_top',' ',' ',             &
                     nz_ext,1,1,nzd,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'ZNU',                               &
                     WRF_REAL,'Z',' ','bottom_top',' ',' ',             &
                     nz_ext,1,1,nzd,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'ZNW',                               &
                     WRF_REAL,'Z','Z','bottom_top_stag',' ',' ',        &
                     nz_ext,1,1,nzd_stag,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'CFN',                               &
                     WRF_REAL,'0',' ',' ',' ',' ',                      &
                     1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'CFN1',                              &
                     WRF_REAL,'0',' ',' ',' ',' ',                      &
                     1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'EPSTS',                             &
                     WRF_REAL,'0',' ',' ',' ',' ',                      &
                     1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'Q2',WRF_REAL,'XY',' ',              &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'T2',WRF_REAL,'XY',' ',              &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'TH2',WRF_REAL,'XY',' ',             &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'PSFC',WRF_REAL,'XY',' ',            &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'U10',WRF_REAL,'XY',' ',             &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'V10',WRF_REAL,'XY',' ',             &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'RDX',WRF_REAL,'0',' ',              &
                     ' ',' ',' ',                                       &
                     1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'RDY',WRF_REAL,'0',' ',              &
                     ' ',' ',' ',                                       &
                     1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'RESM',WRF_REAL,'0',' ',             &
                     ' ',' ',' ',                                       &
                     1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'ZETATOP',WRF_REAL, '0',' ',         &
                     ' ',' ',' ',                                       &
                     1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'CF1',WRF_REAL,'0',' ',              &
                     ' ',' ',' ',                                       &
                     1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'CF2',WRF_REAL,'0',' ',              &
                     ' ',' ',' ',                                       &
                     1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,timestr,itime,'CF3',       &
                     WRF_REAL,'0',' ',' ',' ',' ',                      &
                     1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,timestr,itime,'ITIMESTEP', &
                     WRF_INTEGER,'0',' ',' ',' ',' ',                   &
                     1,1,1,1,1,1,temlg1,istatus)

!-----------------------------------------------------------------------
!
! Read water vapor mixing ratio and Convert to specific humidity
!
!-----------------------------------------------------------------------

  CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,timestr,itime,1,'QVAPOR','', &
                   'west_east','south_north','bottom_top',              &
                   nx_ext,   ny_ext,   nz_ext, qv_ext,                  &
                   nxd,      nyd,      nzd,    temlg1,                  &
                   nxlg_ext, nylg_ext, nz_ext, temlg2, istatus)

  qv_ext(:,:,:) = qv_ext(:,:,:)/(1+qv_ext(:,:,:))

  WHERE(qv_ext < 0.0) qv_ext = 0.0
  WHERE(qv_ext > 1.0) qv_ext = 1.0

!-----------------------------------------------------------------------
!
!  Make top and bottom mass fields via hydrostatic extrapolation.
!
!-----------------------------------------------------------------------
!
  DO j=1,ny_ext
    DO i=1,nx_ext

      t_ext(i,j,1)=2.*t_ext(i,j,2)-t_ext(i,j,3)
      tvbot=t_ext(i,j,1) * ( 1.0 + 0.608*qv_ext(i,j,1) )
      tvtop=t_ext(i,j,2) * ( 1.0 + 0.608*qv_ext(i,j,2) )
      tvbar=0.5*(tvtop+tvbot)
      p_ext(i,j,1)= p_ext(i,j,2)                                        &
                   *EXP(govrd*(hgt_ext(i,j,2)-hgt_ext(i,j,1))/tvbar)

      t_ext(i,j,nz_ext)=2.*t_ext(i,j,nz_ext-1)-t_ext(i,j,nz_ext-2)
      tvbot=t_ext(i,j,nz_ext-1)*(1.0 + 0.608*qv_ext(i,j,nz_ext-1))
      tvtop=t_ext(i,j,nz_ext)  *(1.0 + 0.608*qv_ext(i,j,nz_ext))
      tvbar=0.5*(tvtop+tvbot)
      p_ext(i,j,nz_ext)= p_ext(i,j,nz_ext-1)                            &
                        *EXP(govrd*(hgt_ext(i,j,nz_ext-1)-              &
                             hgt_ext(i,j,nz_ext))/tvbar)
    END DO
  END DO

!-----------------------------------------------------------------------
!
! From WRF Registry
!
!   passiveqv     mp_physics==0     -        moist:qv
!   kesslerscheme mp_physics==1     -        moist:qv,qc,qr
!   linscheme     mp_physics==2     -        moist:qv,qc,qr,qi,qs,qg
!   wsm3scheme    mp_physics==3     -        moist:qv,qc,qr
!   wsm5scheme    mp_physics==4     -        moist:qv,qc,qr,qi,qs
!   etampnew      mp_physics==5     -        moist:qv,qc
!   wsm6scheme    mp_physics==6     -        moist:qv,qc,qr,qi,qs,qg
!   ncepcloud3    mp_physics==98    -        moist:qv,qc,qr
!   ncepcloud5    mp_physics==99    -        moist:qv,qc,qr,qi,qs
!
!-----------------------------------------------------------------------
!
! Cloud water vapor mixing ratio
!
!-----------------------------------------------------------------------

  IF (mp_physics /= 0) THEN

    CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,1,'QCLOUD','',                       &
                     'west_east','south_north','bottom_top',            &
                     nx_ext,    ny_ext,    nz_ext,  qc_ext,             &
                     nxd,       nyd,       nzd,     temlg1,             &
                     nxlg_ext,  nylg_ext,  nz_ext,  temlg2,istatus)

    WHERE(qc_ext < 0.0) qc_ext = 0.0
    WHERE(qc_ext > 1.0) qc_ext = 1.0

  ELSE           ! QCLOUD does not exist in the dataset
    qc_ext = -999.0
  END IF

!-----------------------------------------------------------------------
!
! Rain water vapor mixing ratio
!
!-----------------------------------------------------------------------

  IF (mp_physics /= 0 .AND. mp_physics /= 5 ) THEN

    CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,1,'QRAIN','',                        &
                     'west_east','south_north','bottom_top',            &
                     nx_ext,    ny_ext,    nz_ext,  qr_ext,             &
                     nxd,       nyd,       nzd,     temlg1,             &
                     nxlg_ext,  nylg_ext,  nz_ext,  temlg2, istatus)

    WHERE(qr_ext < 0.0) qr_ext = 0.0
    WHERE(qr_ext > 1.0) qr_ext = 1.0

  ELSE ! QRAIN does not exist in the dataset
    qr_ext = -999.0
  END IF

!-----------------------------------------------------------------------
!
! Ice vapor mixing ratio
!
!-----------------------------------------------------------------------

  IF (mp_physics == 2 .OR. mp_physics == 4 .OR. mp_physics == 6 .OR.    &
      mp_physics == 99 ) THEN

    CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                   timestr,itime,1,'QICE','',                           &
                   'west_east','south_north','bottom_top',              &
                   nx_ext,    ny_ext,    nz_ext,  qi_ext,               &
                   nxd,       nyd,       nzd,     temlg1,               &
                   nxlg_ext,  nylg_ext,  nz_ext,  temlg2, istatus)

    WHERE(qi_ext < 0.0) qi_ext = 0.0
    WHERE(qi_ext > 1.0) qi_ext = 1.0

  ELSE      ! QICE does not exist in the dataset
    qi_ext = -999.0
  END IF

!-----------------------------------------------------------------------
!
! Snow vapor mixing ratio
!
!-----------------------------------------------------------------------

  IF (mp_physics == 2 .OR. mp_physics == 4 .OR. mp_physics == 6 .OR.    &
      mp_physics == 99 ) THEN

    CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,1,'QSNOW','',                        &
                     'west_east','south_north','bottom_top',            &
                     nx_ext,    ny_ext,    nz_ext,  qs_ext,             &
                     nxd,       nyd,       nzd,     temlg1,             &
                     nxlg_ext,  nylg_ext,  nz_ext,  temlg2, istatus)

    WHERE(qs_ext < 0.0) qs_ext = 0.0
    WHERE(qs_ext > 1.0) qs_ext = 1.0

  ELSE      ! QSNOW does not exist in the dataset
    qs_ext = -999.0
  END IF

!-----------------------------------------------------------------------
!
! Hail vapor mixing ratio
!
!-----------------------------------------------------------------------

  IF (mp_physics == 2 .OR. mp_physics == 6 ) THEN

    CALL  get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,1,'QGRAUP','',                       &
                     'west_east','south_north','bottom_top',            &
                     nx_ext,    ny_ext,    nz_ext,  qh_ext,             &
                     nxd,       nyd,       nzd,     temlg1,             &
                     nxlg_ext,  nylg_ext,  nz_ext,  temlg2, istatus)

    WHERE(qh_ext < 0.0) qh_ext = 0.0
    WHERE(qh_ext > 1.0) qh_ext = 1.0

  ELSE    ! QGRAUP does not exist in the dataset
    qh_ext = -999.0
  END IF

  !
  ! Get Land mask
  !
  CALL get_wrf_2d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,1,'LANDMASK','',                        &
                  'west_east','south_north',                            & 
                  nx_ext,ny_ext,tem1_ext(:,:,1),nxd,nyd,temlg1,         &
                  nxlg_ext,nylg_ext,temlg2,istatus)

!-----------------------------------------------------------------------
!
! Soil temperature
!
! NOTE: the shape of "temlg1" has been changed below.
!
!-----------------------------------------------------------------------

  CALL get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,1,'TSLB','Z',                           &
                  'west_east','south_north','soil_layers_stag',         &
                  nx_ext,   ny_ext,   nzsoil_ext-1,tsoil_ext(:,:,2),    &
                  nxd,      nyd,      nzsoil_ext-1,temlg1,              &
                  nxlg_ext, nylg_ext, nzsoil_ext-1,temlg2, istatus)
!
!-----------------------------------------------------------------------
!
! Soil depth
!
!-----------------------------------------------------------------------

  CALL get_wrf_1d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,'ZS','Z',                               &
                  'soil_layers_stag',nzsoil_ext-1,dzs,nzsoil_ext-1,istatus)

  DO k = 2, nzsoil_ext
    zpsoil_ext(:,:,k) = dzs(k-1)
  END DO
  zpsoil_ext(:,:,1) = 0.0 

  !
  ! Do some checking
  !
  IF(sfcphys == 1) THEN
    IF(nzsoil_ext /= 6) THEN
      WRITE(6,'(/a/)')'================= WARNING ======================'
      WRITE(6,'(2(a,I2),a/,a)') 'Number of soil layers (',nzsoil_ext-1, &
                 ') is not the WRF default for sf_surface_physics =',   &
                 sfcphys,'.','Expecting soil_layers_stag = 5.'
      WRITE(6,'(/a/)')'================= WARNING ======================'
    END IF
  ELSE IF(sfcphys == 2) THEN
    IF(nzsoil_ext /= 5) THEN
      WRITE(6,'(/a/)')'================= WARNING ======================'
      WRITE(6,'(2(a,I2),a/,a)') 'Number of soil layers (',nzsoil_ext-1, &
                 ') is not the WRF default for sf_surface_physics =',   &
                 sfcphys,'.',' Expecting soil_layers_stag = 4.'
      WRITE(6,'(/a/)')'================= WARNING ======================'
    END IF
  ELSE IF(sfcphys == 3) THEN
    !
    ! When do interpolation, we may need to discard the first layer
    ! because of duplication
    !
    IF(nzsoil_ext /= 7) THEN
      WRITE(6,'(/a/)')'================= WARNING ======================'
      WRITE(6,'(2(a,I2),a/,a)') 'Number of soil layers (',nzsoil_ext-1, &
                 ') is not the WRF default for sf_surface_physics = ',  &
                 sfcphys,'.','Expecting soil_layers_stag = 6.'
      WRITE(6,'(/a/)')'================= WARNING ======================'
    END IF
  ELSE
    WRITE(6,'(/a/)')'================= WARNING ======================'
    WRITE(6,'(a,I2,a/,a)') 'sf_surface_physics has wrong number = ',    &
          sfcphys, '.','Must be 1, 2 or 3. Please check your data file.'
    WRITE(6,'(/a/)')'================= WARNING ======================'
  END IF

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'DZS',WRF_REAL,'Z','Z',              &
                     'soil_layers_stag',' ',' ',                        &
                     nzsoil_ext-1,1,1,nzsoil_ext-1,1,1,temlg1,istatus)

!-----------------------------------------------------------------------
!
! Soil moisture  (? fraction (m*3/m*3)
!
!-----------------------------------------------------------------------
!
  CALL get_wrf_3d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,1,'SMOIS','Z',                          &
                  'west_east','south_north','soil_layers_stag',         &
                  nx_ext,   ny_ext,  nzsoil_ext-1, qsoil_ext(:,:,2),    &
                  nxd,      nyd,     nzsoil_ext-1, temlg1,              &
                  nxlg_ext, nylg_ext,nzsoil_ext-1, temlg2, istatus)

!-----------------------------------------------------------------------
!
! Dummy arrays
!
!-----------------------------------------------------------------------

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'SH2O',WRF_REAL,'XZY','Z',           &
                     'west_east','south_north','soil_layers_stag',      &
                     nx_ext,ny_ext,nzsoil_ext-1,                        &
                     nxd,nyd,nzsoil_ext-1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'XICE',WRF_REAL,'XY',' ',            &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'SFROFF',WRF_REAL,'XY',' ',          &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'UDROFF',WRF_REAL,'XY',' ',          &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

!-----------------------------------------------------------------------
!
!  Vegatation type
!
!-----------------------------------------------------------------------
!
  CALL get_wrf_2di(fHndl,io_form,multifile,ncmprx,ncmpry,               &
                  timestr,itime,1,'IVGTYP','',                          &
                  'west_east','south_north',nx_ext,ny_ext,tem2di,       &
                  nxd,nyd,temlg1,nxlg_ext,nylg_ext,temlg2,istatus)  
                                         ! temlg? used as INTEGER inside

  IF (ANY(tem2di<=0)) THEN
    WRITE(6,'(/a/)')'================= WARNING ======================'
    WRITE(6,'(a)') 'Find 0s for WRF IVGTYP.'
    WRITE(6,'(/a/)')'================= WARNING ======================'
    vegtyp_ext(:,:) = 0
  ELSE
    DO j = 1, ny_ext
      DO i = 1,nx_ext
        vegtyp_ext(i,j) = veg_table(tem2di(i,j)) 
      END DO
    END DO
  END IF
!
!-----------------------------------------------------------------------
!
!  Soil type
!
!-----------------------------------------------------------------------
!
  CALL get_wrf_2di(fHndl,io_form,multifile,ncmprx,ncmpry,               &
                  timestr,itime,1,'ISLTYP','',                          &
                  'west_east','south_north',nx_ext,ny_ext,tem2di,       &
                  nxd,nyd,temlg1,nxlg_ext,nylg_ext,temlg2,istatus)  
                                        ! temlg? used as INTEGER inside

  IF (ANY(tem2di<=0)) THEN
    WRITE(6,'(/a/)')'================= WARNING ======================'
    WRITE(6,'(a)') 'Find 0s for WRF ISLTYP.'
    WRITE(6,'(/a/)')'================= WARNING ======================'
    vegtyp_ext(:,:) = 0
  ELSE
    DO j = 1, ny_ext
      DO i = 1,nx_ext
        soiltyp_ext(i,j) = soil_table(tem2di(i,j)) 
      END DO
    END DO
  END IF
!
!-----------------------------------------------------------------------
!
!  Vegetation Fraction
!
!-----------------------------------------------------------------------
!
  CALL get_wrf_2d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,1,'VEGFRA','',                          &
                  'west_east','south_north',nx_ext,ny_ext,veg_ext,      &
                  nxd,nyd,temlg1,nxlg_ext,nylg_ext,temlg2,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'GRDFLX',WRF_REAL,'XY',' ',          &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

!
!-----------------------------------------------------------------------
!
! Accumulated snow depth (meter)
!
!-----------------------------------------------------------------------

  CALL get_wrf_2d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,1,'SNOW','',                            &
                  'west_east','south_north',nx_ext,ny_ext,snowdpth_ext, &
                  nxd,nyd,temlg1,nxlg_ext,nylg_ext,temlg2,istatus)

  ! Convert water equiv. of accum. snow depth (kg/m**2) to meters
  ! (where 1 meter liquid water is set equivqlent to 10 meters snow).
  !        0.01 = 10. (m snow/m liquid) / (1000 kg/m**3)
  !snowdpth_ext(i,j) = 0.01 * snowdpth_ext(i,j) 

  DO j = 1,ny_ext
    DO i = 1,nx_ext
      snowdpth_ext(i,j) = 0.01*snowdpth_ext(i,j)
    END DO
  END DO

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'SNOWH',WRF_REAL,'XY',' ',           &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

!-----------------------------------------------------------------------
!
! Canopy water amount (What should be the units in WRF? "kg m{-2}")
! (mm = kg m{-2}, magnitude 2-3 mm according to Jerry)
!
!-----------------------------------------------------------------------

  CALL get_wrf_2d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,1,'CANWAT','',                          &
                  'west_east','south_north',nx_ext,ny_ext,wetcanp_ext,  &
                  nxd,nyd,temlg1,nxlg_ext,nylg_ext,temlg2,istatus)

!
! NOTE: tem1_ext, tem2d1, tem2d2 used as temporary arrays below
!       tem1_ext(:,:,1)     - land mask
!       tem2d1     - Surface skin temperature
!       tem2d2     - SST
!

!
! Get SST
!
  CALL get_wrf_2d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,1,'SST','',                             &
                  'west_east','south_north',nx_ext,ny_ext,tem2d2,       &
                  nxd,nyd,temlg1,nxlg_ext,nylg_ext,temlg2,istatus)

!-----------------------------------------------------------------------
!
! Dummy arrays
!
!-----------------------------------------------------------------------

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'MAPFAC_M',WRF_REAL,'XY',' ',        &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'MAPFAC_U',WRF_REAL,'XY','X',        &
                     'west_east_stag','south_north',' ',                &
                     nx_ext,ny_ext,1,nxd_stag,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'MAPFAC_V',WRF_REAL,'XY','Y',        &
                     'west_east','south_north_stag',' ',                &
                     nx_ext,ny_ext,1,nxd,nyd_stag,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'F',WRF_REAL,'XY',' ',               &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'E',WRF_REAL,'XY',' ',               &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'SINALPHA',WRF_REAL,'XY',' ',        &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'COSALPHA',WRF_REAL,'XY',' ',        &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

!-----------------------------------------------------------------------
!
!  Terrain height
!
!-----------------------------------------------------------------------
!
  CALL get_wrf_2d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,1,'HGT','',                             &
                  'west_east','south_north',nx_ext,ny_ext,trn_ext,      &
                  nxd,nyd,temlg1,nxlg_ext,nylg_ext,temlg2,istatus)
!
! Get surface skin temperature
!
  CALL get_wrf_2d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,1,'TSK','',                             &
                  'west_east','south_north',nx_ext,ny_ext,tem2d1,       &
                  nxd,nyd,temlg1,nxlg_ext,nylg_ext,temlg2,istatus)

!
! Adjust tsoil_ext and qsoil_ext
!
! NOTE: tem1_ext, tem2d1, tem2d2 used as temporary arrays below
!       tem1_ext(:,:,1)     - land mask
!       tem2d1     - Surface skin temperature
!       tem2d2     - SST
!
  DO j = 1, ny_ext
    DO i = 1, nx_ext
      IF(tem1_ext(i,j,1) < 0.5) THEN     ! Water
        DO k = 1,nzsoil_ext
          tsoil_ext(i,j,k) = tem2d2(i,j)     ! SST 
        END DO
      ELSE                               ! Land
        tsoil_ext(i,j,1) = tem2d1(i,j)       ! TSK
      END IF
    END DO
  END DO

  DO j = 1, ny_ext
    DO i = 1, nx_ext
      IF(tem1_ext(i,j,1) < 0.5) THEN           ! Water
        DO k = 1,nzsoil_ext
          qsoil_ext(i,j,k) = 1.0
        END DO
      ELSE                                     ! Land
        qsoil_ext(i,j,1) = qsoil_ext(i,j,2)    ! Assumed to be same
                                               ! as first below ground
                                               ! level.
      END IF
    END DO
  END DO

!-----------------------------------------------------------------------
!
! Dummy arrays
!
!-----------------------------------------------------------------------

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'P_TOP',WRF_REAL,'0',' ',            &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_LL_T',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_UL_T',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_UR_T',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_LR_T',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_LL_U',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_UL_U',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_UR_U',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_LR_U',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_LL_V',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_UL_V',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_UR_V',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_LR_V',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_LL_D',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_UL_D',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_UR_D',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LAT_LR_D',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_LL_T',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_UL_T',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_UR_T',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_LR_T',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_LL_U',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_UL_U',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_UR_U',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_LR_U',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_LL_V',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_UL_V',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_UR_V',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_LR_V',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_LL_D',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_UL_D',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_UR_D',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LON_LR_D',WRF_REAL,'0',' ',         &
                     '','',' ',1,1,1,1,1,1,temlg1,istatus)
!
!WDT 2004-01-10 GMB: switch from time-step precipitation to accumulated total precip:
!from ncdump -h:
! RAINC:description = "ACCUMULATED TOTAL CUMULUS PRECIPITATION" ;
! RAINNC:description = "ACCUMULATED TOTAL GRID SCALE PRECIPITATION" ;
! RAINBL:description = "PBL TIME-STEP TOTAL PRECIPITATION" ;
! RAINCV:description = "TIME-STEP CUMULUS PRECIPITATION" ;
!
!-----------------------------------------------------------------------
!
! Cumulus total precipitation
!
!-----------------------------------------------------------------------

  CALL get_wrf_2d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,1,'RAINC','',                           &
                  'west_east','south_north',nx_ext,ny_ext,rainc_ext,    &
                  nxd,nyd,temlg1,nxlg_ext,nylg_ext,temlg2,istatus)
!
!-----------------------------------------------------------------------
!
! Grid scale total precipitation
!
!-----------------------------------------------------------------------

  CALL get_wrf_2d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,1,'RAINNC','',                          &
                  'west_east','south_north',nx_ext,ny_ext,raing_ext,    &
                  nxd,nyd,temlg1,nxlg_ext,nylg_ext,temlg2,istatus)

!-----------------------------------------------------------------------
!
! Dummy arrays
!
!-----------------------------------------------------------------------

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'SWDOWN',WRF_REAL,'XY',' ',          &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'GLW',WRF_REAL,'XY',' ',             &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

!-----------------------------------------------------------------------
!
!  Check whether the latitude and longitude are consistent with the data
!
!-----------------------------------------------------------------------

  CALL get_wrf_2d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,1,'XLAT','',                            &
                  'west_east','south_north',nx_ext,ny_ext,tem2d1,       &
                  nxd,nyd,temlg1,nxlg_ext,nylg_ext,temlg2,istatus)

  CALL get_wrf_2d(fHndl,io_form,multifile,ncmprx,ncmpry,                &
                  timestr,itime,1,'XLONG','',                           &
                  'west_east','south_north',nx_ext,ny_ext,tem2d2,       &
                  nxd,nyd,temlg1,nxlg_ext,nylg_ext,temlg2, istatus)

  DO j = 1,ny_ext-1
    DO i = 1,nx_ext-1
      IF( (ABS(lat_ext(i,j)-tem2d1(i,j)) > epsl .OR.                    &
           ABS(lon_ext(i,j)-tem2d2(i,j)) > epsl)                        &
           .AND. .NOT. warned ) THEN
        WRITE(6,*)'================= WARNING ======================'
        WRITE(6,'(2A,2(A,I4),A)') 'Find latitude & longitude inconsistency', &
                   ' at grid point:', ' i = ',i,' j = ',j,'.'
        WRITE(6,'(2(A,F9.3))') 'Expecting           latitude = ',      &
                      lat_ext(i,j), ' longitude = ', lon_ext(i,j)
        WRITE(6,'(2(A,F9.3))') 'Found in data file, latitude = ',      &
                      tem2d1(i,j), ' longitude = ', tem2d2(i,j)
        WRITE(6,*)'================= WARNING ======================'
        warned = .TRUE.
        istatus = -666
        RETURN
      END IF
    END DO
  END DO

!-----------------------------------------------------------------------
!
! Dummy arrays. It is not necessay if frame_per_file = 1, or io_form /= 1
!
!-----------------------------------------------------------------------
  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'TMN',WRF_REAL,'XY',' ',             &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'XLAND',WRF_REAL,'XY',' ',           &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

! Added in Wei Wang's 03032005 version
  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'RMOL',WRF_REAL,'XY',' ',            &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'PBLH',WRF_REAL,'XY',' ',            &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'HFX',WRF_REAL,'XY',' ',             &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'QFX',WRF_REAL,'XY',' ',             &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'LH',WRF_REAL,'XY',' ',              &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)

  CALL get_wrf_dummy(fHndl,io_form,multifile,ncmprx,ncmpry,             &
                     timestr,itime,'SNOWC',WRF_REAL,'XY',' ',           &
                     'west_east','south_north',' ',                     &
                     nx_ext,ny_ext,1,nxd,nyd,1,temlg1,istatus)
!
!-----------------------------------------------------------------------
!
!  Restore the original map projection before return
!
!-----------------------------------------------------------------------

  CALL setmapr(iproj_orig,scale_orig,latnot_orig,trlon_orig)
  CALL setorig(1,x0_orig,y0_orig)

!-----------------------------------------------------------------------
!
! Deallocate the working arrays
!
!-----------------------------------------------------------------------

  DEALLOCATE(temlg1,temlg2)

  istatus = 0
  RETURN
END SUBROUTINE getwrfd
!
!##################################################################
!##################################################################
!######                                                      ######
!######                  SUBROUTINE adj_wrfuv                ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE adj_wrfuv(multifile,use_wrf_grid,nx_ext,ny_ext,nz_ext,       & 1,9
                iproj_ext,scale_ext,trlon_ext,latnot_ext,x0_ext,y0_ext, &
                lonu_ext,lonv_ext,u_ext,vatu_ext,uatv_ext,v_ext,        &
                tem1_ext,tem2_ext,istatus)

!------------------------------------------------------------------------
!
!  PURPOSE:
!
!  Extended WRF horizontal wind arrays for fake zone.  
!  Rotate WRF horizontal wind to be earth relative if needed.
!  This is seperated from getwrfd for ordering I/O purpose in MPI mode.
!
!------------------------------------------------------------------------
!
!  AUTHOR:
!  Yunheng Wang (04/22/2005)
!
!  MODIFICATION HISTORY:
!
!------------------------------------------------------------------------
  IMPLICIT NONE

  LOGICAL,      INTENT(IN)  :: multifile
  INTEGER,      INTENT(IN)  :: use_wrf_grid ! 0 - rotate hori. wind
                                            ! 1 - no rotation
  INTEGER,      INTENT(IN)  :: nx_ext       !
  INTEGER,      INTENT(IN)  :: ny_ext       !
  INTEGER,      INTENT(IN)  :: nz_ext       !

  INTEGER, INTENT(IN)  :: iproj_ext    ! Map projection option
                                       ! = 1, polar projection;
                                       ! = 2, Lambert projection;
                                       ! = 3, Mercator projection.
  REAL,    INTENT(IN)  :: scale_ext    ! Map scale factor (should be 1.0)
  REAL,    INTENT(IN)  :: trlon_ext    ! True longitude
  REAL,    INTENT(IN)  :: latnot_ext(2)! True latitude
  REAL,    INTENT(IN)  :: x0_ext
  REAL,    INTENT(IN)  :: y0_ext

  REAL,    INTENT(IN)  :: lonu_ext(nx_ext,ny_ext)
  REAL,    INTENT(IN)  :: lonv_ext(nx_ext,ny_ext)

  REAL,    INTENT(INOUT) :: u_ext   (nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(INOUT) :: v_ext   (nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT)   :: vatu_ext(nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT)   :: uatv_ext(nx_ext,ny_ext,nz_ext)

  REAL,    INTENT(OUT) :: tem1_ext (nx_ext,ny_ext,nz_ext)
  REAL,    INTENT(OUT) :: tem2_ext (nx_ext,ny_ext,nz_ext)
  INTEGER, INTENT(OUT) :: istatus
 
!------------------------------------------------------------------------
!
!  Include files
!
!------------------------------------------------------------------

  INCLUDE 'mp.inc'

!------------------------------------------------------------------------
!
!  Misc. local variables
!
!------------------------------------------------------------------

  INTEGER  :: iproj_orig
  REAL     :: scale_orig
  REAL     :: latnot_orig(2)
  REAL     :: trlon_orig
  REAL     :: x0_orig, y0_orig
  REAL     :: xsub0,ysub0

  REAL, ALLOCATABLE :: uext(:,:,:)
  REAL, ALLOCATABLE :: vext(:,:,:)

  INTEGER            :: i,j,k

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  IF (multifile) THEN  ! extend values to fake zone
    CALL mpext_wrf_u(u_ext,nx_ext,ny_ext,nz_ext,tem1_ext)
    CALL mpext_wrf_v(v_ext,nx_ext,ny_ext,nz_ext,tem1_ext)
  END IF

  IF (use_wrf_grid == 1) THEN   ! no rotation, 
                                ! uatv_ext & vatu_ext will not be used
    uatv_ext(:,:,:) = -9999.0
    vatu_ext(:,:,:) = -9999.0
 
  ELSE                          ! == 0, rotate hori. wind

    !
    ! remember the map projection paramters which should be restored 
    ! before return
    !

    CALL getmapr(iproj_orig,scale_orig,latnot_orig,                     &
                 trlon_orig,x0_orig,y0_orig)

    ! Set up WRF map projection
    CALL setmapr(iproj_ext,scale_ext,latnot_ext,trlon_ext)
    CALL setorig(1,x0_ext,y0_ext)

    ALLOCATE(uext( 1:nx_ext+1, 0:ny_ext,  1:nz_ext), STAT = istatus)
    ALLOCATE(vext( 0:nx_ext,   1:ny_ext+1,1:nz_ext), STAT = istatus)

    CALL extend_u(u_ext,nx_ext,ny_ext,nz_ext,uext,tem1_ext,tem2_ext)
    CALL extend_v(v_ext,nx_ext,ny_ext,nz_ext,vext,tem1_ext,tem2_ext)

    !
    ! get u at V grid point locations
    !
    DO k=1,nz_ext
      DO j=1,ny_ext
       DO i=1,nx_ext
          uatv_ext(i,j,k) = 0.25*(  uext(i,j-1,k) + uext(i+1,j-1,k)     &
                                  + uext(i,j,k)   + uext(i+1,j,k))
        END DO
      END DO
    END DO

    !
    ! get V at U grid point locations
    !

    DO k = 1,nz_ext
      DO j=1,ny_ext
        DO i=1,nx_ext
          vatu_ext(i,j,k) = 0.25*(  vext(i-1,j,k)   + vext(i,j,k)       &
                                  + vext(i-1,j+1,k) + vext(i,j+1,k))
        END DO
      END DO
    END DO

    !
    !  Orient u & v to true north.
    !

    DO k = 1, nz_ext
      CALL uvmptoe(nx_ext,ny_ext,u_ext(:,:,k),vatu_ext(:,:,k),lonu_ext, &
                   tem1_ext(:,:,k),tem2_ext(:,:,k))
      u_ext   (1:nx_ext,1:ny_ext,k) = tem1_ext(1:nx_ext,1:ny_ext,k)
      vatu_ext(1:nx_ext,1:ny_ext,k) = tem2_ext(1:nx_ext,1:ny_ext,k)
  
      CALL uvmptoe(nx_ext,ny_ext,uatv_ext(:,:,k),v_ext(:,:,k),lonv_ext, &
                   tem1_ext(:,:,k),tem2_ext(:,:,k))
      uatv_ext(1:nx_ext,1:ny_ext,k) = tem1_ext(1:nx_ext,1:ny_ext,k)
      v_ext   (1:nx_ext,1:ny_ext,k) = tem2_ext(1:nx_ext,1:ny_ext,k)
  
    END DO

!-----------------------------------------------------------------------
!
! Deallocate the working arrays
!
!-----------------------------------------------------------------------

    DEALLOCATE(uext,vext)
!
!-----------------------------------------------------------------------
!
!  Restore the original map projection before return
!
!-----------------------------------------------------------------------

    CALL setmapr(iproj_orig,scale_orig,latnot_orig,trlon_orig)
    CALL setorig(1,x0_orig,y0_orig)

  END IF   ! use_wrf_grid

  istatus = 0
  RETURN
END SUBROUTINE adj_wrfuv
!
!##################################################################
!##################################################################
!######                                                      ######
!######                SUBROUTINE open_wrf_file              ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE open_wrf_file(filename,io_form,multifile,for_meta_only,      &,1
                         ncmprx,ncmpry,nidout)
!
!------------------------------------------------------------------
!
!  PURPOSE:
!
!    Open a WRF file and return NetCDF file handler.
!    It will call open_wrf_one_file or open_wrf_multi_files depends
!    on the pass-in parameters
!
!    NOTE: it is required to call close_wrf_file explicitly to close 
!          the opened file in your calling program.
!
!------------------------------------------------------------------

  IMPLICIT NONE
  CHARACTER(LEN=*), INTENT(IN)  :: filename
  INTEGER,          INTENT(IN)  :: io_form
  LOGICAL,          INTENT(IN)  :: multifile
  LOGICAL,          INTENT(IN)  :: for_meta_only
  INTEGER,          INTENT(IN)  :: ncmprx, ncmpry
  INTEGER,          INTENT(OUT) :: nidout(ncmprx,ncmpry)

!------------------------------------------------------------------
!
!  Misc. local variable
!
!------------------------------------------------------------------
  INTEGER            :: istatus

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Begining of executable code
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  istatus = 0

  IF (multifile) THEN
    CALL open_wrf_multi_files(filename,io_form,for_meta_only,ncmprx,    &
                             ncmpry,nidout,istatus)
  ELSE
    CALL open_wrf_one_file(filename,io_form,nidout,istatus)
  END IF

  IF (istatus /= 0) THEN
    WRITE(0,'(1x,2a)') 'ERROR: Opening file ',filename
    CALL arpsstop('Open WRF file error.',1)
  END IF

  RETURN
END SUBROUTINE open_wrf_file
!
!##################################################################
!##################################################################
!######                                                      ######
!######              SUBROUTINE close_wrf_file               ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
! 

SUBROUTINE close_wrf_file(nch,io_form,multifile,for_meta_only,          &,1
                          ncompressx,ncompressy)
! 
!------------------------------------------------------------------
!
!  PURPOSE:
!  
!     Close the WRF file which is opened using open_wrf_file.
!
!------------------------------------------------------------------
  IMPLICIT NONE

  INTEGER, INTENT(IN) :: io_form
  LOGICAL, INTENT(IN) :: multifile
  LOGICAL, INTENT(IN) :: for_meta_only
  INTEGER, INTENT(IN) :: ncompressx, ncompressy
  INTEGER, INTENT(IN) :: nch(ncompressx,ncompressy)
  
!------------------------------------------------------------------
!
!  Misc. local variable
!
!------------------------------------------------------------------
!
  INTEGER :: istatus

  INCLUDE 'mp.inc'

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
  istatus = 0

  IF(multifile) THEN
    CALL close_wrf_multi_files(nch,io_form,for_meta_only,               &
                               ncompressx,ncompressy,istatus)
  ELSE
    CALL close_wrf_one_file(nch,io_form,istatus)
  END IF

  IF (istatus /= 0) THEN
    WRITE(0,'(1x,2a)') 'ERROR: closing file handler ',nch
    CALL mpexit(1)
  END IF

  RETURN
END SUBROUTINE close_wrf_file


SUBROUTINE io_shutdown(io_form) 3,2
  IMPLICIT NONE
  INTEGER, INTENT(IN) :: io_form
 
  INTEGER :: istatus
 
  istatus = 0

  IF (io_form == 5) THEN
    CALL shutdown_phdf5_io(istatus)
  ELSE IF (io_form == 1) THEN
    CALL ext_int_ioexit( iStatus ) 
  END IF

  RETURN
END SUBROUTINE io_shutdown
!
!##################################################################
!##################################################################
!######                                                      ######
!######            SUBROUTINE get_wrf_Times                  ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE get_wrf_Times(nfid,io_form,multifile,ncompressx,ncompressy,  &
                         itime,timestr)
!-----------------------------------------------------------------------
!
!  PURPOSE:
!    Read the the Date String in the WRF outputs at specified time
!
!-----------------------------------------------------------------------
  IMPLICIT NONE
  INTEGER, INTENT(IN)  :: ncompressx, ncompressy
  INTEGER, INTENT(IN)  :: nfid(ncompressx,ncompressy)     ! file handler
  INTEGER, INTENT(IN)  :: io_form  ! File format
  LOGICAL, INTENT(IN)  :: multifile
  INTEGER, INTENT(IN)  :: itime    ! Time dimension value
                                   ! this is the unlimited dimension
  CHARACTER(LEN=*), INTENT(OUT) :: timestr

!------------------------------------------------------------------
!
!  Misc. local variables
!
!------------------------------------------------------------------
  INTEGER :: istatus

  INCLUDE 'mp.inc'

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  IF (multifile) THEN
     CAlL get_wrf_Times_from_multi_files(nfid,io_form,ncompressx,       &
                                 ncompressy,itime,timestr,istatus)
  ELSE
     CALL get_wrf_Times_from_one_file(nfid,io_form,itime,timestr,istatus)
  END IF

!  write(0,*) 'Next_time = ', timestr
  RETURN
END SUBROUTINE get_wrf_Times
!
!
!##################################################################
!##################################################################
!######                                                      ######
!######             SUBROUTINE get_wrf_metadata              ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE get_wrf_metadata(nid,io_form,multifile,for_meta_only,        &,1
                          ncompressx,ncompressy,                        &
                          nx_ext,ny_ext,nz_ext,nzsoil_ext,              &
                          mapproj,trlat1,trlat2,trlon,ctrlat,ctrlon,    &
                          dx,dy,dt,sfcphys,mpphys,istatus)

!-----------------------------------------------------------------------
!
! PURPOSE
!
!   Retieve WRF grib information from the NetCDF file which are stored
!   as Global attributes.
!
!-----------------------------------------------------------------------
  IMPLICIT NONE

  INTEGER, INTENT(IN)  :: ncompressx,ncompressy
  INTEGER, INTENT(IN)  :: nid(ncompressx,ncompressy)
  INTEGER, INTENT(IN)  :: io_form
  LOGICAL, INTENT(IN)  :: multifile
  LOGICAL, INTENT(IN)  :: for_meta_only
  INTEGER, INTENT(OUT) :: nx_ext, ny_ext     ! they are whole domain dimensions
  INTEGER, INTENT(OUT) :: nz_ext, nzsoil_ext
  INTEGER, INTENT(OUT) :: mapproj
  REAL,    INTENT(OUT) :: trlat1
  REAL,    INTENT(OUT) :: trlat2
  REAL,    INTENT(OUT) :: trlon
  REAL,    INTENT(OUT) :: ctrlat
  REAL,    INTENT(OUT) :: ctrlon
  REAL,    INTENT(OUT) :: dx
  REAL,    INTENT(OUT) :: dy
  REAL,    INTENT(OUT) :: dt
  INTEGER, INTENT(OUT) :: sfcphys
  INTEGER, INTENT(OUT) :: mpphys
  INTEGER, INTENT(OUT) :: istatus
  
!-----------------------------------------------------------------------
!
! Misc. local variable
!
!-----------------------------------------------------------------------

  INTEGER :: iloc, jloc
  INTEGER :: iproj

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  IF (multifile) THEN

    IF (for_meta_only .OR. io_form == 7) THEN    ! read only one file is enough
      CALL  get_wrf_meta_from_multi_files(nid(1,1),io_form,.TRUE.,  &
                          nx_ext,ny_ext,nz_ext,nzsoil_ext,              &
                          iproj,trlat1,trlat2,trlon,ctrlat,ctrlon,    &
                          dx,dy,dt,sfcphys,mpphys,istatus)

    ELSE        ! binary file requires sequential access

      DO jloc = 1,ncompressy
        DO iloc = 1,ncompressx
          CALL  get_wrf_meta_from_multi_files(nid(iloc,jloc),       &
                          io_form,.FALSE.,       &  ! do not do checking
                          nx_ext,ny_ext,nz_ext,nzsoil_ext,              &
                          iproj,trlat1,trlat2,trlon,ctrlat,ctrlon,    &
                          dx,dy,dt,sfcphys,mpphys,istatus)
        END DO
      END DO

    END IF

  ELSE
    CALL get_wrf_meta_from_one_file(nid,io_form,                    &
                          nx_ext,ny_ext,nz_ext,nzsoil_ext,              &
                          iproj,trlat1,trlat2,trlon,ctrlat,ctrlon,    &
                          dx,dy,dt,sfcphys,mpphys,istatus)
  END IF
 
!-----------------------------------------------------------------------
!
!  Convert from WRF map projection parameter to ARPS map projection
!
!-----------------------------------------------------------------------

  IF(iproj == 0) THEN        ! No projection
    mapproj = 0
  ELSE IF(iproj == 1) THEN   ! LAMBERT CONFORMAL
    mapproj = 2
  ELSE IF(iproj == 2) THEN   ! POLAR STEREOGRAPHIC
    mapproj = 1
  ELSE IF(iproj == 3) THEN   ! MERCATOR
    mapproj = 3
  ELSE
    WRITE(6,*) 'Unknown map projection, ', iproj
    istatus = -555
    CALL arpsstop('WRONG WRF map projection parameter.',1)
  END IF

  IF(trlat1 < 0.0) mapproj = -1*mapproj

  RETURN
END SUBROUTINE get_wrf_metadata

!
!##################################################################
!##################################################################
!######                                                      ######
!######              SUBROUTINE get_wrf_dummy                ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE get_wrf_dummy(nid,io_form,multifile,ncompressx,ncompressy,   &
                datestr,itime,varname,varType,memoryorder,stagger,      &
                dimname1,dimname2,dimname3,                             &
                nx,ny,nz,nxd,nyd,nzd,temtd,istatus)

!-----------------------------------------------------------------------
!
!  PURPOSE:
!    Read in an array from the WRF history file. It just for sequential
!    access of WRF binary file
!
!-----------------------------------------------------------------------
  IMPLICIT NONE

  INTEGER,          INTENT(IN)  :: ncompressx,ncompressy
  INTEGER,          INTENT(IN)  :: nid(ncompressx,ncompressy)
  INTEGER,          INTENT(IN)  :: io_form
  LOGICAL,          INTENT(IN)  :: multifile
  CHARACTER(LEN=*), INTENT(IN)  :: datestr
  INTEGER,          INTENT(IN)  :: itime
  CHARACTER(LEN=*), INTENT(IN)  :: varname
  INTEGER,          INTENT(IN)  :: varType
  CHARACTER(LEN=*), INTENT(IN)  :: MemoryOrder
  CHARACTER(LEN=*), INTENT(IN)  :: stagger
  CHARACTER(LEN=*), INTENT(IN)  :: dimname1
  CHARACTER(LEN=*), INTENT(IN)  :: dimname2
  CHARACTER(LEN=*), INTENT(IN)  :: dimname3
  INTEGER,          INTENT(IN)  :: nx              ! local index
  INTEGER,          INTENT(IN)  :: ny
  INTEGER,          INTENT(IN)  :: nz
  INTEGER,          INTENT(IN)  :: nxd,nyd,nzd         ! domain index
  REAL,             INTENT(OUT) :: temtd(nxd*nyd*nzd)   ! domain array
  INTEGER,          INTENT(OUT) :: istatus

!-----------------------------------------------------------------------
!
! Misc. Local variables
!
!-----------------------------------------------------------------------

  INTEGER, PARAMETER :: VAR_NOTEXIST = -1
  INTEGER, PARAMETER :: WRF_REAL     = 104
  INTEGER, PARAMETER :: WRF_INTEGER  = 106

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  IF ( io_form /= 1 ) RETURN   ! Only needed for binary format

  IF ( multifile ) THEN
    CALL get_wrf_dummy_from_multi_files(nid,io_form,                    &
                ncompressx,ncompressy,datestr,itime,varname,            &
                varType,memoryorder,stagger,dimname1,dimname2,dimname3, &
                nx,ny,nz,nxd,nyd,nzd,temtd,istatus)
  ELSE
    CALL get_wrf_dummy_from_one_file(nid,io_form,datestr,itime,varname, &
                varType,memoryorder,stagger,dimname1,dimname2,dimname3, &
                nx,ny,nz,nxd,nyd,nzd,temtd,istatus)
  END IF

  RETURN
END SUBROUTINE get_wrf_dummy
!
!##################################################################
!##################################################################
!######                                                      ######
!######             SUBROUTINE get_wrf_1d                    ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE get_wrf_1d(nfid,io_form,multifile,ncompressx,ncompressy,     &
                      datestr,itime,varname,stagger,                    &
                      dimname1,nz,var1d,nzd, istatus)
                   
!-----------------------------------------------------------------------
!
!  PURPOSE:
!    Read in a 1D array from the WRF history file
!
!-----------------------------------------------------------------------
  IMPLICIT NONE

  INTEGER,          INTENT(IN)  :: ncompressx,ncompressy
  INTEGER,          INTENT(IN)  :: nfid(ncompressx,ncompressy)
  INTEGER,          INTENT(IN)  :: io_form
  LOGICAL,          INTENT(IN)  :: multifile
  CHARACTER(LEN=*), INTENT(IN)  :: datestr
  INTEGER,          INTENT(IN)  :: itime
  CHARACTER(LEN=*), INTENT(IN)  :: varname
  CHARACTER(LEN=*), INTENT(IN)  :: stagger
  CHARACTER(LEN=*), INTENT(IN)  :: dimname1
  INTEGER,          INTENT(IN)  :: nz              ! memory index

  REAL,             INTENT(OUT) :: var1d(nz)
  INTEGER,          INTENT(IN)  :: nzd            ! data index
  INTEGER,          INTENT(OUT) :: istatus

!-----------------------------------------------------------------------
!
! Misc. Local variables
!
!-----------------------------------------------------------------------

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  IF ( multifile ) THEN
    CALL get_wrf_1d_from_multi_files(nfid,io_form,ncompressx,ncompressy,&
                      datestr,itime,varname,stagger,                    &
                      dimname1,nz,var1d,nzd,istatus)
  ELSE
    CALL  get_wrf_1d_from_one_file  (nfid,io_form,                      &
                      datestr,itime,varname,stagger,                    &
                      dimname1,nz,var1d,nzd,istatus)
  END IF

  RETURN
END SUBROUTINE get_wrf_1d
!
!##################################################################
!##################################################################
!######                                                      ######
!######             SUBROUTINE get_wrf_2d                    ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE get_wrf_2d(nfid,io_form,multifile,ncompressx,ncompressy,     &
                      datestr,itime,fzone,varname,stagger,              &
                      dimname1,dimname2,nx,ny,var2d,                    &
                      nxd,nyd,temtd,nxlg,nylg,temlg, istatus)
                   
!-----------------------------------------------------------------------
!
!  PURPOSE:
!    Read in a 2D array from the WRF history file
!
!-----------------------------------------------------------------------
  IMPLICIT NONE

  INTEGER,          INTENT(IN)  :: ncompressx,ncompressy
  INTEGER,          INTENT(IN)  :: nfid(ncompressx,ncompressy)
  INTEGER,          INTENT(IN)  :: io_form
  LOGICAL,          INTENT(IN)  :: multifile
  CHARACTER(LEN=*), INTENT(IN)  :: datestr
  INTEGER,          INTENT(IN)  :: itime
  INTEGER,          INTENT(IN)  :: fzone
  CHARACTER(LEN=*), INTENT(IN)  :: varname
  CHARACTER(LEN=*), INTENT(IN)  :: stagger
  CHARACTER(LEN=*), INTENT(IN)  :: dimname1
  CHARACTER(LEN=*), INTENT(IN)  :: dimname2
  INTEGER,          INTENT(IN)  :: nx              ! local index
  INTEGER,          INTENT(IN)  :: ny

  REAL,             INTENT(OUT) :: var2d(nx,ny)
  INTEGER,          INTENT(IN)  :: nxd,nyd         ! data index
  REAL,             INTENT(OUT) :: temtd(nxd,nyd)  ! data array
  INTEGER,          INTENT(IN)  :: nxlg,nylg       ! memory index for the whole domain
  REAL,             INTENT(OUT) :: temlg(nxlg,nylg)! memory array
  INTEGER,          INTENT(OUT) :: istatus

!-----------------------------------------------------------------------
!
! Misc. Local variables
!
!-----------------------------------------------------------------------

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  IF ( multifile ) THEN

    CALL get_wrf_2d_from_multi_files(nfid,io_form,ncompressx,ncompressy,&
                      datestr,itime,fzone,varname,stagger,              &
                      dimname1,dimname2,nx,ny,var2d,                    &
                      nxd,nyd,temtd,istatus)
  ELSE
    CALL get_wrf_2d_from_one_file(nfid,io_form,                         &
                      datestr,itime,fzone,varname,stagger,              &
                      dimname1,dimname2,nx,ny,var2d,                    &
                      nxd,nyd,temtd,nxlg,nylg,temlg, istatus)
  END IF

  RETURN
END SUBROUTINE get_wrf_2d
!
!##################################################################
!##################################################################
!######                                                      ######
!######             SUBROUTINE get_wrf_2di                   ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE get_wrf_2di(nfid,io_form,multifile,ncmprx,ncmpry,           &
                      datestr,itime,fzone,varname,stagger,             &
                      dimname1,dimname2,nx,ny,var2di,nxd,nyd,temtd,    &
                      nxlg,nylg,temlg,istatus)
                   
!-----------------------------------------------------------------------
!
!  PURPOSE:
!    Read in a 2D integer array from the WRF history file
!
!-----------------------------------------------------------------------
  IMPLICIT NONE

  INTEGER,          INTENT(IN)  :: ncmprx,ncmpry
  INTEGER,          INTENT(IN)  :: nfid(ncmprx,ncmpry)
  INTEGER,          INTENT(IN)  :: io_form
  LOGICAL,          INTENT(IN)  :: multifile
  CHARACTER(LEN=*), INTENT(IN)  :: datestr
  INTEGER,          INTENT(IN)  :: itime
  INTEGER,          INTENT(IN)  :: fzone
  CHARACTER(LEN=*), INTENT(IN)  :: varname
  CHARACTER(LEN=*), INTENT(IN)  :: stagger
  CHARACTER(LEN=*), INTENT(IN)  :: dimname1
  CHARACTER(LEN=*), INTENT(IN)  :: dimname2
  INTEGER,          INTENT(IN)  :: nx              ! local index
  INTEGER,          INTENT(IN)  :: ny

  INTEGER,          INTENT(OUT) :: var2di(nx,ny)
  INTEGER,          INTENT(IN)  :: nxd,nyd          ! domain index
  INTEGER,          INTENT(OUT) :: temtd(nxd,nyd)   ! domain array
  INTEGER,          INTENT(IN)  :: nxlg,nylg          ! memory
  INTEGER,          INTENT(OUT) :: temlg(nxlg,nylg)   ! memory array
  INTEGER,          INTENT(OUT) :: istatus

!-----------------------------------------------------------------------
!
! Misc. Local variables
!
!-----------------------------------------------------------------------

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  IF ( multifile ) THEN
    CALL get_wrf_2di_from_multi_files(nfid,io_form,ncmprx,ncmpry,       &
                      datestr,itime,fzone,varname,stagger,              &
                      dimname1,dimname2,nx,ny,var2di,                   &
                      nxd,nyd,temtd,istatus)
  ELSE
    CALL get_wrf_2di_from_one_file(nfid,io_form,                        &
                      datestr,itime,fzone,varname,stagger,              &
                      dimname1,dimname2,nx,ny,var2di,                   &
                      nxd,nyd,temtd,nxlg,nylg,temlg,istatus)
  END IF

  RETURN
END SUBROUTINE get_wrf_2di
!
!##################################################################
!##################################################################
!######                                                      ######
!######              SUBROUTINE get_wrf_3d                   ######
!######                                                      ######
!######                     Developed by                     ######
!######     Center for Analysis and Prediction of Storms     ######
!######                University of Oklahoma                ######
!######                                                      ######
!##################################################################
!##################################################################
!

SUBROUTINE get_wrf_3d(nfid,io_form,multifile,ncompressx,ncompressy,     &
                      datestr,itime,fzone,varname,stagger,              &
                      dimname1,dimname2,dimname3,nx,ny,nz,var3d,        &
                      nxd,nyd,nzd,temtd,nxlg,nylg,nzlg,temlg,istatus)

!-----------------------------------------------------------------------
!
!  PURPOSE:
!    Read in a 3D array from the WRF NetCDF file
!
!-----------------------------------------------------------------------
  IMPLICIT NONE

  INTEGER,          INTENT(IN)  :: ncompressx,ncompressy
  INTEGER,          INTENT(IN)  :: nfid(ncompressx,ncompressy)
  INTEGER,          INTENT(IN)  :: io_form
  LOGICAL,          INTENT(IN)  :: multifile
  CHARACTER(LEN=*), INTENT(IN)  :: datestr
  INTEGER,          INTENT(IN)  :: itime
  INTEGER,          INTENT(IN)  :: fzone
  CHARACTER(LEN=*), INTENT(IN)  :: varname
  CHARACTER(LEN=*), INTENT(IN)  :: stagger
  CHARACTER(LEN=*), INTENT(IN)  :: dimname1
  CHARACTER(LEN=*), INTENT(IN)  :: dimname2
  CHARACTER(LEN=*), INTENT(IN)  :: dimname3
  INTEGER,          INTENT(IN)  :: nx              ! local index
  INTEGER,          INTENT(IN)  :: ny
  INTEGER,          INTENT(IN)  :: nz
  REAL,             INTENT(OUT) :: var3d(nx,ny,nz)
  INTEGER,          INTENT(IN)  :: nxd,nyd,nzd             ! Data index
  REAL,             INTENT(OUT) :: temtd(nxd*nyd*nzd)      ! domain array
  INTEGER,          INTENT(IN)  :: nxlg,nylg,nzlg          ! domain index
  REAL,             INTENT(OUT) :: temlg(nxlg,nylg,nzlg)   ! memory array
  INTEGER,          INTENT(OUT) :: istatus

!-----------------------------------------------------------------------
!
! Misc. Local variables
!
!-----------------------------------------------------------------------

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
!  Beginning of executable code...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  IF ( multifile ) THEN
    CALL get_wrf_3d_from_multi_files(nfid,io_form,ncompressx,ncompressy,&
                      datestr,itime,fzone,varname,stagger,              &
                      dimname1,dimname2,dimname3,nx,ny,nz,var3d,        &
                      nxd,nyd,nzd,temtd,istatus)
  ELSE
    CALL get_wrf_3d_from_one_file(nfid,io_form,                         &
                      datestr,itime,fzone,varname,stagger,              &
                      dimname1,dimname2,dimname3,nx,ny,nz,var3d,        &
                      nxd,nyd,nzd,temtd,nxlg,nylg,nzlg,temlg,istatus)
  END IF

  RETURN
END SUBROUTINE get_wrf_3d