Index: LMDZ5/branches/testing/libf/dyn3dmem/bands.F90
===================================================================
--- LMDZ5/branches/testing/libf/dyn3dmem/bands.F90	(revision 2720)
+++ LMDZ5/branches/testing/libf/dyn3dmem/bands.F90	(revision 2787)
@@ -219,5 +219,5 @@
         minvalue=value(i)
         min_proc=index(i)
-        if (jj_nb_caldyn(max_proc)>3) then
+        if (jj_nb_caldyn(max_proc)>2) then
           if (timer_iteration(jj_nb_caldyn(min_proc)+1,timer_caldyn,min_proc)<=1 ) then
              jj_nb_caldyn(min_proc)=jj_nb_caldyn(min_proc)+1
@@ -287,5 +287,5 @@
         min_proc=index(i)
 
-        if (jj_nb_vanleer(max_proc)>3) then
+        if (jj_nb_vanleer(max_proc)>2) then
           if (timer_average(jj_nb_vanleer(min_proc)+1,timer_vanleer,min_proc)==0. .or. &
              timer_average(jj_nb_vanleer(max_proc)-1,timer_vanleer,max_proc)==0.) then
Index: LMDZ5/branches/testing/libf/dyn3dmem/guide_loc_mod.F90
===================================================================
--- LMDZ5/branches/testing/libf/dyn3dmem/guide_loc_mod.F90	(revision 2720)
+++ LMDZ5/branches/testing/libf/dyn3dmem/guide_loc_mod.F90	(revision 2787)
@@ -2130,4 +2130,7 @@
     USE comconst_mod, ONLY: pi
     USE comvert_mod, ONLY: presnivs
+    use netcdf95, only: nf95_def_var, nf95_put_var
+    use netcdf, only: nf90_float
+
     IMPLICIT NONE
 
@@ -2149,9 +2152,9 @@
     INTEGER       :: nid, id_lonu, id_lonv, id_latu, id_latv, id_tim, id_lev
     INTEGER       :: vid_lonu,vid_lonv,vid_latu,vid_latv,vid_cu,vid_cv,vid_lev
-    INTEGER       :: vid_au,vid_av
+    INTEGER       :: vid_au,vid_av, varid_alpha_t, varid_alpha_q
     INTEGER, DIMENSION (3) :: dim3
     INTEGER, DIMENSION (4) :: dim4,count,start
     INTEGER                :: ierr, varid,l
-    REAL zu(ip1jmp1),zv(ip1jm)
+    REAL zu(ip1jmp1),zv(ip1jm), zt(iip1, jjp1), zq(iip1, jjp1)
     REAL, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: field_glo
     
@@ -2171,4 +2174,6 @@
     print*,'guide_out apres gather '
     CALL Gather_field_u(alpha_u,zu,1)
+    CALL Gather_field_u(alpha_t,zt,1)
+    CALL Gather_field_u(alpha_q,zq,1)
     CALL Gather_field_v(alpha_v,zv,1)
 
@@ -2207,5 +2212,9 @@
         ierr=NF_DEF_VAR(nid,"au",NF_FLOAT,2,(/id_lonu,id_latu/),vid_au)
         ierr=NF_DEF_VAR(nid,"av",NF_FLOAT,2,(/id_lonv,id_latv/),vid_av)
-
+        call nf95_def_var(nid, "alpha_T", nf90_float, (/id_lonv, id_latu/), &
+             varid_alpha_t)
+        call nf95_def_var(nid, "alpha_q", nf90_float, (/id_lonv, id_latu/), &
+             varid_alpha_q)
+        
         ierr=NF_ENDDEF(nid)
 
@@ -2232,4 +2241,6 @@
         ierr = NF_PUT_VAR_REAL(nid,vid_av,alpha_v)
 #endif
+        call nf95_put_var(nid, varid_alpha_t, zt)
+        call nf95_put_var(nid, varid_alpha_q, zq)
 ! --------------------------------------------------------------------
 ! Cr�ation des variables sauvegard�es
Index: LMDZ5/branches/testing/libf/dyn3dmem/parallel_lmdz.F90
===================================================================
--- LMDZ5/branches/testing/libf/dyn3dmem/parallel_lmdz.F90	(revision 2720)
+++ LMDZ5/branches/testing/libf/dyn3dmem/parallel_lmdz.F90	(revision 2787)
@@ -154,5 +154,5 @@
         if ( i < MOD((jjm+1),mpi_size) ) jj_nb_para(i)=jj_nb_para(i)+1
         
-        if (jj_nb_para(i) <= 2 ) then
+        if (jj_nb_para(i) <= 1 ) then
           
          write(lunout,*)"Arret : le nombre de bande de lattitude par process est trop faible (<2)."
Index: LMDZ5/branches/testing/libf/dyn3dmem/vlsplt_loc.F
===================================================================
--- LMDZ5/branches/testing/libf/dyn3dmem/vlsplt_loc.F	(revision 2720)
+++ LMDZ5/branches/testing/libf/dyn3dmem/vlsplt_loc.F	(revision 2787)
@@ -885,4 +885,9 @@
 c
       INTEGER i,ij,l,j,ii
