subroutine da_transfer_xatowrf(grid, config_flags) 2,8

   !---------------------------------------------------------------------------
   !  Purpose: Convert analysis increments into WRF increments
   !    Updated for Analysis on Arakawa-C grid
   !    Author: Syed RH Rizvi,  MMM/ESSL/NCAR,  Date: 10/22/2008
   !
   !  The following WRF fields are modified:  
   !    grid%u_2
   !    grid%v_2
   !    grid%w_2
   !    grid%mu_2
   !    grid%ph_2
   !    grid%t_2
   !    grid%moist
   !    grid%p
   !    grid%psfc
   !    grid%t2, grid%q2, grid%u10, grid%v10, grid%th2
   !
   !---------------------------------------------------------------------------

   implicit none

   type(domain), intent(inout)            :: grid
   type(grid_config_rec_type), intent(in) :: config_flags

   integer :: i, j, k

   real    :: sdmd, s1md

   ! arrays to hold wrf increments on the c-grid 

#ifdef A2C
   real, dimension(ims:ime,jms:jme, kms:kme) :: q_cgrid, ph_cgrid
#else
   real, dimension(ims:ime,jms:jme, kms:kme) :: &
      u_cgrid, v_cgrid, q_cgrid, ph_cgrid
#endif

   real, dimension(ims:ime,jms:jme) :: mu_cgrid

   real :: t_full, p_full, rho_dry, q_full, ph_full, ph_xb_hd, &
           qvf1, qvf2, qvf1_b, qvf2_b

   real :: uu, vv, ps1, ts1, qv1, height
   real :: zs1, zs2, pf2, theta, thetam, mu_full, pfu, pfd, phm, cvpm, p2m
   real, dimension(kms:kme) :: ald, ph
   logical :: has_lsm_info

   if (trace_use) call da_trace_entry("da_transfer_xatowrf")

   has_lsm_info = .false.
   if ( config_flags%sf_surface_physics == 2 ) then
       if ( sum(grid%hfx*grid%hfx)   > 0.0 .and. &
            sum(grid%qfx*grid%qfx)   > 0.0 ) then
          has_lsm_info = .true.
       end if
   end if

   ! To keep the background PH perturbation:

   do j=jts,jte
      do i=its,ite
         do k=kts, kte+1
            ph_cgrid(i,j,k) = grid%ph_2(i,j,k)
         end do
      end do
   end do

   !---------------------------------------------------------------------------
   ! [1.0] Get the mixing ratio of moisture first, as it its easy.
   !---------------------------------------------------------------------------

   do k=kts,kte
      do j=jts,jte
         do i=its,ite
            if ((grid%xb%q(i,j,k)+grid%xa%q(i,j,k)) < 0.0) then
               q_cgrid(i,j,k) =-grid%xb%q(i,j,k)/(1.0 - grid%xb%q(i,j,k))**2
            else
               q_cgrid(i,j,k) = grid%xa%q(i,j,k)/(1.0 - grid%xb%q(i,j,k))**2
            end if
         end do
      end do
   end do

   !---------------------------------------------------------------------------
   ! [2.0] compute increments of dry-column air mass per unit area
   !---------------------------------------------------------------------------

   do j=jts,jte
      do i=its,ite
         sdmd=0.0
         s1md=0.0
         do k=kts,kte
            sdmd=sdmd+q_cgrid(i,j,k)*grid%dnw(k)
            s1md=s1md+(1.0+grid%moist(i,j,k,P_QV))*grid%dnw(k)
         end do

         mu_cgrid(i,j)=-(grid%xa%psfc(i,j)+grid%xb%psac(i,j)*sdmd)/s1md
      end do
   end do

   !---------------------------------------------------------------------------
   ! [3.0] compute pressure increments 
   !---------------------------------------------------------------------------

   if ( .not. var4d ) then ! for 4dvar, it is usefulless

   ! Tangent linear code for grid%xa%p (based on WRF "real.init.code") 
   ! developed by Y.-R. Guo 05/13/2004:

   do j=jts,jte
      do i=its,ite

         k = kte
         qvf1   = 0.5*(q_cgrid(i,j,k)+q_cgrid(i,j,k))
         qvf1_b = 0.5*(grid%moist(i,j,k,P_QV)+grid%moist(i,j,k,P_QV))
         qvf2   = - qvf1 / ((1.0+qvf1_b)*(1.0+qvf1_b))
         qvf2_b = 1.0/(1.0+qvf1_b)
         qvf1   = qvf1*qvf2_b + qvf1_b*qvf2
         qvf1_b = qvf1_b*qvf2_b
         grid%xa%p(i,j,k) = (-0.5/grid%rdnw(k)) * &
                    ((mu_cgrid(i,j)+qvf1*grid%mub(i,j)) / qvf2_b &
                     -(grid%mu_2(i,j)+qvf1_b*grid%mub(i,j))*qvf2/(qvf2_b*qvf2_b))

         do k = kte-1,1,-1
            qvf1   = 0.5*(q_cgrid(i,j,k)+q_cgrid(i,j,k+1))
            qvf1_b = 0.5*(grid%moist(i,j,k,P_QV)+grid%moist(i,j,k+1,P_QV))
            qvf2   = - qvf1 / ((1.0+qvf1_b)*(1.0+qvf1_b))
            qvf2_b = 1.0/(1.0+qvf1_b)
            qvf1   = qvf1*qvf2_b + qvf1_b*qvf2
            qvf1_b = qvf1_b*qvf2_b
            grid%xa%p(i,j,k) = grid%xa%p(i,j,k+1)  &
                       - (1.0/grid%rdn(k+1)) * &
                       ((mu_cgrid(i,j)+qvf1*grid%mub(i,j)) / qvf2_b &
                        -(grid%mu_2(i,j)+qvf1_b*grid%mub(i,j))*qvf2/(qvf2_b*qvf2_b))
         end do

      end do
   end do

   else
    
      do k=kts, kte
        do j=jts,jte
           do i=its,ite
              grid%xa%p(i,j,k) = 0.
           end do
        end do
      end do

   endif 

   ! update perturbation pressure

   do k=kts, kte
     do j=jts,jte
        do i=its,ite
           grid%p(i,j,k) = grid%p(i,j,k) + grid%xa%p(i,j,k)
        end do
     end do
   end do

   ! Adjust grid%xa%q to make grid%xb%q + grid%xa%q > 0.0

   if (check_rh == check_rh_tpw) then
      ! Shu-Hua~s TPW conservation:
      call da_check_rh(grid)
   else if (check_rh == check_rh_simple) then
      ! Simple resetting to max/min values:
      call da_check_rh_simple(grid)
   end if

   do k=kts,kte
      do j=jts,jte
         do i=its,ite
            q_cgrid(i,j,k) = grid%xa%q(i,j,k)/(1.0 - grid%xb%q(i,j,k))**2
         end do
      end do
   end do

   !---------------------------------------------------------------------------
   ! [4.0] Convert temperature increments into theta increments 
   !       Evaluate also the increments of (1/rho) and geopotential
   !---------------------------------------------------------------------------

   if (print_detail_xa) then
      write(unit=stdout, fmt='(a, e24.12)') &
         'sum(abs(grid%xa%t(its:ite,jts:jte,kts:kte)))=', &
         sum(abs(grid%xa%t(its:ite,jts:jte,kts:kte))), &
         'sum(abs(grid%xa%p(its:ite,jts:jte,kts:kte)))=', &
         sum(abs(grid%xa%p(its:ite,jts:jte,kts:kte))), &
         'sum(abs(grid%xb%t(its:ite,jts:jte,kts:kte)))=', &
         sum(abs(grid%xb%t(its:ite,jts:jte,kts:kte))), &
         'sum(abs(grid%xb%p(its:ite,jts:jte,kts:kte)))=', &
         sum(abs(grid%xb%p(its:ite,jts:jte,kts:kte))), &
         'sum(abs(grid%t_2 (its:ite,jts:jte,kts:kte)))=', &
         sum(abs(grid%t_2 (its:ite,jts:jte,kts:kte)))

       write(unit=stdout, fmt='(2(2x, a, e20.12))') &
          'maxval(grid%xa%u(its:ite,jts:jte,kts:kte))=', &
          maxval(grid%xa%u(its:ite,jts:jte,kts:kte)), &
          'minval(grid%xa%u(its:ite,jts:jte,kts:kte))=', & 
          minval(grid%xa%u(its:ite,jts:jte,kts:kte)), &
          'maxval(grid%xa%v(its:ite,jts:jte,kts:kte))=', &
          maxval(grid%xa%v(its:ite,jts:jte,kts:kte)), &
          'minval(grid%xa%v(its:ite,jts:jte,kts:kte))=', &
          minval(grid%xa%v(its:ite,jts:jte,kts:kte)), &
          'maxval(grid%xa%t(its:ite,jts:jte,kts:kte))=', &
          maxval(grid%xa%t(its:ite,jts:jte,kts:kte)), &
          'minval(grid%xa%t(its:ite,jts:jte,kts:kte))=', &
          minval(grid%xa%t(its:ite,jts:jte,kts:kte)), &
          'maxval(grid%xa%q(its:ite,jts:jte,kts:kte))=', &
          maxval(grid%xa%q(its:ite,jts:jte,kts:kte)), &
          'minval(grid%xa%q(its:ite,jts:jte,kts:kte))=', &
          minval(grid%xa%q(its:ite,jts:jte,kts:kte)), &
          'maxval(grid%xa%p(its:ite,jts:jte,kts:kte))=', &
          maxval(grid%xa%p(its:ite,jts:jte,kts:kte)), &
          'minval(grid%xa%p(its:ite,jts:jte,kts:kte))=', &
          minval(grid%xa%p(its:ite,jts:jte,kts:kte)), &
          'maxval(grid%xa%psfc(its:ite,jts:jte))   =', &
          maxval(grid%xa%psfc(its:ite,jts:jte)), &
          'minval(grid%xa%psfc(its:ite,jts:jte))   =', &
          minval(grid%xa%psfc(its:ite,jts:jte))
   end if

   IF (grid%hypsometric_opt == 1) THEN

   do j=jts,jte
      do i=its,ite

         ph_full  = grid%ht(i,j) * gravity
         ph_xb_hd = grid%ht(i,j) * gravity
         do k = kts, kte
            ! To obtain all of the full fitelds: t, p, q(mixing ratio), rho
            t_full   = grid%xa%t(i,j,k) + grid%xb%t(i,j,k)
            p_full   = grid%xa%p(i,j,k) + grid%xb%p(i,j,k)
            q_full   = grid%moist(i,j,k,P_QV) + q_cgrid(i,j,k)

            ! Note: According to WRF, this is the dry air density used to
            !       compute the geopotential height: 
            rho_dry = p_full / (gas_constant*t_full*(1.0+q_full/rd_over_rv))

            ! To compute the theta increment with the full fields:
            grid%t_2(i,j,k) = t_full*(base_pres/p_full)**kappa - t0

            ! The full fiteld of analysis ph:
            ph_full  = ph_full  &
                       - grid%xb%dnw(k) * (grid%xb%psac(i,j)+mu_cgrid(i,j)) / rho_dry

            ! background hydrostatic phi:
            ph_xb_hd  = ph_xb_hd  &
                       - grid%xb%dnw(k) * grid%xb%psac(i,j) / grid%xb%rho(i,j,k)

            ! The analysis perturbation = Hydro_ph - base_ph + nonhydro_xb_ph:
            grid%ph_2(i,j,k+1) = ph_full - grid%phb(i,j,k+1) &
                            + (grid%xb%hf(i,j,k+1)*gravity - ph_xb_hd)
         end do
      end do
   end do

   ELSE IF  (grid%hypsometric_opt == 2) THEN

   ! Geopotential increment reflecting hypsometric_opt: wee 11/29/2011

   cvpm =  - (1.0 - gas_constant/cp)

   DO j=jts,jte
   DO i=its,ite

      ! dry air density
      mu_full = grid%mub(i,j)+grid%mu_2(i,j)+mu_cgrid(i,j)
      ph      = 0.0

      ! Compute geopotential (using dry inverse density and dry pressure)

      ph(kts) = grid%ht(i,j) * gravity
      DO k = kts, kte
         p_full = grid%xb%p(i,j,k) + grid%xa%p(i,j,k)
         t_full = grid%xb%t(i,j,k) + grid%xa%t(i,j,k)
         q_full = grid%moist(i,j,k,P_QV) + q_cgrid(i,j,k)
         theta  = t_full*(base_pres/p_full)**kappa

         ! Update potential temperature
         grid%t_2(i,j,k) = theta - t0

         ! Compute dry inverse density using the equation of state
         thetam = theta*(1.0 + q_full/rd_over_rv)
         ald(k) = (gas_constant/base_pres)*thetam*(p_full/base_pres)**cvpm

      ! Dry mass is purely hydrostatic: Native approach in WRF

          pfu = mu_full*grid%znw(k+1) + grid%p_top
          pfd = mu_full*grid%znw(k)   + grid%p_top
          phm = mu_full*grid%znu(k)   + grid%p_top
          ph(k+1) = ph(k) + ald(k)*phm*LOG(pfd/pfu) 
          grid%ph_2(i,j,k+1) = ph(k+1) - grid%phb(i,j,k+1)
       END DO

      ! Update geopotential perturbation

