<HTML> <BODY BGCOLOR=#ccccdd LINK=#0000aa VLINK=#0000ff ALINK=#ff0000 ><BASE TARGET="bottom_target"><PRE>
<A NAME='DA_CHECK_SFC_ASSI'><A href='../../html_code/test/da_check_sfc_assi.inc.html#DA_CHECK_SFC_ASSI' TARGET='top_target'><IMG SRC="../../gif/bar_red.gif" border=0></A>

subroutine da_check_sfc_assi(grid, iv, y),8

   !-----------------------------------------------------------------------
   ! Purpose: TBD
   !-----------------------------------------------------------------------
   
   implicit none

   type (domain), intent(inout)     :: grid
  
   type (iv_type),    intent(inout) :: iv    ! ob. increment vector.
   type (y_type),     intent(inout) :: y     ! y = h (grid%xa)

   real                           :: adj_ttl_lhs   ! &lt; y, y &gt;
   real                           :: adj_ttl_rhs   ! &lt; x, x_adj &gt;

   real                           :: partial_lhs   ! &lt; y, y &gt;
   real                           :: partial_rhs   ! &lt; x, x_adj &gt;

   real                           :: pertile_lhs   ! &lt; y, y &gt;
   real                           :: pertile_rhs   ! &lt; x, x_adj &gt;

   integer                        :: n

   real, dimension(ims:ime, jms:jme, kms:kme) :: xa2_u, xa2_v, xa2_t, &amp;
                                                 xa2_p, xa2_q
 
   real, dimension(ims:ime, jms:jme)          :: xa2_u10, xa2_v10, xa2_t2, &amp;
                                                 xa2_q2, xa2_tgrn, xa2_psfc


   if (trace_use) call da_trace_entry("da_check_sfc_assi")
  
   call da_message((/"check_sfc_assi: Adjoint Test Results:"/))
    
   xa2_u(ims:ime, jms:jme, kms:kme) = grid%xa%u(ims:ime, jms:jme, kms:kme)
   xa2_v(ims:ime, jms:jme, kms:kme) = grid%xa%v(ims:ime, jms:jme, kms:kme)
   xa2_t(ims:ime, jms:jme, kms:kme) = grid%xa%t(ims:ime, jms:jme, kms:kme)
   xa2_p(ims:ime, jms:jme, kms:kme) = grid%xa%p(ims:ime, jms:jme, kms:kme)
   xa2_q(ims:ime, jms:jme, kms:kme) = grid%xa%q(ims:ime, jms:jme, kms:kme)

   xa2_psfc(ims:ime, jms:jme) = grid%xa%psfc(ims:ime, jms:jme)
   xa2_tgrn(ims:ime, jms:jme) = grid%xa%tgrn(ims:ime, jms:jme)
   xa2_u10 (ims:ime, jms:jme) = grid%xa%u10 (ims:ime, jms:jme)
   xa2_v10 (ims:ime, jms:jme) = grid%xa%v10 (ims:ime, jms:jme)
   xa2_t2  (ims:ime, jms:jme) = grid%xa%t2  (ims:ime, jms:jme)
   xa2_q2  (ims:ime, jms:jme) = grid%xa%q2  (ims:ime, jms:jme)

   ! WHY?
   ! call check_psfc(grid, iv, y)

   call da_transform_xtowtq (grid)

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


   partial_lhs = 0.0
   pertile_lhs = 0.0

   do n=1, iv%info(synop)%nlocal
      call da_transform_xtopsfc(grid, iv, synop, iv%synop(:), y%synop(:))


      pertile_lhs = pertile_lhs &amp;
                  + y%synop(n)%u * y%synop(n)%u &amp;
                  + y%synop(n)%v * y%synop(n)%v &amp;
                  + y%synop(n)%t * y%synop(n)%t &amp;
                  + y%synop(n)%p * y%synop(n)%p &amp;
                  + y%synop(n)%q * y%synop(n)%q

      if (iv%info(synop)%proc_domain(1,n)) then
         partial_lhs = partial_lhs &amp;
                     + y%synop(n)%u * y%synop(n)%u &amp;
                     + y%synop(n)%v * y%synop(n)%v &amp;
                     + y%synop(n)%t * y%synop(n)%t &amp;
                     + y%synop(n)%p * y%synop(n)%p &amp;
                     + y%synop(n)%q * y%synop(n)%q
      end if
   end do

   !----------------------------------------------------------------------
   ! [5.0] Perform adjoint operation:
   !----------------------------------------------------------------------

   call da_zero_x(grid%xa)

   do n=1, iv%info(synop)%nlocal
      call da_transform_xtopsfc_adj(grid,iv, synop,iv%synop(:),y%synop(:),grid%xa)
   end do

   call da_transform_xtowtq_adj (grid)
   
   pertile_rhs = sum(grid%xa%u(ims:ime, jms:jme, kms:kme) * &amp;
      xa2_u(ims:ime, jms:jme, kms:kme)) + &amp;
                 sum(grid%xa%v(ims:ime, jms:jme, kms:kme) * &amp;
      xa2_v(ims:ime, jms:jme, kms:kme)) + &amp;
                 sum(grid%xa%t(ims:ime, jms:jme, kms:kme) * &amp;
      xa2_t(ims:ime, jms:jme, kms:kme)) + &amp;
                 sum(grid%xa%p(ims:ime, jms:jme, kms:kme) * &amp;
      xa2_p(ims:ime, jms:jme, kms:kme)) + &amp;
                 sum(grid%xa%q(ims:ime, jms:jme, kms:kme) * &amp;
      xa2_q(ims:ime, jms:jme, kms:kme)) + &amp;
                 sum(grid%xa%psfc(ims:ime, jms:jme) * xa2_psfc(ims:ime, jms:jme))

   !-------------------------------------------------------------------------
   ! [6.0] Calculate RHS of adjivnt test equation:
   !-------------------------------------------------------------------------
   
   partial_rhs = &amp;
      sum(grid%xa%u(its:ite, jts:jte, kts:kte) * xa2_u(its:ite,jts:jte,kts:kte)) + &amp;
      sum(grid%xa%v(its:ite, jts:jte, kts:kte) * xa2_v(its:ite,jts:jte,kts:kte)) + &amp;
      sum(grid%xa%t(its:ite, jts:jte, kts:kte) * xa2_t(its:ite,jts:jte,kts:kte)) + &amp;
      sum(grid%xa%p(its:ite, jts:jte, kts:kte) * xa2_p(its:ite,jts:jte,kts:kte)) + &amp;
      sum(grid%xa%q(its:ite, jts:jte, kts:kte) * xa2_q(its:ite,jts:jte,kts:kte)) + &amp;
      sum(grid%xa%psfc(its:ite, jts:jte) * xa2_psfc(its:ite, jts:jte))
   
   !-------------------------------------------------------------------------
   ! [7.0] Print output:
   !-------------------------------------------------------------------------
   
   write(unit=stdout, fmt='(A,1pe22.14)') &amp;
        ' Tile &lt; y, y     &gt; = ', pertile_lhs, &amp;
        ' Tile &lt; x, x_adj &gt; = ', pertile_rhs

   adj_ttl_lhs = wrf_dm_sum_real(partial_lhs)
   adj_ttl_rhs = wrf_dm_sum_real(partial_rhs)
   write (unit=stdout,fmt='(A,2F10.2)') &amp;
      'TEST_COVERAGE_check_sfc_assi_A:  adj_ttl_lhs,adj_ttl_rhs = ', &amp;
      adj_ttl_lhs,adj_ttl_rhs
   if (rootproc) then
      write(unit=stdout, fmt='(A,1pe22.14)') &amp;
         ' Whole Domain &lt; y, y     &gt; = ', adj_ttl_lhs
      write(unit=stdout, fmt='(A,1pe22.14)') &amp;
         ' Whole Domain &lt; x, x_adj &gt; = ', adj_ttl_rhs
   end if

   ! recover grid%xa
   grid%xa%u(ims:ime, jms:jme, kms:kme) = xa2_u(ims:ime, jms:jme, kms:kme)
   grid%xa%v(ims:ime, jms:jme, kms:kme) = xa2_v(ims:ime, jms:jme, kms:kme)
   grid%xa%t(ims:ime, jms:jme, kms:kme) = xa2_t(ims:ime, jms:jme, kms:kme)
   grid%xa%p(ims:ime, jms:jme, kms:kme) = xa2_p(ims:ime, jms:jme, kms:kme)
   grid%xa%q(ims:ime, jms:jme, kms:kme) = xa2_q(ims:ime, jms:jme, kms:kme)

   grid%xa%psfc(ims:ime, jms:jme) = xa2_psfc(ims:ime, jms:jme)
   grid%xa%tgrn(ims:ime, jms:jme) = xa2_tgrn(ims:ime, jms:jme)
   grid%xa%u10 (ims:ime, jms:jme) = xa2_u10 (ims:ime, jms:jme)
   grid%xa%v10 (ims:ime, jms:jme) = xa2_v10 (ims:ime, jms:jme)
   grid%xa%t2  (ims:ime, jms:jme) = xa2_t2  (ims:ime, jms:jme)
   grid%xa%q2  (ims:ime, jms:jme) = xa2_q2  (ims:ime, jms:jme)

   call wrf_shutdown

   if (trace_use) call da_trace_exit("da_check_sfc_assi")
   
end subroutine da_check_sfc_assi