Index: LMDZ.3.3/trunk/libf/dyn3d/defrun_new.F
===================================================================
--- LMDZ.3.3/trunk/libf/dyn3d/defrun_new.F	(revision 199)
+++ LMDZ.3.3/trunk/libf/dyn3d/defrun_new.F	(revision 203)
@@ -1,2 +1,5 @@
+c
+c $Header
+c
       SUBROUTINE defrun_new( tapedef, etatinit, clesphy0 )
 c
@@ -36,5 +39,5 @@
       INTEGER   tapeout
       REAL clonn,clatt,grossismxx,grossismyy
-      REAL dzoomxx,dzoomyy
+      REAL dzoomxx,dzoomyy,tauxx,tauyy
       LOGICAL  fxyhypbb, ysinuss
       INTEGER i
@@ -258,9 +261,8 @@
       WRITE(tapeout,*)    clonn
       IF( ABS(clon - clonn).GE. 0.001 )  THEN
-        PRINT *,' La valeur de clon passee par run.def est differente de 
-     *  celle lue sur le fichier  start '
+       WRITE(tapeout,*) ' La valeur de clon passee par run.def est diffe
+     *rente de  celle lue sur le fichier  start '
         STOP
       ENDIF
-c
 c
       READ (tapedef,9001) ch1,ch4
@@ -270,6 +272,6 @@
 
       IF( ABS(clat - clatt).GE. 0.001 )  THEN
-        PRINT *,' La valeur de clat passee par run.def est differente de 
-     *  celle lue sur le fichier  start '
+       WRITE(tapeout,*) ' La valeur de clat passee par run.def est diffe
+     *rente de  celle lue sur le fichier  start '
         STOP
       ENDIF
@@ -281,6 +283,6 @@
 
       IF( ABS(grossismx - grossismxx).GE. 0.001 )  THEN
-        PRINT *,' La valeur de grossismx passee par run.def est differente  
-     *  de celle lue sur le fichier  start '
+       WRITE(tapeout,*) ' La valeur de grossismx passee par run.def est
+     , differente de celle lue sur le fichier  start '
         STOP
       ENDIF
@@ -292,11 +294,11 @@
 
       IF( ABS(grossismy - grossismyy).GE. 0.001 )  THEN
-        PRINT *,' La valeur de grossismy passee par run.def est differen
-     * te de celle lue sur le fichier  start '
+       WRITE(tapeout,*) ' La valeur de grossismy passee par run.def est
+     , differente de celle lue sur le fichier  start '
         STOP
       ENDIF
       
       IF( grossismx.LT.1. )  THEN
-        PRINT *,' ***  ATTENTION !! grossismx < 1 .   *** '
+        WRITE(tapeout,*) ' ***  ATTENTION !! grossismx < 1 .   *** '
          STOP
       ELSE
@@ -306,5 +308,5 @@
 
       IF( grossismy.LT.1. )  THEN
-        PRINT *,' ***  ATTENTION !! grossismy < 1 .   *** '
+        WRITE(tapeout,*) ' ***  ATTENTION !! grossismy < 1 .   *** '
          STOP
       ELSE
@@ -312,5 +314,4 @@
       ENDIF
 
-      PRINT *,' alphax alphay defrun ',alphax,alphay
 c
 c    alphax et alphay sont les anciennes formulat. des grossissements
@@ -324,14 +325,14 @@
       IF( .NOT.fxyhypb )  THEN
            IF( fxyhypbb )     THEN
-              PRINT *,' ********  PBS DANS  DEFRUN  ******** '
-              PRINT *,' *** fxyhypb lu sur le fichier start est F ',
-     *       'alors  qu il est  T  sur  run.def  ***'
+            WRITE(tapeout,*) ' ********  PBS DANS  DEFRUN  ******** '
+            WRITE(tapeout,*)' *** fxyhypb lu sur le fichier start est F'
+     *,      '                   alors  qu il est  T  sur  run.def  ***'
               STOP
            ENDIF
       ELSE
            IF( .NOT.fxyhypbb )   THEN
-              PRINT *,' ********  PBS DANS  DEFRUN  ******** '
-              PRINT *,' ***  fxyhypb lu sur le fichier start est T ',
-     *        'alors  qu il est  F  sur  run.def  ****  '
+            WRITE(tapeout,*) ' ********  PBS DANS  DEFRUN  ******** '
+            WRITE(tapeout,*)' *** fxyhypb lu sur le fichier start est t'
+     *,      '                   alors  qu il est  F  sur  run.def  ***'
               STOP
            ENDIF
@@ -343,12 +344,4 @@
       WRITE(tapeout,*)    dzoomxx
 
-      IF( fxyhypb )  THEN
-       IF( ABS(dzoomx - dzoomxx).GE. 0.001 )  THEN
-        PRINT *,' La valeur de dzoomx passee par run.def est differente 
-     *  de celle lue sur le fichier  start '
-        STOP
-       ENDIF
-      ENDIF
-
       READ (tapedef,9001) ch1,ch4
       READ (tapedef,*)    dzoomyy
@@ -356,10 +349,40 @@
       WRITE(tapeout,*)    dzoomyy
 
+      READ (tapedef,9001) ch1,ch4
+      READ (tapedef,*)    tauxx
+      WRITE(tapeout,9001) ch1,'taux'
+      WRITE(tapeout,*)    tauxx
+
+      READ (tapedef,9001) ch1,ch4
+      READ (tapedef,*)    tauyy
+      WRITE(tapeout,9001) ch1,'tauy'
+      WRITE(tapeout,*)    tauyy
+
       IF( fxyhypb )  THEN
+
+       IF( ABS(dzoomx - dzoomxx).GE. 0.001 )  THEN
+        WRITE(tapeout,*)' La valeur de dzoomx passee par run.def est dif
+     *ferente de celle lue sur le fichier  start '
+        CALL ABORT
+       ENDIF
+
        IF( ABS(dzoomy - dzoomyy).GE. 0.001 )  THEN
-        PRINT *,' La valeur de dzoomy passee par run.def est differente 
-     * de celle lue sur le fichier  start '
-        STOP
+        WRITE(tapeout,*)' La valeur de dzoomy passee par run.def est dif
+     *ferente de celle lue sur le fichier  start '
+        CALL ABORT
        ENDIF
+
+       IF( ABS(taux - tauxx).GE. 0.001 )  THEN
+        WRITE(6,*)' La valeur de taux passee par run.def est differente
+     *  de celle lue sur le fichier  start '
+        CALL ABORT
+       ENDIF
+
+       IF( ABS(tauy - tauyy).GE. 0.001 )  THEN
+        WRITE(6,*)' La valeur de tauy passee par run.def est differente
+     *  de celle lue sur le fichier  start '
+        CALL ABORT
+       ENDIF
+
       ENDIF
       
@@ -374,14 +397,14 @@
         IF( .NOT.ysinus )  THEN
            IF( ysinuss )     THEN
-              PRINT *,' ********  PBS DANS  DEFRUN  ******** '
-              PRINT *,' *** ysinus lu sur le fichier start est F ',
-     *       'alors  qu il est  T  sur  run.def  ***'
+              WRITE(6,*) ' ********  PBS DANS  DEFRUN  ******** '
+              WRITE(tapeout,*)'** ysinus lu sur le fichier start est F',
+     *       ' alors  qu il est  T  sur  run.def  ***'
               STOP
            ENDIF
         ELSE
            IF( .NOT.ysinuss )   THEN
-              PRINT *,' ********  PBS DANS  DEFRUN  ******** '
-              PRINT *,' ***  ysinus lu sur le fichier start est T ',
-     *        'alors  qu il est  F  sur  run.def  ****  '
+              WRITE(6,*) ' ********  PBS DANS  DEFRUN  ******** '
+              WRITE(tapeout,*)'** ysinus lu sur le fichier start est T',
+     *       ' alors  qu il est  F  sur  run.def  ***'
               STOP
            ENDIF
@@ -389,5 +412,8 @@
       ENDIF
 c
-      close(tapedef)
+      WRITE(6,*) ' alphax alphay defrun ',alphax,alphay
+
+      CLOSE(tapedef)
+
       RETURN
 c   ...............................................
