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