Merge remote-tracking branch 'origin/release-v4.6.1'
[WRF.git] / var / da / da_spectral / da_legtra_inv_adj.inc
blob9a4ffc56813155c772b1bab50e4d53ceebb0142b
1 subroutine da_legtra_inv_adj(jds, jde, jts, jte, max_wavenumber, alp_size, &
2    m, alp, v, r_leg)
4    !-----------------------------------------------------------------------
5    ! Purpose: TBD
6    !-----------------------------------------------------------------------
8    implicit none
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
17    complex, intent(out) :: v(m:max_wavenumber) ! Output spectral coefficient.
18    complex, intent(in)  :: r_leg(jts:jte)      ! Field to transform.
20    integer              :: l, j, js, je        ! Loop counters.
21    integer              :: index_m, index_j    ! Markers.
22    complex              :: sum_legtra          ! Summation scalars.
24    integer              :: jc, iequator, temp
26    if (trace_use) call da_trace_entry("da_legtra_inv_adj")
28    index_m = m * (max_wavenumber + 1 - m) + m * (m + 1) / 2 + 1 - m
30    jc = (jde-jds+1)/2
32    iequator = mod(jde-jds+1, 2)
34    js = max(jts, jc+iequator+1)
35    je = min(jc+iequator, jte)
37    temp = (max_wavenumber + 1) * (max_wavenumber + 2) / 2
39    do l = m, max_wavenumber
40       sum_legtra = da_zero_complex
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
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
59       v(l) = sum_legtra
60    end do
62    if (trace_use) call da_trace_exit("da_legtra_inv_adj")
64 end subroutine da_legtra_inv_adj