<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 ! < y, y >
real :: adj_ttl_rhs ! < x, x_adj >
real :: partial_lhs ! < y, y >
real :: partial_rhs ! < x, x_adj >
real :: pertile_lhs ! < y, y >
real :: pertile_rhs ! < x, x_adj >
integer :: n
real, dimension(ims:ime, jms:jme, kms:kme) :: xa2_u, xa2_v, xa2_t, &
xa2_p, xa2_q
real, dimension(ims:ime, jms:jme) :: xa2_u10, xa2_v10, xa2_t2, &
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 &
+ y%synop(n)%u * y%synop(n)%u &
+ y%synop(n)%v * y%synop(n)%v &
+ y%synop(n)%t * y%synop(n)%t &
+ y%synop(n)%p * y%synop(n)%p &
+ y%synop(n)%q * y%synop(n)%q
if (iv%info(synop)%proc_domain(1,n)) then
partial_lhs = partial_lhs &
+ y%synop(n)%u * y%synop(n)%u &
+ y%synop(n)%v * y%synop(n)%v &
+ y%synop(n)%t * y%synop(n)%t &
+ y%synop(n)%p * y%synop(n)%p &
+ 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) * &
xa2_u(ims:ime, jms:jme, kms:kme)) + &
sum(grid%xa%v(ims:ime, jms:jme, kms:kme) * &
xa2_v(ims:ime, jms:jme, kms:kme)) + &
sum(grid%xa%t(ims:ime, jms:jme, kms:kme) * &
xa2_t(ims:ime, jms:jme, kms:kme)) + &
sum(grid%xa%p(ims:ime, jms:jme, kms:kme) * &
xa2_p(ims:ime, jms:jme, kms:kme)) + &
sum(grid%xa%q(ims:ime, jms:jme, kms:kme) * &
xa2_q(ims:ime, jms:jme, kms:kme)) + &
sum(grid%xa%psfc(ims:ime, jms:jme) * xa2_psfc(ims:ime, jms:jme))
!-------------------------------------------------------------------------
! [6.0] Calculate RHS of adjivnt test equation:
!-------------------------------------------------------------------------
partial_rhs = &
sum(grid%xa%u(its:ite, jts:jte, kts:kte) * xa2_u(its:ite,jts:jte,kts:kte)) + &
sum(grid%xa%v(its:ite, jts:jte, kts:kte) * xa2_v(its:ite,jts:jte,kts:kte)) + &
sum(grid%xa%t(its:ite, jts:jte, kts:kte) * xa2_t(its:ite,jts:jte,kts:kte)) + &
sum(grid%xa%p(its:ite, jts:jte, kts:kte) * xa2_p(its:ite,jts:jte,kts:kte)) + &
sum(grid%xa%q(its:ite, jts:jte, kts:kte) * xa2_q(its:ite,jts:jte,kts:kte)) + &
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)') &
' Tile < y, y > = ', pertile_lhs, &
' Tile < x, x_adj > = ', 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)') &
'TEST_COVERAGE_check_sfc_assi_A: adj_ttl_lhs,adj_ttl_rhs = ', &
adj_ttl_lhs,adj_ttl_rhs
if (rootproc) then
write(unit=stdout, fmt='(A,1pe22.14)') &
' Whole Domain < y, y > = ', adj_ttl_lhs
write(unit=stdout, fmt='(A,1pe22.14)') &
' Whole Domain < x, x_adj > = ', 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