7 SUBROUTINE fyhyp(rlatu, yyprimu, rlatv, rlatu2, yprimu2, rlatu1, yprimu1)
21 include
"dimensions.h"
27 REAL,
intent(out):: rlatu(jjm + 1), yyprimu(jjm + 1)
28 REAL,
intent(out):: rlatv(jjm)
29 real,
intent(out):: rlatu2(jjm), yprimu2(jjm), rlatu1(jjm), yprimu1(jjm)
33 REAL(K8) champmin, champmax
34 INTEGER,
PARAMETER:: nmax=30000, nmax2=2*nmax
36 REAL(K8) ylat(jjm + 1), yprim(jjm + 1)
38 REAL(K8),
save:: yt(0:nmax2)
39 REAL(K8) fhyp(0:nmax2), beta
40 REAL(K8),
save:: ytprim(0:nmax2)
42 REAL(K8),
save:: yf(0:nmax2)
43 REAL(K8) yypr(0:nmax2)
44 REAL(K8) yvrai(jjm + 1), yprimm(jjm + 1), ylatt(jjm + 1)
45 REAL(K8) pi, pis2, epsilon, y0, pisjm
46 REAL(K8) yo1, yi, ylon2, ymoy, yprimin
47 REAL(K8) yfi, yf1, ffdy
48 REAL(K8) ypn, deply, y00
51 INTEGER i, j, it, ik, iter, jlat
54 REAL(K8) a0, a1, a2, a3, yi2, heavyy0, heavyy0m
55 REAL(K8) fa(0:nmax2), fb(0:nmax2)
62 print *,
"Call sequence information: fyhyp"
70 print *,
'yzoom(rad), grossismy, tauy, dzoom (rad):'
74 yt(i) = -pis2 +
real(i)*pi/nmax2
77 heavyy0m = heavyside(-y0)
78 heavyy0 = heavyside(y0)
79 y0min = 2.*y0*heavyy0m - pis2
80 y0max = 2.*y0*heavyy0 + pis2
87 fa(i) = tauy*(yt(i)-y0 + dzoom/2.)
88 fb(i) = (yt(i)-2.*y0*heavyy0m + pis2)*(y0-yt(i))
89 ELSE IF (yt(i)>y0)
THEN
90 fa(i) = tauy*(y0-yt(i) + dzoom/2.)
91 fb(i) = (2.*y0*heavyy0-yt(i) + pis2)*(yt(i)-y0)
94 IF (200.*fb(i)<-fa(i))
THEN
96 ELSE IF (200.*fb(i)<fa(i))
THEN
99 fhyp(i) = tanh(fa(i)/fb(i))
102 IF (yt(i)==y0) fhyp(i) = 1.
103 IF (yt(i)==y0min .OR. yt(i)==y0max) fhyp(i) = -1.
111 ymoy = 0.5*(yt(i-1) + yt(i))
113 fa(i) = tauy*(ymoy-y0 + dzoom/2.)
114 fb(i) = (ymoy-2.*y0*heavyy0m + pis2)*(y0-ymoy)
115 ELSE IF (ymoy>y0)
THEN
116 fa(i) = tauy*(y0-ymoy + dzoom/2.)
117 fb(i) = (2.*y0*heavyy0-ymoy + pis2)*(ymoy-y0)
120 IF (200.*fb(i)<-fa(i))
THEN
122 ELSE IF (200.*fb(i)<fa(i))
THEN
125 fxm(i) = tanh(fa(i)/fb(i))
127 IF (ymoy==y0) fxm(i) = 1.
128 IF (ymoy==y0min .OR. yt(i)==y0max) fxm(i) = -1.
129 ffdy = ffdy + fxm(i)*(yt(i)-yt(i-1))
135 print *,
'Attention ! La valeur beta calculee dans la routine fyhyp ' &
136 //
'est mauvaise. Modifier les valeurs de grossismy, tauy ou ' &
137 //
'dzoomy et relancer.'
144 ytprim(i) = beta + (
grossismy-beta)*fhyp(i)
155 yf(i) = yf(i-1) + yypr(i)*(yt(i)-yt(i-1))
161 loop_ik:
DO ik = 1, 4
179 ylon2 = -pis2 + pisjm*(
real(j) + yuv-1.)
183 DO while (it >= 1 .and. yfi < yf(it))
196 CALL coefpoly(yf(it), yf(it + 1), ytprim(it), ytprim(it + 1), &
197 yt(it), yt(it + 1), a0, a1, a2, a3)
200 yprimin = a1 + 2.*a2*yi + 3.*a3*yi*yi
204 yi = yi - (yf1-yfi)/yprimin
205 IF (abs(yi-yo1)<=epsilon .or. iter == 300)
exit
208 yf1 = a0 + a1*yi + a2*yi2 + a3*yi2*yi
209 yprimin = a1 + 2.*a2*yi + 3.*a3*yi2
211 if (abs(yi-yo1) > epsilon)
then
212 print *,
'Pas de solution.', j, ylon2
216 yprimin = a1 + 2.*a2*yi + 3.*a3*yi*yi
217 yprim(j) = pi/(jjm*yprimin)
222 IF (yvrai(j + 1)<yvrai(j))
THEN
223 print *,
'Problème avec rlat(', j + 1,
') plus petit que rlat(', &
229 print *,
'Reorganisation des latitudes pour avoir entre - pi/2 et pi/2'
233 DO j = jjm + 1, 1, -1
234 IF (yvrai(j)<=ypn)
exit
242 DO j = 1, jjm + 1 - jpn
243 ylatt(j) = -pis2 - y00 + yvrai(jpn + j-1)
244 yprimm(j) = yprim(jpn + j-1)
248 IF (jlat==jjm) jjpn = jpn - 1
251 ylatt(j + jjm + 1-jpn) = yvrai(j) + deply
252 yprimm(j + jjm + 1-jpn) = yprim(j)
258 ylat(j) = ylatt(jlat + 1-j)
259 yprim(j) = yprimm(jlat + 1-j)
263 yvrai(j) = ylat(j)*180./pi
269 yyprimu(j) = yprim(j)
278 yprimu2(j) = yprim(j)
283 yprimu1(j) = yprim(j)
289 ylat(j) = rlatu(j) - rlatu(j + 1)
294 champmin = min(champmin, ylat(j))
295 champmax = max(champmax, ylat(j))
297 champmin = champmin*180./pi
298 champmax = champmax*180./pi
301 IF (rlatu1(j) <= rlatu2(j))
THEN
302 print *,
'Attention ! rlatu1 < rlatu2 ', rlatu1(j), rlatu2(j), j
306 IF (rlatu2(j) <= rlatu(j+1))
THEN
307 print *,
'Attention ! rlatu2 < rlatup1 ', rlatu2(j), rlatu(j+1), j
311 IF (rlatu(j) <= rlatu1(j))
THEN
312 print *,
' Attention ! rlatu < rlatu1 ', rlatu(j), rlatu1(j), j
316 IF (rlatv(j) <= rlatu2(j))
THEN
317 print *,
' Attention ! rlatv < rlatu2 ', rlatv(j), rlatu2(j), j
321 IF (rlatv(j) >= rlatu1(j))
THEN
322 print *,
' Attention ! rlatv > rlatu1 ', rlatv(j), rlatu1(j), j
326 IF (rlatv(j) >= rlatu(j))
THEN
327 print *,
' Attention ! rlatv > rlatu ', rlatv(j), rlatu(j), j
333 print 3, champmin, champmax
335 3
Format(1
x,
' Au centre du zoom, la longueur de la maille est', &
336 ' d environ ', f0.2,
' degres ', /, &
337 ' alors que la maille en dehors de la zone du zoom est ', &
338 "d'environ ", f0.2,
' degres ')
!$Header!c!c!c include serre h!c REAL dzoomy
subroutine coefpoly(xf1, xf2, xprim1, xprim2, xtild1, xtild2, a0, a1, a2, a3)
!$Header!c c INCLUDE fxyprim h c c c Fonctions in line c c REAL fyprim REAL rj c c il faut la calculer avant d appeler ces fonctions c c c Fonctions a changer selon x(x) et y(y) choisis.c-----------------------------------------------------------------c c.....ici
!$Header!c!c!c include serre h!c REAL grossismy
subroutine fyhyp(rlatu, yyprimu, rlatv, rlatu2, yprimu2, rlatu1, yprimu1)
!$Header!c!c!c include serre h!c REAL clat