@@ -416,5 +442,5 @@
 
       IF( grossismx.LT.1. )  THEN
-        PRINT *,' ***  ATTENTION !! grossismx < 1 .   *** '
+        WRITE(tapeout,*) '***  ATTENTION !! grossismx < 1 .   *** '
          STOP
       ELSE
@@ -423,5 +449,5 @@
 
       IF( grossismy.LT.1. )  THEN
-        PRINT *,' ***  ATTENTION !! grossismy < 1 .   *** '
+        WRITE(tapeout,*) ' ***  ATTENTION !! grossismy < 1 .   *** '
          STOP
       ELSE
@@ -429,6 +455,4 @@
       ENDIF
 
-      PRINT *,' alphax alphay defrun ',alphax,alphay
-
 c
       READ (tapedef,9001) ch1,ch4
@@ -446,5 +470,15 @@
       WRITE(tapeout,9001) ch1,'dzoomy'
       WRITE(tapeout,*)    dzoomy
-c
+
+      READ (tapedef,9001) ch1,ch4
+      READ (tapedef,*)    taux
+      WRITE(tapeout,9001) ch1,'taux'
+      WRITE(tapeout,*)    taux
+c
+      READ (tapedef,9001) ch1,ch4
+      READ (tapedef,*)    tauy
+      WRITE(tapeout,9001) ch1,'tauy'
+      WRITE(tapeout,*)    tauy
+
       READ (tapedef,9001) ch1,ch4
       READ (tapedef,*)    ysinus
@@ -452,9 +486,11 @@
       WRITE(tapeout,*)    ysinus
        
+      WRITE(tapeout,*) ' alphax alphay defrun ',alphax,alphay
 c
 9000  FORMAT(3(/,a72))
 9001  FORMAT(/,a72,/,a12)
 cc
-      close(tapedef)
+      CLOSE(tapedef)
+
       RETURN
       END
Index: LMDZ.3.3/trunk/libf/dyn3d/dynetat0.F
===================================================================
--- LMDZ.3.3/trunk/libf/dyn3d/dynetat0.F	(revision 199)
+++ LMDZ.3.3/trunk/libf/dyn3d/dynetat0.F	(revision 203)
@@ -1,2 +1,5 @@
+c
+c $Header
+c
       SUBROUTINE dynetat0(fichnom,nq,vcov,ucov,
      .                    teta,q,masse,ps,phis,time)
@@ -105,4 +108,6 @@
         dzoomx   = tab_cntrl(25)
         dzoomy   = tab_cntrl(26)
+        taux     = tab_cntrl(28)
+        tauy     = tab_cntrl(29)
       ELSE
         fxyhypb = . FALSE .
Index: LMDZ.3.3/trunk/libf/dyn3d/dynredem.F
===================================================================
--- LMDZ.3.3/trunk/libf/dyn3d/dynredem.F	(revision 199)
+++ LMDZ.3.3/trunk/libf/dyn3d/dynredem.F	(revision 203)
@@ -1,2 +1,5 @@
+c
+c $Header
+c
       SUBROUTINE dynredem0(fichnom,idayref,anneeref,phis,nq)
       USE IOIPSL
@@ -92,4 +95,7 @@
        tab_cntrl(25) = dzoomx
        tab_cntrl(26) = dzoomy
+       tab_cntrl(27) = 0.
+       tab_cntrl(28) = taux
+       tab_cntrl(29) = tauy
       ELSE
        tab_cntrl(24) = 0.
@@ -97,5 +103,7 @@
        tab_cntrl(26) = dzoomy
        tab_cntrl(27) = 0.
-       IF( ysinus )  tab_cntrl(27) = 1. 
+       tab_cntrl(28) = 0.
+       tab_cntrl(29) = 0.
+       IF( ysinus )  tab_cntrl(27) = 1.
       ENDIF
 c
Index: LMDZ.3.3/trunk/libf/dyn3d/fxhyp.F
===================================================================
--- LMDZ.3.3/trunk/libf/dyn3d/fxhyp.F	(revision 199)
+++ LMDZ.3.3/trunk/libf/dyn3d/fxhyp.F	(revision 203)
@@ -1,2 +1,5 @@
+c
+c $Header
+c
        SUBROUTINE fxhyp ( xzoomdeg,grossism,dzoom,tau ,
      , rlonm025,xprimm025,rlonv,xprimv,rlonu,xprimu,rlonp025,xprimp025)
@@ -11,9 +14,12 @@
 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 transition ,   normalement  = 1  .
-c
+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 = 50000, nmax2 = 2*nmax )
+       PARAMETER (  nmax = 30000, nmax2 = 2*nmax )
 
 #include "dimensions.h"
@@ -23,63 +29,110 @@
 c
        REAL xzoomdeg,dzoom,tau,grossism
+
+c    ......   arguments  de  sortie  ......
+
        REAL rlonm025(iip1),xprimm025(iip1),rlonv(iip1),xprimv(iip1),
      ,  rlonu(iip1),xprimu(iip1),rlonp025(iip1),xprimp025(iip1)
 
-c    ......   arguments  de  sortie  ......
-c
-       REAL xlon(iip1),xprimm(iip1),xuv
-       REAL xtild(0:nmax2)
-       REAL fhyp(0:nmax),ffdx(0:nmax),beta,Xprimt(0:nmax2)
-       REAL Xf(0:nmax2),xxpr(0:nmax2)
-       REAL xvrai(iip1),xxprim(iip1) 
-       REAL pi,depi,epsilon,xzoom
+c     .... variables locales  ....
+c
+       REAL*8 xlon(iip1),xprimm(iip1),xuv
+       REAL*8 xtild(0:nmax2)
+       REAL*8 fhyp(0:nmax),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
-       REAL xi,xo1,xint,xmoy,xlon2,fxm,Xprimin
-       REAL champmin,champmax
+       REAL*8 xi,xo1,xmoy,xlon2,fxm,Xprimin
+       REAL*8 champmin,champmax
        INTEGER is2
        SAVE is2
-       REAL dlon1(iip1),dlon2(iip1),dlon3(iip1)
+       REAL*8 heavyside
+       EXTERNAL coefpoly,heavyside
 
        pi       = 2. * ASIN(1.)
        depi     = 2. * pi
-       epsilon  = 1.e-6
+       epsilon  = 1.e-3
        xzoom    = xzoomdeg * pi/180. 
 
-
+       WRITE(6,24) xzoomdeg,grossism,tau,dzoom
+       IF( dzoom.LT.1.)  THEN
+         dzoom = dzoom * depi
+       ELSEIF( dzoom.LT. 25. ) THEN
+         WRITE(6,*) ' Le param. dzoomy pour fxhyp est trop petit ! L aug
+     ,menter et relancer ! '
+         STOP 1
+       ELSE
+         dzoom = dzoom * pi/180.
+       ENDIF
 
        DO i = 0, nmax2 
-         xtild(i) = FLOAT(i) /nmax2
-        IF( xtild(i).EQ. 0.5 )  xtild(i) = xtild(i) + 1.e-6
-       ENDDO
-
-       DO i = 1, nmax
-        fhyp(i) = TANH ( ( xtild(i) - 0.5*(1.- dzoom) )          /
-     ,                 ( tau * xtild(i) * ( 0.5 -xtild(i))) )
-       ENDDO
-
-        fhyp(   0  ) = - 1.
-        fhyp( nmax ) =   1.
+        xtild(i) = - pi + FLOAT(i) * depi /nmax2
+       ENDDO
+
+       DO i = 0, nmax2
+
+       fa  = tau*  ( dzoom/2.  - xtild(i) )
+       fb  = xtild(i) *  ( pi - xtild(i) )
+
+
+       IF( 200.* fb .LT. - fa )   THEN
+         fhyp ( i) = - 1.
+       ELSEIF( 200. * fb .LT. fa ) THEN
+         fhyp ( i) =   1.
+       ELSE
+         fhyp(i) =  TANH ( fa/fb )
+       ENDIF
+
+       IF ( xtild(i).EQ. 0. )  fhyp(i) =  1.
+       IF ( xtild(i).EQ. pi )  fhyp(i) = -1.
+
+       ENDDO
 
 cc  ....  Calcul  de  beta  ....
