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

SUBROUTINE write_wrf_bdy(ncid,io_form,times_str,ifile,                &,26
                         nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,         &
                         nxlg_wrf,nylg_wrf,fzone_wrf,tintv_bdyin,     &
                         ubdy3dtemp1,ubdy3dtemp2,                     &
                         vbdy3dtemp1,vbdy3dtemp2,                     &
                         tbdy3dtemp1,tbdy3dtemp2,                     &
                         pbdy3dtemp1,pbdy3dtemp2,                     &
                         qbdy3dtemp1,qbdy3dtemp2,                     &
                         mbdy2dtemp1,mbdy2dtemp2,                     &
                         bdys,bdyn,bdyw,bdye,                         &
                         blgw,blge,blgs,blgn,                         &
                         temx,temy,istatus)  

!-----------------------------------------------------------------------
!
! PURPOSE:
!   Write WRF boundary file
!
!-----------------------------------------------------------------------

  IMPLICIT NONE
  INTEGER, INTENT(IN)  :: ncid
  INTEGER, INTENT(IN)  :: io_form
  CHARACTER(LEN=*), INTENT(IN) :: times_str
  INTEGER, INTENT(IN)  :: ifile
  INTEGER, INTENT(IN)  :: nx_wrf, ny_wrf, nz_wrf
  INTEGER, INTENT(IN)  :: spec_bdy_width
  INTEGER, INTENT(IN)  :: nxlg_wrf, nylg_wrf
  INTEGER, INTENT(IN)  :: fzone_wrf
  INTEGER, INTENT(IN)  :: tintv_bdyin
  REAL,    INTENT(IN)  :: ubdy3dtemp1(nx_wrf,ny_wrf,nz_wrf)
  REAL,    INTENT(IN)  :: ubdy3dtemp2(nx_wrf,ny_wrf,nz_wrf)
  REAL,    INTENT(IN)  :: vbdy3dtemp1(nx_wrf,ny_wrf,nz_wrf)
  REAL,    INTENT(IN)  :: vbdy3dtemp2(nx_wrf,ny_wrf,nz_wrf)
  REAL,    INTENT(IN)  :: tbdy3dtemp1(nx_wrf,ny_wrf,nz_wrf)
  REAL,    INTENT(IN)  :: tbdy3dtemp2(nx_wrf,ny_wrf,nz_wrf)
  REAL,    INTENT(IN)  :: pbdy3dtemp1(nx_wrf,ny_wrf,nz_wrf)
  REAL,    INTENT(IN)  :: pbdy3dtemp2(nx_wrf,ny_wrf,nz_wrf)
  REAL,    INTENT(IN)  :: qbdy3dtemp1(nx_wrf,ny_wrf,nz_wrf)
  REAL,    INTENT(IN)  :: qbdy3dtemp2(nx_wrf,ny_wrf,nz_wrf)
  REAL,    INTENT(IN)  :: mbdy2dtemp1(nx_wrf,ny_wrf)
  REAL,    INTENT(IN)  :: mbdy2dtemp2(nx_wrf,ny_wrf)

  REAL,    INTENT(OUT) :: bdys(nx_wrf,  nz_wrf,spec_bdy_width)
  REAL,    INTENT(OUT) :: bdyn(nx_wrf,  nz_wrf,spec_bdy_width)
  REAL,    INTENT(OUT) :: bdyw(ny_wrf,  nz_wrf,spec_bdy_width)
  REAL,    INTENT(OUT) :: bdye(ny_wrf,  nz_wrf,spec_bdy_width)
  REAL,    INTENT(OUT) :: blgs(nxlg_wrf,nz_wrf,spec_bdy_width)
  REAL,    INTENT(OUT) :: blgn(nxlg_wrf,nz_wrf,spec_bdy_width)
  REAL,    INTENT(OUT) :: blgw(nylg_wrf,nz_wrf,spec_bdy_width)
  REAL,    INTENT(OUT) :: blge(nylg_wrf,nz_wrf,spec_bdy_width)

  REAL,    INTENT(OUT) :: temx(nx_wrf,nz_wrf,spec_bdy_width)
  REAL,    INTENT(OUT) :: temy(ny_wrf,nz_wrf,spec_bdy_width)

  INTEGER, INTENT(OUT) :: istatus

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

  REAL :: bdyintv