!      grid%ph_2(i,j,:) = 0.0
!      DO k= kts, kte+1
!         grid%ph_2(i,j,k) = ph(k) - grid%phb(i,j,k)
!      END DO

   END DO
   END DO

   ENDIF ! hypsometric_opt

   ! To compute the geopotential height increment:

   do k=kts, kte+1
     do j=jts,jte
        do i=its,ite
           ph_cgrid(i,j,k) = grid%ph_2(i,j,k) - ph_cgrid(i,j,k)
        end do
     end do
   end do

   ! ========================
   ! Write out the increment:
   ! ========================

   if (write_increments) then
      write(unit=stdout,fmt='(/"Write out increment for plotting......")')
      call da_write_increments (grid, q_cgrid, mu_cgrid, ph_cgrid)
   end if

#ifdef A2C

  if ((fg_format==fg_format_wrf_arw_regional  .or. &
       fg_format==fg_format_wrf_arw_global  ) .and. ide == ipe ) then
     ipe = ipe + 1
     ide = ide + 1
  end if

  if ((fg_format==fg_format_wrf_arw_regional  .or. &
       fg_format==fg_format_wrf_arw_global  ) .and. jde == jpe ) then
     jpe = jpe + 1
     jde = jde + 1
  end if
#else
   ! CONVERT FROM A-GRID TO C-GRID

