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

Diff of /trunk/dyn3d/fxhyp.f

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

trunk/libf/dyn3d/fxhyp.f revision 71 by guez, Mon Jul 8 18:12:18 2013 UTC trunk/dyn3d/fxhyp.f revision 105 by guez, Thu Sep 4 10:40:24 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      !----------------------------------------------------------------------
62    
63         xmoy    = 0.5 * ( xtild(i-1) + xtild( i ) )      pi = 2. * ASIN(1.)
64         fa  = tau*  ( dzoom/2.  - xmoy )      depi = 2. * pi
65         fb  = xmoy *  ( pi - xmoy )      epsilon = 1.e-3
66        xzoom = xzoomdeg * pi/180.
67    
68         IF( 200.* fb .LT. - fa )   THEN      decalx = .75
69           fxm = - 1.      IF (grossism == 1. .AND. scal180) THEN
70         ELSEIF( 200. * fb .LT. fa ) THEN         decalx = 1.
71           fxm =   1.      ENDIF
72    
73        print *, 'FXHYP scal180, decalx', scal180, decalx
74    
75        IF (dzooma.LT.1.) THEN
76           dzoom = dzooma * depi
77        ELSEIF (dzooma.LT. 25.) THEN
78           print *, "Le paramètre dzoomx pour fxhyp est trop petit. " &
79                // "L'augmenter et relancer."
80           STOP 1
81        ELSE
82           dzoom = dzooma * pi/180.
83        ENDIF
84    
85        print *, ' xzoom(rad), grossism, tau, dzoom (rad):'
86        print *, xzoom, grossism, tau, dzoom
87    
88        DO i = 0, nmax2
89           xtild(i) = - pi + FLOAT(i) * depi /nmax2
90        ENDDO
91    
92        DO i = nmax, nmax2
93           fa = tau* (dzoom/2. - xtild(i))
94           fb = xtild(i) * (pi - xtild(i))
95    
96           IF (200.* fb .LT. - fa) THEN
97              fhyp (i) = - 1.
98           ELSEIF (200. * fb .LT. fa) THEN
99              fhyp (i) = 1.
100         ELSE         ELSE
101              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
102                  IF(   200.*fb + fa.LT.1.e-10 )  THEN               IF (200.*fb + fa.LT.1.e-10) THEN
103                      fxm   = - 1.                  fhyp (i) = - 1.
104                  ELSEIF( 200.*fb - fa.LT.1.e-10 )  THEN               ELSEIF (200.*fb - fa.LT.1.e-10) THEN
105                      fxm   =   1.                  fhyp (i) = 1.
106                  ENDIF               ENDIF
107              ELSE            ELSE
108                      fxm   =  TANH ( fa/fb )               fhyp (i) = TANH (fa/fb)
109              ENDIF            ENDIF
110         ENDIF         ENDIF
111    
112         IF ( xmoy.EQ. 0. )  fxm  =  1.         IF (xtild(i) == 0.) fhyp(i) = 1.
113         IF ( xmoy.EQ. pi )  fxm  = -1.         IF (xtild(i) == pi) fhyp(i) = -1.
114        ENDDO
115    
116        ! Calcul de beta
117    
118        ffdx = 0.
119    
120        DO i = nmax + 1, nmax2
121           xmoy = 0.5 * (xtild(i-1) + xtild(i))
122           fa = tau* (dzoom/2. - xmoy)
123           fb = xmoy * (pi - xmoy)
124    
125           IF (200.* fb .LT. - fa) THEN
126              fxm = - 1.
127           ELSEIF (200. * fb .LT. fa) THEN
128              fxm = 1.
129           ELSE
130              IF (ABS(fa).LT.1.e-13.AND.ABS(fb).LT.1.e-13) THEN
131                 IF (200.*fb + fa.LT.1.e-10) THEN
132                    fxm = - 1.
133                 ELSEIF (200.*fb - fa.LT.1.e-10) THEN
134                    fxm = 1.
135                 ENDIF
136              ELSE
137                 fxm = TANH (fa/fb)
138              ENDIF
139           ENDIF
140    
141         ffdx = ffdx + fxm * ( xtild(i) - xtild(i-1) )         IF (xmoy == 0.) fxm = 1.
142           IF (xmoy == pi) fxm = -1.
143    
144         ENDDO         ffdx = ffdx + fxm * (xtild(i) - xtild(i-1))
145        ENDDO
146    
147          beta  = ( grossism * ffdx - pi ) / ( ffdx - pi )      beta = (grossism * ffdx - pi) / (ffdx - pi)
148    
149         IF( 2.*beta - grossism.LE. 0.)  THEN      IF (2.*beta - grossism <= 0.) THEN
150          WRITE(6,*) ' **  Attention ! La valeur beta calculee dans la rou         print *, 'Attention ! La valeur beta calculée dans fxhyp est mauvaise.'
151       ,tine fxhyp est mauvaise ! '         print *, 'Modifier les valeurs de grossismx, tau ou dzoomx et relancer.'
152          WRITE(6,*)'Modifier les valeurs de  grossismx ,tau ou dzoomx ',         STOP 1
153       , ' et relancer ! ***  '      ENDIF
154          STOP 1  
155         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  
156    
157  c   .....  Calcul  de  Xf     ........      DO i = nmax, nmax2
158           Xprimt(i) = beta + (grossism - beta) * fhyp(i)
159        ENDDO
160    
161         Xf(0) = - pi      DO i = nmax + 1, nmax2
162           Xprimt(nmax2 - i) = Xprimt(i)
163        ENDDO
164    
165         DO i =  nmax +1, nmax2      ! Calcul de Xf
166    
167         xmoy    = 0.5 * ( xtild(i-1) + xtild( i ) )      Xf(0) = - pi
        fa  = tau*  ( dzoom/2.  - xmoy )  
        fb  = xmoy *  ( pi - xmoy )  
