/[lmdze]/trunk/dyn3d/fxhyp.f
ViewVC logotype

Diff of /trunk/dyn3d/fxhyp.f

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.76  
changed lines
  Added in v.91

  ViewVC Help
Powered by ViewVC 1.1.21