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

Legend:
Removed from v.3  
changed lines
  Added in v.119

  ViewVC Help
Powered by ViewVC 1.1.21