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    index_m = m * (max_wavenumber + 1 - m) + m * (m + 1) / 2 + 1 - m
27 
28    jc = (jde-jds+1)/2
29 
30    iequator = mod(jde-jds+1, 2)
31 
32    js = max(jts, jc+iequator+1)
33    je = min(jc+iequator, jte)
34 
35    temp = (max_wavenumber + 1) * (max_wavenumber + 2) / 2
36 
37    do l = m, max_wavenumber
38       sum_legtra = da_zero_complex
39 
40       if (mod(l+m,2) == 1) then
41          do j = js, jte
42             index_j = (jds+jde - j - 1) * temp
43             sum_legtra = sum_legtra - r_leg(j) * alp(index_j + index_m + l)
44          end do
45       else
46          do j = js, jte
47             index_j = (jds+jde - j - 1) * temp
48             sum_legtra = sum_legtra + r_leg(j) * alp(index_j + index_m + l)
49          end do
50       end if
51 
52       do j = jts, je
53          index_j = (j - 1) * temp
54          sum_legtra = sum_legtra + r_leg(j) * alp(index_j + index_m + l) 
55       end do
56 
57       v(l) = sum_legtra
58    end do
59 
60 end subroutine da_legtra_inv_adj
61 
62