Directory: | ./ |
---|---|
File: | dyn3d_common/fxhyp_m.f90 |
Date: | 2022-01-11 19:19:34 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 28 | 109 | 25.7% |
Branches: | 53 | 144 | 36.8% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | module fxhyp_m | ||
2 | |||
3 | IMPLICIT NONE | ||
4 | |||
5 | contains | ||
6 | |||
7 |
6/12✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 1 times.
|
1 | SUBROUTINE fxhyp(xprimm025, rlonv, xprimv, rlonu, xprimu, xprimp025) |
8 | |||
9 | ! From LMDZ4/libf/dyn3d/fxhyp.F, version 1.2, 2005/06/03 09:11:32 | ||
10 | ! Author: P. Le Van, from formulas by R. Sadourny | ||
11 | |||
12 | ! Calcule les longitudes et dérivées dans la grille du GCM pour | ||
13 | ! une fonction f(x) à dérivée tangente hyperbolique. | ||
14 | |||
15 | ! Il vaut mieux avoir : grossismx \times dzoom < pi | ||
16 | |||
17 | ! Le premier point scalaire pour une grille regulière (grossismx = | ||
18 | ! 1., taux=0., clon=0.) est à - 180 degrés. | ||
19 | |||
20 | use arth_m, only: arth | ||
21 | use invert_zoom_x_m, only: invert_zoom_x, nmax | ||
22 | use nrtype, only: pi, pi_d, twopi, twopi_d, k8 | ||
23 | use principal_cshift_m, only: principal_cshift | ||
24 | use serre_mod, only: clon, grossismx, dzoomx, taux | ||
25 | |||
26 | include "dimensions.h" | ||
27 | ! for iim | ||
28 | |||
29 | REAL, intent(out):: xprimm025(:), rlonv(:), xprimv(:) ! (iim + 1) | ||
30 | real, intent(out):: rlonu(:), xprimu(:), xprimp025(:) ! (iim + 1) | ||
31 | |||
32 | ! Local: | ||
33 | real rlonm025(iim + 1), rlonp025(iim + 1) | ||
34 | REAL dzoom, step | ||
35 | real d_rlonv(iim) | ||
36 | REAL(K8) xtild(0:2 * nmax) | ||
37 | REAL(K8) fhyp(nmax:2 * nmax), ffdx, beta, Xprimt(0:2 * nmax) | ||
38 | REAL(K8) Xf(0:2 * nmax), xxpr(2 * nmax) | ||
39 | REAL(K8) fa, fb | ||
40 | INTEGER i, is2 | ||
41 | REAL(K8) xmoy, fxm | ||
42 | |||
43 | !---------------------------------------------------------------------- | ||
44 | |||
45 | 1 | print *, "Call sequence information: fxhyp" | |
46 | |||
47 | test_iim: if (iim==1) then | ||
48 | rlonv(1)=0. | ||
49 | rlonu(1)=pi | ||
50 | rlonv(2)=rlonv(1)+twopi | ||
51 | rlonu(2)=rlonu(1)+twopi | ||
52 | |||
53 | xprimm025(:)=1. | ||
54 | xprimv(:)=1. | ||
55 | xprimu(:)=1. | ||
56 | xprimp025(:)=1. | ||
57 | else test_iim | ||
58 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | test_grossismx: if (grossismx == 1.) then |
59 | 1 | step = twopi / iim | |
60 | |||
61 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
|
33 | xprimm025(:iim) = step |
62 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
|
33 | xprimp025(:iim) = step |
63 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
|
33 | xprimv(:iim) = step |
64 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
|
33 | xprimu(:iim) = step |
65 | |||
66 | 1 | rlonv(:iim) = arth(- pi + clon / 180. * pi, step, iim) | |
67 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
|
33 | rlonm025(:iim) = rlonv(:iim) - 0.25 * step |
68 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
|
33 | rlonp025(:iim) = rlonv(:iim) + 0.25 * step |
69 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
|
33 | rlonu(:iim) = rlonv(:iim) + 0.5 * step |
70 | else test_grossismx | ||
71 | ✗ | dzoom = dzoomx * twopi_d | |
72 | ✗ | xtild = arth(- pi_d, pi_d / nmax, 2 * nmax + 1) | |
73 | |||
74 | ! Compute fhyp: | ||
75 | ✗ | DO i = nmax, 2 * nmax | |
76 | ✗ | fa = taux * (dzoom / 2. - xtild(i)) | |
77 | ✗ | fb = xtild(i) * (pi_d - xtild(i)) | |
78 | |||
79 | ✗ | IF (200. * fb < - fa) THEN | |
80 | ✗ | fhyp(i) = - 1. | |
81 | ✗ | ELSE IF (200. * fb < fa) THEN | |
82 | ✗ | fhyp(i) = 1. | |
83 | ELSE | ||
84 | ✗ | IF (ABS(fa) < 1e-13 .AND. ABS(fb) < 1e-13) THEN | |
85 | ✗ | IF (200. * fb + fa < 1e-10) THEN | |
86 | ✗ | fhyp(i) = - 1. | |
87 | ✗ | ELSE IF (200. * fb - fa < 1e-10) THEN | |
88 | ✗ | fhyp(i) = 1. | |
89 | END IF | ||
90 | ELSE | ||
91 | ✗ | fhyp(i) = TANH(fa / fb) | |
92 | END IF | ||
93 | END IF | ||
94 | |||
95 | ✗ | IF (xtild(i) == 0.) fhyp(i) = 1. | |
96 | ✗ | IF (xtild(i) == pi_d) fhyp(i) = -1. | |
97 | END DO | ||
98 | |||
99 | ! Calcul de beta | ||
100 | |||
101 | ✗ | ffdx = 0. | |
102 | |||
103 | ✗ | DO i = nmax + 1, 2 * nmax | |
104 | ✗ | xmoy = 0.5 * (xtild(i-1) + xtild(i)) | |
105 | ✗ | fa = taux * (dzoom / 2. - xmoy) | |
106 | ✗ | fb = xmoy * (pi_d - xmoy) | |
107 | |||
108 | ✗ | IF (200. * fb < - fa) THEN | |
109 | fxm = - 1. | ||
110 | ✗ | ELSE IF (200. * fb < fa) THEN | |
111 | fxm = 1. | ||
112 | ELSE | ||
113 | ✗ | IF (ABS(fa) < 1e-13 .AND. ABS(fb) < 1e-13) THEN | |
114 | ✗ | IF (200. * fb + fa < 1e-10) THEN | |
115 | fxm = - 1. | ||
116 | ✗ | ELSE IF (200. * fb - fa < 1e-10) THEN | |
117 | fxm = 1. | ||
118 | END IF | ||
119 | ELSE | ||
120 | ✗ | fxm = TANH(fa / fb) | |
121 | END IF | ||
122 | END IF | ||
123 | |||
124 | ✗ | IF (xmoy == 0.) fxm = 1. | |
125 | ✗ | IF (xmoy == pi_d) fxm = -1. | |
126 | |||
127 | ✗ | ffdx = ffdx + fxm * (xtild(i) - xtild(i-1)) | |
128 | END DO | ||
129 | |||
130 | ✗ | print *, "ffdx = ", ffdx | |
131 | ✗ | beta = (grossismx * ffdx - pi_d) / (ffdx - pi_d) | |
132 | ✗ | print *, "beta = ", beta | |
133 | |||
134 | ✗ | IF (2. * beta - grossismx <= 0.) THEN | |
135 | ✗ | print *, 'Bad choice of grossismx, taux, dzoomx.' | |
136 | ✗ | print *, 'Decrease dzoomx or grossismx.' | |
137 | ✗ | STOP 1 | |
138 | END IF | ||
139 | |||
140 | ! calcul de Xprimt | ||
141 | ✗ | Xprimt(nmax:2 * nmax) = beta + (grossismx - beta) * fhyp | |
142 | ✗ | xprimt(:nmax - 1) = xprimt(2 * nmax:nmax + 1:- 1) | |
143 | |||
144 | ! Calcul de Xf | ||
145 | |||
146 | ✗ | DO i = nmax + 1, 2 * nmax | |
147 | ✗ | xmoy = 0.5 * (xtild(i-1) + xtild(i)) | |
148 | ✗ | fa = taux * (dzoom / 2. - xmoy) | |
149 | ✗ | fb = xmoy * (pi_d - xmoy) | |
150 | |||
151 | ✗ | IF (200. * fb < - fa) THEN | |
152 | fxm = - 1. | ||
153 | ✗ | ELSE IF (200. * fb < fa) THEN | |
154 | fxm = 1. | ||
155 | ELSE | ||
156 | ✗ | fxm = TANH(fa / fb) | |
157 | END IF | ||
158 | |||
159 | ✗ | IF (xmoy == 0.) fxm = 1. | |
160 | ✗ | IF (xmoy == pi_d) fxm = -1. | |
161 | ✗ | xxpr(i) = beta + (grossismx - beta) * fxm | |
162 | END DO | ||
163 | |||
164 | ✗ | xxpr(:nmax) = xxpr(2 * nmax:nmax + 1:- 1) | |
165 | |||
166 | ✗ | Xf(0) = - pi_d | |
167 | |||
168 | ✗ | DO i=1, 2 * nmax - 1 | |
169 | ✗ | Xf(i) = Xf(i-1) + xxpr(i) * (xtild(i) - xtild(i-1)) | |
170 | END DO | ||
171 | |||
172 | ✗ | Xf(2 * nmax) = pi_d | |
173 | |||
174 | call invert_zoom_x(xf, xtild, Xprimt, rlonm025(:iim), & | ||
175 | ✗ | xprimm025(:iim), xuv = - 0.25_k8) | |
176 | call invert_zoom_x(xf, xtild, Xprimt, rlonv(:iim), xprimv(:iim), & | ||
177 | ✗ | xuv = 0._k8) | |
178 | call invert_zoom_x(xf, xtild, Xprimt, rlonu(:iim), xprimu(:iim), & | ||
179 | ✗ | xuv = 0.5_k8) | |
180 | call invert_zoom_x(xf, xtild, Xprimt, rlonp025(:iim), & | ||
181 | ✗ | xprimp025(:iim), xuv = 0.25_k8) | |
182 | end if test_grossismx | ||
183 | |||
184 | 1 | is2 = 0 | |
185 | |||
186 | IF (MINval(rlonm025(:iim)) < - pi - 0.1 & | ||
187 |
13/20✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 32 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 31 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 times.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 32 times.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 32 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
|
68 | .or. MAXval(rlonm025(:iim)) > pi + 0.1) THEN |
188 | ✗ | IF (clon <= 0.) THEN | |
189 | ✗ | is2 = 1 | |
190 | |||
191 | ✗ | do while (rlonm025(is2) < - pi .and. is2 < iim) | |
192 | ✗ | is2 = is2 + 1 | |
193 | end do | ||
194 | |||
195 | ✗ | if (rlonm025(is2) < - pi) then | |
196 | ✗ | print *, 'Rlonm025 plus petit que - pi !' | |
197 | ✗ | STOP 1 | |
198 | end if | ||
199 | ELSE | ||
200 | ✗ | is2 = iim | |
201 | |||
202 | ✗ | do while (rlonm025(is2) > pi .and. is2 > 1) | |
203 | ✗ | is2 = is2 - 1 | |
204 | end do | ||
205 | |||
206 | ✗ | if (rlonm025(is2) > pi) then | |
207 | ✗ | print *, 'Rlonm025 plus grand que pi !' | |
208 | ✗ | STOP 1 | |
209 | end if | ||
210 | END IF | ||
211 | END IF | ||
212 | |||
213 | 1 | call principal_cshift(is2, rlonm025, xprimm025) | |
214 | 1 | call principal_cshift(is2, rlonv, xprimv) | |
215 | 1 | call principal_cshift(is2, rlonu, xprimu) | |
216 | 1 | call principal_cshift(is2, rlonp025, xprimp025) | |
217 | |||
218 |
2/2✓ Branch 0 taken 32 times.
✓ Branch 1 taken 1 times.
|
33 | forall (i = 1: iim) d_rlonv(i) = rlonv(i + 1) - rlonv(i) |
219 |
6/8✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 32 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 3 times.
✓ Branch 8 taken 29 times.
|
34 | print *, "Minimum longitude step:", MINval(d_rlonv) * 180. / pi, & |
220 | 2 | "degrees" | |
221 |
6/8✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 32 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✓ Branch 8 taken 31 times.
|
34 | print *, "Maximum longitude step:", MAXval(d_rlonv) * 180. / pi, & |
222 | 2 | "degrees" | |
223 | |||
224 | ! Check that rlonm025 <= rlonv <= rlonp025 <= rlonu: | ||
225 |
2/2✓ Branch 0 taken 33 times.
✓ Branch 1 taken 1 times.
|
34 | DO i = 1, iim + 1 |
226 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 33 times.
|
33 | IF (rlonp025(i) < rlonv(i)) THEN |
227 | ✗ | print *, 'rlonp025(', i, ') = ', rlonp025(i) | |
228 | ✗ | print *, "< rlonv(", i, ") = ", rlonv(i) | |
229 | ✗ | STOP 1 | |
230 | END IF | ||
231 | |||
232 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 33 times.
|
33 | IF (rlonv(i) < rlonm025(i)) THEN |
233 | ✗ | print *, 'rlonv(', i, ') = ', rlonv(i) | |
234 | ✗ | print *, "< rlonm025(", i, ") = ", rlonm025(i) | |
235 | ✗ | STOP 1 | |
236 | END IF | ||
237 | |||
238 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 33 times.
|
34 | IF (rlonp025(i) > rlonu(i)) THEN |
239 | ✗ | print *, 'rlonp025(', i, ') = ', rlonp025(i) | |
240 | ✗ | print *, "> rlonu(", i, ") = ", rlonu(i) | |
241 | ✗ | STOP 1 | |
242 | END IF | ||
243 | END DO | ||
244 | end if test_iim | ||
245 | |||
246 | 1 | END SUBROUTINE fxhyp | |
247 | |||
248 | end module fxhyp_m | ||
249 |