da_legtra_inv_adj.inc

References to this file elsewhere.
1 subroutine da_legtra_inv_adj(jds, jde, jts, jte, max_wavenumber, alp_size, &
2    m, alp, v, r_leg)
3 
4    !-----------------------------------------------------------------------
5    ! Purpose: TBD
6    !-----------------------------------------------------------------------
7 
8    implicit none
9 
10    integer, intent(in)  :: jds, jde            ! Number of latitudes.
11    integer, intent(in)  :: jts, jte            ! Number of latitudes.
12    integer, intent(in)  :: max_wavenumber      ! Maximum wavenumber.
13    integer, intent(in)  :: alp_size            ! Dimension of ALPs.
14    integer, intent(in)  :: m                   ! Zonal wavenumber.
15    real,    intent(in)  :: alp(1:alp_size)     ! Associated Legendre Polynomials
16 
17    complex, intent(out) :: v(m:max_wavenumber) ! Output spectral coefficient.
18    complex, intent(in)  :: r_leg(jts:jte)      ! Field to transform.
19 
20    integer              :: l, j, js, je        ! Loop counters.
21    integer              :: index_m, index_j    ! Markers.
22    complex              :: sum_legtra          ! Summation scalars.
23 
24    integer              :: jc, iequator, temp
25 
26    if (trace_use) call da_trace_entry("da_legtra_inv_adj")
27 
28    index_m = m * (max_wavenumber + 1 - m) + m * (m + 1) / 2 + 1 - m
29 
30    jc = (jde-jds+1)/2
31 
32    iequator = mod(jde-jds+1, 2)
33 
34    js = max(jts, jc+iequator+1)
35    je = min(jc+iequator, jte)
36 
37    temp = (max_wavenumber + 1) * (max_wavenumber + 2) / 2
38 
39    do l = m, max_wavenumber
40       sum_legtra = da_zero_complex
41 
42       if (mod(l+m,2) == 1) then
43          do j = js, jte
44             index_j = (jds+jde - j - 1) * temp
45             sum_legtra = sum_legtra - r_leg(j) * alp(index_j + index_m + l)
46          end do
47       else
48          do j = js, jte
49             index_j = (jds+jde - j - 1) * temp
50             sum_legtra = sum_legtra + r_leg(j) * alp(index_j + index_m + l)
51          end do
52       end if
53 
54       do j = jts, je
55          index_j = (j - 1) * temp
56          sum_legtra = sum_legtra + r_leg(j) * alp(index_j + index_m + l) 
57       end do
58 
59       v(l) = sum_legtra
60    end do
61 
62    if (trace_use) call da_trace_exit("da_legtra_inv_adj")
63 
64 end subroutine da_legtra_inv_adj
65 
66