da_legtra.inc

References to this file elsewhere.
1 subroutine da_legtra (nj, max_wavenumber, alp_size, m, int_wgts, alp, r_leg, v)
2 
3    !-----------------------------------------------------------------------
4    ! Purpose: TBD
5    !-----------------------------------------------------------------------
6 
7    implicit none
8 
9    integer, intent(in)  :: nj                      ! Number of latitudes.
10    integer, intent(in)  :: max_wavenumber          ! Maximum wavenumber.
11    integer, intent(in)  :: alp_size                ! Dimension of ALPs.
12    integer, intent(in)  :: m                       ! Zonal wavenumber.
13    real,    intent(in)  :: int_wgts(1:nj)          ! Integration weights.
14    real,    intent(in)  :: alp(1:alp_size)         ! Associated Legendre Polynomials.
15    complex, intent(in)  :: r_leg(1:nj)             ! Field to transform.
16    complex, intent(out) :: v(m:max_wavenumber)     ! Output spectral coefficient.
17 
18    integer              :: l, j, j1                ! Loop counters.
19    integer              :: index_m, index_j, index ! Markers.
20    integer              :: sign_switch             ! make use of symmetry of ALPs.
21    real                 :: eq_coeff                ! 1 if equator point, 0 otherwise.
22    complex              :: sum_legtra              ! Summation scalar.
23    complex              :: eq_term                 ! Summation scalar.
24 
25    index_m = m * (max_wavenumber + 1 - m) + m * (m + 1) / 2 + 1 - m
26 
27    if ((nj+1) / 2 == nj/2 + 1) then
28       eq_coeff = 1.0 ! Odd latitudes
29    else
30       eq_coeff = 0.0 ! Even latitudes
31       eq_term  = 0.0
32    end if
33 
34    do l = m, max_wavenumber
35 
36       sign_switch = (-1)**(l + m)
37       sum_legtra = da_zero_complex
38 
39       do j = 1, nj / 2
40          index_j = (j - 1) * (max_wavenumber + 1) * (max_wavenumber + 2) / 2
41          index = index_j + index_m + l
42 
43          ! Sum first quadrant:
44          sum_legtra = sum_legtra + int_wgts(j) * r_leg(j) * alp(index)
45 
46          ! Add second quadrant (use symmetry ALP(-mu)=(-1)^{n+|m|}ALP(mu)):
47          j1 = nj + 1 - j
48          sum_legtra = sum_legtra + sign_switch * int_wgts(j1) * r_leg(j1) * &
49             alp(index)
50       end do
51      
52       if (eq_coeff > 0.0) then
53          ! Skip this step for Even lats    ! Syed RH Rizvi
54          ! Add equator term (wrong if even nj, but then eq_coeff = 0.0 so OK):
55          j = nj/2 + 1
56          index_j = (j - 1) * (max_wavenumber + 1) * (max_wavenumber+2) / 2
57          index = index_j + index_m + l
58          eq_term = int_wgts(j) * r_leg(j) * alp(index)
59       end if
60 
61       v(l) = 0.5 * (sum_legtra + eq_coeff * eq_term)
62    end do
63 
64 end subroutine da_legtra
65 
66