!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!
! Begin of executable code ...
!
!@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

  bdyintv = REAL(tintv_bdyin)

  ! U wind
  CALL stuff_bdy(nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,'U',               &
                ubdy3dtemp1,bdys,bdyn,bdyw,bdye)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'U_B','X',           &
                'bdy x-wind component',bdyw,bdye,bdys,bdyn,             &
                nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,fzone_wrf,          &
                blgw,blge,blgs,blgn,nxlg_wrf,nylg_wrf-1,nz_wrf-1,       &
                temx,temy)

  CALL stuff_bdytend(nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,'U',           &
                ubdy3dtemp1,ubdy3dtemp2,bdyintv,bdys,bdyn,bdyw,bdye)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'U_BT','X',          &
                'bdy tend x-wind component',bdyw,bdye,bdys,bdyn,        &
                nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,fzone_wrf,          &
                blgw,blge,blgs,blgn,nxlg_wrf,nylg_wrf-1,nz_wrf-1,       &
                temx,temy)

  ! V wind
  CALL stuff_bdy(nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,'V',               &
                vbdy3dtemp1,bdys,bdyn,bdyw,bdye)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'V_B','Y',           &
                'bdy y-wind component',                                 &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf,nz_wrf-1,temx,temy)

  CALL stuff_bdytend(nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,'V',           &
                vbdy3dtemp1,vbdy3dtemp2,bdyintv,bdys,bdyn,bdyw,bdye)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'V_BT','Y',          &
                'bdy tend y-wind component',                            &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf,nz_wrf-1,temx,temy)

  bdyw(:,:,:) = 0.0
  bdye(:,:,:) = 0.0
  bdys(:,:,:) = 0.0
  bdyn(:,:,:) = 0.0

  ! Z wind
  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'W_B','Z',           &
                'bdy z-wind component',                                 &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf,temx,temy)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'W_BT','Z',          &
                'bdy tend z-wind component',                            &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf,temx,temy)

  ! Geopotential
  CALL stuff_bdy(nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,'H',               &
                pbdy3dtemp1,bdys,bdyn,bdyw,bdye)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'PH_B','Z',          &
                'bdy perturbation geopotential',                        &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf,temx,temy)

  CALL stuff_bdytend(nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,'H',           &
                pbdy3dtemp1,pbdy3dtemp2,bdyintv,bdys,bdyn,bdyw,bdye)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'PH_BT','Z',         &
                'bdy tend perturbation geopotential',                   &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf,temx,temy)

  ! Potential temperature perturbation
  CALL stuff_bdy(nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,'T',               &
                 tbdy3dtemp1,bdys,bdyn,bdyw,bdye)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'T_B','',            &
                'bdy perturbation potential temperature (theta-t0)',    &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  CALL stuff_bdytend(nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,'T',           &
                tbdy3dtemp1,tbdy3dtemp2,bdyintv,bdys,bdyn,bdyw,bdye)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'T_BT','',           &
               'bdy tend perturbation potential temperature (theta-t0)',&
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  ! mu
  CALL stuff_bdy2d(nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,                 &
                mbdy2dtemp1,bdys,bdyn,bdyw,bdye)

  CALL writebdy2d(ncid,io_form,times_str(1:19),ifile,'MU_B','',         &
                'bdy perturbation dry air mass in column',              &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,temx,temy)

  CALL stuff_bdytend2d(nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,             &
                mbdy2dtemp1,mbdy2dtemp2,bdyintv,bdys,bdyn,bdyw,bdye)

  CALL writebdy2d(ncid,io_form,times_str(1:19),ifile,'MU_BT','',        &
                'bdy tend perturbation dry air mass in column',         &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,temx,temy)

  ! Water vapor mixing ratio
  CALL stuff_bdy(nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,'T',               &
                qbdy3dtemp1,bdys,bdyn,bdyw,bdye)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QVAPOR_B','',       &
                'Water vapor mixing ratio',                             &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  CALL stuff_bdytend(nx_wrf,ny_wrf,nz_wrf,spec_bdy_width,'T',           &
                qbdy3dtemp1,qbdy3dtemp2,bdyintv,bdys,bdyn,bdyw,bdye)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QVAPOR_BT','',      &
                'Water vapor mixing ratio',                             &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  ! 
  ! Although those variables were dumped in wrfbdy_d01, they
  ! are not set to any meaningful value in real_em.f
  ! those are place holders for nested runs.
  !

  bdyw(:,:,:) = 0.0
  bdye(:,:,:) = 0.0
  bdys(:,:,:) = 0.0
  bdyn(:,:,:) = 0.0

  ! RQC
  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QCLOUD_B',          &
                '','Cloud water mixing ratio',                          &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QCLOUD_BT',         &
                '','Cloud water mixing ratio',                          &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  ! RQR
  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QRAIN_B',           &
                '','Rain water mixing ratio',                           &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QRAIN_BT',          &
                '','Rain water mixing ratio',                           &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  ! RQI
  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QICE_B',            &
                '','Ice mixing ratio',                                  &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QICE_BT',           &
                '','Ice mixing ratio',                                  &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  ! RQS
  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QSNOW_B',           &
                '','Snow mixing ratio',                                 &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QSNOW_BT',          &
                '','Snow mixing ratio',                                 &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  ! RQG
  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QGRAUP_B',          &
                '','Graupel mixing ratio',                              &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QGRAUP_BT',         &
                '','Graupel mixing ratio',                              &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  ! QNICE
  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QNICE_B',           &
                '','Ice Number concentration',                          &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  CALL writebdy(ncid,io_form,times_str(1:19),ifile,'QNICE_BT',          &
                '','Ice Number concentration',                          &
                bdyw,bdye,bdys,bdyn,nx_wrf,ny_wrf,nz_wrf,               &
                spec_bdy_width,fzone_wrf,blgw,blge,blgs,blgn,           &
                nxlg_wrf-1,nylg_wrf-1,nz_wrf-1,temx,temy)

  istatus = 0

  RETURN
END SUBROUTINE write_wrf_bdy