/[lmdze]/trunk/dyn3d/fyhyp.f90
ViewVC logotype

Contents of /trunk/dyn3d/fyhyp.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 81 - (show annotations)
Wed Mar 5 14:38:41 2014 UTC (10 years, 2 months ago) by guez
File size: 9134 byte(s)
 Converted to free source form files which were still in fixed source
form. The conversion was done using the polish mode of the NAG Fortran
Compiler.

In addition to converting to free source form, the processing of the
files also:

-- indented the code (including comments);

-- set Fortran keywords to uppercase, and set all other identifiers
to lower case;

-- added qualifiers to end statements (for example "end subroutine
conflx", instead of "end");

-- changed the terminating statements of all DO loops so that each
loop ends with an ENDDO statement (instead of a labeled continue).

1
2 ! $Header: /home/cvsroot/LMDZ4/libf/dyn3d/fyhyp.F,v 1.2 2005/06/03 09:11:32
3 ! fairhead Exp $
4
5
6
7 SUBROUTINE fyhyp(yzoomdeg, grossism, dzooma, tau, rrlatu, yyprimu, rrlatv, &
8 yyprimv, rlatu2, yprimu2, rlatu1, yprimu1, champmin, champmax)
9
10 ! c ... Version du 01/04/2001 ....
11
12 USE dimens_m
13 USE paramet_m
14 IMPLICIT NONE
15
16 ! ... Auteur : P. Le Van ...
17
18 ! ....... d'apres formulations de R. Sadourny .......
19
20 ! Calcule les latitudes et derivees dans la grille du GCM pour une
21 ! fonction f(y) a tangente hyperbolique .
22
23 ! grossism etant le grossissement ( = 2 si 2 fois, = 3 si 3 fois , etc)
24 ! dzoom etant la distance totale de la zone du zoom ( en radians )
25 ! tau la raideur de la transition de l'interieur a l'exterieur du zoom
26
27
28 ! N.B : Il vaut mieux avoir : grossism * dzoom < pi/2 (radians) ,en
29 ! lati.
30 ! ********************************************************************
31
32
33
34 INTEGER nmax, nmax2
35 PARAMETER (nmax=30000, nmax2=2*nmax)
36
37
38 ! ....... arguments d'entree .......
39
40 REAL yzoomdeg, grossism, dzooma, tau
41 ! ( rentres par run.def )
42
43 ! ....... arguments de sortie .......
44
45 REAL rrlatu(jjp1), yyprimu(jjp1), rrlatv(jjm), yyprimv(jjm), rlatu1(jjm), &
46 yprimu1(jjm), rlatu2(jjm), yprimu2(jjm)
47
48
49 ! ..... champs locaux .....
50
51
52 REAL dzoom
53 DOUBLE PRECISION ylat(jjp1), yprim(jjp1)
54 DOUBLE PRECISION yuv
55 DOUBLE PRECISION yt(0:nmax2)
56 DOUBLE PRECISION fhyp(0:nmax2), beta, ytprim(0:nmax2), fxm(0:nmax2)
57 SAVE ytprim, yt, yf
58 DOUBLE PRECISION yf(0:nmax2), yypr(0:nmax2)
59 DOUBLE PRECISION yvrai(jjp1), yprimm(jjp1), ylatt(jjp1)
60 DOUBLE PRECISION pi, depi, pis2, epsilon, y0, pisjm
61 DOUBLE PRECISION yo1, yi, ylon2, ymoy, yprimin, champmin, champmax
62 DOUBLE PRECISION yfi, yf1, ffdy
63 DOUBLE PRECISION ypn, deply, y00
64 SAVE y00, deply
65
66 INTEGER i, j, it, ik, iter, jlat
67 INTEGER jpn, jjpn
68 SAVE jpn
69 DOUBLE PRECISION a0, a1, a2, a3, yi2, heavyy0, heavyy0m
70 DOUBLE PRECISION fa(0:nmax2), fb(0:nmax2)
71 REAL y0min, y0max
72
73 DOUBLE PRECISION heavyside
74
75 pi = 2.*asin(1.)
76 depi = 2.*pi
77 pis2 = pi/2.
78 pisjm = pi/float(jjm)
79 epsilon = 1.E-3
80 y0 = yzoomdeg*pi/180.
81
82 IF (dzooma<1.) THEN
83 dzoom = dzooma*pi
84 ELSE IF (dzooma<12.) THEN
85 WRITE (6, *) ' Le param. dzoomy pour fyhyp est trop petit &
86 &! L aug &
87 & menter et relancer'
88 STOP 1
89 ELSE
90 dzoom = dzooma*pi/180.
91 END IF
92
93 WRITE (6, 18)
94 WRITE (6, *) ' yzoom( rad.),grossism,tau,dzoom (radians)'
95 WRITE (6, 24) y0, grossism, tau, dzoom
96
97 DO i = 0, nmax2
98 yt(i) = -pis2 + float(i)*pi/nmax2
99 END DO
100
101 heavyy0m = heavyside(-y0)
102 heavyy0 = heavyside(y0)
103 y0min = 2.*y0*heavyy0m - pis2
104 y0max = 2.*y0*heavyy0 + pis2
105
106 fa = 999.999
107 fb = 999.999
108
109 DO i = 0, nmax2
110 IF (yt(i)<y0) THEN
111 fa(i) = tau*(yt(i)-y0+dzoom/2.)
112 fb(i) = (yt(i)-2.*y0*heavyy0m+pis2)*(y0-yt(i))
113 ELSE IF (yt(i)>y0) THEN
114 fa(i) = tau*(y0-yt(i)+dzoom/2.)
115 fb(i) = (2.*y0*heavyy0-yt(i)+pis2)*(yt(i)-y0)
116 END IF
117
118 IF (200.*fb(i)<-fa(i)) THEN
119 fhyp(i) = -1.
120 ELSE IF (200.*fb(i)<fa(i)) THEN
121 fhyp(i) = 1.
122 ELSE
123 fhyp(i) = tanh(fa(i)/fb(i))
124 END IF
125
126 IF (yt(i)==y0) fhyp(i) = 1.
127 IF (yt(i)==y0min .OR. yt(i)==y0max) fhyp(i) = -1.
128
129 END DO
130
131 ! c .... Calcul de beta ....
132
133 ffdy = 0.
134
135 DO i = 1, nmax2
136 ymoy = 0.5*(yt(i-1)+yt(i))
137 IF (ymoy<y0) THEN
138 fa(i) = tau*(ymoy-y0+dzoom/2.)
139 fb(i) = (ymoy-2.*y0*heavyy0m+pis2)*(y0-ymoy)
140 ELSE IF (ymoy>y0) THEN
141 fa(i) = tau*(y0-ymoy+dzoom/2.)
142 fb(i) = (2.*y0*heavyy0-ymoy+pis2)*(ymoy-y0)
143 END IF
144
145 IF (200.*fb(i)<-fa(i)) THEN
146 fxm(i) = -1.
147 ELSE IF (200.*fb(i)<fa(i)) THEN
148 fxm(i) = 1.
149 ELSE
150 fxm(i) = tanh(fa(i)/fb(i))
151 END IF
152 IF (ymoy==y0) fxm(i) = 1.
153 IF (ymoy==y0min .OR. yt(i)==y0max) fxm(i) = -1.
154 ffdy = ffdy + fxm(i)*(yt(i)-yt(i-1))
155
156 END DO
157
158 beta = (grossism*ffdy-pi)/(ffdy-pi)
159
160 IF (2.*beta-grossism<=0.) THEN
161
162 WRITE (6, *) ' ** Attention ! La valeur beta calculee dans &
163 &la rou &
164 & tine fyhyp est mauvaise'
165 WRITE (6, *) 'Modifier les valeurs de grossismy ,tauy ou dzoomy', &
166 ' et relancer ! *** '
167 STOP 1
168
169 END IF
170
171 ! ..... calcul de Ytprim .....
172
173
174 DO i = 0, nmax2
175 ytprim(i) = beta + (grossism-beta)*fhyp(i)
176 END DO
177
178 ! ..... Calcul de Yf ........
179
180 yf(0) = -pis2
181 DO i = 1, nmax2
182 yypr(i) = beta + (grossism-beta)*fxm(i)
183 END DO
184
185 DO i = 1, nmax2
186 yf(i) = yf(i-1) + yypr(i)*(yt(i)-yt(i-1))
187 END DO
188
189 ! ****************************************************************
190
191 ! ..... yuv = 0. si calcul des latitudes aux pts. U .....
192 ! ..... yuv = 0.5 si calcul des latitudes aux pts. V .....
193
194 WRITE (6, 18)
195
196 DO ik = 1, 4
197
198 IF (ik==1) THEN
199 yuv = 0.
200 jlat = jjm + 1
201 ELSE IF (ik==2) THEN
202 yuv = 0.5
203 jlat = jjm
204 ELSE IF (ik==3) THEN
205 yuv = 0.25
206 jlat = jjm
207 ELSE IF (ik==4) THEN
208 yuv = 0.75
209 jlat = jjm
210 END IF
211
212 yo1 = 0.
213 DO j = 1, jlat
214 yo1 = 0.
215 ylon2 = -pis2 + pisjm*(float(j)+yuv-1.)
216 yfi = ylon2
217
218 DO it = nmax2, 0, -1
219 IF (yfi>=yf(it)) GO TO 350
220 END DO
221 it = 0
222 350 CONTINUE
223
224 yi = yt(it)
225 IF (it==nmax2) THEN
226 it = nmax2 - 1
227 yf(it+1) = pis2
228 END IF
229 ! .................................................................
230 ! .... Interpolation entre yi(it) et yi(it+1) pour avoir Y(yi)
231 ! ..... et Y'(yi) .....
232 ! .................................................................
233
234 CALL coefpoly(yf(it), yf(it+1), ytprim(it), ytprim(it+1), yt(it), &
235 yt(it+1), a0, a1, a2, a3)
236
237 yf1 = yf(it)
238 yprimin = a1 + 2.*a2*yi + 3.*a3*yi*yi
239
240 DO iter = 1, 300
241 yi = yi - (yf1-yfi)/yprimin
242
243 IF (abs(yi-yo1)<=epsilon) GO TO 550
244 yo1 = yi
245 yi2 = yi*yi
246 yf1 = a0 + a1*yi + a2*yi2 + a3*yi2*yi
247 yprimin = a1 + 2.*a2*yi + 3.*a3*yi2
248 END DO
249 WRITE (6, *) ' Pas de solution ***** ', j, ylon2, iter
250 STOP 2
251 550 CONTINUE
252
253 yprimin = a1 + 2.*a2*yi + 3.*a3*yi*yi
254 yprim(j) = pi/(jjm*yprimin)
255 yvrai(j) = yi
256
257 END DO
258
259 DO j = 1, jlat - 1
260 IF (yvrai(j+1)<yvrai(j)) THEN
261 WRITE (6, *) ' PBS. avec rlat(', j + 1, ') plus petit que rlat(', j, &
262 ')'
263 STOP 3
264 END IF
265 END DO
266
267 WRITE (6, *) 'Reorganisation des latitudes pour avoir entre - pi/2', &
268 ' et pi/2 '
269
270 IF (ik==1) THEN
271 ypn = pis2
272 DO j = jlat, 1, -1
273 IF (yvrai(j)<=ypn) GO TO 1502
274 END DO
275 1502 CONTINUE
276
277 jpn = j
278 y00 = yvrai(jpn)
279 deply = pis2 - y00
280 END IF
281
282 DO j = 1, jjm + 1 - jpn
283 ylatt(j) = -pis2 - y00 + yvrai(jpn+j-1)
284 yprimm(j) = yprim(jpn+j-1)
285 END DO
286
287 jjpn = jpn
288 IF (jlat==jjm) jjpn = jpn - 1
289
290 DO j = 1, jjpn
291 ylatt(j+jjm+1-jpn) = yvrai(j) + deply
292 yprimm(j+jjm+1-jpn) = yprim(j)
293 END DO
294
295 ! *********** Fin de la reorganisation *************
296
297
298 DO j = 1, jlat
299 ylat(j) = ylatt(jlat+1-j)
300 yprim(j) = yprimm(jlat+1-j)
301 END DO
302
303 DO j = 1, jlat
304 yvrai(j) = ylat(j)*180./pi
305 END DO
306
307 IF (ik==1) THEN
308 ! WRITE(6,18)
309 ! WRITE(6,*) ' YLAT en U apres ( en deg. ) '
310 ! WRITE(6,68) (yvrai(j),j=1,jlat)
311 ! c WRITE(6,*) ' YPRIM '
312 ! c WRITE(6,445) ( yprim(j),j=1,jlat)
313
314 DO j = 1, jlat
315 rrlatu(j) = ylat(j)
316 yyprimu(j) = yprim(j)
317 END DO
318
319 ELSE IF (ik==2) THEN
320 ! WRITE(6,18)
321 ! WRITE(6,*) ' YLAT en V apres ( en deg. ) '
322 ! WRITE(6,68) (yvrai(j),j=1,jlat)
323 ! c WRITE(6,*)' YPRIM '
324 ! c WRITE(6,445) ( yprim(j),j=1,jlat)
325
326 DO j = 1, jlat
327 rrlatv(j) = ylat(j)
328 yyprimv(j) = yprim(j)
329 END DO
330
331 ELSE IF (ik==3) THEN
332 ! WRITE(6,18)
333 ! WRITE(6,*) ' YLAT en U + 0.75 apres ( en deg. ) '
334 ! WRITE(6,68) (yvrai(j),j=1,jlat)
335 ! c WRITE(6,*) ' YPRIM '
336 ! c WRITE(6,445) ( yprim(j),j=1,jlat)
337
338 DO j = 1, jlat
339 rlatu2(j) = ylat(j)
340 yprimu2(j) = yprim(j)
341 END DO
342
343 ELSE IF (ik==4) THEN
344 ! WRITE(6,18)
345 ! WRITE(6,*) ' YLAT en U + 0.25 apres ( en deg. ) '
346 ! WRITE(6,68)(yvrai(j),j=1,jlat)
347 ! c WRITE(6,*) ' YPRIM '
348 ! c WRITE(6,68) ( yprim(j),j=1,jlat)
349
350 DO j = 1, jlat
351 rlatu1(j) = ylat(j)
352 yprimu1(j) = yprim(j)
353 END DO
354
355 END IF
356
357 END DO
358
359 WRITE (6, 18)
360
361 ! ..... fin de la boucle do 5000 .....
362
363 DO j = 1, jjm
364 ylat(j) = rrlatu(j) - rrlatu(j+1)
365 END DO
366 champmin = 1.E12
367 champmax = -1.E12
368 DO j = 1, jjm
369 champmin = min(champmin, ylat(j))
370 champmax = max(champmax, ylat(j))
371 END DO
372 champmin = champmin*180./pi
373 champmax = champmax*180./pi
374
375 24 FORMAT (2X, 'Parametres yzoom,gross,tau ,dzoom pour fyhyp ', 4F8.3)
376 18 FORMAT (/)
377 68 FORMAT (1X, 7F9.2)
378
379 RETURN
380 END SUBROUTINE fyhyp

  ViewVC Help
Powered by ViewVC 1.1.21