168    
169         IF( 200.* fb .LT. - fa )   THEN      DO i = nmax + 1, nmax2
170           fxm = - 1.         xmoy = 0.5 * (xtild(i-1) + xtild(i))
171         ELSEIF( 200. * fb .LT. fa ) THEN         fa = tau* (dzoom/2. - xmoy)
172           fxm =   1.         fb = xmoy * (pi - xmoy)
173    
174           IF (200.* fb .LT. - fa) THEN
175              fxm = - 1.
176           ELSEIF (200. * fb .LT. fa) THEN
177              fxm = 1.
178         ELSE         ELSE
179           fxm =  TANH ( fa/fb )            fxm = TANH (fa/fb)
180         ENDIF         ENDIF
181    
182         IF ( xmoy.EQ. 0. )  fxm =  1.         IF (xmoy == 0.) fxm = 1.
183         IF ( xmoy.EQ. pi )  fxm = -1.         IF (xmoy == pi) fxm = -1.
184         xxpr(i)    = beta + ( grossism - beta ) * fxm         xxpr(i) = beta + (grossism - beta) * fxm
185        ENDDO
186         ENDDO  
187        DO i = nmax + 1, nmax2
188           xxpr(nmax2-i + 1) = xxpr(i)
189        ENDDO
190    
191        DO i=1, nmax2
192           Xf(i) = Xf(i-1) + xxpr(i) * (xtild(i) - xtild(i-1))
193        ENDDO
194    
195        ! xuv = 0. si calcul aux pts scalaires
196        ! xuv = 0.5 si calcul aux pts U
197    
198        print *
199    
200        DO ik = 1, 4
201           IF (ik == 1) THEN
202              xuv = -0.25
203           ELSE IF (ik == 2) THEN
204              xuv = 0.
205           ELSE IF (ik == 3) THEN
206              xuv = 0.50
207           ELSE IF (ik == 4) THEN
208              xuv = 0.25
209           ENDIF
210    
211         DO i = nmax+1, nmax2         xo1 = 0.
         xxpr(nmax2-i+1) = xxpr(i)  
        ENDDO  