-c
-       ffdx( 0 ) = 0.
-
-       DO i = 1, nmax
-        xmoy    = 0.5 * ( xtild(i-1) + xtild( i ) )
-        fxm     = TANH ( ( xmoy - 0.5 * ( 1. - dzoom ) )    /
-     ,                 ( tau * xmoy * ( 0.5 -xmoy)) )
-        ffdx(i) = ffdx(i-1) + fxm * ( xtild(i) - xtild(i-1) )
-       ENDDO
-
-        beta  = ( grossism * ffdx(nmax) - 0.5 ) / ( ffdx(nmax) - 0.5 )
+c   ............................
+
+       ffdx = 0.
+
+       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. )  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 )
+ccc        WRITE(6,*) ' ** X  beta **',beta,grossism
+
+       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 = 0, nmax
+       DO i = nmax, nmax2
         Xprimt(i) = beta  + ( grossism - beta ) * fhyp(i)
        ENDDO
 c   
-       DO i = 0, nmax
+       DO i =  nmax+1, nmax2
         Xprimt( nmax2 - i ) = Xprimt( i )
        ENDDO
@@ -88,14 +141,28 @@
 c   .....  Calcul  de  Xf     ........
 
-        Xf(0) = 0.
-       DO i = 1, nmax
-        xmoy    = 0.5 * ( xtild(i-1) + xtild( i ) )
-        fxm     = TANH ( ( xmoy - 0.5 * ( 1. - dzoom ) )    /
-     ,                 ( tau * xmoy * ( 0.5 -xmoy)) )
-        xxpr(i)    = beta + ( grossism - beta ) * fxm
-       ENDDO
-
-       DO i = 1,nmax
-         xxpr(nmax2-i+1) = xxpr(i)
+       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.
+       xxpr(i)    = beta + ( grossism - beta ) * fxm
+
+       ENDDO
+
+       DO i = nmax+1, nmax2
+        xxpr(nmax2-i+1) = xxpr(i)
        ENDDO
 
@@ -103,10 +170,4 @@
          Xf(i)   = Xf(i-1) + xxpr(i) * ( xtild(i) - xtild(i-1) )
         ENDDO
-        do i=1,nmax2
-        xf(i)=xf(i)/xf(nmax2)
-        enddo
-
-
-       PRINT *,' XF ',xf(0),xf(nmax),xf(nmax2)
 
 
@@ -130,66 +191,68 @@
        ENDIF
 
+      xo1   = 0.
 
       DO 1500 i = 1, iim
 
-      xlon2 = (  FLOAT(i) + xuv - 0.75) / FLOAT(iim) 
-
-      xo1   = 0.
-      xi    = xlon2
-c
-      DO 500 iter = 1,300
-
+      xlon2 = - pi + (FLOAT(i) + xuv - 0.75) * depi / FLOAT(iim) 
+
+      Xfi    = xlon2
+c
       DO 250 it =  nmax2,0,-1
-      IF( xi.GE.xtild(it))  GO TO 350
+      IF( Xfi.GE.Xf(it))  GO TO 350
 250   CONTINUE
 
       it = 0
-      xi = xtild(it)
 
 350   CONTINUE
-       IF(it.EQ.nmax2)  THEN
-        it       = nmax2 -1
-        xf(it+1) = 1.
-       ENDIF
-c  .................................................................
-c  ....  Interpolation entre  xi(it) et xi(it+1)   pour avoir X(xi)  
-c      .....           et   X'(xi)                             .....
-c  .................................................................
-
-       xint   = ( Xf(it+1)-Xf(it) ) / ( xtild(it+1)-xtild(it) )      * 
-     +                    ( xi-xtild(it) )  +  Xf(it)
-      Xprimin = ( Xprimt(it+1)-Xprimt(it) )/ ( xtild(it+1)-xtild(it) ) *
-     +                    ( xi-xtild(it) )  +  Xprimt(it)
-
-       xi = xi - (xint-xlon2)/Xprimin
-
-      IF( ABS(xi-xo1).LE.epsilon) GO TO 550
-      xo1 = xi
-c
+
+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
-      PRINT *,' ***   PAS DE SOLUTION  ****  ',i,xlon2
-        STOP 4
+        WRITE(6,*) ' Pas de solution ***** ',i,xlon2,iter
+          STOP 6
 550   CONTINUE
 
-       xxprim(i)   = depi/( FLOAT(iim) * Xprimin)
-       xvrai(i)    = depi *  (xi - 0.5) + xzoom
-
+       xxprim(i) = depi/ ( FLOAT(iim) * Xprimin )
+       xvrai(i)  =  xi + xzoom
 
 1500   CONTINUE
 
        DO i = 1 , iim
-        xlon  (i)   = xvrai(i)
+        xlon(i)     = xvrai(i)
         xprimm(i)   = xxprim(i)
-cc        xxlon(i) = xlon(i)*180./pi
        ENDDO
         
-cc      PRINT *,' XLON avant '
-cc      PRINT 68,(xxlon(i),i=1,iim)
-       
        DO i = 1, iim -1
         IF( xvrai(i+1). LT. xvrai(i) )  THEN
-         PRINT *,' PBS.  avec  rlonu(',i+1,' plus petit que rlonu(',i,
-     ,   ')'
-         STOP
+         WRITE(6,*) ' PBS. avec rlonu(',i+1,') plus petit que rlonu(',i,
+     ,  ')'
+        STOP 7
         ENDIF
        ENDDO
@@ -205,12 +268,10 @@
        ENDDO
 
-       PRINT *,' LONGITUDES  min max ',champmin,champmax
-
       IF(champmin .GE. - pi .AND. champmax.LE. pi )  THEN
                 GO TO 1600
       ELSE
-        PRINT 18
-        PRINT *,'Reorganisation des longitudes pour avoir entre - pi ',
-     ,  ' et  pi '
+       WRITE(6,18) 
+       WRITE(6,*) 'Reorganisation des longitudes pour avoir entre - pi',
+     ,  ' et pi '
 c
         IF( xzoom.LE.0.)  THEN
@@ -219,6 +280,6 @@
            IF( xvrai(i).GE. - pi )  GO TO 80
           ENDDO
-            PRINT *, ' PBS. 1 '
-            STOP
+            WRITE(6,*)  ' PBS. 1 !  Xvrai plus petit que  - pi ! '
+            STOP 8
  80       CONTINUE
           is2 = i
@@ -240,10 +301,9 @@
             IF( xvrai(i).LE. pi )  GO TO 90
            ENDDO
-             PRINT *,' PBS.  2 '
-              STOP
+             WRITE(6,*) ' PBS.  2 ! Xvrai plus grand  que   pi ! '
+              STOP 9
  90        CONTINUE
             is2 = i
           ENDIF
-cc           PRINT *,' IS2 ',is2
            idif = iim -is2
            DO ii = 1, is2
@@ -270,84 +330,86 @@
          ENDDO
 
-
          IF( ik.EQ.1 )  THEN
-         PRINT *, ' XLON aux pts. V-0.25   apres ( en  deg. ) '
-         PRINT 18
-         PRINT 68,xvrai
-         PRINT *,' XPRIM '
-         PRINT 68, xprimm
+          WRITE(6,*)  ' XLON aux pts. V-0.25   apres ( en  deg. ) '
+          WRITE(6,18) 
+          WRITE(6,68) xvrai
+ccc          WRITE(6,*) ' XPRIM k ',ik
+ccc          WRITE(6,566)  xprimm
+
            DO i = 1,iim + 1
              rlonm025(i) = xlon( i )
             xprimm025(i) = xprimm(i)
            ENDDO
+
          ELSE IF( ik.EQ.2 )  THEN