#endif

#ifdef DM_PARALLEL
#include "HALO_XA_A.inc"
#endif

#ifdef A2C
  if ((fg_format==fg_format_wrf_arw_regional  .or. &
       fg_format==fg_format_wrf_arw_global  ) .and. ide == ipe ) then
     ipe = ipe - 1
     ide = ide - 1
  end if

  if ((fg_format==fg_format_wrf_arw_regional  .or. &
       fg_format==fg_format_wrf_arw_global  ) .and. jde == jpe ) then
     jpe = jpe - 1
     jde = jde - 1
  end if
#else
   ! Fill the boundary

   ! The southern boundary
   if (jts == jds) then
      grid%xa%v(its:ite,jts-1,kts:kte)=2.0*grid%xa%v(its:ite,jts  ,kts:kte) &
                            -    grid%xa%v(its:ite,jts+1,kts:kte)
   end if

   ! The northern boundary
   if (jte == jde) then
      grid%xa%v(its:ite,jte+1,kts:kte)=2.0*grid%xa%v(its:ite,jte  ,kts:kte) &
                            -    grid%xa%v(its:ite,jte-1,kts:kte)
   end if

   ! The western boundary
   if (its == ids) then
      grid%xa%u(its-1,jts:jte,kts:kte)=2.0*grid%xa%u(its  ,jts:jte,kts:kte) &
                            -    grid%xa%u(its+1,jts:jte,kts:kte)
   end if

   ! The eastern boundary
   if (ite == ide) then
      grid%xa%u(ite+1,jts:jte,kts:kte)=2.0*grid%xa%u(ite  ,jts:jte,kts:kte) &
                            -    grid%xa%u(ite-1,jts:jte,kts:kte)
   end if

   do k=kts,kte
      do j=jts,jte+1
         do i=its,ite+1
            u_cgrid(i,j,k)=0.5*(grid%xa%u(i-1,j  ,k)+grid%xa%u(i,j,k))
            v_cgrid(i,j,k)=0.5*(grid%xa%v(i  ,j-1,k)+grid%xa%v(i,j,k))
         end do
      end do
   end do

   !------------------------------------------------------------------------
   ! For later plot and comparation Purpose only, zero out the unused var.
   !------------------------------------------------------------------------

   ! The northern boundary
   if (jte == jde) then
      u_cgrid(its:ite+1,jte+1,kts:kte)=0.0
   end if

   ! The eastern boundary
   if (ite == ide) then
      v_cgrid(ite+1,jts:jte+1,kts:kte)=0.0
   end if
