da_transform_vvtovp_adj.inc

References to this file elsewhere.
1 subroutine da_transform_vvtovp_adj(evec, eval, vertical_wgt, vp, vv, mz, levels)
2 
3    !---------------------------------------------------------------------------
4    ! Purpose: Adjoint of da_transform_vvtovp.
5    !---------------------------------------------------------------------------
6 
7    implicit none
8    
9    integer, intent(in) :: mz                         ! # vertical modes.
10    integer, intent(in) :: levels                     ! no. of vertical levels
11 
12    real, intent(in)    :: evec(jds:jde,kds:kde,1:mz) ! Eigenvectors.
13    real, intent(in)    :: eval(jds:jde,1:mz)         ! Eigenvalues.
14    real, intent(in)    :: vertical_wgt(ims:ime,jms:jme,kms:kme) ! Weighting.
15    real, intent(inout) :: vp(ims:ime,jms:jme,kms:kme)! CV in level space.
16    real, intent(out)   :: vv(ims:ime,jms:jme,kms:kme)! CV in EOF space.
17  
18    integer :: i, j, m, k                 ! Loop counters.
19    real    :: temp
20 
21    if (trace_use_dull) call da_trace_entry("da_transform_vvtovp_adj")
22 
23    !-------------------------------------------------------------------
24    ! [1.0] Apply inner-product weighting if vertical_ip /= vertical_ip_0:
25    !------------------------------------------------------------------- 
26 
27    if (vertical_ip /= vertical_ip_0) then
28       vp(its:ite,jts:jte,kts:levels) = vp(its:ite,jts:jte,kts:levels) / &
29          vertical_wgt(its:ite,jts:jte,kts:levels)
30    end if
31 
32    !-------------------------------------------------------------------
33    ! [2.0] Perform vp(i,j,k) = E L^{1/2} vv(i,j,m) transform:
34    !------------------------------------------------------------------- 
35 
36    vv = 0.0
37    do m = 1, mz
38       do k = kts, levels
39          do j = jts, jte
40             temp = evec(j,k,m) * eval(j,m)
41 
42             do i = its, ite
43                vv(i,j,m) = vv(i,j,m) + temp*vp(i,j,k)
44             end do
45          end do
46       end do
47    end do
48 
49   if (trace_use_dull) call da_trace_exit("da_transform_vvtovp_adj")
50 
51 end subroutine da_transform_vvtovp_adj
52 
53