212    
213          DO i=1,nmax2         ii1=1
214           Xf(i)   = Xf(i-1) + xxpr(i) * ( xtild(i) - xtild(i-1) )         ii2=iim
215          ENDDO         IF (ik == 1.and.grossism == 1.) THEN
216              ii1 = 2
217              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  
218         ENDIF         ENDIF
219    
220        xo1   = 0.         DO i = ii1, ii2
221              xlon2 = - pi + (FLOAT(i) + xuv - decalx) * depi / FLOAT(iim)
222              Xfi = xlon2
223    
224              it = nmax2
225              do while (xfi < xf(it) .and. it >= 1)
226                 it = it - 1
227              end do
228    
229              ! Calcul de Xf(xi)
230    
231              xi = xtild(it)
232    
233              IF (it == nmax2) THEN
234                 it = nmax2 -1
235                 Xf(it + 1) = pi
236              ENDIF
237    
238        ii1=1            ! Appel de la routine qui calcule les coefficients a0, a1,
239        ii2=iim            ! a2, a3 d'un polynome de degre 3 qui passe par les points
240        IF(ik.EQ.1.and.grossism.EQ.1.) THEN            ! (Xf(it), xtild(it)) et (Xf(it + 1), xtild(it + 1))
241          ii1 = 2  
242          ii2 = iim+1            CALL coefpoly(Xf(it), Xf(it + 1), Xprimt(it), Xprimt(it + 1), &
243        ENDIF                 xtild(it), xtild(it + 1), a0, a1, a2, a3)
244        DO 1500 i = ii1, ii2  
245              Xf1 = Xf(it)
246        xlon2 = - pi + (FLOAT(i) + xuv - decalx) * depi / FLOAT(iim)            Xprimin = a1 + 2.* a2 * xi + 3.*a3 * xi *xi
247    
248        Xfi    = xlon2            iter = 1
249  c  
250        DO 250 it =  nmax2,0,-1            do
251        IF( Xfi.GE.Xf(it))  GO TO 350               xi = xi - (Xf1 - Xfi)/ Xprimin
252  250   CONTINUE               IF (ABS(xi - xo1) <= epsilon .or. iter == 300) exit
253                 xo1 = xi
254        it = 0               xi2 = xi * xi
255                 Xf1 = a0 + a1 * xi + a2 * xi2 + a3 * xi2 * xi
256  350   CONTINUE               Xprimin = a1 + 2.* a2 * xi + 3.* a3 * xi2
257              end DO
258  c    ......  Calcul de   Xf(xi)    ......  
259  c            if (ABS(xi - xo1) > epsilon) then
260        xi  = xtild(it)               ! iter == 300
261                 print *, 'Pas de solution.'
262        IF(it.EQ.nmax2)  THEN               print *, i, xlon2
263         it       = nmax2 -1               STOP 1
264         Xf(it+1) = pi            end if
265        ENDIF  
266  c  .....................................................................  
267  c            xxprim(i) = depi/ (FLOAT(iim) * Xprimin)
268  c   Appel de la routine qui calcule les coefficients a0,a1,a2,a3 d'un            xvrai(i) = xi + xzoom
269  c   polynome de degre 3  qui passe  par les points (Xf(it),xtild(it) )         end DO
270  c          et (Xf(it+1),xtild(it+1) )  
271           IF (ik == 1.and.grossism == 1.) THEN
272         CALL coefpoly ( Xf(it),Xf(it+1),Xprimt(it),Xprimt(it+1),            xvrai(1) = xvrai(iip1)-depi
273       ,                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)  
274         ENDIF         ENDIF
275         DO i = 1 , iim         DO i = 1, iim
276          xlon(i)     = xvrai(i)            xlon(i) = xvrai(i)
277          xprimm(i)   = xxprim(i)            xprimm(i) = xxprim(i)
278         ENDDO         ENDDO
279         DO i = 1, iim -1         DO i = 1, iim -1
280          IF( xvrai(i+1). LT. xvrai(i) )  THEN            IF (xvrai(i + 1).LT. xvrai(i)) THEN
281           WRITE(6,*) ' PBS. avec rlonu(',i+1,') plus petit que rlonu(',i,               print *, 'Problème avec rlonu(', i + 1, &
282       ,  ')'                    ') plus petit que rlonu(', i, ')'
283          STOP 7               STOP 1
284          ENDIF            ENDIF
285         ENDDO         ENDDO
 c  
 c   ... Reorganisation  des  longitudes  pour les avoir  entre - pi et pi ..  
 c   ........................................................................  