#endif
   !---------------------------------------------------------------------------
   ! [5.0] add increment to the original guess and update "grid"
   !---------------------------------------------------------------------------

   do j=jts,jte
      do i=its,ite
         grid%mu_2(i,j) = grid%mu_2(i,j) + mu_cgrid(i,j)
         grid%w_2(i,j,kte+1)=  grid%w_2(i,j,kte+1) + grid%xa%w(i,j,kte+1)
         grid%psfc(i,j) = grid%psfc(i,j) + grid%xa%psfc(i,j)
      end do

      do k=kts,kte
         do i=its,ite
#ifndef A2C
            grid%u_2(i,j,k) = grid%u_2(i,j,k) + u_cgrid(i,j,k)
            grid%v_2(i,j,k) = grid%v_2(i,j,k) + v_cgrid(i,j,k)
#endif
            grid%w_2(i,j,k) = grid%w_2(i,j,k) + grid%xa%w(i,j,k)

            ! (xb%q+xa%q in specific humidity) >= 0.0
            ! does not guarantee that (qv+q_cgrid in mixing ratio) >= 0.0
            ! for example, when xa%q is negative, q_cgrid is a lager negative value.
            ! impose a minimum value to prevent negative final qv
            if ( num_pseudo == 0 ) then
               grid%moist(i,j,k,P_QV) = max(grid%moist(i,j,k,P_QV)+q_cgrid(i,j,k), qlimit)
            else
               grid%moist(i,j,k,P_QV) = grid%moist(i,j,k,P_QV)+q_cgrid(i,j,k)
            end if

            if (size(grid%moist,dim=4) >= 4) then
               grid%moist(i,j,k,p_qc) = max(grid%moist(i,j,k,p_qc) + grid%xa%qcw(i,j,k), 0.0)
               grid%moist(i,j,k,p_qr) = max(grid%moist(i,j,k,p_qr) + grid%xa%qrn(i,j,k), 0.0)
            end if

            if (size(grid%moist,dim=4) >= 6) then
               grid%moist(i,j,k,p_qi) = max(grid%moist(i,j,k,p_qi) + grid%xa%qci(i,j,k), 0.0)
               grid%moist(i,j,k,p_qs) = max(grid%moist(i,j,k,p_qs) + grid%xa%qsn(i,j,k), 0.0)
            end if

            if (size(grid%moist,dim=4) >= 7) then
               grid%moist(i,j,k,p_qg) = max(grid%moist(i,j,k,p_qg) + grid%xa%qgr(i,j,k), 0.0)
            end if
         end do
      end do
   end do

