source: LMDZ4/trunk/libf/dyn3d/fyhyp.F @ 540

Last change on this file since 540 was 524, checked in by lmdzadmin, 21 years ago

Initial revision

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