286    
287         champmin =  1.e12         ! Reorganisation des longitudes pour les avoir entre - pi et pi
288    
289           champmin = 1.e12
290         champmax = -1.e12         champmax = -1.e12
291         DO i = 1, iim         DO i = 1, iim
292          champmin = MIN( champmin,xvrai(i) )            champmin = MIN(champmin, xvrai(i))
293          champmax = MAX( champmax,xvrai(i) )            champmax = MAX(champmax, xvrai(i))
294         ENDDO         ENDDO
295    
296        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
297                  GO TO 1600            print *, 'Reorganisation des longitudes pour avoir entre - pi', &
298        ELSE                 ' et pi '
299         WRITE(6,*) 'Reorganisation des longitudes pour avoir entre - pi',  
300       ,  ' et pi '            IF (xzoom <= 0.) THEN
301  c               IF (ik == 1) THEN
302          IF( xzoom.LE.0.)  THEN                  i = 1
303            IF( ik.EQ. 1 )  THEN  
304            DO i = 1, iim                  do while (xvrai(i) < - pi .and. i < iim)
305             IF( xvrai(i).GE. - pi )  GO TO 80                     i = i + 1
306            ENDDO                  end do
307              WRITE(6,*)  ' PBS. 1 !  Xvrai plus petit que  - pi ! '  
308              STOP 8                  if (xvrai(i) < - pi) then
309   80       CONTINUE                     print *, ' PBS. 1 ! Xvrai plus petit que - pi ! '
310            is2 = i                     STOP 1
311                    end if
312    
313                    is2 = i
314                 ENDIF
315    
316                 IF (is2.NE. 1) THEN
317                    DO ii = is2, iim
318                       xlon (ii-is2 + 1) = xvrai(ii)
319                       xprimm(ii-is2 + 1) = xxprim(ii)
320                    ENDDO
321                    DO ii = 1, is2 -1
322                       xlon (ii + iim-is2 + 1) = xvrai(ii) + depi
323                       xprimm(ii + iim-is2 + 1) = xxprim(ii)
324                    ENDDO
325                 ENDIF
326              ELSE
327                 IF (ik == 1) THEN
328                    i = iim
329    
330                    do while (xvrai(i) > pi .and. i > 1)
331                       i = i - 1
332                    end do
333    
334                    if (xvrai(i) > pi) then
335                       print *, ' PBS. 2 ! Xvrai plus grand que pi ! '
336                       STOP 1
337                    end if
338    
339                    is2 = i
340                 ENDIF
341                 idif = iim -is2
342                 DO ii = 1, is2
343                    xlon (ii + idif) = xvrai(ii)
344                    xprimm(ii + idif) = xxprim(ii)
345                 ENDDO
346                 DO ii = 1, idif
347                    xlon (ii) = xvrai (ii + is2) - depi
348                    xprimm(ii) = xxprim(ii + is2)
349                 ENDDO
350            ENDIF            ENDIF
351           ENDIF
352    
353            IF( is2.NE. 1 )  THEN         ! Fin de la reorganisation
354              DO ii = is2 , iim  
355               xlon  (ii-is2+1) = xvrai(ii)         xlon (iip1) = xlon(1) + depi
356               xprimm(ii-is2+1) = xxprim(ii)         xprimm(iip1) = xprimm (1)
357              ENDDO  
358              DO ii = 1 , is2 -1         DO i = 1, iim + 1
359               xlon  (ii+iim-is2+1) = xvrai(ii) + depi            xvrai(i) = xlon(i)*180./pi
360               xprimm(ii+iim-is2+1) = xxprim(ii)         ENDDO
361              ENDDO  
362            ENDIF         IF (ik == 1) THEN
363          ELSE            DO i = 1, iim + 1
364            IF( ik.EQ.1 )  THEN               rlonm025(i) = xlon(i)
365             DO i = iim,1,-1               xprimm025(i) = xprimm(i)
366               IF( xvrai(i).LE. pi ) GO TO 90            ENDDO
367             ENDDO         ELSE IF (ik == 2) THEN
368               WRITE(6,*) ' PBS.  2 ! Xvrai plus grand  que   pi ! '            DO i = 1, iim + 1
369                STOP 9               rlonv(i) = xlon(i)
370   90        CONTINUE               xprimv(i) = xprimm(i)
371              is2 = i            ENDDO
372            ENDIF         ELSE IF (ik == 3) THEN
373             idif = iim -is2            DO i = 1, iim + 1
374             DO ii = 1, is2               rlonu(i) = xlon(i)
375              xlon  (ii+idif) = xvrai(ii)               xprimu(i) = xprimm(i)
376              xprimm(ii+idif) = xxprim(ii)            ENDDO
377             ENDDO         ELSE IF (ik == 4) THEN
378             DO ii = 1, idif            DO i = 1, iim + 1
379              xlon (ii)  = xvrai (ii+is2) - depi               rlonp025(i) = xlon(i)
380              xprimm(ii) = xxprim(ii+is2)               xprimp025(i) = xprimm(i)
381             ENDDO            ENDDO
382           ENDIF         ENDIF
383        ENDIF      end DO
384  c  
385  c     .........   Fin  de la reorganisation   ............................      print *
386    
387   1600    CONTINUE      DO i = 1, iim
388           xlon(i) = rlonv(i + 1) - rlonv(i)
389        ENDDO
390           xlon  ( iip1)  = xlon(1) + depi      champmin = 1.e12
391           xprimm( iip1 ) = xprimm (1 )      champmax = -1.e12
392              DO i = 1, iim
393           DO i = 1, iim+1         champmin = MIN(champmin, xlon(i))
394           xvrai(i) = xlon(i)*180./pi         champmax = MAX(champmax, xlon(i))
395           ENDDO      ENDDO
396        champmin = champmin * 180./pi
397           IF( ik.EQ.1 )  THEN      champmax = champmax * 180./pi
398  c          WRITE(6,*)  ' XLON aux pts. V-0.25   apres ( en  deg. ) '  
399  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)  
400    
401         RETURN  end module fxhyp_m
        END  

Legend:
Removed from v.71  
changed lines
  Added in v.105

  ViewVC Help
Powered by ViewVC 1.1.21