Index: /LMDZ.3.3/branches/rel-1-0-patch/libf/dyn3d/fxhyp.F
===================================================================
--- /LMDZ.3.3/branches/rel-1-0-patch/libf/dyn3d/fxhyp.F	(revision 297)
+++ /LMDZ.3.3/branches/rel-1-0-patch/libf/dyn3d/fxhyp.F	(revision 298)
@@ -20,4 +20,11 @@
        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.
 
 #include "dimensions.h"
@@ -42,7 +49,7 @@
        REAL*8 pi,depi,epsilon,xzoom,fa,fb
        REAL*8 Xf1, Xfi , a0,a1,a2,a3,xi2
-       INTEGER i,it,ik,iter,ii,idif
+       INTEGER i,it,ik,iter,ii,idif,ii1,ii2
        REAL*8 xi,xo1,xmoy,xlon2,fxm,Xprimin
-       REAL*8 champmin,champmax
+       REAL*8 champmin,champmax,decalx
        INTEGER is2
        SAVE is2
@@ -55,5 +62,12 @@
        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( dzoom.LT.1.)  THEN
          dzoom = dzoom * depi
@@ -73,11 +87,9 @@
        ENDDO
 
-       DO i = 0, nmax2
+       DO i = nmax, nmax2
 
        fa  = tau*  ( dzoom/2.  - xtild(i) )
        fb  = xtild(i) *  ( pi - xtild(i) )
 
-
-       if ( xtild(i) .ne. 0. .and. xtild(i) .ne. pi) then
          IF( 200.* fb .LT. - fa )   THEN
            fhyp ( i) = - 1.
@@ -85,10 +97,17 @@
            fhyp ( i) =   1.
          ELSE
-           fhyp(i) =  TANH ( fa/fb )
+            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
-       endif
-
-       IF ( xtild(i).EQ. 0. )  fhyp(i) =  1.
-       IF ( xtild(i).EQ. pi )  fhyp(i) = -1.
+
+        IF ( xtild(i).EQ. 0. )  fhyp(i) =  1.
+        IF ( xtild(i).EQ. pi )  fhyp(i) = -1.
 
        ENDDO
@@ -100,4 +119,59 @@
 
        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.
+       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
+                    fxm   = - 1.
+                ELSEIF( 200.*fb - fa.LT.1.e-10 )  THEN
+                    fxm   =   1.
+                ENDIF
+            ELSE
+                    fxm   =  TANH ( fa/fb )
+            ENDIF
+       ENDIF
+
+       IF ( xmoy.EQ. 0. )  fxm  =  1.
+       IF ( xmoy.EQ. pi )  fxm  = -1.
+
+       ffdx = ffdx + fxm * ( xtild(i) - xtild(i-1) )
+
+       ENDDO
+
+        beta  = ( grossism * ffdx - pi ) / ( ffdx - pi )
+
+       IF( 2.*beta - grossism.LE. 0.)  THEN
+        WRITE(6,*) ' **  Attention ! La valeur beta calculee dans la rou
+     ,tine fxhyp est mauvaise ! '
+        WRITE(6,*)'Modifier les valeurs de  grossismx ,tau ou dzoomx ',
+     , ' et relancer ! ***  '
+        CALL ABORT
+       ENDIF
+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
+
+c   .....  Calcul  de  Xf     ........
+
+       Xf(0) = - pi
+
+       DO i =  nmax +1, nmax2
 
        xmoy    = 0.5 * ( xtild(i-1) + xtild( i ) )
@@ -113,50 +187,4 @@
        ENDIF
 
-       IF ( xmoy.EQ. 0. )  fhyp(i) =  1.
-       IF ( xmoy.EQ. pi )  fhyp(i) = -1.
-       ffdx = ffdx + fxm * ( xtild(i) - xtild(i-1) )
-
-       ENDDO
-
-        beta  = ( grossism * ffdx - pi ) / ( ffdx - pi )
-
-       IF( 2.*beta - grossism.LE. 0.)  THEN
-        WRITE(6,*) ' **  Attention ! La valeur beta calculee dans la rou
-     ,tine fxhyp est mauvaise ! '
-        WRITE(6,*)'Modifier les valeurs de  grossismx ,tau ou dzoomx ',
-     , ' et relancer ! ***  '
-        CALL ABORT
-       ENDIF
-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
-
-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.
-       ELSE
-         fxm =  TANH ( fa/fb )
-       ENDIF
-
        IF ( xmoy.EQ. 0. )  fxm =  1.
        IF ( xmoy.EQ. pi )  fxm = -1.
@@ -185,9 +213,9 @@
 
        IF( ik.EQ.1 )        THEN
-         xuv = - 0.25
+         xuv =  -0.25
        ELSE IF ( ik.EQ.2 )  THEN
          xuv =   0.
        ELSE IF ( ik.EQ.3 )  THEN
-         xuv =   0.5
+         xuv =   0.50
        ELSE IF ( ik.EQ.4 )  THEN
          xuv =   0.25
@@ -196,7 +224,14 @@
       xo1   = 0.
 
-      DO 1500 i = 1, iim
-
-      xlon2 = - pi + (FLOAT(i) + xuv - 0.75) * depi / FLOAT(iim) 
+      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
@@ -248,9 +283,14 @@
 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
@@ -271,5 +311,5 @@
        ENDDO
 
-      IF(champmin .GE. - pi .AND. champmax.LE. pi )  THEN
+      IF(champmin .GE.-pi-0.10.and.champmax.LE.pi+0.10 )  THEN
                 GO TO 1600
       ELSE
@@ -301,5 +341,5 @@
           IF( ik.EQ.1 )  THEN
            DO i = iim,1,-1
-            IF( xvrai(i).LE. pi )  GO TO 90
+             IF( xvrai(i).LE. pi ) GO TO 90
            ENDDO
              WRITE(6,*) ' PBS.  2 ! Xvrai plus grand  que   pi ! '
@@ -336,18 +376,18 @@
 c          WRITE(6,18) 
 c          WRITE(6,68) xvrai
-ccc          WRITE(6,*) ' XPRIM k ',ik
-ccc          WRITE(6,566)  xprimm
-
-           DO i = 1,iim + 1
+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
-ccc          WRITE(6,*) ' XPRIM k ',ik
-ccc          WRITE(6,566)  xprimm
+c          WRITE(6,*) ' XPRIM k ',ik
+c          WRITE(6,566)  xprimm
 
            DO i = 1,iim + 1
@@ -360,6 +400,6 @@
 c          WRITE(6,*)  ' XLON aux pts. U   apres ( en  deg. ) '
 c          WRITE(6,68) xvrai
-ccc          WRITE(6,*) ' XPRIM ik ',ik
-ccc          WRITE(6,566)  xprimm
+c          WRITE(6,*) ' XPRIM ik ',ik
+c          WRITE(6,566)  xprimm
 
            DO i = 1,iim + 1
@@ -372,6 +412,6 @@
 c          WRITE(6,*)  ' XLON aux pts. V+0.25   apres ( en  deg. ) '
 c          WRITE(6,68) xvrai
-ccc          WRITE(6,*) ' XPRIM ik ',ik
-ccc          WRITE(6,566)  xprimm
+c          WRITE(6,*) ' XPRIM ik ',ik
+c          WRITE(6,566)  xprimm
 
            DO i = 1,iim + 1
@@ -403,4 +443,5 @@
 24     FORMAT(2x,'Parametres xzoom,gross,tau ,dzoom pour fxhyp ',4f8.3)
 68     FORMAT(1x,7f9.2)
+566    FORMAT(1x,7f9.4)
 
        RETURN