#ifdef A2C
   do j=jts,jte
      do k=kts,kte
         do i=its,ite+1
          grid%u_2(i,j,k) = grid%u_2(i,j,k) + grid%xa%u(i,j,k)
         end do
      end do
   end do

   do j=jts,jte+1
      do k=kts,kte
         do i=its,ite
          grid%v_2(i,j,k) = grid%v_2(i,j,k) + grid%xa%v(i,j,k)
         end do
      end do
   end do
#else
   ! The northern boundary
   if (jte == jde) then
      j=jte+1
      do k=kts,kte
         do i=its,ite
            grid%v_2(i,j,k) = grid%v_2(i,j,k) + v_cgrid(i,j,k)
         end do
      end do
   end if

   ! The eastern boundary
   if (ite == ide) then
      i=ite+1
      do k=kts,kte
         do j=jts,jte
            grid%u_2(i,j,k) = grid%u_2(i,j,k) + u_cgrid(i,j,k)
         end do
      end do
   end if
#endif

#ifdef DM_PARALLEL
#include "HALO_EM_C.inc"
#endif
! re-calculate T2, Q2, U10, V10, TH2 using updated fields

   do j=jts,jte
      do i=its,ite
         uu = 0.5*(grid%u_2(i,j,kts)+grid%u_2(i+1,j,kts) )
         vv = 0.5*(grid%v_2(i,j,kts)+grid%v_2(i,j+1,kts) )
         ps1 = grid%p(i,j,kts)   + grid%pb(i,j,kts)
         ts1 = (t0+grid%t_2(i,j,kts))*(ps1/base_pres)**kappa
         qv1 = grid%moist(i,j,kts, p_qv) !qv1, input to da_sfc_wtq, is mixing ratio
         !hcl-07/2015 comment out below
         !if (grid%hypsometric_opt == 1) then
         !   height = 0.5*(grid%phb(i,j,kts)+grid%ph_2(i,j,kts)+ &
         !                 grid%phb(i,j,kts+1)+grid%ph_2(i,j,kts+1))/gravity
         !   height = height - grid%ht(i,j)
         !elseif (grid%hypsometric_opt == 2) then
         ! ! Height is in proportion to log pressure: wee 11/22/2011
         !   zs1 = (grid%phb(i,j,kts)+grid%ph_2(i,j,kts))/gravity
         !   zs2 = (grid%phb(i,j,kts+1)+grid%ph_2(i,j,kts+1))/gravity
         !
         !   mu_full = grid%mub(i,j)+grid%mu_2(i,j)
         !   pfu = mu_full*grid%znw(kts+1) + grid%p_top
         !   pfd = mu_full*grid%znw(kts)   + grid%p_top
         !   phm = mu_full*grid%znu(kts)   + grid%p_top
         !   height = (zs2-zs1)*LOG(pfd/phm)/LOG(pfd/pfu)
         !endif
         !hcl-07/2015 to be consistent with the height calculation done in wrf
         height = 0.5*(grid%phb(i,j,kts)+grid%ph_2(i,j,kts)+ &
                       grid%phb(i,j,kts+1)+grid%ph_2(i,j,kts+1))/gravity
         height = height - grid%ht(i,j)
         if (height <= 0.0) then
            message(1) = "Negative height found"
            write (unit=message(2),FMT='(2I6,A,F10.2,A,F10.2)') &
               i,j,' ht = ',height ,' terr =  ',grid%ht(i,j)
            call da_error(__FILE__,__LINE__, message(1:2))
         end if
         if ( update_sfcdiags ) then
            if ( use_wrf_sfcinfo ) then
               call da_sfc_wtq(grid%psfc(i,j), grid%tsk(i,j),                 &
                  ps1, ts1, qv1, uu, vv,                                      &
                  height,  grid%xb%rough(i,j),grid%xb%xland(i,j), grid%xb%ds, &
                  grid%u10(i,j), grid%v10(i,j), grid%t2(i,j),                 &
                  grid%q2(i,j), grid%xb%regime(i,j),                          &
                  has_lsm_info, regime_wrf=grid%regime(i,j),                  &
                  qsfc_wrf=grid%qsfc(i,j), znt_wrf=grid%znt(i,j),             &
                  ust_wrf=grid%ust(i,j), mol_wrf=grid%mol(i,j),               &
                  hfx=grid%hfx(i,j), qfx=grid%qfx(i,j), pblh=grid%pblh(i,j) )
            else
               call da_sfc_wtq(grid%psfc(i,j), grid%tsk(i,j),                 &
                  ps1, ts1, qv1, uu, vv,                                      &
                  height,  grid%xb%rough(i,j),grid%xb%xland(i,j), grid%xb%ds, &
                  grid%u10(i,j), grid%v10(i,j), grid%t2(i,j),                 &
                  grid%q2(i,j), grid%xb%regime(i,j))
            end if

            ! 2-m pressure: Ground level and first half level are used
            !hcl p2m = grid%psfc(i,j)*EXP(-2.0/height*LOG(grid%psfc(i,j)/ps1))
            !hcl grid%th2(i,j) = grid%t2(i,j)*(base_pres/p2m)**kappa

            !hcl-07/2015 to be consistent with the th2 calculation done in wrf
            grid%th2(i,j) = grid%t2(i,j)*(base_pres/grid%psfc(i,j))**kappa
         end if ! if update_sfcdiags
      end do
   end do

   if (print_detail_xa) then
      write(unit=stdout, fmt=*) 'simple variables:'

      if (ite == ide) then
         write (unit=stdout,fmt=*)  ' '

         do k=kts+5,kte,10
            do j=jts,jte,10
               write(unit=stdout, fmt=*) &
                    '  grid%u_2(', ide+1, ',', j, ',', k, ')=', &
                       grid%u_2(ide+1,j,k)
            end do
            write(unit=stdout, fmt=*) ' '
         end do
      end if

      if (jte == jde) then
         write(unit=stdout, fmt=*) ' '

         do k=kts+5,kte,10
            do i=its,ite,10
               write(unit=stdout, fmt=*) &
                    '  grid%v_2(', i, ',', jde+1, ',', k, ')=', &
                       grid%v_2(i, jde+1,k)
            end do
            write(unit=stdout, fmt=*) ' '
         end do
      end if

