source: LMDZ.3.3/trunk/libf/dyn3d/fxhyp.F @ 212

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

Modifications des sorties de controle Levan
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.4 KB
Line 
1c
2c $Header$
3c
4       SUBROUTINE fxhyp ( xzoomdeg,grossism,dzoom,tau ,
5     , rlonm025,xprimm025,rlonv,xprimv,rlonu,xprimu,rlonp025,xprimp025,
6     , champmin,champmax                                               )
7
8c      Auteur :  P. Le Van
9
10       IMPLICIT NONE
11
12c    Calcule les longitudes et derivees dans la grille du GCM pour une
13c     fonction f(x) a tangente  hyperbolique  .
14c
15c     grossism etant le grossissement ( = 2 si 2 fois, = 3 si 3 fois,etc.)
16c     dzoom  etant  la distance totale de la zone du zoom
17c     tau  la raideur de la transition de l'interieur a l'exterieur du zoom
18c
19c    On doit avoir grossism x dzoom <  pi ( radians )   , en longitude.
20c   ********************************************************************
21
22
23       INTEGER nmax, nmax2
24       PARAMETER (  nmax = 30000, nmax2 = 2*nmax )
25
26#include "dimensions.h"
27#include "paramet.h"
28       
29c     ......  arguments  d'entree   .......
30c
31       REAL xzoomdeg,dzoom,tau,grossism
32
33c    ......   arguments  de  sortie  ......
34
35       REAL rlonm025(iip1),xprimm025(iip1),rlonv(iip1),xprimv(iip1),
36     ,  rlonu(iip1),xprimu(iip1),rlonp025(iip1),xprimp025(iip1)
37
38c     .... variables locales  ....
39c
40       REAL*8 xlon(iip1),xprimm(iip1),xuv
41       REAL*8 xtild(0:nmax2)
42       REAL*8 fhyp(0:nmax),ffdx,beta,Xprimt(0:nmax2)
43       REAL*8 Xf(0:nmax2),xxpr(0:nmax2)
44       REAL*8 xvrai(iip1),xxprim(iip1)
45       REAL*8 pi,depi,epsilon,xzoom,fa,fb
46       REAL*8 Xf1, Xfi , a0,a1,a2,a3,xi2
47       INTEGER i,it,ik,iter,ii,idif
48       REAL*8 xi,xo1,xmoy,xlon2,fxm,Xprimin
49       REAL*8 champmin,champmax
50       INTEGER is2
51       SAVE is2
52
53       REAL*8 heavyside
54       EXTERNAL coefpoly,heavyside
55
56       pi       = 2. * ASIN(1.)
57       depi     = 2. * pi
58       epsilon  = 1.e-3
59       xzoom    = xzoomdeg * pi/180.
60
61       IF( dzoom.LT.1.)  THEN
62         dzoom = dzoom * depi
63       ELSEIF( dzoom.LT. 25. ) THEN
64         WRITE(6,*) ' Le param. dzoomy pour fxhyp est trop petit ! L aug
65     ,menter et relancer ! '
66         STOP 1
67       ELSE
68         dzoom = dzoom * pi/180.
69       ENDIF
70
71       WRITE(6,*) ' xzoom( rad.),grossism,tau,dzoom (radians)'
72       WRITE(6,24) xzoom,grossism,tau,dzoom
73
74       DO i = 0, nmax2
75        xtild(i) = - pi + FLOAT(i) * depi /nmax2
76       ENDDO
77
78       DO i = 0, nmax2
79
80       fa  = tau*  ( dzoom/2.  - xtild(i) )
81       fb  = xtild(i) *  ( pi - xtild(i) )
82
83
84       IF( 200.* fb .LT. - fa )   THEN
85         fhyp ( i) = - 1.
86       ELSEIF( 200. * fb .LT. fa ) THEN
87         fhyp ( i) =   1.
88       ELSE
89         fhyp(i) =  TANH ( fa/fb )
90       ENDIF
91
92       IF ( xtild(i).EQ. 0. )  fhyp(i) =  1.
93       IF ( xtild(i).EQ. pi )  fhyp(i) = -1.
94
95       ENDDO
96
97cc  ....  Calcul  de  beta  ....
98c   ............................
99
100       ffdx = 0.
101
102       DO i = nmax +1,nmax2
103
104       xmoy    = 0.5 * ( xtild(i-1) + xtild( i ) )
105       fa  = tau*  ( dzoom/2.  - xmoy )
106       fb  = xmoy *  ( pi - xmoy )
107
108       IF( 200.* fb .LT. - fa )   THEN
109         fxm = - 1.
110       ELSEIF( 200. * fb .LT. fa ) THEN
111         fxm =   1.
112       ELSE
113         fxm =  TANH ( fa/fb )
114       ENDIF
115
116       IF ( xmoy.EQ. 0. )  fhyp(i) =  1.
117       IF ( xmoy.EQ. pi )  fhyp(i) = -1.
118       ffdx = ffdx + fxm * ( xtild(i) - xtild(i-1) )
119
120       ENDDO
121
122        beta  = ( grossism * ffdx - pi ) / ( ffdx - pi )
123
124       IF( 2.*beta - grossism.LE. 0.)  THEN
125        WRITE(6,*) ' **  Attention ! La valeur beta calculee dans la rou
126     ,tine fxhyp est mauvaise ! '
127        WRITE(6,*)'Modifier les valeurs de  grossismx ,tau ou dzoomx ',
128     , ' et relancer ! ***  '
129        CALL ABORT
130       ENDIF
131c
132c   .....  calcul  de  Xprimt   .....
133c
134       
135       DO i = nmax, nmax2
136        Xprimt(i) = beta  + ( grossism - beta ) * fhyp(i)
137       ENDDO
138c   
139       DO i =  nmax+1, nmax2
140        Xprimt( nmax2 - i ) = Xprimt( i )
141       ENDDO
142c
143
144c   .....  Calcul  de  Xf     ........
145
146       Xf(0) = - pi
147
148       DO i =  nmax +1, nmax2
149
150       xmoy    = 0.5 * ( xtild(i-1) + xtild( i ) )
151       fa  = tau*  ( dzoom/2.  - xmoy )
152       fb  = xmoy *  ( pi - xmoy )
153
154       IF( 200.* fb .LT. - fa )   THEN
155         fxm = - 1.
156       ELSEIF( 200. * fb .LT. fa ) THEN
157         fxm =   1.
158       ELSE
159         fxm =  TANH ( fa/fb )
160       ENDIF
161
162       IF ( xmoy.EQ. 0. )  fxm =  1.
163       IF ( xmoy.EQ. pi )  fxm = -1.
164       xxpr(i)    = beta + ( grossism - beta ) * fxm
165
166       ENDDO
167
168       DO i = nmax+1, nmax2
169        xxpr(nmax2-i+1) = xxpr(i)
170       ENDDO
171
172        DO i=1,nmax2
173         Xf(i)   = Xf(i-1) + xxpr(i) * ( xtild(i) - xtild(i-1) )
174        ENDDO
175
176
177c    *****************************************************************
178c
179
180c     .....  xuv = 0.   si  calcul  aux pts   scalaires   ........
181c     .....  xuv = 0.5  si  calcul  aux pts      U        ........
182c
183      WRITE(6,18)
184c
185      DO 5000  ik = 1, 4
186
187       IF( ik.EQ.1 )        THEN
188         xuv = - 0.25
189       ELSE IF ( ik.EQ.2 )  THEN
190         xuv =   0.
191       ELSE IF ( ik.EQ.3 )  THEN
192         xuv =   0.5
193       ELSE IF ( ik.EQ.4 )  THEN
194         xuv =   0.25
195       ENDIF
196
197      xo1   = 0.
198
199      DO 1500 i = 1, iim
200
201      xlon2 = - pi + (FLOAT(i) + xuv - 0.75) * depi / FLOAT(iim)
202
203      Xfi    = xlon2
204c
205      DO 250 it =  nmax2,0,-1
206      IF( Xfi.GE.Xf(it))  GO TO 350
207250   CONTINUE
208
209      it = 0
210
211350   CONTINUE
212
213c    ......  Calcul de   Xf(xi)    ......
214c
215      xi  = xtild(it)
216
217      IF(it.EQ.nmax2)  THEN
218       it       = nmax2 -1
219       Xf(it+1) = pi
220      ENDIF
221c  .....................................................................
222c
223c   Appel de la routine qui calcule les coefficients a0,a1,a2,a3 d'un
224c   polynome de degre 3  qui passe  par les points (Xf(it),xtild(it) )
225c          et (Xf(it+1),xtild(it+1) )
226
227       CALL coefpoly ( Xf(it),Xf(it+1),Xprimt(it),Xprimt(it+1),
228     ,                xtild(it),xtild(it+1),  a0, a1, a2, a3  )
229
230       Xf1     = Xf(it)
231       Xprimin = a1 + 2.* a2 * xi + 3.*a3 * xi *xi
232
233       DO 500 iter = 1,300
234        xi = xi - ( Xf1 - Xfi )/ Xprimin
235
236        IF( ABS(xi-xo1).LE.epsilon)  GO TO 550
237         xo1      = xi
238         xi2      = xi * xi
239         Xf1      = a0 +  a1 * xi +     a2 * xi2  +     a3 * xi2 * xi
240         Xprimin  =       a1      + 2.* a2 *  xi  + 3.* a3 * xi2
241500   CONTINUE
242        WRITE(6,*) ' Pas de solution ***** ',i,xlon2,iter
243          STOP 6
244550   CONTINUE
245
246       xxprim(i) = depi/ ( FLOAT(iim) * Xprimin )
247       xvrai(i)  =  xi + xzoom
248
2491500   CONTINUE
250
251       DO i = 1 , iim
252        xlon(i)     = xvrai(i)
253        xprimm(i)   = xxprim(i)
254       ENDDO
255       
256       DO i = 1, iim -1
257        IF( xvrai(i+1). LT. xvrai(i) )  THEN
258         WRITE(6,*) ' PBS. avec rlonu(',i+1,') plus petit que rlonu(',i,
259     ,  ')'
260        STOP 7
261        ENDIF
262       ENDDO
263c
264c   ... Reorganisation  des  longitudes  pour les avoir  entre - pi et pi ..
265c   ........................................................................
266
267       champmin =  1.e12
268       champmax = -1.e12
269       DO i = 1, iim
270        champmin = MIN( champmin,xvrai(i) )
271        champmax = MAX( champmax,xvrai(i) )
272       ENDDO
273
274      IF(champmin .GE. - pi .AND. champmax.LE. pi )  THEN
275                GO TO 1600
276      ELSE
277       WRITE(6,*) 'Reorganisation des longitudes pour avoir entre - pi',
278     ,  ' et pi '
279c
280        IF( xzoom.LE.0.)  THEN
281          IF( ik.EQ. 1 )  THEN
282          DO i = 1, iim
283           IF( xvrai(i).GE. - pi )  GO TO 80
284          ENDDO
285            WRITE(6,*)  ' PBS. 1 !  Xvrai plus petit que  - pi ! '
286            STOP 8
287 80       CONTINUE
288          is2 = i
289          ENDIF
290
291          IF( is2.NE. 1 )  THEN
292            DO ii = is2 , iim
293             xlon  (ii-is2+1) = xvrai(ii)
294             xprimm(ii-is2+1) = xxprim(ii)
295            ENDDO
296            DO ii = 1 , is2 -1
297             xlon  (ii+iim-is2+1) = xvrai(ii) + depi
298             xprimm(ii+iim-is2+1) = xxprim(ii)
299            ENDDO
300          ENDIF
301        ELSE
302          IF( ik.EQ.1 )  THEN
303           DO i = iim,1,-1
304            IF( xvrai(i).LE. pi )  GO TO 90
305           ENDDO
306             WRITE(6,*) ' PBS.  2 ! Xvrai plus grand  que   pi ! '
307              STOP 9
308 90        CONTINUE
309            is2 = i
310          ENDIF
311           idif = iim -is2
312           DO ii = 1, is2
313            xlon  (ii+idif) = xvrai(ii)
314            xprimm(ii+idif) = xxprim(ii)
315           ENDDO
316           DO ii = 1, idif
317            xlon (ii)  = xvrai (ii+is2) - depi
318            xprimm(ii) = xxprim(ii+is2)
319           ENDDO
320         ENDIF
321      ENDIF
322c
323c     .........   Fin  de la reorganisation   ............................
324
325 1600    CONTINUE
326
327
328         xlon  ( iip1)  = xlon(1) + depi
329         xprimm( iip1 ) = xprimm (1 )
330       
331         DO i = 1, iim+1
332         xvrai(i) = xlon(i)*180./pi
333         ENDDO
334
335         IF( ik.EQ.1 )  THEN
336c          WRITE(6,*)  ' XLON aux pts. V-0.25   apres ( en  deg. ) '
337c          WRITE(6,18)
338c          WRITE(6,68) xvrai
339ccc          WRITE(6,*) ' XPRIM k ',ik
340ccc          WRITE(6,566)  xprimm
341
342           DO i = 1,iim + 1
343             rlonm025(i) = xlon( i )
344            xprimm025(i) = xprimm(i)
345           ENDDO
346
347         ELSE IF( ik.EQ.2 )  THEN
348c          WRITE(6,18)
349c          WRITE(6,*)  ' XLON aux pts. V   apres ( en  deg. ) '
350c          WRITE(6,68) xvrai
351ccc          WRITE(6,*) ' XPRIM k ',ik
352ccc          WRITE(6,566)  xprimm
353
354           DO i = 1,iim + 1
355             rlonv(i) = xlon( i )
356            xprimv(i) = xprimm(i)
357           ENDDO
358
359         ELSE IF( ik.EQ.3)   THEN
360c          WRITE(6,18)
361c          WRITE(6,*)  ' XLON aux pts. U   apres ( en  deg. ) '
362c          WRITE(6,68) xvrai
363ccc          WRITE(6,*) ' XPRIM ik ',ik
364ccc          WRITE(6,566)  xprimm
365
366           DO i = 1,iim + 1
367             rlonu(i) = xlon( i )
368            xprimu(i) = xprimm(i)
369           ENDDO
370
371         ELSE IF( ik.EQ.4 )  THEN
372c          WRITE(6,18)
373c          WRITE(6,*)  ' XLON aux pts. V+0.25   apres ( en  deg. ) '
374c          WRITE(6,68) xvrai
375ccc          WRITE(6,*) ' XPRIM ik ',ik
376ccc          WRITE(6,566)  xprimm
377
378           DO i = 1,iim + 1
379             rlonp025(i) = xlon( i )
380            xprimp025(i) = xprimm(i)
381           ENDDO
382
383         ENDIF
384
3855000    CONTINUE
386c
387       WRITE(6,18)
388c
389c    ...........  fin  de la boucle  do 5000      ............
390
391        DO i = 1, iim
392         xlon(i) = rlonv(i+1) - rlonv(i)
393        ENDDO
394        champmin =  1.e12
395        champmax = -1.e12
396        DO i = 1, iim
397         champmin = MIN( champmin, xlon(i) )
398         champmax = MAX( champmax, xlon(i) )
399        ENDDO
400         champmin = champmin * 180./pi
401         champmax = champmax * 180./pi
402
40318     FORMAT(/)
40424     FORMAT(2x,'Parametres xzoom,gross,tau ,dzoom pour fxhyp ',4f8.3)
40568     FORMAT(1x,7f9.2)
406
407       RETURN
408       END
Note: See TracBrowser for help on using the repository browser.