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