#ifdef A2C
      write(unit=stdout, fmt='(2(2x, a, e20.12))') &
         'maxval(mu_cgrid(its:ite,jts:jte))       =', &
         maxval(mu_cgrid(its:ite,jts:jte)), &
         'minval(mu_cgrid(its:ite,jts:jte))       =', &
         minval(mu_cgrid(its:ite,jts:jte)), &
         'maxval(q_cgrid(its:ite,jts:jte,kts:kte))  =', &
         maxval(q_cgrid(its:ite,jts:jte,kts:kte)), &
         'minval(q_cgrid(its:ite,jts:jte,kts:kte))  =', &
         minval(q_cgrid(its:ite,jts:jte,kts:kte))
#else
      write(unit=stdout, fmt='(2(2x, a, e20.12))') &
         'maxval(mu_cgrid(its:ite,jts:jte))       =', &
         maxval(mu_cgrid(its:ite,jts:jte)), &
         'minval(mu_cgrid(its:ite,jts:jte))       =', &
         minval(mu_cgrid(its:ite,jts:jte)), &
        'maxval(u_cgrid(its:ite,jts:jte,kts:kte))  =', &
         maxval(u_cgrid(its:ite,jts:jte,kts:kte)), &
         'minval(u_cgrid(its:ite,jts:jte,kts:kte))  =', &
         minval(u_cgrid(its:ite,jts:jte,kts:kte)), &
         'maxval(v_cgrid(its:ite,jts:jte,kts:kte))  =', &
         maxval(v_cgrid(its:ite,jts:jte,kts:kte)), &
         'minval(v_cgrid(its:ite,jts:jte,kts:kte))  =', &
         minval(v_cgrid(its:ite,jts:jte,kts:kte)), &
         'maxval(q_cgrid(its:ite,jts:jte,kts:kte))  =', &
         maxval(q_cgrid(its:ite,jts:jte,kts:kte)), &
         'minval(q_cgrid(its:ite,jts:jte,kts:kte))  =', &
         minval(q_cgrid(its:ite,jts:jte,kts:kte))