-         PRINT 18
-         PRINT *, ' XLON aux pts. V   apres ( en  deg. ) '
-         PRINT 68,xvrai
-         PRINT *,' XPRIM '
-         PRINT 68, xprimm
+          WRITE(6,18) 
+          WRITE(6,*)  ' XLON aux pts. V   apres ( en  deg. ) '
+          WRITE(6,68) xvrai
+ccc          WRITE(6,*) ' XPRIM k ',ik
+ccc          WRITE(6,566)  xprimm
+
            DO i = 1,iim + 1
              rlonv(i) = xlon( i )
             xprimv(i) = xprimm(i)
            ENDDO
-         ELSE IF( ik.EQ.3 )  THEN
-         PRINT 18
-         PRINT *, ' XLON aux pts. U   apres ( en  deg. ) '
-         PRINT 68,xvrai
-         PRINT *,' XPRIM '
-         PRINT 68, xprimm
+
+         ELSE IF( ik.EQ.3)   THEN
+          WRITE(6,18) 
+          WRITE(6,*)  ' XLON aux pts. U   apres ( en  deg. ) '
+          WRITE(6,68) xvrai
+ccc          WRITE(6,*) ' XPRIM ik ',ik
+ccc          WRITE(6,566)  xprimm
+
            DO i = 1,iim + 1
              rlonu(i) = xlon( i )
             xprimu(i) = xprimm(i)
            ENDDO
+
          ELSE IF( ik.EQ.4 )  THEN
-         PRINT 18
-         PRINT *, ' XLON aux pts. V+0.25   apres ( en  deg. ) '
-         PRINT 68,xvrai
-         PRINT *,' XPRIM '
-         PRINT 68, xprimm
+          WRITE(6,18) 
+          WRITE(6,*)  ' XLON aux pts. V+0.25   apres ( en  deg. ) '
+          WRITE(6,68) xvrai
+ccc          WRITE(6,*) ' XPRIM ik ',ik
+ccc          WRITE(6,566)  xprimm
+
            DO i = 1,iim + 1
              rlonp025(i) = xlon( i )
             xprimp025(i) = xprimm(i)
            ENDDO
+
          ENDIF
 
 5000    CONTINUE
 c
-c       ...........  fin  de la boucle  do 5000      ............
-
-c
-        DO i = 1, iim + 1
-         dlon1(i) = rlonm025(i) - rlonv(i)
-         dlon2(i) = rlonm025(i) - rlonp025(i)
-         dlon3(i) = rlonm025(i) - rlonu(i)
+c    ...........  fin  de la boucle  do 5000      ............
+
+        DO i = 1, iim
+         xlon(i) = rlonv(i+1) - rlonv(i)
         ENDDO
-
-        DO i = 1, iim + 1
-         rlonm025(i) = rlonm025(i) + dlon1(i)
+        champmin =  1.e12
+        champmax = -1.e12
+        DO i = 1, iim
+         champmin = MIN( champmin, xlon(i) )
+         champmax = MAX( champmax, xlon(i) )
         ENDDO
-
-        DO i = 1, iim + 1
-         rlonv(i)    = rlonm025(i) - dlon1(i)
-         rlonp025(i) = rlonm025(i) - dlon2(i)
-         rlonu(i)    = rlonm025(i) - dlon3(i)
-        ENDDO
-
-        DO i = 1, iim
-         xprimu   (i) = rlonu(i+1) - rlonu(i)
-         xprimv   (i) = rlonv(i+1) - rlonv(i)
-         xprimm025(i) = rlonm025(i+1) - rlonm025(i)
-         xprimp025(i) = rlonp025(i+1) - rlonp025(i)
-        ENDDO
-         xprimu   (iip1) = xprimu   (1)
-         xprimv   (iip1) = xprimv   (1)
-         xprimm025(iip1) = xprimm025(1)
-         xprimp025(iip1) = xprimp025(1)
-
-
-18       FORMAT(/)
-68       FORMAT(1x,7f9.2)
-
-
-         RETURN
-         END
+         champmin = champmin * 180./pi
+         champmax = champmax * 180./pi
+
+        WRITE(6,18)
+        WRITE(6,*) '  Longitudes '
+        WRITE(6,18)
+        WRITE(6,3)  champmin, champmax
+        WRITE(6,*) ' Si cette derniere est trop lache , modifiez les par
+     ,ametres  grossism , tau , dzoom pour X et repasser ! '
+        WRITE(6,18)
+
+3      Format(1x, ' Au centre du zoom , la longueur de la maille est',
+     ,  ' d environ ',f8.2 ,' degres  ',
+     , ' alors que la maille en dehors de la zone du zoom est d environ
+     , ', f8.2,' degres ' )
+18     FORMAT(/)
+24     FORMAT(2x,' Parametres yzoom,gross,tau ,dzoom pour fyhyp ',4f8.3)
+68     FORMAT(1x,7f9.2)
+
+       RETURN
+       END
Index: LMDZ.3.3/trunk/libf/dyn3d/fxyhyper.F
===================================================================
--- LMDZ.3.3/trunk/libf/dyn3d/fxyhyper.F	(revision 199)
+++ LMDZ.3.3/trunk/libf/dyn3d/fxyhyper.F	(revision 203)
@@ -1,4 +1,7 @@
-       SUBROUTINE fxyhyper ( yzoom, grossy, dzoomy,tauy,deltay  , 
-     ,                      xzoom, grossx, dzoomx,taux,
+c
+c $Header
+c
+       SUBROUTINE fxyhyper ( yzoom, grossy, dzoomy,tauy  ,   
+     ,                       xzoom, grossx, dzoomx,taux  ,
      , rlatu,yprimu,rlatv,yprimv,rlatu1,  yprimu1,  rlatu2,  yprimu2  , 
      , rlonu,xprimu,rlonv,xprimv,rlonm025,xprimm025,rlonp025,xprimp025)
@@ -19,13 +22,9 @@
 c     a) le grossissement du zoom  :  grossy  ( en y ) et grossx ( en x )
 c     b) l' extension     du zoom  :  dzoomy  ( en y ) et dzoomx ( en x )
-c     c) la raideur       du zoom  :   tau   , ici  =  1.
+c     c) la raideur de la transition du zoom  :   taux et tauy   
 c
-c     N.B :   le produit ( grossissement * extension )  doit etre <  1.
-c    *******
-c     En plus , il y a un autre parametre , moins important mais quand
-c     meme utile , c'est  deltay , deplacement de la zone du zoom en
-c     latitude   :  Si  on deplace  de 10. degres vers le nord  ( deltay
-c      = 10.  dans inigeom ) .
-c
+c  N.B : Il vaut mieux avoir   :   grossx * dzoomx <  pi    ( radians )
+c ******
+c                  et              grossy * dzoomy <  pi/2  ( radians )
 c
 #include "dimensions.h"
@@ -40,5 +39,4 @@
        REAL rlonu(iip1),xprimu(iip1),rlonv(iip1),xprimv(iip1),
      , rlonm025(iip1),xprimm025(iip1), rlonp025(iip1),xprimp025(iip1)
-       REAL deltay
 
 c   ....   var. locales   .....
@@ -47,7 +45,6 @@
 c
 
