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

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

  ViewVC Help
Powered by ViewVC 1.1.21