source: LMDZ.3.3/trunk/libf/dyn3d/fyhyp.F @ 207

Last change on this file since 207 was 207, checked in by lmdz, 23 years ago

petit detail
LF

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