[2218] | 1 | module invert_zoom_x_m |
---|
| 2 | |
---|
[5271] | 3 | USE dimensions_mod, ONLY: iim, jjm, llm, ndm |
---|
| 4 | implicit none |
---|
[2218] | 5 | |
---|
| 6 | INTEGER, PARAMETER:: nmax = 30000 |
---|
| 7 | |
---|
| 8 | contains |
---|
| 9 | |
---|
| 10 | subroutine invert_zoom_x(xf, xtild, Xprimt, xlon, xprimm, xuv) |
---|
| 11 | |
---|
| 12 | use coefpoly_m, only: coefpoly |
---|
[2228] | 13 | use nrtype, only: pi, pi_d, twopi_d, k8 |
---|
[2598] | 14 | use serre_mod, only: clon |
---|
[2218] | 15 | |
---|
[5271] | 16 | |
---|
[2218] | 17 | ! for iim |
---|
| 18 | |
---|
[2228] | 19 | REAL(K8), intent(in):: Xf(0:), xtild(0:), Xprimt(0:) ! (0:2 * nmax) |
---|
[2218] | 20 | real, intent(out):: xlon(:), xprimm(:) ! (iim) |
---|
| 21 | |
---|
[2228] | 22 | REAL(K8), intent(in):: xuv |
---|
[2218] | 23 | ! 0. si calcul aux points scalaires |
---|
| 24 | ! 0.5 si calcul aux points U |
---|
| 25 | |
---|
| 26 | ! Local: |
---|
[2228] | 27 | REAL(K8) xo1, Xfi, a0, a1, a2, a3, Xf1, Xprimin |
---|
[2218] | 28 | integer i, it, iter |
---|
[2228] | 29 | REAL(K8), parameter:: my_eps = 1e-6_k8 |
---|
[2218] | 30 | |
---|
[2228] | 31 | REAL(K8) xxprim(iim), xvrai(iim) |
---|
[2218] | 32 | ! intermediary variables because xlon and xprimm are simple precision |
---|
| 33 | |
---|
| 34 | !------------------------------------------------------------------ |
---|
| 35 | |
---|
| 36 | DO i = 1, iim |
---|
[2228] | 37 | Xfi = - pi_d + (i + xuv - 0.75_k8) * twopi_d / iim |
---|
[2218] | 38 | |
---|
| 39 | it = 2 * nmax |
---|
| 40 | do while (xfi < xf(it) .and. it >= 1) |
---|
| 41 | it = it - 1 |
---|
| 42 | end do |
---|
| 43 | |
---|
| 44 | ! Calcul de Xf(xvrai(i)) |
---|
| 45 | |
---|
| 46 | xvrai(i) = xtild(it) |
---|
| 47 | |
---|
| 48 | IF (it == 2 * nmax) THEN |
---|
| 49 | it = 2 * nmax -1 |
---|
| 50 | END IF |
---|
| 51 | |
---|
| 52 | CALL coefpoly(Xf(it), Xf(it + 1), Xprimt(it), Xprimt(it + 1), & |
---|
| 53 | xtild(it), xtild(it + 1), a0, a1, a2, a3) |
---|
| 54 | Xf1 = Xf(it) |
---|
[2228] | 55 | Xprimin = a1 + xvrai(i) * (2._k8 * a2 + xvrai(i) * 3._k8 * a3) |
---|
[2218] | 56 | xo1 = xvrai(i) |
---|
| 57 | iter = 1 |
---|
| 58 | |
---|
| 59 | do |
---|
| 60 | xvrai(i) = xvrai(i) - (Xf1 - Xfi) / Xprimin |
---|
| 61 | IF (ABS(xvrai(i) - xo1) <= my_eps .or. iter == 300) exit |
---|
| 62 | xo1 = xvrai(i) |
---|
| 63 | Xf1 = a0 + xvrai(i) * (a1 + xvrai(i) * (a2 + xvrai(i) * a3)) |
---|
[2228] | 64 | Xprimin = a1 + xvrai(i) * (2._k8 * a2 + xvrai(i) * 3._k8 * a3) |
---|
[2218] | 65 | end DO |
---|
| 66 | |
---|
| 67 | if (ABS(xvrai(i) - xo1) > my_eps) then |
---|
| 68 | ! iter == 300 |
---|
| 69 | print *, 'Pas de solution.' |
---|
| 70 | print *, i, xfi |
---|
| 71 | STOP 1 |
---|
| 72 | end if |
---|
| 73 | |
---|
| 74 | xxprim(i) = twopi_d / (iim * Xprimin) |
---|
| 75 | end DO |
---|
| 76 | |
---|
| 77 | DO i = 1, iim -1 |
---|
| 78 | IF (xvrai(i + 1) < xvrai(i)) THEN |
---|
| 79 | print *, 'xvrai(', i + 1, ') < xvrai(', i, ')' |
---|
| 80 | STOP 1 |
---|
| 81 | END IF |
---|
| 82 | END DO |
---|
| 83 | |
---|
| 84 | xlon = xvrai + clon / 180. * pi |
---|
| 85 | xprimm = xxprim |
---|
| 86 | |
---|
| 87 | end subroutine invert_zoom_x |
---|
| 88 | |
---|
| 89 | end module invert_zoom_x_m |
---|