-       CALL fyhyp ( yzoom, grossy, dzoomy,tauy, deltay , 
+       CALL fyhyp ( yzoom, grossy, dzoomy,tauy  , 
      ,  rlatu, yprimu,rlatv,yprimv,rlatu2,yprimu2,rlatu1,yprimu1 )
-
 
        CALL fxhyp(xzoom,grossx,dzoomx,taux,rlonm025,xprimm025,rlonv,
@@ -55,22 +52,22 @@
 
 
-        DO i = 1, iim
+        DO i = 1, iip1
           IF(rlonp025(i).LT.rlonv(i))  THEN
-           PRINT *,' Attention !  rlonp025 < rlonv',i
+           WRITE(6,*) ' Attention !  rlonp025 < rlonv',i
             STOP
           ENDIF
 
           IF(rlonv(i).LT.rlonm025(i))  THEN 
-           PRINT *,' Attention !  rlonm025 > rlonv',i
+           WRITE(6,*) ' Attention !  rlonm025 > rlonv',i
             STOP
           ENDIF
 
           IF(rlonp025(i).GT.rlonu(i))  THEN
-           PRINT *,' Attention !  rlonp025 > rlonu',i
+           WRITE(6,*) ' Attention !  rlonp025 > rlonu',i
             STOP
           ENDIF
         ENDDO
 
-        PRINT *,'  *** TEST DE COHERENCE  OK    POUR   FX **** '
+        WRITE(6,*) '  *** TEST DE COHERENCE  OK    POUR   FX **** '
 
 c
@@ -78,30 +75,30 @@
 c
        IF(rlatu1(j).LE.rlatu2(j))   THEN
-         PRINT *,' Attention ! rlatu1 < rlatu2 ',rlatu1(j), rlatu2(j),j
+         WRITE(6,*)'Attention ! rlatu1 < rlatu2 ',rlatu1(j), rlatu2(j),j
          STOP 13
        ENDIF
 c
        IF(rlatu2(j).LE.rlatu(j+1))  THEN
-        PRINT *,' Attention ! rlatu2 < rlatup1 ',rlatu2(j),rlatu(j+1),j
+        WRITE(6,*)'Attention ! rlatu2 < rlatup1 ',rlatu2(j),rlatu(j+1),j
         STOP 14
        ENDIF
 c
        IF(rlatu(j).LE.rlatu1(j))    THEN
-        PRINT *,' Attention ! rlatu < rlatu1 ',rlatu(j),rlatu1(j),j
+        WRITE(6,*)' Attention ! rlatu < rlatu1 ',rlatu(j),rlatu1(j),j
         STOP 15
        ENDIF
 c
        IF(rlatv(j).LE.rlatu2(j))    THEN
-        PRINT *,' Attention ! rlatv < rlatu2 ',rlatv(j),rlatu2(j),j
+        WRITE(6,*)' Attention ! rlatv < rlatu2 ',rlatv(j),rlatu2(j),j
         STOP 16
        ENDIF
 c
        IF(rlatv(j).ge.rlatu1(j))    THEN
-        PRINT *,' Attention ! rlatv > rlatu1 ',rlatv(j),rlatu1(j),j
+        WRITE(6,*)' Attention ! rlatv > rlatu1 ',rlatv(j),rlatu1(j),j
         STOP 17
        ENDIF
 c
        IF(rlatv(j).ge.rlatu(j))     THEN
-        PRINT *,'Attention ! rlatv > rlatu ',rlatv(j),rlatu(j),j
+        WRITE(6,*) ' Attention ! rlatv > rlatu ',rlatv(j),rlatu(j),j
         STOP 18
        ENDIF
@@ -109,6 +106,7 @@
        ENDDO
 c
-       PRINT *,'  *** TEST DE COHERENCE  OK    POUR   FY **** '
-
+       WRITE(6,*) '  *** TEST DE COHERENCE  OK    POUR   FY **** '
+       WRITE(6,25)
+25     FORMAT(//)
 c
 
Index: LMDZ.3.3/trunk/libf/dyn3d/fyhyp.F
===================================================================
--- LMDZ.3.3/trunk/libf/dyn3d/fyhyp.F	(revision 199)
+++ LMDZ.3.3/trunk/libf/dyn3d/fyhyp.F	(revision 203)
@@ -1,5 +1,9 @@
-       SUBROUTINE fyhyp ( yzoomdeg, grossism, dzoom,tau,deltay ,  
+c
+c $Header
+c
+       SUBROUTINE fyhyp ( yzoomdeg, grossism, dzoom,tau  ,  
      ,  rrlatu,yyprimu,rrlatv,yyprimv,rlatu2,yprimu2,rlatu1,yprimu1 ) 
 
+cc    ...  Version du 01/04/2001 ....
 
        IMPLICIT NONE
@@ -13,14 +17,10 @@
 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 transition ,   normalement  = 1  .
-
-c  N.B :  on doit avoir :  grossism * dzoom  <   1 .
-c         **************
-c
-c    Pour Indoex , on a pris :
-c         *******
-c    grossism = 2.5 , dzoom = 7/24  en x et  y  , pour iim = 128 et jjm=64
-c    yzoomdeg = 0.  , tau = 1.  et delaty = 10.
+c     dzoom  etant  la distance totale de la zone du zoom ( en radians )
+c     tau  la raideur de la transition de l'interieur a l'exterieur du zoom   
+c
+c
+c N.B : Il vaut mieux avoir : grossism * dzoom  <  pi/2  (radians) ,en lati.
+c      ********************************************************************
 c
 c
@@ -29,10 +29,11 @@
 
        INTEGER      nmax , nmax2
-       PARAMETER (  nmax = 50000, nmax2 = 2*nmax )
+       PARAMETER (  nmax = 30000, nmax2 = 2*nmax )
 c
 c
 c     .......  arguments  d'entree    .......
 c
-       REAL yzoomdeg, grossism,dzoom,tau , deltay
+       REAL yzoomdeg, grossism,dzoom,tau 
+c         ( rentres  par  run.def )
 
 c     .......  arguments  de sortie   .......
@@ -42,17 +43,18 @@
 
 c
-c    ..... Champs  locaux    .....
+c     .....     champs  locaux    .....
 c
      
-       REAl ylat(jjp1), yprim(jjp1)
-       REAL yuv
-       REAL ytild(0:nmax2)
-       REAL fhyp(0:nmax),ffdx(0:nmax),beta,Ytprim(0:nmax2)
-       SAVE Ytprim, ytild,Yf
-       REAL Yf(0:nmax2),yypr(0:nmax2)
-       REAL yvrai(jjp1), yprimm(jjp1),ylatt(jjp1)
-       REAL pi,depi,pis2,epsilon,yzoom
-       REAL yo1,yi,ylon2,fxm,ymoy,yint,Yprimin
-       REAL ypn,deply,y00
+       REAL*8 ylat(jjp1), yprim(jjp1)
+       REAL*8 yuv
+       REAL*8 yt(0:nmax2)
+       REAL*8 fhyp(0:nmax2),beta,Ytprim(0:nmax2),fxm(0:nmax2)
+       SAVE Ytprim, yt,Yf
+       REAL*8 Yf(0:nmax2),yypr(0:nmax2)
+       REAL*8 yvrai(jjp1), yprimm(jjp1),ylatt(jjp1)
+       REAL*8 pi,depi,pis2,epsilon,y0,pisjm
+       REAL*8 yo1,yi,ylon2,ymoy,Yprimin,champmin,champmax
+       REAL*8 yfi,Yf1,ffdy
+       REAL*8 ypn,deply,y00
        SAVE y00, deply
 
@@ -60,71 +62,117 @@
        INTEGER jpn,jjpn
        SAVE jpn
-
+       REAL*8 a0,a1,a2,a3,yi2,heavyy0,heavyy0m
+       REAL*8 fa(0:nmax2),fb(0:nmax2)
+       REAL y0min,y0max
+
+       REAL*8     heavyside
+       EXTERNAL   heavyside
 
        pi       = 2. * ASIN(1.)
        depi     = 2. * pi
        pis2     = pi/2.
-       epsilon  = 1.e-6
-       yzoom    = yzoomdeg * pi/180. 
-
-
+       pisjm    = pi/ FLOAT(jjm)
+       epsilon  = 1.e-3
+       y0       =  yzoomdeg * pi/180. 
+
+       IF( dzoom.LT.1.)  THEN
+         dzoom = dzoom * pi
+       ELSEIF( dzoom.LT. 12. ) THEN
+         WRITE(6,*) ' Le param. dzoomy pour fyhyp est trop petit ! L aug
+     ,menter et relancer ! '
+         STOP 1
+       ELSE
+         dzoom = dzoom * pi/180.
+       ENDIF
+
+       WRITE(6,*) '  yzoom ,dzoomy (radians),tau',y0,dzoom,tau
 
        DO i = 0, nmax2 
-        ytild(i) = FLOAT(i) /nmax2
-       IF( ytild(i).EQ.0.5 )  ytild(i) = ytild(i) + 1.e-6
-       ENDDO
-
-       DO i = 1, nmax
-        fhyp(i) = TANH ( ( ytild(i) - 0.5*(1.- dzoom) )          /
-     ,                 ( tau * ytild(i) * ( 0.5 -ytild(i))) )
-       ENDDO
-
-       fhyp(   0  ) = - 1.
-       fhyp( nmax ) =   1.
+        yt(i) = - pis2  + FLOAT(i)* pi /nmax2
+       ENDDO
+
+       heavyy0m = heavyside( -y0 )
+       heavyy0  = heavyside(  y0 )
+       y0min    = 2.*y0*heavyy0m - pis2
+       y0max    = 2.*y0*heavyy0  + pis2
+
+       DO i = 0, nmax2 
+        IF( yt(i).LT.y0 )  THEN
+         fa (i) = tau*  (yt(i)-y0+dzoom/2. )
+         fb(i) =   (yt(i)-2.*y0*heavyy0m +pis2) * ( y0 - yt(i) )
+        ELSEIF ( yt(i).GT.y0 )  THEN
+         fa(i) =   tau *(y0-yt(i)+dzoom/2. )
+         fb(i) = (2.*y0*heavyy0 -yt(i)+pis2) * ( yt(i) - y0 ) 
+       ENDIF
+        
+       IF( 200.* fb(i) .LT. - fa(i) )   THEN
+         fhyp ( i) = - 1.
+       ELSEIF( 200. * fb(i) .LT. fa(i) ) THEN
+         fhyp ( i) =   1.
+       ELSE  
+         fhyp(i) =  TANH ( fa(i)/fb(i) )
+       ENDIF
+
+       IF( yt(i).EQ.y0 )  fhyp(i) = 1.
+       IF(yt(i).EQ. y0min. OR.yt(i).EQ. y0max ) fhyp(i) = -1.
+
+       ENDDO
 
 cc  ....  Calcul  de  beta  ....
 c
-       ffdx( 0 ) = 0.
-
-       DO i = 1, nmax
-        ymoy    = 0.5 * ( ytild(i-1) + ytild( i ) )
-        fxm     = TANH ( ( ymoy - 0.5 * ( 1. - dzoom ) )    /
-     ,                 ( tau * ymoy * ( 0.5 -ymoy)) )
-        ffdx(i) = ffdx(i-1) + fxm * ( ytild(i) - ytild(i-1) )
-       ENDDO
-
-        beta  = ( grossism * ffdx(nmax) - 0.5 ) / ( ffdx(nmax) - 0.5 )
+       ffdy   = 0.
+
+       DO i = 1, nmax2
+        ymoy    = 0.5 * ( yt(i-1) + yt( i ) )
+        IF( ymoy.LT.y0 )  THEN
+         fa(i)= tau * ( ymoy-y0+dzoom/2.) 
+         fb(i) = (ymoy-2.*y0*heavyy0m +pis2) * ( y0 - ymoy )
+        ELSEIF ( ymoy.GT.y0 )  THEN
+         fa(i)= tau * ( y0-ymoy+dzoom/2. ) 
+         fb(i) = (2.*y0*heavyy0 -ymoy+pis2) * ( ymoy - y0 )
+        ENDIF
+
+        IF( 200.* fb(i) .LT. - fa(i) )    THEN
+         fxm ( i) = - 1.
+        ELSEIF( 200. * fb(i) .LT. fa(i) ) THEN
+         fxm ( i) =   1.
+        ELSE
+         fxm(i) =  TANH ( fa(i)/fb(i) )
+        ENDIF
+         IF( ymoy.EQ.y0 )  fxm(i) = 1.
+         IF (ymoy.EQ. y0min. OR.yt(i).EQ. y0max ) fxm(i) = -1.
+         ffdy = ffdy + fxm(i) * ( yt(i) - yt(i-1) )
+
+        ENDDO
+
+        beta  = ( grossism * ffdy - pi ) / ( ffdy - pi )
+
+       IF( 2.*beta - grossism.LE. 0.)  THEN
+
+        WRITE(6,*) ' **  Attention ! La valeur beta calculee dans la rou
+     ,tine fyhyp est mauvaise ! '
+        WRITE(6,*)'Modifier les valeurs de  grossismy ,tauy ou dzoomy',
+     , ' et relancer ! ***  '
+        CALL ABORT
+
+       ENDIF
 c
 c   .....  calcul  de  Ytprim   .....
 c
        
-       DO i = 0, nmax
+       DO i = 0, nmax2
         Ytprim(i) = beta  + ( grossism - beta ) * fhyp(i)
        ENDDO
-c   
-       DO i = 0, nmax
-        Ytprim( nmax2 - i ) = Ytprim( i )
-       ENDDO
-c
 
 c   .....  Calcul  de  Yf     ........
 
-        Yf(0) = 0.
-       DO i = 1, nmax
-        ymoy    = 0.5 * ( ytild(i-1) + ytild( i ) )
-        fxm     = TANH ( ( ymoy - 0.5 * ( 1. - dzoom ) )    /
-     ,                 ( tau * ymoy * ( 0.5 -ymoy)) )
-        yypr(i)    = beta + ( grossism - beta ) * fxm
-       ENDDO
-
-       DO i = 1,nmax
-         yypr(nmax2-i+1) = yypr(i)
-       ENDDO
-
-        DO i=1,nmax2
-         Yf(i)   = Yf(i-1) + yypr(i) * ( ytild(i) - ytild(i-1) )
-        ENDDO
-c
-c
+       Yf(0) = - pis2
+       DO i = 1, nmax2
+        yypr(i)    = beta + ( grossism - beta ) * fxm(i)
+       ENDDO
+
+       DO i=1,nmax2
+        Yf(i)   = Yf(i-1) + yypr(i) * ( yt(i) - yt(i-1) )
+       ENDDO
 
 c    ****************************************************************
@@ -149,28 +197,21 @@
          jlat = jjm 
        ENDIF
-        
-c
+c
+       yo1   = 0.
        DO 1500 j =  1,jlat
-
-        ylon2 =  ( FLOAT(j)  + yuv  -1.) / FLOAT(jjm) 
-
         yo1   = 0.
-        yi    = ylon2
-
-c
-       DO 500 iter = 1,300
-
+        ylon2 =  - pis2 + pisjm * ( FLOAT(j)  + yuv  -1.)  
+        yfi    = ylon2
+c
        DO 250 it =  nmax2,0,-1
-        IF( yi.GE.ytild(it))  GO TO 350
+        IF( yfi.GE.Yf(it))  GO TO 350
 250    CONTINUE
-
        it = 0
-       yi = ytild(it)
-
 350    CONTINUE
 
+       yi = yt(it)
        IF(it.EQ.nmax2)  THEN
         it       = nmax2 -1
-        Yf(it+1) = 1.
+        Yf(it+1) = pis2
        ENDIF
 c  .................................................................
@@ -179,41 +220,43 @@
 c  .................................................................
 
-       yint   = ( Yf(it+1)-Yf(it) ) / ( ytild(it+1)-ytild(it) )      * 
-     +                    ( yi-ytild(it) )  +  Yf(it)
-      Yprimin = ( Ytprim(it+1)-Ytprim(it) )/ ( ytild(it+1)-ytild(it) ) *
-     +                    ( yi-ytild(it) )  +  Ytprim(it)
-       yi = yi - (yint-ylon2)/Yprimin
-
-      IF( ABS(yi-yo1).LE.epsilon) GO TO 550
-      yo1 = yi
-c
+       CALL coefpoly ( Yf(it),Yf(it+1),Ytprim(it), Ytprim(it+1),   
+     ,                  yt(it),yt(it+1) ,   a0,a1,a2,a3   )      
+
+       Yf1     = Yf(it)
+       Yprimin = a1 + 2.* a2 * yi + 3.*a3 * yi *yi
+
+       DO 500 iter = 1,300
+         yi = yi - ( Yf1 - yfi )/ Yprimin
+
+        IF( ABS(yi-yo1).LE.epsilon)  GO TO 550
+         yo1      = yi
+         yi2      = yi * yi
+         Yf1      = a0 +  a1 * yi +     a2 * yi2  +     a3 * yi2 * yi
+         Yprimin  =       a1      + 2.* a2 *  yi  + 3.* a3 * yi2
 500   CONTINUE
-      PRINT *,' ***   PAS DE SOLUTION  ****  ',j,ylon2,iter
-        STOP 4
+        WRITE(6,*) ' Pas de solution ***** ',j,ylon2,iter
+         STOP 2
 550   CONTINUE
-
-       yprim(j)    = pi /( FLOAT(jjm) *  Yprimin)
-       yvrai(j)    = pi *  (yi - 0.5) + yzoom
+c
+       Yprimin   = a1  + 2.* a2 *  yi   + 3.* a3 * yi* yi
+       yprim(j)  = pi / ( jjm * Yprimin )
+       yvrai(j)  = yi 
 
 1500    CONTINUE
-
-cc          print *,' LAT avant reorgan '
-cc         print 68,(yyvrai(j),j=1,jlat)
 
        DO j = 1, jlat -1
         IF( yvrai(j+1). LT. yvrai(j) )  THEN
-         PRINT *,' PBS.  avec  rlat(',j+1,' plus petit que rlat(',j,
-     ,   ')'
-         STOP
-        ENDIF
-       ENDDO
-
-        PRINT 18
-        PRINT *,'Reorganisation des latitudes pour avoir entre - pi/2 ',
-     ,  ' et  pi/2 '
-c
-           
+         WRITE(6,*) ' PBS. avec  rlat(',j+1,') plus petit que rlat(',j,
+     ,  ')'
+         STOP 3
+        ENDIF
+       ENDDO
+
+       WRITE(6,18)
+       WRITE(6,*) 'Reorganisation des latitudes pour avoir entre - pi/2'
+     , ,' et  pi/2 '
+c
         IF( ik.EQ.1 )   THEN
-           ypn = pis2 - deltay * pi/180.
+           ypn = pis2 
           DO j = jlat,1,-1
            IF( yvrai(j).LE. ypn ) GO TO 1502
@@ -239,11 +282,7 @@
          ENDDO
 
-
-
 c      ***********   Fin de la reorganisation     *************
 c
  1600   CONTINUE
-
-
 
        DO j = 1, jlat
@@ -256,33 +295,35 @@
         ENDDO
 
-
         IF( ik.EQ.1 )  THEN
-        PRINT 18
-        PRINT *, ' YLAT  en U   apres ( en  deg. ) '
-        PRINT 68,(yvrai(j),j=1,jlat)
-        PRINT *,' YPRIM '
-        PRINT 68,( yprim(j),j=1,jlat)
+         WRITE(6,18) 
+         WRITE(6,*)  ' YLAT  en U   apres ( en  deg. ) '
+         WRITE(6,68) (yvrai(j),j=1,jlat)
+cc         WRITE(6,*) ' YPRIM '
+cc         WRITE(6,445) ( yprim(j),j=1,jlat)
+
           DO j = 1, jlat
             rrlatu(j) =  ylat( j )
            yyprimu(j) = yprim( j )
           ENDDO
-c
+
         ELSE IF ( ik.EQ. 2 )  THEN
-        PRINT 18
-        PRINT *, ' YLAT   en V  apres ( en  deg. ) '
-        PRINT 68,(yvrai(j),j=1,jlat)
-        PRINT *,' YPRIM '
-        PRINT 68,( yprim(j),j=1,jlat)
+         WRITE(6,18) 
+         WRITE(6,*) ' YLAT   en V  apres ( en  deg. ) '
+         WRITE(6,68) (yvrai(j),j=1,jlat)
+cc         WRITE(6,*)' YPRIM '
+cc         WRITE(6,445) ( yprim(j),j=1,jlat)
+
           DO j = 1, jlat
             rrlatv(j) =  ylat( j )
            yyprimv(j) = yprim( j )
           ENDDO
-c
+
         ELSE IF ( ik.EQ. 3 )  THEN
-        PRINT 18
-        PRINT *, ' YLAT  en U + 0.75  apres ( en  deg. ) '
-        PRINT 68,(yvrai(j),j=1,jlat)
-        PRINT *,' YPRIM '
-        PRINT 68,( yprim(j),j=1,jlat)
+         WRITE(6,18) 
+         WRITE(6,*)  ' YLAT  en U + 0.75  apres ( en  deg. ) '
+         WRITE(6,68) (yvrai(j),j=1,jlat)
+cc         WRITE(6,*) ' YPRIM '
+cc         WRITE(6,445) ( yprim(j),j=1,jlat)
+
           DO j = 1, jlat
             rlatu2(j) =  ylat( j )
@@ -291,13 +332,15 @@
 
         ELSE IF ( ik.EQ. 4 )  THEN
-        PRINT 18
-        PRINT *, ' YLAT en U + 0.25  apres ( en  deg. ) '
-        PRINT 68,(yvrai(j),j=1,jlat)
-        PRINT *,' YPRIM '
-        PRINT 68,( yprim(j),j=1,jlat)
+         WRITE(6,18) 
+         WRITE(6,*)  ' YLAT en U + 0.25  apres ( en  deg. ) '
+         WRITE(6,68)(yvrai(j),j=1,jlat)
+cc         WRITE(6,*) ' YPRIM '
+cc         WRITE(6,68) ( yprim(j),j=1,jlat)
+
           DO j = 1, jlat
             rlatu1(j) =  ylat( j )
            yprimu1(j) = yprim( j )
           ENDDO
+
         ENDIF
 
@@ -306,4 +349,28 @@
 c  .....     fin de la boucle  do 5000 .....
 
+        DO j = 1, jjm
+         ylat(j) = rrlatu(j) - rrlatu(j+1)
+        ENDDO
+        champmin =  1.e12
+        champmax = -1.e12
+        DO j = 1, jjm
+         champmin = MIN( champmin, ylat(j) )
+         champmax = MAX( champmax, ylat(j) )
+        ENDDO
+         champmin = champmin * 180./pi
+         champmax = champmax * 180./pi
+
+        WRITE(6,18)
+        WRITE(6,*) '  Latitudes  '
+        WRITE(6,18)
+        WRITE(6,3)  champmin, champmax
+        WRITE(6,*) ' Si cette derniere est trop lache , modifiez les par
+     ,ametres  grossism , tau , dzoom pour Y et repasser ! '
+        WRITE(6,18)
+c
+3      Format(1x, ' Au centre du zoom , la longueur de la maille est',
+     ,  ' d environ ',f8.2 ,' degres  ',
+     , ' alors que la maille en dehors de la zone du zoom est d environ
+     , ', f8.2,' degres ' )
 18      FORMAT(/)
 68      FORMAT(1x,7f9.2)
Index: LMDZ.3.3/trunk/libf/dyn3d/heavyside.F
===================================================================
--- LMDZ.3.3/trunk/libf/dyn3d/heavyside.F	(revision 203)
+++ LMDZ.3.3/trunk/libf/dyn3d/heavyside.F	(revision 203)
@@ -0,0 +1,21 @@
+c
+c $Header
+c
+       FUNCTION heavyside(a)
+
+c      ...   P. Le Van  ....
+c
+       IMPLICIT NONE
+
+       REAL*8 heavyside , a
+
+       IF ( a.LE.0. )  THEN
+         heavyside = 0.
+       ELSE
+         heavyside = 1.
+       ENDIF
+
+       RETURN
+       END
+
+
Index: LMDZ.3.3/trunk/libf/dyn3d/inigeom.F
===================================================================
--- LMDZ.3.3/trunk/libf/dyn3d/inigeom.F	(revision 199)
+++ LMDZ.3.3/trunk/libf/dyn3d/inigeom.F	(revision 203)
@@ -1,22 +1,18 @@
+c
+c $Header
+c
       SUBROUTINE inigeom
 c
 c     Auteur :  P. Le Van
-c    .....................
-c
-c   ............      Version  du 20/12/98     ........................
+c
+c   ............      Version  du 01/04/2001     ........................
 c
 c  Calcul des elongations cuij1,.cuij4 , cvij1,..cvij4  aux memes en-
 c     endroits que les aires aireij1,..aireij4 .
+
 c  Choix entre f(y) a derivee sinusoid. ou a derivee tangente hyperbol.
 c
 c
       IMPLICIT NONE
-c
-      REAL        deltay, tauy, taux
-      PARAMETER ( deltay =  0. , tauy = 1. , taux = 1. )
-c
-c     deltay  est ( en degres ) le deplacement eventuel en Y du zoom
-cc    taux  et  tauy  sont  les raideurs   du  zoom
-c
 c
 #include "dimensions.h"
@@ -50,10 +46,6 @@
       SAVE rlonm025,xprimm025,rlonp025,xprimp025
 
-
-
-c----------------------------------------------------------------------
       REAL      SSUM
       EXTERNAL  SSUM
-c
 c
 c
@@ -62,5 +54,4 @@
 c   -    calcul des coeff. ( cu, cv , 1./cu**2,  1./cv**2  )         -
 c   -                                                                -
-c   ------------------------------------------------------------------
 c   ------------------------------------------------------------------
 c
@@ -168,5 +159,5 @@
 c
 c
-      PRINT 3
+      WRITE(6,3) 
  3    FORMAT( // 10x,' ....  INIGEOM  date du 01/06/98   ..... ',
      * //5x,'   Calcul des elongations cu et cv  comme sommes des 4 ' /
@@ -191,10 +182,10 @@
       ENDIF
 
-      PRINT *,' gamdi_gd ',gamdi_gdiv,gamdi_grot,gamdi_h,coefdis,
+      WRITE(6,*) ' gamdi_gd ',gamdi_gdiv,gamdi_grot,gamdi_h,coefdis,
      *  nitergdiv,nitergrot,niterh
 c
       pi    = 2.* ASIN(1.)
 c
-      PRINT 990
+      WRITE(6,990) 
 
 c     ----------------------------------------------------------------
@@ -205,5 +196,5 @@
        IF( ysinus )  THEN
 c
-        PRINT *,' ***  Inigeom ,  Y = Sinus ( Latitude ) *** '
+        WRITE(6,*) ' ***  Inigeom ,  Y = Sinus ( Latitude ) *** '
 c
 c   .... utilisation de f(x,y )  avec  y  =  sinus de la latitude  .....
@@ -215,5 +206,5 @@
        ELSE
 c
-        PRINT *,' *** Inigeom ,  Y = Latitude  , der. sinusoid . ***'
+        WRITE(6,*) '*** Inigeom ,  Y = Latitude  , der. sinusoid . ***'
 
 c  .... utilisation  de f(x,y) a tangente sinusoidale , y etant la latit. ...
@@ -267,11 +258,11 @@
       ELSE
 c
-c   ....  utilisation  de fxyhyper , f(x,y) a derivee tangente hyperbol.
+c   ....  Utilisation  de fxyhyper , f(x,y) a derivee tangente hyperbol.
 c   .....................................................................
 
-       PRINT *,'*** Inigeom , Y = Latitude  , der.tg. hyperbolique ***'
-
-       CALL fxyhyper( clat, grossismy, dzoomy, tauy, deltay  ,
-     ,               clon, grossismx, dzoomx, taux          ,
+      WRITE(6,*)'*** Inigeom , Y = Latitude  , der.tg. hyperbolique ***'
+ 
+       CALL fxyhyper( clat, grossismy, dzoomy, tauy    , 
+     ,                clon, grossismx, dzoomx, taux    ,
      , rlatu,yprimu,rlatv, yprimv,rlatu1, yprimu1,rlatu2,yprimu2  ,
      , rlonu,xprimu,rlonv,xprimv,rlonm025,xprimm025,rlonp025,xprimp025 )
@@ -387,9 +378,8 @@
 c
       IF ( j. eq. jjp1 )  THEN
-
        yprp               = yprimu2(j-1)
        rlatp              = rlatu2 (j-1)
-cc       yprp             = fyprim( FLOAT(j) - 0.25 )
-cc       rlatp            = fy    ( FLOAT(j) - 0.25 )
+ccc       yprp             = fyprim( FLOAT(j) - 0.25 )
+ccc       rlatp            = fy    ( FLOAT(j) - 0.25 )
 c
       coslatp             = COS( rlatp )
@@ -425,8 +415,8 @@
         rlatm    = rlatu1 (  j  )
         yprm     = yprimu1(  j  )
-c         rlatp    = fy    ( FLOAT(j) - 0.25 )
-c         yprp     = fyprim( FLOAT(j) - 0.25 )
-c         rlatm    = fy    ( FLOAT(j) + 0.25 )
-c         yprm     = fyprim( FLOAT(j) + 0.25 )
+cc         rlatp    = fy    ( FLOAT(j) - 0.25 )
+cc         yprp     = fyprim( FLOAT(j) - 0.25 )
+cc         rlatm    = fy    ( FLOAT(j) + 0.25 )
+cc         yprm     = fyprim( FLOAT(j) + 0.25 )
 
          coslatm  = COS( rlatm )
@@ -490,5 +480,4 @@
   36  CONTINUE
 c
-c   ....  Modif  P. Le Van  ( 4/07/96 )  .....
 c
       aire    (iip1,j) = aire    (1,j)
@@ -620,5 +609,5 @@
          aiuscv2gam(iip1,j)  = aiuscv2gam(1,j)
       ENDDO
-c
+
 c
 c   calcul des aires aux  poles :
@@ -666,30 +655,43 @@
 c-----------------------------------------------------------------------
 c
-       PRINT *,' INIGEOM  RLONV '
+       WRITE(6,*) '   ***  Coordonnees de la grille  *** '
+       WRITE(6,995)
+c
+       WRITE(6,*) '   LONGITUDES  aux pts.   V  ( degres )  '
+       WRITE(6,995)
         DO i=1,iip1
          rlonvv(i) = rlonv(i)*180./pi
         ENDDO
-       PRINT 400,rlonvv
-c
-       PRINT *,' RLATV '
+       WRITE(6,400) rlonvv
+c
+       WRITE(6,995)
+       WRITE(6,*) '   LATITUDES   aux pts.   V  ( degres )  '
+       WRITE(6,995)
         DO i=1,jjm
          rlatuu(i)=rlatv(i)*180./pi
         ENDDO
-       PRINT 400,(rlatuu(i),i=1,jjm)
+       WRITE(6,400) (rlatuu(i),i=1,jjm)
 c
         DO i=1,iip1
           rlonvv(i)=rlonu(i)*180./pi
         ENDDO
-       PRINT *,' RLONU '
-       PRINT 400,rlonvv
-c
-       PRINT *,' RLATU '
+       WRITE(6,995)
+       WRITE(6,*) '   LONGITUDES  aux pts.   U  ( degres )  '
+       WRITE(6,995)
+       WRITE(6,400) rlonvv
+       WRITE(6,995)
+
+       WRITE(6,*) '   LATITUDES   aux pts.   U  ( degres )  '
+       WRITE(6,995)
         DO i=1,jjp1
          rlatuu(i)=rlatu(i)*180./pi
         ENDDO
-       PRINT 400,(rlatuu(i),i=1,jjp1)
-c
+       WRITE(6,400) (rlatuu(i),i=1,jjp1)
+       WRITE(6,995)
+c
+444    format(f10.3,f6.0)
 400    FORMAT(1x,8f8.2)
 990    FORMAT(//)
+995    FORMAT(/)
 c
       RETURN
Index: LMDZ.3.3/trunk/libf/dyn3d/serre.h
===================================================================
--- LMDZ.3.3/trunk/libf/dyn3d/serre.h	(revision 199)
+++ LMDZ.3.3/trunk/libf/dyn3d/serre.h	(revision 203)
@@ -1,6 +1,9 @@
+c
+c $Header
+c
 c..include serre.h
 c
        REAL clon,clat,transx,transy,alphax,alphay,pxo,pyo,
-     ,  grossismx, grossismy, dzoomx, dzoomy
+     ,  grossismx, grossismy, dzoomx, dzoomy,taux,tauy
        COMMON/serre/clon,clat,transx,transy,alphax,alphay,pxo,pyo , 
-     ,  grossismx, grossismy, dzoomx, dzoomy
+     ,  grossismx, grossismy, dzoomx, dzoomy,taux,tauy
