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