#endif

      do k=kts,kte
         write(unit=stdout, fmt='(a, i3)') 'k=', k

#ifdef A2C
         write(unit=stdout, fmt='(2(2x, a, e20.12))') &
            'maxval(q_cgrid(its:ite,jts:jte,k))  =', maxval(q_cgrid(its:ite,jts:jte,k)), &
            'minval(q_cgrid(its:ite,jts:jte,k))  =', minval(q_cgrid(its:ite,jts:jte,k))
#else
         write(unit=stdout, fmt='(2(2x, a, e20.12))') &
            'maxval(u_cgrid(its:ite,jts:jte,k))  =', maxval(u_cgrid(its:ite,jts:jte,k)), &
            'minval(u_cgrid(its:ite,jts:jte,k))  =', minval(u_cgrid(its:ite,jts:jte,k)), &
            'maxval(v_cgrid(its:ite,jts:jte,k))  =', maxval(v_cgrid(its:ite,jts:jte,k)), &
            'minval(v_cgrid(its:ite,jts:jte,k))  =', minval(v_cgrid(its:ite,jts:jte,k)), &
            'maxval(q_cgrid(its:ite,jts:jte,k))  =', maxval(q_cgrid(its:ite,jts:jte,k)), &
            'minval(q_cgrid(its:ite,jts:jte,k))  =', minval(q_cgrid(its:ite,jts:jte,k))
#endif
      end do
   end if
#ifdef VAR4D
   IF ( var4d ) THEN

      ! We need to transfer LBC perturbation from model_grid to grid for output

      grid%u_bxs = grid%u_bxs + model_grid%g_u_bxs
      grid%u_bxe = grid%u_bxe + model_grid%g_u_bxe
      grid%u_bys = grid%u_bys + model_grid%g_u_bys
      grid%u_bye = grid%u_bye + model_grid%g_u_bye
      grid%v_bxs = grid%v_bxs + model_grid%g_v_bxs
      grid%v_bxe = grid%v_bxe + model_grid%g_v_bxe
      grid%v_bys = grid%v_bys + model_grid%g_v_bys
      grid%v_bye = grid%v_bye + model_grid%g_v_bye