+
+      REAL,DIMENSION(ijb_u:ije_u,llm+1) :: wresi,morig,qorig,dzqorig
+      INTEGER,DIMENSION(ijb_u:ije_u,llm+1) :: lorig
+      INTEGER,SAVE :: countcfl
+!$OMP THREADPRIVATE(countcfl)
 c
       REAL newmasse
@@ -911,4 +916,5 @@
       ! vlz_loc si on veut qu'elles soient vues par tous les threads.  
       INTEGER ifils,iq2 ! CRisi
+
 
       IF (first) THEN
@@ -968,6 +974,33 @@
       ENDIF
 #endif
+
+!--------------------------------------------------------
+! On repere les points qui violent le CFL (|w| > masse)
+!--------------------------------------------------------
+
+      countcfl=0
+!     print*,'vlz nouveau'
+c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+      DO l = 2,llm
+         DO ij = ijb,ije
+          IF(  (w(ij,l,iq)>0.AND.w(ij,l,iq)>masse(ij,l,iq))
+     s    .OR. (w(ij,l,iq)<=0.AND.ABS(w(ij,l,iq))>masse(ij,l-1,iq)) )
+     s    countcfl=countcfl+1
+         ENDDO
+      ENDDO
+c$OMP END DO NOWAIT    
+
+c ---------------------------------------------------------------
+c  Identification des mailles ou on viole le CFL : w > masse
+c ---------------------------------------------------------------
+
+      IF (countcfl==0) THEN
+
 c ---------------------------------------------------------------
 c   .... calcul des termes d'advection verticale  .......
+c     Dans le cas où le  |w| < masse partout.
+c     Version d'origine
+c     Pourrait etre enleve si on voit que le code plus general
+c     est aussi rapide
 c ---------------------------------------------------------------
 
@@ -991,4 +1024,87 @@
 c$OMP END DO NOWAIT    
        !write(*,*) 'vlz 1001'    
+
+      ELSE ! countcfl>=1
+
+      PRINT*,'vlz passage dans le non local'
+c ---------------------------------------------------------------
+c  Debut du traitement du cas ou on viole le CFL : w > masse
+c ---------------------------------------------------------------
+
+c Initialisation
+
+c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+       DO l = 2,llm
+         DO ij = ijb,ije
+            wresi(ij,l)=w(ij,l,iq)
+            wq(ij,l,iq)=0.
+            IF(w(ij,l,iq).gt.0.) THEN
+               lorig(ij,l)=l
+               morig(ij,l)=masse(ij,l,iq)
+               qorig(ij,l)=q(ij,l,iq)
+               dzqorig(ij,l)=dzq(ij,l)
+            ELSE
+               lorig(ij,l)=l-1
+               morig(ij,l)=masse(ij,l-1,iq)
+               qorig(ij,l)=q(ij,l-1,iq)
+               dzqorig(ij,l)=dzq(ij,l-1)
+            ENDIF
+         ENDDO
+       ENDDO
+c$OMP END DO NO WAIT
+
+c Reindicage vertical en accumulant les flux sur
+c  les mailles qui viollent le CFL
+c  on itère jusqu'à ce que tous les poins satisfassent
+c  le critère
+      DO WHILE (countcfl>=1) 
+      print*,'On viole le CFL Vertical sur ',countcfl,' pts'
+      countcfl=0
+
+c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+      DO l = 2,llm
+         DO ij = ijb,ije
+          IF (ABS(wresi(ij,l))>morig(ij,l)) THEN
+             countcfl=countcfl+1
+! rm : les 8 lignes ci dessous pourraient sans doute s'ecrire
+! avec la fonction sign
+             IF(w(ij,l,iq)>0.) THEN
+                wresi(ij,l)=wresi(ij,l)-morig(ij,l)
+                wq(ij,l,iq)=wq(ij,l,iq)+morig(ij,l)*qorig(ij,l)
+                lorig(ij,l)=lorig(ij,l)+1
+             ELSE
+                wresi(ij,l)=wresi(ij,l)+morig(ij,l)
+                wq(ij,l,iq)=wq(ij,l,iq)-morig(ij,l)*qorig(ij,l)
+                lorig(ij,l)=lorig(ij,l)-1
+             ENDIF
+             morig(ij,l)=masse(ij,lorig(ij,l),iq)
+             qorig(ij,l)=q(ij,lorig(ij,l),iq)
+             dzqorig(ij,l)=dzq(ij,lorig(ij,l))
+          ENDIF
+         ENDDO
+      ENDDO
+c$OMP END DO NO WAIT
+
+      ENDDO ! WHILE (countcfl>=1)
+
+c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+       DO l = 2,llm
+         do  ij = ijb,ije
+          sigw=wresi(ij,l)/morig(ij,l)
+          IF(w(ij,l,iq).gt.0.) THEN
+             wq(ij,l,iq)=wq(ij,l,iq)+wresi(ij,l)*(qorig(ij,l)
+     :           +0.5*(1.-sigw)*dzqorig(ij,l))
+          ELSE
+             wq(ij,l,iq)=wq(ij,l,iq)+wresi(ij,l)*(qorig(ij,l)
+     :           -0.5*(1.+sigw)*dzqorig(ij,l))
+          ENDIF
+         ENDDO
+       ENDDO
+c$OMP END DO NOWAIT    
+
+
+       ENDIF ! councfl=0
+
+
 
 c$OMP MASTER