!     grid%w_bxs = grid%w_bxs + model_grid%g_w_bxs
!     grid%w_bxe = grid%w_bxe + model_grid%g_w_bxe
!     grid%w_bys = grid%w_bys + model_grid%g_w_bys
!     grid%w_bye = grid%w_bye + model_grid%g_w_bye
      grid%t_bxs = grid%t_bxs + model_grid%g_t_bxs
      grid%t_bxe = grid%t_bxe + model_grid%g_t_bxe
      grid%t_bys = grid%t_bys + model_grid%g_t_bys
      grid%t_bye = grid%t_bye + model_grid%g_t_bye
      grid%mu_bxs = grid%mu_bxs + model_grid%g_mu_bxs
      grid%mu_bxe = grid%mu_bxe + model_grid%g_mu_bxe
      grid%mu_bys = grid%mu_bys + model_grid%g_mu_bys
      grid%mu_bye = grid%mu_bye + model_grid%g_mu_bye
      grid%ph_bxs = grid%ph_bxs + model_grid%g_ph_bxs
      grid%ph_bxe = grid%ph_bxe + model_grid%g_ph_bxe
      grid%ph_bys = grid%ph_bys + model_grid%g_ph_bys
      grid%ph_bye = grid%ph_bye + model_grid%g_ph_bye
      grid%moist_bxs = grid%moist_bxs + model_grid%g_moist_bxs
      grid%moist_bxe = grid%moist_bxe + model_grid%g_moist_bxe
      grid%moist_bys = grid%moist_bys + model_grid%g_moist_bys
      grid%moist_bye = grid%moist_bye + model_grid%g_moist_bye
   
      grid%u_btxs = grid%u_btxs + model_grid%g_u_btxs
      grid%u_btxe = grid%u_btxe + model_grid%g_u_btxe
      grid%u_btys = grid%u_btys + model_grid%g_u_btys
      grid%u_btye = grid%u_btye + model_grid%g_u_btye
      grid%v_btxs = grid%v_btxs + model_grid%g_v_btxs
      grid%v_btxe = grid%v_btxe + model_grid%g_v_btxe
      grid%v_btys = grid%v_btys + model_grid%g_v_btys
      grid%v_btye = grid%v_btye + model_grid%g_v_btye
!     grid%w_btxs = grid%w_btxs + model_grid%g_w_btxs
!     grid%w_btxe = grid%w_btxe + model_grid%g_w_btxe
!     grid%w_btys = grid%w_btys + model_grid%g_w_btys
!     grid%w_btye = grid%w_btye + model_grid%g_w_btye
      grid%t_btxs = grid%t_btxs + model_grid%g_t_btxs
      grid%t_btxe = grid%t_btxe + model_grid%g_t_btxe
      grid%t_btys = grid%t_btys + model_grid%g_t_btys
      grid%t_btye = grid%t_btye + model_grid%g_t_btye
      grid%mu_btxs = grid%mu_btxs + model_grid%g_mu_btxs
      grid%mu_btxe = grid%mu_btxe + model_grid%g_mu_btxe
      grid%mu_btys = grid%mu_btys + model_grid%g_mu_btys
      grid%mu_btye = grid%mu_btye + model_grid%g_mu_btye
      grid%ph_btxs = grid%ph_btxs + model_grid%g_ph_btxs
      grid%ph_btxe = grid%ph_btxe + model_grid%g_ph_btxe
      grid%ph_btys = grid%ph_btys + model_grid%g_ph_btys
      grid%ph_btye = grid%ph_btye + model_grid%g_ph_btye
      grid%moist_btxs = grid%moist_btxs + model_grid%g_moist_btxs
      grid%moist_btxe = grid%moist_btxe + model_grid%g_moist_btxe
      grid%moist_btys = grid%moist_btys + model_grid%g_moist_btys
      grid%moist_btye = grid%moist_btye + model_grid%g_moist_btye

   ENDIF
#endif
   if (trace_use) call da_trace_exit("da_transfer_xatowrf")

end subroutine da_transfer_xatowrf