Index: LMDZ6/trunk/libf/dyn3dmem/abort_gcm.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/abort_gcm.F90	(revision 5267)
+++ 	(revision )
@@ -1,53 +1,0 @@
-!
-! $Id: abort_gcm.F 1747 2013-04-23 14:06:30Z lguez $
-!
-!
-!
-SUBROUTINE abort_gcm(modname, message, ierr)
-
-  USE IOIPSL
-
-  USE parallel_lmdz
-  INCLUDE "iniprint.h"
-
-  !
-  ! Stops the simulation cleanly, closing files and printing various
-  ! comments
-  !
-  !  Input: modname = name of calling program
-  !     message = stuff to print
-  !     ierr    = severity of situation ( = 0 normal )
-
-  character(len=*), intent(in):: modname
-  integer :: ierr, ierror_mpi
-  character(len=*), intent(in):: message
-
-  write(lunout,*) 'in abort_gcm'
-!$OMP MASTER
-  call histclo
-  call restclo
-  if (MPI_rank .eq. 0) then
-     call getin_dump
-  endif
-!$OMP END MASTER
-  ! call histclo(2)
-  ! call histclo(3)
-  ! call histclo(4)
-  ! call histclo(5)
-  write(lunout,*) 'Stopping in ', modname
-  write(lunout,*) 'Reason = ',message
-  if (ierr .eq. 0) then
-    write(lunout,*) 'Everything is cool'
-  else
-    write(lunout,*) 'Houston, we have a problem, ierr = ', ierr
-
-    if (using_mpi) THEN
-!$OMP CRITICAL (MPI_ABORT_GCM)
-      call MPI_ABORT(COMM_LMDZ, 1, ierror_mpi)
-!$OMP END CRITICAL (MPI_ABORT_GCM)
-    else
-     stop 1
-    endif
-
-  endif
-END SUBROUTINE abort_gcm
Index: LMDZ6/trunk/libf/dyn3dmem/abort_gcm.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/abort_gcm.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/abort_gcm.f90	(revision 5268)
@@ -0,0 +1,53 @@
+!
+! $Id: abort_gcm.F 1747 2013-04-23 14:06:30Z lguez $
+!
+!
+!
+SUBROUTINE abort_gcm(modname, message, ierr)
+
+  USE IOIPSL
+
+  USE parallel_lmdz
+  INCLUDE "iniprint.h"
+
+  !
+  ! Stops the simulation cleanly, closing files and printing various
+  ! comments
+  !
+  !  Input: modname = name of calling program
+  !     message = stuff to print
+  !     ierr    = severity of situation ( = 0 normal )
+
+  character(len=*), intent(in):: modname
+  integer :: ierr, ierror_mpi
+  character(len=*), intent(in):: message
+
+  write(lunout,*) 'in abort_gcm'
+!$OMP MASTER
+  call histclo
+  call restclo
+  if (MPI_rank .eq. 0) then
+     call getin_dump
+  endif
+!$OMP END MASTER
+  ! call histclo(2)
+  ! call histclo(3)
+  ! call histclo(4)
+  ! call histclo(5)
+  write(lunout,*) 'Stopping in ', modname
+  write(lunout,*) 'Reason = ',message
+  if (ierr .eq. 0) then
+    write(lunout,*) 'Everything is cool'
+  else
+    write(lunout,*) 'Houston, we have a problem, ierr = ', ierr
+
+    if (using_mpi) THEN
+!$OMP CRITICAL (MPI_ABORT_GCM)
+      call MPI_ABORT(COMM_LMDZ, 1, ierror_mpi)
+!$OMP END CRITICAL (MPI_ABORT_GCM)
+    else
+     stop 1
+    endif
+
+  endif
+END SUBROUTINE abort_gcm
Index: LMDZ6/trunk/libf/dyn3dmem/advect_new_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/advect_new_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,294 +1,0 @@
-!
-! $Header$
-!
-SUBROUTINE advect_new_loc(ucov,vcov,teta,w,massebx,masseby, &
-        du,dv,dteta)
-  USE parallel_lmdz
-  USE write_field_loc
-  USE advect_new_mod
-  USE comconst_mod, ONLY: daysec
-  USE logic_mod, ONLY: conser
-  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
-  IMPLICIT NONE
-  !=======================================================================
-  !
-  !   Auteurs:  P. Le Van , Fr. Hourdin  .
-  !   -------
-  !
-  !   Objet:
-  !   ------
-  !
-  !   *************************************************************
-  !   .... calcul des termes d'advection vertic.pour u,v,teta,q ...
-  !   *************************************************************
-  !    ces termes sont ajoutes a du,dv,dteta et dq .
-  !  Modif F.Forget 03/94 : on retire q de advect
-  !
-  !=======================================================================
-  !-----------------------------------------------------------------------
-  !   Declarations:
-  !   -------------
-
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-
-  !   Arguments:
-  !   ----------
-
-  REAL :: vcov(ijb_v:ije_v,llm),ucov(ijb_u:ije_u,llm)
-  REAL :: teta(ijb_u:ije_u,llm)
-  REAL :: massebx(ijb_u:ije_u,llm),masseby(ijb_v:ije_v,llm)
-  REAL :: w(ijb_u:ije_u,llm)
-  REAL :: dv(ijb_v:ije_v,llm),du(ijb_u:ije_u,llm)
-  REAL :: dteta(ijb_u:ije_u,llm)
-  !   Local:
-  !   ------
-
-  REAL :: wsur2(ijb_u:ije_u)
-  REAL :: unsaire2(ijb_u:ije_u), ge(ijb_u:ije_u)
-  REAL :: deuxjour, ww, gt, uu, vv
-
-  INTEGER :: ij,l,ijb,ije
-  EXTERNAL  SSUM
-  REAL :: SSUM
-
-
-
-  !-----------------------------------------------------------------------
-  !   2. Calculs preliminaires:
-  !   -------------------------
-
-  IF (conser.AND.1==0)  THEN
-     deuxjour = 2. * daysec
-
-     DO  ij   = 1, ip1jmp1
-     unsaire2(ij) = unsaire(ij) * unsaire(ij)
-     END DO
-  END IF
-
-
-  !------------------  -yy ----------------------------------------------
-  !   .  Calcul de     u
-
-!$OMP MASTER
-  ijb=ij_begin
-  ije=ij_end
-  if (pole_nord) ijb=ijb+iip1
-  if (pole_sud)  ije=ije-iip1
-
-  DO ij=ijb,ije
-    du2(ij,1)=0.
-    du1(ij,llm)=0.
-  ENDDO
-
-  ijb=ij_begin
-  ije=ij_end
-  if (pole_sud)  ije=ij_end-iip1
-
-  DO ij=ijb,ije
-    dv2(ij,1)=0.
-    dv1(ij,llm)=0.
-  ENDDO
-
-  ijb=ij_begin
-  ije=ij_end
-
-  DO ij=ijb,ije
-    dteta2(ij,1)=0.
-    dteta1(ij,llm)=0.
-  ENDDO
-!$OMP END MASTER
-!$OMP BARRIER
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO  l=1,llm
-
-     ijb=ij_begin
-     ije=ij_end
-     if (pole_nord) ijb=ijb+iip1
-     if (pole_sud)  ije=ije-iip1
-
-      ! DO    ij     = iip2, ip1jmp1
-      !    uav(ij,l) = 0.25 * ( ucov(ij,l) + ucov(ij-iip1,l) )
-      ! ENDDO
-
-      ! DO    ij     = iip2, ip1jm
-      !    uav(ij,l) = uav(ij,l) + uav(ij+iip1,l)
-      ! ENDDO
-
-     DO    ij     = ijb, ije
-
-       uav(ij,l)=0.25*(ucov(ij,l)+ucov(ij-iip1,l)) &
-             +0.25*(ucov(ij+iip1,l)+ucov(ij,l))
-     ENDDO
-
-     if (pole_nord) then
-       DO      ij         = 1, iip1
-          uav(ij      ,l) = 0.
-       ENDDO
-     endif
-
-     if (pole_sud) then
-       DO      ij         = 1, iip1
-          uav(ip1jm+ij,l) = 0.
-       ENDDO
-     endif
-
-  ENDDO
-!$OMP END DO
-   ! call write_field3d_p('uav',reshape(uav,(/iip1,jjp1,llm/)))
-
-  !------------------  -xx ----------------------------------------------
-  !   .  Calcul de     v
-
-  ijb=ij_begin
-  ije=ij_end
-  if (pole_sud)  ije=ij_end-iip1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO  l=1,llm
-
-     DO    ij   = ijb+1, ije
-       vav(ij,l) = 0.25 * ( vcov(ij,l) + vcov(ij-1,l) )
-     ENDDO
-
-     DO    ij   = ijb,ije,iip1
-      vav(ij,l) = vav(ij+iim,l)
-     ENDDO
-
-
-     DO    ij   = ijb, ije-1
-      vav(ij,l) = vav(ij,l) + vav(ij+1,l)
-     ENDDO
-
-     DO    ij       = ijb, ije, iip1
-      vav(ij+iim,l) = vav(ij,l)
-     ENDDO
-
-  ENDDO
-!$OMP END DO
-    ! call write_field3d_p('vav',reshape(vav,(/iip1,jjm,llm/)))
-
-  !-----------------------------------------------------------------------
-!$OMP BARRIER
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l = 1, llmm1
-
-
-    ! ......   calcul de  - w/2.    au niveau  l+1   .......
-  ijb=ij_begin
-  ije=ij_end+iip1
-  if (pole_sud)  ije=ij_end
-
-  DO   ij   = ijb, ije
-  wsur2( ij ) = - 0.5 * w( ij,l+1 )
-  END DO
-
-
-  ! .....................     calcul pour  du     ..................
-
-  ijb=ij_begin
-  ije=ij_end
-  if (pole_nord) ijb=ijb+iip1
-  if (pole_sud)  ije=ije-iip1
-
-  DO ij = ijb ,ije-1
-  ww        = wsur2 (  ij  )     + wsur2( ij+1 )
-  uu        = 0.5 * ( ucov(ij,l) + ucov(ij,l+1) )
-  du1(ij,l)  =  ww * ( uu - uav(ij, l ) )/massebx(ij, l )
-  du2(ij,l+1)=  ww * ( uu - uav(ij,l+1) )/massebx(ij,l+1)
-  END DO
-
-  ! .................    calcul pour   dv      .....................
-  ijb=ij_begin
-  ije=ij_end
-  if (pole_sud)  ije=ij_end-iip1
-
-  DO ij = ijb, ije
-  ww        = wsur2( ij+iip1 )   + wsur2( ij )
-  vv        = 0.5 * ( vcov(ij,l) + vcov(ij,l+1) )
-  dv1(ij,l)  =  ww * (vv - vav(ij, l ) )/masseby(ij, l )
-  dv2(ij,l+1)=  ww * (vv - vav(ij,l+1) )/masseby(ij,l+1)
-  END DO
-
-  !
-
-  ! ............................................................
-  ! ...............    calcul pour   dh      ...................
-  ! ............................................................
-
-  !                   ---z
-  !   calcul de  - d( teta  * w )      qu'on ajoute a   dh
-  !               ...............
-    ijb=ij_begin
-    ije=ij_end
-
-    DO ij = ijb, ije
-     ww            = wsur2(ij) * (teta(ij,l) + teta(ij,l+1) )
-     dteta1(ij, l ) =   ww
-     dteta2(ij,l+1) =   ww
-    END DO
-
-  ! ym ---> conser a voir plus tard
-
-   ! IF( conser)  THEN
-  !
-  !    DO 17 ij = 1,ip1jmp1
-  !    ge(ij)   = wsur2(ij) * wsur2(ij) * unsaire2(ij)
-  !  17    CONTINUE
-  !    gt       = SSUM( ip1jmp1,ge,1 )
-  !    gtot(l)  = deuxjour * SQRT( gt/ip1jmp1 )
-  !  END IF
-
-  END DO
-!$OMP END DO
-
-  ijb=ij_begin
-  ije=ij_end
-  if (pole_nord) ijb=ijb+iip1
-  if (pole_sud)  ije=ije-iip1
-IF (CPPKEY_DEBUGIO) THEN
-   CALL WriteField_u('du_bis',du)
-END IF
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-    DO ij=ijb,ije-1
-      du(ij,l)=du(ij,l)+du2(ij,l)-du1(ij,l)
-    ENDDO
-
-    DO   ij   = ijb+iip1-1, ije, iip1
-     du( ij, l  ) = du( ij -iim, l  )
-    ENDDO
-  ENDDO
-!$OMP END DO NOWAIT
-IF (CPPKEY_DEBUGIO) THEN
-  CALL WriteField_u('du1',du1)
-  CALL WriteField_u('du2',du2)
-  CALL WriteField_u('du_bis',du)
-END IF
-  ijb=ij_begin
-  ije=ij_end
-  if (pole_sud)  ije=ij_end-iip1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-    DO ij=ijb,ije
-      dv(ij,l)=dv(ij,l)+dv2(ij,l)-dv1(ij,l)
-    ENDDO
-  ENDDO
-!$OMP END DO NOWAIT
-  ijb=ij_begin
-  ije=ij_end
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-    DO ij=ijb,ije
-      dteta(ij,l)=dteta(ij,l)+dteta2(ij,l)-dteta1(ij,l)
-    ENDDO
-  ENDDO
-!$OMP END DO NOWAIT
-
-  RETURN
-END SUBROUTINE advect_new_loc
Index: LMDZ6/trunk/libf/dyn3dmem/advect_new_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/advect_new_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/advect_new_loc.f90	(revision 5268)
@@ -0,0 +1,294 @@
+!
+! $Header$
+!
+SUBROUTINE advect_new_loc(ucov,vcov,teta,w,massebx,masseby, &
+        du,dv,dteta)
+  USE parallel_lmdz
+  USE write_field_loc
+  USE advect_new_mod
+  USE comconst_mod, ONLY: daysec
+  USE logic_mod, ONLY: conser
+  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
+  IMPLICIT NONE
+  !=======================================================================
+  !
+  !   Auteurs:  P. Le Van , Fr. Hourdin  .
+  !   -------
+  !
+  !   Objet:
+  !   ------
+  !
+  !   *************************************************************
+  !   .... calcul des termes d'advection vertic.pour u,v,teta,q ...
+  !   *************************************************************
+  !    ces termes sont ajoutes a du,dv,dteta et dq .
+  !  Modif F.Forget 03/94 : on retire q de advect
+  !
+  !=======================================================================
+  !-----------------------------------------------------------------------
+  !   Declarations:
+  !   -------------
+
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+
+  !   Arguments:
+  !   ----------
+
+  REAL :: vcov(ijb_v:ije_v,llm),ucov(ijb_u:ije_u,llm)
+  REAL :: teta(ijb_u:ije_u,llm)
+  REAL :: massebx(ijb_u:ije_u,llm),masseby(ijb_v:ije_v,llm)
+  REAL :: w(ijb_u:ije_u,llm)
+  REAL :: dv(ijb_v:ije_v,llm),du(ijb_u:ije_u,llm)
+  REAL :: dteta(ijb_u:ije_u,llm)
+  !   Local:
+  !   ------
+
+  REAL :: wsur2(ijb_u:ije_u)
+  REAL :: unsaire2(ijb_u:ije_u), ge(ijb_u:ije_u)
+  REAL :: deuxjour, ww, gt, uu, vv
+
+  INTEGER :: ij,l,ijb,ije
+  EXTERNAL  SSUM
+  REAL :: SSUM
+
+
+
+  !-----------------------------------------------------------------------
+  !   2. Calculs preliminaires:
+  !   -------------------------
+
+  IF (conser.AND.1==0)  THEN
+     deuxjour = 2. * daysec
+
+     DO  ij   = 1, ip1jmp1
+     unsaire2(ij) = unsaire(ij) * unsaire(ij)
+     END DO
+  END IF
+
+
+  !------------------  -yy ----------------------------------------------
+  !   .  Calcul de     u
+
+!$OMP MASTER
+  ijb=ij_begin
+  ije=ij_end
+  if (pole_nord) ijb=ijb+iip1
+  if (pole_sud)  ije=ije-iip1
+
+  DO ij=ijb,ije
+    du2(ij,1)=0.
+    du1(ij,llm)=0.
+  ENDDO
+
+  ijb=ij_begin
+  ije=ij_end
+  if (pole_sud)  ije=ij_end-iip1
+
+  DO ij=ijb,ije
+    dv2(ij,1)=0.
+    dv1(ij,llm)=0.
+  ENDDO
+
+  ijb=ij_begin
+  ije=ij_end
+
+  DO ij=ijb,ije
+    dteta2(ij,1)=0.
+    dteta1(ij,llm)=0.
+  ENDDO
+!$OMP END MASTER
+!$OMP BARRIER
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO  l=1,llm
+
+     ijb=ij_begin
+     ije=ij_end
+     if (pole_nord) ijb=ijb+iip1
+     if (pole_sud)  ije=ije-iip1
+
+      ! DO    ij     = iip2, ip1jmp1
+      !    uav(ij,l) = 0.25 * ( ucov(ij,l) + ucov(ij-iip1,l) )
+      ! ENDDO
+
+      ! DO    ij     = iip2, ip1jm
+      !    uav(ij,l) = uav(ij,l) + uav(ij+iip1,l)
+      ! ENDDO
+
+     DO    ij     = ijb, ije
+
+       uav(ij,l)=0.25*(ucov(ij,l)+ucov(ij-iip1,l)) &
+             +0.25*(ucov(ij+iip1,l)+ucov(ij,l))
+     ENDDO
+
+     if (pole_nord) then
+       DO      ij         = 1, iip1
+          uav(ij      ,l) = 0.
+       ENDDO
+     endif
+
+     if (pole_sud) then
+       DO      ij         = 1, iip1
+          uav(ip1jm+ij,l) = 0.
+       ENDDO
+     endif
+
+  ENDDO
+!$OMP END DO
+   ! call write_field3d_p('uav',reshape(uav,(/iip1,jjp1,llm/)))
+
+  !------------------  -xx ----------------------------------------------
+  !   .  Calcul de     v
+
+  ijb=ij_begin
+  ije=ij_end
+  if (pole_sud)  ije=ij_end-iip1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO  l=1,llm
+
+     DO    ij   = ijb+1, ije
+       vav(ij,l) = 0.25 * ( vcov(ij,l) + vcov(ij-1,l) )
+     ENDDO
+
+     DO    ij   = ijb,ije,iip1
+      vav(ij,l) = vav(ij+iim,l)
+     ENDDO
+
+
+     DO    ij   = ijb, ije-1
+      vav(ij,l) = vav(ij,l) + vav(ij+1,l)
+     ENDDO
+
+     DO    ij       = ijb, ije, iip1
+      vav(ij+iim,l) = vav(ij,l)
+     ENDDO
+
+  ENDDO
+!$OMP END DO
+    ! call write_field3d_p('vav',reshape(vav,(/iip1,jjm,llm/)))
+
+  !-----------------------------------------------------------------------
+!$OMP BARRIER
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l = 1, llmm1
+
+
+    ! ......   calcul de  - w/2.    au niveau  l+1   .......
+  ijb=ij_begin
+  ije=ij_end+iip1
+  if (pole_sud)  ije=ij_end
+
+  DO   ij   = ijb, ije
+  wsur2( ij ) = - 0.5 * w( ij,l+1 )
+  END DO
+
+
+  ! .....................     calcul pour  du     ..................
+
+  ijb=ij_begin
+  ije=ij_end
+  if (pole_nord) ijb=ijb+iip1
+  if (pole_sud)  ije=ije-iip1
+
+  DO ij = ijb ,ije-1
+  ww        = wsur2 (  ij  )     + wsur2( ij+1 )
+  uu        = 0.5 * ( ucov(ij,l) + ucov(ij,l+1) )
+  du1(ij,l)  =  ww * ( uu - uav(ij, l ) )/massebx(ij, l )
+  du2(ij,l+1)=  ww * ( uu - uav(ij,l+1) )/massebx(ij,l+1)
+  END DO
+
+  ! .................    calcul pour   dv      .....................
+  ijb=ij_begin
+  ije=ij_end
+  if (pole_sud)  ije=ij_end-iip1
+
+  DO ij = ijb, ije
+  ww        = wsur2( ij+iip1 )   + wsur2( ij )
+  vv        = 0.5 * ( vcov(ij,l) + vcov(ij,l+1) )
+  dv1(ij,l)  =  ww * (vv - vav(ij, l ) )/masseby(ij, l )
+  dv2(ij,l+1)=  ww * (vv - vav(ij,l+1) )/masseby(ij,l+1)
+  END DO
+
+  !
+
+  ! ............................................................
+  ! ...............    calcul pour   dh      ...................
+  ! ............................................................
+
+  !                   ---z
+  !   calcul de  - d( teta  * w )      qu'on ajoute a   dh
+  !               ...............
+    ijb=ij_begin
+    ije=ij_end
+
+    DO ij = ijb, ije
+     ww            = wsur2(ij) * (teta(ij,l) + teta(ij,l+1) )
+     dteta1(ij, l ) =   ww
+     dteta2(ij,l+1) =   ww
+    END DO
+
+  ! ym ---> conser a voir plus tard
+
+   ! IF( conser)  THEN
+  !
+  !    DO 17 ij = 1,ip1jmp1
+  !    ge(ij)   = wsur2(ij) * wsur2(ij) * unsaire2(ij)
+  !  17    CONTINUE
+  !    gt       = SSUM( ip1jmp1,ge,1 )
+  !    gtot(l)  = deuxjour * SQRT( gt/ip1jmp1 )
+  !  END IF
+
+  END DO
+!$OMP END DO
+
+  ijb=ij_begin
+  ije=ij_end
+  if (pole_nord) ijb=ijb+iip1
+  if (pole_sud)  ije=ije-iip1
+IF (CPPKEY_DEBUGIO) THEN
+   CALL WriteField_u('du_bis',du)
+END IF
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+    DO ij=ijb,ije-1
+      du(ij,l)=du(ij,l)+du2(ij,l)-du1(ij,l)
+    ENDDO
+
+    DO   ij   = ijb+iip1-1, ije, iip1
+     du( ij, l  ) = du( ij -iim, l  )
+    ENDDO
+  ENDDO
+!$OMP END DO NOWAIT
+IF (CPPKEY_DEBUGIO) THEN
+  CALL WriteField_u('du1',du1)
+  CALL WriteField_u('du2',du2)
+  CALL WriteField_u('du_bis',du)
+END IF
+  ijb=ij_begin
+  ije=ij_end
+  if (pole_sud)  ije=ij_end-iip1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+    DO ij=ijb,ije
+      dv(ij,l)=dv(ij,l)+dv2(ij,l)-dv1(ij,l)
+    ENDDO
+  ENDDO
+!$OMP END DO NOWAIT
+  ijb=ij_begin
+  ije=ij_end
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+    DO ij=ijb,ije
+      dteta(ij,l)=dteta(ij,l)+dteta2(ij,l)-dteta1(ij,l)
+    ENDDO
+  ENDDO
+!$OMP END DO NOWAIT
+
+  RETURN
+END SUBROUTINE advect_new_loc
Index: LMDZ6/trunk/libf/dyn3dmem/advect_new_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/advect_new_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,55 +1,0 @@
-MODULE advect_new_mod
-
-  REAL,POINTER,SAVE :: dv1(:,:)
-  REAL,POINTER,SAVE :: du1(:,:)
-  REAL,POINTER,SAVE :: dteta1(:,:)
-  REAL,POINTER,SAVE :: dv2(:,:)
-  REAL,POINTER,SAVE :: du2(:,:)
-  REAL,POINTER,SAVE :: dteta2(:,:)
-  REAL,POINTER,SAVE :: uav(:,:)
-  REAL,POINTER,SAVE :: vav(:,:)
-
-  
-CONTAINS
-
-  SUBROUTINE advect_new_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE dimensions_mod
-  IMPLICIT NONE
-  TYPE(distrib),POINTER :: d
-
-
-    d=>distrib_caldyn
-    CALL allocate_v(dv1,llm,d)
-    CALL allocate_u(du1,llm,d)
-    CALL allocate_u(dteta1,llm,d)
-    CALL allocate_v(dv2,llm,d)
-    CALL allocate_u(du2,llm,d)
-    CALL allocate_u(dteta2,llm,d)
-    CALL allocate_u(uav,llm,d)
-    CALL allocate_v(vav,llm,d)
- 
-    
-  END SUBROUTINE advect_new_allocate
-  
-  SUBROUTINE advect_new_switch_caldyn(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-
-    CALL switch_v(dv1,distrib_caldyn,dist)
-    CALL switch_u(du1,distrib_caldyn,dist)
-    CALL switch_u(dteta1,distrib_caldyn,dist)
-    CALL switch_v(dv2,distrib_caldyn,dist)
-    CALL switch_u(du2,distrib_caldyn,dist)
-    CALL switch_u(dteta2,distrib_caldyn,dist)
-    CALL switch_u(uav,distrib_caldyn,dist)
-    CALL switch_v(vav,distrib_caldyn,dist)
-
-  END SUBROUTINE advect_new_switch_caldyn
-  
-END MODULE advect_new_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/advect_new_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/advect_new_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/advect_new_mod.f90	(revision 5268)
@@ -0,0 +1,55 @@
+MODULE advect_new_mod
+
+  REAL,POINTER,SAVE :: dv1(:,:)
+  REAL,POINTER,SAVE :: du1(:,:)
+  REAL,POINTER,SAVE :: dteta1(:,:)
+  REAL,POINTER,SAVE :: dv2(:,:)
+  REAL,POINTER,SAVE :: du2(:,:)
+  REAL,POINTER,SAVE :: dteta2(:,:)
+  REAL,POINTER,SAVE :: uav(:,:)
+  REAL,POINTER,SAVE :: vav(:,:)
+
+  
+CONTAINS
+
+  SUBROUTINE advect_new_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE dimensions_mod
+  IMPLICIT NONE
+  TYPE(distrib),POINTER :: d
+
+
+    d=>distrib_caldyn
+    CALL allocate_v(dv1,llm,d)
+    CALL allocate_u(du1,llm,d)
+    CALL allocate_u(dteta1,llm,d)
+    CALL allocate_v(dv2,llm,d)
+    CALL allocate_u(du2,llm,d)
+    CALL allocate_u(dteta2,llm,d)
+    CALL allocate_u(uav,llm,d)
+    CALL allocate_v(vav,llm,d)
+ 
+    
+  END SUBROUTINE advect_new_allocate
+  
+  SUBROUTINE advect_new_switch_caldyn(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+
+    CALL switch_v(dv1,distrib_caldyn,dist)
+    CALL switch_u(du1,distrib_caldyn,dist)
+    CALL switch_u(dteta1,distrib_caldyn,dist)
+    CALL switch_v(dv2,distrib_caldyn,dist)
+    CALL switch_u(du2,distrib_caldyn,dist)
+    CALL switch_u(dteta2,distrib_caldyn,dist)
+    CALL switch_u(uav,distrib_caldyn,dist)
+    CALL switch_v(vav,distrib_caldyn,dist)
+
+  END SUBROUTINE advect_new_switch_caldyn
+  
+END MODULE advect_new_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/advtrac_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/advtrac_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,290 +1,0 @@
-
-SUBROUTINE advtrac_loc(pbarug, pbarvg, wg, p, massem, q, teta, pk)
-   !     Auteur :  F. Hourdin
-   !
-   !     Modif. P. Le Van     (20/12/97)
-   !            F. Codron     (10/99)
-   !            D. Le Croller (07/2001)
-   !            M.A Filiberti (04/2002)
-   !
-   USE infotrac,     ONLY: nqtot, tracers
-   USE control_mod,  ONLY: iapp_tracvl, day_step, planet_type
-   USE comconst_mod, ONLY: dtvr
-   USE parallel_lmdz
-   USE Write_Field_loc
-   USE Write_Field
-   USE Bands
-   USE mod_hallo
-   USE Vampir
-   USE times
-   USE advtrac_mod, ONLY: finmasse
-   USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
-   USE strings_mod, ONLY: int2str
-   IMPLICIT NONE
-   !
-   include "dimensions.h"
-   include "paramet.h"
-   include "comdissip.h"
-   include "comgeom2.h"
-   include "description.h"
-!   include "iniprint.h"
-
-   !---------------------------------------------------------------------------
-   !     Arguments
-   !---------------------------------------------------------------------------
-   REAL, INTENT(IN) ::  pbarug(ijb_u:ije_u,llm)
-   REAL, INTENT(IN) ::  pbarvg(ijb_v:ije_v,llm)
-   REAL, INTENT(IN) ::      wg(ijb_u:ije_u,llm)
-   REAL, INTENT(IN) ::       p(ijb_u:ije_u,llmp1)
-   REAL, INTENT(IN) ::  massem(ijb_u:ije_u,llm)
-   REAL, INTENT(INOUT) ::    q(ijb_u:ije_u,llm,nqtot)
-   REAL, INTENT(IN) ::    teta(ijb_u:ije_u,llm)
-   REAL, INTENT(IN) ::      pk(ijb_u:ije_u,llm)
-   !---------------------------------------------------------------------------
-   !     Ajout PPM
-   !---------------------------------------------------------------------------
-   REAL :: massebx(ijb_u:ije_u,llm), masseby(ijb_v:ije_v,llm)
-   !---------------------------------------------------------------------------
-   !     Variables locales
-   !---------------------------------------------------------------------------
-   INTEGER :: ij, l, iq, iadv
-   REAL(KIND=KIND(1.d0)) :: t_initial, t_final, tps_cpu
-   REAL :: zdp(ijb_u:ije_u), zdpmin, zdpmax
-   INTEGER, SAVE :: iadvtr=0
-!$OMP THREADPRIVATE(iadvtr)
-   EXTERNAL  minmax
-
-   !---------------------------------------------------------------------------
-   !     Rajouts pour PPM
-   !---------------------------------------------------------------------------
-   INTEGER :: indice, n
-   REAL :: dtbon                       ! Pas de temps adaptatif pour que CFL<1
-   REAL :: CFLmaxz, aaa, bbb           ! CFL maximum
-   REAL, DIMENSION(iim,jjb_u:jje_u,llm) :: unatppm, vnatppm, fluxwppm
-   REAL ::    qppm(iim*jjnb_u,llm,nqtot)
-   REAL ::   psppm(iim,jjb_u:jje_u)    ! pression  au sol
-   REAL, DIMENSION(llmp1) :: apppm, bpppm
-   LOGICAL, SAVE :: dum=.TRUE., fill=.TRUE.
-   INTEGER :: ijb, ije, ijbu, ijbv, ijeu, ijev, j
-   TYPE(Request),SAVE :: testRequest
-!$OMP THREADPRIVATE(testRequest)
-
-! Test sur l'eventuelle creation de valeurs negatives de la masse
-   ijb = ij_begin; IF(pole_nord) ijb = ij_begin+iip1
-   ije = ij_end;   IF(pole_sud)  ije = ij_end-iip1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-   DO l=1,llm-1
-      DO ij = ijb+1,ije
-         zdp(ij) = pbarug(ij-1,l)    - pbarug(ij,l) &
-                 - pbarvg(ij-iip1,l) + pbarvg(ij,l) &
-                 +     wg(ij,l+1)    -     wg(ij,l)
-      END DO
-! ym  ---> pourquoi jjm-1 et non jjm ? a cause du pole ?
-!     CALL SCOPY( jjm -1 ,zdp(iip1+iip1),iip1,zdp(iip2),iip1 )
-      DO ij = ijb,ije-iip1+1,iip1
-         zdp(ij)=zdp(ij+iip1-1)
-      END DO
-      DO ij = ijb,ije
-         zdp(ij)= zdp(ij)*dtvr/ massem(ij,l) 
-      END DO 
-!     CALL minmax ( ip1jm-iip1, zdp(iip2), zdpmin,zdpmax )
-! ym ---> eventuellement a revoir
-      CALL minmax( ije-ijb+1, zdp(ijb), zdpmin,zdpmax )
-      IF(MAX(ABS(zdpmin),ABS(zdpmax)) >0.5) &
-         WRITE(*,*)'WARNING DP/P l=',l,'  MIN:',zdpmin,'   MAX:', zdpmax
-   END DO
-!$OMP END DO NOWAIT
-
-   !---------------------------------------------------------------------------
-   !   Advection proprement dite (Modification Le Croller (07/2001)
-   !---------------------------------------------------------------------------
-
-   !---------------------------------------------------------------------------
-   !   Calcul des moyennes basees sur la masse
-   !---------------------------------------------------------------------------
-!ym   CALL massbar_p(massem,massebx,masseby)
-!ym   ----> Normalement, inutile pour les schemas classiques
-!ym   ----> Reverifier lors de la parallelisation des autres schemas
-
-IF (CPPKEY_DEBUGIO) THEN
-   CALL WriteField_u('massem',massem)
-   CALL WriteField_u('wg',wg)
-   CALL WriteField_u('pbarug',pbarug)
-   CALL WriteField_v('pbarvg',pbarvg)
-   CALL WriteField_u('p_tmp',p)
-   CALL WriteField_u('pk_tmp',pk)
-   CALL WriteField_u('teta_tmp',teta)
-   DO iq=1,nqtot
-      CALL WriteField_u('q_adv'//trim(int2str(iq)),q(:,:,iq))
-   END DO
-END IF
-
-!          
-!  CALL Register_Hallo_v(pbarvg,llm,1,1,1,1,TestRequest)
-!  CALL SendRequest(TestRequest)
-!!$OMP BARRIER
-!  CALL WaitRequest(TestRequest)
-!$OMP BARRIER
-
-!  WRITE(*,*) 'advtrac 157: appel de vlspltgen_loc'
-   CALL vlspltgen_loc(q, 2., massem, wg, pbarug, pbarvg, dtvr, p, pk, teta )
-
-IF (CPPKEY_DEBUGIO) THEN
-   DO iq = 1, nqtot
-      CALL WriteField_u('q_adv'//trim(int2str(iq)),q(:,:,iq))
-   END DO
-END IF
-         
-   GOTO 1234     
-   !-------------------------------------------------------------------------
-   !       Appel des sous programmes d'advection
-   !-------------------------------------------------------------------------
-   DO iq = 1, nqtot
-!     CALL clock(t_initial)
-      IF(tracers(iq)%parent /= 'air') CYCLE
-      iadv = tracers(iq)%iadv
-      !-----------------------------------------------------------------------
-      SELECT CASE(iadv)
-      !-----------------------------------------------------------------------
-         CASE(0); CYCLE
-         !--------------------------------------------------------------------
-         CASE(10)  !--- Schema de Van Leer I MUSCL
-         !--------------------------------------------------------------------
-!           WRITE(*,*) 'advtrac 239: iq,q(1721,19,:)=',iq,q(1721,19,:)     
-!LF         CALL vlsplt_p(q(1,1,iq),2.,massem,wg,pbarug,pbarvg,dtvr)
-
-         !--------------------------------------------------------------------
-         CASE(14)  !--- Schema "pseuDO amont" + test sur humidite specifique
-                   !--- pour la vapeur d'eau. F. Codron
-         !--------------------------------------------------------------------
-!           WRITE(*,*) 'advtrac 248: iq,q(1721,19,:)=',iq,q(1721,19,:)
-            CALL abort_gcm("advtrac","appel a vlspltqs :schema non parallelise",1)
-!LF         CALL vlspltqs_p(q(1,1,1),2.,massem,wg,pbarug,pbarvg,dtvr,p,pk,teta )
-
-         !--------------------------------------------------------------------
-         CASE(12)  !--- Schema de Frederic Hourdin
-         !--------------------------------------------------------------------
-            CALL abort_gcm("advtrac","appel a vlspltqs :schema non parallelise",1)
-            CALL adaptdt(iadv,dtbon,n,pbarug,massem)   ! pas de temps adaptatif
-            IF(n > 1) WRITE(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',dtvr,'n=',n
-            DO indice=1,n
-              CALL advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,1)
-            END DO
-
-         !--------------------------------------------------------------------
-         CASE(13)  !--- Pas de temps adaptatif
-         !--------------------------------------------------------------------
-            CALL abort_gcm("advtrac","schema non parallelise",1)
-            CALL adaptdt(iadv,dtbon,n,pbarug,massem)
-            IF(n > 1) WRITE(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',dtvr,'n=',n
-            DO indice=1,n
-               CALL advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,2)
-            END DO
-
-         !--------------------------------------------------------------------
-         CASE(20)  !--- Schema de pente SLOPES
-         !--------------------------------------------------------------------
-            CALL abort_gcm("advtrac","schema SLOPES non parallelise",1)
-            CALL pentes_ini (q(1,1,iq),wg,massem,pbarug,pbarvg,0)
-
-         !--------------------------------------------------------------------
-         CASE(30)  !--- Schema de Prather
-         !--------------------------------------------------------------------
-            CALL abort_gcm("advtrac","schema prather non parallelise",1)
-            ! Pas de temps adaptatif
-            CALL adaptdt(iadv,dtbon,n,pbarug,massem)
-            IF(n > 1) WRITE(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',dtvr,'n=',n
-            CALL prather(q(1,1,iq),wg,massem,pbarug,pbarvg,n,dtbon)
-
-         !--------------------------------------------------------------------
-         CASE(11,16,17,18)   !--- Schemas PPM Lin et Rood
-         !--------------------------------------------------------------------
-            CALL abort_gcm("advtrac","schema PPM non parallelise",1)
-            ! Test sur le flux horizontal
-            CALL adaptdt(iadv,dtbon,n,pbarug,massem)   ! pas de temps adaptatif
-            IF(n > 1) WRITE(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',dtvr,'n=',n
-            ! Test sur le flux vertical
-            CFLmaxz=0.
-            DO l=2,llm
-               DO ij=iip2,ip1jm
-                  aaa=wg(ij,l)*dtvr/massem(ij,l)
-                  CFLmaxz=max(CFLmaxz,aaa)
-                  bbb=-wg(ij,l)*dtvr/massem(ij,l-1)
-                  CFLmaxz=max(CFLmaxz,bbb)
-               END DO
-            END DO
-            IF(CFLmaxz.GE.1) WRITE(*,*) 'WARNING vertical','CFLmaxz=', CFLmaxz
-            !----------------------------------------------------------------
-            !     Ss-prg interface LMDZ.4->PPM3d (ss-prg de Lin)
-            !----------------------------------------------------------------
-            CALL interpre(q(1,1,iq),qppm(1,1,iq),wg,fluxwppm,massem, &
-                 apppm,bpppm,massebx,masseby,pbarug,pbarvg, &
-                 unatppm,vnatppm,psppm)
-
-            !----------------------------------------------------------------
-            DO indice=1,n     !--- VL (version PPM) horiz. et PPM vert.
-            !----------------------------------------------------------------
-               SELECT CASE(iadv)
-                  !----------------------------------------------------------
-                  CASE(11)
-                  !----------------------------------------------------------
-                     CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm,fluxwppm,dtbon, &
-                                2,2,2,1,iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,fill,dum,220.)
-                  !----------------------------------------------------------
-                  CASE(16) !--- Monotonic PPM
-                  !----------------------------------------------------------
-                     CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm,fluxwppm,dtbon, &
-                                3,3,3,1,iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,fill,dum,220.)
-                  !----------------------------------------------------------
-                  CASE(17) !--- Semi monotonic PPM
-                  !----------------------------------------------------------
-                     CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm,fluxwppm,dtbon, &
-                                4,4,4,1,iim,jjp1,2,llm,apppm,bpppm,0.01,6400000, fill,dum,220.)
-                  !----------------------------------------------------------
-                  CASE(18) !--- Positive Definite PPM
-                  !----------------------------------------------------------
-                     CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm,fluxwppm,dtbon, &
-                                5,5,5,1,iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,fill,dum,220.)
-               END SELECT
-            !----------------------------------------------------------------
-            END DO
-            !----------------------------------------------------------------
-            !     Ss-prg interface PPM3d-LMDZ.4
-            !----------------------------------------------------------------
-            CALL interpost(q(1,1,iq),qppm(1,1,iq))
-      !----------------------------------------------------------------------
-      END SELECT
-      !----------------------------------------------------------------------
-
-      !----------------------------------------------------------------------
-      ! On impose une seule valeur du traceur au pole Sud j=jjm+1=jjp1 et Nord j=1
-      !----------------------------------------------------------------------
-      !  CALL traceurpole(q(1,1,iq),massem)
-
-      !--- Calcul du temps cpu pour un schema donne
-      !  CALL clock(t_final)
-      !ym  tps_cpu=t_final-t_initial
-      !ym  cpuadv(iq)=cpuadv(iq)+tps_cpu
-
-   END DO
-
-1234 CONTINUE
-!$OMP BARRIER
-   IF(planet_type=="earth") THEN
-      ijb=ij_begin
-      ije=ij_end
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)      
-      DO l = 1, llm
-         DO ij = ijb, ije
-            finmasse(ij,l) =  p(ij,l) - p(ij,l+1) 
-         END DO
-      END DO
-!$OMP END DO
-
-      CALL qminimum_loc( q, nqtot, finmasse )
-
-   END IF ! of if (planet_type=="earth")
-
-END SUBROUTINE advtrac_loc
-
Index: LMDZ6/trunk/libf/dyn3dmem/advtrac_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/advtrac_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/advtrac_loc.f90	(revision 5268)
@@ -0,0 +1,290 @@
+
+SUBROUTINE advtrac_loc(pbarug, pbarvg, wg, p, massem, q, teta, pk)
+   !     Auteur :  F. Hourdin
+   !
+   !     Modif. P. Le Van     (20/12/97)
+   !            F. Codron     (10/99)
+   !            D. Le Croller (07/2001)
+   !            M.A Filiberti (04/2002)
+   !
+   USE infotrac,     ONLY: nqtot, tracers
+   USE control_mod,  ONLY: iapp_tracvl, day_step, planet_type
+   USE comconst_mod, ONLY: dtvr
+   USE parallel_lmdz
+   USE Write_Field_loc
+   USE Write_Field
+   USE Bands
+   USE mod_hallo
+   USE Vampir
+   USE times
+   USE advtrac_mod, ONLY: finmasse
+   USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
+   USE strings_mod, ONLY: int2str
+   IMPLICIT NONE
+   !
+   include "dimensions.h"
+   include "paramet.h"
+   include "comdissip.h"
+   include "comgeom2.h"
+   include "description.h"
+!   include "iniprint.h"
+
+   !---------------------------------------------------------------------------
+   !     Arguments
+   !---------------------------------------------------------------------------
+   REAL, INTENT(IN) ::  pbarug(ijb_u:ije_u,llm)
+   REAL, INTENT(IN) ::  pbarvg(ijb_v:ije_v,llm)
+   REAL, INTENT(IN) ::      wg(ijb_u:ije_u,llm)
+   REAL, INTENT(IN) ::       p(ijb_u:ije_u,llmp1)
+   REAL, INTENT(IN) ::  massem(ijb_u:ije_u,llm)
+   REAL, INTENT(INOUT) ::    q(ijb_u:ije_u,llm,nqtot)
+   REAL, INTENT(IN) ::    teta(ijb_u:ije_u,llm)
+   REAL, INTENT(IN) ::      pk(ijb_u:ije_u,llm)
+   !---------------------------------------------------------------------------
+   !     Ajout PPM
+   !---------------------------------------------------------------------------
+   REAL :: massebx(ijb_u:ije_u,llm), masseby(ijb_v:ije_v,llm)
+   !---------------------------------------------------------------------------
+   !     Variables locales
+   !---------------------------------------------------------------------------
+   INTEGER :: ij, l, iq, iadv
+   REAL(KIND=KIND(1.d0)) :: t_initial, t_final, tps_cpu
+   REAL :: zdp(ijb_u:ije_u), zdpmin, zdpmax
+   INTEGER, SAVE :: iadvtr=0
+!$OMP THREADPRIVATE(iadvtr)
+   EXTERNAL  minmax
+
+   !---------------------------------------------------------------------------
+   !     Rajouts pour PPM
+   !---------------------------------------------------------------------------
+   INTEGER :: indice, n
+   REAL :: dtbon                       ! Pas de temps adaptatif pour que CFL<1
+   REAL :: CFLmaxz, aaa, bbb           ! CFL maximum
+   REAL, DIMENSION(iim,jjb_u:jje_u,llm) :: unatppm, vnatppm, fluxwppm
+   REAL ::    qppm(iim*jjnb_u,llm,nqtot)
+   REAL ::   psppm(iim,jjb_u:jje_u)    ! pression  au sol
+   REAL, DIMENSION(llmp1) :: apppm, bpppm
+   LOGICAL, SAVE :: dum=.TRUE., fill=.TRUE.
+   INTEGER :: ijb, ije, ijbu, ijbv, ijeu, ijev, j
+   TYPE(Request),SAVE :: testRequest
+!$OMP THREADPRIVATE(testRequest)
+
+! Test sur l'eventuelle creation de valeurs negatives de la masse
+   ijb = ij_begin; IF(pole_nord) ijb = ij_begin+iip1
+   ije = ij_end;   IF(pole_sud)  ije = ij_end-iip1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+   DO l=1,llm-1
+      DO ij = ijb+1,ije
+         zdp(ij) = pbarug(ij-1,l)    - pbarug(ij,l) &
+                 - pbarvg(ij-iip1,l) + pbarvg(ij,l) &
+                 +     wg(ij,l+1)    -     wg(ij,l)
+      END DO
+! ym  ---> pourquoi jjm-1 et non jjm ? a cause du pole ?
+!     CALL SCOPY( jjm -1 ,zdp(iip1+iip1),iip1,zdp(iip2),iip1 )
+      DO ij = ijb,ije-iip1+1,iip1
+         zdp(ij)=zdp(ij+iip1-1)
+      END DO
+      DO ij = ijb,ije
+         zdp(ij)= zdp(ij)*dtvr/ massem(ij,l) 
+      END DO 
+!     CALL minmax ( ip1jm-iip1, zdp(iip2), zdpmin,zdpmax )
+! ym ---> eventuellement a revoir
+      CALL minmax( ije-ijb+1, zdp(ijb), zdpmin,zdpmax )
+      IF(MAX(ABS(zdpmin),ABS(zdpmax)) >0.5) &
+         WRITE(*,*)'WARNING DP/P l=',l,'  MIN:',zdpmin,'   MAX:', zdpmax
+   END DO
+!$OMP END DO NOWAIT
+
+   !---------------------------------------------------------------------------
+   !   Advection proprement dite (Modification Le Croller (07/2001)
+   !---------------------------------------------------------------------------
+
+   !---------------------------------------------------------------------------
+   !   Calcul des moyennes basees sur la masse
+   !---------------------------------------------------------------------------
+!ym   CALL massbar_p(massem,massebx,masseby)
+!ym   ----> Normalement, inutile pour les schemas classiques
+!ym   ----> Reverifier lors de la parallelisation des autres schemas
+
+IF (CPPKEY_DEBUGIO) THEN
+   CALL WriteField_u('massem',massem)
+   CALL WriteField_u('wg',wg)
+   CALL WriteField_u('pbarug',pbarug)
+   CALL WriteField_v('pbarvg',pbarvg)
+   CALL WriteField_u('p_tmp',p)
+   CALL WriteField_u('pk_tmp',pk)
+   CALL WriteField_u('teta_tmp',teta)
+   DO iq=1,nqtot
+      CALL WriteField_u('q_adv'//trim(int2str(iq)),q(:,:,iq))
+   END DO
+END IF
+
+!          
+!  CALL Register_Hallo_v(pbarvg,llm,1,1,1,1,TestRequest)
+!  CALL SendRequest(TestRequest)
+!!$OMP BARRIER
+!  CALL WaitRequest(TestRequest)
+!$OMP BARRIER
+
+!  WRITE(*,*) 'advtrac 157: appel de vlspltgen_loc'
+   CALL vlspltgen_loc(q, 2., massem, wg, pbarug, pbarvg, dtvr, p, pk, teta )
+
+IF (CPPKEY_DEBUGIO) THEN
+   DO iq = 1, nqtot
+      CALL WriteField_u('q_adv'//trim(int2str(iq)),q(:,:,iq))
+   END DO
+END IF
+         
+   GOTO 1234     
+   !-------------------------------------------------------------------------
+   !       Appel des sous programmes d'advection
+   !-------------------------------------------------------------------------
+   DO iq = 1, nqtot
+!     CALL clock(t_initial)
+      IF(tracers(iq)%parent /= 'air') CYCLE
+      iadv = tracers(iq)%iadv
+      !-----------------------------------------------------------------------
+      SELECT CASE(iadv)
+      !-----------------------------------------------------------------------
+         CASE(0); CYCLE
+         !--------------------------------------------------------------------
+         CASE(10)  !--- Schema de Van Leer I MUSCL
+         !--------------------------------------------------------------------
+!           WRITE(*,*) 'advtrac 239: iq,q(1721,19,:)=',iq,q(1721,19,:)     
+!LF         CALL vlsplt_p(q(1,1,iq),2.,massem,wg,pbarug,pbarvg,dtvr)
+
+         !--------------------------------------------------------------------
+         CASE(14)  !--- Schema "pseuDO amont" + test sur humidite specifique
+                   !--- pour la vapeur d'eau. F. Codron
+         !--------------------------------------------------------------------
+!           WRITE(*,*) 'advtrac 248: iq,q(1721,19,:)=',iq,q(1721,19,:)
+            CALL abort_gcm("advtrac","appel a vlspltqs :schema non parallelise",1)
+!LF         CALL vlspltqs_p(q(1,1,1),2.,massem,wg,pbarug,pbarvg,dtvr,p,pk,teta )
+
+         !--------------------------------------------------------------------
+         CASE(12)  !--- Schema de Frederic Hourdin
+         !--------------------------------------------------------------------
+            CALL abort_gcm("advtrac","appel a vlspltqs :schema non parallelise",1)
+            CALL adaptdt(iadv,dtbon,n,pbarug,massem)   ! pas de temps adaptatif
+            IF(n > 1) WRITE(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',dtvr,'n=',n
+            DO indice=1,n
+              CALL advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,1)
+            END DO
+
+         !--------------------------------------------------------------------
+         CASE(13)  !--- Pas de temps adaptatif
+         !--------------------------------------------------------------------
+            CALL abort_gcm("advtrac","schema non parallelise",1)
+            CALL adaptdt(iadv,dtbon,n,pbarug,massem)
+            IF(n > 1) WRITE(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',dtvr,'n=',n
+            DO indice=1,n
+               CALL advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,2)
+            END DO
+
+         !--------------------------------------------------------------------
+         CASE(20)  !--- Schema de pente SLOPES
+         !--------------------------------------------------------------------
+            CALL abort_gcm("advtrac","schema SLOPES non parallelise",1)
+            CALL pentes_ini (q(1,1,iq),wg,massem,pbarug,pbarvg,0)
+
+         !--------------------------------------------------------------------
+         CASE(30)  !--- Schema de Prather
+         !--------------------------------------------------------------------
+            CALL abort_gcm("advtrac","schema prather non parallelise",1)
+            ! Pas de temps adaptatif
+            CALL adaptdt(iadv,dtbon,n,pbarug,massem)
+            IF(n > 1) WRITE(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',dtvr,'n=',n
+            CALL prather(q(1,1,iq),wg,massem,pbarug,pbarvg,n,dtbon)
+
+         !--------------------------------------------------------------------
+         CASE(11,16,17,18)   !--- Schemas PPM Lin et Rood
+         !--------------------------------------------------------------------
+            CALL abort_gcm("advtrac","schema PPM non parallelise",1)
+            ! Test sur le flux horizontal
+            CALL adaptdt(iadv,dtbon,n,pbarug,massem)   ! pas de temps adaptatif
+            IF(n > 1) WRITE(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=',dtvr,'n=',n
+            ! Test sur le flux vertical
+            CFLmaxz=0.
+            DO l=2,llm
+               DO ij=iip2,ip1jm
+                  aaa=wg(ij,l)*dtvr/massem(ij,l)
+                  CFLmaxz=max(CFLmaxz,aaa)
+                  bbb=-wg(ij,l)*dtvr/massem(ij,l-1)
+                  CFLmaxz=max(CFLmaxz,bbb)
+               END DO
+            END DO
+            IF(CFLmaxz.GE.1) WRITE(*,*) 'WARNING vertical','CFLmaxz=', CFLmaxz
+            !----------------------------------------------------------------
+            !     Ss-prg interface LMDZ.4->PPM3d (ss-prg de Lin)
+            !----------------------------------------------------------------
+            CALL interpre(q(1,1,iq),qppm(1,1,iq),wg,fluxwppm,massem, &
+                 apppm,bpppm,massebx,masseby,pbarug,pbarvg, &
+                 unatppm,vnatppm,psppm)
+
+            !----------------------------------------------------------------
+            DO indice=1,n     !--- VL (version PPM) horiz. et PPM vert.
+            !----------------------------------------------------------------
+               SELECT CASE(iadv)
+                  !----------------------------------------------------------
+                  CASE(11)
+                  !----------------------------------------------------------
+                     CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm,fluxwppm,dtbon, &
+                                2,2,2,1,iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,fill,dum,220.)
+                  !----------------------------------------------------------
+                  CASE(16) !--- Monotonic PPM
+                  !----------------------------------------------------------
+                     CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm,fluxwppm,dtbon, &
+                                3,3,3,1,iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,fill,dum,220.)
+                  !----------------------------------------------------------
+                  CASE(17) !--- Semi monotonic PPM
+                  !----------------------------------------------------------
+                     CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm,fluxwppm,dtbon, &
+                                4,4,4,1,iim,jjp1,2,llm,apppm,bpppm,0.01,6400000, fill,dum,220.)
+                  !----------------------------------------------------------
+                  CASE(18) !--- Positive Definite PPM
+                  !----------------------------------------------------------
+                     CALL ppm3d(1,qppm(1,1,iq),psppm,psppm,unatppm,vnatppm,fluxwppm,dtbon, &
+                                5,5,5,1,iim,jjp1,2,llm,apppm,bpppm,0.01,6400000,fill,dum,220.)
+               END SELECT
+            !----------------------------------------------------------------
+            END DO
+            !----------------------------------------------------------------
+            !     Ss-prg interface PPM3d-LMDZ.4
+            !----------------------------------------------------------------
+            CALL interpost(q(1,1,iq),qppm(1,1,iq))
+      !----------------------------------------------------------------------
+      END SELECT
+      !----------------------------------------------------------------------
+
+      !----------------------------------------------------------------------
+      ! On impose une seule valeur du traceur au pole Sud j=jjm+1=jjp1 et Nord j=1
+      !----------------------------------------------------------------------
+      !  CALL traceurpole(q(1,1,iq),massem)
+
+      !--- Calcul du temps cpu pour un schema donne
+      !  CALL clock(t_final)
+      !ym  tps_cpu=t_final-t_initial
+      !ym  cpuadv(iq)=cpuadv(iq)+tps_cpu
+
+   END DO
+
+1234 CONTINUE
+!$OMP BARRIER
+   IF(planet_type=="earth") THEN
+      ijb=ij_begin
+      ije=ij_end
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)      
+      DO l = 1, llm
+         DO ij = ijb, ije
+            finmasse(ij,l) =  p(ij,l) - p(ij,l+1) 
+         END DO
+      END DO
+!$OMP END DO
+
+      CALL qminimum_loc( q, nqtot, finmasse )
+
+   END IF ! of if (planet_type=="earth")
+
+END SUBROUTINE advtrac_loc
+
Index: LMDZ6/trunk/libf/dyn3dmem/advtrac_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/advtrac_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,36 +1,0 @@
-MODULE advtrac_mod
-
-  REAL,POINTER,SAVE :: finmasse(:,:)
-  
-CONTAINS
-
-  SUBROUTINE advtrac_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE vlspltgen_mod
-  IMPLICIT NONE
-  INCLUDE "dimensions.h"
-  INCLUDE "paramet.h"
-  TYPE(distrib),POINTER :: d
-    
-    d=>distrib_vanleer
-    CALL allocate_u(finmasse,llm,d)
-    CALL vlspltgen_allocate
-  END SUBROUTINE advtrac_allocate
-  
-  SUBROUTINE advtrac_switch_vanleer(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  USE vlspltgen_mod
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-  
-    CALL switch_u(finmasse,distrib_vanleer,dist)
-
-    CALL vlspltgen_switch_vanleer(dist)
-
-  END SUBROUTINE advtrac_switch_vanleer  
-  
-END MODULE advtrac_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/advtrac_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/advtrac_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/advtrac_mod.f90	(revision 5268)
@@ -0,0 +1,36 @@
+MODULE advtrac_mod
+
+  REAL,POINTER,SAVE :: finmasse(:,:)
+  
+CONTAINS
+
+  SUBROUTINE advtrac_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE vlspltgen_mod
+  IMPLICIT NONE
+  INCLUDE "dimensions.h"
+  INCLUDE "paramet.h"
+  TYPE(distrib),POINTER :: d
+    
+    d=>distrib_vanleer
+    CALL allocate_u(finmasse,llm,d)
+    CALL vlspltgen_allocate
+  END SUBROUTINE advtrac_allocate
+  
+  SUBROUTINE advtrac_switch_vanleer(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  USE vlspltgen_mod
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+  
+    CALL switch_u(finmasse,distrib_vanleer,dist)
+
+    CALL vlspltgen_switch_vanleer(dist)
+
+  END SUBROUTINE advtrac_switch_vanleer  
+  
+END MODULE advtrac_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/allocate_field_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/allocate_field_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,739 +1,0 @@
-MODULE allocate_field_mod
-
-  INTERFACE allocate_u
-    MODULE PROCEDURE allocate1d_u1d,allocate2d_u1d,allocate3d_u1d
-  END INTERFACE allocate_u
-
-  INTERFACE switch_u
-    MODULE PROCEDURE switch1d_u1d,switch2d_u1d,switch3d_u1d
-  END INTERFACE switch_u
-
-  INTERFACE switch_v
-    MODULE PROCEDURE switch1d_v1d,switch2d_v1d,switch3d_v1d
-  END INTERFACE switch_v
-
-  INTERFACE allocate_v
-    MODULE PROCEDURE allocate1d_v1d,allocate2d_v1d,allocate3d_v1d
-  END INTERFACE allocate_v
-
-  INTERFACE allocate2d_u
-    MODULE PROCEDURE allocate1d_u2d,allocate2d_u2d,allocate3d_u2d
-  END INTERFACE allocate2d_u
-
-  INTERFACE allocate2d_v
-    MODULE PROCEDURE allocate1d_v2d,allocate2d_v2d,allocate3d_v2d
-  END INTERFACE allocate2d_v
-
-  INTERFACE switch2d_u
-    MODULE PROCEDURE switch1d_u2d,switch2d_u2d,switch3d_u2d
-  END INTERFACE switch2d_u
-
-  INTERFACE switch2d_v
-    MODULE PROCEDURE switch1d_v2d,switch2d_v2d,switch3d_v2d
-  END INTERFACE switch2D_v
-
-  REAL :: nan
-
-CONTAINS
-
-  SUBROUTINE Init_nan
-  IMPLICIT NONE
-    REAL*8 :: rnan
-    INTEGER :: inan(2)
-    EQUIVALENCE(rnan,inan)
-    
-    inan(1)=2147483647
-    inan(2)=2147483647
-    
-    nan=rnan
-  
-  END SUBROUTINE Init_nan
-
-  SUBROUTINE allocate1d_u1d(field,d)
-  USE parallel_lmdz
-  IMPLICIT NONE
-  REAL,POINTER :: field(:)
-  TYPE(distrib),INTENT(IN) :: d
-
-!$OMP BARRIER
-!$OMP MASTER    
-    IF (ASSOCIATED(field)) DEALLOCATE(field)
-    ALLOCATE(field(d%ijb_u:d%ije_u))
-!$OMP END MASTER
-!$OMP BARRIER
-
-  END SUBROUTINE allocate1d_u1d
-
-
-  SUBROUTINE allocate2d_u1d(field,dim1,d)
-  USE parallel_lmdz
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:)
-  INTEGER      :: dim1
-  TYPE(distrib),INTENT(IN) :: d
-
-!$OMP BARRIER
-!$OMP MASTER    
-    IF (ASSOCIATED(field)) DEALLOCATE(field)
-    ALLOCATE(field(d%ijb_u:d%ije_u,dim1))
-!$OMP END MASTER
-!$OMP BARRIER
-
-  END SUBROUTINE allocate2d_u1d 
-
-  SUBROUTINE allocate3d_u1d(field,dim1,dim2,d)
-  USE parallel_lmdz
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:,:)
-  INTEGER      :: dim1,dim2
-  TYPE(distrib),INTENT(IN) :: d
-
-!$OMP BARRIER
-!$OMP MASTER    
-    IF (ASSOCIATED(field)) DEALLOCATE(field)
-    ALLOCATE(field(d%ijb_u:d%ije_u,dim1,dim2))
-!$OMP END MASTER
-!$OMP BARRIER
-
-  END SUBROUTINE allocate3d_u1d   
-
-
-
-  SUBROUTINE allocate1d_v1d(field,d)
-  USE parallel_lmdz
-  IMPLICIT NONE
-  REAL,POINTER :: field(:)
-  TYPE(distrib),INTENT(IN) :: d
-
-!$OMP BARRIER
-!$OMP MASTER    
-    IF (ASSOCIATED(field)) DEALLOCATE(field)
-    ALLOCATE(field(d%ijb_v:d%ije_v))
-!$OMP END MASTER
-!$OMP BARRIER
-
-  END SUBROUTINE allocate1d_v1d
-
-
-  SUBROUTINE allocate2d_v1d(field,dim1,d)
-  USE parallel_lmdz
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:)
-  INTEGER      :: dim1
-  TYPE(distrib),INTENT(IN) :: d
-
-!$OMP BARRIER
-!$OMP MASTER    
-    IF (ASSOCIATED(field)) DEALLOCATE(field)
-    ALLOCATE(field(d%ijb_v:d%ije_v,dim1))
-!$OMP END MASTER
-!$OMP BARRIER
-
-  END SUBROUTINE allocate2d_v1d 
-
-  SUBROUTINE allocate3d_v1d(field,dim1,dim2,d)
-  USE parallel_lmdz
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:,:)
-  INTEGER      :: dim1,dim2
-  TYPE(distrib),INTENT(IN) :: d
-
-!$OMP BARRIER
-!$OMP MASTER    
-    IF (ASSOCIATED(field)) DEALLOCATE(field)
-    ALLOCATE(field(d%ijb_v:d%ije_v,dim1,dim2))
-!$OMP END MASTER
-!$OMP BARRIER
-
-  END SUBROUTINE allocate3d_v1d   
-
-
-
-
-
-
-
-
-
-  SUBROUTINE allocate1d_u2d(field,d)
-  USE parallel_lmdz
-  USE dimensions_mod
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:)
-  TYPE(distrib),INTENT(IN) :: d
-
-!$OMP BARRIER
-!$OMP MASTER    
-    IF (ASSOCIATED(field)) DEALLOCATE(field)
-    ALLOCATE(field(iip1,d%jjb_u:d%jje_u))
-!$OMP END MASTER
-!$OMP BARRIER
-
-  END SUBROUTINE allocate1d_u2d
-
-
-  SUBROUTINE allocate2d_u2d(field,dim1,d)
-  USE parallel_lmdz
-  USE dimensions_mod
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:,:)
-  INTEGER      :: dim1
-  TYPE(distrib),INTENT(IN) :: d
-
-!$OMP BARRIER
-!$OMP MASTER    
-    IF (ASSOCIATED(field)) DEALLOCATE(field)
-    ALLOCATE(field(iip1,d%jjb_u:d%jje_u,dim1))
-!$OMP END MASTER
-!$OMP BARRIER
-
-  END SUBROUTINE allocate2d_u2d
-
-  SUBROUTINE allocate3d_u2d(field,dim1,dim2,d)
-  USE parallel_lmdz
-  USE dimensions_mod
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:,:,:)
-  INTEGER      :: dim1,dim2
-  TYPE(distrib),INTENT(IN) :: d
-
-!$OMP BARRIER
-!$OMP MASTER    
-    IF (ASSOCIATED(field)) DEALLOCATE(field)
-    ALLOCATE(field(iip1,d%jjb_u:d%jje_u,dim1,dim2))
-!$OMP END MASTER
-!$OMP BARRIER
-
-  END SUBROUTINE allocate3d_u2d   
-
-
-
-  SUBROUTINE allocate1d_v2d(field,d)
-  USE parallel_lmdz
-  USE dimensions_mod
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:)
-  TYPE(distrib),INTENT(IN) :: d
-
-!$OMP BARRIER
-!$OMP MASTER    
-    IF (ASSOCIATED(field)) DEALLOCATE(field)
-    ALLOCATE(field(iip1,d%jjb_v:d%jje_v))
-!$OMP END MASTER
-!$OMP BARRIER
-
-  END SUBROUTINE allocate1d_v2d
-
-
-  SUBROUTINE allocate2d_v2d(field,dim1,d)
-  USE parallel_lmdz
-  USE dimensions_mod
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:,:)
-  INTEGER      :: dim1
-  TYPE(distrib),INTENT(IN) :: d
-
-!$OMP BARRIER
-!$OMP MASTER    
-    IF (ASSOCIATED(field)) DEALLOCATE(field)
-    ALLOCATE(field(iip1,d%jjb_v:d%jje_v,dim1))
-!$OMP END MASTER
-!$OMP BARRIER
-
-  END SUBROUTINE allocate2d_v2d
-
-  SUBROUTINE allocate3d_v2d(field,dim1,dim2,d)
-  USE parallel_lmdz
-  USE dimensions_mod
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:,:,:)
-  INTEGER      :: dim1,dim2
-  TYPE(distrib),INTENT(IN) :: d
-
-!$OMP BARRIER
-!$OMP MASTER    
-    IF (ASSOCIATED(field)) DEALLOCATE(field)
-    ALLOCATE(field(iip1,d%jjb_v:d%jje_v,dim1,dim2))
-!$OMP END MASTER
-!$OMP BARRIER
-
-  END SUBROUTINE allocate3d_v2d   
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  SUBROUTINE switch1d_u1d(field,old_dist,new_dist,up,down)
-  USE parallel_lmdz
-  USE mod_hallo
-  IMPLICIT NONE
-  REAL,POINTER :: field(:)
-  TYPE(distrib),INTENT(IN) :: old_dist
-  TYPE(distrib),INTENT(IN) :: new_dist
-  INTEGER, OPTIONAL,INTENT(IN) :: up
-  INTEGER, OPTIONAL,INTENT(IN) :: down
-  
-  REAL,POINTER,SAVE :: new_field(:)
-  TYPE(request) :: req
-  
-  !$OMP BARRIER
-  !$OMP MASTER    
-    ALLOCATE(new_field(new_dist%ijb_u:new_dist%ije_u))
-    new_field=nan
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL Register_SwapField_u(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
-  
-    CALL SendRequest(req)
-
-  !$OMP BARRIER
-    CALL WaitRequest(req)     
-  !$OMP BARRIER
-    
-  !$OMP MASTER
-    DEALLOCATE(field)
-    field=>new_field
-  !$OMP END MASTER
-  !$OMP BARRIER
-   
-    CALL barrier
-  END SUBROUTINE switch1d_u1d  
-  
-  SUBROUTINE switch2d_u1d(field,old_dist,new_dist,up,down)
-  USE parallel_lmdz
-  USE mod_hallo
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:)
-  TYPE(distrib),INTENT(IN) :: old_dist
-  TYPE(distrib),INTENT(IN) :: new_dist
-  INTEGER, OPTIONAL,INTENT(IN) :: up
-  INTEGER, OPTIONAL,INTENT(IN) :: down
-
-  REAL,POINTER,SAVE :: new_field(:,:)
-  TYPE(request) :: req
-  
-  !$OMP BARRIER
-  !$OMP MASTER    
-    ALLOCATE(new_field(new_dist%ijb_u:new_dist%ije_u,size(field,2)))
-    new_field=nan
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL Register_SwapField_u(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
-  
-    CALL SendRequest(req)
-
-  !$OMP BARRIER
-    CALL WaitRequest(req)     
-  !$OMP BARRIER
-    
-  !$OMP MASTER
-    DEALLOCATE(field)
-    field=>new_field
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL barrier
-
-  END SUBROUTINE switch2d_u1d  
-
-  SUBROUTINE switch3d_u1d(field,old_dist,new_dist,up,down)
-  USE parallel_lmdz
-  USE mod_hallo
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:,:)
-  TYPE(distrib),INTENT(IN) :: old_dist
-  TYPE(distrib),INTENT(IN) :: new_dist
-  INTEGER, OPTIONAL,INTENT(IN) :: up
-  INTEGER, OPTIONAL,INTENT(IN) :: down
-
-  REAL,POINTER,SAVE :: new_field(:,:,:)
-  TYPE(request) :: req
-  
-  !$OMP BARRIER
-  !$OMP MASTER    
-    ALLOCATE(new_field(new_dist%ijb_u:new_dist%ije_u,size(field,2),size(field,3)))
-    new_field=nan
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL Register_SwapField_u(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
-  
-    CALL SendRequest(req)
-
-  !$OMP BARRIER
-    CALL WaitRequest(req)     
-  !$OMP BARRIER
-    
-  !$OMP MASTER
-    DEALLOCATE(field)
-    field=>new_field
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL barrier
-
-  END SUBROUTINE switch3d_u1d  
-
-
-
-
-  SUBROUTINE switch1d_v1d(field,old_dist,new_dist,up,down)
-  USE parallel_lmdz
-  USE mod_hallo
-  IMPLICIT NONE
-  REAL,POINTER :: field(:)
-  TYPE(distrib),INTENT(IN) :: old_dist
-  TYPE(distrib),INTENT(IN) :: new_dist
-  INTEGER, OPTIONAL,INTENT(IN) :: up
-  INTEGER, OPTIONAL,INTENT(IN) :: down
-
-  REAL,POINTER,SAVE :: new_field(:)
-  TYPE(request) :: req
-  
-  !$OMP BARRIER
-  !$OMP MASTER    
-    ALLOCATE(new_field(new_dist%ijb_v:new_dist%ije_v))
-    new_field=nan
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL Register_SwapField_v(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
-  
-    CALL SendRequest(req)
-
-  !$OMP BARRIER
-    CALL WaitRequest(req)     
-  !$OMP BARRIER
-    
-  !$OMP MASTER
-    DEALLOCATE(field)
-    field=>new_field
-  !$OMP END MASTER
-  !$OMP BARRIER
-
-    CALL barrier
-  END SUBROUTINE switch1d_v1d  
-  
-  SUBROUTINE switch2d_v1d(field,old_dist,new_dist,up,down)
-  USE parallel_lmdz
-  USE mod_hallo
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:)
-  TYPE(distrib),INTENT(IN) :: old_dist
-  TYPE(distrib),INTENT(IN) :: new_dist
-  INTEGER, OPTIONAL,INTENT(IN) :: up
-  INTEGER, OPTIONAL,INTENT(IN) :: down
-
-  REAL,POINTER,SAVE :: new_field(:,:)
-  TYPE(request) :: req
-  
-  !$OMP BARRIER
-  !$OMP MASTER    
-    ALLOCATE(new_field(new_dist%ijb_v:new_dist%ije_v,size(field,2)))
-    new_field=nan
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL Register_SwapField_v(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
-  
-    CALL SendRequest(req)
-
-  !$OMP BARRIER
-    CALL WaitRequest(req)     
-  !$OMP BARRIER
-    
-  !$OMP MASTER
-    DEALLOCATE(field)
-    field=>new_field
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL barrier
-
-  END SUBROUTINE switch2d_v1d  
-
-  SUBROUTINE switch3d_v1d(field,old_dist,new_dist,up,down)
-  USE parallel_lmdz
-  USE mod_hallo
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:,:)
-  TYPE(distrib),INTENT(IN) :: old_dist
-  TYPE(distrib),INTENT(IN) :: new_dist
-  INTEGER, OPTIONAL,INTENT(IN) :: up
-  INTEGER, OPTIONAL,INTENT(IN) :: down
-
-  REAL,POINTER,SAVE :: new_field(:,:,:)
-  TYPE(request) :: req
-  
-  !$OMP BARRIER
-  !$OMP MASTER    
-    ALLOCATE(new_field(new_dist%ijb_v:new_dist%ije_v,size(field,2),size(field,3)))
-    new_field=nan
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL Register_SwapField_v(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
-  
-    CALL SendRequest(req)
-
-  !$OMP BARRIER
-    CALL WaitRequest(req)     
-  !$OMP BARRIER
-    
-  !$OMP MASTER
-    DEALLOCATE(field)
-    field=>new_field
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL barrier
-
-  END SUBROUTINE switch3d_v1d  
-
-
-
-
-
-
-
-
-
-
-
-
-  SUBROUTINE switch1d_u2d(field,old_dist,new_dist,up,down)
-  USE parallel_lmdz
-  USE mod_hallo
-  USE dimensions_mod
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:)
-  TYPE(distrib),INTENT(IN) :: old_dist
-  TYPE(distrib),INTENT(IN) :: new_dist
-  INTEGER, OPTIONAL,INTENT(IN) :: up
-  INTEGER, OPTIONAL,INTENT(IN) :: down
-
-  REAL,POINTER,SAVE :: new_field(:,:)
-  TYPE(request) :: req
-  
-  !$OMP BARRIER
-  !$OMP MASTER    
-    ALLOCATE(new_field(iip1,new_dist%jjb_u:new_dist%jje_u))
-    new_field=nan
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL Register_SwapField2d_u(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
-  
-    CALL SendRequest(req)
-
-  !$OMP BARRIER
-    CALL WaitRequest(req)     
-  !$OMP BARRIER
-    
-  !$OMP MASTER
-    DEALLOCATE(field)
-    field=>new_field
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL barrier
-
-  END SUBROUTINE switch1d_u2d  
-  
-  SUBROUTINE switch2d_u2d(field,old_dist,new_dist,up,down)
-  USE parallel_lmdz
-  USE mod_hallo
-  USE dimensions_mod
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:,:)
-  TYPE(distrib),INTENT(IN) :: old_dist
-  TYPE(distrib),INTENT(IN) :: new_dist
-  INTEGER, OPTIONAL,INTENT(IN) :: up
-  INTEGER, OPTIONAL,INTENT(IN) :: down
-
-  REAL,POINTER,SAVE :: new_field(:,:,:)
-  TYPE(request) :: req
-  
-  !$OMP BARRIER
-  !$OMP MASTER    
-    ALLOCATE(new_field(iip1,new_dist%jjb_u:new_dist%jje_u,size(field,3)))
-    new_field=nan
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL Register_SwapField2d_u(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
-  
-    CALL SendRequest(req)
-
-  !$OMP BARRIER
-    CALL WaitRequest(req)     
-  !$OMP BARRIER
-    
-  !$OMP MASTER
-    DEALLOCATE(field)
-    field=>new_field
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL barrier
-
-  END SUBROUTINE switch2d_u2d  
-
-  SUBROUTINE switch3d_u2d(field,old_dist,new_dist,up,down)
-  USE parallel_lmdz
-  USE mod_hallo
-  USE dimensions_mod
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:,:,:)
-  TYPE(distrib),INTENT(IN) :: old_dist
-  TYPE(distrib),INTENT(IN) :: new_dist
-  INTEGER, OPTIONAL,INTENT(IN) :: up
-  INTEGER, OPTIONAL,INTENT(IN) :: down
-
-  REAL,POINTER,SAVE :: new_field(:,:,:,:)
-  TYPE(request) :: req
-  
-  !$OMP BARRIER
-  !$OMP MASTER    
-    ALLOCATE(new_field(iip1,new_dist%jjb_u:new_dist%jje_u,size(field,3),size(field,4)))
-    new_field=nan
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL Register_SwapField2d_u(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
-  
-    CALL SendRequest(req)
-
-  !$OMP BARRIER
-    CALL WaitRequest(req)     
-  !$OMP BARRIER
-    
-  !$OMP MASTER
-    DEALLOCATE(field)
-    field=>new_field
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL barrier
-
-  END SUBROUTINE switch3d_u2d  
-
-
-
-
-  SUBROUTINE switch1d_v2d(field,old_dist,new_dist,up,down)
-  USE parallel_lmdz
-  USE mod_hallo
-  USE dimensions_mod
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:)
-  TYPE(distrib),INTENT(IN) :: old_dist
-  TYPE(distrib),INTENT(IN) :: new_dist
-  INTEGER, OPTIONAL,INTENT(IN) :: up
-  INTEGER, OPTIONAL,INTENT(IN) :: down
-
-  REAL,POINTER,SAVE :: new_field(:,:)
-  TYPE(request) :: req
-  
-  !$OMP BARRIER
-  !$OMP MASTER    
-    ALLOCATE(new_field(iip1,new_dist%jjb_v:new_dist%jje_v))
-    new_field=nan
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL Register_SwapField2d_v(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
-  
-    CALL SendRequest(req)
-
-  !$OMP BARRIER
-    CALL WaitRequest(req)     
-  !$OMP BARRIER
-    
-  !$OMP MASTER
-    DEALLOCATE(field)
-    field=>new_field
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL barrier
-
-  END SUBROUTINE switch1d_v2d  
-  
-  SUBROUTINE switch2d_v2d(field,old_dist,new_dist,up,down)
-  USE parallel_lmdz
-  USE mod_hallo
-  USE dimensions_mod
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:,:)
-  TYPE(distrib),INTENT(IN) :: old_dist
-  TYPE(distrib),INTENT(IN) :: new_dist
-  INTEGER, OPTIONAL,INTENT(IN) :: up
-  INTEGER, OPTIONAL,INTENT(IN) :: down
-
-  REAL,POINTER,SAVE :: new_field(:,:,:)
-  TYPE(request) :: req
-  
-  !$OMP BARRIER
-  !$OMP MASTER    
-    ALLOCATE(new_field(iip1,new_dist%jjb_v:new_dist%jje_v,size(field,3)))
-    new_field=nan
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL Register_SwapField2d_v(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
-  
-    CALL SendRequest(req)
-
-  !$OMP BARRIER
-    CALL WaitRequest(req)     
-  !$OMP BARRIER
-    
-  !$OMP MASTER
-    DEALLOCATE(field)
-    field=>new_field
-  !$OMP END MASTER
-  !$OMP BARRIER
-
-    CALL barrier
-  END SUBROUTINE switch2d_v2d  
-
-  SUBROUTINE switch3d_v2d(field,old_dist,new_dist,up,down)
-  USE parallel_lmdz
-  USE mod_hallo
-  USE dimensions_mod
-  IMPLICIT NONE
-  REAL,POINTER :: field(:,:,:,:)
-  TYPE(distrib),INTENT(IN) :: old_dist
-  TYPE(distrib),INTENT(IN) :: new_dist
-  INTEGER, OPTIONAL,INTENT(IN) :: up
-  INTEGER, OPTIONAL,INTENT(IN) :: down
-
-  REAL,POINTER,SAVE :: new_field(:,:,:,:)
-  TYPE(request) :: req
-  
-  !$OMP BARRIER
-  !$OMP MASTER    
-    ALLOCATE(new_field(iip1,new_dist%jjb_v:new_dist%jje_v,size(field,3),size(field,4)))
-    new_field=nan
-  !$OMP END MASTER
-  !$OMP BARRIER
-    CALL Register_SwapField2d_v(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
-  
-    CALL SendRequest(req)
-
-  !$OMP BARRIER
-    CALL WaitRequest(req)     
-  !$OMP BARRIER
-    
-  !$OMP MASTER
-    DEALLOCATE(field)
-    field=>new_field
-  !$OMP END MASTER
-  !$OMP BARRIER
-
-    CALL barrier
-  END SUBROUTINE switch3d_v2d 
-
-END MODULE allocate_field_mod
-  
-  
-  
-  
Index: LMDZ6/trunk/libf/dyn3dmem/allocate_field_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/allocate_field_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/allocate_field_mod.f90	(revision 5268)
@@ -0,0 +1,739 @@
+MODULE allocate_field_mod
+
+  INTERFACE allocate_u
+    MODULE PROCEDURE allocate1d_u1d,allocate2d_u1d,allocate3d_u1d
+  END INTERFACE allocate_u
+
+  INTERFACE switch_u
+    MODULE PROCEDURE switch1d_u1d,switch2d_u1d,switch3d_u1d
+  END INTERFACE switch_u
+
+  INTERFACE switch_v
+    MODULE PROCEDURE switch1d_v1d,switch2d_v1d,switch3d_v1d
+  END INTERFACE switch_v
+
+  INTERFACE allocate_v
+    MODULE PROCEDURE allocate1d_v1d,allocate2d_v1d,allocate3d_v1d
+  END INTERFACE allocate_v
+
+  INTERFACE allocate2d_u
+    MODULE PROCEDURE allocate1d_u2d,allocate2d_u2d,allocate3d_u2d
+  END INTERFACE allocate2d_u
+
+  INTERFACE allocate2d_v
+    MODULE PROCEDURE allocate1d_v2d,allocate2d_v2d,allocate3d_v2d
+  END INTERFACE allocate2d_v
+
+  INTERFACE switch2d_u
+    MODULE PROCEDURE switch1d_u2d,switch2d_u2d,switch3d_u2d
+  END INTERFACE switch2d_u
+
+  INTERFACE switch2d_v
+    MODULE PROCEDURE switch1d_v2d,switch2d_v2d,switch3d_v2d
+  END INTERFACE switch2D_v
+
+  REAL :: nan
+
+CONTAINS
+
+  SUBROUTINE Init_nan
+  IMPLICIT NONE
+    REAL*8 :: rnan
+    INTEGER :: inan(2)
+    EQUIVALENCE(rnan,inan)
+    
+    inan(1)=2147483647
+    inan(2)=2147483647
+    
+    nan=rnan
+  
+  END SUBROUTINE Init_nan
+
+  SUBROUTINE allocate1d_u1d(field,d)
+  USE parallel_lmdz
+  IMPLICIT NONE
+  REAL,POINTER :: field(:)
+  TYPE(distrib),INTENT(IN) :: d
+
+!$OMP BARRIER
+!$OMP MASTER    
+    IF (ASSOCIATED(field)) DEALLOCATE(field)
+    ALLOCATE(field(d%ijb_u:d%ije_u))
+!$OMP END MASTER
+!$OMP BARRIER
+
+  END SUBROUTINE allocate1d_u1d
+
+
+  SUBROUTINE allocate2d_u1d(field,dim1,d)
+  USE parallel_lmdz
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:)
+  INTEGER      :: dim1
+  TYPE(distrib),INTENT(IN) :: d
+
+!$OMP BARRIER
+!$OMP MASTER    
+    IF (ASSOCIATED(field)) DEALLOCATE(field)
+    ALLOCATE(field(d%ijb_u:d%ije_u,dim1))
+!$OMP END MASTER
+!$OMP BARRIER
+
+  END SUBROUTINE allocate2d_u1d 
+
+  SUBROUTINE allocate3d_u1d(field,dim1,dim2,d)
+  USE parallel_lmdz
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:,:)
+  INTEGER      :: dim1,dim2
+  TYPE(distrib),INTENT(IN) :: d
+
+!$OMP BARRIER
+!$OMP MASTER    
+    IF (ASSOCIATED(field)) DEALLOCATE(field)
+    ALLOCATE(field(d%ijb_u:d%ije_u,dim1,dim2))
+!$OMP END MASTER
+!$OMP BARRIER
+
+  END SUBROUTINE allocate3d_u1d   
+
+
+
+  SUBROUTINE allocate1d_v1d(field,d)
+  USE parallel_lmdz
+  IMPLICIT NONE
+  REAL,POINTER :: field(:)
+  TYPE(distrib),INTENT(IN) :: d
+
+!$OMP BARRIER
+!$OMP MASTER    
+    IF (ASSOCIATED(field)) DEALLOCATE(field)
+    ALLOCATE(field(d%ijb_v:d%ije_v))
+!$OMP END MASTER
+!$OMP BARRIER
+
+  END SUBROUTINE allocate1d_v1d
+
+
+  SUBROUTINE allocate2d_v1d(field,dim1,d)
+  USE parallel_lmdz
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:)
+  INTEGER      :: dim1
+  TYPE(distrib),INTENT(IN) :: d
+
+!$OMP BARRIER
+!$OMP MASTER    
+    IF (ASSOCIATED(field)) DEALLOCATE(field)
+    ALLOCATE(field(d%ijb_v:d%ije_v,dim1))
+!$OMP END MASTER
+!$OMP BARRIER
+
+  END SUBROUTINE allocate2d_v1d 
+
+  SUBROUTINE allocate3d_v1d(field,dim1,dim2,d)
+  USE parallel_lmdz
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:,:)
+  INTEGER      :: dim1,dim2
+  TYPE(distrib),INTENT(IN) :: d
+
+!$OMP BARRIER
+!$OMP MASTER    
+    IF (ASSOCIATED(field)) DEALLOCATE(field)
+    ALLOCATE(field(d%ijb_v:d%ije_v,dim1,dim2))
+!$OMP END MASTER
+!$OMP BARRIER
+
+  END SUBROUTINE allocate3d_v1d   
+
+
+
+
+
+
+
+
+
+  SUBROUTINE allocate1d_u2d(field,d)
+  USE parallel_lmdz
+  USE dimensions_mod
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:)
+  TYPE(distrib),INTENT(IN) :: d
+
+!$OMP BARRIER
+!$OMP MASTER    
+    IF (ASSOCIATED(field)) DEALLOCATE(field)
+    ALLOCATE(field(iip1,d%jjb_u:d%jje_u))
+!$OMP END MASTER
+!$OMP BARRIER
+
+  END SUBROUTINE allocate1d_u2d
+
+
+  SUBROUTINE allocate2d_u2d(field,dim1,d)
+  USE parallel_lmdz
+  USE dimensions_mod
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:,:)
+  INTEGER      :: dim1
+  TYPE(distrib),INTENT(IN) :: d
+
+!$OMP BARRIER
+!$OMP MASTER    
+    IF (ASSOCIATED(field)) DEALLOCATE(field)
+    ALLOCATE(field(iip1,d%jjb_u:d%jje_u,dim1))
+!$OMP END MASTER
+!$OMP BARRIER
+
+  END SUBROUTINE allocate2d_u2d
+
+  SUBROUTINE allocate3d_u2d(field,dim1,dim2,d)
+  USE parallel_lmdz
+  USE dimensions_mod
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:,:,:)
+  INTEGER      :: dim1,dim2
+  TYPE(distrib),INTENT(IN) :: d
+
+!$OMP BARRIER
+!$OMP MASTER    
+    IF (ASSOCIATED(field)) DEALLOCATE(field)
+    ALLOCATE(field(iip1,d%jjb_u:d%jje_u,dim1,dim2))
+!$OMP END MASTER
+!$OMP BARRIER
+
+  END SUBROUTINE allocate3d_u2d   
+
+
+
+  SUBROUTINE allocate1d_v2d(field,d)
+  USE parallel_lmdz
+  USE dimensions_mod
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:)
+  TYPE(distrib),INTENT(IN) :: d
+
+!$OMP BARRIER
+!$OMP MASTER    
+    IF (ASSOCIATED(field)) DEALLOCATE(field)
+    ALLOCATE(field(iip1,d%jjb_v:d%jje_v))
+!$OMP END MASTER
+!$OMP BARRIER
+
+  END SUBROUTINE allocate1d_v2d
+
+
+  SUBROUTINE allocate2d_v2d(field,dim1,d)
+  USE parallel_lmdz
+  USE dimensions_mod
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:,:)
+  INTEGER      :: dim1
+  TYPE(distrib),INTENT(IN) :: d
+
+!$OMP BARRIER
+!$OMP MASTER    
+    IF (ASSOCIATED(field)) DEALLOCATE(field)
+    ALLOCATE(field(iip1,d%jjb_v:d%jje_v,dim1))
+!$OMP END MASTER
+!$OMP BARRIER
+
+  END SUBROUTINE allocate2d_v2d
+
+  SUBROUTINE allocate3d_v2d(field,dim1,dim2,d)
+  USE parallel_lmdz
+  USE dimensions_mod
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:,:,:)
+  INTEGER      :: dim1,dim2
+  TYPE(distrib),INTENT(IN) :: d
+
+!$OMP BARRIER
+!$OMP MASTER    
+    IF (ASSOCIATED(field)) DEALLOCATE(field)
+    ALLOCATE(field(iip1,d%jjb_v:d%jje_v,dim1,dim2))
+!$OMP END MASTER
+!$OMP BARRIER
+
+  END SUBROUTINE allocate3d_v2d   
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  SUBROUTINE switch1d_u1d(field,old_dist,new_dist,up,down)
+  USE parallel_lmdz
+  USE mod_hallo
+  IMPLICIT NONE
+  REAL,POINTER :: field(:)
+  TYPE(distrib),INTENT(IN) :: old_dist
+  TYPE(distrib),INTENT(IN) :: new_dist
+  INTEGER, OPTIONAL,INTENT(IN) :: up
+  INTEGER, OPTIONAL,INTENT(IN) :: down
+  
+  REAL,POINTER,SAVE :: new_field(:)
+  TYPE(request) :: req
+  
+  !$OMP BARRIER
+  !$OMP MASTER    
+    ALLOCATE(new_field(new_dist%ijb_u:new_dist%ije_u))
+    new_field=nan
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL Register_SwapField_u(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
+  
+    CALL SendRequest(req)
+
+  !$OMP BARRIER
+    CALL WaitRequest(req)     
+  !$OMP BARRIER
+    
+  !$OMP MASTER
+    DEALLOCATE(field)
+    field=>new_field
+  !$OMP END MASTER
+  !$OMP BARRIER
+   
+    CALL barrier
+  END SUBROUTINE switch1d_u1d  
+  
+  SUBROUTINE switch2d_u1d(field,old_dist,new_dist,up,down)
+  USE parallel_lmdz
+  USE mod_hallo
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:)
+  TYPE(distrib),INTENT(IN) :: old_dist
+  TYPE(distrib),INTENT(IN) :: new_dist
+  INTEGER, OPTIONAL,INTENT(IN) :: up
+  INTEGER, OPTIONAL,INTENT(IN) :: down
+
+  REAL,POINTER,SAVE :: new_field(:,:)
+  TYPE(request) :: req
+  
+  !$OMP BARRIER
+  !$OMP MASTER    
+    ALLOCATE(new_field(new_dist%ijb_u:new_dist%ije_u,size(field,2)))
+    new_field=nan
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL Register_SwapField_u(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
+  
+    CALL SendRequest(req)
+
+  !$OMP BARRIER
+    CALL WaitRequest(req)     
+  !$OMP BARRIER
+    
+  !$OMP MASTER
+    DEALLOCATE(field)
+    field=>new_field
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL barrier
+
+  END SUBROUTINE switch2d_u1d  
+
+  SUBROUTINE switch3d_u1d(field,old_dist,new_dist,up,down)
+  USE parallel_lmdz
+  USE mod_hallo
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:,:)
+  TYPE(distrib),INTENT(IN) :: old_dist
+  TYPE(distrib),INTENT(IN) :: new_dist
+  INTEGER, OPTIONAL,INTENT(IN) :: up
+  INTEGER, OPTIONAL,INTENT(IN) :: down
+
+  REAL,POINTER,SAVE :: new_field(:,:,:)
+  TYPE(request) :: req
+  
+  !$OMP BARRIER
+  !$OMP MASTER    
+    ALLOCATE(new_field(new_dist%ijb_u:new_dist%ije_u,size(field,2),size(field,3)))
+    new_field=nan
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL Register_SwapField_u(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
+  
+    CALL SendRequest(req)
+
+  !$OMP BARRIER
+    CALL WaitRequest(req)     
+  !$OMP BARRIER
+    
+  !$OMP MASTER
+    DEALLOCATE(field)
+    field=>new_field
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL barrier
+
+  END SUBROUTINE switch3d_u1d  
+
+
+
+
+  SUBROUTINE switch1d_v1d(field,old_dist,new_dist,up,down)
+  USE parallel_lmdz
+  USE mod_hallo
+  IMPLICIT NONE
+  REAL,POINTER :: field(:)
+  TYPE(distrib),INTENT(IN) :: old_dist
+  TYPE(distrib),INTENT(IN) :: new_dist
+  INTEGER, OPTIONAL,INTENT(IN) :: up
+  INTEGER, OPTIONAL,INTENT(IN) :: down
+
+  REAL,POINTER,SAVE :: new_field(:)
+  TYPE(request) :: req
+  
+  !$OMP BARRIER
+  !$OMP MASTER    
+    ALLOCATE(new_field(new_dist%ijb_v:new_dist%ije_v))
+    new_field=nan
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL Register_SwapField_v(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
+  
+    CALL SendRequest(req)
+
+  !$OMP BARRIER
+    CALL WaitRequest(req)     
+  !$OMP BARRIER
+    
+  !$OMP MASTER
+    DEALLOCATE(field)
+    field=>new_field
+  !$OMP END MASTER
+  !$OMP BARRIER
+
+    CALL barrier
+  END SUBROUTINE switch1d_v1d  
+  
+  SUBROUTINE switch2d_v1d(field,old_dist,new_dist,up,down)
+  USE parallel_lmdz
+  USE mod_hallo
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:)
+  TYPE(distrib),INTENT(IN) :: old_dist
+  TYPE(distrib),INTENT(IN) :: new_dist
+  INTEGER, OPTIONAL,INTENT(IN) :: up
+  INTEGER, OPTIONAL,INTENT(IN) :: down
+
+  REAL,POINTER,SAVE :: new_field(:,:)
+  TYPE(request) :: req
+  
+  !$OMP BARRIER
+  !$OMP MASTER    
+    ALLOCATE(new_field(new_dist%ijb_v:new_dist%ije_v,size(field,2)))
+    new_field=nan
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL Register_SwapField_v(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
+  
+    CALL SendRequest(req)
+
+  !$OMP BARRIER
+    CALL WaitRequest(req)     
+  !$OMP BARRIER
+    
+  !$OMP MASTER
+    DEALLOCATE(field)
+    field=>new_field
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL barrier
+
+  END SUBROUTINE switch2d_v1d  
+
+  SUBROUTINE switch3d_v1d(field,old_dist,new_dist,up,down)
+  USE parallel_lmdz
+  USE mod_hallo
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:,:)
+  TYPE(distrib),INTENT(IN) :: old_dist
+  TYPE(distrib),INTENT(IN) :: new_dist
+  INTEGER, OPTIONAL,INTENT(IN) :: up
+  INTEGER, OPTIONAL,INTENT(IN) :: down
+
+  REAL,POINTER,SAVE :: new_field(:,:,:)
+  TYPE(request) :: req
+  
+  !$OMP BARRIER
+  !$OMP MASTER    
+    ALLOCATE(new_field(new_dist%ijb_v:new_dist%ije_v,size(field,2),size(field,3)))
+    new_field=nan
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL Register_SwapField_v(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
+  
+    CALL SendRequest(req)
+
+  !$OMP BARRIER
+    CALL WaitRequest(req)     
+  !$OMP BARRIER
+    
+  !$OMP MASTER
+    DEALLOCATE(field)
+    field=>new_field
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL barrier
+
+  END SUBROUTINE switch3d_v1d  
+
+
+
+
+
+
+
+
+
+
+
+
+  SUBROUTINE switch1d_u2d(field,old_dist,new_dist,up,down)
+  USE parallel_lmdz
+  USE mod_hallo
+  USE dimensions_mod
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:)
+  TYPE(distrib),INTENT(IN) :: old_dist
+  TYPE(distrib),INTENT(IN) :: new_dist
+  INTEGER, OPTIONAL,INTENT(IN) :: up
+  INTEGER, OPTIONAL,INTENT(IN) :: down
+
+  REAL,POINTER,SAVE :: new_field(:,:)
+  TYPE(request) :: req
+  
+  !$OMP BARRIER
+  !$OMP MASTER    
+    ALLOCATE(new_field(iip1,new_dist%jjb_u:new_dist%jje_u))
+    new_field=nan
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL Register_SwapField2d_u(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
+  
+    CALL SendRequest(req)
+
+  !$OMP BARRIER
+    CALL WaitRequest(req)     
+  !$OMP BARRIER
+    
+  !$OMP MASTER
+    DEALLOCATE(field)
+    field=>new_field
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL barrier
+
+  END SUBROUTINE switch1d_u2d  
+  
+  SUBROUTINE switch2d_u2d(field,old_dist,new_dist,up,down)
+  USE parallel_lmdz
+  USE mod_hallo
+  USE dimensions_mod
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:,:)
+  TYPE(distrib),INTENT(IN) :: old_dist
+  TYPE(distrib),INTENT(IN) :: new_dist
+  INTEGER, OPTIONAL,INTENT(IN) :: up
+  INTEGER, OPTIONAL,INTENT(IN) :: down
+
+  REAL,POINTER,SAVE :: new_field(:,:,:)
+  TYPE(request) :: req
+  
+  !$OMP BARRIER
+  !$OMP MASTER    
+    ALLOCATE(new_field(iip1,new_dist%jjb_u:new_dist%jje_u,size(field,3)))
+    new_field=nan
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL Register_SwapField2d_u(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
+  
+    CALL SendRequest(req)
+
+  !$OMP BARRIER
+    CALL WaitRequest(req)     
+  !$OMP BARRIER
+    
+  !$OMP MASTER
+    DEALLOCATE(field)
+    field=>new_field
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL barrier
+
+  END SUBROUTINE switch2d_u2d  
+
+  SUBROUTINE switch3d_u2d(field,old_dist,new_dist,up,down)
+  USE parallel_lmdz
+  USE mod_hallo
+  USE dimensions_mod
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:,:,:)
+  TYPE(distrib),INTENT(IN) :: old_dist
+  TYPE(distrib),INTENT(IN) :: new_dist
+  INTEGER, OPTIONAL,INTENT(IN) :: up
+  INTEGER, OPTIONAL,INTENT(IN) :: down
+
+  REAL,POINTER,SAVE :: new_field(:,:,:,:)
+  TYPE(request) :: req
+  
+  !$OMP BARRIER
+  !$OMP MASTER    
+    ALLOCATE(new_field(iip1,new_dist%jjb_u:new_dist%jje_u,size(field,3),size(field,4)))
+    new_field=nan
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL Register_SwapField2d_u(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
+  
+    CALL SendRequest(req)
+
+  !$OMP BARRIER
+    CALL WaitRequest(req)     
+  !$OMP BARRIER
+    
+  !$OMP MASTER
+    DEALLOCATE(field)
+    field=>new_field
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL barrier
+
+  END SUBROUTINE switch3d_u2d  
+
+
+
+
+  SUBROUTINE switch1d_v2d(field,old_dist,new_dist,up,down)
+  USE parallel_lmdz
+  USE mod_hallo
+  USE dimensions_mod
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:)
+  TYPE(distrib),INTENT(IN) :: old_dist
+  TYPE(distrib),INTENT(IN) :: new_dist
+  INTEGER, OPTIONAL,INTENT(IN) :: up
+  INTEGER, OPTIONAL,INTENT(IN) :: down
+
+  REAL,POINTER,SAVE :: new_field(:,:)
+  TYPE(request) :: req
+  
+  !$OMP BARRIER
+  !$OMP MASTER    
+    ALLOCATE(new_field(iip1,new_dist%jjb_v:new_dist%jje_v))
+    new_field=nan
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL Register_SwapField2d_v(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
+  
+    CALL SendRequest(req)
+
+  !$OMP BARRIER
+    CALL WaitRequest(req)     
+  !$OMP BARRIER
+    
+  !$OMP MASTER
+    DEALLOCATE(field)
+    field=>new_field
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL barrier
+
+  END SUBROUTINE switch1d_v2d  
+  
+  SUBROUTINE switch2d_v2d(field,old_dist,new_dist,up,down)
+  USE parallel_lmdz
+  USE mod_hallo
+  USE dimensions_mod
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:,:)
+  TYPE(distrib),INTENT(IN) :: old_dist
+  TYPE(distrib),INTENT(IN) :: new_dist
+  INTEGER, OPTIONAL,INTENT(IN) :: up
+  INTEGER, OPTIONAL,INTENT(IN) :: down
+
+  REAL,POINTER,SAVE :: new_field(:,:,:)
+  TYPE(request) :: req
+  
+  !$OMP BARRIER
+  !$OMP MASTER    
+    ALLOCATE(new_field(iip1,new_dist%jjb_v:new_dist%jje_v,size(field,3)))
+    new_field=nan
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL Register_SwapField2d_v(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
+  
+    CALL SendRequest(req)
+
+  !$OMP BARRIER
+    CALL WaitRequest(req)     
+  !$OMP BARRIER
+    
+  !$OMP MASTER
+    DEALLOCATE(field)
+    field=>new_field
+  !$OMP END MASTER
+  !$OMP BARRIER
+
+    CALL barrier
+  END SUBROUTINE switch2d_v2d  
+
+  SUBROUTINE switch3d_v2d(field,old_dist,new_dist,up,down)
+  USE parallel_lmdz
+  USE mod_hallo
+  USE dimensions_mod
+  IMPLICIT NONE
+  REAL,POINTER :: field(:,:,:,:)
+  TYPE(distrib),INTENT(IN) :: old_dist
+  TYPE(distrib),INTENT(IN) :: new_dist
+  INTEGER, OPTIONAL,INTENT(IN) :: up
+  INTEGER, OPTIONAL,INTENT(IN) :: down
+
+  REAL,POINTER,SAVE :: new_field(:,:,:,:)
+  TYPE(request) :: req
+  
+  !$OMP BARRIER
+  !$OMP MASTER    
+    ALLOCATE(new_field(iip1,new_dist%jjb_v:new_dist%jje_v,size(field,3),size(field,4)))
+    new_field=nan
+  !$OMP END MASTER
+  !$OMP BARRIER
+    CALL Register_SwapField2d_v(field,new_field,new_dist,req,old_dist=old_dist,up=up,down=down)
+  
+    CALL SendRequest(req)
+
+  !$OMP BARRIER
+    CALL WaitRequest(req)     
+  !$OMP BARRIER
+    
+  !$OMP MASTER
+    DEALLOCATE(field)
+    field=>new_field
+  !$OMP END MASTER
+  !$OMP BARRIER
+
+    CALL barrier
+  END SUBROUTINE switch3d_v2d 
+
+END MODULE allocate_field_mod
+  
+  
+  
+  
Index: LMDZ6/trunk/libf/dyn3dmem/bands.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/bands.F90	(revision 5267)
+++ 	(revision )
@@ -1,490 +1,0 @@
-!
-! $Id$
-!
-  module Bands
-  USE parallel_lmdz
-    integer, parameter :: bands_caldyn=1
-    integer, parameter :: bands_vanleer=2
-    integer, parameter :: bands_dissip=3
-    
-    INTEGER,dimension(:),allocatable :: jj_Nb_Caldyn
-    INTEGER,dimension(:),allocatable :: jj_Nb_vanleer
-    INTEGER,dimension(:),allocatable :: jj_Nb_vanleer2
-    INTEGER,dimension(:),allocatable :: jj_Nb_dissip
-    INTEGER,dimension(:),allocatable :: jj_Nb_physic
-    INTEGER,dimension(:),allocatable :: jj_Nb_physic_bis
-   
-    TYPE(distrib),SAVE,TARGET :: distrib_Caldyn
-    TYPE(distrib),SAVE,TARGET :: distrib_vanleer
-    TYPE(distrib),SAVE,TARGET :: distrib_vanleer2
-    TYPE(distrib),SAVE,TARGET :: distrib_dissip
-    TYPE(distrib),SAVE,TARGET :: distrib_physic
-    TYPE(distrib),SAVE,TARGET :: distrib_physic_bis
-
-    INTEGER,dimension(:),allocatable :: distrib_phys
-  
-  contains
-  
-  subroutine AllocateBands
-    USE parallel_lmdz
-    implicit none
-    
-    allocate(jj_Nb_Caldyn(0:MPI_Size-1))
-    allocate(jj_Nb_vanleer(0:MPI_Size-1))
-    allocate(jj_Nb_vanleer2(0:MPI_Size-1))
-    allocate(jj_Nb_dissip(0:MPI_Size-1))
-    allocate(jj_Nb_physic(0:MPI_Size-1))
-    allocate(jj_Nb_physic_bis(0:MPI_Size-1))
-    allocate(distrib_phys(0:MPI_Size-1))
-  
-  end subroutine AllocateBands
-  
-  subroutine Read_distrib
-    USE parallel_lmdz
-    implicit none
-
-    include "dimensions.h"
-      integer :: i,j
-      character (len=4) :: siim,sjjm,sllm,sproc
-      character (len=255) :: filename
-      integer :: unit_number=10
-      integer :: ierr
-    
-      call AllocateBands
-      write(siim,'(i3)') iim
-      write(sjjm,'(i3)') jjm
-      write(sllm,'(i3)') llm
-      write(sproc,'(i3)') mpi_size
-      filename='Bands_'//TRIM(ADJUSTL(siim))//'x'//TRIM(ADJUSTL(sjjm))//'x'//TRIM(ADJUSTL(sllm))//'_'  &
-                        //TRIM(ADJUSTL(sproc))//'prc.dat'    
-       
-      OPEN(UNIT=unit_number,FILE=trim(filename),STATUS='old',FORM='formatted',IOSTAT=ierr)
-      
-      if (ierr==0) then
-      
-         do i=0,mpi_size-1
-          read (unit_number,*) j,jj_nb_caldyn(i)
-        enddo
-      
-        do i=0,mpi_size-1
-          read (unit_number,*) j,jj_nb_vanleer(i)
-        enddo
-      
-        do i=0,mpi_size-1
-          read (unit_number,*) j,jj_nb_dissip(i)
-        enddo
-      
-        do i=0,mpi_size-1
-          read (unit_number,*) j,distrib_phys(i)
-        enddo
-	
-	CLOSE(unit_number)  
-  
-      else
-        do i=0,mpi_size-1
-          jj_nb_caldyn(i)=(jjm+1)/mpi_size
-	  if (i<MOD(jjm+1,mpi_size)) jj_nb_caldyn(i)=jj_nb_caldyn(i)+1
-        enddo
-      
-        jj_nb_vanleer(:)=jj_nb_caldyn(:)
-        jj_nb_dissip(:)=jj_nb_caldyn(:)
-        
-	do i=0,mpi_size-1
-	  distrib_phys(i)=(iim*(jjm-1)+2)/mpi_size
-	  IF (i<MOD(iim*(jjm-1)+2,mpi_size)) distrib_phys(i)=distrib_phys(i)+1
-	enddo
-      endif
-      
-!      distrib_phys(:)=jj_nb_caldyn(:)*iim
-!      distrib_phys(0) = distrib_phys(0) - (iim-1)
-!      distrib_phys(mpi_size-1) = distrib_phys(mpi_size-1) - (iim-1)
-      
-   end subroutine Read_distrib
-   
-   
-   SUBROUTINE  Set_Bands 
-     USE parallel_lmdz
-     IMPLICIT NONE
-     INCLUDE 'dimensions.h'    
-     INTEGER :: i, ij
-     INTEGER :: jj_para_begin(0:mpi_size-1)
-     INTEGER :: jj_para_end(0:mpi_size-1)
-        
-      do i=0,mpi_size-1
-         jj_nb_vanleer2(i)=(jjm+1)/mpi_size
-	 if (i<MOD(jjm+1,mpi_size)) jj_nb_vanleer2(i)=jj_nb_vanleer2(i)+1
-      enddo
-          
-      jj_para_begin(0)=1
-      ij=distrib_phys(0)+iim-1
-      jj_para_end(0)=((ij-1)/iim)+1
-      
-      DO i=1,mpi_Size-1
-        ij=ij+1
-        jj_para_begin(i)=((ij-1)/iim)+1
-        ij=ij+distrib_phys(i)-1
-        jj_para_end(i)=((ij-1)/iim)+1
-      ENDDO
- 
-       do i=0,MPI_Size-1
-        jj_Nb_physic(i)=jj_para_end(i)-jj_para_begin(i)+1
-        if (i/=0) then
-          if (jj_para_begin(i)==jj_para_end(i-1)) then
-            jj_Nb_physic(i-1)=jj_Nb_physic(i-1)-1
-          endif
-        endif
-      enddo
-      
-      do i=0,MPI_Size-1
-        jj_Nb_physic_bis(i)=jj_para_end(i)-jj_para_begin(i)+1
-        if (i/=0) then
-          if (jj_para_begin(i)==jj_para_end(i-1)) then
-            jj_Nb_physic_bis(i)=jj_Nb_physic_bis(i)-1
-          else
-	    jj_Nb_physic_bis(i-1)=jj_Nb_physic_bis(i-1)+1
-	    jj_Nb_physic_bis(i)=jj_Nb_physic_bis(i)-1
-	  endif
-        endif
-      enddo
-
-      CALL create_distrib(jj_Nb_Caldyn,distrib_caldyn)
-      CALL create_distrib(jj_Nb_vanleer,distrib_vanleer)
-      CALL create_distrib(jj_Nb_vanleer2,distrib_vanleer2)
-      CALL create_distrib(jj_Nb_dissip,distrib_dissip)
-      CALL create_distrib(jj_Nb_physic,distrib_physic)
-      CALL create_distrib(jj_Nb_physic_bis,distrib_physic_bis)
-      
-      distrib_physic_bis%jjb_u=distrib_physic%jjb_u
-      distrib_physic_bis%jje_u=distrib_physic%jje_u
-      distrib_physic_bis%jjnb_u=distrib_physic%jjnb_u
-
-      distrib_physic_bis%ijb_u=distrib_physic%ijb_u
-      distrib_physic_bis%ije_u=distrib_physic%ije_u
-      distrib_physic_bis%ijnb_u=distrib_physic%ijnb_u
-
-      distrib_physic_bis%jjb_v=distrib_physic%jjb_v
-      distrib_physic_bis%jje_v=distrib_physic%jje_v
-      distrib_physic_bis%jjnb_v=distrib_physic%jjnb_v
-
-      distrib_physic_bis%ijb_v=distrib_physic%ijb_v
-      distrib_physic_bis%ije_v=distrib_physic%ije_v
-      distrib_physic_bis%ijnb_v=distrib_physic%ijnb_v
-     
-    end subroutine Set_Bands
-
-
-    subroutine AdjustBands_caldyn(new_dist)
-      use times
-      USE parallel_lmdz
-      implicit none
-      TYPE(distrib),INTENT(INOUT) :: new_dist
-
-      real :: minvalue,maxvalue
-      integer :: min_proc,max_proc
-      integer :: i,j
-      real,allocatable,dimension(:) :: value
-      integer,allocatable,dimension(:) :: index
-      real :: tmpvalue
-      integer :: tmpindex
-      
-      allocate(value(0:mpi_size-1))
-      allocate(index(0:mpi_size-1))
-        
-  
-      call allgather_timer_average
-
-      do i=0,mpi_size-1
-        value(i)=timer_average(jj_nb_caldyn(i),timer_caldyn,i)
-	index(i)=i
-      enddo
-      
-      do i=0,mpi_size-2
-        do j=i+1,mpi_size-1
-	  if (value(i)>value(j)) then
-	    tmpvalue=value(i)
-	    value(i)=value(j)
-	    value(j)=tmpvalue
-	    
-	    tmpindex=index(i)
-	    index(i)=index(j)
-	    index(j)=tmpindex
-	   endif
-	 enddo
-      enddo
-      
-      maxvalue=value(mpi_size-1)
-      max_proc=index(mpi_size-1)           
-           
-      do i=0,mpi_size-2
-        minvalue=value(i)
-        min_proc=index(i)
-        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
-             jj_nb_caldyn(max_proc)=jj_nb_caldyn(max_proc)-1
-	     exit
-           else
-             if (timer_average(jj_nb_caldyn(min_proc)+1,timer_caldyn,min_proc)                 &
-	        -timer_delta(jj_nb_caldyn(min_proc)+1,timer_caldyn,min_proc) < maxvalue) then
-               jj_nb_caldyn(min_proc)=jj_nb_caldyn(min_proc)+1
-               jj_nb_caldyn(max_proc)=jj_nb_caldyn(max_proc)-1
-               exit
-	     endif
-           endif
-         endif
-      enddo
-      
-      deallocate(value)
-      deallocate(index)
-      CALL create_distrib(jj_nb_caldyn,new_dist)
-        
-    end subroutine AdjustBands_caldyn
-    
-    subroutine AdjustBands_vanleer(new_dist)
-      use times
-      USE parallel_lmdz
-      implicit none
-      TYPE(distrib),INTENT(INOUT) :: new_dist
-
-      real :: minvalue,maxvalue
-      integer :: min_proc,max_proc
-      integer :: i,j
-      real,allocatable,dimension(:) :: value
-      integer,allocatable,dimension(:) :: index
-      real :: tmpvalue
-      integer :: tmpindex
-      
-      allocate(value(0:mpi_size-1))
-      allocate(index(0:mpi_size-1))
-        
-  
-      call allgather_timer_average
-
-      do i=0,mpi_size-1
-        value(i)=timer_average(jj_nb_vanleer(i),timer_vanleer,i)
-	index(i)=i
-      enddo
-      
-      do i=0,mpi_size-2
-        do j=i+1,mpi_size-1
-	  if (value(i)>value(j)) then
-	    tmpvalue=value(i)
-	    value(i)=value(j)
-	    value(j)=tmpvalue
-	    
-	    tmpindex=index(i)
-	    index(i)=index(j)
-	    index(j)=tmpindex
-	   endif
-	 enddo
-      enddo
-      
-      maxvalue=value(mpi_size-1)
-      max_proc=index(mpi_size-1)           
-           
-      do i=0,mpi_size-2
-        minvalue=value(i)
-        min_proc=index(i)
-
-        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
-             jj_nb_vanleer(min_proc)=jj_nb_vanleer(min_proc)+1
-             jj_nb_vanleer(max_proc)=jj_nb_vanleer(max_proc)-1
-	     exit
-           else
-             if (timer_average(jj_nb_vanleer(min_proc)+1,timer_vanleer,min_proc) < maxvalue) then
-               jj_nb_vanleer(min_proc)=jj_nb_vanleer(min_proc)+1
-               jj_nb_vanleer(max_proc)=jj_nb_vanleer(max_proc)-1
-               exit
-	     endif
-           endif
-         endif
-      enddo
-      
-      deallocate(value)
-      deallocate(index)
- 
-      CALL create_distrib(jj_nb_vanleer,new_dist)
-         
-    end subroutine AdjustBands_vanleer
-
-    subroutine AdjustBands_dissip(new_dist)
-      use times
-      USE parallel_lmdz
-      implicit none
-      TYPE(distrib),INTENT(INOUT) :: new_dist
-      
-      real :: minvalue,maxvalue
-      integer :: min_proc,max_proc
-      integer :: i,j
-      real,allocatable,dimension(:) :: value
-      integer,allocatable,dimension(:) :: index
-      real :: tmpvalue
-      integer :: tmpindex
-      
-      allocate(value(0:mpi_size-1))
-      allocate(index(0:mpi_size-1))
-        
-  
-      call allgather_timer_average
-
-      do i=0,mpi_size-1
-        value(i)=timer_average(jj_nb_dissip(i),timer_dissip,i)
-	index(i)=i
-      enddo
-      
-      do i=0,mpi_size-2
-        do j=i+1,mpi_size-1
-	  if (value(i)>value(j)) then
-	    tmpvalue=value(i)
-	    value(i)=value(j)
-	    value(j)=tmpvalue
-	    
-	    tmpindex=index(i)
-	    index(i)=index(j)
-	    index(j)=tmpindex
-	   endif
-	 enddo
-      enddo
-      
-      maxvalue=value(mpi_size-1)
-      max_proc=index(mpi_size-1)           
-           
-      do i=0,mpi_size-2
-        minvalue=value(i)
-        min_proc=index(i)
-
-        if (jj_nb_dissip(max_proc)>3) then
-          if (timer_iteration(jj_nb_dissip(min_proc)+1,timer_dissip,min_proc)<=1) then
-             jj_nb_dissip(min_proc)=jj_nb_dissip(min_proc)+1
-             jj_nb_dissip(max_proc)=jj_nb_dissip(max_proc)-1
-	     exit
-           else
-             if (timer_average(jj_nb_dissip(min_proc)+1,timer_dissip,min_proc)         &
-	        - timer_delta(jj_nb_dissip(min_proc)+1,timer_dissip,min_proc) < maxvalue) then
-               jj_nb_dissip(min_proc)=jj_nb_dissip(min_proc)+1
-               jj_nb_dissip(max_proc)=jj_nb_dissip(max_proc)-1
-               exit
-	     endif
-           endif
-         endif
-      enddo
-      
-      deallocate(value)
-      deallocate(index)
-  
-      CALL create_distrib(jj_nb_dissip,new_dist)
-         
-    end subroutine AdjustBands_dissip
-
-    subroutine AdjustBands_physic
-      use times
-! Ehouarn: what follows is only related to // physics
-      USE mod_phys_lmdz_para, only : klon_mpi_para_nb
-
-      USE parallel_lmdz
-      USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_PHYS
-
-      implicit none
-
-      integer :: i,Index
-      real,allocatable,dimension(:) :: value
-      integer,allocatable,dimension(:) :: Inc
-      real :: medium
-      integer :: NbTot,sgn
-      
-      allocate(value(0:mpi_size-1))
-      allocate(Inc(0:mpi_size-1))
-        
-  
-      call allgather_timer_average
-      
-      medium=0
-      do i=0,mpi_size-1
-        value(i)=timer_average(jj_nb_physic(i),timer_physic,i)
-	medium=medium+value(i)
-      enddo    
-      
-      medium=medium/mpi_size      
-      NbTot=0
-IF (CPPKEY_PHYS) THEN
-      do i=0,mpi_size-1
-        Inc(i)=nint(klon_mpi_para_nb(i)*(medium-value(i))/value(i))
-        NbTot=NbTot+Inc(i)
-      enddo
-
-      if (NbTot>=0) then
-        Sgn=1
-      else
-        Sgn=-1
-	NbTot=-NbTot
-      endif
-
-      Index=0
-      do i=1,NbTot
-        Inc(Index)=Inc(Index)-Sgn
-	Index=Index+1
-	if (Index>mpi_size-1) Index=0
-      enddo
-
-      do i=0,mpi_size-1
-        distrib_phys(i)=klon_mpi_para_nb(i)+inc(i)
-      enddo
-END IF
-         
-    end subroutine AdjustBands_physic
-
-    subroutine WriteBands
-    USE parallel_lmdz
-    implicit none
-    include "dimensions.h"
-
-      integer :: i,j
-      character (len=4) :: siim,sjjm,sllm,sproc
-      character (len=255) :: filename
-      integer :: unit_number=10
-      integer :: ierr
-  
-      write(siim,'(i3)') iim
-      write(sjjm,'(i3)') jjm
-      write(sllm,'(i3)') llm
-      write(sproc,'(i3)') mpi_size
-
-      filename='Bands_'//TRIM(ADJUSTL(siim))//'x'//TRIM(ADJUSTL(sjjm))//'x'//TRIM(ADJUSTL(sllm))//'_'  &
-                        //TRIM(ADJUSTL(sproc))//'prc.dat'    
-      
-      OPEN(UNIT=unit_number,FILE=trim(filename),STATUS='replace',FORM='formatted',IOSTAT=ierr)
-      
-      if (ierr==0) then
-        
-!	write (unit_number,*) '*** Bandes caldyn ***'
-	do i=0,mpi_size-1
-          write (unit_number,*) i,jj_nb_caldyn(i)
-        enddo
-        
-!	write (unit_number,*) '*** Bandes vanleer ***' 
-        do i=0,mpi_size-1
-          write (unit_number,*) i,jj_nb_vanleer(i)
-        enddo
-       
-!        write (unit_number,*) '*** Bandes dissip ***'
-        do i=0,mpi_size-1
-          write (unit_number,*) i,jj_nb_dissip(i)
-        enddo
-        
-	do i=0,mpi_size-1
-          write (unit_number,*) i,distrib_phys(i)
-        enddo
-	
-        CLOSE(unit_number)   
-      else 
-        print *,'probleme lors de l ecriture des bandes'
-      endif
-       
-    end subroutine WriteBands
-  
-  end module Bands
-  
-  
-
Index: LMDZ6/trunk/libf/dyn3dmem/bands.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/bands.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/bands.f90	(revision 5268)
@@ -0,0 +1,490 @@
+!
+! $Id$
+!
+  module Bands
+  USE parallel_lmdz
+    integer, parameter :: bands_caldyn=1
+    integer, parameter :: bands_vanleer=2
+    integer, parameter :: bands_dissip=3
+    
+    INTEGER,dimension(:),allocatable :: jj_Nb_Caldyn
+    INTEGER,dimension(:),allocatable :: jj_Nb_vanleer
+    INTEGER,dimension(:),allocatable :: jj_Nb_vanleer2
+    INTEGER,dimension(:),allocatable :: jj_Nb_dissip
+    INTEGER,dimension(:),allocatable :: jj_Nb_physic
+    INTEGER,dimension(:),allocatable :: jj_Nb_physic_bis
+   
+    TYPE(distrib),SAVE,TARGET :: distrib_Caldyn
+    TYPE(distrib),SAVE,TARGET :: distrib_vanleer
+    TYPE(distrib),SAVE,TARGET :: distrib_vanleer2
+    TYPE(distrib),SAVE,TARGET :: distrib_dissip
+    TYPE(distrib),SAVE,TARGET :: distrib_physic
+    TYPE(distrib),SAVE,TARGET :: distrib_physic_bis
+
+    INTEGER,dimension(:),allocatable :: distrib_phys
+  
+  contains
+  
+  subroutine AllocateBands
+    USE parallel_lmdz
+    implicit none
+    
+    allocate(jj_Nb_Caldyn(0:MPI_Size-1))
+    allocate(jj_Nb_vanleer(0:MPI_Size-1))
+    allocate(jj_Nb_vanleer2(0:MPI_Size-1))
+    allocate(jj_Nb_dissip(0:MPI_Size-1))
+    allocate(jj_Nb_physic(0:MPI_Size-1))
+    allocate(jj_Nb_physic_bis(0:MPI_Size-1))
+    allocate(distrib_phys(0:MPI_Size-1))
+  
+  end subroutine AllocateBands
+  
+  subroutine Read_distrib
+    USE parallel_lmdz
+    implicit none
+
+    include "dimensions.h"
+      integer :: i,j
+      character (len=4) :: siim,sjjm,sllm,sproc
+      character (len=255) :: filename
+      integer :: unit_number=10
+      integer :: ierr
+    
+      call AllocateBands
+      write(siim,'(i3)') iim
+      write(sjjm,'(i3)') jjm
+      write(sllm,'(i3)') llm
+      write(sproc,'(i3)') mpi_size
+      filename='Bands_'//TRIM(ADJUSTL(siim))//'x'//TRIM(ADJUSTL(sjjm))//'x'//TRIM(ADJUSTL(sllm))//'_'  &
+                        //TRIM(ADJUSTL(sproc))//'prc.dat'    
+       
+      OPEN(UNIT=unit_number,FILE=trim(filename),STATUS='old',FORM='formatted',IOSTAT=ierr)
+      
+      if (ierr==0) then
+      
+         do i=0,mpi_size-1
+          read (unit_number,*) j,jj_nb_caldyn(i)
+        enddo
+      
+        do i=0,mpi_size-1
+          read (unit_number,*) j,jj_nb_vanleer(i)
+        enddo
+      
+        do i=0,mpi_size-1
+          read (unit_number,*) j,jj_nb_dissip(i)
+        enddo
+      
+        do i=0,mpi_size-1
+          read (unit_number,*) j,distrib_phys(i)
+        enddo
+	
+	CLOSE(unit_number)  
+  
+      else
+        do i=0,mpi_size-1
+          jj_nb_caldyn(i)=(jjm+1)/mpi_size
+	  if (i<MOD(jjm+1,mpi_size)) jj_nb_caldyn(i)=jj_nb_caldyn(i)+1
+        enddo
+      
+        jj_nb_vanleer(:)=jj_nb_caldyn(:)
+        jj_nb_dissip(:)=jj_nb_caldyn(:)
+        
+	do i=0,mpi_size-1
+	  distrib_phys(i)=(iim*(jjm-1)+2)/mpi_size
+	  IF (i<MOD(iim*(jjm-1)+2,mpi_size)) distrib_phys(i)=distrib_phys(i)+1
+	enddo
+      endif
+      
+!      distrib_phys(:)=jj_nb_caldyn(:)*iim
+!      distrib_phys(0) = distrib_phys(0) - (iim-1)
+!      distrib_phys(mpi_size-1) = distrib_phys(mpi_size-1) - (iim-1)
+      
+   end subroutine Read_distrib
+   
+   
+   SUBROUTINE  Set_Bands 
+     USE parallel_lmdz
+     IMPLICIT NONE
+     INCLUDE 'dimensions.h'    
+     INTEGER :: i, ij
+     INTEGER :: jj_para_begin(0:mpi_size-1)
+     INTEGER :: jj_para_end(0:mpi_size-1)
+        
+      do i=0,mpi_size-1
+         jj_nb_vanleer2(i)=(jjm+1)/mpi_size
+	 if (i<MOD(jjm+1,mpi_size)) jj_nb_vanleer2(i)=jj_nb_vanleer2(i)+1
+      enddo
+          
+      jj_para_begin(0)=1
+      ij=distrib_phys(0)+iim-1
+      jj_para_end(0)=((ij-1)/iim)+1
+      
+      DO i=1,mpi_Size-1
+        ij=ij+1
+        jj_para_begin(i)=((ij-1)/iim)+1
+        ij=ij+distrib_phys(i)-1
+        jj_para_end(i)=((ij-1)/iim)+1
+      ENDDO
+ 
+       do i=0,MPI_Size-1
+        jj_Nb_physic(i)=jj_para_end(i)-jj_para_begin(i)+1
+        if (i/=0) then
+          if (jj_para_begin(i)==jj_para_end(i-1)) then
+            jj_Nb_physic(i-1)=jj_Nb_physic(i-1)-1
+          endif
+        endif
+      enddo
+      
+      do i=0,MPI_Size-1
+        jj_Nb_physic_bis(i)=jj_para_end(i)-jj_para_begin(i)+1
+        if (i/=0) then
+          if (jj_para_begin(i)==jj_para_end(i-1)) then
+            jj_Nb_physic_bis(i)=jj_Nb_physic_bis(i)-1
+          else
+	    jj_Nb_physic_bis(i-1)=jj_Nb_physic_bis(i-1)+1
+	    jj_Nb_physic_bis(i)=jj_Nb_physic_bis(i)-1
+	  endif
+        endif
+      enddo
+
+      CALL create_distrib(jj_Nb_Caldyn,distrib_caldyn)
+      CALL create_distrib(jj_Nb_vanleer,distrib_vanleer)
+      CALL create_distrib(jj_Nb_vanleer2,distrib_vanleer2)
+      CALL create_distrib(jj_Nb_dissip,distrib_dissip)
+      CALL create_distrib(jj_Nb_physic,distrib_physic)
+      CALL create_distrib(jj_Nb_physic_bis,distrib_physic_bis)
+      
+      distrib_physic_bis%jjb_u=distrib_physic%jjb_u
+      distrib_physic_bis%jje_u=distrib_physic%jje_u
+      distrib_physic_bis%jjnb_u=distrib_physic%jjnb_u
+
+      distrib_physic_bis%ijb_u=distrib_physic%ijb_u
+      distrib_physic_bis%ije_u=distrib_physic%ije_u
+      distrib_physic_bis%ijnb_u=distrib_physic%ijnb_u
+
+      distrib_physic_bis%jjb_v=distrib_physic%jjb_v
+      distrib_physic_bis%jje_v=distrib_physic%jje_v
+      distrib_physic_bis%jjnb_v=distrib_physic%jjnb_v
+
+      distrib_physic_bis%ijb_v=distrib_physic%ijb_v
+      distrib_physic_bis%ije_v=distrib_physic%ije_v
+      distrib_physic_bis%ijnb_v=distrib_physic%ijnb_v
+     
+    end subroutine Set_Bands
+
+
+    subroutine AdjustBands_caldyn(new_dist)
+      use times
+      USE parallel_lmdz
+      implicit none
+      TYPE(distrib),INTENT(INOUT) :: new_dist
+
+      real :: minvalue,maxvalue
+      integer :: min_proc,max_proc
+      integer :: i,j
+      real,allocatable,dimension(:) :: value
+      integer,allocatable,dimension(:) :: index
+      real :: tmpvalue
+      integer :: tmpindex
+      
+      allocate(value(0:mpi_size-1))
+      allocate(index(0:mpi_size-1))
+        
+  
+      call allgather_timer_average
+
+      do i=0,mpi_size-1
+        value(i)=timer_average(jj_nb_caldyn(i),timer_caldyn,i)
+	index(i)=i
+      enddo
+      
+      do i=0,mpi_size-2
+        do j=i+1,mpi_size-1
+	  if (value(i)>value(j)) then
+	    tmpvalue=value(i)
+	    value(i)=value(j)
+	    value(j)=tmpvalue
+	    
+	    tmpindex=index(i)
+	    index(i)=index(j)
+	    index(j)=tmpindex
+	   endif
+	 enddo
+      enddo
+      
+      maxvalue=value(mpi_size-1)
+      max_proc=index(mpi_size-1)           
+           
+      do i=0,mpi_size-2
+        minvalue=value(i)
+        min_proc=index(i)
+        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
+             jj_nb_caldyn(max_proc)=jj_nb_caldyn(max_proc)-1
+	     exit
+           else
+             if (timer_average(jj_nb_caldyn(min_proc)+1,timer_caldyn,min_proc)                 &
+	        -timer_delta(jj_nb_caldyn(min_proc)+1,timer_caldyn,min_proc) < maxvalue) then
+               jj_nb_caldyn(min_proc)=jj_nb_caldyn(min_proc)+1
+               jj_nb_caldyn(max_proc)=jj_nb_caldyn(max_proc)-1
+               exit
+	     endif
+           endif
+         endif
+      enddo
+      
+      deallocate(value)
+      deallocate(index)
+      CALL create_distrib(jj_nb_caldyn,new_dist)
+        
+    end subroutine AdjustBands_caldyn
+    
+    subroutine AdjustBands_vanleer(new_dist)
+      use times
+      USE parallel_lmdz
+      implicit none
+      TYPE(distrib),INTENT(INOUT) :: new_dist
+
+      real :: minvalue,maxvalue
+      integer :: min_proc,max_proc
+      integer :: i,j
+      real,allocatable,dimension(:) :: value
+      integer,allocatable,dimension(:) :: index
+      real :: tmpvalue
+      integer :: tmpindex
+      
+      allocate(value(0:mpi_size-1))
+      allocate(index(0:mpi_size-1))
+        
+  
+      call allgather_timer_average
+
+      do i=0,mpi_size-1
+        value(i)=timer_average(jj_nb_vanleer(i),timer_vanleer,i)
+	index(i)=i
+      enddo
+      
+      do i=0,mpi_size-2
+        do j=i+1,mpi_size-1
+	  if (value(i)>value(j)) then
+	    tmpvalue=value(i)
+	    value(i)=value(j)
+	    value(j)=tmpvalue
+	    
+	    tmpindex=index(i)
+	    index(i)=index(j)
+	    index(j)=tmpindex
+	   endif
+	 enddo
+      enddo
+      
+      maxvalue=value(mpi_size-1)
+      max_proc=index(mpi_size-1)           
+           
+      do i=0,mpi_size-2
+        minvalue=value(i)
+        min_proc=index(i)
+
+        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
+             jj_nb_vanleer(min_proc)=jj_nb_vanleer(min_proc)+1
+             jj_nb_vanleer(max_proc)=jj_nb_vanleer(max_proc)-1
+	     exit
+           else
+             if (timer_average(jj_nb_vanleer(min_proc)+1,timer_vanleer,min_proc) < maxvalue) then
+               jj_nb_vanleer(min_proc)=jj_nb_vanleer(min_proc)+1
+               jj_nb_vanleer(max_proc)=jj_nb_vanleer(max_proc)-1
+               exit
+	     endif
+           endif
+         endif
+      enddo
+      
+      deallocate(value)
+      deallocate(index)
+ 
+      CALL create_distrib(jj_nb_vanleer,new_dist)
+         
+    end subroutine AdjustBands_vanleer
+
+    subroutine AdjustBands_dissip(new_dist)
+      use times
+      USE parallel_lmdz
+      implicit none
+      TYPE(distrib),INTENT(INOUT) :: new_dist
+      
+      real :: minvalue,maxvalue
+      integer :: min_proc,max_proc
+      integer :: i,j
+      real,allocatable,dimension(:) :: value
+      integer,allocatable,dimension(:) :: index
+      real :: tmpvalue
+      integer :: tmpindex
+      
+      allocate(value(0:mpi_size-1))
+      allocate(index(0:mpi_size-1))
+        
+  
+      call allgather_timer_average
+
+      do i=0,mpi_size-1
+        value(i)=timer_average(jj_nb_dissip(i),timer_dissip,i)
+	index(i)=i
+      enddo
+      
+      do i=0,mpi_size-2
+        do j=i+1,mpi_size-1
+	  if (value(i)>value(j)) then
+	    tmpvalue=value(i)
+	    value(i)=value(j)
+	    value(j)=tmpvalue
+	    
+	    tmpindex=index(i)
+	    index(i)=index(j)
+	    index(j)=tmpindex
+	   endif
+	 enddo
+      enddo
+      
+      maxvalue=value(mpi_size-1)
+      max_proc=index(mpi_size-1)           
+           
+      do i=0,mpi_size-2
+        minvalue=value(i)
+        min_proc=index(i)
+
+        if (jj_nb_dissip(max_proc)>3) then
+          if (timer_iteration(jj_nb_dissip(min_proc)+1,timer_dissip,min_proc)<=1) then
+             jj_nb_dissip(min_proc)=jj_nb_dissip(min_proc)+1
+             jj_nb_dissip(max_proc)=jj_nb_dissip(max_proc)-1
+	     exit
+           else
+             if (timer_average(jj_nb_dissip(min_proc)+1,timer_dissip,min_proc)         &
+	        - timer_delta(jj_nb_dissip(min_proc)+1,timer_dissip,min_proc) < maxvalue) then
+               jj_nb_dissip(min_proc)=jj_nb_dissip(min_proc)+1
+               jj_nb_dissip(max_proc)=jj_nb_dissip(max_proc)-1
+               exit
+	     endif
+           endif
+         endif
+      enddo
+      
+      deallocate(value)
+      deallocate(index)
+  
+      CALL create_distrib(jj_nb_dissip,new_dist)
+         
+    end subroutine AdjustBands_dissip
+
+    subroutine AdjustBands_physic
+      use times
+! Ehouarn: what follows is only related to // physics
+      USE mod_phys_lmdz_para, only : klon_mpi_para_nb
+
+      USE parallel_lmdz
+      USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_PHYS
+
+      implicit none
+
+      integer :: i,Index
+      real,allocatable,dimension(:) :: value
+      integer,allocatable,dimension(:) :: Inc
+      real :: medium
+      integer :: NbTot,sgn
+      
+      allocate(value(0:mpi_size-1))
+      allocate(Inc(0:mpi_size-1))
+        
+  
+      call allgather_timer_average
+      
+      medium=0
+      do i=0,mpi_size-1
+        value(i)=timer_average(jj_nb_physic(i),timer_physic,i)
+	medium=medium+value(i)
+      enddo    
+      
+      medium=medium/mpi_size      
+      NbTot=0
+IF (CPPKEY_PHYS) THEN
+      do i=0,mpi_size-1
+        Inc(i)=nint(klon_mpi_para_nb(i)*(medium-value(i))/value(i))
+        NbTot=NbTot+Inc(i)
+      enddo
+
+      if (NbTot>=0) then
+        Sgn=1
+      else
+        Sgn=-1
+	NbTot=-NbTot
+      endif
+
+      Index=0
+      do i=1,NbTot
+        Inc(Index)=Inc(Index)-Sgn
+	Index=Index+1
+	if (Index>mpi_size-1) Index=0
+      enddo
+
+      do i=0,mpi_size-1
+        distrib_phys(i)=klon_mpi_para_nb(i)+inc(i)
+      enddo
+END IF
+         
+    end subroutine AdjustBands_physic
+
+    subroutine WriteBands
+    USE parallel_lmdz
+    implicit none
+    include "dimensions.h"
+
+      integer :: i,j
+      character (len=4) :: siim,sjjm,sllm,sproc
+      character (len=255) :: filename
+      integer :: unit_number=10
+      integer :: ierr
+  
+      write(siim,'(i3)') iim
+      write(sjjm,'(i3)') jjm
+      write(sllm,'(i3)') llm
+      write(sproc,'(i3)') mpi_size
+
+      filename='Bands_'//TRIM(ADJUSTL(siim))//'x'//TRIM(ADJUSTL(sjjm))//'x'//TRIM(ADJUSTL(sllm))//'_'  &
+                        //TRIM(ADJUSTL(sproc))//'prc.dat'    
+      
+      OPEN(UNIT=unit_number,FILE=trim(filename),STATUS='replace',FORM='formatted',IOSTAT=ierr)
+      
+      if (ierr==0) then
+        
+!	write (unit_number,*) '*** Bandes caldyn ***'
+	do i=0,mpi_size-1
+          write (unit_number,*) i,jj_nb_caldyn(i)
+        enddo
+        
+!	write (unit_number,*) '*** Bandes vanleer ***' 
+        do i=0,mpi_size-1
+          write (unit_number,*) i,jj_nb_vanleer(i)
+        enddo
+       
+!        write (unit_number,*) '*** Bandes dissip ***'
+        do i=0,mpi_size-1
+          write (unit_number,*) i,jj_nb_dissip(i)
+        enddo
+        
+	do i=0,mpi_size-1
+          write (unit_number,*) i,distrib_phys(i)
+        enddo
+	
+        CLOSE(unit_number)   
+      else 
+        print *,'probleme lors de l ecriture des bandes'
+      endif
+       
+    end subroutine WriteBands
+  
+  end module Bands
+  
+  
+
Index: LMDZ6/trunk/libf/dyn3dmem/bilan_dyn_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/bilan_dyn_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,843 +1,0 @@
-!
-! $Id: bilan_dyn_p.F 1299 2010-01-20 14:27:21Z fairhead $
-!
-SUBROUTINE bilan_dyn_loc (ntrac,dt_app,dt_cum, &
-        ps,masse,pk,flux_u,flux_v,teta,phi,ucov,vcov,trac)
-
-  !   AFAIRE
-  !   Prevoir en champ nq+1 le diagnostique de l'energie
-  !   en faisant Qzon=Cv T + L * ...
-  !             vQ..A=Cp T + L * ...
-
-  USE IOIPSL
-  USE parallel_lmdz
-  USE mod_hallo
-  use misc_mod
-  USE write_field_loc
-  USE comconst_mod, ONLY: cpp, pi
-  USE comvert_mod, ONLY: presnivs
-  USE temps_mod, ONLY: annee_ref, day_ref, itau_dyn
-
-  IMPLICIT NONE
-
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom2.h"
-  include "iniprint.h"
-
-  !====================================================================
-  !
-  !   Sous-programme consacre � des diagnostics dynamiques de base
-  !
-  !
-  !   De facon generale, les moyennes des scalaires Q sont ponderees par
-  !   la masse.
-  !
-  !   Les flux de masse sont eux simplement moyennes.
-  !
-  !====================================================================
-
-  !   Arguments :
-  !   ===========
-
-  integer :: ntrac
-  real :: dt_app,dt_cum
-  real :: ps(iip1,jjb_u:jje_u)
-  real :: masse(iip1,jjb_u:jje_u,llm),pk(iip1,jjb_u:jje_u,llm)
-  real :: flux_u(iip1,jjb_u:jje_u,llm)
-  real :: flux_v(iip1,jjb_v:jje_v,llm)
-  real :: teta(iip1,jjb_u:jje_u,llm)
-  real :: phi(iip1,jjb_u:jje_u,llm)
-  real :: ucov(iip1,jjb_u:jje_u,llm)
-  real :: vcov(iip1,jjb_v:jje_v,llm)
-  real :: trac(iip1,jjb_u:jje_u,llm,ntrac)
-
-  !   Local :
-  !   =======
-
-  integer,SAVE :: icum,ncum
-!$OMP THREADPRIVATE(icum,ncum)
-  LOGICAL,SAVE :: first=.TRUE.
-!$OMP THREADPRIVATE(first)
-
-  real :: zz,zqy
-  REAl,SAVE,ALLOCATABLE :: zfactv(:,:)
-
-  INTEGER,PARAMETER :: nQ=7
-
-
-  !ym      character*6 nom(nQ)
-  !ym      character*6 unites(nQ)
-  character(len=6),save :: nom(nQ)
-  character(len=6),save :: unites(nQ)
-
-  character(len=10) file
-  integer :: ifile
-  parameter (ifile=4)
-
-  integer,PARAMETER :: itemp=1,igeop=2,iecin=3,iang=4,iu=5
-  INTEGER,PARAMETER :: iovap=6,iun=7
-  integer,PARAMETER :: i_sortie=1
-
-  real,SAVE :: time=0.
-  integer,SAVE :: itau=0.
-!$OMP THREADPRIVATE(time,itau)
-
-  real :: ww
-
-  !   variables dynamiques interm�diaires
-  REAL,SAVE,ALLOCATABLE :: vcont(:,:,:),ucont(:,:,:)
-  REAL,SAVE,ALLOCATABLE :: ang(:,:,:),unat(:,:,:)
-  REAL,SAVE,ALLOCATABLE :: massebx(:,:,:),masseby(:,:,:)
-  REAL,SAVE,ALLOCATABLE :: vorpot(:,:,:)
-  REAL,SAVE,ALLOCATABLE :: w(:,:,:),ecin(:,:,:),convm(:,:,:)
-  REAL,SAVE,ALLOCATABLE :: bern(:,:,:)
-
-  !   champ contenant les scalaires advect�s.
-  real,SAVE,ALLOCATABLE :: Q(:,:,:,:)
-
-  !   champs cumul�s
-  real,SAVE,ALLOCATABLE ::  ps_cum(:,:)
-  real,SAVE,ALLOCATABLE ::  masse_cum(:,:,:)
-  real,SAVE,ALLOCATABLE ::  flux_u_cum(:,:,:)
-  real,SAVE,ALLOCATABLE ::  flux_v_cum(:,:,:)
-  real,SAVE,ALLOCATABLE ::  Q_cum(:,:,:,:)
-  real,SAVE,ALLOCATABLE ::  flux_uQ_cum(:,:,:,:)
-  real,SAVE,ALLOCATABLE ::  flux_vQ_cum(:,:,:,:)
-  real,SAVE,ALLOCATABLE ::  flux_wQ_cum(:,:,:,:)
-  real,SAVE,ALLOCATABLE ::  dQ(:,:,:,:)
-
-
-  !   champs de tansport en moyenne zonale
-  integer :: ntr,itr
-  parameter (ntr=5)
-
-  !ym      character*10 znom(ntr,nQ)
-  !ym      character*20 znoml(ntr,nQ)
-  !ym      character*10 zunites(ntr,nQ)
-  character*10,save :: znom(ntr,nQ)
-  character*20,save :: znoml(ntr,nQ)
-  character*10,save :: zunites(ntr,nQ)
-
-  INTEGER,PARAMETER :: iave=1,itot=2,immc=3,itrs=4,istn=5
-
-  character(len=3) :: ctrs(ntr)
-  data ctrs/'  ','TOT','MMC','TRS','STN'/
-
-  real,SAVE,ALLOCATABLE ::  zvQ(:,:,:,:),zvQtmp(:,:)
-  real,SAVE,ALLOCATABLE ::  zavQ(:,:,:),psiQ(:,:,:)
-  real,SAVE,ALLOCATABLE ::  zmasse(:,:),zamasse(:)
-
-  real,SAVE,ALLOCATABLE ::  zv(:,:),psi(:,:)
-
-  integer :: i,j,l,iQ
-
-
-  !   Initialisation du fichier contenant les moyennes zonales.
-  !   ---------------------------------------------------------
-
-  character(len=10) :: infile
-
-  integer, save :: fileid
-  integer :: thoriid, zvertiid
-
-  INTEGER,SAVE,ALLOCATABLE :: ndex3d(:)
-
-  !   Variables locales
-  !
-  integer :: tau0
-  real :: zjulian
-  character(len=3) :: str
-  character(len=10) :: ctrac
-  integer :: ii,jj
-  integer :: zan, dayref
-  !
-  real,SAVE,ALLOCATABLE :: rlong(:),rlatg(:)
-  integer :: jjb,jje,jjn,ijb,ije
-  type(Request),SAVE :: Req
-!$OMP THREADPRIVATE(Req)
-
-  ! definition du domaine d'ecriture pour le rebuild
-
-  INTEGER,DIMENSION(1) :: ddid
-  INTEGER,DIMENSION(1) :: dsg
-  INTEGER,DIMENSION(1) :: dsl
-  INTEGER,DIMENSION(1) :: dpf
-  INTEGER,DIMENSION(1) :: dpl
-  INTEGER,DIMENSION(1) :: dhs
-  INTEGER,DIMENSION(1) :: dhe
-
-  INTEGER :: bilan_dyn_domain_id
-
-  !=====================================================================
-  !   Initialisation
-  !=====================================================================
-  if (adjust) return
-
-  time=time+dt_app
-  itau=itau+1
-
-  if (first) then
-!$OMP BARRIER
-!$OMP MASTER
-  ALLOCATE(zfactv(jjb_v:jje_v,llm))
-  ALLOCATE(vcont(iip1,jjb_v:jje_v,llm))
-  ALLOCATE(ucont(iip1,jjb_u:jje_u,llm))
-  ALLOCATE(ang(iip1,jjb_u:jje_u,llm))
-  ALLOCATE(unat(iip1,jjb_u:jje_u,llm))
-  ALLOCATE(massebx(iip1,jjb_u:jje_u,llm))
-  ALLOCATE(masseby(iip1,jjb_v:jje_v,llm))
-  ALLOCATE(vorpot(iip1,jjb_v:jje_v,llm))
-  ALLOCATE(w(iip1,jjb_u:jje_u,llm))
-  ALLOCATE(ecin(iip1,jjb_u:jje_u,llm))
-  ALLOCATE(convm(iip1,jjb_u:jje_u,llm))
-  ALLOCATE(bern(iip1,jjb_u:jje_u,llm))
-  ALLOCATE(Q(iip1,jjb_u:jje_u,llm,nQ))
-  ALLOCATE(ps_cum(iip1,jjb_u:jje_u))
-  ALLOCATE(masse_cum(iip1,jjb_u:jje_u,llm))
-  ALLOCATE(flux_u_cum(iip1,jjb_u:jje_u,llm))
-  ALLOCATE(flux_v_cum(iip1,jjb_v:jje_v,llm))
-  ALLOCATE(Q_cum(iip1,jjb_u:jje_u,llm,nQ))
-  ALLOCATE(flux_uQ_cum(iip1,jjb_u:jje_u,llm,nQ))
-  ALLOCATE(flux_vQ_cum(iip1,jjb_v:jje_v,llm,nQ))
-  ALLOCATE(flux_wQ_cum(iip1,jjb_u:jje_u,llm,nQ))
-  ALLOCATE(dQ(iip1,jjb_u:jje_u,llm,nQ))
-  ALLOCATE(zvQ(jjb_v:jje_v,llm,ntr,nQ))
-  ALLOCATE(zvQtmp(jjb_v:jje_v,llm))
-  ALLOCATE(zavQ(jjb_v:jje_v,ntr,nQ))
-  ALLOCATE(psiQ(jjb_v:jje_v,llm+1,nQ))
-  ALLOCATE(zmasse(jjb_v:jje_v,llm))
-  ALLOCATE(zamasse(jjb_v:jje_v))
-  ALLOCATE(zv(jjb_v:jje_v,llm))
-  ALLOCATE(psi(jjb_v:jje_v,llm+1))
-  ALLOCATE(ndex3d(jjb_v:jje_v*llm))
-  ndex3d=0
-  ALLOCATE(rlong(1))
-  ALLOCATE(rlatg(jjm))
-
-!$OMP END MASTER
-!$OMP BARRIER
-    icum=0
-    ! initialisation des fichiers
-    first=.false.
-  !   ncum est la frequence de stokage en pas de temps
-    ncum=dt_cum/dt_app
-    if (abs(ncum*dt_app-dt_cum).gt.1.e-5*dt_app) then
-       WRITE(lunout,*) &
-             'Pb : le pas de cumule doit etre multiple du pas'
-       WRITE(lunout,*)'dt_app=',dt_app
-       WRITE(lunout,*)'dt_cum=',dt_cum
-       CALL abort_gcm("conf_gcmbilan_dyn_loc","stopped",1)
-    endif
-
-!$OMP MASTER
-    nom(itemp)='T'
-    nom(igeop)='gz'
-    nom(iecin)='K'
-    nom(iang)='ang'
-    nom(iu)='u'
-    nom(iovap)='ovap'
-    nom(iun)='un'
-
-    unites(itemp)='K'
-    unites(igeop)='m2/s2'
-    unites(iecin)='m2/s2'
-    unites(iang)='ang'
-    unites(iu)='m/s'
-    unites(iovap)='kg/kg'
-    unites(iun)='un'
-
-
-  !   Initialisation du fichier contenant les moyennes zonales.
-  !   ---------------------------------------------------------
-
-  infile='dynzon'
-
-  zan = annee_ref
-  dayref = day_ref
-  CALL ymds2ju(zan, 1, dayref, 0.0, zjulian)
-  tau0 = itau_dyn
-
-  rlong=0.
-  rlatg=rlatv*180./pi
-
-  jjb=jj_begin
-  jje=jj_end
-  jjn=jj_nb
-  IF (pole_sud) THEN
-    jjn=jj_nb-1
-    jje=jj_end-1
-  ENDIF
-
-  ddid=(/ 2 /)
-  dsg=(/ jjm /)
-  dsl=(/ jjn /)
-  dpf=(/ jjb /)
-  dpl=(/ jje /)
-  dhs=(/ 0 /)
-  dhe=(/ 0 /)
-
-  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
-        'box',bilan_dyn_domain_id)
-
-  call histbeg(trim(infile), &
-        1, rlong, jjn, rlatg(jjb:jje), &
-        1, 1, 1, jjn, &
-        tau0, zjulian, dt_cum, thoriid, fileid, &
-        bilan_dyn_domain_id)
-
-  !
-  !  Appel a histvert pour la grille verticale
-  !
-  call histvert(fileid, 'presnivs', 'Niveaux sigma','mb', &
-        llm, presnivs, zvertiid)
-  !
-  !  Appels a histdef pour la definition des variables a sauvegarder
-  do iQ=1,nQ
-     do itr=1,ntr
-        if(itr.eq.1) then
-           znom(itr,iQ)=nom(iQ)
-           znoml(itr,iQ)=nom(iQ)
-           zunites(itr,iQ)=unites(iQ)
-        else
-           znom(itr,iQ)=ctrs(itr)//'v'//nom(iQ)
-           znoml(itr,iQ)='transport : v * '//nom(iQ)//' '//ctrs(itr)
-           zunites(itr,iQ)='m/s * '//unites(iQ)
-        endif
-     enddo
-  enddo
-
-  !   Declarations des champs avec dimension verticale
-   ! print*,'1HISTDEF'
-  do iQ=1,nQ
-     do itr=1,ntr
-  IF (prt_level > 5) &
-        WRITE(lunout,*)'var ',itr,iQ &
-        ,znom(itr,iQ),znoml(itr,iQ),zunites(itr,iQ)
-        call histdef(fileid,znom(itr,iQ),znoml(itr,iQ), &
-              zunites(itr,iQ),1,jjn,thoriid,llm,1,llm,zvertiid, &
-              32,'ave(X)',dt_cum,dt_cum)
-     enddo
-  !   Declarations pour les fonctions de courant
-   ! print*,'2HISTDEF'
-      call histdef(fileid,'psi'//nom(iQ) &
-            ,'stream fn. '//znoml(itot,iQ), &
-            zunites(itot,iQ),1,jjn,thoriid,llm,1,llm,zvertiid, &
-            32,'ave(X)',dt_cum,dt_cum)
-  enddo
-
-
-  !   Declarations pour les champs de transport d'air
-   ! print*,'3HISTDEF'
-  call histdef(fileid, 'masse', 'masse', &
-        'kg', 1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'ave(X)', dt_cum, dt_cum)
-  call histdef(fileid, 'v', 'v', &
-        'm/s', 1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'ave(X)', dt_cum, dt_cum)
-  !   Declarations pour les fonctions de courant
-   ! print*,'4HISTDEF'
-      call histdef(fileid,'psi','stream fn. MMC ','mega t/s', &
-            1,jjn,thoriid,llm,1,llm,zvertiid, &
-            32,'ave(X)',dt_cum,dt_cum)
-
-
-  !   Declaration des champs 1D de transport en latitude
-   ! print*,'5HISTDEF'
-  do iQ=1,nQ
-     do itr=2,ntr
-        call histdef(fileid,'a'//znom(itr,iQ),znoml(itr,iQ), &
-              zunites(itr,iQ),1,jjn,thoriid,1,1,1,-99, &
-              32,'ave(X)',dt_cum,dt_cum)
-     enddo
-  enddo
-
-
-   ! print*,'8HISTDEF'
-           CALL histend(fileid)
-
-!$OMP END MASTER
-  endif
-
-
-  !=====================================================================
-  !   Calcul des champs dynamiques
-  !   ----------------------------
-
-  jjb=jj_begin
-  jje=jj_end
-
-  !   �nergie cin�tique
-   ! ucont(:,jjb:jje,:)=0
-
-  call Register_Hallo_u(ucov,llm,1,1,1,1,Req)
-  call Register_Hallo_v(vcov,llm,1,1,1,1,Req)
-  call SendRequest(Req)
-!$OMP BARRIER
-  call WaitRequest(Req)
-
-  CALL covcont_loc(llm,ucov,vcov,ucont,vcont)
-  CALL enercin_loc(vcov,ucov,vcont,ucont,ecin)
-
-  !   moment cin�tique
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  do l=1,llm
-     ang(:,jjb:jje,l)=ucov(:,jjb:jje,l)+constang(:,jjb:jje)
-     unat(:,jjb:jje,l)=ucont(:,jjb:jje,l)*cu(:,jjb:jje)
-  enddo
-!$OMP END DO NOWAIT
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-    Q(:,jjb:jje,l,itemp)=teta(:,jjb:jje,l)*pk(:,jjb:jje,l)/cpp
-    Q(:,jjb:jje,l,igeop)=phi(:,jjb:jje,l)
-    Q(:,jjb:jje,l,iecin)=ecin(:,jjb:jje,l)
-    Q(:,jjb:jje,l,iang)=ang(:,jjb:jje,l)
-    Q(:,jjb:jje,l,iu)=unat(:,jjb:jje,l)
-    Q(:,jjb:jje,l,iovap)=trac(:,jjb:jje,l,1)
-    Q(:,jjb:jje,l,iun)=1.
-  ENDDO
-!$OMP END DO NOWAIT
-
-  !=====================================================================
-  !   Cumul
-  !=====================================================================
-  !
-  if(icum.EQ.0) then
-     jjb=jj_begin
-     jje=jj_end
-
-!$OMP MASTER
-     ps_cum(:,jjb:jje)=0.
-!$OMP END MASTER
-
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    DO l=1,llm
-      masse_cum(:,jjb:jje,l)=0.
-      flux_u_cum(:,jjb:jje,l)=0.
-      Q_cum(:,jjb:jje,l,:)=0.
-      flux_uQ_cum(:,jjb:jje,l,:)=0.
-      if (pole_sud) jje=jj_end-1
-      flux_v_cum(:,jjb:jje,l)=0.
-      flux_vQ_cum(:,jjb:jje,l,:)=0.
-    ENDDO
-!$OMP END DO NOWAIT
-  endif
-
-  IF (prt_level > 5) &
-        WRITE(lunout,*)'dans bilan_dyn ',icum,'->',icum+1
-  icum=icum+1
-
-  !   accumulation des flux de masse horizontaux
-  jjb=jj_begin
-  jje=jj_end
-
-!$OMP MASTER
-  ps_cum(:,jjb:jje)=ps_cum(:,jjb:jje)+ps(:,jjb:jje)
-!$OMP END MASTER
-
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-    masse_cum(:,jjb:jje,l)=masse_cum(:,jjb:jje,l)+masse(:,jjb:jje,l)
-    flux_u_cum(:,jjb:jje,l)=flux_u_cum(:,jjb:jje,l) &
-          +flux_u(:,jjb:jje,l)
-  ENDDO
-!$OMP END DO NOWAIT
-
-  if (pole_sud) jje=jj_end-1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-   flux_v_cum(:,jjb:jje,l)=flux_v_cum(:,jjb:jje,l) &
-         +flux_v(:,jjb:jje,l)
-  ENDDO
-!$OMP END DO NOWAIT
-
-  jjb=jj_begin
-  jje=jj_end
-
-  do iQ=1,nQ
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    DO l=1,llm
-      Q_cum(:,jjb:jje,l,iQ)=Q_cum(:,jjb:jje,l,iQ) &
-            +Q(:,jjb:jje,l,iQ)*masse(:,jjb:jje,l)
-    ENDDO
-!$OMP END DO NOWAIT
-  enddo
-
-  !=====================================================================
-  !  FLUX ET TENDANCES
-  !=====================================================================
-
-  !   Flux longitudinal
-  !   -----------------
-  do iQ=1,nQ
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-     do l=1,llm
-        do j=jjb,jje
-           do i=1,iim
-              flux_uQ_cum(i,j,l,iQ)=flux_uQ_cum(i,j,l,iQ) &
-                    +flux_u(i,j,l)*0.5*(Q(i,j,l,iQ)+Q(i+1,j,l,iQ))
-           enddo
-           flux_uQ_cum(iip1,j,l,iQ)=flux_uQ_cum(1,j,l,iQ)
-        enddo
-     enddo
-!$OMP END DO NOWAIT
-  enddo
-
-  !    flux m�ridien
-  !    -------------
-  do iQ=1,nQ
-    call Register_Hallo_u(Q(1,jjb_u,1,iQ),llm,0,1,1,0,Req)
-  enddo
-  call SendRequest(Req)
-!$OMP BARRIER
-  call WaitRequest(Req)
-
-  jjb=jj_begin
-  jje=jj_end
-  if (pole_sud) jje=jj_end-1
-
-  do iQ=1,nQ
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-     do l=1,llm
-        do j=jjb,jje
-           do i=1,iip1
-              flux_vQ_cum(i,j,l,iQ)=flux_vQ_cum(i,j,l,iQ) &
-                    +flux_v(i,j,l)*0.5*(Q(i,j,l,iQ)+Q(i,j+1,l,iQ))
-           enddo
-        enddo
-     enddo
-!$OMP ENDDO NOWAIT
-!$OMP BARRIER
-  enddo
-
-  !    tendances
-  !    ---------
-
-  !   convergence horizontale
-  call Register_Hallo_u(flux_uQ_cum,llm,2,2,2,2,Req)
-  call Register_Hallo_v(flux_vQ_cum,llm,2,2,2,2,Req)
-  call SendRequest(Req)
-!$OMP BARRIER
-  call WaitRequest(Req)
-
-  call  convflu_loc(flux_uQ_cum,flux_vQ_cum,llm*nQ,dQ)
-
-  !   calcul de la vitesse verticale
-  call Register_Hallo_u(flux_u_cum,llm,2,2,2,2,Req)
-  call Register_Hallo_v(flux_v_cum,llm,2,2,2,2,Req)
-  call SendRequest(Req)
-!$OMP BARRIER
-  call WaitRequest(Req)
-
-  call convmas_loc(flux_u_cum,flux_v_cum,convm)
-  CALL vitvert_loc(convm,w)
-!$OMP BARRIER
-
-
-  jjb=jj_begin
-  jje=jj_end
-
-   ! do iQ=1,nQ
-   !    do l=1,llm-1
-   !       do j=jjb,jje
-   !          do i=1,iip1
-   !             ww=-0.5*w(i,j,l+1)*(Q(i,j,l,iQ)+Q(i,j,l+1,iQ))
-   !             dQ(i,j,l  ,iQ)=dQ(i,j,l  ,iQ)-ww
-   !             dQ(i,j,l+1,iQ)=dQ(i,j,l+1,iQ)+ww
-   !          enddo
-   !       enddo
-   !     enddo
-   !  enddo
-
-  do iQ=1,nQ
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-     do l=1,llm
-        IF (l<llm) THEN
-          do j=jjb,jje
-             do i=1,iip1
-                ww=-0.5*w(i,j,l+1)*(Q(i,j,l,iQ)+Q(i,j,l+1,iQ))
-                dQ(i,j,l  ,iQ)=dQ(i,j,l  ,iQ)-ww
-                dQ(i,j,l+1,iQ)=dQ(i,j,l+1,iQ)+ww
-             enddo
-          enddo
-        ENDIF
-        IF (l>2) THEN
-          do j=jjb,jje
-            do i=1,iip1
-              ww=-0.5*w(i,j,l)*(Q(i,j,l-1,iQ)+Q(i,j,l,iQ))
-              dQ(i,j,l,iQ)=dQ(i,j,l,iQ)+ww
-            enddo
-          enddo
-        ENDIF
-     enddo
-!$OMP ENDDO NOWAIT
-  enddo
-  IF (prt_level > 5) &
-        WRITE(lunout,*)'Apres les calculs fait a chaque pas'
-  !=====================================================================
-  !   PAS DE TEMPS D'ECRITURE
-  !=====================================================================
-  if (icum.eq.ncum) then
-  !=====================================================================
-
-  IF (prt_level > 5) &
-        WRITE(lunout,*)'Pas d ecriture'
-
-  jjb=jj_begin
-  jje=jj_end
-
-  !   Normalisation
-  do iQ=1,nQ
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    do l=1,llm
-      Q_cum(:,jjb:jje,l,iQ)=Q_cum(:,jjb:jje,l,iQ) &
-            /masse_cum(:,jjb:jje,l)
-    enddo
-!$OMP ENDDO NOWAIT
-  enddo
-
-  zz=1./REAL(ncum)
-
-!$OMP MASTER
-    ps_cum(:,jjb:jje)=ps_cum(:,jjb:jje)*zz
-!$OMP END MASTER
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-    masse_cum(:,jjb:jje,l)=masse_cum(:,jjb:jje,l)*zz
-    flux_u_cum(:,jjb:jje,l)=flux_u_cum(:,jjb:jje,l)*zz
-    flux_uQ_cum(:,jjb:jje,l,:)=flux_uQ_cum(:,jjb:jje,l,:)*zz
-    dQ(:,jjb:jje,l,:)=dQ(:,jjb:jje,l,:)*zz
-  ENDDO
-!$OMP ENDDO NOWAIT
-
-  IF (pole_sud) jje=jj_end-1
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-    flux_v_cum(:,jjb:jje,l)=flux_v_cum(:,jjb:jje,l)*zz
-    flux_vQ_cum(:,jjb:jje,l,:)=flux_vQ_cum(:,jjb:jje,l,:)*zz
-  ENDDO
-!$OMP ENDDO NOWAIT
-!$OMP BARRIER
-
-  jjb=jj_begin
-  jje=jj_end
-
-
-  !   A retravailler eventuellement
-  !   division de dQ par la masse pour revenir aux bonnes grandeurs
-  do iQ=1,nQ
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    DO l=1,llm
-       dQ(:,jjb:jje,l,iQ)=dQ(:,jjb:jje,l,iQ)/masse_cum(:,jjb:jje,l)
-    ENDDO
-!$OMP ENDDO NOWAIT
-  enddo
-
-  !=====================================================================
-  !   Transport m�ridien
-  !=====================================================================
-
-  !   cumul zonal des masses des mailles
-  !   ----------------------------------
-  jjb=jj_begin
-  jje=jj_end
-  if (pole_sud) jje=jj_end-1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    DO l=1,llm
-      zv(jjb:jje,l)=0.
-      zmasse(jjb:jje,l)=0.
-    ENDDO
-!$OMP ENDDO NOWAIT
-!$OMP BARRIER
-
-  call Register_Hallo_u(masse_cum,llm,1,1,1,1,Req)
-  do iQ=1,nQ
-    call Register_Hallo_u(Q_cum(1,jjb_u,1,iQ),llm,0,1,1,0,Req)
-  enddo
-
-  call SendRequest(Req)
-!$OMP BARRIER
-  call WaitRequest(Req)
-
-  call massbar_loc(masse_cum,massebx,masseby)
-
-  jjb=jj_begin
-  jje=jj_end
-  if (pole_sud) jje=jj_end-1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  do l=1,llm
-     do j=jjb,jje
-        do i=1,iim
-           zmasse(j,l)=zmasse(j,l)+masseby(i,j,l)
-           zv(j,l)=zv(j,l)+flux_v_cum(i,j,l)
-        enddo
-        zfactv(j,l)=cv(1,j)/zmasse(j,l)
-     enddo
-  enddo
-!$OMP ENDDO NOWAIT
-!$OMP BARRIER
-
-  ! print*,'3OK'
-  !   --------------------------------------------------------------
-  !   calcul de la moyenne zonale du transport :
-  !   ------------------------------------------
-  !
-  !                                 --
-  ! TOT : la circulation totale       [ vq ]
-  !
-  !                                  -     -
-  ! MMC : mean meridional circulation [ v ] [ q ]
-  !
-  !                                 ----      --       - -
-  ! TRS : transitoires                [ v'q'] = [ vq ] - [ v q ]
-  !
-  !                                 - * - *       - -       -     -
-  ! STT : stationaires                [ v   q   ] = [ v q ] - [ v ] [ q ]
-  !
-  !                                          - -
-  !    on utilise aussi l'intermediaire TMP :  [ v q ]
-  !
-  !    la variable zfactv transforme un transport meridien cumule
-  !    en kg/s * unte-du-champ-transporte en m/s * unite-du-champ-transporte
-  !
-  !   --------------------------------------------------------------
-
-
-  !   ----------------------------------------
-  !   Transport dans le plan latitude-altitude
-  !   ----------------------------------------
-
-  jjb=jj_begin
-  jje=jj_end
-  if (pole_sud) jje=jj_end-1
-
-  zvQ=0.
-  psiQ=0.
-  do iQ=1,nQ
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-     do l=1,llm
-        zvQtmp(:,l)=0.
-        do j=jjb,jje
-           ! print*,'j,l,iQ=',j,l,iQ
-  !   Calcul des moyennes zonales du transort total et de zvQtmp
-           do i=1,iim
-              zvQ(j,l,itot,iQ)=zvQ(j,l,itot,iQ) &
-                    +flux_vQ_cum(i,j,l,iQ)
-              zqy=      0.5*(Q_cum(i,j,l,iQ)*masse_cum(i,j,l)+ &
-                    Q_cum(i,j+1,l,iQ)*masse_cum(i,j+1,l))
-              zvQtmp(j,l)=zvQtmp(j,l)+flux_v_cum(i,j,l)*zqy &
-                    /(0.5*(masse_cum(i,j,l)+masse_cum(i,j+1,l)))
-              zvQ(j,l,iave,iQ)=zvQ(j,l,iave,iQ)+zqy
-           enddo
-           ! print*,'aOK'
-  !   Decomposition
-           zvQ(j,l,iave,iQ)=zvQ(j,l,iave,iQ)/zmasse(j,l)
-           zvQ(j,l,itot,iQ)=zvQ(j,l,itot,iQ)*zfactv(j,l)
-           zvQtmp(j,l)=zvQtmp(j,l)*zfactv(j,l)
-           zvQ(j,l,immc,iQ)=zv(j,l)*zvQ(j,l,iave,iQ)*zfactv(j,l)
-           zvQ(j,l,itrs,iQ)=zvQ(j,l,itot,iQ)-zvQtmp(j,l)
-           zvQ(j,l,istn,iQ)=zvQtmp(j,l)-zvQ(j,l,immc,iQ)
-        enddo
-     enddo
-!$OMP ENDDO NOWAIT
-  !   fonction de courant meridienne pour la quantite Q
-!$OMP BARRIER
-!$OMP MASTER
-     do l=llm,1,-1
-        do j=jjb,jje
-           psiQ(j,l,iQ)=psiQ(j,l+1,iQ)+zvQ(j,l,itot,iQ)
-        enddo
-     enddo
-!$OMP END MASTER
-!$OMP BARRIER
-  enddo
-
-  !   fonction de courant pour la circulation meridienne moyenne
-!$OMP BARRIER
-!$OMP MASTER
-  psi(jjb:jje,:)=0.
-  do l=llm,1,-1
-     do j=jjb,jje
-        psi(j,l)=psi(j,l+1)+zv(j,l)
-        zv(j,l)=zv(j,l)*zfactv(j,l)
-     enddo
-  enddo
-!$OMP END MASTER
-!$OMP BARRIER
-
-  ! print*,'4OK'
-  !   sorties proprement dites
-!$OMP MASTER
-  if (i_sortie.eq.1) then
-  jjb=jj_begin
-  jje=jj_end
-  jjn=jj_nb
-  if (pole_sud) jje=jj_end-1
-  if (pole_sud) jjn=jj_nb-1
-  do iQ=1,nQ
-     do itr=1,ntr
-        call histwrite(fileid,znom(itr,iQ),itau, &
-              zvQ(jjb:jje,:,itr,iQ) &
-              ,jjn*llm,ndex3d)
-     enddo
-     call histwrite(fileid,'psi'//nom(iQ), &
-           itau,psiQ(jjb:jje,1:llm,iQ) &
-           ,jjn*llm,ndex3d)
-  enddo
-
-  call histwrite(fileid,'masse',itau,zmasse(jjb:jje,1:llm) &
-        ,jjn*llm,ndex3d)
-  call histwrite(fileid,'v',itau,zv(jjb:jje,1:llm) &
-        ,jjn*llm,ndex3d)
-  psi(jjb:jje,:)=psi(jjb:jje,:)*1.e-9
-  call histwrite(fileid,'psi',itau,psi(jjb:jje,1:llm), &
-        jjn*llm,ndex3d)
-
-  endif
-
-
-  !   -----------------
-  !   Moyenne verticale
-  !   -----------------
-
-  zamasse(jjb:jje)=0.
-  do l=1,llm
-     zamasse(jjb:jje)=zamasse(jjb:jje)+zmasse(jjb:jje,l)
-  enddo
-
-  zavQ(jjb:jje,:,:)=0.
-  do iQ=1,nQ
-     do itr=2,ntr
-        do l=1,llm
-           zavQ(jjb:jje,itr,iQ)=zavQ(jjb:jje,itr,iQ) &
-                 +zvQ(jjb:jje,l,itr,iQ) &
-                 *zmasse(jjb:jje,l)
-        enddo
-        zavQ(jjb:jje,itr,iQ)=zavQ(jjb:jje,itr,iQ)/zamasse(jjb:jje)
-        call histwrite(fileid,'a'//znom(itr,iQ),itau, &
-              zavQ(jjb:jje,itr,iQ),jjn*llm,ndex3d)
-     enddo
-  enddo
-!$OMP END MASTER
-  ! on doit pouvoir tracer systematiquement la fonction de courant.
-
-  !=====================================================================
-  !/////////////////////////////////////////////////////////////////////
-  icum=0                  !///////////////////////////////////////
-  endif ! icum.eq.ncum    !///////////////////////////////////////
-  !/////////////////////////////////////////////////////////////////////
-  !=====================================================================
-!$OMP MASTER
-  call histsync(fileid)
-!$OMP END MASTER
-
-
-  return
-end subroutine bilan_dyn_loc
Index: LMDZ6/trunk/libf/dyn3dmem/bilan_dyn_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/bilan_dyn_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/bilan_dyn_loc.f90	(revision 5268)
@@ -0,0 +1,843 @@
+!
+! $Id: bilan_dyn_p.F 1299 2010-01-20 14:27:21Z fairhead $
+!
+SUBROUTINE bilan_dyn_loc (ntrac,dt_app,dt_cum, &
+        ps,masse,pk,flux_u,flux_v,teta,phi,ucov,vcov,trac)
+
+  !   AFAIRE
+  !   Prevoir en champ nq+1 le diagnostique de l'energie
+  !   en faisant Qzon=Cv T + L * ...
+  !             vQ..A=Cp T + L * ...
+
+  USE IOIPSL
+  USE parallel_lmdz
+  USE mod_hallo
+  use misc_mod
+  USE write_field_loc
+  USE comconst_mod, ONLY: cpp, pi
+  USE comvert_mod, ONLY: presnivs
+  USE temps_mod, ONLY: annee_ref, day_ref, itau_dyn
+
+  IMPLICIT NONE
+
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom2.h"
+  include "iniprint.h"
+
+  !====================================================================
+  !
+  !   Sous-programme consacre � des diagnostics dynamiques de base
+  !
+  !
+  !   De facon generale, les moyennes des scalaires Q sont ponderees par
+  !   la masse.
+  !
+  !   Les flux de masse sont eux simplement moyennes.
+  !
+  !====================================================================
+
+  !   Arguments :
+  !   ===========
+
+  integer :: ntrac
+  real :: dt_app,dt_cum
+  real :: ps(iip1,jjb_u:jje_u)
+  real :: masse(iip1,jjb_u:jje_u,llm),pk(iip1,jjb_u:jje_u,llm)
+  real :: flux_u(iip1,jjb_u:jje_u,llm)
+  real :: flux_v(iip1,jjb_v:jje_v,llm)
+  real :: teta(iip1,jjb_u:jje_u,llm)
+  real :: phi(iip1,jjb_u:jje_u,llm)
+  real :: ucov(iip1,jjb_u:jje_u,llm)
+  real :: vcov(iip1,jjb_v:jje_v,llm)
+  real :: trac(iip1,jjb_u:jje_u,llm,ntrac)
+
+  !   Local :
+  !   =======
+
+  integer,SAVE :: icum,ncum
+!$OMP THREADPRIVATE(icum,ncum)
+  LOGICAL,SAVE :: first=.TRUE.
+!$OMP THREADPRIVATE(first)
+
+  real :: zz,zqy
+  REAl,SAVE,ALLOCATABLE :: zfactv(:,:)
+
+  INTEGER,PARAMETER :: nQ=7
+
+
+  !ym      character*6 nom(nQ)
+  !ym      character*6 unites(nQ)
+  character(len=6),save :: nom(nQ)
+  character(len=6),save :: unites(nQ)
+
+  character(len=10) file
+  integer :: ifile
+  parameter (ifile=4)
+
+  integer,PARAMETER :: itemp=1,igeop=2,iecin=3,iang=4,iu=5
+  INTEGER,PARAMETER :: iovap=6,iun=7
+  integer,PARAMETER :: i_sortie=1
+
+  real,SAVE :: time=0.
+  integer,SAVE :: itau=0.
+!$OMP THREADPRIVATE(time,itau)
+
+  real :: ww
+
+  !   variables dynamiques interm�diaires
+  REAL,SAVE,ALLOCATABLE :: vcont(:,:,:),ucont(:,:,:)
+  REAL,SAVE,ALLOCATABLE :: ang(:,:,:),unat(:,:,:)
+  REAL,SAVE,ALLOCATABLE :: massebx(:,:,:),masseby(:,:,:)
+  REAL,SAVE,ALLOCATABLE :: vorpot(:,:,:)
+  REAL,SAVE,ALLOCATABLE :: w(:,:,:),ecin(:,:,:),convm(:,:,:)
+  REAL,SAVE,ALLOCATABLE :: bern(:,:,:)
+
+  !   champ contenant les scalaires advect�s.
+  real,SAVE,ALLOCATABLE :: Q(:,:,:,:)
+
+  !   champs cumul�s
+  real,SAVE,ALLOCATABLE ::  ps_cum(:,:)
+  real,SAVE,ALLOCATABLE ::  masse_cum(:,:,:)
+  real,SAVE,ALLOCATABLE ::  flux_u_cum(:,:,:)
+  real,SAVE,ALLOCATABLE ::  flux_v_cum(:,:,:)
+  real,SAVE,ALLOCATABLE ::  Q_cum(:,:,:,:)
+  real,SAVE,ALLOCATABLE ::  flux_uQ_cum(:,:,:,:)
+  real,SAVE,ALLOCATABLE ::  flux_vQ_cum(:,:,:,:)
+  real,SAVE,ALLOCATABLE ::  flux_wQ_cum(:,:,:,:)
+  real,SAVE,ALLOCATABLE ::  dQ(:,:,:,:)
+
+
+  !   champs de tansport en moyenne zonale
+  integer :: ntr,itr
+  parameter (ntr=5)
+
+  !ym      character*10 znom(ntr,nQ)
+  !ym      character*20 znoml(ntr,nQ)
+  !ym      character*10 zunites(ntr,nQ)
+  character*10,save :: znom(ntr,nQ)
+  character*20,save :: znoml(ntr,nQ)
+  character*10,save :: zunites(ntr,nQ)
+
+  INTEGER,PARAMETER :: iave=1,itot=2,immc=3,itrs=4,istn=5
+
+  character(len=3) :: ctrs(ntr)
+  data ctrs/'  ','TOT','MMC','TRS','STN'/
+
+  real,SAVE,ALLOCATABLE ::  zvQ(:,:,:,:),zvQtmp(:,:)
+  real,SAVE,ALLOCATABLE ::  zavQ(:,:,:),psiQ(:,:,:)
+  real,SAVE,ALLOCATABLE ::  zmasse(:,:),zamasse(:)
+
+  real,SAVE,ALLOCATABLE ::  zv(:,:),psi(:,:)
+
+  integer :: i,j,l,iQ
+
+
+  !   Initialisation du fichier contenant les moyennes zonales.
+  !   ---------------------------------------------------------
+
+  character(len=10) :: infile
+
+  integer, save :: fileid
+  integer :: thoriid, zvertiid
+
+  INTEGER,SAVE,ALLOCATABLE :: ndex3d(:)
+
+  !   Variables locales
+  !
+  integer :: tau0
+  real :: zjulian
+  character(len=3) :: str
+  character(len=10) :: ctrac
+  integer :: ii,jj
+  integer :: zan, dayref
+  !
+  real,SAVE,ALLOCATABLE :: rlong(:),rlatg(:)
+  integer :: jjb,jje,jjn,ijb,ije
+  type(Request),SAVE :: Req
+!$OMP THREADPRIVATE(Req)
+
+  ! definition du domaine d'ecriture pour le rebuild
+
+  INTEGER,DIMENSION(1) :: ddid
+  INTEGER,DIMENSION(1) :: dsg
+  INTEGER,DIMENSION(1) :: dsl
+  INTEGER,DIMENSION(1) :: dpf
+  INTEGER,DIMENSION(1) :: dpl
+  INTEGER,DIMENSION(1) :: dhs
+  INTEGER,DIMENSION(1) :: dhe
+
+  INTEGER :: bilan_dyn_domain_id
+
+  !=====================================================================
+  !   Initialisation
+  !=====================================================================
+  if (adjust) return
+
+  time=time+dt_app
+  itau=itau+1
+
+  if (first) then
+!$OMP BARRIER
+!$OMP MASTER
+  ALLOCATE(zfactv(jjb_v:jje_v,llm))
+  ALLOCATE(vcont(iip1,jjb_v:jje_v,llm))
+  ALLOCATE(ucont(iip1,jjb_u:jje_u,llm))
+  ALLOCATE(ang(iip1,jjb_u:jje_u,llm))
+  ALLOCATE(unat(iip1,jjb_u:jje_u,llm))
+  ALLOCATE(massebx(iip1,jjb_u:jje_u,llm))
+  ALLOCATE(masseby(iip1,jjb_v:jje_v,llm))
+  ALLOCATE(vorpot(iip1,jjb_v:jje_v,llm))
+  ALLOCATE(w(iip1,jjb_u:jje_u,llm))
+  ALLOCATE(ecin(iip1,jjb_u:jje_u,llm))
+  ALLOCATE(convm(iip1,jjb_u:jje_u,llm))
+  ALLOCATE(bern(iip1,jjb_u:jje_u,llm))
+  ALLOCATE(Q(iip1,jjb_u:jje_u,llm,nQ))
+  ALLOCATE(ps_cum(iip1,jjb_u:jje_u))
+  ALLOCATE(masse_cum(iip1,jjb_u:jje_u,llm))
+  ALLOCATE(flux_u_cum(iip1,jjb_u:jje_u,llm))
+  ALLOCATE(flux_v_cum(iip1,jjb_v:jje_v,llm))
+  ALLOCATE(Q_cum(iip1,jjb_u:jje_u,llm,nQ))
+  ALLOCATE(flux_uQ_cum(iip1,jjb_u:jje_u,llm,nQ))
+  ALLOCATE(flux_vQ_cum(iip1,jjb_v:jje_v,llm,nQ))
+  ALLOCATE(flux_wQ_cum(iip1,jjb_u:jje_u,llm,nQ))
+  ALLOCATE(dQ(iip1,jjb_u:jje_u,llm,nQ))
+  ALLOCATE(zvQ(jjb_v:jje_v,llm,ntr,nQ))
+  ALLOCATE(zvQtmp(jjb_v:jje_v,llm))
+  ALLOCATE(zavQ(jjb_v:jje_v,ntr,nQ))
+  ALLOCATE(psiQ(jjb_v:jje_v,llm+1,nQ))
+  ALLOCATE(zmasse(jjb_v:jje_v,llm))
+  ALLOCATE(zamasse(jjb_v:jje_v))
+  ALLOCATE(zv(jjb_v:jje_v,llm))
+  ALLOCATE(psi(jjb_v:jje_v,llm+1))
+  ALLOCATE(ndex3d(jjb_v:jje_v*llm))
+  ndex3d=0
+  ALLOCATE(rlong(1))
+  ALLOCATE(rlatg(jjm))
+
+!$OMP END MASTER
+!$OMP BARRIER
+    icum=0
+    ! initialisation des fichiers
+    first=.false.
+  !   ncum est la frequence de stokage en pas de temps
+    ncum=dt_cum/dt_app
+    if (abs(ncum*dt_app-dt_cum).gt.1.e-5*dt_app) then
+       WRITE(lunout,*) &
+             'Pb : le pas de cumule doit etre multiple du pas'
+       WRITE(lunout,*)'dt_app=',dt_app
+       WRITE(lunout,*)'dt_cum=',dt_cum
+       CALL abort_gcm("conf_gcmbilan_dyn_loc","stopped",1)
+    endif
+
+!$OMP MASTER
+    nom(itemp)='T'
+    nom(igeop)='gz'
+    nom(iecin)='K'
+    nom(iang)='ang'
+    nom(iu)='u'
+    nom(iovap)='ovap'
+    nom(iun)='un'
+
+    unites(itemp)='K'
+    unites(igeop)='m2/s2'
+    unites(iecin)='m2/s2'
+    unites(iang)='ang'
+    unites(iu)='m/s'
+    unites(iovap)='kg/kg'
+    unites(iun)='un'
+
+
+  !   Initialisation du fichier contenant les moyennes zonales.
+  !   ---------------------------------------------------------
+
+  infile='dynzon'
+
+  zan = annee_ref
+  dayref = day_ref
+  CALL ymds2ju(zan, 1, dayref, 0.0, zjulian)
+  tau0 = itau_dyn
+
+  rlong=0.
+  rlatg=rlatv*180./pi
+
+  jjb=jj_begin
+  jje=jj_end
+  jjn=jj_nb
+  IF (pole_sud) THEN
+    jjn=jj_nb-1
+    jje=jj_end-1
+  ENDIF
+
+  ddid=(/ 2 /)
+  dsg=(/ jjm /)
+  dsl=(/ jjn /)
+  dpf=(/ jjb /)
+  dpl=(/ jje /)
+  dhs=(/ 0 /)
+  dhe=(/ 0 /)
+
+  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
+        'box',bilan_dyn_domain_id)
+
+  call histbeg(trim(infile), &
+        1, rlong, jjn, rlatg(jjb:jje), &
+        1, 1, 1, jjn, &
+        tau0, zjulian, dt_cum, thoriid, fileid, &
+        bilan_dyn_domain_id)
+
+  !
+  !  Appel a histvert pour la grille verticale
+  !
+  call histvert(fileid, 'presnivs', 'Niveaux sigma','mb', &
+        llm, presnivs, zvertiid)
+  !
+  !  Appels a histdef pour la definition des variables a sauvegarder
+  do iQ=1,nQ
+     do itr=1,ntr
+        if(itr.eq.1) then
+           znom(itr,iQ)=nom(iQ)
+           znoml(itr,iQ)=nom(iQ)
+           zunites(itr,iQ)=unites(iQ)
+        else
+           znom(itr,iQ)=ctrs(itr)//'v'//nom(iQ)
+           znoml(itr,iQ)='transport : v * '//nom(iQ)//' '//ctrs(itr)
+           zunites(itr,iQ)='m/s * '//unites(iQ)
+        endif
+     enddo
+  enddo
+
+  !   Declarations des champs avec dimension verticale
+   ! print*,'1HISTDEF'
+  do iQ=1,nQ
+     do itr=1,ntr
+  IF (prt_level > 5) &
+        WRITE(lunout,*)'var ',itr,iQ &
+        ,znom(itr,iQ),znoml(itr,iQ),zunites(itr,iQ)
+        call histdef(fileid,znom(itr,iQ),znoml(itr,iQ), &
+              zunites(itr,iQ),1,jjn,thoriid,llm,1,llm,zvertiid, &
+              32,'ave(X)',dt_cum,dt_cum)
+     enddo
+  !   Declarations pour les fonctions de courant
+   ! print*,'2HISTDEF'
+      call histdef(fileid,'psi'//nom(iQ) &
+            ,'stream fn. '//znoml(itot,iQ), &
+            zunites(itot,iQ),1,jjn,thoriid,llm,1,llm,zvertiid, &
+            32,'ave(X)',dt_cum,dt_cum)
+  enddo
+
+
+  !   Declarations pour les champs de transport d'air
+   ! print*,'3HISTDEF'
+  call histdef(fileid, 'masse', 'masse', &
+        'kg', 1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'ave(X)', dt_cum, dt_cum)
+  call histdef(fileid, 'v', 'v', &
+        'm/s', 1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'ave(X)', dt_cum, dt_cum)
+  !   Declarations pour les fonctions de courant
+   ! print*,'4HISTDEF'
+      call histdef(fileid,'psi','stream fn. MMC ','mega t/s', &
+            1,jjn,thoriid,llm,1,llm,zvertiid, &
+            32,'ave(X)',dt_cum,dt_cum)
+
+
+  !   Declaration des champs 1D de transport en latitude
+   ! print*,'5HISTDEF'
+  do iQ=1,nQ
+     do itr=2,ntr
+        call histdef(fileid,'a'//znom(itr,iQ),znoml(itr,iQ), &
+              zunites(itr,iQ),1,jjn,thoriid,1,1,1,-99, &
+              32,'ave(X)',dt_cum,dt_cum)
+     enddo
+  enddo
+
+
+   ! print*,'8HISTDEF'
+           CALL histend(fileid)
+
+!$OMP END MASTER
+  endif
+
+
+  !=====================================================================
+  !   Calcul des champs dynamiques
+  !   ----------------------------
+
+  jjb=jj_begin
+  jje=jj_end
+
+  !   �nergie cin�tique
+   ! ucont(:,jjb:jje,:)=0
+
+  call Register_Hallo_u(ucov,llm,1,1,1,1,Req)
+  call Register_Hallo_v(vcov,llm,1,1,1,1,Req)
+  call SendRequest(Req)
+!$OMP BARRIER
+  call WaitRequest(Req)
+
+  CALL covcont_loc(llm,ucov,vcov,ucont,vcont)
+  CALL enercin_loc(vcov,ucov,vcont,ucont,ecin)
+
+  !   moment cin�tique
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  do l=1,llm
+     ang(:,jjb:jje,l)=ucov(:,jjb:jje,l)+constang(:,jjb:jje)
+     unat(:,jjb:jje,l)=ucont(:,jjb:jje,l)*cu(:,jjb:jje)
+  enddo
+!$OMP END DO NOWAIT
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+    Q(:,jjb:jje,l,itemp)=teta(:,jjb:jje,l)*pk(:,jjb:jje,l)/cpp
+    Q(:,jjb:jje,l,igeop)=phi(:,jjb:jje,l)
+    Q(:,jjb:jje,l,iecin)=ecin(:,jjb:jje,l)
+    Q(:,jjb:jje,l,iang)=ang(:,jjb:jje,l)
+    Q(:,jjb:jje,l,iu)=unat(:,jjb:jje,l)
+    Q(:,jjb:jje,l,iovap)=trac(:,jjb:jje,l,1)
+    Q(:,jjb:jje,l,iun)=1.
+  ENDDO
+!$OMP END DO NOWAIT
+
+  !=====================================================================
+  !   Cumul
+  !=====================================================================
+  !
+  if(icum.EQ.0) then
+     jjb=jj_begin
+     jje=jj_end
+
+!$OMP MASTER
+     ps_cum(:,jjb:jje)=0.
+!$OMP END MASTER
+
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    DO l=1,llm
+      masse_cum(:,jjb:jje,l)=0.
+      flux_u_cum(:,jjb:jje,l)=0.
+      Q_cum(:,jjb:jje,l,:)=0.
+      flux_uQ_cum(:,jjb:jje,l,:)=0.
+      if (pole_sud) jje=jj_end-1
+      flux_v_cum(:,jjb:jje,l)=0.
+      flux_vQ_cum(:,jjb:jje,l,:)=0.
+    ENDDO
+!$OMP END DO NOWAIT
+  endif
+
+  IF (prt_level > 5) &
+        WRITE(lunout,*)'dans bilan_dyn ',icum,'->',icum+1
+  icum=icum+1
+
+  !   accumulation des flux de masse horizontaux
+  jjb=jj_begin
+  jje=jj_end
+
+!$OMP MASTER
+  ps_cum(:,jjb:jje)=ps_cum(:,jjb:jje)+ps(:,jjb:jje)
+!$OMP END MASTER
+
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+    masse_cum(:,jjb:jje,l)=masse_cum(:,jjb:jje,l)+masse(:,jjb:jje,l)
+    flux_u_cum(:,jjb:jje,l)=flux_u_cum(:,jjb:jje,l) &
+          +flux_u(:,jjb:jje,l)
+  ENDDO
+!$OMP END DO NOWAIT
+
+  if (pole_sud) jje=jj_end-1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+   flux_v_cum(:,jjb:jje,l)=flux_v_cum(:,jjb:jje,l) &
+         +flux_v(:,jjb:jje,l)
+  ENDDO
+!$OMP END DO NOWAIT
+
+  jjb=jj_begin
+  jje=jj_end
+
+  do iQ=1,nQ
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    DO l=1,llm
+      Q_cum(:,jjb:jje,l,iQ)=Q_cum(:,jjb:jje,l,iQ) &
+            +Q(:,jjb:jje,l,iQ)*masse(:,jjb:jje,l)
+    ENDDO
+!$OMP END DO NOWAIT
+  enddo
+
+  !=====================================================================
+  !  FLUX ET TENDANCES
+  !=====================================================================
+
+  !   Flux longitudinal
+  !   -----------------
+  do iQ=1,nQ
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+     do l=1,llm
+        do j=jjb,jje
+           do i=1,iim
+              flux_uQ_cum(i,j,l,iQ)=flux_uQ_cum(i,j,l,iQ) &
+                    +flux_u(i,j,l)*0.5*(Q(i,j,l,iQ)+Q(i+1,j,l,iQ))
+           enddo
+           flux_uQ_cum(iip1,j,l,iQ)=flux_uQ_cum(1,j,l,iQ)
+        enddo
+     enddo
+!$OMP END DO NOWAIT
+  enddo
+
+  !    flux m�ridien
+  !    -------------
+  do iQ=1,nQ
+    call Register_Hallo_u(Q(1,jjb_u,1,iQ),llm,0,1,1,0,Req)
+  enddo
+  call SendRequest(Req)
+!$OMP BARRIER
+  call WaitRequest(Req)
+
+  jjb=jj_begin
+  jje=jj_end
+  if (pole_sud) jje=jj_end-1
+
+  do iQ=1,nQ
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+     do l=1,llm
+        do j=jjb,jje
+           do i=1,iip1
+              flux_vQ_cum(i,j,l,iQ)=flux_vQ_cum(i,j,l,iQ) &
+                    +flux_v(i,j,l)*0.5*(Q(i,j,l,iQ)+Q(i,j+1,l,iQ))
+           enddo
+        enddo
+     enddo
+!$OMP ENDDO NOWAIT
+!$OMP BARRIER
+  enddo
+
+  !    tendances
+  !    ---------
+
+  !   convergence horizontale
+  call Register_Hallo_u(flux_uQ_cum,llm,2,2,2,2,Req)
+  call Register_Hallo_v(flux_vQ_cum,llm,2,2,2,2,Req)
+  call SendRequest(Req)
+!$OMP BARRIER
+  call WaitRequest(Req)
+
+  call  convflu_loc(flux_uQ_cum,flux_vQ_cum,llm*nQ,dQ)
+
+  !   calcul de la vitesse verticale
+  call Register_Hallo_u(flux_u_cum,llm,2,2,2,2,Req)
+  call Register_Hallo_v(flux_v_cum,llm,2,2,2,2,Req)
+  call SendRequest(Req)
+!$OMP BARRIER
+  call WaitRequest(Req)
+
+  call convmas_loc(flux_u_cum,flux_v_cum,convm)
+  CALL vitvert_loc(convm,w)
+!$OMP BARRIER
+
+
+  jjb=jj_begin
+  jje=jj_end
+
+   ! do iQ=1,nQ
+   !    do l=1,llm-1
+   !       do j=jjb,jje
+   !          do i=1,iip1
+   !             ww=-0.5*w(i,j,l+1)*(Q(i,j,l,iQ)+Q(i,j,l+1,iQ))
+   !             dQ(i,j,l  ,iQ)=dQ(i,j,l  ,iQ)-ww
+   !             dQ(i,j,l+1,iQ)=dQ(i,j,l+1,iQ)+ww
+   !          enddo
+   !       enddo
+   !     enddo
+   !  enddo
+
+  do iQ=1,nQ
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+     do l=1,llm
+        IF (l<llm) THEN
+          do j=jjb,jje
+             do i=1,iip1
+                ww=-0.5*w(i,j,l+1)*(Q(i,j,l,iQ)+Q(i,j,l+1,iQ))
+                dQ(i,j,l  ,iQ)=dQ(i,j,l  ,iQ)-ww
+                dQ(i,j,l+1,iQ)=dQ(i,j,l+1,iQ)+ww
+             enddo
+          enddo
+        ENDIF
+        IF (l>2) THEN
+          do j=jjb,jje
+            do i=1,iip1
+              ww=-0.5*w(i,j,l)*(Q(i,j,l-1,iQ)+Q(i,j,l,iQ))
+              dQ(i,j,l,iQ)=dQ(i,j,l,iQ)+ww
+            enddo
+          enddo
+        ENDIF
+     enddo
+!$OMP ENDDO NOWAIT
+  enddo
+  IF (prt_level > 5) &
+        WRITE(lunout,*)'Apres les calculs fait a chaque pas'
+  !=====================================================================
+  !   PAS DE TEMPS D'ECRITURE
+  !=====================================================================
+  if (icum.eq.ncum) then
+  !=====================================================================
+
+  IF (prt_level > 5) &
+        WRITE(lunout,*)'Pas d ecriture'
+
+  jjb=jj_begin
+  jje=jj_end
+
+  !   Normalisation
+  do iQ=1,nQ
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    do l=1,llm
+      Q_cum(:,jjb:jje,l,iQ)=Q_cum(:,jjb:jje,l,iQ) &
+            /masse_cum(:,jjb:jje,l)
+    enddo
+!$OMP ENDDO NOWAIT
+  enddo
+
+  zz=1./REAL(ncum)
+
+!$OMP MASTER
+    ps_cum(:,jjb:jje)=ps_cum(:,jjb:jje)*zz
+!$OMP END MASTER
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+    masse_cum(:,jjb:jje,l)=masse_cum(:,jjb:jje,l)*zz
+    flux_u_cum(:,jjb:jje,l)=flux_u_cum(:,jjb:jje,l)*zz
+    flux_uQ_cum(:,jjb:jje,l,:)=flux_uQ_cum(:,jjb:jje,l,:)*zz
+    dQ(:,jjb:jje,l,:)=dQ(:,jjb:jje,l,:)*zz
+  ENDDO
+!$OMP ENDDO NOWAIT
+
+  IF (pole_sud) jje=jj_end-1
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+    flux_v_cum(:,jjb:jje,l)=flux_v_cum(:,jjb:jje,l)*zz
+    flux_vQ_cum(:,jjb:jje,l,:)=flux_vQ_cum(:,jjb:jje,l,:)*zz
+  ENDDO
+!$OMP ENDDO NOWAIT
+!$OMP BARRIER
+
+  jjb=jj_begin
+  jje=jj_end
+
+
+  !   A retravailler eventuellement
+  !   division de dQ par la masse pour revenir aux bonnes grandeurs
+  do iQ=1,nQ
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    DO l=1,llm
+       dQ(:,jjb:jje,l,iQ)=dQ(:,jjb:jje,l,iQ)/masse_cum(:,jjb:jje,l)
+    ENDDO
+!$OMP ENDDO NOWAIT
+  enddo
+
+  !=====================================================================
+  !   Transport m�ridien
+  !=====================================================================
+
+  !   cumul zonal des masses des mailles
+  !   ----------------------------------
+  jjb=jj_begin
+  jje=jj_end
+  if (pole_sud) jje=jj_end-1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    DO l=1,llm
+      zv(jjb:jje,l)=0.
+      zmasse(jjb:jje,l)=0.
+    ENDDO
+!$OMP ENDDO NOWAIT
+!$OMP BARRIER
+
+  call Register_Hallo_u(masse_cum,llm,1,1,1,1,Req)
+  do iQ=1,nQ
+    call Register_Hallo_u(Q_cum(1,jjb_u,1,iQ),llm,0,1,1,0,Req)
+  enddo
+
+  call SendRequest(Req)
+!$OMP BARRIER
+  call WaitRequest(Req)
+
+  call massbar_loc(masse_cum,massebx,masseby)
+
+  jjb=jj_begin
+  jje=jj_end
+  if (pole_sud) jje=jj_end-1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  do l=1,llm
+     do j=jjb,jje
+        do i=1,iim
+           zmasse(j,l)=zmasse(j,l)+masseby(i,j,l)
+           zv(j,l)=zv(j,l)+flux_v_cum(i,j,l)
+        enddo
+        zfactv(j,l)=cv(1,j)/zmasse(j,l)
+     enddo
+  enddo
+!$OMP ENDDO NOWAIT
+!$OMP BARRIER
+
+  ! print*,'3OK'
+  !   --------------------------------------------------------------
+  !   calcul de la moyenne zonale du transport :
+  !   ------------------------------------------
+  !
+  !                                 --
+  ! TOT : la circulation totale       [ vq ]
+  !
+  !                                  -     -
+  ! MMC : mean meridional circulation [ v ] [ q ]
+  !
+  !                                 ----      --       - -
+  ! TRS : transitoires                [ v'q'] = [ vq ] - [ v q ]
+  !
+  !                                 - * - *       - -       -     -
+  ! STT : stationaires                [ v   q   ] = [ v q ] - [ v ] [ q ]
+  !
+  !                                          - -
+  !    on utilise aussi l'intermediaire TMP :  [ v q ]
+  !
+  !    la variable zfactv transforme un transport meridien cumule
+  !    en kg/s * unte-du-champ-transporte en m/s * unite-du-champ-transporte
+  !
+  !   --------------------------------------------------------------
+
+
+  !   ----------------------------------------
+  !   Transport dans le plan latitude-altitude
+  !   ----------------------------------------
+
+  jjb=jj_begin
+  jje=jj_end
+  if (pole_sud) jje=jj_end-1
+
+  zvQ=0.
+  psiQ=0.
+  do iQ=1,nQ
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+     do l=1,llm
+        zvQtmp(:,l)=0.
+        do j=jjb,jje
+           ! print*,'j,l,iQ=',j,l,iQ
+  !   Calcul des moyennes zonales du transort total et de zvQtmp
+           do i=1,iim
+              zvQ(j,l,itot,iQ)=zvQ(j,l,itot,iQ) &
+                    +flux_vQ_cum(i,j,l,iQ)
+              zqy=      0.5*(Q_cum(i,j,l,iQ)*masse_cum(i,j,l)+ &
+                    Q_cum(i,j+1,l,iQ)*masse_cum(i,j+1,l))
+              zvQtmp(j,l)=zvQtmp(j,l)+flux_v_cum(i,j,l)*zqy &
+                    /(0.5*(masse_cum(i,j,l)+masse_cum(i,j+1,l)))
+              zvQ(j,l,iave,iQ)=zvQ(j,l,iave,iQ)+zqy
+           enddo
+           ! print*,'aOK'
+  !   Decomposition
+           zvQ(j,l,iave,iQ)=zvQ(j,l,iave,iQ)/zmasse(j,l)
+           zvQ(j,l,itot,iQ)=zvQ(j,l,itot,iQ)*zfactv(j,l)
+           zvQtmp(j,l)=zvQtmp(j,l)*zfactv(j,l)
+           zvQ(j,l,immc,iQ)=zv(j,l)*zvQ(j,l,iave,iQ)*zfactv(j,l)
+           zvQ(j,l,itrs,iQ)=zvQ(j,l,itot,iQ)-zvQtmp(j,l)
+           zvQ(j,l,istn,iQ)=zvQtmp(j,l)-zvQ(j,l,immc,iQ)
+        enddo
+     enddo
+!$OMP ENDDO NOWAIT
+  !   fonction de courant meridienne pour la quantite Q
+!$OMP BARRIER
+!$OMP MASTER
+     do l=llm,1,-1
+        do j=jjb,jje
+           psiQ(j,l,iQ)=psiQ(j,l+1,iQ)+zvQ(j,l,itot,iQ)
+        enddo
+     enddo
+!$OMP END MASTER
+!$OMP BARRIER
+  enddo
+
+  !   fonction de courant pour la circulation meridienne moyenne
+!$OMP BARRIER
+!$OMP MASTER
+  psi(jjb:jje,:)=0.
+  do l=llm,1,-1
+     do j=jjb,jje
+        psi(j,l)=psi(j,l+1)+zv(j,l)
+        zv(j,l)=zv(j,l)*zfactv(j,l)
+     enddo
+  enddo
+!$OMP END MASTER
+!$OMP BARRIER
+
+  ! print*,'4OK'
+  !   sorties proprement dites
+!$OMP MASTER
+  if (i_sortie.eq.1) then
+  jjb=jj_begin
+  jje=jj_end
+  jjn=jj_nb
+  if (pole_sud) jje=jj_end-1
+  if (pole_sud) jjn=jj_nb-1
+  do iQ=1,nQ
+     do itr=1,ntr
+        call histwrite(fileid,znom(itr,iQ),itau, &
+              zvQ(jjb:jje,:,itr,iQ) &
+              ,jjn*llm,ndex3d)
+     enddo
+     call histwrite(fileid,'psi'//nom(iQ), &
+           itau,psiQ(jjb:jje,1:llm,iQ) &
+           ,jjn*llm,ndex3d)
+  enddo
+
+  call histwrite(fileid,'masse',itau,zmasse(jjb:jje,1:llm) &
+        ,jjn*llm,ndex3d)
+  call histwrite(fileid,'v',itau,zv(jjb:jje,1:llm) &
+        ,jjn*llm,ndex3d)
+  psi(jjb:jje,:)=psi(jjb:jje,:)*1.e-9
+  call histwrite(fileid,'psi',itau,psi(jjb:jje,1:llm), &
+        jjn*llm,ndex3d)
+
+  endif
+
+
+  !   -----------------
+  !   Moyenne verticale
+  !   -----------------
+
+  zamasse(jjb:jje)=0.
+  do l=1,llm
+     zamasse(jjb:jje)=zamasse(jjb:jje)+zmasse(jjb:jje,l)
+  enddo
+
+  zavQ(jjb:jje,:,:)=0.
+  do iQ=1,nQ
+     do itr=2,ntr
+        do l=1,llm
+           zavQ(jjb:jje,itr,iQ)=zavQ(jjb:jje,itr,iQ) &
+                 +zvQ(jjb:jje,l,itr,iQ) &
+                 *zmasse(jjb:jje,l)
+        enddo
+        zavQ(jjb:jje,itr,iQ)=zavQ(jjb:jje,itr,iQ)/zamasse(jjb:jje)
+        call histwrite(fileid,'a'//znom(itr,iQ),itau, &
+              zavQ(jjb:jje,itr,iQ),jjn*llm,ndex3d)
+     enddo
+  enddo
+!$OMP END MASTER
+  ! on doit pouvoir tracer systematiquement la fonction de courant.
+
+  !=====================================================================
+  !/////////////////////////////////////////////////////////////////////
+  icum=0                  !///////////////////////////////////////
+  endif ! icum.eq.ncum    !///////////////////////////////////////
+  !/////////////////////////////////////////////////////////////////////
+  !=====================================================================
+!$OMP MASTER
+  call histsync(fileid)
+!$OMP END MASTER
+
+
+  return
+end subroutine bilan_dyn_loc
Index: LMDZ6/trunk/libf/dyn3dmem/caladvtrac_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/caladvtrac_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,217 +1,0 @@
-!
-! $Id: caladvtrac_p.F 1299 2010-01-20 14:27:21Z fairhead $
-!
-!
-!
-      SUBROUTINE caladvtrac_loc(q,pbaru,pbarv , &
-              p ,masse, dq ,  teta, &
-              flxw, pk, iapptrac)
-  USE parallel_lmdz
-  USE infotrac, ONLY : nqtot
-  USE control_mod, ONLY : iapp_tracvl,planet_type
-  USE caladvtrac_mod
-  USE mod_hallo
-  USE bands
-  USE times
-  USE Vampir
-  USE write_field_loc
-  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
-  IMPLICIT NONE
-  !
-  ! Auteurs:   F.Hourdin , P.Le Van, F.Forget, F.Codron
-  !
-  ! F.Codron (10/99) : ajout humidite specifique pour eau vapeur
-  !=======================================================================
-  !
-  !   Shema de  Van Leer
-  !
-  !=======================================================================
-
-
-  include "dimensions.h"
-  include "paramet.h"
-
-  !   Arguments:
-  !   ----------
-  REAL :: pbaru( ijb_u:ije_u,llm ),pbarv( ijb_v:ije_v,llm)
-  REAL :: masse(ijb_u:ije_u,llm)
-  REAL :: p( ijb_u:ije_u,llmp1)
-  REAL :: q( ijb_u:ije_u,llm,nqtot),dq( ijb_u:ije_u,llm, nqtot )
-  REAL :: teta( ijb_u:ije_u,llm),pk( ijb_u:ije_u,llm)
-  REAL :: flxw(ijb_u:ije_u,llm)
-  INTEGER :: iapptrac
-  !   Local:
-  !   ------
-   ! REAL :: pbarug(ijb_u:ije_u,llm)
-   ! REAL :: pbarvg(ijb_v:ije_v,llm)
-  !      REAL :: wg(ijb_u:ije_u,llm)
-
-  REAL :: flxw_adv(distrib_vanleer%ijb_u:distrib_vanleer%ije_u,llm)
-  INTEGER,SAVE :: iadvtr=0
-!$OMP THREADPRIVATE(iadvtr)
-  INTEGER ::  ijb,ije,ijbu,ijbv,ijeu,ijev,j
-  INTEGER :: ij,l
-  TYPE(Request),SAVE :: Request_vanleer
-!$OMP THREADPRIVATE(Request_vanleer)
-
-  ! !write(*,*) 'caladvtrac 58: entree'
-  ijbu=ij_begin
-  ijeu=ij_end
-
-  ijbv=ij_begin-iip1
-  ijev=ij_end
-  if (pole_nord) ijbv=ij_begin
-  if (pole_sud)  ijev=ij_end-iip1
-
-  IF(iadvtr.EQ.0) THEN
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    DO l=1,llm
-      pbaruc(ijbu:ijeu,l)=0.
-      pbarvc(ijbv:ijev,l)=0.
-    ENDDO
-!$OMP END DO NOWAIT
-  ENDIF
-
-  !   accumulation des flux de masse horizontaux
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-     DO ij = ijbu,ijeu
-        pbaruc(ij,l) = pbaruc(ij,l) + pbaru(ij,l)
-     ENDDO
-     DO ij = ijbv,ijev
-        pbarvc(ij,l) = pbarvc(ij,l) + pbarv(ij,l)
-     ENDDO
-  ENDDO
-!$OMP END DO NOWAIT
-
-  !   selection de la masse instantannee des mailles avant le transport.
-  IF(iadvtr.EQ.0) THEN
-
-      ijb=ij_begin
-      ije=ij_end
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-   DO l=1,llm
-      massem(ijb:ije,l)=masse(ijb:ije,l)
-   ENDDO
-!$OMP END DO NOWAIT
-
-  ENDIF
-
-  iadvtr   = iadvtr+1
-
-!$OMP MASTER
-  iapptrac = iadvtr
-!$OMP END MASTER
-
-  !   Test pour savoir si on advecte a ce pas de temps
-
-  IF ( iadvtr.EQ.iapp_tracvl ) THEN
-  ! !write(*,*) 'caladvtrac 133'
-!$OMP MASTER
-    call suspend_timer(timer_caldyn)
-!$OMP END MASTER
-
-  ijb=ij_begin
-  ije=ij_end
-
-  !c   ..  Modif P.Le Van  ( 20/12/97 )  ....
-  !c
-
-  !   traitement des flux de masse avant advection.
-  ! 1. calcul de w
-  ! 2. groupement des mailles pres du pole.
-
-    CALL groupe_loc( massem, pbaruc,pbarvc, pbarug,pbarvg,wg )
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-    flxw(ijb:ije,l)=wg(ijb:ije,l)/REAL(iapp_tracvl)
-  ENDDO
-!$OMP ENDDO NOWAIT
-
-IF (CPPKEY_DEBUGIO) THEN
-     CALL WriteField_u('pbarug1',pbarug)
-     CALL WriteField_v('pbarvg1',pbarvg)
-     CALL WriteField_u('wg1',wg)
-END IF
-
-!$OMP BARRIER
-
-
-!$OMP MASTER
-  call VTb(VTHallo)
-!$OMP END MASTER
-
-  call Register_SwapField_u(pbarug,pbarug_adv, distrib_vanleer, &
-        Request_vanleer)
-  call Register_SwapField_v(pbarvg,pbarvg_adv, distrib_vanleer, &
-        Request_vanleer,up=1)
-  call Register_SwapField_u(massem,massem_adv, distrib_vanleer, &
-        Request_vanleer)
-  call Register_SwapField_u(wg,wg_adv,distrib_vanleer, &
-        Request_vanleer)
-  call Register_SwapField_u(teta,teta_adv, distrib_vanleer, &
-        Request_vanleer,up=1,down=1)
-  call Register_SwapField_u(p,p_adv, distrib_vanleer, &
-        Request_vanleer,up=1,down=1)
-  call Register_SwapField_u(pk,pk_adv, distrib_vanleer, &
-        Request_vanleer,up=1,down=1)
-  call Register_SwapField_u(q,q_adv, distrib_vanleer, &
-        Request_vanleer)
-
-  call SendRequest(Request_vanleer)
-!$OMP BARRIER
-  call WaitRequest(Request_vanleer)
-
-
-!$OMP BARRIER
-!$OMP MASTER
-  call Set_Distrib(distrib_vanleer)
-  call VTe(VTHallo)
-  call VTb(VTadvection)
-  call start_timer(timer_vanleer)
-!$OMP END MASTER
-!$OMP BARRIER
-   ! CALL WriteField_u('pbarug_adv',pbarug_adv)
-   ! CALL WriteField_u('',)
-
-
-IF (CPPKEY_DEBUGIO) THEN
-     CALL WriteField_u('pbarug1',pbarug_adv)
-     CALL WriteField_v('pbarvg1',pbarvg_adv)
-     CALL WriteField_u('wg1',wg_adv)
-END IF
-  ! !write(*,*) 'caladvtrac 185'
-  CALL advtrac_loc( pbarug_adv,pbarvg_adv,wg_adv, &
-        p_adv,  massem_adv,q_adv, teta_adv, &
-        pk_adv)
-  ! !write(*,*) 'caladvtrac 189'
-
-
-!$OMP MASTER
-    call VTe(VTadvection)
-    call stop_timer(timer_vanleer)
-    call VTb(VThallo)
-!$OMP END MASTER
-
-    call Register_SwapField_u(q_adv,q,distrib_caldyn, &
-          Request_vanleer)
-
-    call SendRequest(Request_vanleer)
-!$OMP BARRIER
-    call WaitRequest(Request_vanleer)
-
-!$OMP BARRIER
-!$OMP MASTER
-    call Set_Distrib(distrib_caldyn)
-    call VTe(VThallo)
-    call resume_timer(timer_caldyn)
-!$OMP END MASTER
-!$OMP BARRIER
-      iadvtr=0
-   ENDIF ! if iadvtr.EQ.iapp_tracvl
-
-END SUBROUTINE caladvtrac_loc
-
-
Index: LMDZ6/trunk/libf/dyn3dmem/caladvtrac_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/caladvtrac_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/caladvtrac_loc.f90	(revision 5268)
@@ -0,0 +1,217 @@
+!
+! $Id: caladvtrac_p.F 1299 2010-01-20 14:27:21Z fairhead $
+!
+!
+!
+      SUBROUTINE caladvtrac_loc(q,pbaru,pbarv , &
+              p ,masse, dq ,  teta, &
+              flxw, pk, iapptrac)
+  USE parallel_lmdz
+  USE infotrac, ONLY : nqtot
+  USE control_mod, ONLY : iapp_tracvl,planet_type
+  USE caladvtrac_mod
+  USE mod_hallo
+  USE bands
+  USE times
+  USE Vampir
+  USE write_field_loc
+  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
+  IMPLICIT NONE
+  !
+  ! Auteurs:   F.Hourdin , P.Le Van, F.Forget, F.Codron
+  !
+  ! F.Codron (10/99) : ajout humidite specifique pour eau vapeur
+  !=======================================================================
+  !
+  !   Shema de  Van Leer
+  !
+  !=======================================================================
+
+
+  include "dimensions.h"
+  include "paramet.h"
+
+  !   Arguments:
+  !   ----------
+  REAL :: pbaru( ijb_u:ije_u,llm ),pbarv( ijb_v:ije_v,llm)
+  REAL :: masse(ijb_u:ije_u,llm)
+  REAL :: p( ijb_u:ije_u,llmp1)
+  REAL :: q( ijb_u:ije_u,llm,nqtot),dq( ijb_u:ije_u,llm, nqtot )
+  REAL :: teta( ijb_u:ije_u,llm),pk( ijb_u:ije_u,llm)
+  REAL :: flxw(ijb_u:ije_u,llm)
+  INTEGER :: iapptrac
+  !   Local:
+  !   ------
+   ! REAL :: pbarug(ijb_u:ije_u,llm)
+   ! REAL :: pbarvg(ijb_v:ije_v,llm)
+  !      REAL :: wg(ijb_u:ije_u,llm)
+
+  REAL :: flxw_adv(distrib_vanleer%ijb_u:distrib_vanleer%ije_u,llm)
+  INTEGER,SAVE :: iadvtr=0
+!$OMP THREADPRIVATE(iadvtr)
+  INTEGER ::  ijb,ije,ijbu,ijbv,ijeu,ijev,j
+  INTEGER :: ij,l
+  TYPE(Request),SAVE :: Request_vanleer
+!$OMP THREADPRIVATE(Request_vanleer)
+
+  ! !write(*,*) 'caladvtrac 58: entree'
+  ijbu=ij_begin
+  ijeu=ij_end
+
+  ijbv=ij_begin-iip1
+  ijev=ij_end
+  if (pole_nord) ijbv=ij_begin
+  if (pole_sud)  ijev=ij_end-iip1
+
+  IF(iadvtr.EQ.0) THEN
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    DO l=1,llm
+      pbaruc(ijbu:ijeu,l)=0.
+      pbarvc(ijbv:ijev,l)=0.
+    ENDDO
+!$OMP END DO NOWAIT
+  ENDIF
+
+  !   accumulation des flux de masse horizontaux
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+     DO ij = ijbu,ijeu
+        pbaruc(ij,l) = pbaruc(ij,l) + pbaru(ij,l)
+     ENDDO
+     DO ij = ijbv,ijev
+        pbarvc(ij,l) = pbarvc(ij,l) + pbarv(ij,l)
+     ENDDO
+  ENDDO
+!$OMP END DO NOWAIT
+
+  !   selection de la masse instantannee des mailles avant le transport.
+  IF(iadvtr.EQ.0) THEN
+
+      ijb=ij_begin
+      ije=ij_end
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+   DO l=1,llm
+      massem(ijb:ije,l)=masse(ijb:ije,l)
+   ENDDO
+!$OMP END DO NOWAIT
+
+  ENDIF
+
+  iadvtr   = iadvtr+1
+
+!$OMP MASTER
+  iapptrac = iadvtr
+!$OMP END MASTER
+
+  !   Test pour savoir si on advecte a ce pas de temps
+
+  IF ( iadvtr.EQ.iapp_tracvl ) THEN
+  ! !write(*,*) 'caladvtrac 133'
+!$OMP MASTER
+    call suspend_timer(timer_caldyn)
+!$OMP END MASTER
+
+  ijb=ij_begin
+  ije=ij_end
+
+  !c   ..  Modif P.Le Van  ( 20/12/97 )  ....
+  !c
+
+  !   traitement des flux de masse avant advection.
+  ! 1. calcul de w
+  ! 2. groupement des mailles pres du pole.
+
+    CALL groupe_loc( massem, pbaruc,pbarvc, pbarug,pbarvg,wg )
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+    flxw(ijb:ije,l)=wg(ijb:ije,l)/REAL(iapp_tracvl)
+  ENDDO
+!$OMP ENDDO NOWAIT
+
+IF (CPPKEY_DEBUGIO) THEN
+     CALL WriteField_u('pbarug1',pbarug)
+     CALL WriteField_v('pbarvg1',pbarvg)
+     CALL WriteField_u('wg1',wg)
+END IF
+
+!$OMP BARRIER
+
+
+!$OMP MASTER
+  call VTb(VTHallo)
+!$OMP END MASTER
+
+  call Register_SwapField_u(pbarug,pbarug_adv, distrib_vanleer, &
+        Request_vanleer)
+  call Register_SwapField_v(pbarvg,pbarvg_adv, distrib_vanleer, &
+        Request_vanleer,up=1)
+  call Register_SwapField_u(massem,massem_adv, distrib_vanleer, &
+        Request_vanleer)
+  call Register_SwapField_u(wg,wg_adv,distrib_vanleer, &
+        Request_vanleer)
+  call Register_SwapField_u(teta,teta_adv, distrib_vanleer, &
+        Request_vanleer,up=1,down=1)
+  call Register_SwapField_u(p,p_adv, distrib_vanleer, &
+        Request_vanleer,up=1,down=1)
+  call Register_SwapField_u(pk,pk_adv, distrib_vanleer, &
+        Request_vanleer,up=1,down=1)
+  call Register_SwapField_u(q,q_adv, distrib_vanleer, &
+        Request_vanleer)
+
+  call SendRequest(Request_vanleer)
+!$OMP BARRIER
+  call WaitRequest(Request_vanleer)
+
+
+!$OMP BARRIER
+!$OMP MASTER
+  call Set_Distrib(distrib_vanleer)
+  call VTe(VTHallo)
+  call VTb(VTadvection)
+  call start_timer(timer_vanleer)
+!$OMP END MASTER
+!$OMP BARRIER
+   ! CALL WriteField_u('pbarug_adv',pbarug_adv)
+   ! CALL WriteField_u('',)
+
+
+IF (CPPKEY_DEBUGIO) THEN
+     CALL WriteField_u('pbarug1',pbarug_adv)
+     CALL WriteField_v('pbarvg1',pbarvg_adv)
+     CALL WriteField_u('wg1',wg_adv)
+END IF
+  ! !write(*,*) 'caladvtrac 185'
+  CALL advtrac_loc( pbarug_adv,pbarvg_adv,wg_adv, &
+        p_adv,  massem_adv,q_adv, teta_adv, &
+        pk_adv)
+  ! !write(*,*) 'caladvtrac 189'
+
+
+!$OMP MASTER
+    call VTe(VTadvection)
+    call stop_timer(timer_vanleer)
+    call VTb(VThallo)
+!$OMP END MASTER
+
+    call Register_SwapField_u(q_adv,q,distrib_caldyn, &
+          Request_vanleer)
+
+    call SendRequest(Request_vanleer)
+!$OMP BARRIER
+    call WaitRequest(Request_vanleer)
+
+!$OMP BARRIER
+!$OMP MASTER
+    call Set_Distrib(distrib_caldyn)
+    call VTe(VThallo)
+    call resume_timer(timer_caldyn)
+!$OMP END MASTER
+!$OMP BARRIER
+      iadvtr=0
+   ENDIF ! if iadvtr.EQ.iapp_tracvl
+
+END SUBROUTINE caladvtrac_loc
+
+
Index: LMDZ6/trunk/libf/dyn3dmem/caladvtrac_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/caladvtrac_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,115 +1,0 @@
-MODULE caladvtrac_mod
-
-  REAL,POINTER,SAVE :: q_adv(:,:,:)
-  REAL,POINTER,SAVE :: massem_adv(:,:)
-  REAL,POINTER,SAVE :: wg_adv(:,:)
-  REAL,POINTER,SAVE :: teta_adv(:,:)
-  REAL,POINTER,SAVE :: p_adv(:,:)
-  REAL,POINTER,SAVE :: pk_adv(:,:)
-  REAL,POINTER,SAVE :: pbarug_adv(:,:)
-  REAL,POINTER,SAVE :: pbarvg_adv(:,:)
-  REAL,POINTER,SAVE :: pbaruc(:,:)
-  REAL,POINTER,SAVE :: pbarvc(:,:)
-  REAL,POINTER,SAVE :: pbarug(:,:)
-  REAL,POINTER,SAVE :: pbarvg(:,:)
-  REAL,POINTER,SAVE :: wg(:,:)
-
-  REAL,POINTER,SAVE :: massem(:,:)
-  !Offline
-  REAL,POINTER,SAVE :: tetac(:,:)
-  REAL,POINTER,SAVE :: massec(:,:)
-  REAL,POINTER,SAVE :: phic(:,:)
-  REAL,POINTER,SAVE :: pbarucc(:,:)
-  REAL,POINTER,SAVE :: pbarvcc(:,:)
-  REAL,POINTER,SAVE :: pbarugg(:,:)
-  REAL,POINTER,SAVE :: pbarvgg(:,:)
-  REAL,POINTER,SAVE :: wgg(:,:)
-CONTAINS
-
-  SUBROUTINE caladvtrac_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE infotrac, ONLY: nqtot
-  USE advtrac_mod, ONLY : advtrac_allocate
-  USE groupe_mod 
-  IMPLICIT NONE
-  INCLUDE "dimensions.h"
-  INCLUDE "paramet.h"
-  TYPE(distrib),POINTER :: d
-
-    d=>distrib_vanleer
-    CALL allocate_u(q_adv,llm,nqtot,d)
-    CALL allocate_u(massem_adv,llm,d)
-    CALL allocate_u(wg_adv,llm,d)
-    CALL allocate_u(teta_adv,llm,d)
-    CALL allocate_u(p_adv,llmp1,d)
-    CALL allocate_u(pk_adv,llm,d)
-    CALL allocate_u(pbarug_adv,llm,d)
-    CALL allocate_v(pbarvg_adv,llm,d)
-
-    d=>distrib_caldyn
-    CALL allocate_u(massem,llm,d)
-    CALL allocate_u(pbaruc,llm,d)
-    pbaruc(:,:)=0
-    CALL allocate_v(pbarvc,llm,d)
-    pbarvc(:,:)=0
-    CALL allocate_u(pbarug,llm,d)
-    CALL allocate_v(pbarvg,llm,d)
-    CALL allocate_u(wg,llm,d)
-    ! Offline
-    CALL allocate_u(tetac,llm,d)
-    CALL allocate_u(phic,llm,d)
-    CALL allocate_u(pbarucc,llm,d)
-    CALL allocate_v(pbarvcc,llm,d)
-    CALL allocate_u(massec,llm,d)
-    CALL allocate_u(pbarugg,llm,d)
-    CALL allocate_v(pbarvgg,llm,d)
-    CALL allocate_u(wgg,llm,d)
-
-    CALL groupe_allocate
-    CALL advtrac_allocate
-    
-  END SUBROUTINE caladvtrac_allocate
-  
-  SUBROUTINE caladvtrac_switch_caldyn(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  USE groupe_mod
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-
-    CALL switch_u(massem,distrib_caldyn,dist)
-    CALL switch_u(pbaruc,distrib_caldyn,dist)
-    CALL switch_v(pbarvc,distrib_caldyn,dist,up=1)
-    CALL switch_u(pbarug,distrib_caldyn,dist)
-    CALL switch_v(pbarvg,distrib_caldyn,dist)
-    CALL switch_u(wg,distrib_caldyn,dist)
-    
-    CALL groupe_switch_caldyn(dist)
-
-  END SUBROUTINE caladvtrac_switch_caldyn
-  
-  SUBROUTINE caladvtrac_switch_vanleer(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  USE advtrac_mod, ONLY : advtrac_switch_vanleer 
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-  
-    CALL switch_u(q_adv,distrib_vanleer,dist)
-    CALL switch_u(massem_adv,distrib_vanleer,dist)
-    CALL switch_u(wg_adv,distrib_vanleer,dist)
-    CALL switch_u(teta_adv,distrib_vanleer,dist)
-    CALL switch_u(p_adv,distrib_vanleer,dist)
-    CALL switch_u(pk_adv,distrib_vanleer,dist)
-    CALL switch_u(pbarug_adv,distrib_vanleer,dist)
-    CALL switch_v(pbarvg_adv,distrib_vanleer,dist)
-
-    CALL advtrac_switch_vanleer(dist)
-    
-  END SUBROUTINE caladvtrac_switch_vanleer  
-  
-END MODULE caladvtrac_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/caladvtrac_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/caladvtrac_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/caladvtrac_mod.f90	(revision 5268)
@@ -0,0 +1,115 @@
+MODULE caladvtrac_mod
+
+  REAL,POINTER,SAVE :: q_adv(:,:,:)
+  REAL,POINTER,SAVE :: massem_adv(:,:)
+  REAL,POINTER,SAVE :: wg_adv(:,:)
+  REAL,POINTER,SAVE :: teta_adv(:,:)
+  REAL,POINTER,SAVE :: p_adv(:,:)
+  REAL,POINTER,SAVE :: pk_adv(:,:)
+  REAL,POINTER,SAVE :: pbarug_adv(:,:)
+  REAL,POINTER,SAVE :: pbarvg_adv(:,:)
+  REAL,POINTER,SAVE :: pbaruc(:,:)
+  REAL,POINTER,SAVE :: pbarvc(:,:)
+  REAL,POINTER,SAVE :: pbarug(:,:)
+  REAL,POINTER,SAVE :: pbarvg(:,:)
+  REAL,POINTER,SAVE :: wg(:,:)
+
+  REAL,POINTER,SAVE :: massem(:,:)
+  !Offline
+  REAL,POINTER,SAVE :: tetac(:,:)
+  REAL,POINTER,SAVE :: massec(:,:)
+  REAL,POINTER,SAVE :: phic(:,:)
+  REAL,POINTER,SAVE :: pbarucc(:,:)
+  REAL,POINTER,SAVE :: pbarvcc(:,:)
+  REAL,POINTER,SAVE :: pbarugg(:,:)
+  REAL,POINTER,SAVE :: pbarvgg(:,:)
+  REAL,POINTER,SAVE :: wgg(:,:)
+CONTAINS
+
+  SUBROUTINE caladvtrac_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE infotrac, ONLY: nqtot
+  USE advtrac_mod, ONLY : advtrac_allocate
+  USE groupe_mod 
+  IMPLICIT NONE
+  INCLUDE "dimensions.h"
+  INCLUDE "paramet.h"
+  TYPE(distrib),POINTER :: d
+
+    d=>distrib_vanleer
+    CALL allocate_u(q_adv,llm,nqtot,d)
+    CALL allocate_u(massem_adv,llm,d)
+    CALL allocate_u(wg_adv,llm,d)
+    CALL allocate_u(teta_adv,llm,d)
+    CALL allocate_u(p_adv,llmp1,d)
+    CALL allocate_u(pk_adv,llm,d)
+    CALL allocate_u(pbarug_adv,llm,d)
+    CALL allocate_v(pbarvg_adv,llm,d)
+
+    d=>distrib_caldyn
+    CALL allocate_u(massem,llm,d)
+    CALL allocate_u(pbaruc,llm,d)
+    pbaruc(:,:)=0
+    CALL allocate_v(pbarvc,llm,d)
+    pbarvc(:,:)=0
+    CALL allocate_u(pbarug,llm,d)
+    CALL allocate_v(pbarvg,llm,d)
+    CALL allocate_u(wg,llm,d)
+    ! Offline
+    CALL allocate_u(tetac,llm,d)
+    CALL allocate_u(phic,llm,d)
+    CALL allocate_u(pbarucc,llm,d)
+    CALL allocate_v(pbarvcc,llm,d)
+    CALL allocate_u(massec,llm,d)
+    CALL allocate_u(pbarugg,llm,d)
+    CALL allocate_v(pbarvgg,llm,d)
+    CALL allocate_u(wgg,llm,d)
+
+    CALL groupe_allocate
+    CALL advtrac_allocate
+    
+  END SUBROUTINE caladvtrac_allocate
+  
+  SUBROUTINE caladvtrac_switch_caldyn(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  USE groupe_mod
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+
+    CALL switch_u(massem,distrib_caldyn,dist)
+    CALL switch_u(pbaruc,distrib_caldyn,dist)
+    CALL switch_v(pbarvc,distrib_caldyn,dist,up=1)
+    CALL switch_u(pbarug,distrib_caldyn,dist)
+    CALL switch_v(pbarvg,distrib_caldyn,dist)
+    CALL switch_u(wg,distrib_caldyn,dist)
+    
+    CALL groupe_switch_caldyn(dist)
+
+  END SUBROUTINE caladvtrac_switch_caldyn
+  
+  SUBROUTINE caladvtrac_switch_vanleer(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  USE advtrac_mod, ONLY : advtrac_switch_vanleer 
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+  
+    CALL switch_u(q_adv,distrib_vanleer,dist)
+    CALL switch_u(massem_adv,distrib_vanleer,dist)
+    CALL switch_u(wg_adv,distrib_vanleer,dist)
+    CALL switch_u(teta_adv,distrib_vanleer,dist)
+    CALL switch_u(p_adv,distrib_vanleer,dist)
+    CALL switch_u(pk_adv,distrib_vanleer,dist)
+    CALL switch_u(pbarug_adv,distrib_vanleer,dist)
+    CALL switch_v(pbarvg_adv,distrib_vanleer,dist)
+
+    CALL advtrac_switch_vanleer(dist)
+    
+  END SUBROUTINE caladvtrac_switch_vanleer  
+  
+END MODULE caladvtrac_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/caldyn_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/caldyn_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,179 +1,0 @@
-SUBROUTINE caldyn_loc &
-        (itau,ucov,vcov,teta,ps,masse,pk,pkf,phis , &
-        phi,conser,du,dv,dteta,dp,w,pbaru,pbarv,time )
-  USE parallel_lmdz
-  USE Write_Field_loc
-  USE caldyn_mod, ONLY: vcont, ucont, ang, p, massebx, masseby, &
-        vorpot, ecin, bern, massebxy, convm
-  USE comvert_mod, ONLY: ap, bp
-  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
-  IMPLICIT NONE
-
-  !=======================================================================
-  !
-  !  Auteur :  P. Le Van
-  !
-  !   Objet:
-  !   ------
-  !
-  !   Calcul des tendances dynamiques.
-  !
-  ! Modif 04/93 F.Forget
-  !=======================================================================
-
-  !-----------------------------------------------------------------------
-  !   0. Declarations:
-  !   ----------------
-
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-
-  !   Arguments:
-  !   ----------
-
-  LOGICAL,INTENT(IN) :: conser ! triggers printing some diagnostics ! not used
-  INTEGER,INTENT(IN) :: itau ! time step index ! not used
-  REAL,INTENT(IN) :: vcov(ijb_v:ije_v,llm) ! covariant meridional wind
-  REAL,INTENT(IN) :: ucov(ijb_u:ije_u,llm) ! covariant zonal wind
-  REAL,INTENT(IN) :: teta(ijb_u:ije_u,llm) ! potential temperature
-  REAL,INTENT(IN) :: ps(ijb_u:ije_u) ! surface pressure
-  REAL,INTENT(IN) :: phis(ijb_u:ije_u) ! geopotential at the surface
-  REAL,INTENT(IN) :: pk(iip1,jjb_u:jje_u,llm) ! Exner at mid-layer
-  REAL,INTENT(IN) :: pkf(ijb_u:ije_u,llm) ! filtered Exner
-  REAL,INTENT(IN) :: phi(ijb_u:ije_u,llm) ! geopotential
-  REAL,INTENT(OUT) :: masse(ijb_u:ije_u,llm) ! air mass
-  REAL,INTENT(OUT) :: dv(ijb_v:ije_v,llm) ! tendency on vcov
-  REAL,INTENT(OUT) :: du(ijb_u:ije_u,llm) ! tendency on ucov
-  REAL,INTENT(OUT) :: dteta(ijb_u:ije_u,llm) ! tenddency on teta
-  REAL,INTENT(OUT) :: dp(ijb_u:ije_u) ! tendency on ps
-  REAL,INTENT(OUT) :: w(ijb_u:ije_u,llm) ! vertical velocity
-  REAL,INTENT(OUT) :: pbaru(ijb_u:ije_u,llm) ! mass flux in the zonal direction
-  REAL,INTENT(OUT) :: pbarv(ijb_v:ije_v,llm) ! mass flux in the meridional direction
-  REAL,INTENT(IN) :: time ! current time
-
-  !   Local:
-  !   ------
-
-  INTEGER :: ij,l,ijb,ije,ierr
-
-
-  !-----------------------------------------------------------------------
-  !   Compute dynamical tendencies:
-  !--------------------------------
-
-  ! ! compute contravariant winds ucont() and vcont
-  CALL covcont_loc  ( llm    , ucov    , vcov , ucont, vcont     )
-  ! ! compute pressure p()
-  CALL pression_loc ( ip1jmp1, ap      , bp   ,  ps  , p         )
-  !ym      CALL psextbar (   ps   , psexbarxy                          )
-!$OMP BARRIER
-  ! ! compute mass in each atmospheric mesh: masse()
-  CALL massdair_loc (    p   , masse                             )
-  ! ! compute X and Y-averages of mass, massebx() and masseby()
-  CALL massbar_loc  (   masse, massebx , masseby                 )
-  ! ! compute XY-average of mass, massebxy()
-  call massbarxy_loc(   masse, massebxy                          )
-  ! ! compute mass fluxes pbaru() and pbarv()
-  CALL flumass_loc  ( massebx, masseby,vcont,ucont,pbaru,pbarv   )
-  ! ! compute dteta() , horizontal converging flux of theta
-  CALL dteta1_loc   (   teta , pbaru   , pbarv, dteta            )
-  ! ! compute convm(), horizontal converging flux of mass
-  CALL convmas1_loc  (   pbaru, pbarv   , convm                  )
-!$OMP BARRIER
-  CALL convmas2_loc  (   convm                      )
-!$OMP BARRIER
-IF (CPPKEY_DEBUGIO) THEN
-  call WriteField_u('ucont',ucont)
-  call WriteField_v('vcont',vcont)
-  call WriteField_u('p',p)
-  call WriteField_u('masse',masse)
-  call WriteField_u('massebx',massebx)
-  call WriteField_v('masseby',masseby)
-  call WriteField_v('massebxy',massebxy)
-  call WriteField_u('pbaru',pbaru)
-  call WriteField_v('pbarv',pbarv)
-  call WriteField_u('dteta',dteta)
-  call WriteField_u('convm',convm)
-END IF
-
-!$OMP BARRIER
-!$OMP MASTER
-  ijb=ij_begin
-  ije=ij_end
-  ! ! compute pressure variation due to mass convergence
-  DO ij =ijb, ije
-     dp( ij ) = convm( ij,1 ) / airesurg( ij )
-  ENDDO
-!$OMP END MASTER
-!$OMP BARRIER
-
-  ! ! compute vertical velocity w()
-  CALL vitvert_loc ( convm  , w                                )
-  ! ! compute potential vorticity vorpot()
-  CALL tourpot_loc ( vcov   , ucov  , massebxy  , vorpot       )
-  ! ! compute rotation induced du() and dv()
-  CALL dudv1_loc   ( vorpot , pbaru , pbarv     , du     , dv  )
-
-IF (CPPKEY_DEBUGIO) THEN
-  call WriteField_u('w',w)
-  call WriteField_v('vorpot',vorpot)
-  call WriteField_u('du',du)
-  call WriteField_v('dv',dv)
-END IF
-
-  ! ! compute kinetic energy ecin()
-  CALL enercin_loc ( vcov   , ucov  , vcont   , ucont  , ecin  )
-  ! ! compute Bernouilli function bern()
-  CALL bernoui_loc ( ip1jmp1, llm   , phi       , ecin   , bern)
-  ! ! compute and add du() and dv() contributions from Bernouilli and pressure
-  CALL dudv2_loc   ( teta   , pkf   , bern      , du     , dv  )
-
-IF (CPPKEY_DEBUGIO) THEN
-  call WriteField_u('ecin',ecin)
-  call WriteField_u('bern',bern)
-  call WriteField_u('du',du)
-  call WriteField_v('dv',dv)
-  call WriteField_u('pkf',pkf)
-END IF
-
-  ijb=ij_begin-iip1
-  ije=ij_end+iip1
-
-  if (pole_nord) ijb=ij_begin
-  if (pole_sud) ije=ij_end
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-     DO ij=ijb,ije
-        ang(ij,l) = ucov(ij,l) + constang(ij)
-    ENDDO
-  ENDDO
-!$OMP END DO
-
-  ! ! compute vertical advection contributions to du(), dv() and dteta()
-  CALL advect_new_loc(ang,vcov,teta,w,massebx,masseby,du,dv,dteta)
-
-  !  WARNING probleme de peridocite de dv sur les PC/linux. Pb d'arrondi
-       ! probablement. Observe sur le code compile avec pgf90 3.0-1
-  ijb=ij_begin
-  ije=ij_end
-  if (pole_sud) ije=ij_end-iip1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l = 1, llm
-     DO ij = ijb, ije, iip1
-       IF( dv(ij,l).NE.dv(ij+iim,l) )  THEN
-      ! PRINT *,'!!!ATTENTION!!! probleme de periodicite sur vcov',
-  !    ,   ' dans caldyn'
-      ! PRINT *,' l,  ij = ', l, ij, ij+iim,dv(ij+iim,l),dv(ij,l)
-      dv(ij+iim,l) = dv(ij,l)
-      endif
-     enddo
-  enddo
-!$OMP END DO NOWAIT
-
-  ! Ehouarn: NB: output of control variables not implemented...
-
-  RETURN
-END SUBROUTINE caldyn_loc
Index: LMDZ6/trunk/libf/dyn3dmem/caldyn_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/caldyn_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/caldyn_loc.f90	(revision 5268)
@@ -0,0 +1,179 @@
+SUBROUTINE caldyn_loc &
+        (itau,ucov,vcov,teta,ps,masse,pk,pkf,phis , &
+        phi,conser,du,dv,dteta,dp,w,pbaru,pbarv,time )
+  USE parallel_lmdz
+  USE Write_Field_loc
+  USE caldyn_mod, ONLY: vcont, ucont, ang, p, massebx, masseby, &
+        vorpot, ecin, bern, massebxy, convm
+  USE comvert_mod, ONLY: ap, bp
+  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
+  IMPLICIT NONE
+
+  !=======================================================================
+  !
+  !  Auteur :  P. Le Van
+  !
+  !   Objet:
+  !   ------
+  !
+  !   Calcul des tendances dynamiques.
+  !
+  ! Modif 04/93 F.Forget
+  !=======================================================================
+
+  !-----------------------------------------------------------------------
+  !   0. Declarations:
+  !   ----------------
+
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+
+  !   Arguments:
+  !   ----------
+
+  LOGICAL,INTENT(IN) :: conser ! triggers printing some diagnostics ! not used
+  INTEGER,INTENT(IN) :: itau ! time step index ! not used
+  REAL,INTENT(IN) :: vcov(ijb_v:ije_v,llm) ! covariant meridional wind
+  REAL,INTENT(IN) :: ucov(ijb_u:ije_u,llm) ! covariant zonal wind
+  REAL,INTENT(IN) :: teta(ijb_u:ije_u,llm) ! potential temperature
+  REAL,INTENT(IN) :: ps(ijb_u:ije_u) ! surface pressure
+  REAL,INTENT(IN) :: phis(ijb_u:ije_u) ! geopotential at the surface
+  REAL,INTENT(IN) :: pk(iip1,jjb_u:jje_u,llm) ! Exner at mid-layer
+  REAL,INTENT(IN) :: pkf(ijb_u:ije_u,llm) ! filtered Exner
+  REAL,INTENT(IN) :: phi(ijb_u:ije_u,llm) ! geopotential
+  REAL,INTENT(OUT) :: masse(ijb_u:ije_u,llm) ! air mass
+  REAL,INTENT(OUT) :: dv(ijb_v:ije_v,llm) ! tendency on vcov
+  REAL,INTENT(OUT) :: du(ijb_u:ije_u,llm) ! tendency on ucov
+  REAL,INTENT(OUT) :: dteta(ijb_u:ije_u,llm) ! tenddency on teta
+  REAL,INTENT(OUT) :: dp(ijb_u:ije_u) ! tendency on ps
+  REAL,INTENT(OUT) :: w(ijb_u:ije_u,llm) ! vertical velocity
+  REAL,INTENT(OUT) :: pbaru(ijb_u:ije_u,llm) ! mass flux in the zonal direction
+  REAL,INTENT(OUT) :: pbarv(ijb_v:ije_v,llm) ! mass flux in the meridional direction
+  REAL,INTENT(IN) :: time ! current time
+
+  !   Local:
+  !   ------
+
+  INTEGER :: ij,l,ijb,ije,ierr
+
+
+  !-----------------------------------------------------------------------
+  !   Compute dynamical tendencies:
+  !--------------------------------
+
+  ! ! compute contravariant winds ucont() and vcont
+  CALL covcont_loc  ( llm    , ucov    , vcov , ucont, vcont     )
+  ! ! compute pressure p()
+  CALL pression_loc ( ip1jmp1, ap      , bp   ,  ps  , p         )
+  !ym      CALL psextbar (   ps   , psexbarxy                          )
+!$OMP BARRIER
+  ! ! compute mass in each atmospheric mesh: masse()
+  CALL massdair_loc (    p   , masse                             )
+  ! ! compute X and Y-averages of mass, massebx() and masseby()
+  CALL massbar_loc  (   masse, massebx , masseby                 )
+  ! ! compute XY-average of mass, massebxy()
+  call massbarxy_loc(   masse, massebxy                          )
+  ! ! compute mass fluxes pbaru() and pbarv()
+  CALL flumass_loc  ( massebx, masseby,vcont,ucont,pbaru,pbarv   )
+  ! ! compute dteta() , horizontal converging flux of theta
+  CALL dteta1_loc   (   teta , pbaru   , pbarv, dteta            )
+  ! ! compute convm(), horizontal converging flux of mass
+  CALL convmas1_loc  (   pbaru, pbarv   , convm                  )
+!$OMP BARRIER
+  CALL convmas2_loc  (   convm                      )
+!$OMP BARRIER
+IF (CPPKEY_DEBUGIO) THEN
+  call WriteField_u('ucont',ucont)
+  call WriteField_v('vcont',vcont)
+  call WriteField_u('p',p)
+  call WriteField_u('masse',masse)
+  call WriteField_u('massebx',massebx)
+  call WriteField_v('masseby',masseby)
+  call WriteField_v('massebxy',massebxy)
+  call WriteField_u('pbaru',pbaru)
+  call WriteField_v('pbarv',pbarv)
+  call WriteField_u('dteta',dteta)
+  call WriteField_u('convm',convm)
+END IF
+
+!$OMP BARRIER
+!$OMP MASTER
+  ijb=ij_begin
+  ije=ij_end
+  ! ! compute pressure variation due to mass convergence
+  DO ij =ijb, ije
+     dp( ij ) = convm( ij,1 ) / airesurg( ij )
+  ENDDO
+!$OMP END MASTER
+!$OMP BARRIER
+
+  ! ! compute vertical velocity w()
+  CALL vitvert_loc ( convm  , w                                )
+  ! ! compute potential vorticity vorpot()
+  CALL tourpot_loc ( vcov   , ucov  , massebxy  , vorpot       )
+  ! ! compute rotation induced du() and dv()
+  CALL dudv1_loc   ( vorpot , pbaru , pbarv     , du     , dv  )
+
+IF (CPPKEY_DEBUGIO) THEN
+  call WriteField_u('w',w)
+  call WriteField_v('vorpot',vorpot)
+  call WriteField_u('du',du)
+  call WriteField_v('dv',dv)
+END IF
+
+  ! ! compute kinetic energy ecin()
+  CALL enercin_loc ( vcov   , ucov  , vcont   , ucont  , ecin  )
+  ! ! compute Bernouilli function bern()
+  CALL bernoui_loc ( ip1jmp1, llm   , phi       , ecin   , bern)
+  ! ! compute and add du() and dv() contributions from Bernouilli and pressure
+  CALL dudv2_loc   ( teta   , pkf   , bern      , du     , dv  )
+
+IF (CPPKEY_DEBUGIO) THEN
+  call WriteField_u('ecin',ecin)
+  call WriteField_u('bern',bern)
+  call WriteField_u('du',du)
+  call WriteField_v('dv',dv)
+  call WriteField_u('pkf',pkf)
+END IF
+
+  ijb=ij_begin-iip1
+  ije=ij_end+iip1
+
+  if (pole_nord) ijb=ij_begin
+  if (pole_sud) ije=ij_end
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+     DO ij=ijb,ije
+        ang(ij,l) = ucov(ij,l) + constang(ij)
+    ENDDO
+  ENDDO
+!$OMP END DO
+
+  ! ! compute vertical advection contributions to du(), dv() and dteta()
+  CALL advect_new_loc(ang,vcov,teta,w,massebx,masseby,du,dv,dteta)
+
+  !  WARNING probleme de peridocite de dv sur les PC/linux. Pb d'arrondi
+       ! probablement. Observe sur le code compile avec pgf90 3.0-1
+  ijb=ij_begin
+  ije=ij_end
+  if (pole_sud) ije=ij_end-iip1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l = 1, llm
+     DO ij = ijb, ije, iip1
+       IF( dv(ij,l).NE.dv(ij+iim,l) )  THEN
+      ! PRINT *,'!!!ATTENTION!!! probleme de periodicite sur vcov',
+  !    ,   ' dans caldyn'
+      ! PRINT *,' l,  ij = ', l, ij, ij+iim,dv(ij+iim,l),dv(ij,l)
+      dv(ij+iim,l) = dv(ij,l)
+      endif
+     enddo
+  enddo
+!$OMP END DO NOWAIT
+
+  ! Ehouarn: NB: output of control variables not implemented...
+
+  RETURN
+END SUBROUTINE caldyn_loc
Index: LMDZ6/trunk/libf/dyn3dmem/caldyn_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/caldyn_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,75 +1,0 @@
-MODULE caldyn_mod
-
-  REAL,POINTER,SAVE :: vcont(:,:)
-  REAL,POINTER,SAVE :: ucont(:,:)
-  REAL,POINTER,SAVE :: ang(:,:)
-  REAL,POINTER,SAVE :: p(:,:)
-  REAL,POINTER,SAVE :: massebx(:,:)
-  REAL,POINTER,SAVE :: masseby(:,:)
-  REAL,POINTER,SAVE :: psexbarxy(:,:)
-  REAL,POINTER,SAVE :: vorpot(:,:)
-  REAL,POINTER,SAVE :: ecin(:,:)
-  REAL,POINTER,SAVE :: bern(:,:)
-  REAL,POINTER,SAVE :: massebxy(:,:)
-  REAL,POINTER,SAVE :: convm(:,:)
-
-
-  
-CONTAINS
-
-  SUBROUTINE caldyn_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE dimensions_mod
-  USE advect_new_mod,ONLY : advect_new_allocate
-  IMPLICIT NONE
-  TYPE(distrib),POINTER :: d
-
-
-    d=>distrib_caldyn
-    CALL allocate_v(vcont,llm,d)
-    CALL allocate_u(ucont,llm,d)
-    CALL allocate_u(ang,llm,d)
-    CALL allocate_u(p,llmp1,d)
-    CALL allocate_u(massebx,llm,d)
-    CALL allocate_v(masseby,llm,d)
-    CALL allocate_v(psexbarxy,llm,d)
-    CALL allocate_v(vorpot,llm,d)
-    CALL allocate_u(ecin,llm,d)
-    CALL allocate_u(bern,llm,d)
-    CALL allocate_v(massebxy,llm,d)
-    CALL allocate_u(convm,llm,d)
-    
-    CALL advect_new_allocate
-    
-  END SUBROUTINE caldyn_allocate
-  
-  SUBROUTINE caldyn_switch_caldyn(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  USE advect_new_mod,ONLY : advect_new_switch_caldyn
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-
-    CALL switch_v(vcont,distrib_caldyn,dist)
-    CALL switch_u(ucont,distrib_caldyn,dist)
-    CALL switch_u(ang,distrib_caldyn,dist)
-    CALL switch_u(p,distrib_caldyn,dist)
-    CALL switch_u(massebx,distrib_caldyn,dist)
-    CALL switch_v(masseby,distrib_caldyn,dist)
-    CALL switch_v(psexbarxy,distrib_caldyn,dist)
-    CALL switch_v(vorpot,distrib_caldyn,dist)
-    CALL switch_u(ecin,distrib_caldyn,dist)
-    CALL switch_u(bern,distrib_caldyn,dist)
-    CALL switch_v(massebxy,distrib_caldyn,dist)
-    CALL switch_u(convm,distrib_caldyn,dist)
-    
-    CALL advect_new_switch_caldyn(dist)
-    
-  END SUBROUTINE caldyn_switch_caldyn
-  
-
-  
-END MODULE caldyn_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/caldyn_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/caldyn_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/caldyn_mod.f90	(revision 5268)
@@ -0,0 +1,75 @@
+MODULE caldyn_mod
+
+  REAL,POINTER,SAVE :: vcont(:,:)
+  REAL,POINTER,SAVE :: ucont(:,:)
+  REAL,POINTER,SAVE :: ang(:,:)
+  REAL,POINTER,SAVE :: p(:,:)
+  REAL,POINTER,SAVE :: massebx(:,:)
+  REAL,POINTER,SAVE :: masseby(:,:)
+  REAL,POINTER,SAVE :: psexbarxy(:,:)
+  REAL,POINTER,SAVE :: vorpot(:,:)
+  REAL,POINTER,SAVE :: ecin(:,:)
+  REAL,POINTER,SAVE :: bern(:,:)
+  REAL,POINTER,SAVE :: massebxy(:,:)
+  REAL,POINTER,SAVE :: convm(:,:)
+
+
+  
+CONTAINS
+
+  SUBROUTINE caldyn_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE dimensions_mod
+  USE advect_new_mod,ONLY : advect_new_allocate
+  IMPLICIT NONE
+  TYPE(distrib),POINTER :: d
+
+
+    d=>distrib_caldyn
+    CALL allocate_v(vcont,llm,d)
+    CALL allocate_u(ucont,llm,d)
+    CALL allocate_u(ang,llm,d)
+    CALL allocate_u(p,llmp1,d)
+    CALL allocate_u(massebx,llm,d)
+    CALL allocate_v(masseby,llm,d)
+    CALL allocate_v(psexbarxy,llm,d)
+    CALL allocate_v(vorpot,llm,d)
+    CALL allocate_u(ecin,llm,d)
+    CALL allocate_u(bern,llm,d)
+    CALL allocate_v(massebxy,llm,d)
+    CALL allocate_u(convm,llm,d)
+    
+    CALL advect_new_allocate
+    
+  END SUBROUTINE caldyn_allocate
+  
+  SUBROUTINE caldyn_switch_caldyn(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  USE advect_new_mod,ONLY : advect_new_switch_caldyn
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+
+    CALL switch_v(vcont,distrib_caldyn,dist)
+    CALL switch_u(ucont,distrib_caldyn,dist)
+    CALL switch_u(ang,distrib_caldyn,dist)
+    CALL switch_u(p,distrib_caldyn,dist)
+    CALL switch_u(massebx,distrib_caldyn,dist)
+    CALL switch_v(masseby,distrib_caldyn,dist)
+    CALL switch_v(psexbarxy,distrib_caldyn,dist)
+    CALL switch_v(vorpot,distrib_caldyn,dist)
+    CALL switch_u(ecin,distrib_caldyn,dist)
+    CALL switch_u(bern,distrib_caldyn,dist)
+    CALL switch_v(massebxy,distrib_caldyn,dist)
+    CALL switch_u(convm,distrib_caldyn,dist)
+    
+    CALL advect_new_switch_caldyn(dist)
+    
+  END SUBROUTINE caldyn_switch_caldyn
+  
+
+  
+END MODULE caldyn_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/call_calfis_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/call_calfis_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,418 +1,0 @@
-!#define DEBUG_IO
-MODULE call_calfis_mod
-
-    REAL,POINTER,SAVE :: ucov(:,:)
-    REAL,POINTER,SAVE :: vcov(:,:) 
-    REAL,POINTER,SAVE :: teta(:,:) 
-    REAL,POINTER,SAVE :: masse(:,:) 
-    REAL,POINTER,SAVE :: ps(:) 
-    REAL,POINTER,SAVE :: phis(:) 
-    REAL,POINTER,SAVE :: q(:,:,:) 
-    REAL,POINTER,SAVE :: flxw(:,:) 
-
-    REAL,POINTER,SAVE :: p(:,:) 
-    REAL,POINTER,SAVE :: pks(:) 
-    REAL,POINTER,SAVE :: pk(:,:) 
-    REAL,POINTER,SAVE :: pkf(:,:) 
-    REAL,POINTER,SAVE :: phi(:,:) 
-    REAL,POINTER,SAVE :: du(:,:) 
-    REAL,POINTER,SAVE :: dv(:,:) 
-    REAL,POINTER,SAVE :: dteta(:,:) 
-    REAL,POINTER,SAVE :: dq(:,:,:) 
-    REAL,POINTER,SAVE :: dufi(:,:) 
-    REAL,POINTER,SAVE :: dvfi(:,:) 
-    REAL,POINTER,SAVE :: dtetafi(:,:) 
-    REAL,POINTER,SAVE :: dqfi(:,:,:) 
-    REAL,POINTER,SAVE :: dpfi(:) 
-   
-    
-    
-    
-    
-CONTAINS
-
-  SUBROUTINE call_calfis_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE dimensions_mod
-  USE infotrac, ONLY: nqtot
-  IMPLICIT NONE
-    TYPE(distrib),POINTER :: d
-    d=>distrib_physic
-
-    CALL allocate_u(ucov,llm,d)
-    CALL allocate_v(vcov,llm,d)
-    CALL allocate_u(teta,llm,d)
-    CALL allocate_u(masse,llm,d)
-    CALL allocate_u(ps,d)
-    CALL allocate_u(phis,d)
-    CALL allocate_u(q,llm,nqtot,d)
-    CALL allocate_u(flxw,llm,d)
-    CALL allocate_u(p,llmp1,d)
-    CALL allocate_u(pks,d)
-    pks(:)=0
-    CALL allocate_u(pk,llm,d)
-    pk(:,:)=0
-    CALL allocate_u(pkf,llm,d)
-    CALL allocate_u(phi,llm,d)
-    CALL allocate_u(du,llm,d)
-    CALL allocate_v(dv,llm,d)
-    CALL allocate_u(dteta,llm,d)
-    CALL allocate_u(dq,llm,nqtot,d)
-    CALL allocate_u(dufi,llm,d)
-    CALL allocate_v(dvfi,llm,d)
-    CALL allocate_u(dtetafi,llm,d)
-    CALL allocate_u(dqfi,llm,nqtot,d)
-    CALL allocate_u(dpfi,d)
-  
-  END SUBROUTINE call_calfis_allocate
-  
-  
-  SUBROUTINE call_calfis(itau,lafin,ucov_dyn,vcov_dyn,teta_dyn,masse_dyn,ps_dyn, &
-                         phis_dyn,q_dyn,flxw_dyn)
-  USE dimensions_mod
-  use exner_hyb_loc_m, only: exner_hyb_loc
-  use exner_milieu_loc_m, only: exner_milieu_loc
-  USE parallel_lmdz
-  USE times
-  USE mod_hallo
-  USE Bands
-  USE vampir
-  USE infotrac, ONLY: nqtot
-  USE control_mod
-  USE write_field_loc
-  USE write_field
-  USE comconst_mod, ONLY: dtphys
-  USE logic_mod, ONLY: leapf, forward, ok_strato
-  USE comvert_mod, ONLY: ap, bp, pressure_exner
-  USE temps_mod, ONLY: day_ini, day_ref, jd_ref, jh_ref, start_time
-  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_PHYS, CPPKEY_DEBUGIO
-  USE strings_mod, ONLY: int2str
-  
-  IMPLICIT NONE
-    INCLUDE "iniprint.h"
-
-    INTEGER,INTENT(IN) :: itau ! (time) iteration step number
-    LOGICAL,INTENT(IN) :: lafin ! .true. if final time step
-    REAL,INTENT(INOUT) :: ucov_dyn(ijb_u:ije_u,llm) ! covariant zonal wind
-    REAL,INTENT(INOUT) :: vcov_dyn(ijb_v:ije_v,llm) ! covariant meridional wind
-    REAL,INTENT(INOUT) :: teta_dyn(ijb_u:ije_u,llm) ! potential temperature
-    REAL,INTENT(INOUT) :: masse_dyn(ijb_u:ije_u,llm) ! air mass
-    REAL,INTENT(INOUT) :: ps_dyn(ijb_u:ije_u) ! surface pressure
-    REAL,INTENT(INOUT) :: phis_dyn(ijb_u:ije_u) ! surface geopotential
-    REAL,INTENT(INOUT) :: q_dyn(ijb_u:ije_u,llm,nqtot) ! advected tracers
-    REAL,INTENT(INOUT) :: flxw_dyn(ijb_u:ije_u,llm) ! vertical mass flux
-
-    REAL :: dufi_tmp(iip1,llm)    
-    REAL :: dvfi_tmp(iip1,llm)  
-    REAL :: dtetafi_tmp(iip1,llm)
-    REAL :: dpfi_tmp(iip1)
-    REAL :: dqfi_tmp(iip1,llm,nqtot)
-
-    REAL :: jD_cur, jH_cur
-    CHARACTER(LEN=15) :: ztit
-    TYPE(Request),SAVE :: Request_physic
-!$OMP THREADPRIVATE(Request_physic )
-    INTEGER :: ijb,ije,l,iq
-    
-    
-IF (CPPKEY_DEBUGIO) THEN
-    CALL WriteField_u('ucovfi',ucov)
-    CALL WriteField_v('vcovfi',vcov)
-    CALL WriteField_u('tetafi',teta)
-    CALL WriteField_u('pfi',p)
-    CALL WriteField_u('pkfi',pk)
-    DO iq=1,nqtot
-      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
-    ENDDO
-END IF
-
-!
-!     .......   Ajout   P.Le Van ( 17/04/96 )   ...........
-!
-
-
-  !$OMP MASTER
-    CALL suspend_timer(timer_caldyn)
-    IF (prt_level >= 10) THEN
-      WRITE(lunout,*) 'leapfrog_p: Entree dans la physique : Iteration No ',itau
-    ENDIF
-  !$OMP END MASTER
-   
-           jD_cur = jD_ref + day_ini - day_ref                           &
-     &        + (itau+1)/day_step
-
-           IF (planet_type .eq."generic") THEN
-              ! AS: we make jD_cur to be pday
-              jD_cur = int(day_ini + itau/day_step)
-           ENDIF
-
-           jH_cur = jH_ref + start_time +                                &
-     &              mod(itau+1,day_step)/float(day_step) 
-    if (jH_cur > 1.0 ) then
-      jD_cur = jD_cur +1.
-      jH_cur = jH_cur -1.
-    endif
-
-!   Inbterface avec les routines de phylmd (phymars ... )
-!   -----------------------------------------------------
-
-!+jld
-
-!  Diagnostique de conservation de l'energie : initialisation
- 
-!-jld
-  !$OMP BARRIER
-  !$OMP MASTER
-    CALL VTb(VThallo)
-  !$OMP END MASTER
-
-IF (CPPKEY_DEBUGIO) THEN
-    CALL WriteField_u('ucovfi',ucov)
-    CALL WriteField_v('vcovfi',vcov)
-    CALL WriteField_u('tetafi',teta)
-    CALL WriteField_u('pfi',p)
-    CALL WriteField_u('pkfi',pk)
-END IF
-    
-    CALL SetTag(Request_physic,800)
-    CALL Register_SwapField_u(ucov_dyn,ucov,distrib_physic,Request_physic,up=2,down=2)
-    CALL Register_SwapField_v(vcov_dyn,vcov,distrib_physic,Request_physic,up=2,down=2)
-    CALL Register_SwapField_u(teta_dyn,teta,distrib_physic,Request_physic,up=2,down=2)
-    CALL Register_SwapField_u(masse_dyn,masse,distrib_physic,Request_physic,up=1,down=2)
-    CALL Register_SwapField_u(ps_dyn,ps,distrib_physic,Request_physic,up=2,down=2)
-    CALL Register_SwapField_u(phis_dyn,phis,distrib_physic,Request_physic,up=2,down=2)
-    CALL Register_SwapField_u(q_dyn,q,distrib_physic,Request_physic,up=2,down=2)
-    CALL Register_SwapField_u(flxw_dyn,flxw,distrib_physic,Request_physic,up=2,down=2)
- 
-    CALL SendRequest(Request_Physic)
-  !$OMP BARRIER
-    CALL WaitRequest(Request_Physic)       
-
-  !$OMP BARRIER
-  !$OMP MASTER
-    CALL Set_Distrib(distrib_Physic)
-    CALL VTe(VThallo)
-        
-    CALL VTb(VTphysiq)
-  !$OMP END MASTER
-  !$OMP BARRIER
-
-    CALL pression_loc (  ip1jmp1, ap, bp, ps,  p      )
-
-  !$OMP BARRIER
-    CALL exner_hyb_loc(  ip1jmp1, ps, p, pks, pk, pkf )
-  !$OMP BARRIER
-    CALL geopot_loc  ( ip1jmp1, teta  , pk , pks,  phis  , phi   )
-
-
-    CALL Register_Hallo_u(p,llmp1,2,2,2,2,Request_physic)
-    CALL Register_Hallo_u(pk,llm,2,2,2,2,Request_physic)
-    CALL Register_Hallo_u(phi,llm,2,2,2,2,Request_physic)
-        
-    CALL SendRequest(Request_Physic)
-  !$OMP BARRIER
-    CALL WaitRequest(Request_Physic)
-             
-  !$OMP BARRIER
-  
-  
-IF (CPPKEY_DEBUGIO) THEN
-    CALL WriteField_u('ucovfi',ucov)
-    CALL WriteField_v('vcovfi',vcov)
-    CALL WriteField_u('tetafi',teta)
-    CALL WriteField_u('pfi',p)
-    CALL WriteField_u('pkfi',pk)
-    DO iq=1,nqtot
-      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
-    ENDDO
-END IF
-
-  !$OMP BARRIER
-
-IF (CPPKEY_PHYS) THEN
-    CALL calfis_loc(lafin ,jD_cur, jH_cur,                       &
-                     ucov,vcov,teta,q,masse,ps,p,pk,phis,phi ,   &
-                     du,dv,dteta,dq,                             &
-                     flxw, dufi,dvfi,dtetafi,dqfi,dpfi  )
-END IF
-    ijb=ij_begin
-    ije=ij_end  
-    IF ( .not. pole_nord) THEN
-  
-    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-      DO l=1,llm
-        dufi_tmp(1:iip1,l)   = dufi(ijb:ijb+iim,l) 
-        dvfi_tmp(1:iip1,l)   = dvfi(ijb:ijb+iim,l)  
-        dtetafi_tmp(1:iip1,l)= dtetafi(ijb:ijb+iim,l)  
-        dqfi_tmp(1:iip1,l,:) = dqfi(ijb:ijb+iim,l,:)  
-      ENDDO
-    !$OMP END DO NOWAIT
-
-    !$OMP MASTER
-      dpfi_tmp(1:iip1)     = dpfi(ijb:ijb+iim)  
-    !$OMP END MASTER
-    
-    ENDIF ! of if ( .not. pole_nord)
-
-  !$OMP BARRIER
-  !$OMP MASTER
-    CALL Set_Distrib(distrib_Physic_bis)
-    CALL VTb(VThallo)
-  !$OMP END MASTER
-  !$OMP BARRIER
- 
-    CALL Register_Hallo_u(dufi,llm,1,0,0,1,Request_physic)
-    CALL Register_Hallo_v(dvfi,llm,1,0,0,1,Request_physic)
-    CALL Register_Hallo_u(dtetafi,llm,1,0,0,1,Request_physic)
-    CALL Register_Hallo_u(dpfi,1,1,0,0,1,Request_physic)
-
-    DO iq=1,nqtot
-      CALL Register_Hallo_u(dqfi(:,:,iq),llm,1,0,0,1,Request_physic)
-    ENDDO
-        
-    CALL SendRequest(Request_Physic)
-  !$OMP BARRIER
-    CALL WaitRequest(Request_Physic)
-             
-  !$OMP BARRIER
-  !$OMP MASTER
-    CALL VTe(VThallo)
-    CALL Set_Distrib(distrib_Physic)
-  !$OMP END MASTER
-  !$OMP BARRIER        
-    ijb=ij_begin
-    IF (.not. pole_nord) THEN
-        
-    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-      DO l=1,llm
-        dufi(ijb:ijb+iim,l) = dufi(ijb:ijb+iim,l)+dufi_tmp(1:iip1,l)
-        dvfi(ijb:ijb+iim,l) = dvfi(ijb:ijb+iim,l)+dvfi_tmp(1:iip1,l) 
-        dtetafi(ijb:ijb+iim,l) = dtetafi(ijb:ijb+iim,l)+dtetafi_tmp(1:iip1,l)
-        dqfi(ijb:ijb+iim,l,:) = dqfi(ijb:ijb+iim,l,:) + dqfi_tmp(1:iip1,l,:)
-      ENDDO
-    !$OMP END DO NOWAIT
-
-    !$OMP MASTER
-      dpfi(ijb:ijb+iim)   = dpfi(ijb:ijb+iim)+ dpfi_tmp(1:iip1)
-    !$OMP END MASTER
-          
-    endif ! of if (.not. pole_nord)
-        
-        
-IF (CPPKEY_DEBUGIO) THEN
-    CALL WriteField_u('dufi',dufi)
-    CALL WriteField_v('dvfi',dvfi)
-    CALL WriteField_u('dtetafi',dtetafi)
-    CALL WriteField_u('dpfi',dpfi)
-    DO iq=1,nqtot
-      CALL WriteField_u('dqfi'//trim(int2str(iq)),dqfi(:,:,iq))
-    ENDDO
-END IF
-
-  !$OMP BARRIER
-
-!      ajout des tendances physiques:
-!      ------------------------------
-IF (CPPKEY_DEBUGIO) THEN
-    CALL WriteField_u('ucovfi',ucov)
-    CALL WriteField_v('vcovfi',vcov)
-    CALL WriteField_u('tetafi',teta)
-    CALL WriteField_u('psfi',ps)
-    DO iq=1,nqtot
-      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
-    ENDDO
-END IF
-
-IF (CPPKEY_DEBUGIO) THEN
-    CALL WriteField_u('ucovfi',ucov)
-    CALL WriteField_v('vcovfi',vcov)
-    CALL WriteField_u('tetafi',teta)
-    CALL WriteField_u('psfi',ps)
-    DO iq=1,nqtot
-      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
-    ENDDO
-END IF
-
-    CALL addfi_loc( dtphys, leapf, forward   ,              &
-                    ucov, vcov, teta , q   ,ps ,            &
-                    dufi, dvfi, dtetafi , dqfi ,dpfi  )
-    ! since addfi updates ps(), also update p(), masse() and pk()
-    CALL pression_loc(ip1jmp1,ap,bp,ps,p)
-!$OMP BARRIER
-    CALL massdair_loc(p,masse)
-!$OMP BARRIER
-    if (pressure_exner) then
-      CALL exner_hyb_loc(ijnb_u,ps,p,pks,pk,pkf)
-    else 
-      CALL exner_milieu_loc(ijnb_u,ps,p,pks,pk,pkf)
-    endif
-!$OMP BARRIER
-
-IF (CPPKEY_DEBUGIO) THEN
-    CALL WriteField_u('ucovfi',ucov)
-    CALL WriteField_v('vcovfi',vcov)
-    CALL WriteField_u('tetafi',teta)
-    CALL WriteField_u('psfi',ps)
-    DO iq=1,nqtot
-      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
-    ENDDO
-END IF
-
-    IF (ok_strato) THEN
-!      CALL top_bound_loc( vcov,ucov,teta,masse,dufi,dvfi,dtetafi)
-      CALL top_bound_loc(vcov,ucov,teta,masse,dtphys)
-    ENDIF
-
-  !$OMP BARRIER
-  !$OMP MASTER
-    CALL VTe(VTphysiq)
-    CALL VTb(VThallo)
-  !$OMP END MASTER
-
-    CALL SetTag(Request_physic,800)
-    CALL Register_SwapField_u(ucov,ucov_dyn,distrib_caldyn,Request_physic)
-    CALL Register_SwapField_v(vcov,vcov_dyn,distrib_caldyn,Request_physic)
-    CALL Register_SwapField_u(teta,teta_dyn,distrib_caldyn,Request_physic)
-    CALL Register_SwapField_u(masse,masse_dyn,distrib_caldyn,Request_physic)
-    CALL Register_SwapField_u(ps,ps_dyn,distrib_caldyn,Request_physic)
-    CALL Register_SwapField_u(q,q_dyn,distrib_caldyn,Request_physic)
-    CALL SendRequest(Request_Physic)
-  !$OMP BARRIER
-    CALL WaitRequest(Request_Physic)     
-
-  !$OMP BARRIER
-  !$OMP MASTER
-    CALL VTe(VThallo)
-    CALL set_distrib(distrib_caldyn)
-  !$OMP END MASTER
-  !$OMP BARRIER
-
-!
-!  Diagnostique de conservation de l'energie : difference
-    IF (ip_ebil_dyn.ge.1 ) THEN 
-      ztit='bil phys'
-!      CALL diagedyn(ztit,2,1,1,dtphys,ucov, vcov , ps, p ,pk , teta , q(:,:,1), q(:,:,2))
-      write(lunout,*)"call_calfis: diagedyn disabled in dyn3dmem !!"
-    ENDIF 
-
-IF (CPPKEY_DEBUGIO) THEN
-    CALL WriteField_u('ucovfi',ucov_dyn)
-    CALL WriteField_v('vcovfi',vcov_dyn)
-    CALL WriteField_u('tetafi',teta_dyn)
-    CALL WriteField_u('psfi',ps_dyn)
-    DO iq=1,nqtot
-      CALL WriteField_u('qfi'//trim(int2str(iq)),q_dyn(:,:,iq))
-    ENDDO
-END IF
-
-
-!-jld
-    !$OMP MASTER
-      CALL resume_timer(timer_caldyn)
-    !$OMP END MASTER
-
-  END SUBROUTINE call_calfis
-  
-END MODULE call_calfis_mod
Index: LMDZ6/trunk/libf/dyn3dmem/call_calfis_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/call_calfis_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/call_calfis_mod.f90	(revision 5268)
@@ -0,0 +1,418 @@
+!#define DEBUG_IO
+MODULE call_calfis_mod
+
+    REAL,POINTER,SAVE :: ucov(:,:)
+    REAL,POINTER,SAVE :: vcov(:,:) 
+    REAL,POINTER,SAVE :: teta(:,:) 
+    REAL,POINTER,SAVE :: masse(:,:) 
+    REAL,POINTER,SAVE :: ps(:) 
+    REAL,POINTER,SAVE :: phis(:) 
+    REAL,POINTER,SAVE :: q(:,:,:) 
+    REAL,POINTER,SAVE :: flxw(:,:) 
+
+    REAL,POINTER,SAVE :: p(:,:) 
+    REAL,POINTER,SAVE :: pks(:) 
+    REAL,POINTER,SAVE :: pk(:,:) 
+    REAL,POINTER,SAVE :: pkf(:,:) 
+    REAL,POINTER,SAVE :: phi(:,:) 
+    REAL,POINTER,SAVE :: du(:,:) 
+    REAL,POINTER,SAVE :: dv(:,:) 
+    REAL,POINTER,SAVE :: dteta(:,:) 
+    REAL,POINTER,SAVE :: dq(:,:,:) 
+    REAL,POINTER,SAVE :: dufi(:,:) 
+    REAL,POINTER,SAVE :: dvfi(:,:) 
+    REAL,POINTER,SAVE :: dtetafi(:,:) 
+    REAL,POINTER,SAVE :: dqfi(:,:,:) 
+    REAL,POINTER,SAVE :: dpfi(:) 
+   
+    
+    
+    
+    
+CONTAINS
+
+  SUBROUTINE call_calfis_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE dimensions_mod
+  USE infotrac, ONLY: nqtot
+  IMPLICIT NONE
+    TYPE(distrib),POINTER :: d
+    d=>distrib_physic
+
+    CALL allocate_u(ucov,llm,d)
+    CALL allocate_v(vcov,llm,d)
+    CALL allocate_u(teta,llm,d)
+    CALL allocate_u(masse,llm,d)
+    CALL allocate_u(ps,d)
+    CALL allocate_u(phis,d)
+    CALL allocate_u(q,llm,nqtot,d)
+    CALL allocate_u(flxw,llm,d)
+    CALL allocate_u(p,llmp1,d)
+    CALL allocate_u(pks,d)
+    pks(:)=0
+    CALL allocate_u(pk,llm,d)
+    pk(:,:)=0
+    CALL allocate_u(pkf,llm,d)
+    CALL allocate_u(phi,llm,d)
+    CALL allocate_u(du,llm,d)
+    CALL allocate_v(dv,llm,d)
+    CALL allocate_u(dteta,llm,d)
+    CALL allocate_u(dq,llm,nqtot,d)
+    CALL allocate_u(dufi,llm,d)
+    CALL allocate_v(dvfi,llm,d)
+    CALL allocate_u(dtetafi,llm,d)
+    CALL allocate_u(dqfi,llm,nqtot,d)
+    CALL allocate_u(dpfi,d)
+  
+  END SUBROUTINE call_calfis_allocate
+  
+  
+  SUBROUTINE call_calfis(itau,lafin,ucov_dyn,vcov_dyn,teta_dyn,masse_dyn,ps_dyn, &
+                         phis_dyn,q_dyn,flxw_dyn)
+  USE dimensions_mod
+  use exner_hyb_loc_m, only: exner_hyb_loc
+  use exner_milieu_loc_m, only: exner_milieu_loc
+  USE parallel_lmdz
+  USE times
+  USE mod_hallo
+  USE Bands
+  USE vampir
+  USE infotrac, ONLY: nqtot
+  USE control_mod
+  USE write_field_loc
+  USE write_field
+  USE comconst_mod, ONLY: dtphys
+  USE logic_mod, ONLY: leapf, forward, ok_strato
+  USE comvert_mod, ONLY: ap, bp, pressure_exner
+  USE temps_mod, ONLY: day_ini, day_ref, jd_ref, jh_ref, start_time
+  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_PHYS, CPPKEY_DEBUGIO
+  USE strings_mod, ONLY: int2str
+  
+  IMPLICIT NONE
+    INCLUDE "iniprint.h"
+
+    INTEGER,INTENT(IN) :: itau ! (time) iteration step number
+    LOGICAL,INTENT(IN) :: lafin ! .true. if final time step
+    REAL,INTENT(INOUT) :: ucov_dyn(ijb_u:ije_u,llm) ! covariant zonal wind
+    REAL,INTENT(INOUT) :: vcov_dyn(ijb_v:ije_v,llm) ! covariant meridional wind
+    REAL,INTENT(INOUT) :: teta_dyn(ijb_u:ije_u,llm) ! potential temperature
+    REAL,INTENT(INOUT) :: masse_dyn(ijb_u:ije_u,llm) ! air mass
+    REAL,INTENT(INOUT) :: ps_dyn(ijb_u:ije_u) ! surface pressure
+    REAL,INTENT(INOUT) :: phis_dyn(ijb_u:ije_u) ! surface geopotential
+    REAL,INTENT(INOUT) :: q_dyn(ijb_u:ije_u,llm,nqtot) ! advected tracers
+    REAL,INTENT(INOUT) :: flxw_dyn(ijb_u:ije_u,llm) ! vertical mass flux
+
+    REAL :: dufi_tmp(iip1,llm)    
+    REAL :: dvfi_tmp(iip1,llm)  
+    REAL :: dtetafi_tmp(iip1,llm)
+    REAL :: dpfi_tmp(iip1)
+    REAL :: dqfi_tmp(iip1,llm,nqtot)
+
+    REAL :: jD_cur, jH_cur
+    CHARACTER(LEN=15) :: ztit
+    TYPE(Request),SAVE :: Request_physic
+!$OMP THREADPRIVATE(Request_physic )
+    INTEGER :: ijb,ije,l,iq
+    
+    
+IF (CPPKEY_DEBUGIO) THEN
+    CALL WriteField_u('ucovfi',ucov)
+    CALL WriteField_v('vcovfi',vcov)
+    CALL WriteField_u('tetafi',teta)
+    CALL WriteField_u('pfi',p)
+    CALL WriteField_u('pkfi',pk)
+    DO iq=1,nqtot
+      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
+    ENDDO
+END IF
+
+!
+!     .......   Ajout   P.Le Van ( 17/04/96 )   ...........
+!
+
+
+  !$OMP MASTER
+    CALL suspend_timer(timer_caldyn)
+    IF (prt_level >= 10) THEN
+      WRITE(lunout,*) 'leapfrog_p: Entree dans la physique : Iteration No ',itau
+    ENDIF
+  !$OMP END MASTER
+   
+           jD_cur = jD_ref + day_ini - day_ref                           &
+     &        + (itau+1)/day_step
+
+           IF (planet_type .eq."generic") THEN
+              ! AS: we make jD_cur to be pday
+              jD_cur = int(day_ini + itau/day_step)
+           ENDIF
+
+           jH_cur = jH_ref + start_time +                                &
+     &              mod(itau+1,day_step)/float(day_step) 
+    if (jH_cur > 1.0 ) then
+      jD_cur = jD_cur +1.
+      jH_cur = jH_cur -1.
+    endif
+
+!   Inbterface avec les routines de phylmd (phymars ... )
+!   -----------------------------------------------------
+
+!+jld
+
+!  Diagnostique de conservation de l'energie : initialisation
+ 
+!-jld
+  !$OMP BARRIER
+  !$OMP MASTER
+    CALL VTb(VThallo)
+  !$OMP END MASTER
+
+IF (CPPKEY_DEBUGIO) THEN
+    CALL WriteField_u('ucovfi',ucov)
+    CALL WriteField_v('vcovfi',vcov)
+    CALL WriteField_u('tetafi',teta)
+    CALL WriteField_u('pfi',p)
+    CALL WriteField_u('pkfi',pk)
+END IF
+    
+    CALL SetTag(Request_physic,800)
+    CALL Register_SwapField_u(ucov_dyn,ucov,distrib_physic,Request_physic,up=2,down=2)
+    CALL Register_SwapField_v(vcov_dyn,vcov,distrib_physic,Request_physic,up=2,down=2)
+    CALL Register_SwapField_u(teta_dyn,teta,distrib_physic,Request_physic,up=2,down=2)
+    CALL Register_SwapField_u(masse_dyn,masse,distrib_physic,Request_physic,up=1,down=2)
+    CALL Register_SwapField_u(ps_dyn,ps,distrib_physic,Request_physic,up=2,down=2)
+    CALL Register_SwapField_u(phis_dyn,phis,distrib_physic,Request_physic,up=2,down=2)
+    CALL Register_SwapField_u(q_dyn,q,distrib_physic,Request_physic,up=2,down=2)
+    CALL Register_SwapField_u(flxw_dyn,flxw,distrib_physic,Request_physic,up=2,down=2)
+ 
+    CALL SendRequest(Request_Physic)
+  !$OMP BARRIER
+    CALL WaitRequest(Request_Physic)       
+
+  !$OMP BARRIER
+  !$OMP MASTER
+    CALL Set_Distrib(distrib_Physic)
+    CALL VTe(VThallo)
+        
+    CALL VTb(VTphysiq)
+  !$OMP END MASTER
+  !$OMP BARRIER
+
+    CALL pression_loc (  ip1jmp1, ap, bp, ps,  p      )
+
+  !$OMP BARRIER
+    CALL exner_hyb_loc(  ip1jmp1, ps, p, pks, pk, pkf )
+  !$OMP BARRIER
+    CALL geopot_loc  ( ip1jmp1, teta  , pk , pks,  phis  , phi   )
+
+
+    CALL Register_Hallo_u(p,llmp1,2,2,2,2,Request_physic)
+    CALL Register_Hallo_u(pk,llm,2,2,2,2,Request_physic)
+    CALL Register_Hallo_u(phi,llm,2,2,2,2,Request_physic)
+        
+    CALL SendRequest(Request_Physic)
+  !$OMP BARRIER
+    CALL WaitRequest(Request_Physic)
+             
+  !$OMP BARRIER
+  
+  
+IF (CPPKEY_DEBUGIO) THEN
+    CALL WriteField_u('ucovfi',ucov)
+    CALL WriteField_v('vcovfi',vcov)
+    CALL WriteField_u('tetafi',teta)
+    CALL WriteField_u('pfi',p)
+    CALL WriteField_u('pkfi',pk)
+    DO iq=1,nqtot
+      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
+    ENDDO
+END IF
+
+  !$OMP BARRIER
+
+IF (CPPKEY_PHYS) THEN
+    CALL calfis_loc(lafin ,jD_cur, jH_cur,                       &
+                     ucov,vcov,teta,q,masse,ps,p,pk,phis,phi ,   &
+                     du,dv,dteta,dq,                             &
+                     flxw, dufi,dvfi,dtetafi,dqfi,dpfi  )
+END IF
+    ijb=ij_begin
+    ije=ij_end  
+    IF ( .not. pole_nord) THEN
+  
+    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+      DO l=1,llm
+        dufi_tmp(1:iip1,l)   = dufi(ijb:ijb+iim,l) 
+        dvfi_tmp(1:iip1,l)   = dvfi(ijb:ijb+iim,l)  
+        dtetafi_tmp(1:iip1,l)= dtetafi(ijb:ijb+iim,l)  
+        dqfi_tmp(1:iip1,l,:) = dqfi(ijb:ijb+iim,l,:)  
+      ENDDO
+    !$OMP END DO NOWAIT
+
+    !$OMP MASTER
+      dpfi_tmp(1:iip1)     = dpfi(ijb:ijb+iim)  
+    !$OMP END MASTER
+    
+    ENDIF ! of if ( .not. pole_nord)
+
+  !$OMP BARRIER
+  !$OMP MASTER
+    CALL Set_Distrib(distrib_Physic_bis)
+    CALL VTb(VThallo)
+  !$OMP END MASTER
+  !$OMP BARRIER
+ 
+    CALL Register_Hallo_u(dufi,llm,1,0,0,1,Request_physic)
+    CALL Register_Hallo_v(dvfi,llm,1,0,0,1,Request_physic)
+    CALL Register_Hallo_u(dtetafi,llm,1,0,0,1,Request_physic)
+    CALL Register_Hallo_u(dpfi,1,1,0,0,1,Request_physic)
+
+    DO iq=1,nqtot
+      CALL Register_Hallo_u(dqfi(:,:,iq),llm,1,0,0,1,Request_physic)
+    ENDDO
+        
+    CALL SendRequest(Request_Physic)
+  !$OMP BARRIER
+    CALL WaitRequest(Request_Physic)
+             
+  !$OMP BARRIER
+  !$OMP MASTER
+    CALL VTe(VThallo)
+    CALL Set_Distrib(distrib_Physic)
+  !$OMP END MASTER
+  !$OMP BARRIER        
+    ijb=ij_begin
+    IF (.not. pole_nord) THEN
+        
+    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+      DO l=1,llm
+        dufi(ijb:ijb+iim,l) = dufi(ijb:ijb+iim,l)+dufi_tmp(1:iip1,l)
+        dvfi(ijb:ijb+iim,l) = dvfi(ijb:ijb+iim,l)+dvfi_tmp(1:iip1,l) 
+        dtetafi(ijb:ijb+iim,l) = dtetafi(ijb:ijb+iim,l)+dtetafi_tmp(1:iip1,l)
+        dqfi(ijb:ijb+iim,l,:) = dqfi(ijb:ijb+iim,l,:) + dqfi_tmp(1:iip1,l,:)
+      ENDDO
+    !$OMP END DO NOWAIT
+
+    !$OMP MASTER
+      dpfi(ijb:ijb+iim)   = dpfi(ijb:ijb+iim)+ dpfi_tmp(1:iip1)
+    !$OMP END MASTER
+          
+    endif ! of if (.not. pole_nord)
+        
+        
+IF (CPPKEY_DEBUGIO) THEN
+    CALL WriteField_u('dufi',dufi)
+    CALL WriteField_v('dvfi',dvfi)
+    CALL WriteField_u('dtetafi',dtetafi)
+    CALL WriteField_u('dpfi',dpfi)
+    DO iq=1,nqtot
+      CALL WriteField_u('dqfi'//trim(int2str(iq)),dqfi(:,:,iq))
+    ENDDO
+END IF
+
+  !$OMP BARRIER
+
+!      ajout des tendances physiques:
+!      ------------------------------
+IF (CPPKEY_DEBUGIO) THEN
+    CALL WriteField_u('ucovfi',ucov)
+    CALL WriteField_v('vcovfi',vcov)
+    CALL WriteField_u('tetafi',teta)
+    CALL WriteField_u('psfi',ps)
+    DO iq=1,nqtot
+      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
+    ENDDO
+END IF
+
+IF (CPPKEY_DEBUGIO) THEN
+    CALL WriteField_u('ucovfi',ucov)
+    CALL WriteField_v('vcovfi',vcov)
+    CALL WriteField_u('tetafi',teta)
+    CALL WriteField_u('psfi',ps)
+    DO iq=1,nqtot
+      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
+    ENDDO
+END IF
+
+    CALL addfi_loc( dtphys, leapf, forward   ,              &
+                    ucov, vcov, teta , q   ,ps ,            &
+                    dufi, dvfi, dtetafi , dqfi ,dpfi  )
+    ! since addfi updates ps(), also update p(), masse() and pk()
+    CALL pression_loc(ip1jmp1,ap,bp,ps,p)
+!$OMP BARRIER
+    CALL massdair_loc(p,masse)
+!$OMP BARRIER
+    if (pressure_exner) then
+      CALL exner_hyb_loc(ijnb_u,ps,p,pks,pk,pkf)
+    else 
+      CALL exner_milieu_loc(ijnb_u,ps,p,pks,pk,pkf)
+    endif
+!$OMP BARRIER
+
+IF (CPPKEY_DEBUGIO) THEN
+    CALL WriteField_u('ucovfi',ucov)
+    CALL WriteField_v('vcovfi',vcov)
+    CALL WriteField_u('tetafi',teta)
+    CALL WriteField_u('psfi',ps)
+    DO iq=1,nqtot
+      CALL WriteField_u('qfi'//trim(int2str(iq)),q(:,:,iq))
+    ENDDO
+END IF
+
+    IF (ok_strato) THEN
+!      CALL top_bound_loc( vcov,ucov,teta,masse,dufi,dvfi,dtetafi)
+      CALL top_bound_loc(vcov,ucov,teta,masse,dtphys)
+    ENDIF
+
+  !$OMP BARRIER
+  !$OMP MASTER
+    CALL VTe(VTphysiq)
+    CALL VTb(VThallo)
+  !$OMP END MASTER
+
+    CALL SetTag(Request_physic,800)
+    CALL Register_SwapField_u(ucov,ucov_dyn,distrib_caldyn,Request_physic)
+    CALL Register_SwapField_v(vcov,vcov_dyn,distrib_caldyn,Request_physic)
+    CALL Register_SwapField_u(teta,teta_dyn,distrib_caldyn,Request_physic)
+    CALL Register_SwapField_u(masse,masse_dyn,distrib_caldyn,Request_physic)
+    CALL Register_SwapField_u(ps,ps_dyn,distrib_caldyn,Request_physic)
+    CALL Register_SwapField_u(q,q_dyn,distrib_caldyn,Request_physic)
+    CALL SendRequest(Request_Physic)
+  !$OMP BARRIER
+    CALL WaitRequest(Request_Physic)     
+
+  !$OMP BARRIER
+  !$OMP MASTER
+    CALL VTe(VThallo)
+    CALL set_distrib(distrib_caldyn)
+  !$OMP END MASTER
+  !$OMP BARRIER
+
+!
+!  Diagnostique de conservation de l'energie : difference
+    IF (ip_ebil_dyn.ge.1 ) THEN 
+      ztit='bil phys'
+!      CALL diagedyn(ztit,2,1,1,dtphys,ucov, vcov , ps, p ,pk , teta , q(:,:,1), q(:,:,2))
+      write(lunout,*)"call_calfis: diagedyn disabled in dyn3dmem !!"
+    ENDIF 
+
+IF (CPPKEY_DEBUGIO) THEN
+    CALL WriteField_u('ucovfi',ucov_dyn)
+    CALL WriteField_v('vcovfi',vcov_dyn)
+    CALL WriteField_u('tetafi',teta_dyn)
+    CALL WriteField_u('psfi',ps_dyn)
+    DO iq=1,nqtot
+      CALL WriteField_u('qfi'//trim(int2str(iq)),q_dyn(:,:,iq))
+    ENDDO
+END IF
+
+
+!-jld
+    !$OMP MASTER
+      CALL resume_timer(timer_caldyn)
+    !$OMP END MASTER
+
+  END SUBROUTINE call_calfis
+  
+END MODULE call_calfis_mod
Index: LMDZ6/trunk/libf/dyn3dmem/call_dissip_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/call_dissip_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,326 +1,0 @@
-MODULE call_dissip_mod
-
-    REAL,POINTER,SAVE :: ucov(:,:)
-    REAL,POINTER,SAVE :: vcov(:,:)
-    REAL,POINTER,SAVE :: teta(:,:)
-    REAL,POINTER,SAVE :: p(:,: )
-    REAL,POINTER,SAVE :: pk(:,:)
-
-    REAL,POINTER,SAVE :: ucont(:,:)
-    REAL,POINTER,SAVE :: vcont(:,:)
-    REAL,POINTER,SAVE :: ecin(:,:)
-    REAL,POINTER,SAVE :: ecin0(:,:)
-    REAL,POINTER,SAVE :: dudis(:,:)
-    REAL,POINTER,SAVE :: dvdis(:,:)
-    REAL,POINTER,SAVE :: dtetadis(:,:)
-    REAL,POINTER,SAVE :: dtetaecdt(:,:)
-
-
-
-CONTAINS
-  
-  SUBROUTINE call_dissip_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE dimensions_mod
-  USE dissip_mod, ONLY : dissip_allocate
-  IMPLICIT NONE
-    TYPE(distrib),POINTER :: d
-    d=>distrib_dissip
-
-    CALL allocate_u(ucov,llm,d)
-    ucov(:,:)=0
-    CALL allocate_v(vcov,llm,d)
-    vcov(:,:)=0
-    CALL allocate_u(teta,llm,d)
-    CALL allocate_u(p,llmp1,d)
-    CALL allocate_u(pk,llm,d)
-    CALL allocate_u(ucont,llm,d)
-    CALL allocate_v(vcont,llm,d)
-    CALL allocate_u(ecin,llm,d)
-    CALL allocate_u(ecin0,llm,d)
-    CALL allocate_u(dudis,llm,d)
-    CALL allocate_v(dvdis,llm,d)
-    CALL allocate_u(dtetadis,llm,d)
-    CALL allocate_u(dtetaecdt,llm,d)
-    
-    
-    CALL dissip_allocate
-    
-  END SUBROUTINE call_dissip_allocate
-  
-  SUBROUTINE call_dissip_switch_dissip(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  USE dissip_mod, ONLY : dissip_switch_dissip
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-
-    CALL switch_u(ucov,distrib_dissip,dist)
-    CALL switch_v(vcov,distrib_dissip,dist)
-    CALL switch_u(teta,distrib_dissip,dist)
-    CALL switch_u(p,distrib_dissip,dist)
-    CALL switch_u(pk,distrib_dissip,dist)
-    CALL switch_u(ucont,distrib_dissip,dist)
-    CALL switch_v(vcont,distrib_dissip,dist)
-    CALL switch_u(ecin,distrib_dissip,dist)
-    CALL switch_u(ecin0,distrib_dissip,dist)
-    CALL switch_u(dudis,distrib_dissip,dist)
-    CALL switch_v(dvdis,distrib_dissip,dist)
-    CALL switch_u(dtetadis,distrib_dissip,dist)
-    CALL switch_u(dtetaecdt,distrib_dissip,dist)
-
-    CALL dissip_switch_dissip(dist)
-    
-  END SUBROUTINE call_dissip_switch_dissip  
-  
-
-  
-  SUBROUTINE call_dissip(ucov_dyn,vcov_dyn,teta_dyn,p_dyn,pk_dyn,ps_dyn)
-  USE dimensions_mod
-  USE parallel_lmdz
-  USE times
-  USE mod_hallo
-  USE Bands
-  USE vampir
-  USE write_field_loc
-  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
-  IMPLICIT NONE
-    INCLUDE 'comgeom.h'
-    REAL,INTENT(INOUT) :: ucov_dyn(ijb_u:ije_u,llm) ! covariant zonal wind
-    REAL,INTENT(INOUT) :: vcov_dyn(ijb_v:ije_v,llm) ! covariant meridional wind
-    REAL,INTENT(INOUT) :: teta_dyn(ijb_u:ije_u,llm) ! covariant meridional wind
-    REAL,INTENT(INOUT) :: p_dyn(ijb_u:ije_u,llmp1 ) ! pressure at interlayer
-    REAL,INTENT(INOUT) :: pk_dyn(ijb_u:ije_u,llm) ! Exner at midlayer
-    REAL,INTENT(INOUT) :: ps_dyn(ijb_u:ije_u) ! surface pressure
-    REAL :: tppn(iim),tpps(iim)
-    REAL :: tpn,tps
-
-    REAL  SSUM
-    LOGICAL,PARAMETER :: dissip_conservative=.TRUE.
-    TYPE(Request),SAVE :: Request_dissip 
-!$OMP THREADPRIVATE(Request_dissip )    
-    INTEGER :: ij,l,ijb,ije 
-  
-    
-  !$OMP MASTER
-    CALL suspend_timer(timer_caldyn)
-        
-!       print*,'Entree dans la dissipation : Iteration No ',true_itau
-!   calcul de l'energie cinetique avant dissipation
-!       print *,'Passage dans la dissipation'
-
-    CALL VTb(VThallo)
-  !$OMP END MASTER
-
-  !$OMP BARRIER
-
-    CALL Register_SwapField_u(ucov_dyn,ucov,distrib_dissip, Request_dissip,up=1,down=1)
-    CALL Register_SwapField_v(vcov_dyn,vcov,distrib_dissip, Request_dissip,up=1,down=1)
-    CALL Register_SwapField_u(teta_dyn,teta,distrib_dissip, Request_dissip)
-    CALL Register_SwapField_u(p_dyn,p,distrib_dissip,Request_dissip)
-    CALL Register_SwapField_u(pk_dyn,pk,distrib_dissip,Request_dissip)
-
-    CALL SendRequest(Request_dissip)       
-  !$OMP BARRIER
-    CALL WaitRequest(Request_dissip)       
-
-  !$OMP BARRIER
-  !$OMP MASTER
-    CALL set_distrib(distrib_dissip)
-    CALL VTe(VThallo)
-    CALL VTb(VTdissipation)
-    CALL start_timer(timer_dissip)
-  !$OMP END MASTER
-  !$OMP BARRIER
-
-    CALL covcont_loc(llm,ucov,vcov,ucont,vcont)
-    CALL enercin_loc(vcov,ucov,vcont,ucont,ecin0)
-
-!   dissipation
-
-!        CALL FTRACE_REGION_BEGIN("dissip")
-    CALL dissip_loc(vcov,ucov,teta,p,dvdis,dudis,dtetadis)
-
-IF (CPPKEY_DEBUGIO) THEN
-    CALL WriteField_u('dudis',dudis)
-    CALL WriteField_v('dvdis',dvdis)
-    CALL WriteField_u('dtetadis',dtetadis)
-END IF
- 
-!      CALL FTRACE_REGION_END("dissip")
-         
-    ijb=ij_begin
-    ije=ij_end
-  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)        
-    DO l=1,llm
-      ucov(ijb:ije,l)=ucov(ijb:ije,l)+dudis(ijb:ije,l)
-    ENDDO
-  !$OMP END DO NOWAIT        
-
-    IF (pole_sud) ije=ije-iip1
-   
-  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)        
-    DO l=1,llm
-      vcov(ijb:ije,l)=vcov(ijb:ije,l)+dvdis(ijb:ije,l)
-    ENDDO
-  !$OMP END DO NOWAIT        
-
-!       teta=teta+dtetadis
-
-
-!------------------------------------------------------------------------
-    IF (dissip_conservative) THEN
-!       On rajoute la tendance due a la transform. Ec -> E therm. cree
-!       lors de la dissipation
-    !$OMP BARRIER
-    !$OMP MASTER
-      CALL suspend_timer(timer_dissip)
-      CALL VTb(VThallo)
-    !$OMP END MASTER
-      CALL Register_Hallo_u(ucov,llm,1,1,1,1,Request_Dissip)
-      CALL Register_Hallo_v(vcov,llm,1,1,1,1,Request_Dissip)
-      CALL SendRequest(Request_Dissip)
-    !$OMP BARRIER
-      CALL WaitRequest(Request_Dissip)
-    !$OMP MASTER
-      CALL VTe(VThallo)
-      CALL resume_timer(timer_dissip)
-    !$OMP END MASTER
-    !$OMP BARRIER            
-      CALL covcont_loc(llm,ucov,vcov,ucont,vcont)
-      CALL enercin_loc(vcov,ucov,vcont,ucont,ecin)
-            
-      ijb=ij_begin
-      ije=ij_end
-    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)            
-      DO l=1,llm
-        DO ij=ijb,ije
-           dtetaecdt(ij,l)= (ecin0(ij,l)-ecin(ij,l))/ pk(ij,l)
-           dtetadis(ij,l)=dtetadis(ij,l)+dtetaecdt(ij,l)
-        ENDDO
-      ENDDO
-    !$OMP END DO NOWAIT            
-
-    ENDIF
-
-    ijb=ij_begin
-    ije=ij_end
-
-  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)            
-    DO l=1,llm
-      DO ij=ijb,ije
-         teta(ij,l)=teta(ij,l)+dtetadis(ij,l)
-      ENDDO
-    ENDDO
-  !$OMP END DO NOWAIT         
-
-!------------------------------------------------------------------------
-
-
-!    .......        P. Le Van (  ajout  le 17/04/96  )   ...........
-!   ...      Calcul de la valeur moyenne, unique de h aux poles  .....
-!
-
-    ijb=ij_begin
-    ije=ij_end
-         
-    IF (pole_nord) THEN
-  
-   !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-      DO l  =  1, llm
-        DO ij =  1,iim
-          tppn(ij)  = aire(  ij    ) * teta(  ij    ,l)
-        ENDDO
-        tpn  = SSUM(iim,tppn,1)/apoln
-
-        DO ij = 1, iip1
-          teta(  ij    ,l) = tpn
-        ENDDO
-      ENDDO
-    !$OMP END DO NOWAIT
-
-         if (1 == 0) then
-!!! Ehouarn: lines here 1) kill 1+1=2 in the dynamics
-!!!                     2) should probably not be here anyway
-!!! but are kept for those who would want to revert to previous behaviour
-    !$OMP MASTER               
-      DO ij =  1,iim
-        tppn(ij)  = aire(  ij    ) * ps_dyn (  ij    )
-      ENDDO
-      tpn  = SSUM(iim,tppn,1)/apoln
-  
-      DO ij = 1, iip1
-        ps_dyn(  ij    ) = tpn
-      ENDDO
-    !$OMP END MASTER
-    
-    ENDIF ! of if (1 == 0)
-    endif ! of of (pole_nord)
-        
-    IF (pole_sud) THEN
-
-    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-      DO l  =  1, llm
-        DO ij =  1,iim
-          tpps(ij)  = aire(ij+ip1jm) * teta(ij+ip1jm,l)
-        ENDDO
-        
-        tps  = SSUM(iim,tpps,1)/apols
-
-        DO ij = 1, iip1
-          teta(ij+ip1jm,l) = tps
-        ENDDO
-      ENDDO
-    !$OMP END DO NOWAIT
-
-    if (1 == 0) then
-!!! Ehouarn: lines here 1) kill 1+1=2 in the dynamics
-!!!                     2) should probably not be here anyway
-!!! but are kept for those who would want to revert to previous behaviour
-    !$OMP MASTER               
-      DO ij =  1,iim
-        tpps(ij)  = aire(ij+ip1jm) * ps_dyn (ij+ip1jm)
-      ENDDO
-      tps  = SSUM(iim,tpps,1)/apols
-  
-      DO ij = 1, iip1
-        ps_dyn(ij+ip1jm) = tps
-      ENDDO
-    !$OMP END MASTER
-    ENDIF ! of if (1 == 0)
-    endif ! of if (pole_sud)
-
-
-  !$OMP BARRIER
-  !$OMP MASTER
-    CALL VTe(VTdissipation)
-    CALL stop_timer(timer_dissip)
-    CALL VTb(VThallo)
-  !$OMP END MASTER
- 
-    CALL Register_SwapField_u(ucov,ucov_dyn,distrib_caldyn,Request_dissip)
-    CALL Register_SwapField_v(vcov,vcov_dyn,distrib_caldyn,Request_dissip)
-    CALL Register_SwapField_u(teta,teta_dyn,distrib_caldyn,Request_dissip)
-    CALL Register_SwapField_u(p,p_dyn,distrib_caldyn,Request_dissip)
-    CALL Register_SwapField_u(pk,pk_dyn,distrib_caldyn,Request_dissip)
-
-    CALL SendRequest(Request_dissip)       
-
-  !$OMP BARRIER
-    CALL WaitRequest(Request_dissip)       
-  !$OMP BARRIER
-  !$OMP MASTER
-    CALL set_distrib(distrib_caldyn)
-    CALL VTe(VThallo)
-    CALL resume_timer(timer_caldyn)
-!        print *,'fin dissipation'
-  !$OMP END MASTER
-  !$OMP BARRIER
-  
-  
-  END SUBROUTINE call_dissip
-
-END MODULE call_dissip_mod
Index: LMDZ6/trunk/libf/dyn3dmem/call_dissip_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/call_dissip_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/call_dissip_mod.f90	(revision 5268)
@@ -0,0 +1,326 @@
+MODULE call_dissip_mod
+
+    REAL,POINTER,SAVE :: ucov(:,:)
+    REAL,POINTER,SAVE :: vcov(:,:)
+    REAL,POINTER,SAVE :: teta(:,:)
+    REAL,POINTER,SAVE :: p(:,: )
+    REAL,POINTER,SAVE :: pk(:,:)
+
+    REAL,POINTER,SAVE :: ucont(:,:)
+    REAL,POINTER,SAVE :: vcont(:,:)
+    REAL,POINTER,SAVE :: ecin(:,:)
+    REAL,POINTER,SAVE :: ecin0(:,:)
+    REAL,POINTER,SAVE :: dudis(:,:)
+    REAL,POINTER,SAVE :: dvdis(:,:)
+    REAL,POINTER,SAVE :: dtetadis(:,:)
+    REAL,POINTER,SAVE :: dtetaecdt(:,:)
+
+
+
+CONTAINS
+  
+  SUBROUTINE call_dissip_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE dimensions_mod
+  USE dissip_mod, ONLY : dissip_allocate
+  IMPLICIT NONE
+    TYPE(distrib),POINTER :: d
+    d=>distrib_dissip
+
+    CALL allocate_u(ucov,llm,d)
+    ucov(:,:)=0
+    CALL allocate_v(vcov,llm,d)
+    vcov(:,:)=0
+    CALL allocate_u(teta,llm,d)
+    CALL allocate_u(p,llmp1,d)
+    CALL allocate_u(pk,llm,d)
+    CALL allocate_u(ucont,llm,d)
+    CALL allocate_v(vcont,llm,d)
+    CALL allocate_u(ecin,llm,d)
+    CALL allocate_u(ecin0,llm,d)
+    CALL allocate_u(dudis,llm,d)
+    CALL allocate_v(dvdis,llm,d)
+    CALL allocate_u(dtetadis,llm,d)
+    CALL allocate_u(dtetaecdt,llm,d)
+    
+    
+    CALL dissip_allocate
+    
+  END SUBROUTINE call_dissip_allocate
+  
+  SUBROUTINE call_dissip_switch_dissip(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  USE dissip_mod, ONLY : dissip_switch_dissip
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+
+    CALL switch_u(ucov,distrib_dissip,dist)
+    CALL switch_v(vcov,distrib_dissip,dist)
+    CALL switch_u(teta,distrib_dissip,dist)
+    CALL switch_u(p,distrib_dissip,dist)
+    CALL switch_u(pk,distrib_dissip,dist)
+    CALL switch_u(ucont,distrib_dissip,dist)
+    CALL switch_v(vcont,distrib_dissip,dist)
+    CALL switch_u(ecin,distrib_dissip,dist)
+    CALL switch_u(ecin0,distrib_dissip,dist)
+    CALL switch_u(dudis,distrib_dissip,dist)
+    CALL switch_v(dvdis,distrib_dissip,dist)
+    CALL switch_u(dtetadis,distrib_dissip,dist)
+    CALL switch_u(dtetaecdt,distrib_dissip,dist)
+
+    CALL dissip_switch_dissip(dist)
+    
+  END SUBROUTINE call_dissip_switch_dissip  
+  
+
+  
+  SUBROUTINE call_dissip(ucov_dyn,vcov_dyn,teta_dyn,p_dyn,pk_dyn,ps_dyn)
+  USE dimensions_mod
+  USE parallel_lmdz
+  USE times
+  USE mod_hallo
+  USE Bands
+  USE vampir
+  USE write_field_loc
+  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
+  IMPLICIT NONE
+    INCLUDE 'comgeom.h'
+    REAL,INTENT(INOUT) :: ucov_dyn(ijb_u:ije_u,llm) ! covariant zonal wind
+    REAL,INTENT(INOUT) :: vcov_dyn(ijb_v:ije_v,llm) ! covariant meridional wind
+    REAL,INTENT(INOUT) :: teta_dyn(ijb_u:ije_u,llm) ! covariant meridional wind
+    REAL,INTENT(INOUT) :: p_dyn(ijb_u:ije_u,llmp1 ) ! pressure at interlayer
+    REAL,INTENT(INOUT) :: pk_dyn(ijb_u:ije_u,llm) ! Exner at midlayer
+    REAL,INTENT(INOUT) :: ps_dyn(ijb_u:ije_u) ! surface pressure
+    REAL :: tppn(iim),tpps(iim)
+    REAL :: tpn,tps
+
+    REAL  SSUM
+    LOGICAL,PARAMETER :: dissip_conservative=.TRUE.
+    TYPE(Request),SAVE :: Request_dissip 
+!$OMP THREADPRIVATE(Request_dissip )    
+    INTEGER :: ij,l,ijb,ije 
+  
+    
+  !$OMP MASTER
+    CALL suspend_timer(timer_caldyn)
+        
+!       print*,'Entree dans la dissipation : Iteration No ',true_itau
+!   calcul de l'energie cinetique avant dissipation
+!       print *,'Passage dans la dissipation'
+
+    CALL VTb(VThallo)
+  !$OMP END MASTER
+
+  !$OMP BARRIER
+
+    CALL Register_SwapField_u(ucov_dyn,ucov,distrib_dissip, Request_dissip,up=1,down=1)
+    CALL Register_SwapField_v(vcov_dyn,vcov,distrib_dissip, Request_dissip,up=1,down=1)
+    CALL Register_SwapField_u(teta_dyn,teta,distrib_dissip, Request_dissip)
+    CALL Register_SwapField_u(p_dyn,p,distrib_dissip,Request_dissip)
+    CALL Register_SwapField_u(pk_dyn,pk,distrib_dissip,Request_dissip)
+
+    CALL SendRequest(Request_dissip)       
+  !$OMP BARRIER
+    CALL WaitRequest(Request_dissip)       
+
+  !$OMP BARRIER
+  !$OMP MASTER
+    CALL set_distrib(distrib_dissip)
+    CALL VTe(VThallo)
+    CALL VTb(VTdissipation)
+    CALL start_timer(timer_dissip)
+  !$OMP END MASTER
+  !$OMP BARRIER
+
+    CALL covcont_loc(llm,ucov,vcov,ucont,vcont)
+    CALL enercin_loc(vcov,ucov,vcont,ucont,ecin0)
+
+!   dissipation
+
+!        CALL FTRACE_REGION_BEGIN("dissip")
+    CALL dissip_loc(vcov,ucov,teta,p,dvdis,dudis,dtetadis)
+
+IF (CPPKEY_DEBUGIO) THEN
+    CALL WriteField_u('dudis',dudis)
+    CALL WriteField_v('dvdis',dvdis)
+    CALL WriteField_u('dtetadis',dtetadis)
+END IF
+ 
+!      CALL FTRACE_REGION_END("dissip")
+         
+    ijb=ij_begin
+    ije=ij_end
+  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)        
+    DO l=1,llm
+      ucov(ijb:ije,l)=ucov(ijb:ije,l)+dudis(ijb:ije,l)
+    ENDDO
+  !$OMP END DO NOWAIT        
+
+    IF (pole_sud) ije=ije-iip1
+   
+  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)        
+    DO l=1,llm
+      vcov(ijb:ije,l)=vcov(ijb:ije,l)+dvdis(ijb:ije,l)
+    ENDDO
+  !$OMP END DO NOWAIT        
+
+!       teta=teta+dtetadis
+
+
+!------------------------------------------------------------------------
+    IF (dissip_conservative) THEN
+!       On rajoute la tendance due a la transform. Ec -> E therm. cree
+!       lors de la dissipation
+    !$OMP BARRIER
+    !$OMP MASTER
+      CALL suspend_timer(timer_dissip)
+      CALL VTb(VThallo)
+    !$OMP END MASTER
+      CALL Register_Hallo_u(ucov,llm,1,1,1,1,Request_Dissip)
+      CALL Register_Hallo_v(vcov,llm,1,1,1,1,Request_Dissip)
+      CALL SendRequest(Request_Dissip)
+    !$OMP BARRIER
+      CALL WaitRequest(Request_Dissip)
+    !$OMP MASTER
+      CALL VTe(VThallo)
+      CALL resume_timer(timer_dissip)
+    !$OMP END MASTER
+    !$OMP BARRIER            
+      CALL covcont_loc(llm,ucov,vcov,ucont,vcont)
+      CALL enercin_loc(vcov,ucov,vcont,ucont,ecin)
+            
+      ijb=ij_begin
+      ije=ij_end
+    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)            
+      DO l=1,llm
+        DO ij=ijb,ije
+           dtetaecdt(ij,l)= (ecin0(ij,l)-ecin(ij,l))/ pk(ij,l)
+           dtetadis(ij,l)=dtetadis(ij,l)+dtetaecdt(ij,l)
+        ENDDO
+      ENDDO
+    !$OMP END DO NOWAIT            
+
+    ENDIF
+
+    ijb=ij_begin
+    ije=ij_end
+
+  !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)            
+    DO l=1,llm
+      DO ij=ijb,ije
+         teta(ij,l)=teta(ij,l)+dtetadis(ij,l)
+      ENDDO
+    ENDDO
+  !$OMP END DO NOWAIT         
+
+!------------------------------------------------------------------------
+
+
+!    .......        P. Le Van (  ajout  le 17/04/96  )   ...........
+!   ...      Calcul de la valeur moyenne, unique de h aux poles  .....
+!
+
+    ijb=ij_begin
+    ije=ij_end
+         
+    IF (pole_nord) THEN
+  
+   !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+      DO l  =  1, llm
+        DO ij =  1,iim
+          tppn(ij)  = aire(  ij    ) * teta(  ij    ,l)
+        ENDDO
+        tpn  = SSUM(iim,tppn,1)/apoln
+
+        DO ij = 1, iip1
+          teta(  ij    ,l) = tpn
+        ENDDO
+      ENDDO
+    !$OMP END DO NOWAIT
+
+         if (1 == 0) then
+!!! Ehouarn: lines here 1) kill 1+1=2 in the dynamics
+!!!                     2) should probably not be here anyway
+!!! but are kept for those who would want to revert to previous behaviour
+    !$OMP MASTER               
+      DO ij =  1,iim
+        tppn(ij)  = aire(  ij    ) * ps_dyn (  ij    )
+      ENDDO
+      tpn  = SSUM(iim,tppn,1)/apoln
+  
+      DO ij = 1, iip1
+        ps_dyn(  ij    ) = tpn
+      ENDDO
+    !$OMP END MASTER
+    
+    ENDIF ! of if (1 == 0)
+    endif ! of of (pole_nord)
+        
+    IF (pole_sud) THEN
+
+    !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+      DO l  =  1, llm
+        DO ij =  1,iim
+          tpps(ij)  = aire(ij+ip1jm) * teta(ij+ip1jm,l)
+        ENDDO
+        
+        tps  = SSUM(iim,tpps,1)/apols
+
+        DO ij = 1, iip1
+          teta(ij+ip1jm,l) = tps
+        ENDDO
+      ENDDO
+    !$OMP END DO NOWAIT
+
+    if (1 == 0) then
+!!! Ehouarn: lines here 1) kill 1+1=2 in the dynamics
+!!!                     2) should probably not be here anyway
+!!! but are kept for those who would want to revert to previous behaviour
+    !$OMP MASTER               
+      DO ij =  1,iim
+        tpps(ij)  = aire(ij+ip1jm) * ps_dyn (ij+ip1jm)
+      ENDDO
+      tps  = SSUM(iim,tpps,1)/apols
+  
+      DO ij = 1, iip1
+        ps_dyn(ij+ip1jm) = tps
+      ENDDO
+    !$OMP END MASTER
+    ENDIF ! of if (1 == 0)
+    endif ! of if (pole_sud)
+
+
+  !$OMP BARRIER
+  !$OMP MASTER
+    CALL VTe(VTdissipation)
+    CALL stop_timer(timer_dissip)
+    CALL VTb(VThallo)
+  !$OMP END MASTER
+ 
+    CALL Register_SwapField_u(ucov,ucov_dyn,distrib_caldyn,Request_dissip)
+    CALL Register_SwapField_v(vcov,vcov_dyn,distrib_caldyn,Request_dissip)
+    CALL Register_SwapField_u(teta,teta_dyn,distrib_caldyn,Request_dissip)
+    CALL Register_SwapField_u(p,p_dyn,distrib_caldyn,Request_dissip)
+    CALL Register_SwapField_u(pk,pk_dyn,distrib_caldyn,Request_dissip)
+
+    CALL SendRequest(Request_dissip)       
+
+  !$OMP BARRIER
+    CALL WaitRequest(Request_dissip)       
+  !$OMP BARRIER
+  !$OMP MASTER
+    CALL set_distrib(distrib_caldyn)
+    CALL VTe(VThallo)
+    CALL resume_timer(timer_caldyn)
+!        print *,'fin dissipation'
+  !$OMP END MASTER
+  !$OMP BARRIER
+  
+  
+  END SUBROUTINE call_dissip
+
+END MODULE call_dissip_mod
Index: LMDZ6/trunk/libf/dyn3dmem/check_isotopes_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/check_isotopes_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,194 +1,0 @@
-SUBROUTINE check_isotopes(q, ijb, ije, err_msg)
-   USE parallel_lmdz
-   USE strings_mod, ONLY: maxlen, msg, strIdx, strStack, int2str, real2str
-   USE infotrac,    ONLY: nqtot, niso, nphas, isotope, isoCheck, iqIsoPha, isoSelect, &
-                          ntiso, iH2O, nzone, tracers, isoName,  itZonIso
-   USE iso_params_mod, ONLY: tnat_H216O, tnat_H217O, tnat_H218O, tnat_HDO, tnat_HTO
-   USE ioipsl,          ONLY: getin
-   IMPLICIT NONE
-   include "dimensions.h"
-   REAL,             INTENT(INOUT) :: q(ijb_u:ije_u,llm,nqtot)
-   INTEGER,          INTENT(IN)    :: ijb, ije   !--- Can be local and different from ijb_u,ije_u, for example in qminimum
-   CHARACTER(LEN=*), INTENT(IN)    :: err_msg    !--- Error message to display
-   CHARACTER(LEN=maxlen) :: modname, msg1, nm(2)
-   INTEGER :: ixt, ipha, k, i, iq, iiso, izon, ieau, iqeau, iqpar
-   INTEGER, ALLOCATABLE       ::   ix(:)
-   REAL,    ALLOCATABLE, SAVE :: tnat(:)         !--- OpenMP shared variable
-   REAL :: xtractot, xiiso, deltaD, q1, q2
-   REAL, PARAMETER :: borne     = 1e19,  &
-                      errmax    = 1e-8,  &       !--- Max. absolute error
-                      errmaxrel = 1e-3,  &       !--- Max. relative error
-                      qmin      = 1e-11, &
-                      deltaDmax =1000.0, &
-                      deltaDmin =-999.0, &
-                      ridicule  = 1e-12
-   INTEGER, SAVE :: iso_eau, iso_HDO, iso_O18, iso_O17, iso_HTO
-!$OMP THREADPRIVATE(iso_eau, iso_HDO, iso_O18, iso_O17, iso_HTO)
-   LOGICAL       :: ltnat1
-   LOGICAL, SAVE :: first=.TRUE.
-!$OMP THREADPRIVATE(first)
-
-   modname='check_isotopes'
-   IF(.NOT.isoCheck)    RETURN                   !--- No need to check => finished
-   IF(isoSelect('H2O')) RETURN                   !--- No H2O isotopes group found
-   IF(niso == 0)        RETURN                   !--- No isotopes => finished
-   IF(first) THEN
-!$OMP MASTER
-      ltnat1 = .TRUE.; CALL getin('tnateq1', ltnat1)
-      ALLOCATE(tnat(niso))
-      iso_eau = strIdx(isoName,'H216O'); IF(iso_eau /= 0) tnat(iso_eau) = tnat_H216O
-      iso_O17 = strIdx(isoName,'H217O'); IF(iso_O17 /= 0) tnat(iso_O17) = tnat_H217O
-      iso_O18 = strIdx(isoName,'H218O'); IF(iso_O18 /= 0) tnat(iso_O18) = tnat_H218O
-      iso_HDO = strIdx(isoName,'HDO');   IF(iso_HDO /= 0) tnat(iso_HDO) = tnat_HDO
-      iso_HTO = strIdx(isoName,'HTO');   IF(iso_HTO /= 0) tnat(iso_HTO) = tnat_HTO
-      IF(ltnat1) tnat(:) = 1.0
-!$OMP END MASTER
-!$OMP BARRIER
-      first = .FALSE.
-   END IF
-   CALL msg('31: err_msg='//TRIM(err_msg), modname)
-
-   !--- CHECK FOR NaNs (FOR ALL THE ISOTOPES, INCLUDING GEOGRAPHIC TAGGING TRACERS)
-   modname = 'check_isotopes:iso_verif_noNaN'
-   DO ixt = 1, ntiso
-      DO ipha = 1, nphas
-         iq = iqIsoPha(ixt,ipha)
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-         DO k = 1, llm
-            DO i = ijb, ije
-               IF(ABS(q(i,k,iq)) < borne) CYCLE
-               WRITE(msg1,'(s,"(",i0,",",i0,",",i0,") = ",ES12.4)')TRIM(isoName(ixt)),i,k,iq,q(i,k,iq)
-               CALL msg(msg1, modname)
-               CALL abort_gcm(modname, 'Error with isotopes: '//TRIM(err_msg), 1)
-            END DO
-         END DO
-!$OMP END DO NOWAIT
-      END DO
-   END DO
-
-   !--- CHECK CONSERVATION (MAIN ISOTOPE AND PARENT CONCENTRATIONS MUST BE EQUAL)
-   modname = 'check_isotopes:iso_verif_egalite'
-   ixt = iso_eau
-   IF(ixt /= 0) THEN
-      DO ipha = 1, nphas
-         iq = iqIsoPha(ixt,ipha)
-         iqpar = tracers(iq)%iqParent
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-         DO k = 1, llm
-            DO i = ijb, ije
-               q1 = q(i,k,iqpar)
-               q2 = q(i,k,iq)
-!--- IMPROVEMENT in case at least one isotope is not negligible compared to the main isotopic form.
-!    This would be probably required to sum from smallest to highest concentrations ; the corresponding
-!    indices vector can be computed once only (in the initializations stage), using mean concentrations.
-!              q2 = SUM(q(i,k,tracers(iqPar)%iqDesc), DIM=3)
-               IF(ABS(q1-q2) <= errmax .OR. ABS(q1-q2)/MAX(MAX(ABS(q1),ABS(q2)),1e-18) <= errmaxrel) THEN
-                  q(i,k,iq) = q1                 !--- Bidouille pour convergence
-!                 q(i,k,tracers(iqPar)%iqDesc) = q(i,k,tracers(iqPar)%iqDesc) * q1 / q2
-                  CYCLE
-               END IF
-               CALL msg('ixt, iq = '//TRIM(strStack(int2str([ixt,iq]))), modname)
-               msg1 = '('//TRIM(strStack(int2str([i,k])))//')'
-               CALL msg(TRIM(tracers(iqpar)%name)//TRIM(msg1)//' = '//TRIM(real2str(q1)), modname)
-               CALL msg(TRIM(tracers(iq   )%name)//TRIM(msg1)//' = '//TRIM(real2str(q2)), modname)
-               CALL abort_gcm(modname, 'Error with isotopes: '//TRIM(err_msg), 1)
-            END DO
-         END DO
-!$OMP END DO NOWAIT
-      END DO
-   END IF
-
-   !--- CHECK DELTA ANOMALIES
-   modname = 'check_isotopes:iso_verif_aberrant'
-   ix = [ iso_HDO  ,   iso_O18 ]
-   nm = ['deltaD  ', 'deltaO18']
-   DO iiso = 1, SIZE(ix)
-      ixt = ix(iiso)
-      IF(ixt  == 0) CYCLE
-      DO ipha = 1, nphas
-         iq = iqIsoPha(ixt,ipha)
-         iqpar = tracers(iq)%iqParent
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-         DO k = 1, llm
-            DO i = ijb, ije
-               q1 = q(i,k,iqpar)
-               q2 = q(i,k,iq)
-!--- IMPROVEMENT in case at least one isotope is not negligible compared to the main isotopic form.
-!    This would be probably required to sum from smallest to highest concentrations ; the corresponding
-!    indices vector can be computed once only (in the initializations stage), using mean concentrations.
-!              q2 = SUM(q(i,k,tracers(iqPar)%iqDesc), DIM=3)
-               IF(q2 <= qmin) CYCLE
-               deltaD = (q2/q1/tnat(ixt)-1.)*1000.
-               IF(deltaD <= deltaDmax .AND. deltaD >= deltaDmin) CYCLE
-               CALL msg('ixt, iq = '//TRIM(strStack(int2str([ixt,iq]))), modname)
-               msg1 = '('//TRIM(strStack(int2str([i,k])))//')'
-               CALL msg(TRIM(tracers(iqpar)%name)//TRIM(msg1)//' = '//TRIM(real2str(q1)), modname)
-               CALL msg(TRIM(tracers(iq   )%name)//TRIM(msg1)//' = '//TRIM(real2str(q2)), modname)
-               CALL msg(TRIM(nm(iiso))//TRIM(real2str(deltaD)), modname)
-               CALL abort_gcm(modname, 'Error with isotopes: '//TRIM(err_msg), 1)
-            END DO
-         END DO
-!$OMP END DO NOWAIT
-      END DO
-   END DO
-
-   IF(nzone == 0) RETURN
-
-   !--- CHECK FOR TAGGING TRACERS DELTAD ANOMALIES
-   modname = 'check_isotopes:iso_verif_aberrant'
-   IF(iso_eau /= 0 .AND. iso_HDO /= 0) THEN
-      DO izon = 1, nzone
-         ixt  = itZonIso(izon, iso_HDO)
-         ieau = itZonIso(izon, iso_eau)
-         DO ipha = 1, nphas
-            iq    = iqIsoPha(ixt,  ipha)
-            iqeau = iqIsoPha(ieau, ipha)
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-            DO k = 1, llm
-               DO i = ijb, ije
-                  q1 = q(i,k,iqeau)
-                  q2 = q(i,k,iq)
-                  IF(q2<=qmin) CYCLE
-                  deltaD = (q2/q1/tnat(iso_HDO)-1.)*1000.
-                  IF(deltaD <= deltaDmax .AND. deltaD >= deltaDmin) CYCLE
-                  CALL msg('izon, ipha = '//TRIM(strStack(int2str([izon, ipha]))), modname)
-                  CALL msg( 'ixt, ieau = '//TRIM(strStack(int2str([ ixt, ieau]))), modname)
-                  msg1 = '('//TRIM(strStack(int2str([i,k])))//')'
-                  CALL msg(TRIM(tracers(iqeau)%name)//TRIM(msg1)//' = '//TRIM(real2str(q1)), modname)
-                  CALL msg(TRIM(tracers(iq   )%name)//TRIM(msg1)//' = '//TRIM(real2str(q2)), modname)
-                  CALL msg('deltaD = '//TRIM(real2str(deltaD)), modname)
-                  CALL abort_gcm(modname, 'Error with isotopes: '//TRIM(err_msg), 1)
-               END DO
-            END DO
-!$OMP END DO NOWAIT
-         END DO
-      END DO
-   END IF
-
-   !--- CHECK FOR TAGGING TRACERS CONSERVATION (PARENT AND TAGGING TRACERS SUM OVER ALL REGIONS MUST BE EQUAL)
-   DO iiso = 1, niso
-      DO ipha = 1, nphas
-         iq = iqIsoPha(iiso, ipha)
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-         DO k = 1, llm
-            DO i = ijb, ije
-               xiiso = q(i,k,iq)
-               xtractot = SUM(q(i, k, iqIsoPha(itZonIso(1:nzone,iiso), ipha)))
-               IF(ABS(xtractot-xiiso) > errmax .AND. ABS(xtractot-xiiso)/MAX(MAX(ABS(xtractot),ABS(xiiso)),1e-18) > errmaxrel) THEN
-                  CALL msg('Error in iso_verif_aberrant trac: '//TRIM(err_msg))
-                  CALL msg('iiso, ipha = '//TRIM(strStack(int2str([iiso, ipha]))), modname)
-                  CALL msg('q('//TRIM(strStack(int2str([i,k])))//',:) = '//TRIM(strStack(real2str(q(i,k,:)))), modname)
-                  CALL abort_gcm(modname, 'Error with isotopes: '//TRIM(err_msg), 1)
-               END IF
-               IF(ABS(xtractot) <= ridicule) CYCLE
-               DO izon = 1, nzone
-                  q(i,k,iq) = q(i,k,iq) / xtractot * xiiso !--- Bidouille pour convergence
-               END DO
-            END DO
-         END DO
-!$OMP END DO NOWAIT
-      END DO
-   END DO
-
-END SUBROUTINE check_isotopes
-
Index: LMDZ6/trunk/libf/dyn3dmem/check_isotopes_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/check_isotopes_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/check_isotopes_loc.f90	(revision 5268)
@@ -0,0 +1,194 @@
+SUBROUTINE check_isotopes(q, ijb, ije, err_msg)
+   USE parallel_lmdz
+   USE strings_mod, ONLY: maxlen, msg, strIdx, strStack, int2str, real2str
+   USE infotrac,    ONLY: nqtot, niso, nphas, isotope, isoCheck, iqIsoPha, isoSelect, &
+                          ntiso, iH2O, nzone, tracers, isoName,  itZonIso
+   USE iso_params_mod, ONLY: tnat_H216O, tnat_H217O, tnat_H218O, tnat_HDO, tnat_HTO
+   USE ioipsl,          ONLY: getin
+   IMPLICIT NONE
+   include "dimensions.h"
+   REAL,             INTENT(INOUT) :: q(ijb_u:ije_u,llm,nqtot)
+   INTEGER,          INTENT(IN)    :: ijb, ije   !--- Can be local and different from ijb_u,ije_u, for example in qminimum
+   CHARACTER(LEN=*), INTENT(IN)    :: err_msg    !--- Error message to display
+   CHARACTER(LEN=maxlen) :: modname, msg1, nm(2)
+   INTEGER :: ixt, ipha, k, i, iq, iiso, izon, ieau, iqeau, iqpar
+   INTEGER, ALLOCATABLE       ::   ix(:)
+   REAL,    ALLOCATABLE, SAVE :: tnat(:)         !--- OpenMP shared variable
+   REAL :: xtractot, xiiso, deltaD, q1, q2
+   REAL, PARAMETER :: borne     = 1e19,  &
+                      errmax    = 1e-8,  &       !--- Max. absolute error
+                      errmaxrel = 1e-3,  &       !--- Max. relative error
+                      qmin      = 1e-11, &
+                      deltaDmax =1000.0, &
+                      deltaDmin =-999.0, &
+                      ridicule  = 1e-12
+   INTEGER, SAVE :: iso_eau, iso_HDO, iso_O18, iso_O17, iso_HTO
+!$OMP THREADPRIVATE(iso_eau, iso_HDO, iso_O18, iso_O17, iso_HTO)
+   LOGICAL       :: ltnat1
+   LOGICAL, SAVE :: first=.TRUE.
+!$OMP THREADPRIVATE(first)
+
+   modname='check_isotopes'
+   IF(.NOT.isoCheck)    RETURN                   !--- No need to check => finished
+   IF(isoSelect('H2O')) RETURN                   !--- No H2O isotopes group found
+   IF(niso == 0)        RETURN                   !--- No isotopes => finished
+   IF(first) THEN
+!$OMP MASTER
+      ltnat1 = .TRUE.; CALL getin('tnateq1', ltnat1)
+      ALLOCATE(tnat(niso))
+      iso_eau = strIdx(isoName,'H216O'); IF(iso_eau /= 0) tnat(iso_eau) = tnat_H216O
+      iso_O17 = strIdx(isoName,'H217O'); IF(iso_O17 /= 0) tnat(iso_O17) = tnat_H217O
+      iso_O18 = strIdx(isoName,'H218O'); IF(iso_O18 /= 0) tnat(iso_O18) = tnat_H218O
+      iso_HDO = strIdx(isoName,'HDO');   IF(iso_HDO /= 0) tnat(iso_HDO) = tnat_HDO
+      iso_HTO = strIdx(isoName,'HTO');   IF(iso_HTO /= 0) tnat(iso_HTO) = tnat_HTO
+      IF(ltnat1) tnat(:) = 1.0
+!$OMP END MASTER
+!$OMP BARRIER
+      first = .FALSE.
+   END IF
+   CALL msg('31: err_msg='//TRIM(err_msg), modname)
+
+   !--- CHECK FOR NaNs (FOR ALL THE ISOTOPES, INCLUDING GEOGRAPHIC TAGGING TRACERS)
+   modname = 'check_isotopes:iso_verif_noNaN'
+   DO ixt = 1, ntiso
+      DO ipha = 1, nphas
+         iq = iqIsoPha(ixt,ipha)
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+         DO k = 1, llm
+            DO i = ijb, ije
+               IF(ABS(q(i,k,iq)) < borne) CYCLE
+               WRITE(msg1,'(s,"(",i0,",",i0,",",i0,") = ",ES12.4)')TRIM(isoName(ixt)),i,k,iq,q(i,k,iq)
+               CALL msg(msg1, modname)
+               CALL abort_gcm(modname, 'Error with isotopes: '//TRIM(err_msg), 1)
+            END DO
+         END DO
+!$OMP END DO NOWAIT
+      END DO
+   END DO
+
+   !--- CHECK CONSERVATION (MAIN ISOTOPE AND PARENT CONCENTRATIONS MUST BE EQUAL)
+   modname = 'check_isotopes:iso_verif_egalite'
+   ixt = iso_eau
+   IF(ixt /= 0) THEN
+      DO ipha = 1, nphas
+         iq = iqIsoPha(ixt,ipha)
+         iqpar = tracers(iq)%iqParent
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+         DO k = 1, llm
+            DO i = ijb, ije
+               q1 = q(i,k,iqpar)
+               q2 = q(i,k,iq)
+!--- IMPROVEMENT in case at least one isotope is not negligible compared to the main isotopic form.
+!    This would be probably required to sum from smallest to highest concentrations ; the corresponding
+!    indices vector can be computed once only (in the initializations stage), using mean concentrations.
+!              q2 = SUM(q(i,k,tracers(iqPar)%iqDesc), DIM=3)
+               IF(ABS(q1-q2) <= errmax .OR. ABS(q1-q2)/MAX(MAX(ABS(q1),ABS(q2)),1e-18) <= errmaxrel) THEN
+                  q(i,k,iq) = q1                 !--- Bidouille pour convergence
+!                 q(i,k,tracers(iqPar)%iqDesc) = q(i,k,tracers(iqPar)%iqDesc) * q1 / q2
+                  CYCLE
+               END IF
+               CALL msg('ixt, iq = '//TRIM(strStack(int2str([ixt,iq]))), modname)
+               msg1 = '('//TRIM(strStack(int2str([i,k])))//')'
+               CALL msg(TRIM(tracers(iqpar)%name)//TRIM(msg1)//' = '//TRIM(real2str(q1)), modname)
+               CALL msg(TRIM(tracers(iq   )%name)//TRIM(msg1)//' = '//TRIM(real2str(q2)), modname)
+               CALL abort_gcm(modname, 'Error with isotopes: '//TRIM(err_msg), 1)
+            END DO
+         END DO
+!$OMP END DO NOWAIT
+      END DO
+   END IF
+
+   !--- CHECK DELTA ANOMALIES
+   modname = 'check_isotopes:iso_verif_aberrant'
+   ix = [ iso_HDO  ,   iso_O18 ]
+   nm = ['deltaD  ', 'deltaO18']
+   DO iiso = 1, SIZE(ix)
+      ixt = ix(iiso)
+      IF(ixt  == 0) CYCLE
+      DO ipha = 1, nphas
+         iq = iqIsoPha(ixt,ipha)
+         iqpar = tracers(iq)%iqParent
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+         DO k = 1, llm
+            DO i = ijb, ije
+               q1 = q(i,k,iqpar)
+               q2 = q(i,k,iq)
+!--- IMPROVEMENT in case at least one isotope is not negligible compared to the main isotopic form.
+!    This would be probably required to sum from smallest to highest concentrations ; the corresponding
+!    indices vector can be computed once only (in the initializations stage), using mean concentrations.
+!              q2 = SUM(q(i,k,tracers(iqPar)%iqDesc), DIM=3)
+               IF(q2 <= qmin) CYCLE
+               deltaD = (q2/q1/tnat(ixt)-1.)*1000.
+               IF(deltaD <= deltaDmax .AND. deltaD >= deltaDmin) CYCLE
+               CALL msg('ixt, iq = '//TRIM(strStack(int2str([ixt,iq]))), modname)
+               msg1 = '('//TRIM(strStack(int2str([i,k])))//')'
+               CALL msg(TRIM(tracers(iqpar)%name)//TRIM(msg1)//' = '//TRIM(real2str(q1)), modname)
+               CALL msg(TRIM(tracers(iq   )%name)//TRIM(msg1)//' = '//TRIM(real2str(q2)), modname)
+               CALL msg(TRIM(nm(iiso))//TRIM(real2str(deltaD)), modname)
+               CALL abort_gcm(modname, 'Error with isotopes: '//TRIM(err_msg), 1)
+            END DO
+         END DO
+!$OMP END DO NOWAIT
+      END DO
+   END DO
+
+   IF(nzone == 0) RETURN
+
+   !--- CHECK FOR TAGGING TRACERS DELTAD ANOMALIES
+   modname = 'check_isotopes:iso_verif_aberrant'
+   IF(iso_eau /= 0 .AND. iso_HDO /= 0) THEN
+      DO izon = 1, nzone
+         ixt  = itZonIso(izon, iso_HDO)
+         ieau = itZonIso(izon, iso_eau)
+         DO ipha = 1, nphas
+            iq    = iqIsoPha(ixt,  ipha)
+            iqeau = iqIsoPha(ieau, ipha)
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+            DO k = 1, llm
+               DO i = ijb, ije
+                  q1 = q(i,k,iqeau)
+                  q2 = q(i,k,iq)
+                  IF(q2<=qmin) CYCLE
+                  deltaD = (q2/q1/tnat(iso_HDO)-1.)*1000.
+                  IF(deltaD <= deltaDmax .AND. deltaD >= deltaDmin) CYCLE
+                  CALL msg('izon, ipha = '//TRIM(strStack(int2str([izon, ipha]))), modname)
+                  CALL msg( 'ixt, ieau = '//TRIM(strStack(int2str([ ixt, ieau]))), modname)
+                  msg1 = '('//TRIM(strStack(int2str([i,k])))//')'
+                  CALL msg(TRIM(tracers(iqeau)%name)//TRIM(msg1)//' = '//TRIM(real2str(q1)), modname)
+                  CALL msg(TRIM(tracers(iq   )%name)//TRIM(msg1)//' = '//TRIM(real2str(q2)), modname)
+                  CALL msg('deltaD = '//TRIM(real2str(deltaD)), modname)
+                  CALL abort_gcm(modname, 'Error with isotopes: '//TRIM(err_msg), 1)
+               END DO
+            END DO
+!$OMP END DO NOWAIT
+         END DO
+      END DO
+   END IF
+
+   !--- CHECK FOR TAGGING TRACERS CONSERVATION (PARENT AND TAGGING TRACERS SUM OVER ALL REGIONS MUST BE EQUAL)
+   DO iiso = 1, niso
+      DO ipha = 1, nphas
+         iq = iqIsoPha(iiso, ipha)
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+         DO k = 1, llm
+            DO i = ijb, ije
+               xiiso = q(i,k,iq)
+               xtractot = SUM(q(i, k, iqIsoPha(itZonIso(1:nzone,iiso), ipha)))
+               IF(ABS(xtractot-xiiso) > errmax .AND. ABS(xtractot-xiiso)/MAX(MAX(ABS(xtractot),ABS(xiiso)),1e-18) > errmaxrel) THEN
+                  CALL msg('Error in iso_verif_aberrant trac: '//TRIM(err_msg))
+                  CALL msg('iiso, ipha = '//TRIM(strStack(int2str([iiso, ipha]))), modname)
+                  CALL msg('q('//TRIM(strStack(int2str([i,k])))//',:) = '//TRIM(strStack(real2str(q(i,k,:)))), modname)
+                  CALL abort_gcm(modname, 'Error with isotopes: '//TRIM(err_msg), 1)
+               END IF
+               IF(ABS(xtractot) <= ridicule) CYCLE
+               DO izon = 1, nzone
+                  q(i,k,iq) = q(i,k,iq) / xtractot * xiiso !--- Bidouille pour convergence
+               END DO
+            END DO
+         END DO
+!$OMP END DO NOWAIT
+      END DO
+   END DO
+
+END SUBROUTINE check_isotopes
+
Index: LMDZ6/trunk/libf/dyn3dmem/convmas1_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/convmas1_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,37 +1,0 @@
-SUBROUTINE convmas1_loc (pbaru, pbarv, convm)
-!
-!-------------------------------------------------------------------------------
-! Authors: P. Le Van , Fr. Hourdin.
-!-------------------------------------------------------------------------------
-! Purpose: Compute mass flux convergence at p levels.
-!          Equivalent to convmas_loc if convmas2_loc is called after.
-  USE parallel_lmdz
-  USE mod_filtreg_p
-  IMPLICIT NONE
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-!===============================================================================
-! Arguments:
-  REAL, INTENT(IN)  :: pbaru(ijb_u:ije_u,llm)
-  REAL, INTENT(IN)  :: pbarv(ijb_v:ije_v,llm)
-  REAL, TARGET, INTENT(OUT) :: convm(ijb_u:ije_u,llm)
-!===============================================================================
-! Method used:   Computation from top to bottom.
-!   Mass convergence at level llm is equal to zero and is not stored in convm.
-!===============================================================================
-! Local variables:
-  INTEGER :: l, jjb, jje
-!===============================================================================
-
-!--- Computation of - (d(pbaru)/dx + d(pbarv)/dy )
-  CALL convflu_loc( pbaru, pbarv, llm, convm )
-
-!--- Filter
-  jjb=jj_begin
-  jje=jj_end+1
-  IF(pole_sud) jje=jj_end
-  CALL filtreg_p(convm,jjb_u,jje_u,jjb,jje,jjp1,llm,2,2,.TRUE.,1)
-
-END SUBROUTINE convmas1_loc
-
Index: LMDZ6/trunk/libf/dyn3dmem/convmas1_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/convmas1_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/convmas1_loc.f90	(revision 5268)
@@ -0,0 +1,37 @@
+SUBROUTINE convmas1_loc (pbaru, pbarv, convm)
+!
+!-------------------------------------------------------------------------------
+! Authors: P. Le Van , Fr. Hourdin.
+!-------------------------------------------------------------------------------
+! Purpose: Compute mass flux convergence at p levels.
+!          Equivalent to convmas_loc if convmas2_loc is called after.
+  USE parallel_lmdz
+  USE mod_filtreg_p
+  IMPLICIT NONE
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+!===============================================================================
+! Arguments:
+  REAL, INTENT(IN)  :: pbaru(ijb_u:ije_u,llm)
+  REAL, INTENT(IN)  :: pbarv(ijb_v:ije_v,llm)
+  REAL, TARGET, INTENT(OUT) :: convm(ijb_u:ije_u,llm)
+!===============================================================================
+! Method used:   Computation from top to bottom.
+!   Mass convergence at level llm is equal to zero and is not stored in convm.
+!===============================================================================
+! Local variables:
+  INTEGER :: l, jjb, jje
+!===============================================================================
+
+!--- Computation of - (d(pbaru)/dx + d(pbarv)/dy )
+  CALL convflu_loc( pbaru, pbarv, llm, convm )
+
+!--- Filter
+  jjb=jj_begin
+  jje=jj_end+1
+  IF(pole_sud) jje=jj_end
+  CALL filtreg_p(convm,jjb_u,jje_u,jjb,jje,jjp1,llm,2,2,.TRUE.,1)
+
+END SUBROUTINE convmas1_loc
+
Index: LMDZ6/trunk/libf/dyn3dmem/convmas2_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/convmas2_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,35 +1,0 @@
-SUBROUTINE convmas2_loc (convm)
-!
-!-------------------------------------------------------------------------------
-! Authors: P. Le Van , Fr. Hourdin.
-!-------------------------------------------------------------------------------
-! Purpose: Compute mass flux convergence at p levels.
-!          Equivalent to convmas_loc if convmas1_loc is called before.
-  USE parallel_lmdz
-  IMPLICIT NONE
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-!===============================================================================
-! Arguments:
-  REAL, INTENT(INOUT) :: convm(ijb_u:ije_u,llm)
-!===============================================================================
-! Method used:   Computation from top to bottom.
-!   Mass convergence at level llm is equal to zero and is not stored in convm.
-!===============================================================================
-! Local variables:
-  INTEGER :: l, ijb, ije
-!===============================================================================
-
-!$OMP MASTER
-!--- Mass convergence is integrated from top to bottom
-  ijb=ij_begin
-  ije=ij_end+iip1
-  IF(pole_sud) ije=ij_end
-  DO l=llmm1,1,-1
-    convm(ijb:ije,l) = convm(ijb:ije,l) + convm(ijb:ije,l+1)
-  END DO
-!$OMP END MASTER
-
-END SUBROUTINE convmas2_loc
-
Index: LMDZ6/trunk/libf/dyn3dmem/convmas2_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/convmas2_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/convmas2_loc.f90	(revision 5268)
@@ -0,0 +1,35 @@
+SUBROUTINE convmas2_loc (convm)
+!
+!-------------------------------------------------------------------------------
+! Authors: P. Le Van , Fr. Hourdin.
+!-------------------------------------------------------------------------------
+! Purpose: Compute mass flux convergence at p levels.
+!          Equivalent to convmas_loc if convmas1_loc is called before.
+  USE parallel_lmdz
+  IMPLICIT NONE
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+!===============================================================================
+! Arguments:
+  REAL, INTENT(INOUT) :: convm(ijb_u:ije_u,llm)
+!===============================================================================
+! Method used:   Computation from top to bottom.
+!   Mass convergence at level llm is equal to zero and is not stored in convm.
+!===============================================================================
+! Local variables:
+  INTEGER :: l, ijb, ije
+!===============================================================================
+
+!$OMP MASTER
+!--- Mass convergence is integrated from top to bottom
+  ijb=ij_begin
+  ije=ij_end+iip1
+  IF(pole_sud) ije=ij_end
+  DO l=llmm1,1,-1
+    convm(ijb:ije,l) = convm(ijb:ije,l) + convm(ijb:ije,l+1)
+  END DO
+!$OMP END MASTER
+
+END SUBROUTINE convmas2_loc
+
Index: LMDZ6/trunk/libf/dyn3dmem/convmas_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/convmas_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,48 +1,0 @@
-SUBROUTINE convmas_loc (pbaru, pbarv, convm)
-!
-!-------------------------------------------------------------------------------
-! Authors: P. Le Van , Fr. Hourdin.
-!-------------------------------------------------------------------------------
-! Purpose: Compute mass flux convergence at p levels.
-  USE parallel_lmdz
-  USE mod_filtreg_p
-  IMPLICIT NONE
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-!===============================================================================
-! Arguments:
-  REAL, INTENT(IN)  :: pbaru(ijb_u:ije_u,llm)
-  REAL, INTENT(IN)  :: pbarv(ijb_v:ije_v,llm)
-  REAL, INTENT(OUT) :: convm(ijb_u:ije_u,llm)
-!===============================================================================
-! Method used:   Computation from top to bottom.
-!   Mass convergence at level llm is equal to zero and is not stored in convm.
-!===============================================================================
-! Local variables:
-  INTEGER :: l, ijb, ije, jjb, jje
-!===============================================================================
-
-!--- Computation of - (d(pbaru)/dx + d(pbarv)/dy )
-  CALL convflu_loc( pbaru, pbarv, llm, convm )
-
-!--- Filter
-  jjb=jj_begin
-  jje=jj_end+1
-  IF(pole_sud) jje=jj_end
-  CALL filtreg_p(convm,jjb_u,jje_u,jjb,jje,jjp1,llm,2,2,.TRUE.,1)
-
-!--- Mass convergence is integrated from top to bottom
-!$OMP BARRIER
-!$OMP MASTER
-  ijb=ij_begin
-  ije=ij_end+iip1
-  IF(pole_sud) ije=ij_end
-  DO l=llmm1,1,-1
-    convm(ijb:ije,l) = convm(ijb:ije,l) + convm(ijb:ije,l+1)
-  END DO
-!$OMP END MASTER
-!$OMP BARRIER
-
-END SUBROUTINE convmas_loc
-
Index: LMDZ6/trunk/libf/dyn3dmem/convmas_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/convmas_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/convmas_loc.f90	(revision 5268)
@@ -0,0 +1,48 @@
+SUBROUTINE convmas_loc (pbaru, pbarv, convm)
+!
+!-------------------------------------------------------------------------------
+! Authors: P. Le Van , Fr. Hourdin.
+!-------------------------------------------------------------------------------
+! Purpose: Compute mass flux convergence at p levels.
+  USE parallel_lmdz
+  USE mod_filtreg_p
+  IMPLICIT NONE
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+!===============================================================================
+! Arguments:
+  REAL, INTENT(IN)  :: pbaru(ijb_u:ije_u,llm)
+  REAL, INTENT(IN)  :: pbarv(ijb_v:ije_v,llm)
+  REAL, INTENT(OUT) :: convm(ijb_u:ije_u,llm)
+!===============================================================================
+! Method used:   Computation from top to bottom.
+!   Mass convergence at level llm is equal to zero and is not stored in convm.
+!===============================================================================
+! Local variables:
+  INTEGER :: l, ijb, ije, jjb, jje
+!===============================================================================
+
+!--- Computation of - (d(pbaru)/dx + d(pbarv)/dy )
+  CALL convflu_loc( pbaru, pbarv, llm, convm )
+
+!--- Filter
+  jjb=jj_begin
+  jje=jj_end+1
+  IF(pole_sud) jje=jj_end
+  CALL filtreg_p(convm,jjb_u,jje_u,jjb,jje,jjp1,llm,2,2,.TRUE.,1)
+
+!--- Mass convergence is integrated from top to bottom
+!$OMP BARRIER
+!$OMP MASTER
+  ijb=ij_begin
+  ije=ij_end+iip1
+  IF(pole_sud) ije=ij_end
+  DO l=llmm1,1,-1
+    convm(ijb:ije,l) = convm(ijb:ije,l) + convm(ijb:ije,l+1)
+  END DO
+!$OMP END MASTER
+!$OMP BARRIER
+
+END SUBROUTINE convmas_loc
+
Index: LMDZ6/trunk/libf/dyn3dmem/dimensions_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/dimensions_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,4 +1,0 @@
-MODULE dimensions_mod
-  INCLUDE 'dimensions.h'
-  INCLUDE 'paramet.h'
-END MODULE dimensions_mod
Index: LMDZ6/trunk/libf/dyn3dmem/dimensions_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/dimensions_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/dimensions_mod.f90	(revision 5268)
@@ -0,0 +1,4 @@
+MODULE dimensions_mod
+  INCLUDE 'dimensions.h'
+  INCLUDE 'paramet.h'
+END MODULE dimensions_mod
Index: LMDZ6/trunk/libf/dyn3dmem/dissip_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/dissip_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,235 +1,0 @@
-!
-! $Id: $
-!
-SUBROUTINE dissip_loc( vcov,ucov,teta,p, dv,du,dh )
-  !
-  USE parallel_lmdz
-  USE write_field_loc
-  USE dissip_mod, ONLY: dissip_allocate
-  USE comconst_mod, ONLY: dtdiss
-  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
-  IMPLICIT NONE
-
-
-  ! ..  Avec nouveaux operateurs star :  gradiv2 , divgrad2, nxgraro2  ...
-                              ! (  10/01/98  )
-
-  !=======================================================================
-  !
-  !   Auteur:  P. Le Van
-  !   -------
-  !
-  !   Objet:
-  !   ------
-  !
-  !   Dissipation horizontale
-  !
-  !=======================================================================
-  !-----------------------------------------------------------------------
-  !   Declarations:
-  !   -------------
-
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-  include "comdissnew.h"
-  include "comdissipn.h"
-
-  !   Arguments:
-  !   ----------
-
-  REAL,INTENT(IN) :: vcov(ijb_v:ije_v,llm) ! covariant meridional wind
-  REAL,INTENT(IN) :: ucov(ijb_u:ije_u,llm) ! covariant zonal wind
-  REAL,INTENT(IN) :: teta(ijb_u:ije_u,llm) ! potential temperature
-  REAL,INTENT(IN) :: p(ijb_u:ije_u,llmp1) ! interlayer pressure
-  ! ! tendencies (.../s) on covariant winds and potential temperature
-  REAL,INTENT(OUT) :: dv(ijb_v:ije_v,llm)
-  REAL,INTENT(OUT) :: du(ijb_u:ije_u,llm)
-  REAL,INTENT(OUT) :: dh(ijb_u:ije_u,llm)
-
-  !   Local:
-  !   ------
-
-  REAL :: gdx(ijb_u:ije_u,llm),gdy(ijb_v:ije_v,llm)
-  REAL :: grx(ijb_u:ije_u,llm),gry(ijb_v:ije_v,llm)
-  REAL :: te1dt(llm),te2dt(llm),te3dt(llm)
-  REAL :: deltapres(ijb_u:ije_u,llm)
-
-  INTEGER :: l,ij
-
-  REAL :: SSUM
-  integer :: ijb,ije
-
-  LOGICAl,SAVE :: first=.TRUE.
-!$OMP THREADPRIVATE(first)
-
-  IF (first) THEN
-    CALL dissip_allocate
-    first=.FALSE.
-  ENDIF
-  !-----------------------------------------------------------------------
-  !   initialisations:
-  !   ----------------
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-     te1dt(l) = tetaudiv(l) * dtdiss
-     te2dt(l) = tetaurot(l) * dtdiss
-     te3dt(l) = tetah(l)    * dtdiss
-  ENDDO
-!$OMP END DO NOWAIT
-   ! CALL initial0( ijp1llm, du )
-   ! CALL initial0( ijmllm , dv )
-   ! CALL initial0( ijp1llm, dh )
-
-  ijb=ij_begin
-  ije=ij_end
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-    du(ijb:ije,l)=0
-    dh(ijb:ije,l)=0
-  ENDDO
-!$OMP END DO NOWAIT
-
-  if (pole_sud) ije=ij_end-iip1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-    dv(ijb:ije,l)=0
-  ENDDO
-!$OMP END DO NOWAIT
-
-  !-----------------------------------------------------------------------
-  !   Calcul de la dissipation:
-  !   -------------------------
-
-  !   Calcul de la partie   grad  ( div ) :
-  !   -------------------------------------
-
-
-
-  IF(lstardis) THEN
-   ! IF (.FALSE.) THEN
-     CALL gradiv2_loc( llm,ucov,vcov,nitergdiv,gdx,gdy )
-  ELSE
-      ! CALL gradiv_p ( llm,ucov,vcov,nitergdiv,gdx,gdy )
-  ENDIF
-
-IF (CPPKEY_DEBUGIO) THEN
-  call WriteField_u('gdx',gdx)
-  call WriteField_v('gdy',gdy)
-END IF
-
-  ijb=ij_begin
-  ije=ij_end
-  if (pole_sud) ije=ij_end-iip1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-     if (pole_nord) then
-       DO ij = 1, iip1
-          gdx(     ij ,l) = 0.
-       ENDDO
-     endif
-
-     if (pole_sud) then
-       DO ij = 1, iip1
-          gdx(ij+ip1jm,l) = 0.
-       ENDDO
-     endif
-
-     if (pole_nord) ijb=ij_begin+iip1
-     DO ij = ijb,ije
-        du(ij,l) = du(ij,l) - te1dt(l) *gdx(ij,l)
-     ENDDO
-
-     if (pole_nord) ijb=ij_begin
-     DO ij = ijb,ije
-        dv(ij,l) = dv(ij,l) - te1dt(l) *gdy(ij,l)
-     ENDDO
-
-   ENDDO
-!$OMP END DO NOWAIT
-  !   calcul de la partie   n X grad ( rot ):
-  !   ---------------------------------------
-
-  IF(lstardis) THEN
-   ! IF (.FALSE.) THEN
-     CALL nxgraro2_loc( llm,ucov, vcov, nitergrot,grx,gry )
-  ELSE
-      ! CALL nxgrarot_p( llm,ucov, vcov, nitergrot,grx,gry )
-  ENDIF
-
-IF (CPPKEY_DEBUGIO) THEN
-  call WriteField_u('grx',grx)
-  call WriteField_v('gry',gry)
-END IF
-
-
-  ijb=ij_begin
-  ije=ij_end
-  if (pole_sud) ije=ij_end-iip1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-
-     if (pole_nord) then
-       DO ij = 1, iip1
-          grx(ij,l) = 0.
-       ENDDO
-     endif
-
-     if (pole_nord) ijb=ij_begin+iip1
-     DO ij = ijb,ije
-        du(ij,l) = du(ij,l) - te2dt(l) * grx(ij,l)
-     ENDDO
-
-     if (pole_nord) ijb=ij_begin
-     DO ij =  ijb, ije
-        dv(ij,l) = dv(ij,l) - te2dt(l) * gry(ij,l)
-     ENDDO
-
-  ENDDO
-!$OMP END DO NOWAIT
-
-  !   calcul de la partie   div ( grad ):
-  !   -----------------------------------
-
-
-  IF(lstardis) THEN
-   ! IF (.FALSE.) THEN
-
-  ijb=ij_begin
-  ije=ij_end
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-   DO l = 1, llm
-      DO ij = ijb, ije
-        deltapres(ij,l) = AMAX1( 0.,  p(ij,l) - p(ij,l+1) )
-      ENDDO
-   ENDDO
-!$OMP END DO NOWAIT
-     CALL divgrad2_loc( llm,teta, deltapres  ,niterh, gdx )
-  ELSE
-      ! CALL divgrad_p ( llm,teta, niterh, gdx        )
-  ENDIF
-
-IF (CPPKEY_DEBUGIO) THEN
-  call WriteField_u('gdx',gdx)
-END IF
-
-
-  ijb=ij_begin
-  ije=ij_end
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l = 1,llm
-     DO ij = ijb,ije
-        dh( ij,l ) = dh( ij,l ) - te3dt(l) * gdx( ij,l )
-     ENDDO
-  ENDDO
-!$OMP END DO NOWAIT
-
-  RETURN
-END SUBROUTINE dissip_loc
Index: LMDZ6/trunk/libf/dyn3dmem/dissip_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/dissip_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/dissip_loc.f90	(revision 5268)
@@ -0,0 +1,235 @@
+!
+! $Id: $
+!
+SUBROUTINE dissip_loc( vcov,ucov,teta,p, dv,du,dh )
+  !
+  USE parallel_lmdz
+  USE write_field_loc
+  USE dissip_mod, ONLY: dissip_allocate
+  USE comconst_mod, ONLY: dtdiss
+  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
+  IMPLICIT NONE
+
+
+  ! ..  Avec nouveaux operateurs star :  gradiv2 , divgrad2, nxgraro2  ...
+                              ! (  10/01/98  )
+
+  !=======================================================================
+  !
+  !   Auteur:  P. Le Van
+  !   -------
+  !
+  !   Objet:
+  !   ------
+  !
+  !   Dissipation horizontale
+  !
+  !=======================================================================
+  !-----------------------------------------------------------------------
+  !   Declarations:
+  !   -------------
+
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+  include "comdissnew.h"
+  include "comdissipn.h"
+
+  !   Arguments:
+  !   ----------
+
+  REAL,INTENT(IN) :: vcov(ijb_v:ije_v,llm) ! covariant meridional wind
+  REAL,INTENT(IN) :: ucov(ijb_u:ije_u,llm) ! covariant zonal wind
+  REAL,INTENT(IN) :: teta(ijb_u:ije_u,llm) ! potential temperature
+  REAL,INTENT(IN) :: p(ijb_u:ije_u,llmp1) ! interlayer pressure
+  ! ! tendencies (.../s) on covariant winds and potential temperature
+  REAL,INTENT(OUT) :: dv(ijb_v:ije_v,llm)
+  REAL,INTENT(OUT) :: du(ijb_u:ije_u,llm)
+  REAL,INTENT(OUT) :: dh(ijb_u:ije_u,llm)
+
+  !   Local:
+  !   ------
+
+  REAL :: gdx(ijb_u:ije_u,llm),gdy(ijb_v:ije_v,llm)
+  REAL :: grx(ijb_u:ije_u,llm),gry(ijb_v:ije_v,llm)
+  REAL :: te1dt(llm),te2dt(llm),te3dt(llm)
+  REAL :: deltapres(ijb_u:ije_u,llm)
+
+  INTEGER :: l,ij
+
+  REAL :: SSUM
+  integer :: ijb,ije
+
+  LOGICAl,SAVE :: first=.TRUE.
+!$OMP THREADPRIVATE(first)
+
+  IF (first) THEN
+    CALL dissip_allocate
+    first=.FALSE.
+  ENDIF
+  !-----------------------------------------------------------------------
+  !   initialisations:
+  !   ----------------
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+     te1dt(l) = tetaudiv(l) * dtdiss
+     te2dt(l) = tetaurot(l) * dtdiss
+     te3dt(l) = tetah(l)    * dtdiss
+  ENDDO
+!$OMP END DO NOWAIT
+   ! CALL initial0( ijp1llm, du )
+   ! CALL initial0( ijmllm , dv )
+   ! CALL initial0( ijp1llm, dh )
+
+  ijb=ij_begin
+  ije=ij_end
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+    du(ijb:ije,l)=0
+    dh(ijb:ije,l)=0
+  ENDDO
+!$OMP END DO NOWAIT
+
+  if (pole_sud) ije=ij_end-iip1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+    dv(ijb:ije,l)=0
+  ENDDO
+!$OMP END DO NOWAIT
+
+  !-----------------------------------------------------------------------
+  !   Calcul de la dissipation:
+  !   -------------------------
+
+  !   Calcul de la partie   grad  ( div ) :
+  !   -------------------------------------
+
+
+
+  IF(lstardis) THEN
+   ! IF (.FALSE.) THEN
+     CALL gradiv2_loc( llm,ucov,vcov,nitergdiv,gdx,gdy )
+  ELSE
+      ! CALL gradiv_p ( llm,ucov,vcov,nitergdiv,gdx,gdy )
+  ENDIF
+
+IF (CPPKEY_DEBUGIO) THEN
+  call WriteField_u('gdx',gdx)
+  call WriteField_v('gdy',gdy)
+END IF
+
+  ijb=ij_begin
+  ije=ij_end
+  if (pole_sud) ije=ij_end-iip1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+     if (pole_nord) then
+       DO ij = 1, iip1
+          gdx(     ij ,l) = 0.
+       ENDDO
+     endif
+
+     if (pole_sud) then
+       DO ij = 1, iip1
+          gdx(ij+ip1jm,l) = 0.
+       ENDDO
+     endif
+
+     if (pole_nord) ijb=ij_begin+iip1
+     DO ij = ijb,ije
+        du(ij,l) = du(ij,l) - te1dt(l) *gdx(ij,l)
+     ENDDO
+
+     if (pole_nord) ijb=ij_begin
+     DO ij = ijb,ije
+        dv(ij,l) = dv(ij,l) - te1dt(l) *gdy(ij,l)
+     ENDDO
+
+   ENDDO
+!$OMP END DO NOWAIT
+  !   calcul de la partie   n X grad ( rot ):
+  !   ---------------------------------------
+
+  IF(lstardis) THEN
+   ! IF (.FALSE.) THEN
+     CALL nxgraro2_loc( llm,ucov, vcov, nitergrot,grx,gry )
+  ELSE
+      ! CALL nxgrarot_p( llm,ucov, vcov, nitergrot,grx,gry )
+  ENDIF
+
+IF (CPPKEY_DEBUGIO) THEN
+  call WriteField_u('grx',grx)
+  call WriteField_v('gry',gry)
+END IF
+
+
+  ijb=ij_begin
+  ije=ij_end
+  if (pole_sud) ije=ij_end-iip1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+
+     if (pole_nord) then
+       DO ij = 1, iip1
+          grx(ij,l) = 0.
+       ENDDO
+     endif
+
+     if (pole_nord) ijb=ij_begin+iip1
+     DO ij = ijb,ije
+        du(ij,l) = du(ij,l) - te2dt(l) * grx(ij,l)
+     ENDDO
+
+     if (pole_nord) ijb=ij_begin
+     DO ij =  ijb, ije
+        dv(ij,l) = dv(ij,l) - te2dt(l) * gry(ij,l)
+     ENDDO
+
+  ENDDO
+!$OMP END DO NOWAIT
+
+  !   calcul de la partie   div ( grad ):
+  !   -----------------------------------
+
+
+  IF(lstardis) THEN
+   ! IF (.FALSE.) THEN
+
+  ijb=ij_begin
+  ije=ij_end
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+   DO l = 1, llm
+      DO ij = ijb, ije
+        deltapres(ij,l) = AMAX1( 0.,  p(ij,l) - p(ij,l+1) )
+      ENDDO
+   ENDDO
+!$OMP END DO NOWAIT
+     CALL divgrad2_loc( llm,teta, deltapres  ,niterh, gdx )
+  ELSE
+      ! CALL divgrad_p ( llm,teta, niterh, gdx        )
+  ENDIF
+
+IF (CPPKEY_DEBUGIO) THEN
+  call WriteField_u('gdx',gdx)
+END IF
+
+
+  ijb=ij_begin
+  ije=ij_end
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l = 1,llm
+     DO ij = ijb,ije
+        dh( ij,l ) = dh( ij,l ) - te3dt(l) * gdx( ij,l )
+     ENDDO
+  ENDDO
+!$OMP END DO NOWAIT
+
+  RETURN
+END SUBROUTINE dissip_loc
Index: LMDZ6/trunk/libf/dyn3dmem/dissip_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/dissip_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,40 +1,0 @@
-MODULE dissip_mod
-
-
-  
-CONTAINS
-
-  SUBROUTINE dissip_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE dimensions_mod
-  USE gradiv2_mod, ONLY : gradiv2_allocate
-  USE nxgraro2_mod, ONLY : nxgraro2_allocate
-  USE divgrad2_mod, ONLY : divgrad2_allocate
-  IMPLICIT NONE
-
-    CALL gradiv2_allocate
-    CALL nxgraro2_allocate
-    CALL divgrad2_allocate
-
-    
-  END SUBROUTINE dissip_allocate
-  
-  SUBROUTINE dissip_switch_dissip(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  USE gradiv2_mod,ONLY : gradiv2_switch_dissip
-  USE nxgraro2_mod,ONLY : nxgraro2_switch_dissip
-  USE divgrad2_mod,ONLY : divgrad2_switch_dissip
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-
-    CALL gradiv2_switch_dissip(dist)
-    CALL nxgraro2_switch_dissip(dist)
-    CALL divgrad2_switch_dissip(dist)
-    
-  END SUBROUTINE dissip_switch_dissip
-  
-END MODULE dissip_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/dissip_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/dissip_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/dissip_mod.f90	(revision 5268)
@@ -0,0 +1,40 @@
+MODULE dissip_mod
+
+
+  
+CONTAINS
+
+  SUBROUTINE dissip_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE dimensions_mod
+  USE gradiv2_mod, ONLY : gradiv2_allocate
+  USE nxgraro2_mod, ONLY : nxgraro2_allocate
+  USE divgrad2_mod, ONLY : divgrad2_allocate
+  IMPLICIT NONE
+
+    CALL gradiv2_allocate
+    CALL nxgraro2_allocate
+    CALL divgrad2_allocate
+
+    
+  END SUBROUTINE dissip_allocate
+  
+  SUBROUTINE dissip_switch_dissip(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  USE gradiv2_mod,ONLY : gradiv2_switch_dissip
+  USE nxgraro2_mod,ONLY : nxgraro2_switch_dissip
+  USE divgrad2_mod,ONLY : divgrad2_switch_dissip
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+
+    CALL gradiv2_switch_dissip(dist)
+    CALL nxgraro2_switch_dissip(dist)
+    CALL divgrad2_switch_dissip(dist)
+    
+  END SUBROUTINE dissip_switch_dissip
+  
+END MODULE dissip_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/divgrad2_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/divgrad2_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,33 +1,0 @@
-MODULE divgrad2_mod
-
-  REAL,POINTER,SAVE ::  divgra( :,: )
-  
-CONTAINS
-
-  SUBROUTINE divgrad2_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE dimensions_mod
-  IMPLICIT NONE
-    TYPE(distrib),POINTER :: d
-    d=>distrib_dissip
-
-    CALL allocate_u(divgra,llm,d)
-
-    
-  END SUBROUTINE divgrad2_allocate
-  
-  SUBROUTINE divgrad2_switch_dissip(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-
-    CALL switch_u(divgra,distrib_dissip,dist)
-
-
-  END SUBROUTINE divgrad2_switch_dissip
-  
-END MODULE divgrad2_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/divgrad2_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/divgrad2_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/divgrad2_mod.f90	(revision 5268)
@@ -0,0 +1,33 @@
+MODULE divgrad2_mod
+
+  REAL,POINTER,SAVE ::  divgra( :,: )
+  
+CONTAINS
+
+  SUBROUTINE divgrad2_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE dimensions_mod
+  IMPLICIT NONE
+    TYPE(distrib),POINTER :: d
+    d=>distrib_dissip
+
+    CALL allocate_u(divgra,llm,d)
+
+    
+  END SUBROUTINE divgrad2_allocate
+  
+  SUBROUTINE divgrad2_switch_dissip(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+
+    CALL switch_u(divgra,distrib_dissip,dist)
+
+
+  END SUBROUTINE divgrad2_switch_dissip
+  
+END MODULE divgrad2_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/dynetat0_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/dynetat0_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,308 +1,0 @@
-SUBROUTINE dynetat0_loc(fichnom,vcov,ucov,teta,q,masse,ps,phis,time)
-!
-!-------------------------------------------------------------------------------
-! Authors: P. Le Van , L.Fairhead
-!-------------------------------------------------------------------------------
-! Purpose: Initial state reading.
-!-------------------------------------------------------------------------------
-  USE parallel_lmdz
-  USE infotrac,    ONLY: nqtot, tracers, niso, iqIsoPha, iH2O, isoName, &
-                         new2oldH2O, newHNO3, oldHNO3
-  USE strings_mod, ONLY: maxlen, msg, strStack, real2str, int2str, strIdx
-  USE netcdf,      ONLY: NF90_OPEN,  NF90_NOWRITE, NF90_INQUIRE_DIMENSION, NF90_INQ_VARID, &
-                         NF90_CLOSE, NF90_GET_VAR, NF90_INQUIRE_VARIABLE,  NF90_NoErr
-  USE control_mod, ONLY: planet_type
-  USE assert_eq_m, ONLY: assert_eq
-  USE comvert_mod, ONLY: pa,preff
-  USE comconst_mod, ONLY: cpp, daysec, dtvr, g, im, jm, kappa, lllm, omeg, rad
-  USE logic_mod, ONLY: fxyhypb, ysinus
-  USE serre_mod, ONLY: clon, clat, grossismx, grossismy
-  USE temps_mod, ONLY: annee_ref, day_ini, day_ref, itau_dyn, start_time
-  USE ener_mod, ONLY: etot0,ptot0,ztot0,stot0,ang0
-  USE IOIPSL,   ONLY: getin
-  USE iso_params_mod   ! tnat_* and alpha_ideal_*
-  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_INCA, CPPKEY_REPROBUS
-
-  IMPLICIT NONE
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-  include "description.h"
-  include "iniprint.h"
-!===============================================================================
-! Arguments:
-  CHARACTER(LEN=*), INTENT(IN) :: fichnom          !--- FILE NAME
-  REAL, INTENT(OUT) ::  vcov(ijb_v:ije_v,llm)      !--- V COVARIANT WIND
-  REAL, INTENT(OUT) ::  ucov(ijb_u:ije_u,llm)      !--- U COVARIANT WIND
-  REAL, INTENT(OUT) ::  teta(ijb_u:ije_u,llm)      !--- POTENTIAL TEMP.
-  REAL, INTENT(OUT) ::     q(ijb_u:ije_u,llm,nqtot)!--- TRACERS
-  REAL, INTENT(OUT) :: masse(ijb_u:ije_u,llm)      !--- MASS PER CELL
-  REAL, INTENT(OUT) ::    ps(ijb_u:ije_u)          !--- GROUND PRESSURE
-  REAL, INTENT(OUT) ::  phis(ijb_u:ije_u)          !--- GEOPOTENTIAL
-!===============================================================================
-! Local variables:
-  CHARACTER(LEN=maxlen) :: mesg, var, modname, oldVar
-  INTEGER, PARAMETER :: length=100
-  INTEGER :: iq, fID, vID, idecal, ierr, iqParent, iName, iZone, iPhase, ix
-  REAL    :: time,tab_cntrl(length)    !--- RUN PARAMS TABLE
-  REAL    :: tnat, alpha_ideal
-  REAL,             ALLOCATABLE :: vcov_glo(:,:),masse_glo(:,:),   ps_glo(:)
-  REAL,             ALLOCATABLE :: ucov_glo(:,:),    q_glo(:,:), phis_glo(:)
-  REAL,             ALLOCATABLE :: teta_glo(:,:)
-  LOGICAL :: lSkip, ll, ltnat1
-!-------------------------------------------------------------------------------
-  modname="dynetat0_loc"
-
-!--- Initial state file opening
-  var=fichnom
-  CALL err(NF90_OPEN(var,NF90_NOWRITE,fID),"open",var)
-  CALL get_var1("controle",tab_cntrl)
-
-!!! AS: idecal is a hack to be able to read planeto starts...
-!!!     .... while keeping everything OK for LMDZ EARTH
-  IF(planet_type=="generic") THEN
-    CALL msg('NOTE NOTE NOTE : Planeto-like start files', modname)
-    idecal = 4
-    annee_ref  = 2000
-  ELSE
-    CALL msg('NOTE NOTE NOTE : Earth-like start files', modname)
-    idecal = 5
-    annee_ref  = tab_cntrl(5)
-  END IF
-  im         = tab_cntrl(1)
-  jm         = tab_cntrl(2)
-  lllm       = tab_cntrl(3)
-  day_ref    = tab_cntrl(4)
-  rad        = tab_cntrl(idecal+1)
-  omeg       = tab_cntrl(idecal+2)
-  g          = tab_cntrl(idecal+3)
-  cpp        = tab_cntrl(idecal+4)
-  kappa      = tab_cntrl(idecal+5)
-  daysec     = tab_cntrl(idecal+6)
-  dtvr       = tab_cntrl(idecal+7)
-  etot0      = tab_cntrl(idecal+8)
-  ptot0      = tab_cntrl(idecal+9)
-  ztot0      = tab_cntrl(idecal+10)
-  stot0      = tab_cntrl(idecal+11)
-  ang0       = tab_cntrl(idecal+12)
-  pa         = tab_cntrl(idecal+13)
-  preff      = tab_cntrl(idecal+14)
-!
-  clon       = tab_cntrl(idecal+15)
-  clat       = tab_cntrl(idecal+16)
-  grossismx  = tab_cntrl(idecal+17)
-  grossismy  = tab_cntrl(idecal+18)
-!
-  IF ( tab_cntrl(idecal+19)==1. )  THEN
-    fxyhypb  = .TRUE.
-!   dzoomx   = tab_cntrl(25)
-!   dzoomy   = tab_cntrl(26)
-!   taux     = tab_cntrl(28)
-!   tauy     = tab_cntrl(29)
-  ELSE
-    fxyhypb = .FALSE.
-    ysinus  = tab_cntrl(idecal+22)==1.
-  END IF
-
-  day_ini    = tab_cntrl(30)
-  itau_dyn   = tab_cntrl(31)
-  start_time = tab_cntrl(32)
-
-!-------------------------------------------------------------------------------
-  CALL msg('rad, omeg, g, cpp, kappa = '//TRIM(strStack(real2str([rad,omeg,g,cpp,kappa]))), modname)
-  CALL check_dim(im,iim,'im','im')
-  CALL check_dim(jm,jjm,'jm','jm')
-  CALL check_dim(lllm,llm,'lm','lllm')
-  CALL get_var1("rlonu",rlonu)
-  CALL get_var1("rlatu",rlatu)
-  CALL get_var1("rlonv",rlonv)
-  CALL get_var1("rlatv",rlatv)
-  CALL get_var1("cu"  ,cu)
-  CALL get_var1("cv"  ,cv)
-  CALL get_var1("aire",aire)
-
-  var="temps"
-  IF(NF90_INQ_VARID(fID,var,vID)/=NF90_NoErr) THEN
-    CALL msg('missing field <temps> ; trying with <Time>', modname)
-    var="Time"
-    CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var)
-  END IF
-  CALL err(NF90_GET_VAR(fID,vID,time),"get",var)
-
-  ALLOCATE(phis_glo(ip1jmp1))
-  CALL get_var1("phisinit",phis_glo)
-  phis (ijb_u:ije_u)  =phis_glo(ijb_u:ije_u);    DEALLOCATE(phis_glo)
-
-  ALLOCATE(ucov_glo(ip1jmp1,llm))
-  CALL get_var2("ucov",ucov_glo)
-  ucov (ijb_u:ije_u,:)=ucov_glo(ijb_u:ije_u,:);  DEALLOCATE(ucov_glo)
-
-  ALLOCATE(vcov_glo(ip1jm,llm))
-  CALL get_var2("vcov",vcov_glo)
-  vcov (ijb_v:ije_v,:)=vcov_glo(ijb_v:ije_v,:);  DEALLOCATE(vcov_glo)
-
-  ALLOCATE(teta_glo(ip1jmp1,llm))
-  CALL get_var2("teta",teta_glo)
-  teta (ijb_u:ije_u,:)=teta_glo(ijb_u:ije_u,:);  DEALLOCATE(teta_glo)
-
-  ALLOCATE(masse_glo(ip1jmp1,llm))
-  CALL get_var2("masse",masse_glo)
-  masse(ijb_u:ije_u,:)=masse_glo(ijb_u:ije_u,:); DEALLOCATE(masse_glo)
-  
-  ALLOCATE(ps_glo(ip1jmp1))
-  CALL get_var1("ps",ps_glo)
-  ps   (ijb_u:ije_u)  =   ps_glo(ijb_u:ije_u);   DEALLOCATE(ps_glo)
-
-!--- Tracers
-  ALLOCATE(q_glo(ip1jmp1,llm))
-  ll = .FALSE.
-IF (CPPKEY_REPROBUS) THEN
-  ll = NF90_INQ_VARID(fID, 'HNO3tot', vID) /= NF90_NoErr                                 !--- DETECT OLD REPRO start.nc FILE
-END IF
-  ltnat1 = .TRUE.; CALL getin('tnateq1', ltnat1)
-  DO iq=1,nqtot
-    var = tracers(iq)%name
-    oldVar = new2oldH2O(var)
-    lSkip = ll .AND. var == 'HNO3'                                                       !--- FORCE "HNO3_g" READING FOR "HNO3"
-IF (CPPKEY_REPROBUS) THEN
-    ix = strIdx(newHNO3, var); IF(ix /= 0) oldVar = oldHNO3(ix)                          !--- REPROBUS HNO3 exceptions
-END IF
-IF (CPPKEY_INCA) THEN
-    IF(var == 'O3') oldVar = 'OX'                                                        !--- DEAL WITH INCA OZONE EXCEPTION
-END IF
-    !--------------------------------------------------------------------------------------------------------------------------
-    IF(NF90_INQ_VARID(fID, var, vID) == NF90_NoErr .AND. .NOT.lSkip) THEN                !=== REGULAR CASE: AVAILABLE VARIABLE
-      CALL get_var2(var,q_glo); q(ijb_u:ije_u,:,iq)=q_glo(ijb_u:ije_u,:)
-    !--------------------------------------------------------------------------------------------------------------------------
-    ELSE IF(NF90_INQ_VARID(fID, oldVar, vID) == NF90_NoErr) THEN                         !=== TRY WITH ALTERNATE NAME
-      CALL msg('Missing tracer <'//TRIM(var)//'> => initialized to <'//TRIM(oldVar)//'>', modname)
-      CALL get_var2(oldVar, q_glo); q(ijb_u:ije_u,:,iq)=q_glo(ijb_u:ije_u,:)
-    !--------------------------------------------------------------------------------------------------------------------------
-    ELSE IF(tracers(iq)%iso_iGroup == iH2O .AND. niso > 0) THEN                          !=== WATER ISOTOPES
-      iName    = tracers(iq)%iso_iName
-      iPhase   = tracers(iq)%iso_iPhase
-      iqParent = tracers(iq)%iqParent
-      IF(tracers(iq)%iso_iZone == 0) THEN
-         IF(ltnat1) THEN
-            tnat = 1.0
-            alpha_ideal = 1.0
-            CALL msg(' !!!  Beware: alpha_ideal put to 1  !!!', modname)
-         ELSE
-            SELECT CASE(isoName(iName))
-              CASE('H216O'); tnat = tnat_H216O; alpha_ideal = alpha_ideal_H216O
-              CASE('H217O'); tnat = tnat_H217O; alpha_ideal = alpha_ideal_H217O
-              CASE('H218O'); tnat = tnat_H218O; alpha_ideal = alpha_ideal_H218O
-              CASE('HDO');   tnat = tnat_HDO;   alpha_ideal = alpha_ideal_HDO
-              CASE('HTO');   tnat = tnat_HTO;   alpha_ideal = alpha_ideal_HTO
-              CASE DEFAULT; CALL abort_gcm(TRIM(modname),'unknown isotope "'//TRIM(isoName(iName))//'" ; check tracer.def file',1)
-            END SELECT
-         END IF
-         CALL msg('Missing tracer <'//TRIM(var)//'> => initialized with a simplified Rayleigh distillation law.', modname)
-         q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqParent)*tnat*(q(ijb_u:ije_u,:,iqParent)/30.e-3)**(alpha_ideal-1.)
-         ! Camille 9 mars 2023: point de vigilence: initialisation incohérente
-         ! avec celle de xt_ancien dans la physiq.
-      ELSE
-         CALL msg('Missing tracer <'//TRIM(var)//'> => initialized to its parent isotope concentration.', modname)
-         ! Camille 9 mars 2023: attention!! seuls les tags qui correspondent à
-         ! izone=izone_init (définie dans isotrac_mod) sont initialisés comme
-         ! les parents. Sinon, c'est nul.
-         ! j'ai fait ça en attendant, mais il faudrait initialiser proprement en
-         ! remplacant 1 par izone_init dans la ligne qui suit.
-         IF(tracers(iq)%iso_iZone == 1) THEN
-           q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqIsoPha(iName,iPhase))
-         ELSE
-           q(ijb_u:ije_u,:,iq) =  0.
-         ENDIF
-      END IF
-    !--------------------------------------------------------------------------------------------------------------------------
-    ELSE                                                                                 !=== MISSING: SET TO 0
-      CALL msg('missing tracer <'//TRIM(var)//'> => initialized to zero', modname)
-      q(ijb_u:ije_u,:,iq)=0.
-    !--------------------------------------------------------------------------------------------------------------------------
-    END IF
-  END DO
-  DEALLOCATE(q_glo)
-  CALL err(NF90_CLOSE(fID),"close",fichnom)
-  day_ini=day_ini+INT(time)
-  time=time-INT(time)
-
-
-  CONTAINS
-
-
-SUBROUTINE check_dim(n1,n2,str1,str2)
-  INTEGER,          INTENT(IN) :: n1, n2
-  CHARACTER(LEN=*), INTENT(IN) :: str1, str2
-  CHARACTER(LEN=maxlen) :: s1, s2
-  IF(n1/=n2) CALL abort_gcm(TRIM(modname), 'value of "'//TRIM(str1)//'" = '//TRIM(int2str(n1))// &
-   ' read in starting file differs from gcm value of "'//TRIM(str2)//'" = '//TRIM(int2str(n2)), 1)
-END SUBROUTINE check_dim
-
-
-SUBROUTINE get_var1(var,v)
-  CHARACTER(LEN=*), INTENT(IN)  :: var
-  REAL,             INTENT(OUT) :: v(:)
-  REAL,             ALLOCATABLE :: w2(:,:), w3(:,:,:)
-  INTEGER :: nn(3), dids(3), k, nd, ntot
-
-  CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var)
-  ierr=NF90_INQUIRE_VARIABLE(fID,vID,ndims=nd)
-  IF(nd==1) THEN
-    CALL err(NF90_GET_VAR(fID,vID,v),"get",var); RETURN
-  END IF
-  ierr=NF90_INQUIRE_VARIABLE(fID,vID,dimids=dids)
-  DO k=1,nd; ierr=NF90_INQUIRE_DIMENSION(fID,dids(k),len=nn(k)); END DO
-  ntot=PRODUCT(nn(1:nd))
-  SELECT CASE(nd)
-    CASE(2); ALLOCATE(w2(nn(1),nn(2)))
-      CALL err(NF90_GET_VAR(fID,vID,w2),"get",var)
-      v=RESHAPE(w2,[ntot]); DEALLOCATE(w2)
-    CASE(3); ALLOCATE(w3(nn(1),nn(2),nn(3)))
-      CALL err(NF90_GET_VAR(fID,vID,w3),"get",var)
-      v=RESHAPE(w3,[ntot]); DEALLOCATE(w3)
-  END SELECT
-END SUBROUTINE get_var1
-
-SUBROUTINE get_var2(var,v)
-  CHARACTER(LEN=*), INTENT(IN)  :: var
-  REAL,             INTENT(OUT) :: v(:,:)
-  REAL,             ALLOCATABLE :: w4(:,:,:,:), w3(:,:,:)
-  INTEGER :: nn(4), dids(4), k, nd
-
-
-  CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var)
-  ierr=NF90_INQUIRE_VARIABLE(fID,vID,ndims=nd)
-
-  IF(nd==1) THEN
-    CALL err(NF90_GET_VAR(fID,vID,v),"get",var); RETURN
-  END IF
-  ierr=NF90_INQUIRE_VARIABLE(fID,vID,dimids=dids)
-
-  DO k=1,nd; ierr=NF90_INQUIRE_DIMENSION(fID,dids(k),len=nn(k)); END DO
-
-  SELECT CASE(nd)
-  CASE(3); ALLOCATE(w3(nn(1),nn(2),nn(3)))
-     CALL err(NF90_GET_VAR(fID,vID,w3),"get",var)
-     v=RESHAPE(w3,[nn(1)*nn(2),nn(3)]); DEALLOCATE(w3)
-  CASE(4);  ALLOCATE(w4(nn(1),nn(2),nn(3),nn(4)))
-     CALL err(NF90_GET_VAR(fID,vID,w4),"get",var)
-     v=RESHAPE(w4,[nn(1)*nn(2),nn(3)]); DEALLOCATE(w4)
-  END SELECT
-END SUBROUTINE get_var2
-
-
-SUBROUTINE err(ierr,typ,nam)
-  INTEGER,          INTENT(IN) :: ierr   !--- NetCDF ERROR CODE
-  CHARACTER(LEN=*), INTENT(IN) :: typ    !--- TYPE OF OPERATION
-  CHARACTER(LEN=*), INTENT(IN) :: nam    !--- FIELD/FILE NAME
-  IF(ierr==NF90_NoERR) RETURN
-  SELECT CASE(typ)
-    CASE('inq');   mesg="Field <"//TRIM(nam)//"> is missing"
-    CASE('get');   mesg="Reading failed for <"//TRIM(nam)//">"
-    CASE('open');  mesg="File opening failed for <"//TRIM(nam)//">"
-    CASE('close'); mesg="File closing failed for <"//TRIM(nam)//">"
-  END SELECT
-  CALL ABORT_gcm(TRIM(modname),TRIM(mesg),ierr)
-END SUBROUTINE err
-
-END SUBROUTINE dynetat0_loc
Index: LMDZ6/trunk/libf/dyn3dmem/dynetat0_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/dynetat0_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/dynetat0_loc.f90	(revision 5268)
@@ -0,0 +1,308 @@
+SUBROUTINE dynetat0_loc(fichnom,vcov,ucov,teta,q,masse,ps,phis,time)
+!
+!-------------------------------------------------------------------------------
+! Authors: P. Le Van , L.Fairhead
+!-------------------------------------------------------------------------------
+! Purpose: Initial state reading.
+!-------------------------------------------------------------------------------
+  USE parallel_lmdz
+  USE infotrac,    ONLY: nqtot, tracers, niso, iqIsoPha, iH2O, isoName, &
+                         new2oldH2O, newHNO3, oldHNO3
+  USE strings_mod, ONLY: maxlen, msg, strStack, real2str, int2str, strIdx
+  USE netcdf,      ONLY: NF90_OPEN,  NF90_NOWRITE, NF90_INQUIRE_DIMENSION, NF90_INQ_VARID, &
+                         NF90_CLOSE, NF90_GET_VAR, NF90_INQUIRE_VARIABLE,  NF90_NoErr
+  USE control_mod, ONLY: planet_type
+  USE assert_eq_m, ONLY: assert_eq
+  USE comvert_mod, ONLY: pa,preff
+  USE comconst_mod, ONLY: cpp, daysec, dtvr, g, im, jm, kappa, lllm, omeg, rad
+  USE logic_mod, ONLY: fxyhypb, ysinus
+  USE serre_mod, ONLY: clon, clat, grossismx, grossismy
+  USE temps_mod, ONLY: annee_ref, day_ini, day_ref, itau_dyn, start_time
+  USE ener_mod, ONLY: etot0,ptot0,ztot0,stot0,ang0
+  USE IOIPSL,   ONLY: getin
+  USE iso_params_mod   ! tnat_* and alpha_ideal_*
+  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_INCA, CPPKEY_REPROBUS
+
+  IMPLICIT NONE
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+  include "description.h"
+  include "iniprint.h"
+!===============================================================================
+! Arguments:
+  CHARACTER(LEN=*), INTENT(IN) :: fichnom          !--- FILE NAME
+  REAL, INTENT(OUT) ::  vcov(ijb_v:ije_v,llm)      !--- V COVARIANT WIND
+  REAL, INTENT(OUT) ::  ucov(ijb_u:ije_u,llm)      !--- U COVARIANT WIND
+  REAL, INTENT(OUT) ::  teta(ijb_u:ije_u,llm)      !--- POTENTIAL TEMP.
+  REAL, INTENT(OUT) ::     q(ijb_u:ije_u,llm,nqtot)!--- TRACERS
+  REAL, INTENT(OUT) :: masse(ijb_u:ije_u,llm)      !--- MASS PER CELL
+  REAL, INTENT(OUT) ::    ps(ijb_u:ije_u)          !--- GROUND PRESSURE
+  REAL, INTENT(OUT) ::  phis(ijb_u:ije_u)          !--- GEOPOTENTIAL
+!===============================================================================
+! Local variables:
+  CHARACTER(LEN=maxlen) :: mesg, var, modname, oldVar
+  INTEGER, PARAMETER :: length=100
+  INTEGER :: iq, fID, vID, idecal, ierr, iqParent, iName, iZone, iPhase, ix
+  REAL    :: time,tab_cntrl(length)    !--- RUN PARAMS TABLE
+  REAL    :: tnat, alpha_ideal
+  REAL,             ALLOCATABLE :: vcov_glo(:,:),masse_glo(:,:),   ps_glo(:)
+  REAL,             ALLOCATABLE :: ucov_glo(:,:),    q_glo(:,:), phis_glo(:)
+  REAL,             ALLOCATABLE :: teta_glo(:,:)
+  LOGICAL :: lSkip, ll, ltnat1
+!-------------------------------------------------------------------------------
+  modname="dynetat0_loc"
+
+!--- Initial state file opening
+  var=fichnom
+  CALL err(NF90_OPEN(var,NF90_NOWRITE,fID),"open",var)
+  CALL get_var1("controle",tab_cntrl)
+
+!!! AS: idecal is a hack to be able to read planeto starts...
+!!!     .... while keeping everything OK for LMDZ EARTH
+  IF(planet_type=="generic") THEN
+    CALL msg('NOTE NOTE NOTE : Planeto-like start files', modname)
+    idecal = 4
+    annee_ref  = 2000
+  ELSE
+    CALL msg('NOTE NOTE NOTE : Earth-like start files', modname)
+    idecal = 5
+    annee_ref  = tab_cntrl(5)
+  END IF
+  im         = tab_cntrl(1)
+  jm         = tab_cntrl(2)
+  lllm       = tab_cntrl(3)
+  day_ref    = tab_cntrl(4)
+  rad        = tab_cntrl(idecal+1)
+  omeg       = tab_cntrl(idecal+2)
+  g          = tab_cntrl(idecal+3)
+  cpp        = tab_cntrl(idecal+4)
+  kappa      = tab_cntrl(idecal+5)
+  daysec     = tab_cntrl(idecal+6)
+  dtvr       = tab_cntrl(idecal+7)
+  etot0      = tab_cntrl(idecal+8)
+  ptot0      = tab_cntrl(idecal+9)
+  ztot0      = tab_cntrl(idecal+10)
+  stot0      = tab_cntrl(idecal+11)
+  ang0       = tab_cntrl(idecal+12)
+  pa         = tab_cntrl(idecal+13)
+  preff      = tab_cntrl(idecal+14)
+!
+  clon       = tab_cntrl(idecal+15)
+  clat       = tab_cntrl(idecal+16)
+  grossismx  = tab_cntrl(idecal+17)
+  grossismy  = tab_cntrl(idecal+18)
+!
+  IF ( tab_cntrl(idecal+19)==1. )  THEN
+    fxyhypb  = .TRUE.
+!   dzoomx   = tab_cntrl(25)
+!   dzoomy   = tab_cntrl(26)
+!   taux     = tab_cntrl(28)
+!   tauy     = tab_cntrl(29)
+  ELSE
+    fxyhypb = .FALSE.
+    ysinus  = tab_cntrl(idecal+22)==1.
+  END IF
+
+  day_ini    = tab_cntrl(30)
+  itau_dyn   = tab_cntrl(31)
+  start_time = tab_cntrl(32)
+
+!-------------------------------------------------------------------------------
+  CALL msg('rad, omeg, g, cpp, kappa = '//TRIM(strStack(real2str([rad,omeg,g,cpp,kappa]))), modname)
+  CALL check_dim(im,iim,'im','im')
+  CALL check_dim(jm,jjm,'jm','jm')
+  CALL check_dim(lllm,llm,'lm','lllm')
+  CALL get_var1("rlonu",rlonu)
+  CALL get_var1("rlatu",rlatu)
+  CALL get_var1("rlonv",rlonv)
+  CALL get_var1("rlatv",rlatv)
+  CALL get_var1("cu"  ,cu)
+  CALL get_var1("cv"  ,cv)
+  CALL get_var1("aire",aire)
+
+  var="temps"
+  IF(NF90_INQ_VARID(fID,var,vID)/=NF90_NoErr) THEN
+    CALL msg('missing field <temps> ; trying with <Time>', modname)
+    var="Time"
+    CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var)
+  END IF
+  CALL err(NF90_GET_VAR(fID,vID,time),"get",var)
+
+  ALLOCATE(phis_glo(ip1jmp1))
+  CALL get_var1("phisinit",phis_glo)
+  phis (ijb_u:ije_u)  =phis_glo(ijb_u:ije_u);    DEALLOCATE(phis_glo)
+
+  ALLOCATE(ucov_glo(ip1jmp1,llm))
+  CALL get_var2("ucov",ucov_glo)
+  ucov (ijb_u:ije_u,:)=ucov_glo(ijb_u:ije_u,:);  DEALLOCATE(ucov_glo)
+
+  ALLOCATE(vcov_glo(ip1jm,llm))
+  CALL get_var2("vcov",vcov_glo)
+  vcov (ijb_v:ije_v,:)=vcov_glo(ijb_v:ije_v,:);  DEALLOCATE(vcov_glo)
+
+  ALLOCATE(teta_glo(ip1jmp1,llm))
+  CALL get_var2("teta",teta_glo)
+  teta (ijb_u:ije_u,:)=teta_glo(ijb_u:ije_u,:);  DEALLOCATE(teta_glo)
+
+  ALLOCATE(masse_glo(ip1jmp1,llm))
+  CALL get_var2("masse",masse_glo)
+  masse(ijb_u:ije_u,:)=masse_glo(ijb_u:ije_u,:); DEALLOCATE(masse_glo)
+  
+  ALLOCATE(ps_glo(ip1jmp1))
+  CALL get_var1("ps",ps_glo)
+  ps   (ijb_u:ije_u)  =   ps_glo(ijb_u:ije_u);   DEALLOCATE(ps_glo)
+
+!--- Tracers
+  ALLOCATE(q_glo(ip1jmp1,llm))
+  ll = .FALSE.
+IF (CPPKEY_REPROBUS) THEN
+  ll = NF90_INQ_VARID(fID, 'HNO3tot', vID) /= NF90_NoErr                                 !--- DETECT OLD REPRO start.nc FILE
+END IF
+  ltnat1 = .TRUE.; CALL getin('tnateq1', ltnat1)
+  DO iq=1,nqtot
+    var = tracers(iq)%name
+    oldVar = new2oldH2O(var)
+    lSkip = ll .AND. var == 'HNO3'                                                       !--- FORCE "HNO3_g" READING FOR "HNO3"
+IF (CPPKEY_REPROBUS) THEN
+    ix = strIdx(newHNO3, var); IF(ix /= 0) oldVar = oldHNO3(ix)                          !--- REPROBUS HNO3 exceptions
+END IF
+IF (CPPKEY_INCA) THEN
+    IF(var == 'O3') oldVar = 'OX'                                                        !--- DEAL WITH INCA OZONE EXCEPTION
+END IF
+    !--------------------------------------------------------------------------------------------------------------------------
+    IF(NF90_INQ_VARID(fID, var, vID) == NF90_NoErr .AND. .NOT.lSkip) THEN                !=== REGULAR CASE: AVAILABLE VARIABLE
+      CALL get_var2(var,q_glo); q(ijb_u:ije_u,:,iq)=q_glo(ijb_u:ije_u,:)
+    !--------------------------------------------------------------------------------------------------------------------------
+    ELSE IF(NF90_INQ_VARID(fID, oldVar, vID) == NF90_NoErr) THEN                         !=== TRY WITH ALTERNATE NAME
+      CALL msg('Missing tracer <'//TRIM(var)//'> => initialized to <'//TRIM(oldVar)//'>', modname)
+      CALL get_var2(oldVar, q_glo); q(ijb_u:ije_u,:,iq)=q_glo(ijb_u:ije_u,:)
+    !--------------------------------------------------------------------------------------------------------------------------
+    ELSE IF(tracers(iq)%iso_iGroup == iH2O .AND. niso > 0) THEN                          !=== WATER ISOTOPES
+      iName    = tracers(iq)%iso_iName
+      iPhase   = tracers(iq)%iso_iPhase
+      iqParent = tracers(iq)%iqParent
+      IF(tracers(iq)%iso_iZone == 0) THEN
+         IF(ltnat1) THEN
+            tnat = 1.0
+            alpha_ideal = 1.0
+            CALL msg(' !!!  Beware: alpha_ideal put to 1  !!!', modname)
+         ELSE
+            SELECT CASE(isoName(iName))
+              CASE('H216O'); tnat = tnat_H216O; alpha_ideal = alpha_ideal_H216O
+              CASE('H217O'); tnat = tnat_H217O; alpha_ideal = alpha_ideal_H217O
+              CASE('H218O'); tnat = tnat_H218O; alpha_ideal = alpha_ideal_H218O
+              CASE('HDO');   tnat = tnat_HDO;   alpha_ideal = alpha_ideal_HDO
+              CASE('HTO');   tnat = tnat_HTO;   alpha_ideal = alpha_ideal_HTO
+              CASE DEFAULT; CALL abort_gcm(TRIM(modname),'unknown isotope "'//TRIM(isoName(iName))//'" ; check tracer.def file',1)
+            END SELECT
+         END IF
+         CALL msg('Missing tracer <'//TRIM(var)//'> => initialized with a simplified Rayleigh distillation law.', modname)
+         q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqParent)*tnat*(q(ijb_u:ije_u,:,iqParent)/30.e-3)**(alpha_ideal-1.)
+         ! Camille 9 mars 2023: point de vigilence: initialisation incohérente
+         ! avec celle de xt_ancien dans la physiq.
+      ELSE
+         CALL msg('Missing tracer <'//TRIM(var)//'> => initialized to its parent isotope concentration.', modname)
+         ! Camille 9 mars 2023: attention!! seuls les tags qui correspondent à
+         ! izone=izone_init (définie dans isotrac_mod) sont initialisés comme
+         ! les parents. Sinon, c'est nul.
+         ! j'ai fait ça en attendant, mais il faudrait initialiser proprement en
+         ! remplacant 1 par izone_init dans la ligne qui suit.
+         IF(tracers(iq)%iso_iZone == 1) THEN
+           q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqIsoPha(iName,iPhase))
+         ELSE
+           q(ijb_u:ije_u,:,iq) =  0.
+         ENDIF
+      END IF
+    !--------------------------------------------------------------------------------------------------------------------------
+    ELSE                                                                                 !=== MISSING: SET TO 0
+      CALL msg('missing tracer <'//TRIM(var)//'> => initialized to zero', modname)
+      q(ijb_u:ije_u,:,iq)=0.
+    !--------------------------------------------------------------------------------------------------------------------------
+    END IF
+  END DO
+  DEALLOCATE(q_glo)
+  CALL err(NF90_CLOSE(fID),"close",fichnom)
+  day_ini=day_ini+INT(time)
+  time=time-INT(time)
+
+
+  CONTAINS
+
+
+SUBROUTINE check_dim(n1,n2,str1,str2)
+  INTEGER,          INTENT(IN) :: n1, n2
+  CHARACTER(LEN=*), INTENT(IN) :: str1, str2
+  CHARACTER(LEN=maxlen) :: s1, s2
+  IF(n1/=n2) CALL abort_gcm(TRIM(modname), 'value of "'//TRIM(str1)//'" = '//TRIM(int2str(n1))// &
+   ' read in starting file differs from gcm value of "'//TRIM(str2)//'" = '//TRIM(int2str(n2)), 1)
+END SUBROUTINE check_dim
+
+
+SUBROUTINE get_var1(var,v)
+  CHARACTER(LEN=*), INTENT(IN)  :: var
+  REAL,             INTENT(OUT) :: v(:)
+  REAL,             ALLOCATABLE :: w2(:,:), w3(:,:,:)
+  INTEGER :: nn(3), dids(3), k, nd, ntot
+
+  CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var)
+  ierr=NF90_INQUIRE_VARIABLE(fID,vID,ndims=nd)
+  IF(nd==1) THEN
+    CALL err(NF90_GET_VAR(fID,vID,v),"get",var); RETURN
+  END IF
+  ierr=NF90_INQUIRE_VARIABLE(fID,vID,dimids=dids)
+  DO k=1,nd; ierr=NF90_INQUIRE_DIMENSION(fID,dids(k),len=nn(k)); END DO
+  ntot=PRODUCT(nn(1:nd))
+  SELECT CASE(nd)
+    CASE(2); ALLOCATE(w2(nn(1),nn(2)))
+      CALL err(NF90_GET_VAR(fID,vID,w2),"get",var)
+      v=RESHAPE(w2,[ntot]); DEALLOCATE(w2)
+    CASE(3); ALLOCATE(w3(nn(1),nn(2),nn(3)))
+      CALL err(NF90_GET_VAR(fID,vID,w3),"get",var)
+      v=RESHAPE(w3,[ntot]); DEALLOCATE(w3)
+  END SELECT
+END SUBROUTINE get_var1
+
+SUBROUTINE get_var2(var,v)
+  CHARACTER(LEN=*), INTENT(IN)  :: var
+  REAL,             INTENT(OUT) :: v(:,:)
+  REAL,             ALLOCATABLE :: w4(:,:,:,:), w3(:,:,:)
+  INTEGER :: nn(4), dids(4), k, nd
+
+
+  CALL err(NF90_INQ_VARID(fID,var,vID),"inq",var)
+  ierr=NF90_INQUIRE_VARIABLE(fID,vID,ndims=nd)
+
+  IF(nd==1) THEN
+    CALL err(NF90_GET_VAR(fID,vID,v),"get",var); RETURN
+  END IF
+  ierr=NF90_INQUIRE_VARIABLE(fID,vID,dimids=dids)
+
+  DO k=1,nd; ierr=NF90_INQUIRE_DIMENSION(fID,dids(k),len=nn(k)); END DO
+
+  SELECT CASE(nd)
+  CASE(3); ALLOCATE(w3(nn(1),nn(2),nn(3)))
+     CALL err(NF90_GET_VAR(fID,vID,w3),"get",var)
+     v=RESHAPE(w3,[nn(1)*nn(2),nn(3)]); DEALLOCATE(w3)
+  CASE(4);  ALLOCATE(w4(nn(1),nn(2),nn(3),nn(4)))
+     CALL err(NF90_GET_VAR(fID,vID,w4),"get",var)
+     v=RESHAPE(w4,[nn(1)*nn(2),nn(3)]); DEALLOCATE(w4)
+  END SELECT
+END SUBROUTINE get_var2
+
+
+SUBROUTINE err(ierr,typ,nam)
+  INTEGER,          INTENT(IN) :: ierr   !--- NetCDF ERROR CODE
+  CHARACTER(LEN=*), INTENT(IN) :: typ    !--- TYPE OF OPERATION
+  CHARACTER(LEN=*), INTENT(IN) :: nam    !--- FIELD/FILE NAME
+  IF(ierr==NF90_NoERR) RETURN
+  SELECT CASE(typ)
+    CASE('inq');   mesg="Field <"//TRIM(nam)//"> is missing"
+    CASE('get');   mesg="Reading failed for <"//TRIM(nam)//">"
+    CASE('open');  mesg="File opening failed for <"//TRIM(nam)//">"
+    CASE('close'); mesg="File closing failed for <"//TRIM(nam)//">"
+  END SELECT
+  CALL ABORT_gcm(TRIM(modname),TRIM(mesg),ierr)
+END SUBROUTINE err
+
+END SUBROUTINE dynetat0_loc
Index: LMDZ6/trunk/libf/dyn3dmem/dynredem_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/dynredem_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,267 +1,0 @@
-SUBROUTINE dynredem0_loc(fichnom,iday_end,phis)
-!
-!-------------------------------------------------------------------------------
-! Write the NetCDF restart file (initialization).
-!-------------------------------------------------------------------------------
-  USE IOIPSL
-  USE parallel_lmdz
-  USE mod_hallo
-  USE strings_mod, ONLY: maxlen
-  USE infotrac, ONLY: nqtot, tracers
-  USE netcdf, ONLY: NF90_CREATE, NF90_DEF_DIM, NF90_INQ_VARID, NF90_GLOBAL,    &
-                    NF90_CLOSE,  NF90_PUT_ATT, NF90_UNLIMITED, NF90_CLOBBER,   &
-                    NF90_64BIT_OFFSET
-  USE dynredem_mod, ONLY: cre_var, put_var, err, modname, fil
-  USE comvert_mod,  ONLY: ap, bp, presnivs, pa, preff, nivsig, nivsigs,&
-                          aps,bps,pseudoalt
-  USE comconst_mod, ONLY: cpp, daysec, dtvr, g, kappa, omeg, rad
-  USE logic_mod, ONLY: fxyhypb, ysinus
-  USE serre_mod, ONLY: clon,clat,grossismx,grossismy,dzoomx,dzoomy, &
-                       taux,tauy
-  USE temps_mod, ONLY: annee_ref, day_ref, itau_dyn, itaufin, start_time
-  USE ener_mod, ONLY: etot0,ptot0,ztot0,stot0,ang0
-
-  IMPLICIT NONE
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-  include "description.h"
-  include "iniprint.h"
-!===============================================================================
-! Arguments:
-  CHARACTER(LEN=*), INTENT(IN) :: fichnom          !--- FILE NAME
-  INTEGER,          INTENT(IN) :: iday_end         !--- 
-  REAL,             INTENT(IN) :: phis(ijb_u:ije_u)!--- GROUND GEOPOTENTIAL
-!===============================================================================
-! Local variables:
-  INTEGER :: iq
-  INTEGER, PARAMETER :: length=100
-  REAL    :: tab_cntrl(length)                     !--- RUN PARAMETERS TABLE
-  REAL    :: phis_glo(ip1jmp1)
-!   For NetCDF:
-  CHARACTER(LEN=maxlen) :: unites
-  INTEGER :: indexID
-  INTEGER :: rlonuID, rlonvID, rlatuID, rlatvID
-  INTEGER :: sID, sigID, nID, timID
-  INTEGER :: yyears0, jjour0, mmois0
-  REAL    :: zjulian, hours
-!===============================================================================
-  modname='dynredem0'; fil=fichnom
-  CALL Gather_field_u(phis,phis_glo,1)
-  IF(mpi_rank/=0) RETURN
-
-  CALL ymds2ju(annee_ref, 1, iday_end, 0.0, zjulian)
-  CALL ju2ymds(zjulian, yyears0, mmois0, jjour0, hours)
-
-
-  tab_cntrl(:)  = 0.
-  tab_cntrl(1)  = REAL(iim)
-  tab_cntrl(2)  = REAL(jjm)
-  tab_cntrl(3)  = REAL(llm)
-  tab_cntrl(4)  = REAL(day_ref)
-  tab_cntrl(5)  = REAL(annee_ref)
-  tab_cntrl(6)  = rad
-  tab_cntrl(7)  = omeg
-  tab_cntrl(8)  = g
-  tab_cntrl(9)  = cpp
-  tab_cntrl(10) = kappa
-  tab_cntrl(11) = daysec
-  tab_cntrl(12) = dtvr
-  tab_cntrl(13) = etot0
-  tab_cntrl(14) = ptot0
-  tab_cntrl(15) = ztot0
-  tab_cntrl(16) = stot0
-  tab_cntrl(17) = ang0
-  tab_cntrl(18) = pa
-  tab_cntrl(19) = preff
-
-!    .....    parameters for zoom    ......   
-  tab_cntrl(20) = clon
-  tab_cntrl(21) = clat
-  tab_cntrl(22) = grossismx
-  tab_cntrl(23) = grossismy
-!
-  IF ( fxyhypb )   THEN
-    tab_cntrl(24) = 1.
-    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.
-    tab_cntrl(25) = dzoomx
-    tab_cntrl(26) = dzoomy
-    tab_cntrl(27) = 0.
-    tab_cntrl(28) = 0.
-    tab_cntrl(29) = 0.
-    IF( ysinus )  tab_cntrl(27) = 1.
-  END IF
-  tab_cntrl(30) = REAL(iday_end)
-  tab_cntrl(31) = REAL(itau_dyn + itaufin)
-! start_time: start_time of simulation (not necessarily 0.)
-  tab_cntrl(32) = start_time
-
-!--- File creation
-  CALL err(NF90_CREATE(fichnom,IOR(NF90_CLOBBER,NF90_64BIT_OFFSET),nid))
-
-!--- Some global attributes
-  CALL err(NF90_PUT_ATT(nid,NF90_GLOBAL,"title","Fichier demarrage dynamique"))
-
-!--- Dimensions
-  CALL err(NF90_DEF_DIM(nid,"index", length, indexID))
-  CALL err(NF90_DEF_DIM(nid,"rlonu", iip1,   rlonuID))
-  CALL err(NF90_DEF_DIM(nid,"rlatu", jjp1,   rlatuID))
-  CALL err(NF90_DEF_DIM(nid,"rlonv", iip1,   rlonvID))
-  CALL err(NF90_DEF_DIM(nid,"rlatv", jjm,    rlatvID))
-  CALL err(NF90_DEF_DIM(nid,"sigs",  llm,        sID))
-  CALL err(NF90_DEF_DIM(nid,"sig",   llmp1,    sigID))
-  CALL err(NF90_DEF_DIM(nid,"temps", NF90_UNLIMITED, timID))
-
-!--- Define and save invariant fields
-  CALL put_var(nid,"controle","Parametres de controle" ,[indexID],tab_cntrl)
-  CALL put_var(nid,"rlonu"   ,"Longitudes des points U",[rlonuID],rlonu)
-  CALL put_var(nid,"rlatu"   ,"Latitudes des points U" ,[rlatuID],rlatu)
-  CALL put_var(nid,"rlonv"   ,"Longitudes des points V",[rlonvID],rlonv)
-  CALL put_var(nid,"rlatv"   ,"Latitudes des points V" ,[rlatvID],rlatv)
-  CALL put_var(nid,"nivsigs" ,"Numero naturel des couches s"    ,[sID]  ,nivsigs)
-  CALL put_var(nid,"nivsig"  ,"Numero naturel des couches sigma",[sigID],nivsig)
-  CALL put_var(nid,"ap"      ,"Coefficient A pour hybride"      ,[sigID],ap)
-  CALL put_var(nid,"bp"      ,"Coefficient B pour hybride"      ,[sigID],bp)
-  CALL put_var(nid,"presnivs",""                                ,[sID]  ,presnivs)
-! covariant <-> contravariant <-> natural conversion coefficients
-  CALL put_var(nid,"cu","Coefficient de passage pour U",[rlonuID,rlatuID],cu)
-  CALL put_var(nid,"cv","Coefficient de passage pour V",[rlonvID,rlatvID],cv)
-  CALL put_var(nid,"aire","Aires de chaque maille"     ,[rlonvID,rlatuID],aire)
-  CALL put_var(nid,"phisinit","Geopotentiel au sol"    ,[rlonvID,rlatuID],phis_glo)
-
-!--- Define fields saved later
-  WRITE(unites,"('days since ',i4,'-',i2.2,'-',i2.2,' 00:00:00')") &
-               yyears0,mmois0,jjour0
-  CALL cre_var(nid,"temps","Temps de simulation",[timID],unites)
-  CALL cre_var(nid,"ucov" ,"Vitesse U"  ,[rlonuID,rlatuID,sID,timID])
-  CALL cre_var(nid,"vcov" ,"Vitesse V"  ,[rlonvID,rlatvID,sID,timID])
-  CALL cre_var(nid,"teta" ,"Temperature",[rlonvID,rlatuID,sID,timID])
-  DO iq=1,nqtot
-    CALL cre_var(nid,tracers(iq)%name,tracers(iq)%longName,[rlonvID,rlatuID,sID,timID])
-  END DO
-  CALL cre_var(nid,"masse","Masse d air"    ,[rlonvID,rlatuID,sID,timID])
-  CALL cre_var(nid,"ps"   ,"Pression au sol",[rlonvID,rlatuID    ,timID])
-  CALL err(NF90_CLOSE (nid))
-
-  WRITE(lunout,*)TRIM(modname)//': iim,jjm,llm,iday_end',iim,jjm,llm,iday_end
-  WRITE(lunout,*)TRIM(modname)//': rad,omeg,g,cpp,kappa',rad,omeg,g,cpp,kappa
-
-END SUBROUTINE dynredem0_loc
-!
-!-------------------------------------------------------------------------------
-
-
-!-------------------------------------------------------------------------------
-!
-SUBROUTINE dynredem1_loc(fichnom,time,vcov,ucov,teta,q,masse,ps)
-!
-!-------------------------------------------------------------------------------
-! Purpose: Write the NetCDF restart file (append).
-!-------------------------------------------------------------------------------
-  USE parallel_lmdz
-  USE mod_hallo
-  USE strings_mod, ONLY: maxlen
-  USE infotrac, ONLY: nqtot, tracers, type_trac
-  USE control_mod
-  USE netcdf,   ONLY: NF90_OPEN,  NF90_NOWRITE, NF90_GET_VAR, NF90_INQ_VARID,  &
-                      NF90_CLOSE, NF90_WRITE,   NF90_PUT_VAR, NF90_NoErr
-  USE dynredem_mod, ONLY: dynredem_write_u, dynredem_write_v, dynredem_read_u, &
-                          err, modname, fil, msg
-  USE temps_mod, ONLY: itau_dyn, itaufin
-  
-  IMPLICIT NONE
-  include "dimensions.h"
-  include "paramet.h"
-  include "description.h"
-  include "comgeom.h"
-  include "iniprint.h"
-!===============================================================================
-! Arguments:
-  CHARACTER(LEN=*), INTENT(IN) :: fichnom              !-- FILE NAME
-  REAL, INTENT(IN)    ::  time                         !-- TIME
-  REAL, INTENT(IN)    ::  vcov(ijb_v:ije_v,llm)        !-- V COVARIANT WIND
-  REAL, INTENT(IN)    ::  ucov(ijb_u:ije_u,llm)        !-- U COVARIANT WIND
-  REAL, INTENT(IN)    ::  teta(ijb_u:ije_u,llm)        !-- POTENTIAL TEMPERATURE
-  REAL, INTENT(INOUT) ::     q(ijb_u:ije_u,llm,nqtot)  !-- TRACERS
-  REAL, INTENT(IN)    :: masse(ijb_u:ije_u,llm)        !-- MASS PER CELL
-  REAL, INTENT(IN)    ::    ps(ijb_u:ije_u)            !-- GROUND PRESSURE
-!===============================================================================
-! Local variables:
-  INTEGER :: iq, nid, vID, ierr, nid_trac, vID_trac
-  INTEGER, SAVE :: nb=0
-  INTEGER, PARAMETER :: length=100
-  REAL               :: tab_cntrl(length) ! tableau des parametres du run
-  CHARACTER(LEN=maxlen) :: var, dum
-  LOGICAL            :: lread_inca
-!===============================================================================
-
-!$OMP MASTER
-  IF(mpi_rank==0) THEN !++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-  modname='dynredem1_loc'; fil=fichnom
-  CALL err(NF90_OPEN(fil,NF90_WRITE,nid),"open",fil)
-
-!--- Write/extend time coordinate
-  nb = nb + 1
-  var="temps"
-  CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var)
-  CALL err(NF90_PUT_VAR(nid,vID,[time]),"put",var)
-  WRITE(lunout,*)TRIM(modname)//": Saving for ", nb, time
-
-!--- Rewrite control table (itaufin undefined in dynredem0)
-  var="controle"
-  CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var)
-  CALL err(NF90_GET_VAR(nid,vID,tab_cntrl),"get",var)
-  tab_cntrl(31)=DBLE(itau_dyn + itaufin)
-  CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var)
-  CALL err(NF90_PUT_VAR(nid,vID,tab_cntrl),"put",var)
-  END IF               !++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-!$OMP END MASTER
-
-!--- Save fields
-  CALL dynredem_write_u(nid,"ucov" ,ucov ,llm)
-  CALL dynredem_write_v(nid,"vcov" ,vcov ,llm)
-  CALL dynredem_write_u(nid,"teta" ,teta ,llm)
-  CALL dynredem_write_u(nid,"masse",masse,llm)
-  CALL dynredem_write_u(nid,"ps"   ,ps   ,1)
-
-!--- Tracers in file "start_trac.nc" (added by Anne)
-  lread_inca=.FALSE.
-!$OMP MASTER
-  fil="start_trac.nc"
-  IF(ANY(type_trac == ['inca','inco'])) INQUIRE(FILE=fil,EXIST=lread_inca)
-  IF(lread_inca) CALL err(NF90_OPEN(fil,NF90_NOWRITE,nid_trac),"open")
-!$OMP END MASTER
-!$OMP BARRIER
-
-!--- Save tracers
-  DO iq=1,nqtot; var=TRIM(tracers(iq)%name); ierr=-1
-    IF(lread_inca) THEN                  !--- Possibly read from "start_trac.nc"
-!$OMP MASTER      
-      fil="start_trac.nc"
-      ierr=NF90_INQ_VARID(nid_trac,var,vID_trac)
-      dum='inq'; IF(ierr==NF90_NoErr) dum='fnd'
-      WRITE(lunout,*)msg(dum,var)
-!$OMP END MASTER
-!$OMP BARRIER
-      IF(ierr==NF90_NoErr) CALL dynredem_read_u(nid_trac,var,q(:,:,iq),llm)
-    END IF
-    fil=fichnom
-    CALL dynredem_write_u(nid,var,q(:,:,iq),llm)
-  END DO
-
-!$OMP MASTER
-  IF(mpi_rank==0) THEN !++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-  CALL err(NF90_CLOSE(nid),"close")
-  fil="start_trac.nc"
-  IF(lread_inca) CALL err(NF90_CLOSE(nid_trac),"close")
-  END IF               !++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-!$OMP END MASTER
-
-END SUBROUTINE dynredem1_loc
-
Index: LMDZ6/trunk/libf/dyn3dmem/dynredem_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/dynredem_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/dynredem_loc.f90	(revision 5268)
@@ -0,0 +1,267 @@
+SUBROUTINE dynredem0_loc(fichnom,iday_end,phis)
+!
+!-------------------------------------------------------------------------------
+! Write the NetCDF restart file (initialization).
+!-------------------------------------------------------------------------------
+  USE IOIPSL
+  USE parallel_lmdz
+  USE mod_hallo
+  USE strings_mod, ONLY: maxlen
+  USE infotrac, ONLY: nqtot, tracers
+  USE netcdf, ONLY: NF90_CREATE, NF90_DEF_DIM, NF90_INQ_VARID, NF90_GLOBAL,    &
+                    NF90_CLOSE,  NF90_PUT_ATT, NF90_UNLIMITED, NF90_CLOBBER,   &
+                    NF90_64BIT_OFFSET
+  USE dynredem_mod, ONLY: cre_var, put_var, err, modname, fil
+  USE comvert_mod,  ONLY: ap, bp, presnivs, pa, preff, nivsig, nivsigs,&
+                          aps,bps,pseudoalt
+  USE comconst_mod, ONLY: cpp, daysec, dtvr, g, kappa, omeg, rad
+  USE logic_mod, ONLY: fxyhypb, ysinus
+  USE serre_mod, ONLY: clon,clat,grossismx,grossismy,dzoomx,dzoomy, &
+                       taux,tauy
+  USE temps_mod, ONLY: annee_ref, day_ref, itau_dyn, itaufin, start_time
+  USE ener_mod, ONLY: etot0,ptot0,ztot0,stot0,ang0
+
+  IMPLICIT NONE
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+  include "description.h"
+  include "iniprint.h"
+!===============================================================================
+! Arguments:
+  CHARACTER(LEN=*), INTENT(IN) :: fichnom          !--- FILE NAME
+  INTEGER,          INTENT(IN) :: iday_end         !--- 
+  REAL,             INTENT(IN) :: phis(ijb_u:ije_u)!--- GROUND GEOPOTENTIAL
+!===============================================================================
+! Local variables:
+  INTEGER :: iq
+  INTEGER, PARAMETER :: length=100
+  REAL    :: tab_cntrl(length)                     !--- RUN PARAMETERS TABLE
+  REAL    :: phis_glo(ip1jmp1)
+!   For NetCDF:
+  CHARACTER(LEN=maxlen) :: unites
+  INTEGER :: indexID
+  INTEGER :: rlonuID, rlonvID, rlatuID, rlatvID
+  INTEGER :: sID, sigID, nID, timID
+  INTEGER :: yyears0, jjour0, mmois0
+  REAL    :: zjulian, hours
+!===============================================================================
+  modname='dynredem0'; fil=fichnom
+  CALL Gather_field_u(phis,phis_glo,1)
+  IF(mpi_rank/=0) RETURN
+
+  CALL ymds2ju(annee_ref, 1, iday_end, 0.0, zjulian)
+  CALL ju2ymds(zjulian, yyears0, mmois0, jjour0, hours)
+
+
+  tab_cntrl(:)  = 0.
+  tab_cntrl(1)  = REAL(iim)
+  tab_cntrl(2)  = REAL(jjm)
+  tab_cntrl(3)  = REAL(llm)
+  tab_cntrl(4)  = REAL(day_ref)
+  tab_cntrl(5)  = REAL(annee_ref)
+  tab_cntrl(6)  = rad
+  tab_cntrl(7)  = omeg
+  tab_cntrl(8)  = g
+  tab_cntrl(9)  = cpp
+  tab_cntrl(10) = kappa
+  tab_cntrl(11) = daysec
+  tab_cntrl(12) = dtvr
+  tab_cntrl(13) = etot0
+  tab_cntrl(14) = ptot0
+  tab_cntrl(15) = ztot0
+  tab_cntrl(16) = stot0
+  tab_cntrl(17) = ang0
+  tab_cntrl(18) = pa
+  tab_cntrl(19) = preff
+
+!    .....    parameters for zoom    ......   
+  tab_cntrl(20) = clon
+  tab_cntrl(21) = clat
+  tab_cntrl(22) = grossismx
+  tab_cntrl(23) = grossismy
+!
+  IF ( fxyhypb )   THEN
+    tab_cntrl(24) = 1.
+    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.
+    tab_cntrl(25) = dzoomx
+    tab_cntrl(26) = dzoomy
+    tab_cntrl(27) = 0.
+    tab_cntrl(28) = 0.
+    tab_cntrl(29) = 0.
+    IF( ysinus )  tab_cntrl(27) = 1.
+  END IF
+  tab_cntrl(30) = REAL(iday_end)
+  tab_cntrl(31) = REAL(itau_dyn + itaufin)
+! start_time: start_time of simulation (not necessarily 0.)
+  tab_cntrl(32) = start_time
+
+!--- File creation
+  CALL err(NF90_CREATE(fichnom,IOR(NF90_CLOBBER,NF90_64BIT_OFFSET),nid))
+
+!--- Some global attributes
+  CALL err(NF90_PUT_ATT(nid,NF90_GLOBAL,"title","Fichier demarrage dynamique"))
+
+!--- Dimensions
+  CALL err(NF90_DEF_DIM(nid,"index", length, indexID))
+  CALL err(NF90_DEF_DIM(nid,"rlonu", iip1,   rlonuID))
+  CALL err(NF90_DEF_DIM(nid,"rlatu", jjp1,   rlatuID))
+  CALL err(NF90_DEF_DIM(nid,"rlonv", iip1,   rlonvID))
+  CALL err(NF90_DEF_DIM(nid,"rlatv", jjm,    rlatvID))
+  CALL err(NF90_DEF_DIM(nid,"sigs",  llm,        sID))
+  CALL err(NF90_DEF_DIM(nid,"sig",   llmp1,    sigID))
+  CALL err(NF90_DEF_DIM(nid,"temps", NF90_UNLIMITED, timID))
+
+!--- Define and save invariant fields
+  CALL put_var(nid,"controle","Parametres de controle" ,[indexID],tab_cntrl)
+  CALL put_var(nid,"rlonu"   ,"Longitudes des points U",[rlonuID],rlonu)
+  CALL put_var(nid,"rlatu"   ,"Latitudes des points U" ,[rlatuID],rlatu)
+  CALL put_var(nid,"rlonv"   ,"Longitudes des points V",[rlonvID],rlonv)
+  CALL put_var(nid,"rlatv"   ,"Latitudes des points V" ,[rlatvID],rlatv)
+  CALL put_var(nid,"nivsigs" ,"Numero naturel des couches s"    ,[sID]  ,nivsigs)
+  CALL put_var(nid,"nivsig"  ,"Numero naturel des couches sigma",[sigID],nivsig)
+  CALL put_var(nid,"ap"      ,"Coefficient A pour hybride"      ,[sigID],ap)
+  CALL put_var(nid,"bp"      ,"Coefficient B pour hybride"      ,[sigID],bp)
+  CALL put_var(nid,"presnivs",""                                ,[sID]  ,presnivs)
+! covariant <-> contravariant <-> natural conversion coefficients
+  CALL put_var(nid,"cu","Coefficient de passage pour U",[rlonuID,rlatuID],cu)
+  CALL put_var(nid,"cv","Coefficient de passage pour V",[rlonvID,rlatvID],cv)
+  CALL put_var(nid,"aire","Aires de chaque maille"     ,[rlonvID,rlatuID],aire)
+  CALL put_var(nid,"phisinit","Geopotentiel au sol"    ,[rlonvID,rlatuID],phis_glo)
+
+!--- Define fields saved later
+  WRITE(unites,"('days since ',i4,'-',i2.2,'-',i2.2,' 00:00:00')") &
+               yyears0,mmois0,jjour0
+  CALL cre_var(nid,"temps","Temps de simulation",[timID],unites)
+  CALL cre_var(nid,"ucov" ,"Vitesse U"  ,[rlonuID,rlatuID,sID,timID])
+  CALL cre_var(nid,"vcov" ,"Vitesse V"  ,[rlonvID,rlatvID,sID,timID])
+  CALL cre_var(nid,"teta" ,"Temperature",[rlonvID,rlatuID,sID,timID])
+  DO iq=1,nqtot
+    CALL cre_var(nid,tracers(iq)%name,tracers(iq)%longName,[rlonvID,rlatuID,sID,timID])
+  END DO
+  CALL cre_var(nid,"masse","Masse d air"    ,[rlonvID,rlatuID,sID,timID])
+  CALL cre_var(nid,"ps"   ,"Pression au sol",[rlonvID,rlatuID    ,timID])
+  CALL err(NF90_CLOSE (nid))
+
+  WRITE(lunout,*)TRIM(modname)//': iim,jjm,llm,iday_end',iim,jjm,llm,iday_end
+  WRITE(lunout,*)TRIM(modname)//': rad,omeg,g,cpp,kappa',rad,omeg,g,cpp,kappa
+
+END SUBROUTINE dynredem0_loc
+!
+!-------------------------------------------------------------------------------
+
+
+!-------------------------------------------------------------------------------
+!
+SUBROUTINE dynredem1_loc(fichnom,time,vcov,ucov,teta,q,masse,ps)
+!
+!-------------------------------------------------------------------------------
+! Purpose: Write the NetCDF restart file (append).
+!-------------------------------------------------------------------------------
+  USE parallel_lmdz
+  USE mod_hallo
+  USE strings_mod, ONLY: maxlen
+  USE infotrac, ONLY: nqtot, tracers, type_trac
+  USE control_mod
+  USE netcdf,   ONLY: NF90_OPEN,  NF90_NOWRITE, NF90_GET_VAR, NF90_INQ_VARID,  &
+                      NF90_CLOSE, NF90_WRITE,   NF90_PUT_VAR, NF90_NoErr
+  USE dynredem_mod, ONLY: dynredem_write_u, dynredem_write_v, dynredem_read_u, &
+                          err, modname, fil, msg
+  USE temps_mod, ONLY: itau_dyn, itaufin
+  
+  IMPLICIT NONE
+  include "dimensions.h"
+  include "paramet.h"
+  include "description.h"
+  include "comgeom.h"
+  include "iniprint.h"
+!===============================================================================
+! Arguments:
+  CHARACTER(LEN=*), INTENT(IN) :: fichnom              !-- FILE NAME
+  REAL, INTENT(IN)    ::  time                         !-- TIME
+  REAL, INTENT(IN)    ::  vcov(ijb_v:ije_v,llm)        !-- V COVARIANT WIND
+  REAL, INTENT(IN)    ::  ucov(ijb_u:ije_u,llm)        !-- U COVARIANT WIND
+  REAL, INTENT(IN)    ::  teta(ijb_u:ije_u,llm)        !-- POTENTIAL TEMPERATURE
+  REAL, INTENT(INOUT) ::     q(ijb_u:ije_u,llm,nqtot)  !-- TRACERS
+  REAL, INTENT(IN)    :: masse(ijb_u:ije_u,llm)        !-- MASS PER CELL
+  REAL, INTENT(IN)    ::    ps(ijb_u:ije_u)            !-- GROUND PRESSURE
+!===============================================================================
+! Local variables:
+  INTEGER :: iq, nid, vID, ierr, nid_trac, vID_trac
+  INTEGER, SAVE :: nb=0
+  INTEGER, PARAMETER :: length=100
+  REAL               :: tab_cntrl(length) ! tableau des parametres du run
+  CHARACTER(LEN=maxlen) :: var, dum
+  LOGICAL            :: lread_inca
+!===============================================================================
+
+!$OMP MASTER
+  IF(mpi_rank==0) THEN !++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+  modname='dynredem1_loc'; fil=fichnom
+  CALL err(NF90_OPEN(fil,NF90_WRITE,nid),"open",fil)
+
+!--- Write/extend time coordinate
+  nb = nb + 1
+  var="temps"
+  CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var)
+  CALL err(NF90_PUT_VAR(nid,vID,[time]),"put",var)
+  WRITE(lunout,*)TRIM(modname)//": Saving for ", nb, time
+
+!--- Rewrite control table (itaufin undefined in dynredem0)
+  var="controle"
+  CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var)
+  CALL err(NF90_GET_VAR(nid,vID,tab_cntrl),"get",var)
+  tab_cntrl(31)=DBLE(itau_dyn + itaufin)
+  CALL err(NF90_INQ_VARID(nid,var,vID),"inq",var)
+  CALL err(NF90_PUT_VAR(nid,vID,tab_cntrl),"put",var)
+  END IF               !++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+!$OMP END MASTER
+
+!--- Save fields
+  CALL dynredem_write_u(nid,"ucov" ,ucov ,llm)
+  CALL dynredem_write_v(nid,"vcov" ,vcov ,llm)
+  CALL dynredem_write_u(nid,"teta" ,teta ,llm)
+  CALL dynredem_write_u(nid,"masse",masse,llm)
+  CALL dynredem_write_u(nid,"ps"   ,ps   ,1)
+
+!--- Tracers in file "start_trac.nc" (added by Anne)
+  lread_inca=.FALSE.
+!$OMP MASTER
+  fil="start_trac.nc"
+  IF(ANY(type_trac == ['inca','inco'])) INQUIRE(FILE=fil,EXIST=lread_inca)
+  IF(lread_inca) CALL err(NF90_OPEN(fil,NF90_NOWRITE,nid_trac),"open")
+!$OMP END MASTER
+!$OMP BARRIER
+
+!--- Save tracers
+  DO iq=1,nqtot; var=TRIM(tracers(iq)%name); ierr=-1
+    IF(lread_inca) THEN                  !--- Possibly read from "start_trac.nc"
+!$OMP MASTER      
+      fil="start_trac.nc"
+      ierr=NF90_INQ_VARID(nid_trac,var,vID_trac)
+      dum='inq'; IF(ierr==NF90_NoErr) dum='fnd'
+      WRITE(lunout,*)msg(dum,var)
+!$OMP END MASTER
+!$OMP BARRIER
+      IF(ierr==NF90_NoErr) CALL dynredem_read_u(nid_trac,var,q(:,:,iq),llm)
+    END IF
+    fil=fichnom
+    CALL dynredem_write_u(nid,var,q(:,:,iq),llm)
+  END DO
+
+!$OMP MASTER
+  IF(mpi_rank==0) THEN !++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+  CALL err(NF90_CLOSE(nid),"close")
+  fil="start_trac.nc"
+  IF(lread_inca) CALL err(NF90_CLOSE(nid_trac),"close")
+  END IF               !++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+!$OMP END MASTER
+
+END SUBROUTINE dynredem1_loc
+
Index: LMDZ6/trunk/libf/dyn3dmem/dynredem_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/dynredem_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,271 +1,0 @@
-MODULE dynredem_mod
-
-  USE dimensions_mod
-  USE parallel_lmdz
-  USE mod_hallo
-  USE netcdf
-  PRIVATE
-  PUBLIC :: dynredem_write_u, dynredem_write_v, dynredem_read_u, err
-  PUBLIC :: cre_var, put_var, fil, modname, msg
-  CHARACTER(LEN=256), SAVE :: fil, modname
-  INTEGER,            SAVE :: nvarid
-
-
-CONTAINS
-
-
-!===============================================================================
-!
-SUBROUTINE dynredem_write_u(ncid,id,var,ll)
-!
-!===============================================================================
-  IMPLICIT NONE
-!===============================================================================
-! Arguments:
-  INTEGER,          INTENT(IN) :: ncid
-  CHARACTER(LEN=*), INTENT(IN) :: id
-  REAL,             INTENT(IN) :: var(ijb_u:ije_u,ll)
-  INTEGER,          INTENT(IN) :: ll
-!===============================================================================
-! Local variables:
-  REAL, ALLOCATABLE, SAVE :: var_tmp(:,:), var_glo(:)
-  INTEGER :: start(4), count(4), l, ierr
-!===============================================================================
-  start(:)=[1,1,1,1]; count(:)=[iip1,jjp1,1,1]
-
-!$OMP MASTER
-  IF(mpi_rank==0) CALL err(NF90_INQ_VARID(ncid,id,nvarid),"inq",id)
-!$OMP END MASTER
-
-!$OMP MASTER
-  ALLOCATE(var_tmp(ijb_u:ije_u,ll),var_glo(ip1jmp1))
-!$OMP END MASTER
-!$OMP BARRIER
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,ll; var_tmp(:,l)=var(:,l); END DO
-  DO l=1,ll
-    CALL gather_field_u(var_tmp(:,l),var_glo,1)
-    IF(mpi_rank==0) THEN
-    !$OMP MASTER
-      start(3)=l
-      CALL err(NF90_PUT_VAR(ncid,nvarid,var_glo,start,count),"put",id)
-    !$OMP END MASTER
-    END IF
-  END DO
-!$OMP BARRIER
-!$OMP MASTER
-  DEALLOCATE(var_glo,var_tmp)
-!$OMP END MASTER
-!$OMP BARRIER
-  
-END SUBROUTINE dynredem_write_u
-!
-!===============================================================================
-
-
-!===============================================================================
-!
-SUBROUTINE dynredem_write_v(ncid,id,var,ll)
-!
-!===============================================================================
-  IMPLICIT NONE
-!===============================================================================
-! Arguments:
-  INTEGER,          INTENT(IN) :: ncid
-  CHARACTER(LEN=*), INTENT(IN) :: id
-  REAL,             INTENT(IN) :: var(ijb_v:ije_v,ll)
-  INTEGER,          INTENT(IN) :: ll
-!===============================================================================
-! Local variables:
-  REAL, ALLOCATABLE, SAVE :: var_tmp(:,:), var_glo(:)
-  INTEGER :: start(4), count(4), l, ierr
-!===============================================================================
-  start(:)=[1,1,1,1]; count(:)=[iip1,jjm,1,1]
-
-!$OMP MASTER
-  IF(mpi_rank==0) CALL err(NF90_INQ_VARID(ncid,id,nvarid),"inq",id)
-!$OMP END MASTER
-
-!$OMP MASTER
-  ALLOCATE(var_tmp(ijb_v:ije_v,ll),var_glo(ip1jm))
-!$OMP END MASTER
-!$OMP BARRIER
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,ll; var_tmp(:,l)=var(:,l); END DO
-  DO l=1,ll
-    CALL gather_field_v(var_tmp(:,l),var_glo,1)
-    IF(mpi_rank==0) THEN
-    !$OMP MASTER
-      start(3)=l
-      CALL err(NF90_PUT_VAR(ncid,nvarid,var_glo,start,count),"put",id)
-    !$OMP END MASTER
-    END IF
-  END DO
-!$OMP BARRIER
-!$OMP MASTER
-  DEALLOCATE(var_glo,var_tmp)
-!$OMP END MASTER
-!$OMP BARRIER
-  
-END SUBROUTINE dynredem_write_v
-!
-!===============================================================================
-
-
-!===============================================================================
-!
-SUBROUTINE dynredem_read_u(ncid,id,var,ll)
-!
-!===============================================================================
-  IMPLICIT NONE
-!===============================================================================
-! Arguments:
-  INTEGER,          INTENT(IN)  :: ncid
-  CHARACTER(LEN=*), INTENT(IN)  :: id
-  REAL,             INTENT(OUT) :: var(ijb_u:ije_u,ll)
-  INTEGER,          INTENT(IN)  :: ll
-!===============================================================================
-! Local variables:
-  REAL, ALLOCATABLE, SAVE :: var_tmp(:,:), var_glo(:)
-  INTEGER :: start(4), count(4), l, ierr
-!===============================================================================
-  start(:)=[1,1,1,1]; count(:)=[iip1,jjp1,1,1]
-
-!$OMP MASTER
-  IF(mpi_rank==0) CALL err(NF90_INQ_VARID(ncid,id,nvarid),'inq',id)
-!$OMP END MASTER
-
-!$OMP MASTER
-  ALLOCATE(var_tmp(ijb_u:ije_u,ll),var_glo(ip1jmp1))
-!$OMP END MASTER
-!$OMP BARRIER
-
-  DO l=1,ll
-    IF(mpi_rank==0) THEN
-    !$OMP MASTER
-      start(3)=l
-      CALL err(NF90_GET_VAR(ncid,nvarid,var_glo,start,count),"get",id)
-    !$OMP END MASTER
-    END IF
-    CALL scatter_field_u(var_glo,var_tmp(:,l),1)
-  END DO
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,ll; var(:,l)=var_tmp(:,l); END DO
-    
-!$OMP BARRIER
-!$OMP MASTER
-  DEALLOCATE(var_glo,var_tmp)
-!$OMP END MASTER
-!$OMP BARRIER
-  
-END SUBROUTINE dynredem_read_u    
-!
-!===============================================================================
-
-
-!===============================================================================
-!
-SUBROUTINE cre_var(ncid,var,title,did,units)
-  USE lmdz_cppkeys_wrapper, ONLY: nf90_format
-  IMPLICIT NONE
-!===============================================================================
-! Arguments:
-  INTEGER,                    INTENT(IN) :: ncid
-  CHARACTER(LEN=*),           INTENT(IN) :: var, title
-  INTEGER,                    INTENT(IN) :: did(:)
-  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: units
-!===============================================================================
-  CALL err(NF90_DEF_VAR(ncid,var,nf90_format ,did,nvarid),"inq",var)
-  IF(title/="")      CALL err(NF90_PUT_ATT(ncid,nvarid,"title",title),var)
-  IF(PRESENT(units)) CALL err(NF90_PUT_ATT(ncid,nvarid,"units",units),var)
-
-END SUBROUTINE cre_var
-!
-!===============================================================================
-
-
-!===============================================================================
-!
-SUBROUTINE put_var(ncid,var,title,did,v,units)
-!
-!===============================================================================
-  IMPLICIT NONE
-!===============================================================================
-! Arguments:
-  INTEGER,                    INTENT(IN) :: ncid
-  CHARACTER(LEN=*),           INTENT(IN) :: var, title
-  INTEGER,                    INTENT(IN) :: did(:)
-  REAL,                       INTENT(IN) :: v(:)
-  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: units
-!===============================================================================
-  INTEGER :: nd, k, nn(2)
-  IF(     PRESENT(units)) CALL cre_var(ncid,var,title,did,units)
-  IF(.NOT.PRESENT(units)) CALL cre_var(ncid,var,title,did)
-  CALL err(NF90_ENDDEF(ncid))
-  nd=SIZE(did)
-  DO k=1,nd; CALL err(NF90_INQUIRE_DIMENSION(ncid,did(k),len=nn(k))); END DO
-  IF(nd==1) CALL err(NF90_PUT_VAR(ncid,nvarid,RESHAPE(v,nn(1:1))),var)
-  IF(nd==2) CALL err(NF90_PUT_VAR(ncid,nvarid,RESHAPE(v,nn(1:2))),var)
-  CALL err(NF90_REDEF(ncid))
-END SUBROUTINE put_var
-!
-!===============================================================================
-
-
-!===============================================================================
-!
-FUNCTION msg(typ,nam)
-!
-!===============================================================================
-  IMPLICIT NONE
-!===============================================================================
-! Arguments:
-  CHARACTER(LEN=256)                     :: msg    !--- STANDARDIZED MESSAGE
-  CHARACTER(LEN=*),           INTENT(IN) :: typ    !--- TYPE OF OPERATION
-  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: nam    !--- FIELD NAME
-!===============================================================================
-  SELECT CASE(typ)
-    CASE('open');  msg="Opening failed for <"//TRIM(fil)//">"
-    CASE('close'); msg="Closing failed for <"//TRIM(fil)//">"
-    CASE('get');   msg="Reading failed for <"//TRIM(nam)//">"
-    CASE('put');   msg="Writting failed for <"//TRIM(nam)//">"
-    CASE('inq');   msg="Missing field <"//TRIM(nam)//">"
-    CASE('fnd');   msg="Found field <"//TRIM(nam)//">"
-  END SELECT
-  msg=TRIM(msg)//" in file <"//TRIM(fil)//">"
-
-END FUNCTION msg
-!
-!===============================================================================
-
-
-!===============================================================================
-!
-SUBROUTINE err(ierr,typ,nam)
-!
-!===============================================================================
-  IMPLICIT NONE
-!===============================================================================
-! Arguments:
-  INTEGER,                    INTENT(IN) :: ierr   !--- NetCDF ERROR CODE
-  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: typ    !--- TYPE OF OPERATION
-  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: nam    !--- FIELD NAME
-!===============================================================================
-  IF(ierr==NF90_NoERR) RETURN
-  IF(.NOT.PRESENT(typ)) THEN
-    CALL ABORT_gcm(modname,NF90_STRERROR(ierr),ierr)
-  ELSE
-    CALL ABORT_gcm(modname,msg(typ,nam),ierr)
-  END IF
-
-END SUBROUTINE err
-!
-!===============================================================================
-
-END MODULE dynredem_mod   
-
-    
-    
Index: LMDZ6/trunk/libf/dyn3dmem/dynredem_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/dynredem_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/dynredem_mod.f90	(revision 5268)
@@ -0,0 +1,271 @@
+MODULE dynredem_mod
+
+  USE dimensions_mod
+  USE parallel_lmdz
+  USE mod_hallo
+  USE netcdf
+  PRIVATE
+  PUBLIC :: dynredem_write_u, dynredem_write_v, dynredem_read_u, err
+  PUBLIC :: cre_var, put_var, fil, modname, msg
+  CHARACTER(LEN=256), SAVE :: fil, modname
+  INTEGER,            SAVE :: nvarid
+
+
+CONTAINS
+
+
+!===============================================================================
+!
+SUBROUTINE dynredem_write_u(ncid,id,var,ll)
+!
+!===============================================================================
+  IMPLICIT NONE
+!===============================================================================
+! Arguments:
+  INTEGER,          INTENT(IN) :: ncid
+  CHARACTER(LEN=*), INTENT(IN) :: id
+  REAL,             INTENT(IN) :: var(ijb_u:ije_u,ll)
+  INTEGER,          INTENT(IN) :: ll
+!===============================================================================
+! Local variables:
+  REAL, ALLOCATABLE, SAVE :: var_tmp(:,:), var_glo(:)
+  INTEGER :: start(4), count(4), l, ierr
+!===============================================================================
+  start(:)=[1,1,1,1]; count(:)=[iip1,jjp1,1,1]
+
+!$OMP MASTER
+  IF(mpi_rank==0) CALL err(NF90_INQ_VARID(ncid,id,nvarid),"inq",id)
+!$OMP END MASTER
+
+!$OMP MASTER
+  ALLOCATE(var_tmp(ijb_u:ije_u,ll),var_glo(ip1jmp1))
+!$OMP END MASTER
+!$OMP BARRIER
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,ll; var_tmp(:,l)=var(:,l); END DO
+  DO l=1,ll
+    CALL gather_field_u(var_tmp(:,l),var_glo,1)
+    IF(mpi_rank==0) THEN
+    !$OMP MASTER
+      start(3)=l
+      CALL err(NF90_PUT_VAR(ncid,nvarid,var_glo,start,count),"put",id)
+    !$OMP END MASTER
+    END IF
+  END DO
+!$OMP BARRIER
+!$OMP MASTER
+  DEALLOCATE(var_glo,var_tmp)
+!$OMP END MASTER
+!$OMP BARRIER
+  
+END SUBROUTINE dynredem_write_u
+!
+!===============================================================================
+
+
+!===============================================================================
+!
+SUBROUTINE dynredem_write_v(ncid,id,var,ll)
+!
+!===============================================================================
+  IMPLICIT NONE
+!===============================================================================
+! Arguments:
+  INTEGER,          INTENT(IN) :: ncid
+  CHARACTER(LEN=*), INTENT(IN) :: id
+  REAL,             INTENT(IN) :: var(ijb_v:ije_v,ll)
+  INTEGER,          INTENT(IN) :: ll
+!===============================================================================
+! Local variables:
+  REAL, ALLOCATABLE, SAVE :: var_tmp(:,:), var_glo(:)
+  INTEGER :: start(4), count(4), l, ierr
+!===============================================================================
+  start(:)=[1,1,1,1]; count(:)=[iip1,jjm,1,1]
+
+!$OMP MASTER
+  IF(mpi_rank==0) CALL err(NF90_INQ_VARID(ncid,id,nvarid),"inq",id)
+!$OMP END MASTER
+
+!$OMP MASTER
+  ALLOCATE(var_tmp(ijb_v:ije_v,ll),var_glo(ip1jm))
+!$OMP END MASTER
+!$OMP BARRIER
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,ll; var_tmp(:,l)=var(:,l); END DO
+  DO l=1,ll
+    CALL gather_field_v(var_tmp(:,l),var_glo,1)
+    IF(mpi_rank==0) THEN
+    !$OMP MASTER
+      start(3)=l
+      CALL err(NF90_PUT_VAR(ncid,nvarid,var_glo,start,count),"put",id)
+    !$OMP END MASTER
+    END IF
+  END DO
+!$OMP BARRIER
+!$OMP MASTER
+  DEALLOCATE(var_glo,var_tmp)
+!$OMP END MASTER
+!$OMP BARRIER
+  
+END SUBROUTINE dynredem_write_v
+!
+!===============================================================================
+
+
+!===============================================================================
+!
+SUBROUTINE dynredem_read_u(ncid,id,var,ll)
+!
+!===============================================================================
+  IMPLICIT NONE
+!===============================================================================
+! Arguments:
+  INTEGER,          INTENT(IN)  :: ncid
+  CHARACTER(LEN=*), INTENT(IN)  :: id
+  REAL,             INTENT(OUT) :: var(ijb_u:ije_u,ll)
+  INTEGER,          INTENT(IN)  :: ll
+!===============================================================================
+! Local variables:
+  REAL, ALLOCATABLE, SAVE :: var_tmp(:,:), var_glo(:)
+  INTEGER :: start(4), count(4), l, ierr
+!===============================================================================
+  start(:)=[1,1,1,1]; count(:)=[iip1,jjp1,1,1]
+
+!$OMP MASTER
+  IF(mpi_rank==0) CALL err(NF90_INQ_VARID(ncid,id,nvarid),'inq',id)
+!$OMP END MASTER
+
+!$OMP MASTER
+  ALLOCATE(var_tmp(ijb_u:ije_u,ll),var_glo(ip1jmp1))
+!$OMP END MASTER
+!$OMP BARRIER
+
+  DO l=1,ll
+    IF(mpi_rank==0) THEN
+    !$OMP MASTER
+      start(3)=l
+      CALL err(NF90_GET_VAR(ncid,nvarid,var_glo,start,count),"get",id)
+    !$OMP END MASTER
+    END IF
+    CALL scatter_field_u(var_glo,var_tmp(:,l),1)
+  END DO
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,ll; var(:,l)=var_tmp(:,l); END DO
+    
+!$OMP BARRIER
+!$OMP MASTER
+  DEALLOCATE(var_glo,var_tmp)
+!$OMP END MASTER
+!$OMP BARRIER
+  
+END SUBROUTINE dynredem_read_u    
+!
+!===============================================================================
+
+
+!===============================================================================
+!
+SUBROUTINE cre_var(ncid,var,title,did,units)
+  USE lmdz_cppkeys_wrapper, ONLY: nf90_format
+  IMPLICIT NONE
+!===============================================================================
+! Arguments:
+  INTEGER,                    INTENT(IN) :: ncid
+  CHARACTER(LEN=*),           INTENT(IN) :: var, title
+  INTEGER,                    INTENT(IN) :: did(:)
+  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: units
+!===============================================================================
+  CALL err(NF90_DEF_VAR(ncid,var,nf90_format ,did,nvarid),"inq",var)
+  IF(title/="")      CALL err(NF90_PUT_ATT(ncid,nvarid,"title",title),var)
+  IF(PRESENT(units)) CALL err(NF90_PUT_ATT(ncid,nvarid,"units",units),var)
+
+END SUBROUTINE cre_var
+!
+!===============================================================================
+
+
+!===============================================================================
+!
+SUBROUTINE put_var(ncid,var,title,did,v,units)
+!
+!===============================================================================
+  IMPLICIT NONE
+!===============================================================================
+! Arguments:
+  INTEGER,                    INTENT(IN) :: ncid
+  CHARACTER(LEN=*),           INTENT(IN) :: var, title
+  INTEGER,                    INTENT(IN) :: did(:)
+  REAL,                       INTENT(IN) :: v(:)
+  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: units
+!===============================================================================
+  INTEGER :: nd, k, nn(2)
+  IF(     PRESENT(units)) CALL cre_var(ncid,var,title,did,units)
+  IF(.NOT.PRESENT(units)) CALL cre_var(ncid,var,title,did)
+  CALL err(NF90_ENDDEF(ncid))
+  nd=SIZE(did)
+  DO k=1,nd; CALL err(NF90_INQUIRE_DIMENSION(ncid,did(k),len=nn(k))); END DO
+  IF(nd==1) CALL err(NF90_PUT_VAR(ncid,nvarid,RESHAPE(v,nn(1:1))),var)
+  IF(nd==2) CALL err(NF90_PUT_VAR(ncid,nvarid,RESHAPE(v,nn(1:2))),var)
+  CALL err(NF90_REDEF(ncid))
+END SUBROUTINE put_var
+!
+!===============================================================================
+
+
+!===============================================================================
+!
+FUNCTION msg(typ,nam)
+!
+!===============================================================================
+  IMPLICIT NONE
+!===============================================================================
+! Arguments:
+  CHARACTER(LEN=256)                     :: msg    !--- STANDARDIZED MESSAGE
+  CHARACTER(LEN=*),           INTENT(IN) :: typ    !--- TYPE OF OPERATION
+  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: nam    !--- FIELD NAME
+!===============================================================================
+  SELECT CASE(typ)
+    CASE('open');  msg="Opening failed for <"//TRIM(fil)//">"
+    CASE('close'); msg="Closing failed for <"//TRIM(fil)//">"
+    CASE('get');   msg="Reading failed for <"//TRIM(nam)//">"
+    CASE('put');   msg="Writting failed for <"//TRIM(nam)//">"
+    CASE('inq');   msg="Missing field <"//TRIM(nam)//">"
+    CASE('fnd');   msg="Found field <"//TRIM(nam)//">"
+  END SELECT
+  msg=TRIM(msg)//" in file <"//TRIM(fil)//">"
+
+END FUNCTION msg
+!
+!===============================================================================
+
+
+!===============================================================================
+!
+SUBROUTINE err(ierr,typ,nam)
+!
+!===============================================================================
+  IMPLICIT NONE
+!===============================================================================
+! Arguments:
+  INTEGER,                    INTENT(IN) :: ierr   !--- NetCDF ERROR CODE
+  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: typ    !--- TYPE OF OPERATION
+  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: nam    !--- FIELD NAME
+!===============================================================================
+  IF(ierr==NF90_NoERR) RETURN
+  IF(.NOT.PRESENT(typ)) THEN
+    CALL ABORT_gcm(modname,NF90_STRERROR(ierr),ierr)
+  ELSE
+    CALL ABORT_gcm(modname,msg(typ,nam),ierr)
+  END IF
+
+END SUBROUTINE err
+!
+!===============================================================================
+
+END MODULE dynredem_mod   
+
+    
+    
Index: LMDZ6/trunk/libf/dyn3dmem/enercin_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/enercin_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,84 +1,0 @@
-SUBROUTINE enercin_loc ( vcov, ucov, vcont, ucont, ecin )
-!
-!-------------------------------------------------------------------------------
-! Authors: P. Le Van.
-!-------------------------------------------------------------------------------
-! Purpose: Compute kinetic energy at sigma levels.
-  USE parallel_lmdz
-  IMPLICIT NONE
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-!===============================================================================
-! Arguments:
-  REAL, INTENT(IN)  :: vcov    (ijb_v:ije_v,llm)
-  REAL, INTENT(IN)  :: ucov    (ijb_u:ije_u,llm)
-  REAL, INTENT(IN)  :: vcont   (ijb_v:ije_v,llm)
-  REAL, INTENT(IN)  :: ucont   (ijb_u:ije_u,llm)
-  REAL, INTENT(OUT) :: ecin    (ijb_u:ije_u,llm)
-!===============================================================================
-! Notes:
-!                 . V
-!                i,j-1
-!
-!      alpha4 .       . alpha1
-!
-!
-!        U .      . P     . U
-!       i-1,j    i,j      i,j
-!
-!      alpha3 .       . alpha2
-!
-!
-!                 . V
-!                i,j
-!
-! Kinetic energy at scalar point P(i,j) (excluding poles) is:
-!       Ecin = 0.5 * U(i-1,j)**2 *( alpha3 + alpha4 )  +
-!              0.5 * U(i  ,j)**2 *( alpha1 + alpha2 )  +
-!              0.5 * V(i,j-1)**2 *( alpha1 + alpha4 )  +
-!              0.5 * V(i,  j)**2 *( alpha2 + alpha3 )
-!===============================================================================
-! Local variables:
-  INTEGER :: l, ij, i, ijb, ije
-  REAL    :: ecinni(iim), ecinsi(iim), ecinpn, ecinps
-!===============================================================================
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-
-    ijb=ij_begin
-    ije=ij_end+iip1
-
-    IF(pole_nord) ijb=ij_begin+iip1
-    IF(pole_sud)  ije=ij_end-iip1
-
-    DO ij = ijb,ije-1
-      ecin(ij+1,l)=0.5*(ucov(ij    ,l)*ucont(ij    ,l)*alpha3p4(ij +1)          &
-                      + ucov(ij+1  ,l)*ucont(ij+1  ,l)*alpha1p2(ij +1)          &
-                      + vcov(ij-iim,l)*vcont(ij-iim,l)*alpha1p4(ij +1)          &
-                      + vcov(ij+1  ,l)*vcont(ij+1  ,l)*alpha2p3(ij +1) )
-    END DO
-
-    !--- Correction: ecin(1,j,l)= ecin(iip1,j,l)
-    DO ij=ijb,ije,iip1; ecin(ij,l) = ecin(ij+iim,l); END DO
-
-    !--- North pole
-    IF(pole_nord) THEN
-      ecinni(:) = vcov(1:iim,l)*vcont(1:iim,l)*aire(1:iim)
-      ecinpn = 0.5*SUM(ecinni)/apoln
-      ecin(1:iip1,l)=ecinpn
-    END IF
-
-    !--- South pole
-    IF(pole_sud) THEN
-      DO i=1,iim
-        ecinsi(i) = vcov(i+ip1jmi1,l)*vcont(i+ip1jmi1,l)*aire(i+ip1jm)
-      END DO
-      ecinps = 0.5*SUM(ecinsi)/apols
-      ecin(1+ip1jm:ip1jmp1,l)=ecinps
-    END IF
-  END DO
-!$OMP END DO NOWAIT
-
-END SUBROUTINE enercin_loc
-
Index: LMDZ6/trunk/libf/dyn3dmem/enercin_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/enercin_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/enercin_loc.f90	(revision 5268)
@@ -0,0 +1,84 @@
+SUBROUTINE enercin_loc ( vcov, ucov, vcont, ucont, ecin )
+!
+!-------------------------------------------------------------------------------
+! Authors: P. Le Van.
+!-------------------------------------------------------------------------------
+! Purpose: Compute kinetic energy at sigma levels.
+  USE parallel_lmdz
+  IMPLICIT NONE
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+!===============================================================================
+! Arguments:
+  REAL, INTENT(IN)  :: vcov    (ijb_v:ije_v,llm)
+  REAL, INTENT(IN)  :: ucov    (ijb_u:ije_u,llm)
+  REAL, INTENT(IN)  :: vcont   (ijb_v:ije_v,llm)
+  REAL, INTENT(IN)  :: ucont   (ijb_u:ije_u,llm)
+  REAL, INTENT(OUT) :: ecin    (ijb_u:ije_u,llm)
+!===============================================================================
+! Notes:
+!                 . V
+!                i,j-1
+!
+!      alpha4 .       . alpha1
+!
+!
+!        U .      . P     . U
+!       i-1,j    i,j      i,j
+!
+!      alpha3 .       . alpha2
+!
+!
+!                 . V
+!                i,j
+!
+! Kinetic energy at scalar point P(i,j) (excluding poles) is:
+!       Ecin = 0.5 * U(i-1,j)**2 *( alpha3 + alpha4 )  +
+!              0.5 * U(i  ,j)**2 *( alpha1 + alpha2 )  +
+!              0.5 * V(i,j-1)**2 *( alpha1 + alpha4 )  +
+!              0.5 * V(i,  j)**2 *( alpha2 + alpha3 )
+!===============================================================================
+! Local variables:
+  INTEGER :: l, ij, i, ijb, ije
+  REAL    :: ecinni(iim), ecinsi(iim), ecinpn, ecinps
+!===============================================================================
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+
+    ijb=ij_begin
+    ije=ij_end+iip1
+
+    IF(pole_nord) ijb=ij_begin+iip1
+    IF(pole_sud)  ije=ij_end-iip1
+
+    DO ij = ijb,ije-1
+      ecin(ij+1,l)=0.5*(ucov(ij    ,l)*ucont(ij    ,l)*alpha3p4(ij +1)          &
+                      + ucov(ij+1  ,l)*ucont(ij+1  ,l)*alpha1p2(ij +1)          &
+                      + vcov(ij-iim,l)*vcont(ij-iim,l)*alpha1p4(ij +1)          &
+                      + vcov(ij+1  ,l)*vcont(ij+1  ,l)*alpha2p3(ij +1) )
+    END DO
+
+    !--- Correction: ecin(1,j,l)= ecin(iip1,j,l)
+    DO ij=ijb,ije,iip1; ecin(ij,l) = ecin(ij+iim,l); END DO
+
+    !--- North pole
+    IF(pole_nord) THEN
+      ecinni(:) = vcov(1:iim,l)*vcont(1:iim,l)*aire(1:iim)
+      ecinpn = 0.5*SUM(ecinni)/apoln
+      ecin(1:iip1,l)=ecinpn
+    END IF
+
+    !--- South pole
+    IF(pole_sud) THEN
+      DO i=1,iim
+        ecinsi(i) = vcov(i+ip1jmi1,l)*vcont(i+ip1jmi1,l)*aire(i+ip1jm)
+      END DO
+      ecinps = 0.5*SUM(ecinsi)/apols
+      ecin(1+ip1jm:ip1jmp1,l)=ecinps
+    END IF
+  END DO
+!$OMP END DO NOWAIT
+
+END SUBROUTINE enercin_loc
+
Index: LMDZ6/trunk/libf/dyn3dmem/exner_hyb_loc_m.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/exner_hyb_loc_m.F90	(revision 5267)
+++ 	(revision )
@@ -1,199 +1,0 @@
-module exner_hyb_loc_m
-
-  IMPLICIT NONE
-
-contains
-
-  SUBROUTINE  exner_hyb_loc(ngrid, ps, p, pks,pk,pkf)
-
-    !     Auteurs :  P.Le Van  , Fr. Hourdin  .
-    !    ..........
-    !
-    !    ....  ngrid, ps,p             sont des argum.d'entree  au sous-prog ...
-    !    ....  pks,pk,pkf   sont des argum.de sortie au sous-prog ...
-    !
-    !   ************************************************************************
-    !    Calcule la fonction d'Exner pk = Cp * (p/preff) ** kappa , aux milieux des 
-    !    couches .   Pk(l) sera calcule aux milieux  des couches l ,entre les
-    !    pressions p(l) et p(l+1) ,definis aux interfaces des llm couches .
-    !   ************************************************************************
-    !  .. N.B : Au sommet de l'atmosphere,  p(llm+1) = 0. , et ps et pks sont
-    !    la pression et la fonction d'Exner  au  sol  .
-    !
-    !                                 -------- z
-    !    A partir des relations  ( 1 ) p*dz(pk) = kappa *pk*dz(p)      et
-    !                            ( 2 ) pk(l) = alpha(l)+ beta(l)*pk(l-1)
-    !    ( voir note de Fr.Hourdin )  ,
-    !
-    !    on determine successivement , du haut vers le bas des couches, les 
-    !    coef. alpha(llm),beta(llm) .,.,alpha(l),beta(l),,,alpha(2),beta(2), 
-    !    puis pk(ij,1). Ensuite ,on calcule,du bas vers le haut des couches,  
-    !     pk(ij,l)  donne  par la relation (2),  pour l = 2 a l = llm .
-    !
-    !
-    USE parallel_lmdz
-    USE mod_filtreg_p
-    USE write_field_loc
-    USE comconst_mod, ONLY: cpp, kappa, r, jmp1
-    USE comvert_mod, ONLY: preff
-    USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
-    IMPLICIT NONE
-    !
-    include "dimensions.h"
-    include "paramet.h"
-    include "comgeom.h"
-
-    INTEGER  ngrid
-    REAL p(ijb_u:ije_u,llmp1),pk(ijb_u:ije_u,llm)
-    REAL, optional:: pkf(ijb_u:ije_u,llm)
-    REAL ps(ijb_u:ije_u),pks(ijb_u:ije_u)
-    REAL alpha(ijb_u:ije_u,llm),beta(ijb_u:ije_u,llm)
-
-    !    .... variables locales   ...
-
-    INTEGER l, ij
-    REAL unpl2k,dellta
-
-    INTEGER ije,ijb,jje,jjb
-    logical,save :: firstcall=.true.
-    !$OMP THREADPRIVATE(firstcall) 
-    character(len=*),parameter :: modname="exner_hyb_loc"
-    !
-    !$OMP BARRIER           
-
-    ! Sanity check
-    if (firstcall) then
-       ! sanity checks for Shallow Water case (1 vertical layer)
-       if (llm.eq.1) then
-          if (kappa.ne.1) then
-             call abort_gcm(modname, &
-                  "kappa!=1 , but running in Shallow Water mode!!",42)
-          endif
-          if (cpp.ne.r) then
-             call abort_gcm(modname, &
-                  "cpp!=r , but running in Shallow Water mode!!",42)
-          endif
-       endif ! of if (llm.eq.1)
-
-       firstcall=.false.
-    endif ! of if (firstcall)
-
-    !$OMP BARRIER
-
-    ! Specific behaviour for Shallow Water (1 vertical layer) case:
-    if (llm.eq.1) then
-
-       ! Compute pks(:),pk(:),pkf(:)
-       ijb=ij_begin
-       ije=ij_end
-       !$OMP DO SCHEDULE(STATIC)
-       DO ij=ijb, ije
-          pks(ij) = (cpp/preff) * ps(ij)
-          pk(ij,1) = .5*pks(ij)
-          if (present(pkf)) pkf(ij,1)=pk(ij,1)
-       ENDDO
-       !$OMP ENDDO
-
-       !$OMP BARRIER
-       if (present(pkf)) then
-          jjb=jj_begin
-          jje=jj_end
-          CALL filtreg_p ( pkf,jjb_u,jje_u,jjb,jje, jmp1, llm, &
-               2, 1, .TRUE., 1 )
-       end if
-
-       ! our work is done, exit routine
-       return
-    endif ! of if (llm.eq.1)
-
-    ! General case:
-
-    unpl2k    = 1.+ 2.* kappa
-
-    !     -------------
-    !     Calcul de pks
-    !     -------------
-
-    ijb=ij_begin
-    ije=ij_end
-
-    !$OMP DO SCHEDULE(STATIC)
-    DO   ij  = ijb, ije
-       pks(ij) = cpp * ( ps(ij)/preff ) ** kappa
-    ENDDO
-    !$OMP ENDDO
-    ! Synchro OPENMP ici
-
-    !$OMP BARRIER
-    !
-    !
-    !    .... Calcul des coeff. alpha et beta  pour la couche l = llm ..
-    !
-    !$OMP DO SCHEDULE(STATIC)
-    DO     ij      = ijb,ije
-       alpha(ij,llm) = 0.
-       beta (ij,llm) = 1./ unpl2k
-    ENDDO
-    !$OMP ENDDO NOWAIT
-    !
-    !     ... Calcul des coeff. alpha et beta  pour l = llm-1  a l = 2 ...
-    !
-    DO l = llm -1 , 2 , -1
-       !
-       !$OMP DO SCHEDULE(STATIC)
-       DO ij = ijb, ije
-          dellta = p(ij,l)* unpl2k + p(ij,l+1)* ( beta(ij,l+1)-unpl2k )
-          alpha(ij,l)  = - p(ij,l+1) / dellta * alpha(ij,l+1)
-          beta (ij,l)  =   p(ij,l  ) / dellta   
-       ENDDO
-       !$OMP ENDDO NOWAIT
-    ENDDO
-
-    !  ***********************************************************************
-    !     .....  Calcul de pk pour la couche 1 , pres du sol  ....
-    !
-    !$OMP DO SCHEDULE(STATIC)
-    DO   ij   = ijb, ije
-       pk(ij,1) = ( p(ij,1)*pks(ij) - 0.5*alpha(ij,2)*p(ij,2) )  / &
-            (  p(ij,1)* (1.+kappa) + 0.5*( beta(ij,2)-unpl2k )* p(ij,2) )
-    ENDDO
-    !$OMP ENDDO NOWAIT
-    !
-    !    ..... Calcul de pk(ij,l) , pour l = 2 a l = llm  ........
-    !
-    DO l = 2, llm
-       !$OMP DO SCHEDULE(STATIC)
-       DO   ij   = ijb, ije
-          pk(ij,l) = alpha(ij,l) + beta(ij,l) * pk(ij,l-1)
-       ENDDO
-       !$OMP ENDDO NOWAIT        
-    ENDDO
-
-    if (present(pkf)) then
-       !    calcul de pkf
-
-       DO l = 1, llm
-          !$OMP DO SCHEDULE(STATIC)
-          DO   ij   = ijb, ije
-             pkf(ij,l)=pk(ij,l)
-          ENDDO
-          !$OMP ENDDO NOWAIT             
-       ENDDO
-
-       !$OMP BARRIER
-
-       jjb=jj_begin
-       jje=jj_end
-IF (CPPKEY_DEBUGIO) THEN
-       call WriteField_u('pkf',pkf)
-END IF
-       CALL filtreg_p ( pkf,jjb_u,jje_u,jjb,jje, jmp1, llm, &
-            2, 1, .TRUE., 1 )
-IF (CPPKEY_DEBUGIO) THEN
-       call WriteField_u('pkf',pkf)
-END IF
-    end if
-
-  END SUBROUTINE exner_hyb_loc
-
-end module exner_hyb_loc_m
Index: LMDZ6/trunk/libf/dyn3dmem/exner_hyb_loc_m.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/exner_hyb_loc_m.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/exner_hyb_loc_m.f90	(revision 5268)
@@ -0,0 +1,199 @@
+module exner_hyb_loc_m
+
+  IMPLICIT NONE
+
+contains
+
+  SUBROUTINE  exner_hyb_loc(ngrid, ps, p, pks,pk,pkf)
+
+    !     Auteurs :  P.Le Van  , Fr. Hourdin  .
+    !    ..........
+    !
+    !    ....  ngrid, ps,p             sont des argum.d'entree  au sous-prog ...
+    !    ....  pks,pk,pkf   sont des argum.de sortie au sous-prog ...
+    !
+    !   ************************************************************************
+    !    Calcule la fonction d'Exner pk = Cp * (p/preff) ** kappa , aux milieux des 
+    !    couches .   Pk(l) sera calcule aux milieux  des couches l ,entre les
+    !    pressions p(l) et p(l+1) ,definis aux interfaces des llm couches .
+    !   ************************************************************************
+    !  .. N.B : Au sommet de l'atmosphere,  p(llm+1) = 0. , et ps et pks sont
+    !    la pression et la fonction d'Exner  au  sol  .
+    !
+    !                                 -------- z
+    !    A partir des relations  ( 1 ) p*dz(pk) = kappa *pk*dz(p)      et
+    !                            ( 2 ) pk(l) = alpha(l)+ beta(l)*pk(l-1)
+    !    ( voir note de Fr.Hourdin )  ,
+    !
+    !    on determine successivement , du haut vers le bas des couches, les 
+    !    coef. alpha(llm),beta(llm) .,.,alpha(l),beta(l),,,alpha(2),beta(2), 
+    !    puis pk(ij,1). Ensuite ,on calcule,du bas vers le haut des couches,  
+    !     pk(ij,l)  donne  par la relation (2),  pour l = 2 a l = llm .
+    !
+    !
+    USE parallel_lmdz
+    USE mod_filtreg_p
+    USE write_field_loc
+    USE comconst_mod, ONLY: cpp, kappa, r, jmp1
+    USE comvert_mod, ONLY: preff
+    USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
+    IMPLICIT NONE
+    !
+    include "dimensions.h"
+    include "paramet.h"
+    include "comgeom.h"
+
+    INTEGER  ngrid
+    REAL p(ijb_u:ije_u,llmp1),pk(ijb_u:ije_u,llm)
+    REAL, optional:: pkf(ijb_u:ije_u,llm)
+    REAL ps(ijb_u:ije_u),pks(ijb_u:ije_u)
+    REAL alpha(ijb_u:ije_u,llm),beta(ijb_u:ije_u,llm)
+
+    !    .... variables locales   ...
+
+    INTEGER l, ij
+    REAL unpl2k,dellta
+
+    INTEGER ije,ijb,jje,jjb
+    logical,save :: firstcall=.true.
+    !$OMP THREADPRIVATE(firstcall) 
+    character(len=*),parameter :: modname="exner_hyb_loc"
+    !
+    !$OMP BARRIER           
+
+    ! Sanity check
+    if (firstcall) then
+       ! sanity checks for Shallow Water case (1 vertical layer)
+       if (llm.eq.1) then
+          if (kappa.ne.1) then
+             call abort_gcm(modname, &
+                  "kappa!=1 , but running in Shallow Water mode!!",42)
+          endif
+          if (cpp.ne.r) then
+             call abort_gcm(modname, &
+                  "cpp!=r , but running in Shallow Water mode!!",42)
+          endif
+       endif ! of if (llm.eq.1)
+
+       firstcall=.false.
+    endif ! of if (firstcall)
+
+    !$OMP BARRIER
+
+    ! Specific behaviour for Shallow Water (1 vertical layer) case:
+    if (llm.eq.1) then
+
+       ! Compute pks(:),pk(:),pkf(:)
+       ijb=ij_begin
+       ije=ij_end
+       !$OMP DO SCHEDULE(STATIC)
+       DO ij=ijb, ije
+          pks(ij) = (cpp/preff) * ps(ij)
+          pk(ij,1) = .5*pks(ij)
+          if (present(pkf)) pkf(ij,1)=pk(ij,1)
+       ENDDO
+       !$OMP ENDDO
+
+       !$OMP BARRIER
+       if (present(pkf)) then
+          jjb=jj_begin
+          jje=jj_end
+          CALL filtreg_p ( pkf,jjb_u,jje_u,jjb,jje, jmp1, llm, &
+               2, 1, .TRUE., 1 )
+       end if
+
+       ! our work is done, exit routine
+       return
+    endif ! of if (llm.eq.1)
+
+    ! General case:
+
+    unpl2k    = 1.+ 2.* kappa
+
+    !     -------------
+    !     Calcul de pks
+    !     -------------
+
+    ijb=ij_begin
+    ije=ij_end
+
+    !$OMP DO SCHEDULE(STATIC)
+    DO   ij  = ijb, ije
+       pks(ij) = cpp * ( ps(ij)/preff ) ** kappa
+    ENDDO
+    !$OMP ENDDO
+    ! Synchro OPENMP ici
+
+    !$OMP BARRIER
+    !
+    !
+    !    .... Calcul des coeff. alpha et beta  pour la couche l = llm ..
+    !
+    !$OMP DO SCHEDULE(STATIC)
+    DO     ij      = ijb,ije
+       alpha(ij,llm) = 0.
+       beta (ij,llm) = 1./ unpl2k
+    ENDDO
+    !$OMP ENDDO NOWAIT
+    !
+    !     ... Calcul des coeff. alpha et beta  pour l = llm-1  a l = 2 ...
+    !
+    DO l = llm -1 , 2 , -1
+       !
+       !$OMP DO SCHEDULE(STATIC)
+       DO ij = ijb, ije
+          dellta = p(ij,l)* unpl2k + p(ij,l+1)* ( beta(ij,l+1)-unpl2k )
+          alpha(ij,l)  = - p(ij,l+1) / dellta * alpha(ij,l+1)
+          beta (ij,l)  =   p(ij,l  ) / dellta   
+       ENDDO
+       !$OMP ENDDO NOWAIT
+    ENDDO
+
+    !  ***********************************************************************
+    !     .....  Calcul de pk pour la couche 1 , pres du sol  ....
+    !
+    !$OMP DO SCHEDULE(STATIC)
+    DO   ij   = ijb, ije
+       pk(ij,1) = ( p(ij,1)*pks(ij) - 0.5*alpha(ij,2)*p(ij,2) )  / &
+            (  p(ij,1)* (1.+kappa) + 0.5*( beta(ij,2)-unpl2k )* p(ij,2) )
+    ENDDO
+    !$OMP ENDDO NOWAIT
+    !
+    !    ..... Calcul de pk(ij,l) , pour l = 2 a l = llm  ........
+    !
+    DO l = 2, llm
+       !$OMP DO SCHEDULE(STATIC)
+       DO   ij   = ijb, ije
+          pk(ij,l) = alpha(ij,l) + beta(ij,l) * pk(ij,l-1)
+       ENDDO
+       !$OMP ENDDO NOWAIT        
+    ENDDO
+
+    if (present(pkf)) then
+       !    calcul de pkf
+
+       DO l = 1, llm
+          !$OMP DO SCHEDULE(STATIC)
+          DO   ij   = ijb, ije
+             pkf(ij,l)=pk(ij,l)
+          ENDDO
+          !$OMP ENDDO NOWAIT             
+       ENDDO
+
+       !$OMP BARRIER
+
+       jjb=jj_begin
+       jje=jj_end
+IF (CPPKEY_DEBUGIO) THEN
+       call WriteField_u('pkf',pkf)
+END IF
+       CALL filtreg_p ( pkf,jjb_u,jje_u,jjb,jje, jmp1, llm, &
+            2, 1, .TRUE., 1 )
+IF (CPPKEY_DEBUGIO) THEN
+       call WriteField_u('pkf',pkf)
+END IF
+    end if
+
+  END SUBROUTINE exner_hyb_loc
+
+end module exner_hyb_loc_m
Index: LMDZ6/trunk/libf/dyn3dmem/exner_milieu_loc_m.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/exner_milieu_loc_m.F90	(revision 5267)
+++ 	(revision )
@@ -1,164 +1,0 @@
-module exner_milieu_loc_m
-
-  IMPLICIT NONE
-
-contains
-
-  SUBROUTINE  exner_milieu_loc ( ngrid, ps, p, pks, pk, pkf )
-    !
-    !     Auteurs :  F. Forget , Y. Wanherdrick
-    ! P.Le Van  , Fr. Hourdin  .
-    !    ..........
-    !
-    !    ....  ngrid, ps,p             sont des argum.d'entree  au sous-prog ...
-    !    ....  pks,pk,pkf   sont des argum.de sortie au sous-prog ...
-    !
-    !   ************************************************************************
-    !    Calcule la fonction d'Exner pk = Cp * (p/preff) ** kappa , aux milieux des 
-    !    couches .   Pk(l) sera calcule aux milieux  des couches l ,entre les
-    !    pressions p(l) et p(l+1) ,definis aux interfaces des llm couches .
-    !   ************************************************************************
-    !  .. N.B : Au sommet de l'atmosphere,  p(llm+1) = 0. , et ps et pks sont
-    !    la pression et la fonction d'Exner  au  sol  .
-    !
-    !     WARNING : CECI est une version speciale de exner_hyb originale
-    !               Utilise dans la version martienne pour pouvoir 
-    !               tourner avec des coordonnees verticales complexe
-    !              => Il ne verifie PAS la condition la proportionalite en 
-    !              energie totale/ interne / potentielle (F.Forget 2001)
-    !    ( voir note de Fr.Hourdin )  ,
-    !
-    USE parallel_lmdz
-    USE mod_filtreg_p
-    USE comconst_mod, ONLY: cpp, kappa, r, jmp1
-    USE comvert_mod, ONLY: preff
-    
-    IMPLICIT NONE
-    !
-    include "dimensions.h"
-    include "paramet.h"
-    include "comgeom.h"
-
-    INTEGER  ngrid
-    REAL p(ijb_u:ije_u,llmp1),pk(ijb_u:ije_u,llm)
-    REAL, optional:: pkf(ijb_u:ije_u,llm)
-    REAL ps(ijb_u:ije_u),pks(ijb_u:ije_u)
-
-    !    .... variables locales   ...
-
-    INTEGER l, ij
-    REAL dum1
-
-    INTEGER ije,ijb,jje,jjb
-    logical,save :: firstcall=.true.
-    !$OMP THREADPRIVATE(firstcall) 
-    character(len=*),parameter :: modname="exner_milieu_loc"
-
-    ! Sanity check
-    if (firstcall) then
-       ! sanity checks for Shallow Water case (1 vertical layer)
-       if (llm.eq.1) then
-          if (kappa.ne.1) then
-             call abort_gcm(modname, &
-                  "kappa!=1 , but running in Shallow Water mode!!",42)
-          endif
-          if (cpp.ne.r) then
-             call abort_gcm(modname, &
-                  "cpp!=r , but running in Shallow Water mode!!",42)
-          endif
-       endif ! of if (llm.eq.1)
-
-       firstcall=.false.
-    endif ! of if (firstcall)
-
-    !$OMP BARRIER
-
-    ! Specific behaviour for Shallow Water (1 vertical layer) case:
-    if (llm.eq.1) then
-
-       ! Compute pks(:),pk(:),pkf(:)
-       ijb=ij_begin
-       ije=ij_end
-       !$OMP DO SCHEDULE(STATIC)
-       DO ij=ijb, ije
-          pks(ij) = (cpp/preff) * ps(ij)
-          pk(ij,1) = .5*pks(ij)
-          if (present(pkf)) pkf(ij,1)=pk(ij,1)
-       ENDDO
-       !$OMP ENDDO
-
-       !$OMP BARRIER
-       if (present(pkf)) then
-          jjb=jj_begin
-          jje=jj_end
-          CALL filtreg_p ( pkf,jjb_u,jje_u,jjb,jje, jmp1, llm, &
-               2, 1, .TRUE., 1 )
-       end if
-
-       ! our work is done, exit routine
-       return
-    endif ! of if (llm.eq.1)
-
-    ! General case:
-
-    !     -------------
-    !     Calcul de pks
-    !     -------------
-
-    ijb=ij_begin
-    ije=ij_end
-
-    !$OMP DO SCHEDULE(STATIC)
-    DO   ij  = ijb, ije
-       pks(ij) = cpp * ( ps(ij)/preff ) ** kappa
-    ENDDO
-    !$OMP ENDDO
-    ! Synchro OPENMP ici
-
-    !$OMP BARRIER
-    !
-    !
-    !    .... Calcul de pk  pour la couche l 
-    !    --------------------------------------------
-    !
-    dum1 = cpp * (2*preff)**(-kappa) 
-    DO l = 1, llm-1
-       !$OMP DO SCHEDULE(STATIC)
-       DO   ij   = ijb, ije
-          pk(ij,l) = dum1 * (p(ij,l) + p(ij,l+1))**kappa
-       ENDDO
-       !$OMP ENDDO NOWAIT
-    ENDDO
-
-    !    .... Calcul de pk  pour la couche l = llm ..
-    !    (on met la meme distance (en log pression)  entre Pk(llm)
-    !    et Pk(llm -1) qu'entre Pk(llm-1) et Pk(llm-2)
-
-    !$OMP DO SCHEDULE(STATIC)
-    DO   ij   = ijb, ije
-       pk(ij,llm) = pk(ij,llm-1)**2 / pk(ij,llm-2)
-    ENDDO
-    !$OMP ENDDO NOWAIT        
-
-    if (present(pkf)) then
-       !    calcul de pkf
-
-       DO l = 1, llm
-          !$OMP DO SCHEDULE(STATIC)
-          DO   ij   = ijb, ije
-             pkf(ij,l)=pk(ij,l)
-          ENDDO
-          !$OMP ENDDO NOWAIT
-       ENDDO
-
-       !$OMP BARRIER
-
-       jjb=jj_begin
-       jje=jj_end
-       CALL filtreg_p ( pkf,jjb_u,jje_u,jjb,jje, jmp1, llm, &
-            2, 1, .TRUE., 1 )
-    end if
-
-  END SUBROUTINE exner_milieu_loc
-
-end module exner_milieu_loc_m
Index: LMDZ6/trunk/libf/dyn3dmem/exner_milieu_loc_m.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/exner_milieu_loc_m.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/exner_milieu_loc_m.f90	(revision 5268)
@@ -0,0 +1,164 @@
+module exner_milieu_loc_m
+
+  IMPLICIT NONE
+
+contains
+
+  SUBROUTINE  exner_milieu_loc ( ngrid, ps, p, pks, pk, pkf )
+    !
+    !     Auteurs :  F. Forget , Y. Wanherdrick
+    ! P.Le Van  , Fr. Hourdin  .
+    !    ..........
+    !
+    !    ....  ngrid, ps,p             sont des argum.d'entree  au sous-prog ...
+    !    ....  pks,pk,pkf   sont des argum.de sortie au sous-prog ...
+    !
+    !   ************************************************************************
+    !    Calcule la fonction d'Exner pk = Cp * (p/preff) ** kappa , aux milieux des 
+    !    couches .   Pk(l) sera calcule aux milieux  des couches l ,entre les
+    !    pressions p(l) et p(l+1) ,definis aux interfaces des llm couches .
+    !   ************************************************************************
+    !  .. N.B : Au sommet de l'atmosphere,  p(llm+1) = 0. , et ps et pks sont
+    !    la pression et la fonction d'Exner  au  sol  .
+    !
+    !     WARNING : CECI est une version speciale de exner_hyb originale
+    !               Utilise dans la version martienne pour pouvoir 
+    !               tourner avec des coordonnees verticales complexe
+    !              => Il ne verifie PAS la condition la proportionalite en 
+    !              energie totale/ interne / potentielle (F.Forget 2001)
+    !    ( voir note de Fr.Hourdin )  ,
+    !
+    USE parallel_lmdz
+    USE mod_filtreg_p
+    USE comconst_mod, ONLY: cpp, kappa, r, jmp1
+    USE comvert_mod, ONLY: preff
+    
+    IMPLICIT NONE
+    !
+    include "dimensions.h"
+    include "paramet.h"
+    include "comgeom.h"
+
+    INTEGER  ngrid
+    REAL p(ijb_u:ije_u,llmp1),pk(ijb_u:ije_u,llm)
+    REAL, optional:: pkf(ijb_u:ije_u,llm)
+    REAL ps(ijb_u:ije_u),pks(ijb_u:ije_u)
+
+    !    .... variables locales   ...
+
+    INTEGER l, ij
+    REAL dum1
+
+    INTEGER ije,ijb,jje,jjb
+    logical,save :: firstcall=.true.
+    !$OMP THREADPRIVATE(firstcall) 
+    character(len=*),parameter :: modname="exner_milieu_loc"
+
+    ! Sanity check
+    if (firstcall) then
+       ! sanity checks for Shallow Water case (1 vertical layer)
+       if (llm.eq.1) then
+          if (kappa.ne.1) then
+             call abort_gcm(modname, &
+                  "kappa!=1 , but running in Shallow Water mode!!",42)
+          endif
+          if (cpp.ne.r) then
+             call abort_gcm(modname, &
+                  "cpp!=r , but running in Shallow Water mode!!",42)
+          endif
+       endif ! of if (llm.eq.1)
+
+       firstcall=.false.
+    endif ! of if (firstcall)
+
+    !$OMP BARRIER
+
+    ! Specific behaviour for Shallow Water (1 vertical layer) case:
+    if (llm.eq.1) then
+
+       ! Compute pks(:),pk(:),pkf(:)
+       ijb=ij_begin
+       ije=ij_end
+       !$OMP DO SCHEDULE(STATIC)
+       DO ij=ijb, ije
+          pks(ij) = (cpp/preff) * ps(ij)
+          pk(ij,1) = .5*pks(ij)
+          if (present(pkf)) pkf(ij,1)=pk(ij,1)
+       ENDDO
+       !$OMP ENDDO
+
+       !$OMP BARRIER
+       if (present(pkf)) then
+          jjb=jj_begin
+          jje=jj_end
+          CALL filtreg_p ( pkf,jjb_u,jje_u,jjb,jje, jmp1, llm, &
+               2, 1, .TRUE., 1 )
+       end if
+
+       ! our work is done, exit routine
+       return
+    endif ! of if (llm.eq.1)
+
+    ! General case:
+
+    !     -------------
+    !     Calcul de pks
+    !     -------------
+
+    ijb=ij_begin
+    ije=ij_end
+
+    !$OMP DO SCHEDULE(STATIC)
+    DO   ij  = ijb, ije
+       pks(ij) = cpp * ( ps(ij)/preff ) ** kappa
+    ENDDO
+    !$OMP ENDDO
+    ! Synchro OPENMP ici
+
+    !$OMP BARRIER
+    !
+    !
+    !    .... Calcul de pk  pour la couche l 
+    !    --------------------------------------------
+    !
+    dum1 = cpp * (2*preff)**(-kappa) 
+    DO l = 1, llm-1
+       !$OMP DO SCHEDULE(STATIC)
+       DO   ij   = ijb, ije
+          pk(ij,l) = dum1 * (p(ij,l) + p(ij,l+1))**kappa
+       ENDDO
+       !$OMP ENDDO NOWAIT
+    ENDDO
+
+    !    .... Calcul de pk  pour la couche l = llm ..
+    !    (on met la meme distance (en log pression)  entre Pk(llm)
+    !    et Pk(llm -1) qu'entre Pk(llm-1) et Pk(llm-2)
+
+    !$OMP DO SCHEDULE(STATIC)
+    DO   ij   = ijb, ije
+       pk(ij,llm) = pk(ij,llm-1)**2 / pk(ij,llm-2)
+    ENDDO
+    !$OMP ENDDO NOWAIT        
+
+    if (present(pkf)) then
+       !    calcul de pkf
+
+       DO l = 1, llm
+          !$OMP DO SCHEDULE(STATIC)
+          DO   ij   = ijb, ije
+             pkf(ij,l)=pk(ij,l)
+          ENDDO
+          !$OMP ENDDO NOWAIT
+       ENDDO
+
+       !$OMP BARRIER
+
+       jjb=jj_begin
+       jje=jj_end
+       CALL filtreg_p ( pkf,jjb_u,jje_u,jjb,jje, jmp1, llm, &
+            2, 1, .TRUE., 1 )
+    end if
+
+  END SUBROUTINE exner_milieu_loc
+
+end module exner_milieu_loc_m
Index: LMDZ6/trunk/libf/dyn3dmem/flumass_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/flumass_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,91 +1,0 @@
-SUBROUTINE flumass_loc(massebx,masseby, vcont, ucont, pbaru, pbarv )
-!
-!-------------------------------------------------------------------------------
-! Authors: P. Le Van , Fr. Hourdin.
-!-------------------------------------------------------------------------------
-! Purpose: Compute mass flux at s levels.
-  USE parallel_lmdz
-  IMPLICIT NONE
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-!===============================================================================
-! Arguments:
-  REAL, INTENT(IN)  :: massebx(ijb_u:ije_u,llm)
-  REAL, INTENT(IN)  :: masseby(ijb_v:ije_v,llm)
-  REAL, INTENT(IN)  :: vcont  (ijb_v:ije_v,llm)
-  REAL, INTENT(IN)  :: ucont  (ijb_u:ije_u,llm)
-  REAL, INTENT(OUT) :: pbaru  (ijb_u:ije_u,llm)
-  REAL, INTENT(OUT) :: pbarv  (ijb_v:ije_v,llm)
-!===============================================================================
-! Method used:   A 2 equations system is solved.
-!   * 1st one describes divergence computation at pole point nr. i (i=1 to im):
-!     (0.5*(pbaru(i)-pbaru(i-1))-pbarv(i))/aire(i) = - SUM(pbarv(n))/aire pole
-!   * 2nd one specifies that mean mass flux at pole is equal to 0:
-!     SUM(pbaru(n)*local_area(n))=0
-! This way, we determine additive constant common to pbary elements representing
-!   pbaru(0,j,l) in divergence computation equation for point i=1. (i=1 to im)
-!===============================================================================
-! Local variables:
-  REAL    :: sairen, saireun, ctn, ctn0, apbarun(iim)
-  REAL    :: saires, saireus, cts, cts0, apbarus(iim)
-  INTEGER :: l, i, ij, ijb, ije
-!===============================================================================
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)    
-  DO l=1,llm
-
-    ijb=ij_begin
-    ije=ij_end+iip1
-    IF(pole_nord) ijb=ij_begin+iip1
-    IF(pole_sud)  ije=ij_end-iip1
-    pbaru(ijb:ije,l)=massebx(ijb:ije,l)*ucont(ijb:ije,l)
-
-    ijb=ij_begin-iip1
-    ije=ij_end+iip1
-    IF(pole_nord) ijb=ij_begin
-    IF(pole_sud)  ije=ij_end-iip1
-    pbarv(ijb:ije,l)=masseby(ijb:ije,l)*vcont(ijb:ije,l)
-
-  END DO
-!$OMP END DO NOWAIT
-
-  !--- North pole
-  IF(pole_nord) THEN
-    sairen =SUM(aire (1:iim))
-    saireun=SUM(aireu(1:iim))
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)    
-    DO l=1,llm
-      ctn=SUM(pbarv(1:iim,l))/sairen
-      pbaru(1,l)= pbarv(1,l)-ctn*aire(1)
-      DO i=2,iim
-        pbaru(i,l)=pbaru(i-1,l)+pbarv(i,l)-ctn*aire(i)
-      END DO
-      apbarun(:)=aireu(1:iim)*pbaru(1:iim,l)
-      ctn0 = -SUM(apbarun)/saireun
-      pbaru(1:iim,l)=2.*(pbaru(1:iim,l)+ctn0)
-      pbaru(iip1,l)=pbaru(1,l)
-    END DO
-!$OMP END DO NOWAIT              
-  END IF
-
-  !--- South pole
-  IF(pole_sud) THEN
-    saires =SUM(aire (ip1jm+1:ip1jmp1-1))
-    saireus=SUM(aireu(ip1jm+1:ip1jmp1-1))
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)    
-    DO l=1,llm
-      cts=SUM(pbarv(1+ip1jmi1:ip1jm-1,l))/saires
-      pbaru(1+ip1jm,l)=-pbarv(1+ip1jmi1,l)+cts*aire(1+ip1jm)
-      DO i=2,iim
-        pbaru(i+ip1jm,l)=pbaru(i-1+ip1jm,l)-pbarv(i+ip1jmi1,l)+cts*aire(i+ip1jm)
-      END DO
-      apbarus(:)=aireu(1+ip1jm:ip1jmp1-1)*pbaru(1+ip1jm:ip1jmp1-1,l)
-      cts0 = -SUM(apbarus)/saireus
-      pbaru(1+ip1jm:ip1jmp1-1,l)=2.*(pbaru(1+ip1jm:ip1jmp1-1,l)+cts0)
-      pbaru(ip1jmp1,l)=pbaru(1+ip1jm,l)
-    END DO
-!$OMP END DO NOWAIT         
-  END IF
-
-END SUBROUTINE flumass_loc
-
Index: LMDZ6/trunk/libf/dyn3dmem/flumass_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/flumass_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/flumass_loc.f90	(revision 5268)
@@ -0,0 +1,91 @@
+SUBROUTINE flumass_loc(massebx,masseby, vcont, ucont, pbaru, pbarv )
+!
+!-------------------------------------------------------------------------------
+! Authors: P. Le Van , Fr. Hourdin.
+!-------------------------------------------------------------------------------
+! Purpose: Compute mass flux at s levels.
+  USE parallel_lmdz
+  IMPLICIT NONE
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+!===============================================================================
+! Arguments:
+  REAL, INTENT(IN)  :: massebx(ijb_u:ije_u,llm)
+  REAL, INTENT(IN)  :: masseby(ijb_v:ije_v,llm)
+  REAL, INTENT(IN)  :: vcont  (ijb_v:ije_v,llm)
+  REAL, INTENT(IN)  :: ucont  (ijb_u:ije_u,llm)
+  REAL, INTENT(OUT) :: pbaru  (ijb_u:ije_u,llm)
+  REAL, INTENT(OUT) :: pbarv  (ijb_v:ije_v,llm)
+!===============================================================================
+! Method used:   A 2 equations system is solved.
+!   * 1st one describes divergence computation at pole point nr. i (i=1 to im):
+!     (0.5*(pbaru(i)-pbaru(i-1))-pbarv(i))/aire(i) = - SUM(pbarv(n))/aire pole
+!   * 2nd one specifies that mean mass flux at pole is equal to 0:
+!     SUM(pbaru(n)*local_area(n))=0
+! This way, we determine additive constant common to pbary elements representing
+!   pbaru(0,j,l) in divergence computation equation for point i=1. (i=1 to im)
+!===============================================================================
+! Local variables:
+  REAL    :: sairen, saireun, ctn, ctn0, apbarun(iim)
+  REAL    :: saires, saireus, cts, cts0, apbarus(iim)
+  INTEGER :: l, i, ij, ijb, ije
+!===============================================================================
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)    
+  DO l=1,llm
+
+    ijb=ij_begin
+    ije=ij_end+iip1
+    IF(pole_nord) ijb=ij_begin+iip1
+    IF(pole_sud)  ije=ij_end-iip1
+    pbaru(ijb:ije,l)=massebx(ijb:ije,l)*ucont(ijb:ije,l)
+
+    ijb=ij_begin-iip1
+    ije=ij_end+iip1
+    IF(pole_nord) ijb=ij_begin
+    IF(pole_sud)  ije=ij_end-iip1
+    pbarv(ijb:ije,l)=masseby(ijb:ije,l)*vcont(ijb:ije,l)
+
+  END DO
+!$OMP END DO NOWAIT
+
+  !--- North pole
+  IF(pole_nord) THEN
+    sairen =SUM(aire (1:iim))
+    saireun=SUM(aireu(1:iim))
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)    
+    DO l=1,llm
+      ctn=SUM(pbarv(1:iim,l))/sairen
+      pbaru(1,l)= pbarv(1,l)-ctn*aire(1)
+      DO i=2,iim
+        pbaru(i,l)=pbaru(i-1,l)+pbarv(i,l)-ctn*aire(i)
+      END DO
+      apbarun(:)=aireu(1:iim)*pbaru(1:iim,l)
+      ctn0 = -SUM(apbarun)/saireun
+      pbaru(1:iim,l)=2.*(pbaru(1:iim,l)+ctn0)
+      pbaru(iip1,l)=pbaru(1,l)
+    END DO
+!$OMP END DO NOWAIT              
+  END IF
+
+  !--- South pole
+  IF(pole_sud) THEN
+    saires =SUM(aire (ip1jm+1:ip1jmp1-1))
+    saireus=SUM(aireu(ip1jm+1:ip1jmp1-1))
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)    
+    DO l=1,llm
+      cts=SUM(pbarv(1+ip1jmi1:ip1jm-1,l))/saires
+      pbaru(1+ip1jm,l)=-pbarv(1+ip1jmi1,l)+cts*aire(1+ip1jm)
+      DO i=2,iim
+        pbaru(i+ip1jm,l)=pbaru(i-1+ip1jm,l)-pbarv(i+ip1jmi1,l)+cts*aire(i+ip1jm)
+      END DO
+      apbarus(:)=aireu(1+ip1jm:ip1jmp1-1)*pbaru(1+ip1jm:ip1jmp1-1,l)
+      cts0 = -SUM(apbarus)/saireus
+      pbaru(1+ip1jm:ip1jmp1-1,l)=2.*(pbaru(1+ip1jm:ip1jmp1-1,l)+cts0)
+      pbaru(ip1jmp1,l)=pbaru(1+ip1jm,l)
+    END DO
+!$OMP END DO NOWAIT         
+  END IF
+
+END SUBROUTINE flumass_loc
+
Index: LMDZ6/trunk/libf/dyn3dmem/friction_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/friction_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,199 +1,0 @@
-!
-! $Id: friction_p.F 1299 2010-01-20 14:27:21Z fairhead $
-!
-!=======================================================================
-SUBROUTINE friction_loc(ucov,vcov,pdt)
-  USE parallel_lmdz
-  USE control_mod
-  USE IOIPSL
-
-  USE comconst_mod, ONLY: pi
-  IMPLICIT NONE
-
-  !=======================================================================
-  !
-  !   Friction for the Newtonian case:
-  !   --------------------------------
-  !    2 possibilities (depending on flag 'friction_type'
-  ! friction_type=0 : A friction that is only applied to the lowermost
-  !                   atmospheric layer
-  ! friction_type=1 : Friction applied on all atmospheric layer (but
-  !   (default)       with stronger magnitude near the surface; see
-  !                   iniacademic.F)
-  !=======================================================================
-
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom2.h"
-  include "iniprint.h"
-  include "academic.h"
-
-  ! arguments:
-  REAL,INTENT(inout) :: ucov( iip1,jjb_u:jje_u,llm )
-  REAL,INTENT(inout) :: vcov( iip1,jjb_v:jje_v,llm )
-  REAL,INTENT(in) :: pdt ! time step
-
-  ! local variables:
-
-  REAL :: modv(iip1,jjb_u:jje_u),zco,zsi
-  REAL :: vpn,vps,upoln,upols,vpols,vpoln
-  REAL :: u2(iip1,jjb_u:jje_u),v2(iip1,jjb_v:jje_v)
-  INTEGER :: i,j,l
-  REAL,PARAMETER :: cfric=1.e-5
-  LOGICAL,SAVE :: firstcall=.true.
-  INTEGER,SAVE :: friction_type=1
-  CHARACTER(len=20) :: modname="friction_p"
-  CHARACTER(len=80) :: abort_message
-!$OMP THREADPRIVATE(firstcall,friction_type)
-  integer :: jjb,jje
-
-!$OMP SINGLE
-  IF (firstcall) THEN
-    ! ! set friction type
-    call getin("friction_type",friction_type)
-    if ((friction_type.lt.0).or.(friction_type.gt.1)) then
-      abort_message="wrong friction type"
-      write(lunout,*)'Friction: wrong friction type',friction_type
-      call abort_gcm(modname,abort_message,42)
-    endif
-    firstcall=.false.
-  ENDIF
-!$OMP END SINGLE COPYPRIVATE(friction_type,firstcall)
-
-  if (friction_type.eq.0) then ! friction on first layer only
-!$OMP SINGLE
-  !   calcul des composantes au carre du vent naturel
-  jjb=jj_begin
-  jje=jj_end+1
-  if (pole_sud) jje=jj_end
-
-  do j=jjb,jje
-     do i=1,iip1
-        u2(i,j)=ucov(i,j,1)*ucov(i,j,1)*unscu2(i,j)
-     enddo
-  enddo
-
-  jjb=jj_begin-1
-  jje=jj_end+1
-  if (pole_nord) jjb=jj_begin
-  if (pole_sud) jje=jj_end-1
-
-  do j=jjb,jje
-     do i=1,iip1
-        v2(i,j)=vcov(i,j,1)*vcov(i,j,1)*unscv2(i,j)
-     enddo
-  enddo
-
-  !   calcul du module de V en dehors des poles
-  jjb=jj_begin
-  jje=jj_end+1
-  if (pole_nord) jjb=jj_begin+1
-  if (pole_sud) jje=jj_end-1
-
-  do j=jjb,jje
-     do i=2,iip1
-        modv(i,j)=sqrt(0.5*(u2(i-1,j)+u2(i,j)+v2(i,j-1)+v2(i,j)))
-     enddo
-     modv(1,j)=modv(iip1,j)
-  enddo
-
-  !   les deux composantes du vent au pole sont obtenues comme
-  !   premiers modes de fourier de v pres du pole
-  if (pole_nord) then
-
-    upoln=0.
-    vpoln=0.
-
-    do i=2,iip1
-       zco=cos(rlonv(i))*(rlonu(i)-rlonu(i-1))
-       zsi=sin(rlonv(i))*(rlonu(i)-rlonu(i-1))
-       vpn=vcov(i,1,1)/cv(i,1)
-       upoln=upoln+zco*vpn
-       vpoln=vpoln+zsi*vpn
-    enddo
-    vpn=sqrt(upoln*upoln+vpoln*vpoln)/pi
-    do i=1,iip1
-       ! modv(i,1)=vpn
-       modv(i,1)=modv(i,2)
-    enddo
-
-  endif
-
-  if (pole_sud) then
-
-    upols=0.
-    vpols=0.
-    do i=2,iip1
-       zco=cos(rlonv(i))*(rlonu(i)-rlonu(i-1))
-       zsi=sin(rlonv(i))*(rlonu(i)-rlonu(i-1))
-       vps=vcov(i,jjm,1)/cv(i,jjm)
-       upols=upols+zco*vps
-       vpols=vpols+zsi*vps
-    enddo
-    vps=sqrt(upols*upols+vpols*vpols)/pi
-    do i=1,iip1
-     ! modv(i,jjp1)=vps
-     modv(i,jjp1)=modv(i,jjm)
-    enddo
-
-  endif
-
-  !   calcul du frottement au sol.
-
-  jjb=jj_begin
-  jje=jj_end
-  if (pole_nord) jjb=jj_begin+1
-  if (pole_sud) jje=jj_end-1
-
-  do j=jjb,jje
-     do i=1,iim
-        ucov(i,j,1)=ucov(i,j,1) &
-              -cfric*pdt*0.5*(modv(i+1,j)+modv(i,j))*ucov(i,j,1)
-     enddo
-     ucov(iip1,j,1)=ucov(1,j,1)
-  enddo
-
-  jjb=jj_begin
-  jje=jj_end
-  if (pole_sud) jje=jj_end-1
-
-  do j=jjb,jje
-     do i=1,iip1
-        vcov(i,j,1)=vcov(i,j,1) &
-              -cfric*pdt*0.5*(modv(i,j+1)+modv(i,j))*vcov(i,j,1)
-     enddo
-     vcov(iip1,j,1)=vcov(1,j,1)
-  enddo
-!$OMP END SINGLE
-  endif ! of if (friction_type.eq.0)
-
-  if (friction_type.eq.1) then
-   ! ! for ucov()
-    jjb=jj_begin
-    jje=jj_end
-    if (pole_nord) jjb=jj_begin+1
-    if (pole_sud) jje=jj_end-1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    do l=1,llm
-      ucov(1:iip1,jjb:jje,l)=ucov(1:iip1,jjb:jje,l)* &
-            (1.-pdt*kfrict(l))
-    enddo
-!$OMP END DO NOWAIT
-
-   ! ! for vcoc()
-    jjb=jj_begin
-    jje=jj_end
-    if (pole_sud) jje=jj_end-1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    do l=1,llm
-      vcov(1:iip1,jjb:jje,l)=vcov(1:iip1,jjb:jje,l)* &
-            (1.-pdt*kfrict(l))
-    enddo
-!$OMP END DO
-  endif ! of if (friction_type.eq.1)
-
-  RETURN
-END SUBROUTINE friction_loc
-
Index: LMDZ6/trunk/libf/dyn3dmem/friction_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/friction_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/friction_loc.f90	(revision 5268)
@@ -0,0 +1,199 @@
+!
+! $Id: friction_p.F 1299 2010-01-20 14:27:21Z fairhead $
+!
+!=======================================================================
+SUBROUTINE friction_loc(ucov,vcov,pdt)
+  USE parallel_lmdz
+  USE control_mod
+  USE IOIPSL
+
+  USE comconst_mod, ONLY: pi
+  IMPLICIT NONE
+
+  !=======================================================================
+  !
+  !   Friction for the Newtonian case:
+  !   --------------------------------
+  !    2 possibilities (depending on flag 'friction_type'
+  ! friction_type=0 : A friction that is only applied to the lowermost
+  !                   atmospheric layer
+  ! friction_type=1 : Friction applied on all atmospheric layer (but
+  !   (default)       with stronger magnitude near the surface; see
+  !                   iniacademic.F)
+  !=======================================================================
+
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom2.h"
+  include "iniprint.h"
+  include "academic.h"
+
+  ! arguments:
+  REAL,INTENT(inout) :: ucov( iip1,jjb_u:jje_u,llm )
+  REAL,INTENT(inout) :: vcov( iip1,jjb_v:jje_v,llm )
+  REAL,INTENT(in) :: pdt ! time step
+
+  ! local variables:
+
+  REAL :: modv(iip1,jjb_u:jje_u),zco,zsi
+  REAL :: vpn,vps,upoln,upols,vpols,vpoln
+  REAL :: u2(iip1,jjb_u:jje_u),v2(iip1,jjb_v:jje_v)
+  INTEGER :: i,j,l
+  REAL,PARAMETER :: cfric=1.e-5
+  LOGICAL,SAVE :: firstcall=.true.
+  INTEGER,SAVE :: friction_type=1
+  CHARACTER(len=20) :: modname="friction_p"
+  CHARACTER(len=80) :: abort_message
+!$OMP THREADPRIVATE(firstcall,friction_type)
+  integer :: jjb,jje
+
+!$OMP SINGLE
+  IF (firstcall) THEN
+    ! ! set friction type
+    call getin("friction_type",friction_type)
+    if ((friction_type.lt.0).or.(friction_type.gt.1)) then
+      abort_message="wrong friction type"
+      write(lunout,*)'Friction: wrong friction type',friction_type
+      call abort_gcm(modname,abort_message,42)
+    endif
+    firstcall=.false.
+  ENDIF
+!$OMP END SINGLE COPYPRIVATE(friction_type,firstcall)
+
+  if (friction_type.eq.0) then ! friction on first layer only
+!$OMP SINGLE
+  !   calcul des composantes au carre du vent naturel
+  jjb=jj_begin
+  jje=jj_end+1
+  if (pole_sud) jje=jj_end
+
+  do j=jjb,jje
+     do i=1,iip1
+        u2(i,j)=ucov(i,j,1)*ucov(i,j,1)*unscu2(i,j)
+     enddo
+  enddo
+
+  jjb=jj_begin-1
+  jje=jj_end+1
+  if (pole_nord) jjb=jj_begin
+  if (pole_sud) jje=jj_end-1
+
+  do j=jjb,jje
+     do i=1,iip1
+        v2(i,j)=vcov(i,j,1)*vcov(i,j,1)*unscv2(i,j)
+     enddo
+  enddo
+
+  !   calcul du module de V en dehors des poles
+  jjb=jj_begin
+  jje=jj_end+1
+  if (pole_nord) jjb=jj_begin+1
+  if (pole_sud) jje=jj_end-1
+
+  do j=jjb,jje
+     do i=2,iip1
+        modv(i,j)=sqrt(0.5*(u2(i-1,j)+u2(i,j)+v2(i,j-1)+v2(i,j)))
+     enddo
+     modv(1,j)=modv(iip1,j)
+  enddo
+
+  !   les deux composantes du vent au pole sont obtenues comme
+  !   premiers modes de fourier de v pres du pole
+  if (pole_nord) then
+
+    upoln=0.
+    vpoln=0.
+
+    do i=2,iip1
+       zco=cos(rlonv(i))*(rlonu(i)-rlonu(i-1))
+       zsi=sin(rlonv(i))*(rlonu(i)-rlonu(i-1))
+       vpn=vcov(i,1,1)/cv(i,1)
+       upoln=upoln+zco*vpn
+       vpoln=vpoln+zsi*vpn
+    enddo
+    vpn=sqrt(upoln*upoln+vpoln*vpoln)/pi
+    do i=1,iip1
+       ! modv(i,1)=vpn
+       modv(i,1)=modv(i,2)
+    enddo
+
+  endif
+
+  if (pole_sud) then
+
+    upols=0.
+    vpols=0.
+    do i=2,iip1
+       zco=cos(rlonv(i))*(rlonu(i)-rlonu(i-1))
+       zsi=sin(rlonv(i))*(rlonu(i)-rlonu(i-1))
+       vps=vcov(i,jjm,1)/cv(i,jjm)
+       upols=upols+zco*vps
+       vpols=vpols+zsi*vps
+    enddo
+    vps=sqrt(upols*upols+vpols*vpols)/pi
+    do i=1,iip1
+     ! modv(i,jjp1)=vps
+     modv(i,jjp1)=modv(i,jjm)
+    enddo
+
+  endif
+
+  !   calcul du frottement au sol.
+
+  jjb=jj_begin
+  jje=jj_end
+  if (pole_nord) jjb=jj_begin+1
+  if (pole_sud) jje=jj_end-1
+
+  do j=jjb,jje
+     do i=1,iim
+        ucov(i,j,1)=ucov(i,j,1) &
+              -cfric*pdt*0.5*(modv(i+1,j)+modv(i,j))*ucov(i,j,1)
+     enddo
+     ucov(iip1,j,1)=ucov(1,j,1)
+  enddo
+
+  jjb=jj_begin
+  jje=jj_end
+  if (pole_sud) jje=jj_end-1
+
+  do j=jjb,jje
+     do i=1,iip1
+        vcov(i,j,1)=vcov(i,j,1) &
+              -cfric*pdt*0.5*(modv(i,j+1)+modv(i,j))*vcov(i,j,1)
+     enddo
+     vcov(iip1,j,1)=vcov(1,j,1)
+  enddo
+!$OMP END SINGLE
+  endif ! of if (friction_type.eq.0)
+
+  if (friction_type.eq.1) then
+   ! ! for ucov()
+    jjb=jj_begin
+    jje=jj_end
+    if (pole_nord) jjb=jj_begin+1
+    if (pole_sud) jje=jj_end-1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    do l=1,llm
+      ucov(1:iip1,jjb:jje,l)=ucov(1:iip1,jjb:jje,l)* &
+            (1.-pdt*kfrict(l))
+    enddo
+!$OMP END DO NOWAIT
+
+   ! ! for vcoc()
+    jjb=jj_begin
+    jje=jj_end
+    if (pole_sud) jje=jj_end-1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    do l=1,llm
+      vcov(1:iip1,jjb:jje,l)=vcov(1:iip1,jjb:jje,l)* &
+            (1.-pdt*kfrict(l))
+    enddo
+!$OMP END DO
+  endif ! of if (friction_type.eq.1)
+
+  RETURN
+END SUBROUTINE friction_loc
+
Index: LMDZ6/trunk/libf/dyn3dmem/getparam.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/getparam.F90	(revision 5267)
+++ 	(revision )
@@ -1,115 +1,0 @@
-!
-! $Id: getparam.F90 1279 2009-12-10 09:02:56Z fairhead $
-!
-MODULE getparam
-   USE IOIPSL
-
-
-   INTERFACE getpar
-     MODULE PROCEDURE getparamr,getparami,getparaml
-   END INTERFACE
-   private getparamr,getparami,getparaml
-
-   INTEGER, PARAMETER :: out_eff=99
-
-CONTAINS
-  SUBROUTINE ini_getparam(fichier)
-  USE parallel_lmdz
-    !
-    IMPLICIT NONE
-    !
-    CHARACTER*(*) :: fichier
-    IF (mpi_rank==0) OPEN(out_eff,file=fichier,status='unknown',form='formatted')
-    
-  END SUBROUTINE ini_getparam
-
-  SUBROUTINE fin_getparam
-  USE parallel_lmdz
-    !
-    IMPLICIT NONE
-    !
-      IF (mpi_rank==0) CLOSE(out_eff)
-
-  END SUBROUTINE fin_getparam
-
-  SUBROUTINE getparamr(TARGET,def_val,ret_val,comment)
-  USE parallel_lmdz
-    !
-    IMPLICIT NONE
-    !
-    !   Get a real scalar. We first check if we find it
-    !   in the database and if not we get it from the run.def
-    !
-    !   getinr1d and getinr2d are written on the same pattern
-    !
-    CHARACTER*(*) :: TARGET
-    REAL :: def_val
-    REAL :: ret_val
-    CHARACTER*(*) :: comment
-
-    ret_val=def_val
-    call getin(TARGET,ret_val)
-
-    IF (mpi_rank==0) THEN
-      write(out_eff,*) '######################################'
-      write(out_eff,*) '#### ',comment,' #####'
-      write(out_eff,*) TARGET,'=',ret_val
-    ENDIF
-    
-  END SUBROUTINE getparamr
-
-  SUBROUTINE getparami(TARGET,def_val,ret_val,comment)
-  USE parallel_lmdz
-    !
-    IMPLICIT NONE
-    !
-    !   Get a real scalar. We first check if we find it
-    !   in the database and if not we get it from the run.def
-    !
-    !   getinr1d and getinr2d are written on the same pattern
-    !
-    CHARACTER*(*) :: TARGET
-    INTEGER :: def_val
-    INTEGER :: ret_val
-    CHARACTER*(*) :: comment
-
-    ret_val=def_val
-    call getin(TARGET,ret_val)
-
-    IF (mpi_rank==0) THEN
-      write(out_eff,*) '######################################'
-      write(out_eff,*) '#### ',comment,' #####'
-      write(out_eff,*) comment
-      write(out_eff,*) TARGET,'=',ret_val
-    ENDIF
-    
-  END SUBROUTINE getparami
-
-  SUBROUTINE getparaml(TARGET,def_val,ret_val,comment)
-  USE parallel_lmdz
-    !
-    IMPLICIT NONE
-    !
-    !   Get a real scalar. We first check if we find it
-    !   in the database and if not we get it from the run.def
-    !
-    !   getinr1d and getinr2d are written on the same pattern
-    !
-    CHARACTER*(*) :: TARGET
-    LOGICAL :: def_val
-    LOGICAL :: ret_val
-    CHARACTER*(*) :: comment
-
-    ret_val=def_val
-    call getin(TARGET,ret_val)
-
-    IF (mpi_rank==0) THEN
-      write(out_eff,*) '######################################'
-      write(out_eff,*) '#### ',comment,' #####'
-      write(out_eff,*) TARGET,'=',ret_val
-    ENDIF
-       
-  END SUBROUTINE getparaml
-
-
-END MODULE getparam
Index: LMDZ6/trunk/libf/dyn3dmem/getparam.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/getparam.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/getparam.f90	(revision 5268)
@@ -0,0 +1,115 @@
+!
+! $Id: getparam.F90 1279 2009-12-10 09:02:56Z fairhead $
+!
+MODULE getparam
+   USE IOIPSL
+
+
+   INTERFACE getpar
+     MODULE PROCEDURE getparamr,getparami,getparaml
+   END INTERFACE
+   private getparamr,getparami,getparaml
+
+   INTEGER, PARAMETER :: out_eff=99
+
+CONTAINS
+  SUBROUTINE ini_getparam(fichier)
+  USE parallel_lmdz
+    !
+    IMPLICIT NONE
+    !
+    CHARACTER*(*) :: fichier
+    IF (mpi_rank==0) OPEN(out_eff,file=fichier,status='unknown',form='formatted')
+    
+  END SUBROUTINE ini_getparam
+
+  SUBROUTINE fin_getparam
+  USE parallel_lmdz
+    !
+    IMPLICIT NONE
+    !
+      IF (mpi_rank==0) CLOSE(out_eff)
+
+  END SUBROUTINE fin_getparam
+
+  SUBROUTINE getparamr(TARGET,def_val,ret_val,comment)
+  USE parallel_lmdz
+    !
+    IMPLICIT NONE
+    !
+    !   Get a real scalar. We first check if we find it
+    !   in the database and if not we get it from the run.def
+    !
+    !   getinr1d and getinr2d are written on the same pattern
+    !
+    CHARACTER*(*) :: TARGET
+    REAL :: def_val
+    REAL :: ret_val
+    CHARACTER*(*) :: comment
+
+    ret_val=def_val
+    call getin(TARGET,ret_val)
+
+    IF (mpi_rank==0) THEN
+      write(out_eff,*) '######################################'
+      write(out_eff,*) '#### ',comment,' #####'
+      write(out_eff,*) TARGET,'=',ret_val
+    ENDIF
+    
+  END SUBROUTINE getparamr
+
+  SUBROUTINE getparami(TARGET,def_val,ret_val,comment)
+  USE parallel_lmdz
+    !
+    IMPLICIT NONE
+    !
+    !   Get a real scalar. We first check if we find it
+    !   in the database and if not we get it from the run.def
+    !
+    !   getinr1d and getinr2d are written on the same pattern
+    !
+    CHARACTER*(*) :: TARGET
+    INTEGER :: def_val
+    INTEGER :: ret_val
+    CHARACTER*(*) :: comment
+
+    ret_val=def_val
+    call getin(TARGET,ret_val)
+
+    IF (mpi_rank==0) THEN
+      write(out_eff,*) '######################################'
+      write(out_eff,*) '#### ',comment,' #####'
+      write(out_eff,*) comment
+      write(out_eff,*) TARGET,'=',ret_val
+    ENDIF
+    
+  END SUBROUTINE getparami
+
+  SUBROUTINE getparaml(TARGET,def_val,ret_val,comment)
+  USE parallel_lmdz
+    !
+    IMPLICIT NONE
+    !
+    !   Get a real scalar. We first check if we find it
+    !   in the database and if not we get it from the run.def
+    !
+    !   getinr1d and getinr2d are written on the same pattern
+    !
+    CHARACTER*(*) :: TARGET
+    LOGICAL :: def_val
+    LOGICAL :: ret_val
+    CHARACTER*(*) :: comment
+
+    ret_val=def_val
+    call getin(TARGET,ret_val)
+
+    IF (mpi_rank==0) THEN
+      write(out_eff,*) '######################################'
+      write(out_eff,*) '#### ',comment,' #####'
+      write(out_eff,*) TARGET,'=',ret_val
+    ENDIF
+       
+  END SUBROUTINE getparaml
+
+
+END MODULE getparam
Index: LMDZ6/trunk/libf/dyn3dmem/gradiv2_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/gradiv2_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,39 +1,0 @@
-MODULE gradiv2_mod
-
-  REAL,POINTER,SAVE ::  gdx( :,: )
-  REAL,POINTER,SAVE ::  gdy( :,: )
-  REAL,POINTER,SAVE ::  div( :,: )
-  
-CONTAINS
-
-  SUBROUTINE gradiv2_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE dimensions_mod
-  IMPLICIT NONE
-    TYPE(distrib),POINTER :: d
-    d=>distrib_dissip
-
-    CALL allocate_u(gdx,llm,d)
-    CALL allocate_v(gdy,llm,d)
-    CALL allocate_u(div,llm,d)
-
-    
-  END SUBROUTINE gradiv2_allocate
-  
-  SUBROUTINE gradiv2_switch_dissip(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-
-    CALL switch_u(gdx,distrib_dissip,dist)
-    CALL switch_v(gdy,distrib_dissip,dist)
-    CALL switch_u(div,distrib_dissip,dist)
-
-
-  END SUBROUTINE gradiv2_switch_dissip
-  
-END MODULE gradiv2_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/gradiv2_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/gradiv2_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/gradiv2_mod.f90	(revision 5268)
@@ -0,0 +1,39 @@
+MODULE gradiv2_mod
+
+  REAL,POINTER,SAVE ::  gdx( :,: )
+  REAL,POINTER,SAVE ::  gdy( :,: )
+  REAL,POINTER,SAVE ::  div( :,: )
+  
+CONTAINS
+
+  SUBROUTINE gradiv2_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE dimensions_mod
+  IMPLICIT NONE
+    TYPE(distrib),POINTER :: d
+    d=>distrib_dissip
+
+    CALL allocate_u(gdx,llm,d)
+    CALL allocate_v(gdy,llm,d)
+    CALL allocate_u(div,llm,d)
+
+    
+  END SUBROUTINE gradiv2_allocate
+  
+  SUBROUTINE gradiv2_switch_dissip(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+
+    CALL switch_u(gdx,distrib_dissip,dist)
+    CALL switch_v(gdy,distrib_dissip,dist)
+    CALL switch_u(div,distrib_dissip,dist)
+
+
+  END SUBROUTINE gradiv2_switch_dissip
+  
+END MODULE gradiv2_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/groupe_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/groupe_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,129 +1,0 @@
-subroutine groupe_loc(pext,pbaru,pbarv,pbarum,pbarvm,wm)
-  USE parallel_lmdz
-  USE Write_field_loc
-  USE groupe_mod
-  USE comconst_mod, ONLY: ngroup
-  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
-  implicit none
-
-  !   sous-programme servant a fitlrer les champs de flux de masse aux
-  !   poles en "regroupant" les mailles 2 par 2 puis 4 par 4 etc. au fur
-  !   et a mesure qu'on se rapproche du pole.
-  !
-  !   en entree: pext, pbaru et pbarv
-  !
-  !   en sortie:  pbarum,pbarvm et wm.
-  !
-  !   remarque, le wm est recalcule a partir des pbaru pbarv et on n'a donc
-  !   pas besoin de w en entree.
-
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom2.h"
-
-  ! integer ngroup
-  ! parameter (ngroup=3)
-
-
-  real :: pbaru(iip1,jjb_u:jje_u,llm),pbarv(iip1,jjb_v:jje_v,llm)
-  real :: pext(iip1,jjb_u:jje_u,llm)
-
-  real :: pbarum(iip1,jjb_u:jje_u,llm),pbarvm(iip1,jjb_v:jje_v,llm)
-  real :: wm(iip1,jjb_u:jje_u,llm)
-
-
-  real :: uu
-
-  integer :: i,j,l
-
-  logical :: firstcall
-  save firstcall
-!$OMP THREADPRIVATE(firstcall)
-
-  integer :: ijb,ije,jjb,jje
-
-  !   Champs 1D
-
-  call convflu_loc(pbaru,pbarv,llm,zconvm)
-
-  !
-  !  call scopy(ijp1llm,zconvm,1,zconvmm,1)
-  !  call scopy(ijmllm,pbarv,1,pbarvm,1)
-
-  jjb=jj_begin
-  jje=jj_end
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  do l=1,llm
-    zconvmm(:,jjb:jje,l)=zconvm(:,jjb:jje,l)
-  enddo
-!$OMP END DO NOWAIT
-
-  call groupeun_loc(jjp1,llm,jjb_u,jje_u,jjb,jje,zconvmm)
-
-  jjb=jj_begin-1
-  jje=jj_end
-  if (pole_nord) jjb=jj_begin
-  if (pole_sud)  jje=jj_end-1
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  do l=1,llm
-    pbarvm(:,jjb:jje,l)=pbarv(:,jjb:jje,l)
-  enddo
-!$OMP END DO NOWAIT
-
-IF (CPPKEY_DEBUGIO) THEN
-  CALL WriteField_v('pbarvm',reshape(pbarvm,(/ip1jm,llm/)))
-END IF
-  call groupeun_loc(jjm,llm,jjb_v,jje_v,jjb,jje,pbarvm)
-IF (CPPKEY_DEBUGIO) THEN
-  CALL WriteField_v('pbarvm',reshape(pbarvm,(/ip1jm,llm/)))
-END IF
-  !   Champs 3D
-
-  jjb=jj_begin
-  jje=jj_end
-  if (pole_nord) jjb=jj_begin+1
-  if (pole_sud)  jje=jj_end-1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  do l=1,llm
-     do j=jjb,jje
-        uu=pbaru(iim,j,l)
-        do i=1,iim
-           uu=uu+pbarvm(i,j,l)-pbarvm(i,j-1,l)-zconvmm(i,j,l)
-           pbarum(i,j,l)=uu
-  ! zconvm(i,j,l ) =  xflu(i-1,j,l)-xflu(i,j,l)+
-  !    *                      yflu(i,j,l)-yflu(i,j-1,l)
-        enddo
-        pbarum(iip1,j,l)=pbarum(1,j,l)
-     enddo
-  enddo
-!$OMP END DO NOWAIT
-  !    integration de la convergence de masse de haut  en bas ......
-
-  jjb=jj_begin
-  jje=jj_end
-
-!$OMP BARRIER
-!$OMP MASTER
-  do  l = llm-1,1,-1
-      do j=jjb,jje
-         do i=1,iip1
-            zconvmm(i,j,l)=zconvmm(i,j,l)+zconvmm(i,j,l+1)
-         enddo
-      enddo
-  enddo
-
-  if (.not. pole_sud) then
-    zconvmm(:,jj_end+1,:)=0
-  !ym	wm(:,jj_end+1,:)=0
-  endif
-
-!$OMP END MASTER
-!$OMP BARRIER
-
-  CALL vitvert_loc(zconvmm,wm)
-
-  return
-end subroutine groupe_loc
-
Index: LMDZ6/trunk/libf/dyn3dmem/groupe_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/groupe_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/groupe_loc.f90	(revision 5268)
@@ -0,0 +1,129 @@
+subroutine groupe_loc(pext,pbaru,pbarv,pbarum,pbarvm,wm)
+  USE parallel_lmdz
+  USE Write_field_loc
+  USE groupe_mod
+  USE comconst_mod, ONLY: ngroup
+  USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_DEBUGIO
+  implicit none
+
+  !   sous-programme servant a fitlrer les champs de flux de masse aux
+  !   poles en "regroupant" les mailles 2 par 2 puis 4 par 4 etc. au fur
+  !   et a mesure qu'on se rapproche du pole.
+  !
+  !   en entree: pext, pbaru et pbarv
+  !
+  !   en sortie:  pbarum,pbarvm et wm.
+  !
+  !   remarque, le wm est recalcule a partir des pbaru pbarv et on n'a donc
+  !   pas besoin de w en entree.
+
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom2.h"
+
+  ! integer ngroup
+  ! parameter (ngroup=3)
+
+
+  real :: pbaru(iip1,jjb_u:jje_u,llm),pbarv(iip1,jjb_v:jje_v,llm)
+  real :: pext(iip1,jjb_u:jje_u,llm)
+
+  real :: pbarum(iip1,jjb_u:jje_u,llm),pbarvm(iip1,jjb_v:jje_v,llm)
+  real :: wm(iip1,jjb_u:jje_u,llm)
+
+
+  real :: uu
+
+  integer :: i,j,l
+
+  logical :: firstcall
+  save firstcall
+!$OMP THREADPRIVATE(firstcall)
+
+  integer :: ijb,ije,jjb,jje
+
+  !   Champs 1D
+
+  call convflu_loc(pbaru,pbarv,llm,zconvm)
+
+  !
+  !  call scopy(ijp1llm,zconvm,1,zconvmm,1)
+  !  call scopy(ijmllm,pbarv,1,pbarvm,1)
+
+  jjb=jj_begin
+  jje=jj_end
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  do l=1,llm
+    zconvmm(:,jjb:jje,l)=zconvm(:,jjb:jje,l)
+  enddo
+!$OMP END DO NOWAIT
+
+  call groupeun_loc(jjp1,llm,jjb_u,jje_u,jjb,jje,zconvmm)
+
+  jjb=jj_begin-1
+  jje=jj_end
+  if (pole_nord) jjb=jj_begin
+  if (pole_sud)  jje=jj_end-1
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  do l=1,llm
+    pbarvm(:,jjb:jje,l)=pbarv(:,jjb:jje,l)
+  enddo
+!$OMP END DO NOWAIT
+
+IF (CPPKEY_DEBUGIO) THEN
+  CALL WriteField_v('pbarvm',reshape(pbarvm,(/ip1jm,llm/)))
+END IF
+  call groupeun_loc(jjm,llm,jjb_v,jje_v,jjb,jje,pbarvm)
+IF (CPPKEY_DEBUGIO) THEN
+  CALL WriteField_v('pbarvm',reshape(pbarvm,(/ip1jm,llm/)))
+END IF
+  !   Champs 3D
+
+  jjb=jj_begin
+  jje=jj_end
+  if (pole_nord) jjb=jj_begin+1
+  if (pole_sud)  jje=jj_end-1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  do l=1,llm
+     do j=jjb,jje
+        uu=pbaru(iim,j,l)
+        do i=1,iim
+           uu=uu+pbarvm(i,j,l)-pbarvm(i,j-1,l)-zconvmm(i,j,l)
+           pbarum(i,j,l)=uu
+  ! zconvm(i,j,l ) =  xflu(i-1,j,l)-xflu(i,j,l)+
+  !    *                      yflu(i,j,l)-yflu(i,j-1,l)
+        enddo
+        pbarum(iip1,j,l)=pbarum(1,j,l)
+     enddo
+  enddo
+!$OMP END DO NOWAIT
+  !    integration de la convergence de masse de haut  en bas ......
+
+  jjb=jj_begin
+  jje=jj_end
+
+!$OMP BARRIER
+!$OMP MASTER
+  do  l = llm-1,1,-1
+      do j=jjb,jje
+         do i=1,iip1
+            zconvmm(i,j,l)=zconvmm(i,j,l)+zconvmm(i,j,l+1)
+         enddo
+      enddo
+  enddo
+
+  if (.not. pole_sud) then
+    zconvmm(:,jj_end+1,:)=0
+  !ym	wm(:,jj_end+1,:)=0
+  endif
+
+!$OMP END MASTER
+!$OMP BARRIER
+
+  CALL vitvert_loc(zconvmm,wm)
+
+  return
+end subroutine groupe_loc
+
Index: LMDZ6/trunk/libf/dyn3dmem/groupe_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/groupe_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,40 +1,0 @@
-MODULE groupe_mod
-
-  REAL,POINTER,SAVE :: zconvm(:,:,:)
-  REAL,POINTER,SAVE :: zconvmm(:,:,:)
-  
-CONTAINS
-
-  SUBROUTINE groupe_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-!  USE infotrac
-  USE advtrac_mod, ONLY : advtrac_allocate 
-  IMPLICIT NONE
-  INCLUDE "dimensions.h"
-  INCLUDE "paramet.h"
-  TYPE(distrib),POINTER :: d
-
-    d=>distrib_caldyn
-    CALL allocate2d_u(zconvm,llm,d)
-    CALL allocate2d_u(zconvmm,llm,d)
-
-
-  END SUBROUTINE groupe_allocate
-  
-  SUBROUTINE groupe_switch_caldyn(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-
-    CALL switch2d_u(zconvm,distrib_caldyn,dist)
-    CALL switch2d_u(zconvmm,distrib_caldyn,dist)
-
-  END SUBROUTINE groupe_switch_caldyn
-  
-
-  
-END MODULE groupe_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/groupe_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/groupe_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/groupe_mod.f90	(revision 5268)
@@ -0,0 +1,40 @@
+MODULE groupe_mod
+
+  REAL,POINTER,SAVE :: zconvm(:,:,:)
+  REAL,POINTER,SAVE :: zconvmm(:,:,:)
+  
+CONTAINS
+
+  SUBROUTINE groupe_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+!  USE infotrac
+  USE advtrac_mod, ONLY : advtrac_allocate 
+  IMPLICIT NONE
+  INCLUDE "dimensions.h"
+  INCLUDE "paramet.h"
+  TYPE(distrib),POINTER :: d
+
+    d=>distrib_caldyn
+    CALL allocate2d_u(zconvm,llm,d)
+    CALL allocate2d_u(zconvmm,llm,d)
+
+
+  END SUBROUTINE groupe_allocate
+  
+  SUBROUTINE groupe_switch_caldyn(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+
+    CALL switch2d_u(zconvm,distrib_caldyn,dist)
+    CALL switch2d_u(zconvmm,distrib_caldyn,dist)
+
+  END SUBROUTINE groupe_switch_caldyn
+  
+
+  
+END MODULE groupe_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/guide_loc_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/guide_loc_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,2440 +1,0 @@
-!
-! $Id$
-!
-MODULE guide_loc_mod
-
-!=======================================================================
-!   Auteur:  F.Hourdin
-!            F. Codron 01/09
-!=======================================================================
-
-  USE getparam, only: ini_getparam, fin_getparam, getpar
-  USE Write_Field_loc
-  use netcdf, only: nf90_nowrite, nf90_open, nf90_inq_varid, nf90_close, &
-                    nf90_inq_dimid, nf90_inquire_dimension
-  USE parallel_lmdz
-  USE pres2lev_mod, only: pres2lev
-
-  IMPLICIT NONE
-
-! ---------------------------------------------
-! Declarations des cles logiques et parametres
-! ---------------------------------------------
-  INTEGER, PRIVATE, SAVE  :: iguide_read,iguide_int,iguide_sav
-  INTEGER, PRIVATE, SAVE  :: nlevnc, guide_plevs
-  LOGICAL, PRIVATE, SAVE  :: guide_u,guide_v,guide_T,guide_Q,guide_P
-  LOGICAL, PRIVATE, SAVE  :: guide_hr,guide_teta
-  LOGICAL, PRIVATE, SAVE  :: guide_BL,guide_reg,guide_add,gamma4,guide_zon
-  LOGICAL, PRIVATE, SAVE  :: invert_p,invert_y,ini_anal
-  LOGICAL, PRIVATE, SAVE  :: guide_2D,guide_sav,guide_modele
-!FC
-  LOGICAL, PRIVATE, SAVE  :: convert_Pa
-
-  REAL, PRIVATE, SAVE     :: tau_min_u,tau_max_u
-  REAL, PRIVATE, SAVE     :: tau_min_v,tau_max_v
-  REAL, PRIVATE, SAVE     :: tau_min_T,tau_max_T
-  REAL, PRIVATE, SAVE     :: tau_min_Q,tau_max_Q
-  REAL, PRIVATE, SAVE     :: tau_min_P,tau_max_P
-
-  REAL, PRIVATE, SAVE     :: lat_min_g,lat_max_g
-  REAL, PRIVATE, SAVE     :: lon_min_g,lon_max_g
-  REAL, PRIVATE, SAVE     :: tau_lon,tau_lat
-
-  REAL, PRIVATE, SAVE     :: plim_guide_BL
-
-  REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE     :: alpha_u,alpha_v
-  REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE     :: alpha_T,alpha_Q
-  REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE     :: alpha_P,alpha_pcor
-
-! ---------------------------------------------
-! Variables de guidage
-! ---------------------------------------------
-! Variables des fichiers de guidage
-  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: unat1,unat2
-  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: vnat1,vnat2
-  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: tnat1,tnat2
-  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: qnat1,qnat2
-  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: pnat1,pnat2
-  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: psnat1,psnat2
-  REAL, ALLOCATABLE, DIMENSION(:),     PRIVATE, SAVE   :: apnc,bpnc
-! Variables aux dimensions du modele
-  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: ugui1,ugui2
-  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: vgui1,vgui2
-  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: tgui1,tgui2
-  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: qgui1,qgui2
-  REAL, ALLOCATABLE, DIMENSION(:),   PRIVATE, SAVE   :: psgui1,psgui2
-
-  INTEGER,SAVE,PRIVATE :: ijbu,ijbv,ijeu,ijev !,ijnu,ijnv
-  INTEGER,SAVE,PRIVATE :: jjbu,jjbv,jjeu,jjev,jjnu,jjnv
-
-
-CONTAINS
-!=======================================================================
-
-  SUBROUTINE guide_init
-
-    USE control_mod, ONLY: day_step
-    USE serre_mod, ONLY: grossismx
-
-    IMPLICIT NONE
-
-    INCLUDE "dimensions.h"
-    INCLUDE "paramet.h"
-    INCLUDE "netcdf.inc"
-
-    INTEGER                :: error,ncidpl,rid,rcod
-    CHARACTER (len = 80)   :: abort_message
-    CHARACTER (len = 20)   :: modname = 'guide_init'
-    CHARACTER (len = 20)   :: namedim
-
-! ---------------------------------------------
-! Lecture des parametres:
-! ---------------------------------------------
-    call ini_getparam("nudging_parameters_out.txt")
-! Variables guidees
-    CALL getpar('guide_u',.true.,guide_u,'guidage de u')
-    CALL getpar('guide_v',.true.,guide_v,'guidage de v')
-    CALL getpar('guide_T',.true.,guide_T,'guidage de T')
-    CALL getpar('guide_P',.true.,guide_P,'guidage de P')
-    CALL getpar('guide_Q',.true.,guide_Q,'guidage de Q')
-    CALL getpar('guide_hr',.true.,guide_hr,'guidage de Q par H.R')
-    CALL getpar('guide_teta',.false.,guide_teta,'guidage de T par Teta')
-
-    CALL getpar('guide_add',.false.,guide_add,'for�age constant?')
-    CALL getpar('guide_zon',.false.,guide_zon,'guidage moy zonale')
-    if (guide_zon .and. abs(grossismx - 1.) > 0.01) &
-         call abort_gcm("guide_init", &
-         "zonal nudging requires grid regular in longitude", 1)
-
-!   Constantes de rappel. Unite : fraction de jour
-    CALL getpar('tau_min_u',0.02,tau_min_u,'Cste de rappel min, u')
-    CALL getpar('tau_max_u', 10.,tau_max_u,'Cste de rappel max, u')
-    CALL getpar('tau_min_v',0.02,tau_min_v,'Cste de rappel min, v')
-    CALL getpar('tau_max_v', 10.,tau_max_v,'Cste de rappel max, v')
-    CALL getpar('tau_min_T',0.02,tau_min_T,'Cste de rappel min, T')
-    CALL getpar('tau_max_T', 10.,tau_max_T,'Cste de rappel max, T')
-    CALL getpar('tau_min_Q',0.02,tau_min_Q,'Cste de rappel min, Q')
-    CALL getpar('tau_max_Q', 10.,tau_max_Q,'Cste de rappel max, Q')
-    CALL getpar('tau_min_P',0.02,tau_min_P,'Cste de rappel min, P')
-    CALL getpar('tau_max_P', 10.,tau_max_P,'Cste de rappel max, P')
-    CALL getpar('gamma4',.false.,gamma4,'Zone sans rappel elargie')
-    CALL getpar('guide_BL',.true.,guide_BL,'guidage dans C.Lim')
-    CALL getpar('plim_guide_BL',85000.,plim_guide_BL,'BL top presnivs value')
-
-! Sauvegarde du for�age
-    CALL getpar('guide_sav',.false.,guide_sav,'sauvegarde guidage')
-    CALL getpar('iguide_sav',4,iguide_sav,'freq. sauvegarde guidage')
-    ! frequences f>0: fx/jour; f<0: tous les f jours; f=0: 1 seule fois.
-    IF (iguide_sav.GT.0) THEN
-       iguide_sav=day_step/iguide_sav
-    ELSE if (iguide_sav == 0) then
-       iguide_sav = huge(0)
-    ELSE
-       iguide_sav=day_step*iguide_sav
-    ENDIF
-
-! Guidage regional seulement (sinon constant ou suivant le zoom)
-    CALL getpar('guide_reg',.false.,guide_reg,'guidage regional')
-    CALL getpar('lat_min_g',-90.,lat_min_g,'Latitude mini guidage ')
-    CALL getpar('lat_max_g', 90.,lat_max_g,'Latitude maxi guidage ')
-    CALL getpar('lon_min_g',-180.,lon_min_g,'longitude mini guidage ')
-    CALL getpar('lon_max_g', 180.,lon_max_g,'longitude maxi guidage ')
-    CALL getpar('tau_lat', 5.,tau_lat,'raideur lat guide regional ')
-    CALL getpar('tau_lon', 5.,tau_lon,'raideur lon guide regional ')
-
-! Parametres pour lecture des fichiers
-    CALL getpar('iguide_read',4,iguide_read,'freq. lecture guidage')
-    CALL getpar('iguide_int',4,iguide_int,'freq. interpolation vert')
-    IF (iguide_int.EQ.0) THEN
-        iguide_int=1
-    ELSEIF (iguide_int.GT.0) THEN
-        iguide_int=day_step/iguide_int
-    ELSE
-        iguide_int=day_step*iguide_int
-    ENDIF
-    CALL getpar('guide_plevs',0,guide_plevs,'niveaux pression fichiers guidage')
-    ! Pour compatibilite avec ancienne version avec guide_modele
-    CALL getpar('guide_modele',.false.,guide_modele,'niveaux pression ap+bp*psol')
-    IF (guide_modele) THEN
-        guide_plevs=1
-    ENDIF
-!FC
-    CALL getpar('convert_Pa',.true.,convert_Pa,'Convert Pressure levels in Pa')
-    ! Fin raccord
-    CALL getpar('ini_anal',.false.,ini_anal,'Etat initial = analyse')
-    CALL getpar('guide_invertp',.true.,invert_p,'niveaux p inverses')
-    CALL getpar('guide_inverty',.true.,invert_y,'inversion N-S')
-    CALL getpar('guide_2D',.false.,guide_2D,'fichier guidage lat-P')
-
-    call fin_getparam
-
-! ---------------------------------------------
-! Determination du nombre de niveaux verticaux
-! des fichiers guidage
-! ---------------------------------------------
-    ncidpl=-99
-    if (guide_plevs.EQ.1) then
-       if (ncidpl.eq.-99) then
-          rcod=nf90_open('apbp.nc',Nf90_NOWRITe, ncidpl)
-          if (rcod.NE.NF_NOERR) THEN
-             abort_message=' Nudging error -> no file apbp.nc'
-             CALL abort_gcm(modname,abort_message,1)
-          endif
-       endif
-    elseif (guide_plevs.EQ.2) then
-       if (ncidpl.EQ.-99) then
-          rcod=nf90_open('P.nc',Nf90_NOWRITe,ncidpl)
-          if (rcod.NE.NF_NOERR) THEN
-             abort_message=' Nudging error -> no file P.nc'
-             CALL abort_gcm(modname,abort_message,1)
-          endif
-       endif
-
-    elseif (guide_u) then
-       if (ncidpl.eq.-99) then
-          rcod=nf90_open('u.nc',Nf90_NOWRITe,ncidpl)
-          if (rcod.NE.NF_NOERR) THEN
-             abort_message=' Nudging error -> no file u.nc'
-             CALL abort_gcm(modname,abort_message,1)
-          endif
-
-       endif
-
-
-    elseif (guide_v) then
-       if (ncidpl.eq.-99) then
-          rcod=nf90_open('v.nc',nf90_nowrite,ncidpl)
-          if (rcod.NE.NF_NOERR) THEN
-             abort_message=' Nudging error -> no file v.nc'
-             CALL abort_gcm(modname,abort_message,1)
-          endif
-       endif
-
-
-    elseif (guide_T) then
-       if (ncidpl.eq.-99) then
-          rcod=nf90_open('T.nc',nf90_nowrite,ncidpl)
-          if (rcod.NE.NF_NOERR) THEN
-             abort_message=' Nudging error -> no file T.nc'
-             CALL abort_gcm(modname,abort_message,1)
-          endif
-       endif
-
-
-
-    elseif (guide_Q) then
-       if (ncidpl.eq.-99) then
-          rcod=nf90_open('hur.nc',nf90_nowrite, ncidpl)
-          if (rcod.NE.NF_NOERR) THEN
-             abort_message=' Nudging error -> no file hur.nc'
-             CALL abort_gcm(modname,abort_message,1)
-          endif
-       endif
-
-
-    endif
-    error=NF_INQ_DIMID(ncidpl,'LEVEL',rid)
-    IF (error.NE.NF_NOERR) error=NF_INQ_DIMID(ncidpl,'PRESSURE',rid)
-    IF (error.NE.NF_NOERR) THEN
-        abort_message='Nudging: error reading pressure levels'
-        CALL abort_gcm(modname,abort_message,1)
-    ENDIF
-    error=NF_INQ_DIMLEN(ncidpl,rid,nlevnc)
-    write(*,*)trim(modname)//' : number of vertical levels nlevnc', nlevnc
-    rcod = nf90_close(ncidpl)
-
-! ---------------------------------------------
-! Allocation des variables
-! ---------------------------------------------
-    abort_message='nudging allocation error'
-
-    ALLOCATE(apnc(nlevnc), stat = error)
-    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-    ALLOCATE(bpnc(nlevnc), stat = error)
-    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-    apnc=0.;bpnc=0.
-
-    ALLOCATE(alpha_pcor(llm), stat = error)
-    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-    ALLOCATE(alpha_u(ijb_u:ije_u), stat = error)
-    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-    ALLOCATE(alpha_v(ijb_v:ije_v), stat = error)
-    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-    ALLOCATE(alpha_T(ijb_u:ije_u), stat = error)
-    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-    ALLOCATE(alpha_Q(ijb_u:ije_u), stat = error)
-    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-    ALLOCATE(alpha_P(ijb_u:ije_u), stat = error)
-    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-    alpha_u=0.;alpha_v=0;alpha_T=0;alpha_Q=0;alpha_P=0
-
-    IF (guide_u) THEN
-        ALLOCATE(unat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(ugui1(ijb_u:ije_u,llm), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(unat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(ugui2(ijb_u:ije_u,llm), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        unat1=0.;unat2=0.;ugui1=0.;ugui2=0.
-    ENDIF
-
-    IF (guide_T) THEN
-        ALLOCATE(tnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(tgui1(ijb_u:ije_u,llm), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(tnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(tgui2(ijb_u:ije_u,llm), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        tnat1=0.;tnat2=0.;tgui1=0.;tgui2=0.
-    ENDIF
-
-    IF (guide_Q) THEN
-        ALLOCATE(qnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(qgui1(ijb_u:ije_u,llm), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(qnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(qgui2(ijb_u:ije_u,llm), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        qnat1=0.;qnat2=0.;qgui1=0.;qgui2=0.
-    ENDIF
-
-    IF (guide_v) THEN
-        ALLOCATE(vnat1(iip1,jjb_v:jje_v,nlevnc), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(vgui1(ijb_v:ije_v,llm), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(vnat2(iip1,jjb_v:jje_v,nlevnc), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(vgui2(ijb_v:ije_v,llm), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        vnat1=0.;vnat2=0.;vgui1=0.;vgui2=0.
-    ENDIF
-
-    IF (guide_plevs.EQ.2) THEN
-        ALLOCATE(pnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(pnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        pnat1=0.;pnat2=0.;
-    ENDIF
-
-    IF (guide_P.OR.guide_plevs.EQ.1) THEN
-        ALLOCATE(psnat1(iip1,jjb_u:jje_u), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(psnat2(iip1,jjb_u:jje_u), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        psnat1=0.;psnat2=0.;
-    ENDIF
-    IF (guide_P) THEN
-        ALLOCATE(psgui2(ijb_u:ije_u), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        ALLOCATE(psgui1(ijb_u:ije_u), stat = error)
-        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
-        psgui1=0.;psgui2=0.
-    ENDIF
-
-! ---------------------------------------------
-!   Lecture du premier etat de guidage.
-! ---------------------------------------------
-    IF (guide_2D) THEN
-        CALL guide_read2D(1)
-    ELSE
-        CALL guide_read(1)
-    ENDIF
-    IF (guide_v) vnat1=vnat2
-    IF (guide_u) unat1=unat2
-    IF (guide_T) tnat1=tnat2
-    IF (guide_Q) qnat1=qnat2
-    IF (guide_plevs.EQ.2) pnat1=pnat2
-    IF (guide_P.OR.guide_plevs.EQ.1) psnat1=psnat2
-
-  END SUBROUTINE guide_init
-
-!=======================================================================
-  SUBROUTINE guide_main(itau,ucov,vcov,teta,q,masse,ps)
-    use exner_hyb_loc_m, only: exner_hyb_loc
-    use exner_milieu_loc_m, only: exner_milieu_loc
-    USE parallel_lmdz
-    USE control_mod
-    USE write_field_loc
-    USE comconst_mod, ONLY: cpp, daysec, dtvr, kappa
-    USE comvert_mod, ONLY: ap, bp, preff, presnivs, pressure_exner
-
-    IMPLICIT NONE
-
-    INCLUDE "dimensions.h"
-    INCLUDE "paramet.h"
-
-    ! Variables entree
-    INTEGER,                           INTENT(IN)    :: itau !pas de temps
-    REAL, DIMENSION (ijb_u:ije_u,llm), INTENT(INOUT) :: ucov,teta,q,masse
-    REAL, DIMENSION (ijb_v:ije_v,llm), INTENT(INOUT) :: vcov
-    REAL, DIMENSION (ijb_u:ije_u),     INTENT(INOUT) :: ps
-
-    ! Variables locales
-    LOGICAL, SAVE :: first=.TRUE.
-!$OMP THREADPRIVATE(first)
-    LOGICAL       :: f_out ! sortie guidage
-    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:) :: f_addu ! var aux: champ de guidage
-    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:) :: f_addv ! var aux: champ de guidage
-    ! Variables pour fonction Exner (P milieu couche)
-    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:,:)    :: pk
-    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:)        :: pks
-    REAL                               :: unskap
-    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:)    :: p ! besoin si guide_P
-    ! Compteurs temps:
-    INTEGER, SAVE :: step_rea,count_no_rea,itau_test ! lecture guidage
-!$OMP THREADPRIVATE(step_rea,count_no_rea,itau_test)
-    REAL          :: ditau, dday_step
-    REAL          :: tau,reste ! position entre 2 etats de guidage
-    REAL, SAVE    :: factt ! pas de temps en fraction de jour
-!$OMP THREADPRIVATE(factt)
-
-    INTEGER       :: i,j,l
-    CHARACTER(LEN=20) :: modname="guide_main"
-
-!$OMP MASTER
-    ijbu=ij_begin ; ijeu=ij_end
-    jjbu=jj_begin ; jjeu=jj_end ; jjnu=jjeu-jjbu+1
-    ijbv=ij_begin ; ijev=ij_end
-    jjbv=jj_begin ; jjev=jj_end ; jjnv=jjev-jjbv+1
-    IF (pole_sud) THEN
-      ijeu=ij_end-iip1
-      ijev=ij_end-iip1
-      jjev=jj_end-1
-      jjnv=jjev-jjbv+1
-    ENDIF
-    IF (pole_nord) THEN
-      ijbu=ij_begin+iip1
-      ijbv=ij_begin
-    ENDIF
-!$OMP END MASTER
-!$OMP BARRIER
-
-!    PRINT *,'---> on rentre dans guide_main'
-!    CALL AllGather_Field(ucov,ip1jmp1,llm)
-!    CALL AllGather_Field(vcov,ip1jm,llm)
-!    CALL AllGather_Field(teta,ip1jmp1,llm)
-!    CALL AllGather_Field(ps,ip1jmp1,1)
-!    CALL AllGather_Field(q,ip1jmp1,llm)
-
-!-----------------------------------------------------------------------
-! Initialisations au premier passage
-!-----------------------------------------------------------------------
-
-    IF (first) THEN
-        first=.FALSE.
-!$OMP MASTER
-        ALLOCATE(f_addu(ijb_u:ije_u,llm) )
-        ALLOCATE(f_addv(ijb_v:ije_v,llm) )
-        ALLOCATE(pk(iip1,jjb_u:jje_u,llm)  )
-        ALLOCATE(pks(iip1,jjb_u:jje_u)  )
-        ALLOCATE(p(ijb_u:ije_u,llmp1) )
-        CALL guide_init
-!$OMP END MASTER
-!$OMP BARRIER
-        itau_test=1001
-        step_rea=1
-        count_no_rea=0
-! Calcul des constantes de rappel
-        factt=dtvr*iperiod/daysec
-!$OMP MASTER
-        call tau2alpha(3, iip1, jjb_v, jje_v, factt, tau_min_v, tau_max_v, alpha_v)
-        call tau2alpha(2, iip1, jjb_u, jje_u, factt, tau_min_u, tau_max_u, alpha_u)
-        call tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_T, tau_max_T, alpha_T)
-        call tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_P, tau_max_P, alpha_P)
-        call tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_Q, tau_max_Q, alpha_Q)
-! correction de rappel dans couche limite
-        if (guide_BL) then
-             alpha_pcor(:)=1.
-        else
-            do l=1,llm
-                alpha_pcor(l)=(1.+tanh(((plim_guide_BL-presnivs(l))/preff)/0.05))/2.
-            enddo
-        endif
-!$OMP END MASTER
-!$OMP BARRIER
-! ini_anal: etat initial egal au guidage
-        IF (ini_anal) THEN
-            CALL guide_interp(ps,teta)
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-            DO l=1,llm
-              IF (guide_u) ucov(ijbu:ijeu,l)=ugui2(ijbu:ijeu,l)
-              IF (guide_v) vcov(ijbv:ijev,l)=ugui2(ijbv:ijev,l)
-              IF (guide_T) teta(ijbu:ijeu,l)=tgui2(ijbu:ijeu,l)
-              IF (guide_Q) q(ijbu:ijeu,l)=qgui2(ijbu:ijeu,l)
-            ENDDO
-
-            IF (guide_P) THEN
-!$OMP MASTER
-                ps(ijbu:ijeu)=psgui2(ijbu:ijeu)
-!$OMP END MASTER
-!$OMP BARRIER
-                CALL pression_loc(ijnb_u,ap,bp,ps,p)
-                CALL massdair_loc(p,masse)
-!$OMP BARRIER
-            ENDIF
-            RETURN
-        ENDIF
-
-    ENDIF !first
-
-!-----------------------------------------------------------------------
-! Lecture des fichiers de guidage ?
-!-----------------------------------------------------------------------
-    IF (iguide_read.NE.0) THEN
-      ditau=real(itau)
-      dday_step=real(day_step)
-      IF (iguide_read.LT.0) THEN
-          tau=ditau/dday_step/REAL(iguide_read)
-      ELSE
-          tau=REAL(iguide_read)*ditau/dday_step
-      ENDIF
-      reste=tau-AINT(tau)
-      IF (reste.EQ.0.) THEN
-          IF (itau_test.EQ.itau) THEN
-            write(*,*)trim(modname)//' second pass in advreel at itau=',&
-            itau
-            CALL abort_gcm("guide_loc_lod","stopped",1)
-          ELSE
-!$OMP MASTER
-              IF (guide_v) vnat1(:,jjbv:jjev,:)=vnat2(:,jjbv:jjev,:)
-              IF (guide_u) unat1(:,jjbu:jjeu,:)=unat2(:,jjbu:jjeu,:)
-              IF (guide_T) tnat1(:,jjbu:jjeu,:)=tnat2(:,jjbu:jjeu,:)
-              IF (guide_Q) qnat1(:,jjbu:jjeu,:)=qnat2(:,jjbu:jjeu,:)
-              IF (guide_plevs.EQ.2) pnat1(:,jjbu:jjeu,:)=pnat2(:,jjbu:jjeu,:)
-              IF (guide_P.OR.guide_plevs.EQ.1) psnat1(:,jjbu:jjeu)=psnat2(:,jjbu:jjeu)
-!$OMP END MASTER
-!$OMP BARRIER
-              step_rea=step_rea+1
-              itau_test=itau
-              if (is_master) then
-                write(*,*)trim(modname)//' Reading nudging files, step ',&
-                    step_rea,'after ',count_no_rea,' skips'
-              endif
-              IF (guide_2D) THEN
-!$OMP MASTER
-                  CALL guide_read2D(step_rea)
-!$OMP END MASTER
-!$OMP BARRIER
-              ELSE
-!$OMP MASTER
-                  CALL guide_read(step_rea)
-!$OMP END MASTER
-!$OMP BARRIER
-              ENDIF
-              count_no_rea=0
-          ENDIF
-      ELSE
-        count_no_rea=count_no_rea+1
-
-      ENDIF
-    ENDIF !iguide_read=0
-
-!-----------------------------------------------------------------------
-! Interpolation et conversion des champs de guidage
-!-----------------------------------------------------------------------
-    IF (MOD(itau,iguide_int).EQ.0) THEN
-        CALL guide_interp(ps,teta)
-    ENDIF
-! Repartition entre 2 etats de guidage
-    IF (iguide_read.NE.0) THEN
-        tau=reste
-    ELSE
-        tau=1.
-    ENDIF
-
-!    CALL WriteField_u('ucov_guide',ucov)
-!    CALL WriteField_v('vcov_guide',vcov)
-!    CALL WriteField_u('teta_guide',teta)
-!    CALL WriteField_u('masse_guide',masse)
-
-
-!-----------------------------------------------------------------------
-!   Ajout des champs de guidage
-!-----------------------------------------------------------------------
-! Sauvegarde du guidage?
-    f_out=((MOD(itau,iguide_sav).EQ.0).AND.guide_sav)
-    IF (f_out) THEN
-
-!$OMP BARRIER
-      CALL pression_loc(ijnb_u,ap,bp,ps,p)
-
-!$OMP BARRIER
-      if (pressure_exner) then
-      CALL exner_hyb_loc( ijnb_u, ps, p, pks, pk)
-      else
-        CALL exner_milieu_loc( ijnb_u, ps, p, pks, pk )
-      endif
-
-!$OMP BARRIER
-
-        unskap=1./kappa
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-        DO l = 1, llm
-            DO j=jjbu,jjeu
-                DO i =1, iip1
-                    p(i+(j-1)*iip1,l) = preff * ( pk(i,j,l)/cpp) ** unskap
-                ENDDO
-            ENDDO
-        ENDDO
-
-        CALL guide_out("SP",jjp1,llm,p(ijb_u:ije_u,1:llm),1.)
-    ENDIF
-
-    if (guide_u) then
-        if (guide_add) then
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-          DO l=1,llm
-           f_addu(ijbu:ijeu,l)=(1.-tau)*ugui1(ijbu:ijeu,l)+tau*ugui2(ijbu:ijeu,l)
-          ENDDO
-        else
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-          DO l=1,llm
-           f_addu(ijbu:ijeu,l)=(1.-tau)*ugui1(ijbu:ijeu,l)+tau*ugui2(ijbu:ijeu,l)-ucov(ijbu:ijeu,l)
-          ENDDO
-        endif
-
-!        CALL WriteField_u('f_addu',f_addu)
-
-        if (guide_zon) CALL guide_zonave_u(1,llm,f_addu)
-        CALL guide_addfield_u(llm,f_addu,alpha_u)
-        IF (f_out) CALL guide_out("ua",jjp1,llm,(1.-tau)*ugui1(ijb_u:ije_u,:)+tau*ugui2(ijb_u:ije_u,:),factt)
-        IF (f_out) CALL guide_out("u",jjp1,llm,ucov(ijb_u:ije_u,:),factt)
-        IF (f_out) THEN
-         ! Ehouarn: fill the gaps adequately...
-         IF (ijbu>ijb_u) f_addu(ijb_u:ijbu-1,:)=0
-         IF (ijeu<ije_u) f_addu(ijeu+1:ije_u,:)=0
-         CALL guide_out("ucov",jjp1,llm,f_addu(ijb_u:ije_u,:)/factt,factt)
-        ENDIF
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-        DO l=1,llm
-          ucov(ijbu:ijeu,l)=ucov(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l)
-        ENDDO
-
-    endif
-
-    if (guide_T) then
-        if (guide_add) then
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-          DO l=1,llm
-            f_addu(ijbu:ijeu,l)=(1.-tau)*tgui1(ijbu:ijeu,l)+tau*tgui2(ijbu:ijeu,l)
-          ENDDO
-        else
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-          DO l=1,llm
-           f_addu(ijbu:ijeu,l)=(1.-tau)*tgui1(ijbu:ijeu,l)+tau*tgui2(ijbu:ijeu,l)-teta(ijbu:ijeu,l)
-          ENDDO
-        endif
-        if (guide_zon) CALL guide_zonave_u(2,llm,f_addu)
-        CALL guide_addfield_u(llm,f_addu,alpha_T)
-        IF (f_out) CALL guide_out("teta",jjp1,llm,f_addu(:,:)/factt,factt)
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-        DO l=1,llm
-          teta(ijbu:ijeu,l)=teta(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l)
-        ENDDO
-    endif
-
-    if (guide_P) then
-        if (guide_add) then
-!$OMP MASTER
-            f_addu(ijbu:ijeu,1)=(1.-tau)*psgui1(ijbu:ijeu)+tau*psgui2(ijbu:ijeu)
-!$OMP END MASTER
-!$OMP BARRIER
-        else
-!$OMP MASTER
-            f_addu(ijbu:ijeu,1)=(1.-tau)*psgui1(ijbu:ijeu)+tau*psgui2(ijbu:ijeu)-ps(ijbu:ijeu)
-!$OMP END MASTER
-!$OMP BARRIER
-        endif
-        if (guide_zon) CALL guide_zonave_u(2,1,f_addu(ijb_u:ije_u,1))
-        CALL guide_addfield_u(1,f_addu(ijb_u:ije_u,1),alpha_P)
-!       IF (f_out) CALL guide_out("ps",jjp1,1,f_addu(ijb_u:ije_u,1)/factt,factt)
-!$OMP MASTER
-        ps(ijbu:ijeu)=ps(ijbu:ijeu)+f_addu(ijbu:ijeu,1)
-!$OMP END MASTER
-!$OMP BARRIER
-        CALL pression_loc(ijnb_u,ap,bp,ps,p)
-        CALL massdair_loc(p,masse)
-!$OMP BARRIER
-    endif
-
-    if (guide_Q) then
-        if (guide_add) then
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-          DO l=1,llm
-            f_addu(ijbu:ijeu,l)=(1.-tau)*qgui1(ijbu:ijeu,l)+tau*qgui2(ijbu:ijeu,l)
-          ENDDO
-        else
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-          DO l=1,llm
-            f_addu(ijbu:ijeu,l)=(1.-tau)*qgui1(ijbu:ijeu,l)+tau*qgui2(ijbu:ijeu,l)-q(ijbu:ijeu,l)
-          ENDDO
-        endif
-        if (guide_zon) CALL guide_zonave_u(2,llm,f_addu)
-        CALL guide_addfield_u(llm,f_addu,alpha_Q)
-        IF (f_out) CALL guide_out("q",jjp1,llm,f_addu(:,:)/factt,factt)
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-        DO l=1,llm
-          q(ijbu:ijeu,l)=q(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l)
-        ENDDO
-    endif
-
-    if (guide_v) then
-        if (guide_add) then
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-          DO l=1,llm
-             f_addv(ijbv:ijev,l)=(1.-tau)*vgui1(ijbv:ijev,l)+tau*vgui2(ijbv:ijev,l)
-          ENDDO
-
-        else
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-          DO l=1,llm
-            f_addv(ijbv:ijev,l)=(1.-tau)*vgui1(ijbv:ijev,l)+tau*vgui2(ijbv:ijev,l)-vcov(ijbv:ijev,l)
-          ENDDO
-
-        endif
-
-        if (guide_zon) CALL guide_zonave_v(2,jjm,llm,f_addv(ijb_v:ije_v,:))
-
-        CALL guide_addfield_v(llm,f_addv(ijb_v:ije_v,:),alpha_v)
-        IF (f_out) CALL guide_out("v",jjm,llm,vcov(ijb_v:ije_v,:),factt)
-        IF (f_out) CALL guide_out("va",jjm,llm,(1.-tau)*vgui1(ijb_v:ije_v,:)+tau*vgui2(ijb_v:ije_v,:),factt)
-        IF (f_out) THEN
-          ! Ehouarn: Fill in the gaps adequately
-          IF (ijbv>ijb_v) f_addv(ijb_v:ijbv-1,:)=0
-          IF (ijev<ije_v) f_addv(ijev+1:ije_v,:)=0
-          CALL guide_out("vcov",jjm,llm,f_addv(ijb_v:ije_v,:)/factt,factt)
-        ENDIF
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-        DO l=1,llm
-          vcov(ijbv:ijev,l)=vcov(ijbv:ijev,l)+f_addv(ijbv:ijev,l)
-        ENDDO
-    endif
-
-  END SUBROUTINE guide_main
-
-
-  SUBROUTINE guide_addfield_u(vsize,field,alpha)
-! field1=a*field1+alpha*field2
-
-    IMPLICIT NONE
-    INCLUDE "dimensions.h"
-    INCLUDE "paramet.h"
-
-    ! input variables
-    INTEGER,                      INTENT(IN)    :: vsize
-    REAL, DIMENSION(ijb_u:ije_u),       INTENT(IN)    :: alpha
-    REAL, DIMENSION(ijb_u:ije_u,vsize), INTENT(INOUT) :: field
-
-    ! Local variables
-    INTEGER :: l
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    DO l=1,vsize
-      field(ijbu:ijeu,l)=alpha(ijbu:ijeu)*field(ijbu:ijeu,l)*alpha_pcor(l)
-    ENDDO
-
-  END SUBROUTINE guide_addfield_u
-
-
-  SUBROUTINE guide_addfield_v(vsize,field,alpha)
-! field1=a*field1+alpha*field2
-
-    IMPLICIT NONE
-    INCLUDE "dimensions.h"
-    INCLUDE "paramet.h"
-
-    ! input variables
-    INTEGER,                      INTENT(IN)    :: vsize
-    REAL, DIMENSION(ijb_v:ije_v),       INTENT(IN)    :: alpha
-    REAL, DIMENSION(ijb_v:ije_v,vsize), INTENT(INOUT) :: field
-
-    ! Local variables
-    INTEGER :: l
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    DO l=1,vsize
-      field(ijbv:ijev,l)=alpha(ijbv:ijev)*field(ijbv:ijev,l)*alpha_pcor(l)
-    ENDDO
-
-  END SUBROUTINE guide_addfield_v
-
-!=======================================================================
-
-  SUBROUTINE guide_zonave_u(typ,vsize,field)
-
-    USE comconst_mod, ONLY: pi
-
-    IMPLICIT NONE
-
-    INCLUDE "dimensions.h"
-    INCLUDE "paramet.h"
-    INCLUDE "comgeom.h"
-
-    ! input/output variables
-    INTEGER,                           INTENT(IN)    :: typ
-    INTEGER,                           INTENT(IN)    :: vsize
-    REAL, DIMENSION(ijb_u:ije_u,vsize), INTENT(INOUT) :: field
-
-    ! Local variables
-    LOGICAL, SAVE                :: first=.TRUE.
-!$OMP THREADPRIVATE(first)
-
-    INTEGER, DIMENSION (2), SAVE :: imin, imax ! averaging domain
-!$OMP THREADPRIVATE(imin,imax)
-    INTEGER                      :: i,j,l,ij
-    REAL, DIMENSION (iip1)       :: lond       ! longitude in Deg.
-    REAL, DIMENSION (jjb_u:jje_u,vsize):: fieldm     ! zon-averaged field
-
-    IF (first) THEN
-        first=.FALSE.
-!Compute domain for averaging
-        lond=rlonu*180./pi
-        imin(1)=1;imax(1)=iip1;
-        imin(2)=1;imax(2)=iip1;
-        IF (guide_reg) THEN
-            DO i=1,iim
-                IF (lond(i).LT.lon_min_g) imin(1)=i
-                IF (lond(i).LE.lon_max_g) imax(1)=i
-            ENDDO
-            lond=rlonv*180./pi
-            DO i=1,iim
-                IF (lond(i).LT.lon_min_g) imin(2)=i
-                IF (lond(i).LE.lon_max_g) imax(2)=i
-            ENDDO
-        ENDIF
-    ENDIF
-
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-      DO l=1,vsize
-        fieldm(:,l)=0.
-      ! Compute zonal average
-
-!correction bug ici
-! ---> a verifier
-! ym         DO j=jjbv,jjev
-         DO j=jjbu,jjeu
-              DO i=imin(typ),imax(typ)
-                  ij=(j-1)*iip1+i
-                  fieldm(j,l)=fieldm(j,l)+field(ij,l)
-              ENDDO
-          ENDDO
-          fieldm(:,l)=fieldm(:,l)/REAL(imax(typ)-imin(typ)+1)
-    ! Compute forcing
-          DO j=jjbu,jjeu
-              DO i=1,iip1
-                  ij=(j-1)*iip1+i
-                  field(ij,l)=fieldm(j,l)
-              ENDDO
-          ENDDO
-      ENDDO
-
-  END SUBROUTINE guide_zonave_u
-
-
-  SUBROUTINE guide_zonave_v(typ,hsize,vsize,field)
-
-    USE comconst_mod, ONLY: pi
-
-    IMPLICIT NONE
-
-    INCLUDE "dimensions.h"
-    INCLUDE "paramet.h"
-    INCLUDE "comgeom.h"
-
-    ! input/output variables
-    INTEGER,                           INTENT(IN)    :: typ
-    INTEGER,                           INTENT(IN)    :: vsize
-    INTEGER,                           INTENT(IN)    :: hsize
-    REAL, DIMENSION(ijb_v:ije_v,vsize), INTENT(INOUT) :: field
-
-    ! Local variables
-    LOGICAL, SAVE                :: first=.TRUE.
-!$OMP THREADPRIVATE(first)
-    INTEGER, DIMENSION (2), SAVE :: imin, imax ! averaging domain
-!$OMP THREADPRIVATE(imin, imax)
-    INTEGER                      :: i,j,l,ij
-    REAL, DIMENSION (iip1)       :: lond       ! longitude in Deg.
-    REAL, DIMENSION (jjb_v:jjev,vsize):: fieldm     ! zon-averaged field
-
-    IF (first) THEN
-        first=.FALSE.
-!Compute domain for averaging
-        lond=rlonu*180./pi
-        imin(1)=1;imax(1)=iip1;
-        imin(2)=1;imax(2)=iip1;
-        IF (guide_reg) THEN
-            DO i=1,iim
-                IF (lond(i).LT.lon_min_g) imin(1)=i
-                IF (lond(i).LE.lon_max_g) imax(1)=i
-            ENDDO
-            lond=rlonv*180./pi
-            DO i=1,iim
-                IF (lond(i).LT.lon_min_g) imin(2)=i
-                IF (lond(i).LE.lon_max_g) imax(2)=i
-            ENDDO
-        ENDIF
-    ENDIF
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-      DO l=1,vsize
-      ! Compute zonal average
-          fieldm(:,l)=0.
-          DO j=jjbv,jjev
-              DO i=imin(typ),imax(typ)
-                  ij=(j-1)*iip1+i
-                  fieldm(j,l)=fieldm(j,l)+field(ij,l)
-              ENDDO
-          ENDDO
-          fieldm(:,l)=fieldm(:,l)/REAL(imax(typ)-imin(typ)+1)
-    ! Compute forcing
-          DO j=jjbv,jjev
-              DO i=1,iip1
-                  ij=(j-1)*iip1+i
-                  field(ij,l)=fieldm(j,l)
-              ENDDO
-          ENDDO
-      ENDDO
-
-
-  END SUBROUTINE guide_zonave_v
-
-!=======================================================================
-  SUBROUTINE guide_interp(psi,teta)
-    use exner_hyb_loc_m, only: exner_hyb_loc
-    use exner_milieu_loc_m, only: exner_milieu_loc
-  USE parallel_lmdz
-  USE mod_hallo
-  USE Bands
-  USE comconst_mod, ONLY: cpp, kappa
-  USE comvert_mod, ONLY: preff, pressure_exner, bp, ap, disvert_type
-  IMPLICIT NONE
-
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom2.h"
-
-  REAL, DIMENSION (iip1,jjb_u:jje_u),     INTENT(IN) :: psi ! Psol gcm
-  REAL, DIMENSION (iip1,jjb_u:jje_u,llm), INTENT(IN) :: teta ! Temp. Pot. gcm
-
-  LOGICAL, SAVE                      :: first=.TRUE.
-!$OMP THREADPRIVATE(first)
-  ! Variables pour niveaux pression:
-  REAL, ALLOCATABLE, SAVE, DIMENSION (:,:,:) :: plnc1,plnc2 !niveaux pression guidage
-  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: plunc,plsnc !niveaux pression modele
-  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)     :: plvnc       !niveaux pression modele
-  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)  :: p           ! pression intercouches
-  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: pls, pext   ! var intermediaire
-  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: pbarx
-  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)     :: pbary
-  ! Variables pour fonction Exner (P milieu couche)
-  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: pk
-  REAL ,ALLOCATABLE, SAVE, DIMENSION (:,:)        :: pks
-  REAL                               :: unskap
-  ! Pression de vapeur saturante
-  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:)      :: qsat
-  !Variables intermediaires interpolation
-  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: zu1,zu2
-  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)     :: zv1,zv2
-
-  INTEGER                            :: i,j,l,ij
-  CHARACTER(LEN=20),PARAMETER :: modname="guide_interp"
-  TYPE(Request),SAVE :: Req
-!$OMP THREADPRIVATE(Req)
-
-    if (is_master) write(*,*)trim(modname)//': interpolate nudging variables'
-! -----------------------------------------------------------------
-! Calcul des niveaux de pression champs guidage (pour T et Q)
-! -----------------------------------------------------------------
-    IF (first) THEN
-!$OMP MASTER
-      ALLOCATE(plnc1(iip1,jjb_u:jje_u,nlevnc) )
-      ALLOCATE(plnc2(iip1,jjb_u:jje_u,nlevnc) )
-      ALLOCATE(plunc(iip1,jjb_u:jje_u,llm) )
-      ALLOCATE(plsnc(iip1,jjb_u:jje_u,llm) )
-      ALLOCATE(plvnc(iip1,jjb_v:jje_v,llm) )
-      ALLOCATE(p(iip1,jjb_u:jje_u,llmp1) )
-      ALLOCATE(pls(iip1,jjb_u:jje_u,llm) )
-      ALLOCATE(pext(iip1,jjb_u:jje_u,llm) )
-      ALLOCATE(pbarx(iip1,jjb_u:jje_u,llm) )
-      ALLOCATE(pbary(iip1,jjb_v:jje_v,llm) )
-      ALLOCATE(pk(iip1,jjb_u:jje_u,llm) )
-      ALLOCATE(pks (iip1,jjb_u:jje_u) )
-      ALLOCATE(qsat(ijb_u:ije_u,llm) )
-      ALLOCATE(zu1(iip1,jjb_u:jje_u,llm) )
-      ALLOCATE(zu2(iip1,jjb_u:jje_u,llm) )
-      ALLOCATE(zv1(iip1,jjb_v:jje_v,llm) )
-      ALLOCATE(zv2(iip1,jjb_v:jje_v,llm) )
-!$OMP END MASTER
-!$OMP BARRIER
-    ENDIF
-
-
-
-
-    IF (guide_plevs.EQ.0) THEN
-!$OMP DO
-        DO l=1,nlevnc
-            DO j=jjbu,jjeu
-                DO i=1,iip1
-                    plnc2(i,j,l)=apnc(l)
-                    plnc1(i,j,l)=apnc(l)
-               ENDDO
-            ENDDO
-        ENDDO
-    ENDIF
-
-    if (first) then
-        first=.FALSE.
-!$OMP MASTER
-        write(*,*)trim(modname)//' : check vertical level order'
-        write(*,*)trim(modname)//' LMDZ :'
-        do l=1,llm
-          write(*,*)trim(modname)//' PL(',l,')=',(ap(l)+ap(l+1))/2. &
-                  +psi(1,jjeu)*(bp(l)+bp(l+1))/2.
-        enddo
-        write(*,*)trim(modname)//' nudging file :'
-        SELECT CASE (guide_plevs)
-        CASE (0)
-            do l=1,nlevnc
-              write(*,*)trim(modname)//' PL(',l,')=',plnc2(1,jjbu,l)
-            enddo
-        CASE (1)
-            DO l=1,nlevnc
-              write(*,*)trim(modname)//' PL(',l,')=',&
-                        apnc(l)+bpnc(l)*psnat2(1,jjbu)
-            ENDDO
-        CASE (2)
-            do l=1,nlevnc
-              write(*,*)trim(modname)//' PL(',l,')=',pnat2(1,jjbu,l)
-            enddo
-        END SELECT
-        write(*,*)trim(modname)//' invert ordering: invert_p=',invert_p
-        if (guide_u) then
-            do l=1,nlevnc
-              write(*,*)trim(modname)//' U(',l,')=',unat2(1,jjbu,l)
-            enddo
-        endif
-        if (guide_T) then
-            do l=1,nlevnc
-              write(*,*)trim(modname)//' T(',l,')=',tnat2(1,jjbu,l)
-            enddo
-        endif
-!$OMP END MASTER
-    endif ! of if (first)
-
-    if (guide_plevs /= 1 .or. guide_t .and. .not. guide_teta &
-         .or. guide_q .and. guide_hr) then
-       CALL pression_loc( ijnb_u, ap, bp, psi, p )
-       if (disvert_type==1) then
-          CALL exner_hyb_loc(ijnb_u,psi,p,pks,pk)
-       else ! we assume that we are in the disvert_type==2 case
-          CALL exner_milieu_loc(ijnb_u,psi,p,pks,pk)
-       endif
-    end if
-
-! -----------------------------------------------------------------
-! Calcul niveaux pression modele
-! -----------------------------------------------------------------
-
-!    ....  Calcul de pls , pression au milieu des couches ,en Pascals
-    IF (guide_plevs.EQ.1) THEN
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-        DO l=1,llm
-            DO j=jjbu,jjeu
-                DO i =1, iip1
-                    pls(i,j,l)=(ap(l)+ap(l+1))/2.+psi(i,j)*(bp(l)+bp(l+1))/2.
-                ENDDO
-            ENDDO
-        ENDDO
-    ELSE
-        unskap=1./kappa
-!$OMP BARRIER
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-   DO l = 1, llm
-       DO j=jjbu,jjeu
-           DO i =1, iip1
-               pls(i,j,l) = preff * ( pk(i,j,l)/cpp) ** unskap
-           ENDDO
-       ENDDO
-   ENDDO
-    ENDIF
-
-!   calcul des pressions pour les grilles u et v
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    do l=1,llm
-        do j=jjbu,jjeu
-            do i=1,iip1
-                pext(i,j,l)=pls(i,j,l)*aire(i,j)
-            enddo
-        enddo
-    enddo
-
-     CALL Register_Hallo_u(pext,llm,1,2,2,1,Req)
-     CALL SendRequest(Req)
-!$OMP BARRIER
-     CALL WaitRequest(Req)
-!$OMP BARRIER
-
-    call massbar_loc(pext, pbarx, pbary )
-!$OMP BARRIER
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    do l=1,llm
-        do j=jjbu,jjeu
-            do i=1,iip1
-                plunc(i,j,l)=pbarx(i,j,l)/aireu(i,j)
-                plsnc(i,j,l)=pls(i,j,l)
-            enddo
-        enddo
-    enddo
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    do l=1,llm
-        do j=jjbv,jjev
-            do i=1,iip1
-                plvnc(i,j,l)=pbary(i,j,l)/airev(i,j)
-            enddo
-        enddo
-    enddo
-
-! -----------------------------------------------------------------
-! Interpolation verticale champs guidage sur niveaux modele
-! Conversion en variables gcm (ucov, vcov...)
-! -----------------------------------------------------------------
-    if (guide_P) then
-!$OMP MASTER
-        do j=jjbu,jjeu
-            do i=1,iim
-                ij=(j-1)*iip1+i
-                psgui1(ij)=psnat1(i,j)
-                psgui2(ij)=psnat2(i,j)
-            enddo
-            psgui1(iip1*j)=psnat1(1,j)
-            psgui2(iip1*j)=psnat2(1,j)
-        enddo
-!$OMP END MASTER
-!$OMP BARRIER
-    endif
-
-    IF (guide_T) THEN
-        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
-        IF (guide_plevs.EQ.1) THEN
-!$OMP DO
-            DO l=1,nlevnc
-                DO j=jjbu,jjeu
-                    DO i=1,iip1
-                        plnc2(i,j,l)=apnc(l)+bpnc(l)*psnat2(i,j)
-                        plnc1(i,j,l)=apnc(l)+bpnc(l)*psnat1(i,j)
-                    ENDDO
-                ENDDO
-            ENDDO
-        ELSE IF (guide_plevs.EQ.2) THEN
-!$OMP DO
-            DO l=1,nlevnc
-                DO j=jjbu,jjeu
-                    DO i=1,iip1
-                        plnc2(i,j,l)=pnat2(i,j,l)
-                        plnc1(i,j,l)=pnat1(i,j,l)
-                    ENDDO
-                ENDDO
-            ENDDO
-        ENDIF
-
-        ! Interpolation verticale
-!$OMP MASTER
-        CALL pres2lev(tnat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm,           &
-                    plnc1(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
-        CALL pres2lev(tnat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm,           &
-                    plnc2(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
-!$OMP END MASTER
-!$OMP BARRIER
-        ! Conversion en variables GCM
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-        do l=1,llm
-            do j=jjbu,jjeu
-                IF (guide_teta) THEN
-                    do i=1,iim
-                        ij=(j-1)*iip1+i
-                        tgui1(ij,l)=zu1(i,j,l)
-                        tgui2(ij,l)=zu2(i,j,l)
-                    enddo
-                ELSE
-                    do i=1,iim
-                        ij=(j-1)*iip1+i
-                        tgui1(ij,l)=zu1(i,j,l)*cpp/pk(i,j,l)
-                        tgui2(ij,l)=zu2(i,j,l)*cpp/pk(i,j,l)
-                    enddo
-                ENDIF
-                tgui1(j*iip1,l)=tgui1((j-1)*iip1+1,l)
-                tgui2(j*iip1,l)=tgui2((j-1)*iip1+1,l)
-            enddo
-            if (pole_nord) then
-              do i=1,iip1
-                tgui1(i,l)=tgui1(1,l)
-                tgui2(i,l)=tgui2(1,l)
-              enddo
-            endif
-            if (pole_sud) then
-              do i=1,iip1
-                tgui1(ip1jm+i,l)=tgui1(ip1jm+1,l)
-                tgui2(ip1jm+i,l)=tgui2(ip1jm+1,l)
-              enddo
-           endif
-        enddo
-    ENDIF
-
-    IF (guide_Q) THEN
-        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
-        IF (guide_plevs.EQ.1) THEN
-!$OMP DO
-            DO l=1,nlevnc
-                DO j=jjbu,jjeu
-                    DO i=1,iip1
-                        plnc2(i,j,l)=apnc(l)+bpnc(l)*psnat2(i,j)
-                        plnc1(i,j,l)=apnc(l)+bpnc(l)*psnat1(i,j)
-                    ENDDO
-                ENDDO
-            ENDDO
-        ELSE IF (guide_plevs.EQ.2) THEN
-!$OMP DO
-            DO l=1,nlevnc
-                DO j=jjbu,jjeu
-                    DO i=1,iip1
-                        plnc2(i,j,l)=pnat2(i,j,l)
-                        plnc1(i,j,l)=pnat1(i,j,l)
-                    ENDDO
-                ENDDO
-            ENDDO
-        ENDIF
-
-        ! Interpolation verticale
-!$OMP MASTER
-        CALL pres2lev(qnat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm,             &
-                      plnc1(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
-        CALL pres2lev(qnat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm,             &
-                      plnc2(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
-!$OMP END MASTER
-!$OMP BARRIER
-
-        ! Conversion en variables GCM
-        ! On suppose qu'on a la bonne variable dans le fichier de guidage:
-        ! Hum.Rel si guide_hr, Hum.Spec. sinon.
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-        do l=1,llm
-            do j=jjbu,jjeu
-                do i=1,iim
-                    ij=(j-1)*iip1+i
-                    qgui1(ij,l)=zu1(i,j,l)
-                    qgui2(ij,l)=zu2(i,j,l)
-                enddo
-                qgui1(j*iip1,l)=qgui1((j-1)*iip1+1,l)
-                qgui2(j*iip1,l)=qgui2((j-1)*iip1+1,l)
-            enddo
-            if (pole_nord) then
-              do i=1,iip1
-                qgui1(i,l)=qgui1(1,l)
-                qgui2(i,l)=qgui2(1,l)
-              enddo
-            endif
-            if (pole_sud) then
-              do i=1,iip1
-                qgui1(ip1jm+i,l)=qgui1(ip1jm+1,l)
-                qgui2(ip1jm+i,l)=qgui2(ip1jm+1,l)
-              enddo
-            endif
-        enddo
-        IF (guide_hr) THEN
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-          do l=1,llm
-            CALL q_sat(iip1*jjnu,teta(:,jjbu:jjeu,l)*pk(:,jjbu:jjeu,l)/cpp,       &
-                       plsnc(:,jjbu:jjeu,l),qsat(ijbu:ijeu,l))
-            qgui1(ijbu:ijeu,l)=qgui1(ijbu:ijeu,l)*qsat(ijbu:ijeu,l)*0.01 !hum. rel. en %
-            qgui2(ijbu:ijeu,l)=qgui2(ijbu:ijeu,l)*qsat(ijbu:ijeu,l)*0.01
-          enddo
-
-        ENDIF
-    ENDIF
-
-    IF (guide_u) THEN
-        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
-        IF (guide_plevs.EQ.1) THEN
-!$OMP DO
-            DO l=1,nlevnc
-                DO j=jjbu,jjeu
-                    DO i=1,iim
-                        plnc2(i,j,l)=apnc(l)+bpnc(l)*(psnat2(i,j)*aire(i,j)*alpha1p2(i,j) &
-                       &           +psnat2(i+1,j)*aire(i+1,j)*alpha3p4(i+1,j))/aireu(i,j)
-                        plnc1(i,j,l)=apnc(l)+bpnc(l)*(psnat1(i,j)*aire(i,j)*alpha1p2(i,j) &
-                       &           +psnat1(i+1,j)*aire(i+1,j)*alpha3p4(i+1,j))/aireu(i,j)
-                    ENDDO
-                    plnc2(iip1,j,l)=plnc2(1,j,l)
-                    plnc1(iip1,j,l)=plnc1(1,j,l)
-                ENDDO
-            ENDDO
-        ELSE IF (guide_plevs.EQ.2) THEN
-!$OMP DO
-            DO l=1,nlevnc
-                DO j=jjbu,jjeu
-                    DO i=1,iim
-                        plnc2(i,j,l)=(pnat2(i,j,l)*aire(i,j)*alpha1p2(i,j) &
-                       & +pnat2(i+1,j,l)*aire(i,j)*alpha3p4(i+1,j))/aireu(i,j)
-                        plnc1(i,j,l)=(pnat1(i,j,l)*aire(i,j)*alpha1p2(i,j) &
-                       & +pnat1(i+1,j,l)*aire(i,j)*alpha3p4(i+1,j))/aireu(i,j)
-                    ENDDO
-                    plnc2(iip1,j,l)=plnc2(1,j,l)
-                    plnc1(iip1,j,l)=plnc1(1,j,l)
-                ENDDO
-            ENDDO
-        ENDIF
-
-        ! Interpolation verticale
-!$OMP MASTER
-        CALL pres2lev(unat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm,            &
-                      plnc1(:,jjbu:jjeu,:),plunc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
-        CALL pres2lev(unat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm,            &
-                      plnc2(:,jjbu:jjeu,:),plunc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
-!$OMP END MASTER
-!$OMP BARRIER
-
-        ! Conversion en variables GCM
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-        do l=1,llm
-            do j=jjbu,jjeu
-                do i=1,iim
-                    ij=(j-1)*iip1+i
-                    ugui1(ij,l)=zu1(i,j,l)*cu(i,j)
-                    ugui2(ij,l)=zu2(i,j,l)*cu(i,j)
-                enddo
-                ugui1(j*iip1,l)=ugui1((j-1)*iip1+1,l)
-                ugui2(j*iip1,l)=ugui2((j-1)*iip1+1,l)
-            enddo
-            if (pole_nord) then
-              do i=1,iip1
-                ugui1(i,l)=0.
-                ugui2(i,l)=0.
-              enddo
-            endif
-            if (pole_sud) then
-              do i=1,iip1
-                ugui1(ip1jm+i,l)=0.
-                ugui2(ip1jm+i,l)=0.
-              enddo
-            endif
-        enddo
-    ENDIF
-
-    IF (guide_v) THEN
-        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
-        IF (guide_plevs.EQ.1) THEN
-         CALL Register_Hallo_u(psnat1,1,1,2,2,1,Req)
-         CALL Register_Hallo_u(psnat2,1,1,2,2,1,Req)
-         CALL SendRequest(Req)
-!$OMP BARRIER
-         CALL WaitRequest(Req)
-!$OMP BARRIER
-!$OMP DO
-            DO l=1,nlevnc
-                DO j=jjbv,jjev
-                    DO i=1,iip1
-                        plnc2(i,j,l)=apnc(l)+bpnc(l)*(psnat2(i,j)*aire(i,j)*alpha2p3(i,j) &
-                       &           +psnat2(i,j+1)*aire(i,j+1)*alpha1p4(i,j+1))/airev(i,j)
-                        plnc1(i,j,l)=apnc(l)+bpnc(l)*(psnat1(i,j)*aire(i,j)*alpha2p3(i,j) &
-                       &           +psnat1(i,j+1)*aire(i,j+1)*alpha1p4(i,j+1))/airev(i,j)
-                    ENDDO
-                ENDDO
-            ENDDO
-        ELSE IF (guide_plevs.EQ.2) THEN
-         CALL Register_Hallo_u(pnat1,llm,1,2,2,1,Req)
-         CALL Register_Hallo_u(pnat2,llm,1,2,2,1,Req)
-         CALL SendRequest(Req)
-!$OMP BARRIER
-         CALL WaitRequest(Req)
-!$OMP BARRIER
-!$OMP DO
-            DO l=1,nlevnc
-                DO j=jjbv,jjev
-                    DO i=1,iip1
-                        plnc2(i,j,l)=(pnat2(i,j,l)*aire(i,j)*alpha2p3(i,j) &
-                       & +pnat2(i,j+1,l)*aire(i,j)*alpha1p4(i,j+1))/airev(i,j)
-                        plnc1(i,j,l)=(pnat1(i,j,l)*aire(i,j)*alpha2p3(i,j) &
-                       & +pnat1(i,j+1,l)*aire(i,j)*alpha1p4(i,j+1))/airev(i,j)
-                    ENDDO
-                ENDDO
-            ENDDO
-        ENDIF
-        ! Interpolation verticale
-
-!$OMP MASTER
-        CALL pres2lev(vnat1(:,jjbv:jjev,:),zv1(:,jjbv:jjev,:),nlevnc,llm,             &
-                      plnc1(:,jjbv:jjev,:),plvnc(:,jjbv:jjev,:),iip1,jjnv,invert_p)
-        CALL pres2lev(vnat2(:,jjbv:jjev,:),zv2(:,jjbv:jjev,:),nlevnc,llm,             &
-                      plnc2(:,jjbv:jjev,:),plvnc(:,jjbv:jjev,:),iip1,jjnv,invert_p)
-!$OMP END MASTER
-!$OMP BARRIER
-        ! Conversion en variables GCM
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-        do l=1,llm
-            do j=jjbv,jjev
-                do i=1,iim
-                    ij=(j-1)*iip1+i
-                    vgui1(ij,l)=zv1(i,j,l)*cv(i,j)
-                    vgui2(ij,l)=zv2(i,j,l)*cv(i,j)
-                enddo
-                vgui1(j*iip1,l)=vgui1((j-1)*iip1+1,l)
-                vgui2(j*iip1,l)=vgui2((j-1)*iip1+1,l)
-            enddo
-        enddo
-    ENDIF
-
-
-  END SUBROUTINE guide_interp
-
-!=======================================================================
-  SUBROUTINE tau2alpha(typ,pim,jjb,jje,factt,taumin,taumax,alpha)
-
-! Calcul des constantes de rappel alpha (=1/tau)
-
-    use comconst_mod, only: pi
-    use serre_mod, only: clat, clon, grossismx, grossismy
-
-    implicit none
-
-    include "dimensions.h"
-    include "paramet.h"
-    include "comgeom2.h"
-
-! input arguments :
-    INTEGER, INTENT(IN) :: typ    ! u(2),v(3), ou scalaire(1)
-    INTEGER, INTENT(IN) :: pim ! dimensions en lon
-    INTEGER, INTENT(IN) :: jjb,jje ! dimensions en lat
-    REAL, INTENT(IN)    :: factt   ! pas de temps en fraction de jour
-    REAL, INTENT(IN)    :: taumin,taumax
-! output arguments:
-    REAL, DIMENSION(pim,jjb:jje), INTENT(OUT) :: alpha
-
-!  local variables:
-    LOGICAL, SAVE               :: first=.TRUE.
-    REAL, SAVE                  :: gamma,dxdy_min,dxdy_max
-    REAL, DIMENSION (iip1,jjp1) :: zdx,zdy
-    REAL, DIMENSION (iip1,jjp1) :: dxdys,dxdyu
-    REAL, DIMENSION (iip1,jjm)  :: dxdyv
-    real dxdy_
-    real zlat,zlon
-    real alphamin,alphamax,xi
-    integer i,j,ilon,ilat
-    character(len=20),parameter :: modname="tau2alpha"
-
-
-    alphamin=factt/taumax
-    alphamax=factt/taumin
-    IF (guide_reg.OR.guide_add) THEN
-        alpha=alphamax
-!-----------------------------------------------------------------------
-! guide_reg: alpha=alpha_min dans region, 0. sinon.
-!-----------------------------------------------------------------------
-        IF (guide_reg) THEN
-            do j=jjb,jje
-                do i=1,pim
-                    if (typ.eq.2) then
-                       zlat=rlatu(j)*180./pi
-                       zlon=rlonu(i)*180./pi
-                    elseif (typ.eq.1) then
-                       zlat=rlatu(j)*180./pi
-                       zlon=rlonv(i)*180./pi
-                    elseif (typ.eq.3) then
-                       zlat=rlatv(j)*180./pi
-                       zlon=rlonv(i)*180./pi
-                    endif
-                    alpha(i,j)=alphamax/16.* &
-                              (1.+tanh((zlat-lat_min_g)/tau_lat))* &
-                              (1.+tanh((lat_max_g-zlat)/tau_lat))* &
-                              (1.+tanh((zlon-lon_min_g)/tau_lon))* &
-                              (1.+tanh((lon_max_g-zlon)/tau_lon))
-                enddo
-            enddo
-        ENDIF
-    ELSE
-!-----------------------------------------------------------------------
-! Sinon, alpha varie entre alpha_min et alpha_max suivant le zoom.
-!-----------------------------------------------------------------------
-!Calcul de l'aire des mailles
-        do j=2,jjm
-            do i=2,iip1
-               zdx(i,j)=0.5*(cu(i-1,j)+cu(i,j))/cos(rlatu(j))
-            enddo
-            zdx(1,j)=zdx(iip1,j)
-        enddo
-        do j=2,jjm
-            do i=1,iip1
-               zdy(i,j)=0.5*(cv(i,j-1)+cv(i,j))
-            enddo
-        enddo
-        do i=1,iip1
-            zdx(i,1)=zdx(i,2)
-            zdx(i,jjp1)=zdx(i,jjm)
-            zdy(i,1)=zdy(i,2)
-            zdy(i,jjp1)=zdy(i,jjm)
-        enddo
-        do j=1,jjp1
-            do i=1,iip1
-               dxdys(i,j)=sqrt(zdx(i,j)*zdx(i,j)+zdy(i,j)*zdy(i,j))
-            enddo
-        enddo
-        IF (typ.EQ.2) THEN
-            do j=1,jjp1
-                do i=1,iim
-                   dxdyu(i,j)=0.5*(dxdys(i,j)+dxdys(i+1,j))
-                enddo
-                dxdyu(iip1,j)=dxdyu(1,j)
-            enddo
-        ENDIF
-        IF (typ.EQ.3) THEN
-            do j=1,jjm
-                do i=1,iip1
-                   dxdyv(i,j)=0.5*(dxdys(i,j)+dxdys(i,j+1))
-                enddo
-            enddo
-        ENDIF
-! Premier appel: calcul des aires min et max et de gamma.
-        IF (first) THEN
-            first=.FALSE.
-            ! coordonnees du centre du zoom
-            CALL coordij(clon,clat,ilon,ilat)
-            ! aire de la maille au centre du zoom
-            dxdy_min=dxdys(ilon,ilat)
-            ! dxdy maximale de la maille
-            dxdy_max=0.
-            do j=1,jjp1
-                do i=1,iip1
-                     dxdy_max=max(dxdy_max,dxdys(i,j))
-                enddo
-            enddo
-            ! Calcul de gamma
-            if (abs(grossismx-1.).lt.0.1.or.abs(grossismy-1.).lt.0.1) then
-              write(*,*)trim(modname)//' ATTENTION modele peu zoome'
-              write(*,*)trim(modname)//' ATTENTION on prend une constante de guidage cste'
-              gamma=0.
-            else
-              gamma=(dxdy_max-2.*dxdy_min)/(dxdy_max-dxdy_min)
-              write(*,*)trim(modname)//' gamma=',gamma
-              if (gamma.lt.1.e-5) then
-                write(*,*)trim(modname)//' gamma =',gamma,'<1e-5'
-                CALL abort_gcm("guide_loc_mod","stopped",1)
-              endif
-              gamma=log(0.5)/log(gamma)
-              if (gamma4) then
-                gamma=min(gamma,4.)
-              endif
-              write(*,*)trim(modname)//' gamma=',gamma
-            endif
-        ENDIF !first
-
-        do j=jjb,jje
-            do i=1,pim
-                if (typ.eq.1) then
-                   dxdy_=dxdys(i,j)
-                   zlat=rlatu(j)*180./pi
-                elseif (typ.eq.2) then
-                   dxdy_=dxdyu(i,j)
-                   zlat=rlatu(j)*180./pi
-                elseif (typ.eq.3) then
-                   dxdy_=dxdyv(i,j)
-                   zlat=rlatv(j)*180./pi
-                endif
-                if (abs(grossismx-1.).lt.0.1.or.abs(grossismy-1.).lt.0.1) then
-                ! pour une grille reguliere, xi=xxx**0=1 -> alpha=alphamin
-                    alpha(i,j)=alphamin
-                else
-                    xi=((dxdy_max-dxdy_)/(dxdy_max-dxdy_min))**gamma
-                    xi=min(xi,1.)
-                    if(lat_min_g.le.zlat .and. zlat.le.lat_max_g) then
-                        alpha(i,j)=xi*alphamin+(1.-xi)*alphamax
-                    else
-                        alpha(i,j)=0.
-                    endif
-                endif
-            enddo
-        enddo
-    ENDIF ! guide_reg
-
-    if (.not. guide_add) alpha = 1. - exp(- alpha)
-
-  END SUBROUTINE tau2alpha
-
-!=======================================================================
-  SUBROUTINE guide_read(timestep)
-    USE netcdf, ONLY: nf90_put_var
-    IMPLICIT NONE
-
-    include "netcdf.inc"
-    include "dimensions.h"
-    include "paramet.h"
-
-    INTEGER, INTENT(IN)   :: timestep
-
-    LOGICAL, SAVE         :: first=.TRUE.
-! Identification fichiers et variables NetCDF:
-    INTEGER, SAVE         :: ncidu,varidu,ncidv,varidv,ncidp,varidp
-    INTEGER, SAVE         :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps
-    INTEGER               :: ncidpl,varidpl,varidap,varidbp,dimid,lendim
-! Variables auxiliaires NetCDF:
-    INTEGER, DIMENSION(4) :: start,count
-    INTEGER               :: status,rcode
-    CHARACTER (len = 80)   :: abort_message
-    CHARACTER (len = 20)   :: modname = 'guide_read'
-    CHARACTER (len = 20)   :: namedim
-    abort_message='pb in guide_read'
-
-! -----------------------------------------------------------------
-! Premier appel: initialisation de la lecture des fichiers
-! -----------------------------------------------------------------
-    if (first) then
-         ncidpl=-99
-         write(*,*),trim(modname)//': opening nudging files '
-! Ap et Bp si Niveaux de pression hybrides
-         if (guide_plevs.EQ.1) then
-             write(*,*),trim(modname)//' Reading nudging on model levels'
-             rcode = nf90_open('apbp.nc', nf90_nowrite, ncidpl)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no file apbp.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             rcode = nf90_inq_varid(ncidpl, 'AP', varidap)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no AP variable in file apbp.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             rcode = nf90_inq_varid(ncidpl, 'BP', varidbp)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no BP variable in file apbp.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             write(*,*),trim(modname)//' ncidpl,varidap',ncidpl,varidap
-         endif
-
-! Pression si guidage sur niveaux P variables
-         if (guide_plevs.EQ.2) then
-             rcode = nf90_open('P.nc', nf90_nowrite, ncidp)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no file P.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             rcode = nf90_inq_varid(ncidp, 'PRES', varidp)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no PRES variable in file P.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             write(*,*),trim(modname)//' ncidp,varidp',ncidp,varidp
-             if (ncidpl.eq.-99) ncidpl=ncidp
-         endif
-
-! Vent zonal
-         if (guide_u) then
-             rcode = nf90_open('u.nc', nf90_nowrite, ncidu)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no file u.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             rcode = nf90_inq_varid(ncidu, 'UWND', varidu)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no UWND variable in file u.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             write(*,*),trim(modname)//' ncidu,varidu',ncidu,varidu
-             if (ncidpl.eq.-99) ncidpl=ncidu
-
-
-             status=NF90_INQ_DIMID(ncidu, "LONU", dimid)
-             status=NF90_INQUIRE_DIMENSION(ncidu,dimid,namedim,lendim)
-             IF (lendim .NE. iip1) THEN
-                abort_message='dimension LONU different from iip1 in u.nc'
-                CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-
-             status=NF90_INQ_DIMID(ncidu, "LATU", dimid)
-             status=NF90_INQUIRE_DIMENSION(ncidu,dimid,namedim,lendim)
-             IF (lendim .NE. jjp1) THEN
-                abort_message='dimension LATU different from jjp1 in u.nc'
-                CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-
-         endif
-
-! Vent meridien
-         if (guide_v) then
-             rcode = nf90_open('v.nc', nf90_nowrite, ncidv)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no file v.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             rcode = nf90_inq_varid(ncidv, 'VWND', varidv)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no VWND variable in file v.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             write(*,*),trim(modname)//' ncidv,varidv',ncidv,varidv
-             if (ncidpl.eq.-99) ncidpl=ncidv
-
-             status=NF90_INQ_DIMID(ncidv, "LONV", dimid)
-             status=NF90_INQUIRE_DIMENSION(ncidv,dimid,namedim,lendim)
-
-                IF (lendim .NE. iip1) THEN
-                abort_message='dimension LONV different from iip1 in v.nc'
-                CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-
-
-             status=NF90_INQ_DIMID(ncidv, "LATV", dimid)
-             status=NF90_INQUIRE_DIMENSION(ncidv,dimid,namedim,lendim)
-             IF (lendim .NE. jjm) THEN
-                abort_message='dimension LATV different from jjm in v.nc'
-                CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-
-        endif
-
-! Temperature
-         if (guide_T) then
-             rcode = nf90_open('T.nc', nf90_nowrite, ncidt)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no file T.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             rcode = nf90_inq_varid(ncidt, 'AIR', varidt)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no AIR variable in file T.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             write(*,*),trim(modname)//' ncidT,varidT',ncidt,varidt
-             if (ncidpl.eq.-99) ncidpl=ncidt
-
-             status=NF90_INQ_DIMID(ncidt, "LONV", dimid)
-             status=NF90_INQUIRE_DIMENSION(ncidt,dimid,namedim,lendim)
-             IF (lendim .NE. iip1) THEN
-                abort_message='dimension LONV different from iip1 in T.nc'
-                CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-
-             status=NF90_INQ_DIMID(ncidt, "LATU", dimid)
-             status=NF90_INQUIRE_DIMENSION(ncidt,dimid,namedim,lendim)
-             IF (lendim .NE. jjp1) THEN
-                abort_message='dimension LATU different from jjp1 in T.nc'
-                CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-
-         endif
-
-! Humidite
-         if (guide_Q) then
-             rcode = nf90_open('hur.nc', nf90_nowrite, ncidQ)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no file hur.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             rcode = nf90_inq_varid(ncidQ, 'RH', varidQ)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no RH variable in file hur.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             write(*,*),trim(modname)//' ncidQ,varidQ',ncidQ,varidQ
-             if (ncidpl.eq.-99) ncidpl=ncidQ
-
-
-             status=NF90_INQ_DIMID(ncidQ, "LONV", dimid)
-             status=NF90_INQUIRE_DIMENSION(ncidQ,dimid,namedim,lendim)
-             IF (lendim .NE. iip1) THEN
-                abort_message='dimension LONV different from iip1 in hur.nc'
-                CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-
-             status=NF90_INQ_DIMID(ncidQ, "LATU", dimid)
-             status=NF90_INQUIRE_DIMENSION(ncidQ,dimid,namedim,lendim)
-             IF (lendim .NE. jjp1) THEN
-                abort_message='dimension LATU different from jjp1 in hur.nc'
-                CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-
-
-         endif
-! Pression de surface
-         if ((guide_P).OR.(guide_plevs.EQ.1)) then
-             rcode = nf90_open('ps.nc', nf90_nowrite, ncidps)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no file ps.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             rcode = nf90_inq_varid(ncidps, 'SP', varidps)
-             IF (rcode.NE.NF_NOERR) THEN
-              abort_message='Nudging: error -> no SP variable in file ps.nc'
-              CALL abort_gcm(modname,abort_message,1)
-             ENDIF
-             write(*,*),trim(modname)//' ncidps,varidps',ncidps,varidps
-         endif
-! Coordonnee verticale
-         if (guide_plevs.EQ.0) then
-              rcode = nf90_inq_varid(ncidpl, 'LEVEL', varidpl)
-              IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl, 'PRESSURE', varidpl)
-              write(*,*),trim(modname)//' ncidpl,varidpl',ncidpl,varidpl
-         endif
-! Coefs ap, bp pour calcul de la pression aux differents niveaux
-         IF (guide_plevs.EQ.1) THEN
-             status = nf90_put_var(ncidpl, varidap, apnc, [1], [nlevnc])
-             status = nf90_put_var(ncidpl, varidbp, bpnc, [1], [nlevnc])
-         ELSEIF (guide_plevs.EQ.0) THEN
-             status = nf90_put_var(ncidpl, varidpl, apnc, [1], [nlevnc])
-!FC Pour les corrections la pression est deja en Pascals on commente la ligne ci-dessous
-             IF(convert_Pa) apnc=apnc*100.! conversion en Pascals
-             bpnc(:)=0.
-         ENDIF
-         first=.FALSE.
-     ENDIF ! (first)
-
-! -----------------------------------------------------------------
-!   lecture des champs u, v, T, Q, ps
-! -----------------------------------------------------------------
-
-!  dimensions pour les champs scalaires et le vent zonal
-     start(1)=1
-     start(2)=jjb_u
-     start(3)=1
-     start(4)=timestep
-
-     count(1)=iip1
-     count(2)=jjnb_u
-     count(3)=nlevnc
-     count(4)=1
-
-     IF (invert_y) start(2)=jjp1-jje_u+1
-! Pression
-     if (guide_plevs.EQ.2) then
-         status = nf90_put_var(ncidp, varidp, pnat2, start, count)
-         IF (invert_y) THEN
-!           PRINT*,"Invertion impossible actuellement"
-!           CALL abort_gcm(modname,abort_message,1)
-           CALL invert_lat(iip1,jjnb_u,nlevnc,pnat2)
-         ENDIF
-     endif
-
-!  Vent zonal
-     if (guide_u) then
-         status = nf90_put_var(ncidu, varidu, unat2, start, count)
-         IF (invert_y) THEN
-!           PRINT*,"Invertion impossible actuellement"
-!           CALL abort_gcm(modname,abort_message,1)
-           CALL invert_lat(iip1,jjnb_u,nlevnc,unat2)
-         ENDIF
-
-     endif
-
-
-!  Temperature
-     if (guide_T) then
-         status = nf90_put_var(ncidt, varidt, tnat2, start, count)
-         IF (invert_y) THEN
-!           PRINT*,"Invertion impossible actuellement"
-!           CALL abort_gcm(modname,abort_message,1)
-           CALL invert_lat(iip1,jjnb_u,nlevnc,tnat2)
-         ENDIF
-     endif
-
-!  Humidite
-     if (guide_Q) then
-         status = nf90_put_var(ncidQ, varidQ, qnat2, start, count)
-         IF (invert_y) THEN
-!           PRINT*,"Invertion impossible actuellement"
-!           CALL abort_gcm(modname,abort_message,1)
-           CALL invert_lat(iip1,jjnb_u,nlevnc,qnat2)
-         ENDIF
-
-     endif
-
-!  Vent meridien
-     if (guide_v) then
-         start(2)=jjb_v
-         count(2)=jjnb_v
-         IF (invert_y) start(2)=jjm-jje_v+1
-         status = nf90_put_var(ncidv, varidv, vnat2, start, count)
-         IF (invert_y) THEN
-!           PRINT*,"Invertion impossible actuellement"
-!           CALL abort_gcm(modname,abort_message,1)
-           CALL invert_lat(iip1,jjnb_v,nlevnc,vnat2)
-         ENDIF
-     endif
-
-!  Pression de surface
-     if ((guide_P).OR.(guide_plevs.EQ.1))  then
-         start(2)=jjb_u
-         start(3)=timestep
-         start(4)=0
-         count(2)=jjnb_u
-         count(3)=1
-         count(4)=0
-         IF (invert_y) start(2)=jjp1-jje_u+1
-         status = nf90_put_var(ncidps, varidps, psnat2, start, count)
-         IF (invert_y) THEN
-!           PRINT*,"Invertion impossible actuellement"
-!           CALL abort_gcm(modname,abort_message,1)
-           CALL invert_lat(iip1,jjnb_u,1,psnat2)
-         ENDIF
-     endif
-
-  END SUBROUTINE guide_read
-
-!=======================================================================
-  SUBROUTINE guide_read2D(timestep)
-    USE netcdf, ONLY: nf90_put_var
-    IMPLICIT NONE
-
-    include "netcdf.inc"
-    include "dimensions.h"
-    include "paramet.h"
-
-    INTEGER, INTENT(IN)   :: timestep
-
-    LOGICAL, SAVE         :: first=.TRUE.
-! Identification fichiers et variables NetCDF:
-    INTEGER, SAVE         :: ncidu,varidu,ncidv,varidv,ncidp,varidp
-    INTEGER, SAVE         :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps
-    INTEGER               :: ncidpl,varidpl,varidap,varidbp
-! Variables auxiliaires NetCDF:
-    INTEGER, DIMENSION(4) :: start,count
-    INTEGER               :: status,rcode
-! Variables for 3D extension:
-    REAL, DIMENSION (jjb_u:jje_u,llm)  :: zu
-    REAL, DIMENSION (jjb_v:jje_v,llm)  :: zv
-    INTEGER               :: i
-    CHARACTER (len = 80)   :: abort_message
-    CHARACTER (len = 20)   :: modname = 'guide_read2D'
-    abort_message='pb in guide_read2D'
-
-! -----------------------------------------------------------------
-! Premier appel: initialisation de la lecture des fichiers
-! -----------------------------------------------------------------
-    if (first) then
-         ncidpl=-99
-         write(*,*)trim(modname)//' : opening nudging files '
-! Ap et Bp si niveaux de pression hybrides
-         if (guide_plevs.EQ.1) then
-           write(*,*)trim(modname)//' Reading nudging on model levels'
-           rcode = nf90_open('apbp.nc', nf90_nowrite, ncidpl)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no file apbp.nc'
-           CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           rcode = nf90_inq_varid(ncidpl, 'AP', varidap)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no AP variable in file apbp.nc'
-           CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           rcode = nf90_inq_varid(ncidpl, 'BP', varidbp)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no BP variable in file apbp.nc'
-             CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           write(*,*)trim(modname)//'ncidpl,varidap',ncidpl,varidap
-         endif
-! Pression
-         if (guide_plevs.EQ.2) then
-           rcode = nf90_open('P.nc', nf90_nowrite, ncidp)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no file P.nc'
-             CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           rcode = nf90_inq_varid(ncidp, 'PRES', varidp)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no PRES variable in file P.nc'
-             CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           write(*,*)trim(modname)//' ncidp,varidp',ncidp,varidp
-           if (ncidpl.eq.-99) ncidpl=ncidp
-         endif
-! Vent zonal
-         if (guide_u) then
-           rcode = nf90_open('u.nc', nf90_nowrite, ncidu)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no file u.nc'
-             CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           rcode = nf90_inq_varid(ncidu, 'UWND', varidu)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no UWND variable in file u.nc'
-             CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           write(*,*)trim(modname)//' ncidu,varidu',ncidu,varidu
-           if (ncidpl.eq.-99) ncidpl=ncidu
-         endif
-
-! Vent meridien
-         if (guide_v) then
-           rcode = nf90_open('v.nc', nf90_nowrite, ncidv)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no file v.nc'
-             CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           rcode = nf90_inq_varid(ncidv, 'VWND', varidv)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no VWND variable in file v.nc'
-             CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           write(*,*)trim(modname)//' ncidv,varidv',ncidv,varidv
-           if (ncidpl.eq.-99) ncidpl=ncidv
-        endif
-! Temperature
-         if (guide_T) then
-           rcode = nf90_open('T.nc', nf90_nowrite, ncidt)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no file T.nc'
-             CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           rcode = nf90_inq_varid(ncidt, 'AIR', varidt)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no AIR variable in file T.nc'
-             CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           write(*,*)trim(modname)//' ncidT,varidT',ncidt,varidt
-           if (ncidpl.eq.-99) ncidpl=ncidt
-         endif
-! Humidite
-         if (guide_Q) then
-           rcode = nf90_open('hur.nc', nf90_nowrite, ncidQ)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no file hur.nc'
-             CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           rcode = nf90_inq_varid(ncidQ, 'RH', varidQ)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no RH,variable in file hur.nc'
-             CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           write(*,*)trim(modname)//' ncidQ,varidQ',ncidQ,varidQ
-           if (ncidpl.eq.-99) ncidpl=ncidQ
-         endif
-! Pression de surface
-         if ((guide_P).OR.(guide_plevs.EQ.1)) then
-           rcode = nf90_open('ps.nc', nf90_nowrite, ncidps)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no file ps.nc'
-             CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           rcode = nf90_inq_varid(ncidps, 'SP', varidps)
-           IF (rcode.NE.NF_NOERR) THEN
-             abort_message='Nudging: error -> no SP variable in file ps.nc'
-             CALL abort_gcm(modname,abort_message,1)
-           ENDIF
-           write(*,*)trim(modname)//' ncidps,varidps',ncidps,varidps
-         endif
-! Coordonnee verticale
-         if (guide_plevs.EQ.0) then
-           rcode = nf90_inq_varid(ncidpl, 'LEVEL', varidpl)
-           IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl, 'PRESSURE', varidpl)
-           write(*,*)trim(modname)//' ncidpl,varidpl',ncidpl,varidpl
-         endif
-! Coefs ap, bp pour calcul de la pression aux differents niveaux
-         if (guide_plevs.EQ.1) then
-             status = nf90_put_var(ncidpl, varidap, apnc, [1], [nlevnc])
-             status = nf90_put_var(ncidpl, varidbp, bpnc, [1], [nlevnc])
-         elseif (guide_plevs.EQ.0) THEN
-             status = nf90_put_var(ncidpl, varidpl, apnc, [1], [nlevnc])
-             apnc=apnc*100.! conversion en Pascals
-             bpnc(:)=0.
-         endif
-         first=.FALSE.
-     endif ! (first)
-
-! -----------------------------------------------------------------
-!   lecture des champs u, v, T, Q, ps
-! -----------------------------------------------------------------
-
-!  dimensions pour les champs scalaires et le vent zonal
-     start(1)=1
-     start(2)=jjb_u
-     start(3)=1
-     start(4)=timestep
-
-     count(1)=1
-     count(2)=jjnb_u
-     count(3)=nlevnc
-     count(4)=1
-
-     IF (invert_y) start(2)=jjp1-jje_u+1
-!  Pression
-     if (guide_plevs.EQ.2) then
-         status = nf90_put_var(ncidp, varidp, zu, start, count)
-         DO i=1,iip1
-             pnat2(i,:,:)=zu(:,:)
-         ENDDO
-
-         IF (invert_y) THEN
-!           PRINT*,"Invertion impossible actuellement"
-!           CALL abort_gcm(modname,abort_message,1)
-           CALL invert_lat(iip1,jjnb_u,nlevnc,pnat2)
-         ENDIF
-     endif
-!  Vent zonal
-     if (guide_u) then
-         status = nf90_put_var(ncidu, varidu, zu, start, count)
-         DO i=1,iip1
-             unat2(i,:,:)=zu(:,:)
-         ENDDO
-
-         IF (invert_y) THEN
-!           PRINT*,"Invertion impossible actuellement"
-!           CALL abort_gcm(modname,abort_message,1)
-           CALL invert_lat(iip1,jjnb_u,nlevnc,unat2)
-         ENDIF
-     endif
-
-
-!  Temperature
-     if (guide_T) then
-         status = nf90_put_var(ncidt, varidt, zu, start, count)
-         DO i=1,iip1
-             tnat2(i,:,:)=zu(:,:)
-         ENDDO
-
-         IF (invert_y) THEN
-!           PRINT*,"Invertion impossible actuellement"
-!           CALL abort_gcm(modname,abort_message,1)
-           CALL invert_lat(iip1,jjnb_u,nlevnc,tnat2)
-         ENDIF
-     endif
-
-!  Humidite
-     if (guide_Q) then
-         status = nf90_put_var(ncidQ, varidQ, zu, start, count)
-         DO i=1,iip1
-             qnat2(i,:,:)=zu(:,:)
-         ENDDO
-
-         IF (invert_y) THEN
-!           PRINT*,"Invertion impossible actuellement"
-!           CALL abort_gcm(modname,abort_message,1)
-           CALL invert_lat(iip1,jjnb_u,nlevnc,qnat2)
-         ENDIF
-     endif
-
-!  Vent meridien
-     if (guide_v) then
-         start(2)=jjb_v
-         count(2)=jjnb_v
-         IF (invert_y) start(2)=jjm-jje_v+1
-         status = nf90_put_var(ncidv, varidv, zv, start, count)
-         DO i=1,iip1
-             vnat2(i,:,:)=zv(:,:)
-         ENDDO
-
-         IF (invert_y) THEN
-
-!           PRINT*,"Invertion impossible actuellement"
-!           CALL abort_gcm(modname,abort_message,1)
-           CALL invert_lat(iip1,jjnb_v,nlevnc,vnat2)
-         ENDIF
-     endif
-
-!  Pression de surface
-     if ((guide_P).OR.(guide_plevs.EQ.1))  then
-         start(2)=jjb_u
-         start(3)=timestep
-         start(4)=0
-         count(2)=jjnb_u
-         count(3)=1
-         count(4)=0
-         IF (invert_y) start(2)=jjp1-jje_u+1
-         status = nf90_put_var(ncidps, varidps, zu(:, 1), start, count)
-         DO i=1,iip1
-             psnat2(i,:)=zu(:,1)
-         ENDDO
-
-         IF (invert_y) THEN
-!           PRINT*,"Invertion impossible actuellement"
-!           CALL abort_gcm(modname,abort_message,1)
-           CALL invert_lat(iip1,jjnb_u,1,psnat2)
-         ENDIF
-     endif
-
-  END SUBROUTINE guide_read2D
-
-!=======================================================================
-  SUBROUTINE guide_out(varname,hsize,vsize,field_loc,factt)
-    USE parallel_lmdz
-    USE mod_hallo, ONLY : gather_field_u, gather_field_v
-    USE comconst_mod, ONLY: pi
-    USE comvert_mod, ONLY: presnivs
-    use netcdf95, only: nf95_def_var, nf95_put_var
-    use netcdf, only: nf90_float, nf90_put_var
-
-    IMPLICIT NONE
-
-    INCLUDE "dimensions.h"
-    INCLUDE "paramet.h"
-    INCLUDE "netcdf.inc"
-    INCLUDE "comgeom2.h"
-
-    ! Variables entree
-    CHARACTER*(*), INTENT(IN)                      :: varname
-    INTEGER,   INTENT (IN)                         :: hsize,vsize
-!   REAL, DIMENSION (iip1,hsize,vsize), INTENT(IN) :: field_loc
-    REAL, DIMENSION (:,:), INTENT(IN) :: field_loc
-    REAL factt
-
-    ! Variables locales
-    INTEGER, SAVE :: timestep=0
-    ! Identites fichier netcdf
-    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, 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), zt(iip1, jjp1), zq(iip1, jjp1)
-    REAL, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: field_glo
-    CHARACTER(LEN=20),PARAMETER :: modname="guide_out"
-
-!$OMP MASTER
-    ALLOCATE(field_glo(iip1,hsize,vsize))
-!$OMP END MASTER
-!$OMP BARRIER
-
-!    write(*,*)trim(modname)//' after allocation ',hsize,vsize
-
-    IF (hsize==jjp1) THEN
-        CALL gather_field_u(field_loc,field_glo,vsize)
-    ELSE IF (hsize==jjm) THEN
-       CALL gather_field_v(field_loc,field_glo, vsize)
-    ENDIF
-
-!    write(*,*)trim(modname)//' after 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)
-
-    IF (mpi_rank >  0) THEN
-!$OMP MASTER
-       DEALLOCATE(field_glo)
-!$OMP END MASTER
-!$OMP BARRIER
-
-       RETURN
-    ENDIF
-
-!$OMP MASTER
-    IF (timestep.EQ.0) THEN
-! ----------------------------------------------
-! initialisation fichier de sortie
-! ----------------------------------------------
-! Ouverture du fichier
-        ierr=NF_CREATE("guide_ins.nc",IOR(NF_CLOBBER,NF_64BIT_OFFSET),nid)
-! Definition des dimensions
-        ierr=NF_DEF_DIM(nid,"LONU",iip1,id_lonu)
-        ierr=NF_DEF_DIM(nid,"LONV",iip1,id_lonv)
-        ierr=NF_DEF_DIM(nid,"LATU",jjp1,id_latu)
-        ierr=NF_DEF_DIM(nid,"LATV",jjm,id_latv)
-        ierr=NF_DEF_DIM(nid,"LEVEL",llm,id_lev)
-        ierr=NF_DEF_DIM(nid,"TIME",NF_UNLIMITED,id_tim)
-
-! Creation des variables dimensions
-        ierr=NF_DEF_VAR(nid,"LONU",NF_FLOAT,1,id_lonu,vid_lonu)
-        ierr=NF_DEF_VAR(nid,"LONV",NF_FLOAT,1,id_lonv,vid_lonv)
-        ierr=NF_DEF_VAR(nid,"LATU",NF_FLOAT,1,id_latu,vid_latu)
-        ierr=NF_DEF_VAR(nid,"LATV",NF_FLOAT,1,id_latv,vid_latv)
-        ierr=NF_DEF_VAR(nid,"LEVEL",NF_FLOAT,1,id_lev,vid_lev)
-        ierr=NF_DEF_VAR(nid,"cu",NF_FLOAT,2,(/id_lonu,id_latu/),vid_cu)
-        ierr=NF_DEF_VAR(nid,"cv",NF_FLOAT,2,(/id_lonv,id_latv/),vid_cv)
-        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)
-
-! Enregistrement des variables dimensions
-        ierr = nf90_put_var(nid, vid_lonu, rlonu * 180. / pi)
-        ierr = nf90_put_var(nid, vid_lonv, rlonv * 180. / pi)
-        ierr = nf90_put_var(nid, vid_latu, rlatu * 180. / pi)
-        ierr = nf90_put_var(nid, vid_latv, rlatv * 180. / pi)
-        ierr = nf90_put_var(nid, vid_lev, presnivs)
-        ierr = nf90_put_var(nid, vid_cu, cu)
-        ierr = nf90_put_var(nid, vid_cv, cv)
-        ierr = nf90_put_var(nid, vid_au, zu)
-        ierr = nf90_put_var(nid, vid_av, zv)
-        call nf95_put_var(nid, varid_alpha_t, zt)
-        call nf95_put_var(nid, varid_alpha_q, zq)
-! --------------------------------------------------------------------
-! Cr�ation des variables sauvegard�es
-! --------------------------------------------------------------------
-        ierr = NF_REDEF(nid)
-! Pressure (GCM)
-        dim4=(/id_lonv,id_latu,id_lev,id_tim/)
-        ierr = NF_DEF_VAR(nid,"SP",NF_FLOAT,4,dim4,varid)
-! Surface pressure (guidage)
-        IF (guide_P) THEN
-            dim3=(/id_lonv,id_latu,id_tim/)
-            ierr = NF_DEF_VAR(nid,"ps",NF_FLOAT,3,dim3,varid)
-        ENDIF
-! Zonal wind
-        IF (guide_u) THEN
-            dim4=(/id_lonu,id_latu,id_lev,id_tim/)
-            ierr = NF_DEF_VAR(nid,"u",NF_FLOAT,4,dim4,varid)
-            ierr = NF_DEF_VAR(nid,"ua",NF_FLOAT,4,dim4,varid)
-            ierr = NF_DEF_VAR(nid,"ucov",NF_FLOAT,4,dim4,varid)
-        ENDIF
-! Merid. wind
-        IF (guide_v) THEN
-            dim4=(/id_lonv,id_latv,id_lev,id_tim/)
-            ierr = NF_DEF_VAR(nid,"v",NF_FLOAT,4,dim4,varid)
-            ierr = NF_DEF_VAR(nid,"va",NF_FLOAT,4,dim4,varid)
-            ierr = NF_DEF_VAR(nid,"vcov",NF_FLOAT,4,dim4,varid)
-        ENDIF
-! Pot. Temperature
-        IF (guide_T) THEN
-            dim4=(/id_lonv,id_latu,id_lev,id_tim/)
-            ierr = NF_DEF_VAR(nid,"teta",NF_FLOAT,4,dim4,varid)
-        ENDIF
-! Specific Humidity
-        IF (guide_Q) THEN
-            dim4=(/id_lonv,id_latu,id_lev,id_tim/)
-            ierr = NF_DEF_VAR(nid,"q",NF_FLOAT,4,dim4,varid)
-        ENDIF
-
-        ierr = NF_ENDDEF(nid)
-        ierr = NF_CLOSE(nid)
-    ENDIF ! timestep=0
-
-! --------------------------------------------------------------------
-! Enregistrement du champ
-! --------------------------------------------------------------------
-
-    ierr=NF_OPEN("guide_ins.nc",NF_WRITE,nid)
-
-    IF (varname=="SP") timestep=timestep+1
-
-    ierr = NF_INQ_VARID(nid,varname,varid)
-    SELECT CASE (varname)
-    CASE ("SP","ps")
-        start=(/1,1,1,timestep/)
-        count=(/iip1,jjp1,llm,1/)
-    CASE ("v","va","vcov")
-        start=(/1,1,1,timestep/)
-        count=(/iip1,jjm,llm,1/)
-    CASE DEFAULT
-        start=(/1,1,1,timestep/)
-        count=(/iip1,jjp1,llm,1/)
-    END SELECT
-
-!$OMP END MASTER
-!$OMP BARRIER
-
-    SELECT CASE (varname)
-
-    CASE("u","ua")
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-        DO l=1,llm
-            field_glo(:,2:jjm,l)=field_glo(:,2:jjm,l)/cu(:,2:jjm)
-            field_glo(:,1,l)=0. ; field_glo(:,jjp1,l)=0.
-        ENDDO
-    CASE("v","va")
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-        DO l=1,llm
-           field_glo(:,:,l)=field_glo(:,:,l)/cv(:,:)
-        ENDDO
-    END SELECT
-
-!    if (varname=="ua") then
-!    call dump2d(iip1,jjp1,field_glo,'ua gui1 1ere couche ')
-!    call dump2d(iip1,jjp1,field_glo(:,:,llm),'ua gui1 llm ')
-!    endif
-
-!$OMP MASTER
-
-    ierr = nf90_put_var(nid, varid, field_glo, start, count)
-    ierr = NF_CLOSE(nid)
-
-       DEALLOCATE(field_glo)
-!$OMP END MASTER
-!$OMP BARRIER
-
-  END SUBROUTINE guide_out
-
-
-!===========================================================================
-  subroutine correctbid(iim,nl,x)
-    integer iim,nl
-    real x(iim+1,nl)
-    integer i,l
-    real zz
-
-    do l=1,nl
-        do i=2,iim-1
-            if(abs(x(i,l)).gt.1.e10) then
-               zz=0.5*(x(i-1,l)+x(i+1,l))
-              print*,'correction ',i,l,x(i,l),zz
-               x(i,l)=zz
-            endif
-         enddo
-     enddo
-     return
-  end subroutine correctbid
-
-
-!====================================================================
-! Ascii debug output. Could be reactivated
-!====================================================================
-
-subroutine dump2du(var,varname)
-use parallel_lmdz
-use mod_hallo
-implicit none
-include 'dimensions.h'
-include 'paramet.h'
-
-      CHARACTER (len=*) :: varname
-
-
-real, dimension(ijb_u:ije_u) :: var
-
-real, dimension(ip1jmp1) :: var_glob
-
-    RETURN
-
-    call barrier
-    CALL Gather_field_u(var,var_glob,1)
-    call barrier
-
-    if (mpi_rank==0) then
-       call dump2d(iip1,jjp1,var_glob,varname)
-    endif
-
-    call barrier
-
-    return
-    end subroutine dump2du
-
-!====================================================================
-! Ascii debug output. Could be reactivated
-!====================================================================
-subroutine dumpall
-     implicit none
-     include "dimensions.h"
-     include "paramet.h"
-     include "comgeom.h"
-     call barrier
-     call dump2du(alpha_u(ijb_u:ije_u),'  alpha_u couche 1')
-     call dump2du(unat2(:,jjbu:jjeu,nlevnc),'  unat2 couche nlevnc')
-     call dump2du(ugui1(ijb_u:ije_u,1)*sqrt(unscu2(ijb_u:ije_u)),'  ugui1 couche 1')
-     return
-end subroutine dumpall
-
-!===========================================================================
-END MODULE guide_loc_mod
Index: LMDZ6/trunk/libf/dyn3dmem/guide_loc_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/guide_loc_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/guide_loc_mod.f90	(revision 5268)
@@ -0,0 +1,2440 @@
+!
+! $Id$
+!
+MODULE guide_loc_mod
+
+!=======================================================================
+!   Auteur:  F.Hourdin
+!            F. Codron 01/09
+!=======================================================================
+
+  USE getparam, only: ini_getparam, fin_getparam, getpar
+  USE Write_Field_loc
+  use netcdf, only: nf90_nowrite, nf90_open, nf90_inq_varid, nf90_close, &
+                    nf90_inq_dimid, nf90_inquire_dimension
+  USE parallel_lmdz
+  USE pres2lev_mod, only: pres2lev
+
+  IMPLICIT NONE
+
+! ---------------------------------------------
+! Declarations des cles logiques et parametres
+! ---------------------------------------------
+  INTEGER, PRIVATE, SAVE  :: iguide_read,iguide_int,iguide_sav
+  INTEGER, PRIVATE, SAVE  :: nlevnc, guide_plevs
+  LOGICAL, PRIVATE, SAVE  :: guide_u,guide_v,guide_T,guide_Q,guide_P
+  LOGICAL, PRIVATE, SAVE  :: guide_hr,guide_teta
+  LOGICAL, PRIVATE, SAVE  :: guide_BL,guide_reg,guide_add,gamma4,guide_zon
+  LOGICAL, PRIVATE, SAVE  :: invert_p,invert_y,ini_anal
+  LOGICAL, PRIVATE, SAVE  :: guide_2D,guide_sav,guide_modele
+!FC
+  LOGICAL, PRIVATE, SAVE  :: convert_Pa
+
+  REAL, PRIVATE, SAVE     :: tau_min_u,tau_max_u
+  REAL, PRIVATE, SAVE     :: tau_min_v,tau_max_v
+  REAL, PRIVATE, SAVE     :: tau_min_T,tau_max_T
+  REAL, PRIVATE, SAVE     :: tau_min_Q,tau_max_Q
+  REAL, PRIVATE, SAVE     :: tau_min_P,tau_max_P
+
+  REAL, PRIVATE, SAVE     :: lat_min_g,lat_max_g
+  REAL, PRIVATE, SAVE     :: lon_min_g,lon_max_g
+  REAL, PRIVATE, SAVE     :: tau_lon,tau_lat
+
+  REAL, PRIVATE, SAVE     :: plim_guide_BL
+
+  REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE     :: alpha_u,alpha_v
+  REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE     :: alpha_T,alpha_Q
+  REAL, ALLOCATABLE, DIMENSION(:), PRIVATE, SAVE     :: alpha_P,alpha_pcor
+
+! ---------------------------------------------
+! Variables de guidage
+! ---------------------------------------------
+! Variables des fichiers de guidage
+  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: unat1,unat2
+  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: vnat1,vnat2
+  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: tnat1,tnat2
+  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: qnat1,qnat2
+  REAL, ALLOCATABLE, DIMENSION(:,:,:), PRIVATE, SAVE   :: pnat1,pnat2
+  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: psnat1,psnat2
+  REAL, ALLOCATABLE, DIMENSION(:),     PRIVATE, SAVE   :: apnc,bpnc
+! Variables aux dimensions du modele
+  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: ugui1,ugui2
+  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: vgui1,vgui2
+  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: tgui1,tgui2
+  REAL, ALLOCATABLE, DIMENSION(:,:),   PRIVATE, SAVE   :: qgui1,qgui2
+  REAL, ALLOCATABLE, DIMENSION(:),   PRIVATE, SAVE   :: psgui1,psgui2
+
+  INTEGER,SAVE,PRIVATE :: ijbu,ijbv,ijeu,ijev !,ijnu,ijnv
+  INTEGER,SAVE,PRIVATE :: jjbu,jjbv,jjeu,jjev,jjnu,jjnv
+
+
+CONTAINS
+!=======================================================================
+
+  SUBROUTINE guide_init
+
+    USE control_mod, ONLY: day_step
+    USE serre_mod, ONLY: grossismx
+
+    IMPLICIT NONE
+
+    INCLUDE "dimensions.h"
+    INCLUDE "paramet.h"
+    INCLUDE "netcdf.inc"
+
+    INTEGER                :: error,ncidpl,rid,rcod
+    CHARACTER (len = 80)   :: abort_message
+    CHARACTER (len = 20)   :: modname = 'guide_init'
+    CHARACTER (len = 20)   :: namedim
+
+! ---------------------------------------------
+! Lecture des parametres:
+! ---------------------------------------------
+    call ini_getparam("nudging_parameters_out.txt")
+! Variables guidees
+    CALL getpar('guide_u',.true.,guide_u,'guidage de u')
+    CALL getpar('guide_v',.true.,guide_v,'guidage de v')
+    CALL getpar('guide_T',.true.,guide_T,'guidage de T')
+    CALL getpar('guide_P',.true.,guide_P,'guidage de P')
+    CALL getpar('guide_Q',.true.,guide_Q,'guidage de Q')
+    CALL getpar('guide_hr',.true.,guide_hr,'guidage de Q par H.R')
+    CALL getpar('guide_teta',.false.,guide_teta,'guidage de T par Teta')
+
+    CALL getpar('guide_add',.false.,guide_add,'for�age constant?')
+    CALL getpar('guide_zon',.false.,guide_zon,'guidage moy zonale')
+    if (guide_zon .and. abs(grossismx - 1.) > 0.01) &
+         call abort_gcm("guide_init", &
+         "zonal nudging requires grid regular in longitude", 1)
+
+!   Constantes de rappel. Unite : fraction de jour
+    CALL getpar('tau_min_u',0.02,tau_min_u,'Cste de rappel min, u')
+    CALL getpar('tau_max_u', 10.,tau_max_u,'Cste de rappel max, u')
+    CALL getpar('tau_min_v',0.02,tau_min_v,'Cste de rappel min, v')
+    CALL getpar('tau_max_v', 10.,tau_max_v,'Cste de rappel max, v')
+    CALL getpar('tau_min_T',0.02,tau_min_T,'Cste de rappel min, T')
+    CALL getpar('tau_max_T', 10.,tau_max_T,'Cste de rappel max, T')
+    CALL getpar('tau_min_Q',0.02,tau_min_Q,'Cste de rappel min, Q')
+    CALL getpar('tau_max_Q', 10.,tau_max_Q,'Cste de rappel max, Q')
+    CALL getpar('tau_min_P',0.02,tau_min_P,'Cste de rappel min, P')
+    CALL getpar('tau_max_P', 10.,tau_max_P,'Cste de rappel max, P')
+    CALL getpar('gamma4',.false.,gamma4,'Zone sans rappel elargie')
+    CALL getpar('guide_BL',.true.,guide_BL,'guidage dans C.Lim')
+    CALL getpar('plim_guide_BL',85000.,plim_guide_BL,'BL top presnivs value')
+
+! Sauvegarde du for�age
+    CALL getpar('guide_sav',.false.,guide_sav,'sauvegarde guidage')
+    CALL getpar('iguide_sav',4,iguide_sav,'freq. sauvegarde guidage')
+    ! frequences f>0: fx/jour; f<0: tous les f jours; f=0: 1 seule fois.
+    IF (iguide_sav.GT.0) THEN
+       iguide_sav=day_step/iguide_sav
+    ELSE if (iguide_sav == 0) then
+       iguide_sav = huge(0)
+    ELSE
+       iguide_sav=day_step*iguide_sav
+    ENDIF
+
+! Guidage regional seulement (sinon constant ou suivant le zoom)
+    CALL getpar('guide_reg',.false.,guide_reg,'guidage regional')
+    CALL getpar('lat_min_g',-90.,lat_min_g,'Latitude mini guidage ')
+    CALL getpar('lat_max_g', 90.,lat_max_g,'Latitude maxi guidage ')
+    CALL getpar('lon_min_g',-180.,lon_min_g,'longitude mini guidage ')
+    CALL getpar('lon_max_g', 180.,lon_max_g,'longitude maxi guidage ')
+    CALL getpar('tau_lat', 5.,tau_lat,'raideur lat guide regional ')
+    CALL getpar('tau_lon', 5.,tau_lon,'raideur lon guide regional ')
+
+! Parametres pour lecture des fichiers
+    CALL getpar('iguide_read',4,iguide_read,'freq. lecture guidage')
+    CALL getpar('iguide_int',4,iguide_int,'freq. interpolation vert')
+    IF (iguide_int.EQ.0) THEN
+        iguide_int=1
+    ELSEIF (iguide_int.GT.0) THEN
+        iguide_int=day_step/iguide_int
+    ELSE
+        iguide_int=day_step*iguide_int
+    ENDIF
+    CALL getpar('guide_plevs',0,guide_plevs,'niveaux pression fichiers guidage')
+    ! Pour compatibilite avec ancienne version avec guide_modele
+    CALL getpar('guide_modele',.false.,guide_modele,'niveaux pression ap+bp*psol')
+    IF (guide_modele) THEN
+        guide_plevs=1
+    ENDIF
+!FC
+    CALL getpar('convert_Pa',.true.,convert_Pa,'Convert Pressure levels in Pa')
+    ! Fin raccord
+    CALL getpar('ini_anal',.false.,ini_anal,'Etat initial = analyse')
+    CALL getpar('guide_invertp',.true.,invert_p,'niveaux p inverses')
+    CALL getpar('guide_inverty',.true.,invert_y,'inversion N-S')
+    CALL getpar('guide_2D',.false.,guide_2D,'fichier guidage lat-P')
+
+    call fin_getparam
+
+! ---------------------------------------------
+! Determination du nombre de niveaux verticaux
+! des fichiers guidage
+! ---------------------------------------------
+    ncidpl=-99
+    if (guide_plevs.EQ.1) then
+       if (ncidpl.eq.-99) then
+          rcod=nf90_open('apbp.nc',Nf90_NOWRITe, ncidpl)
+          if (rcod.NE.NF_NOERR) THEN
+             abort_message=' Nudging error -> no file apbp.nc'
+             CALL abort_gcm(modname,abort_message,1)
+          endif
+       endif
+    elseif (guide_plevs.EQ.2) then
+       if (ncidpl.EQ.-99) then
+          rcod=nf90_open('P.nc',Nf90_NOWRITe,ncidpl)
+          if (rcod.NE.NF_NOERR) THEN
+             abort_message=' Nudging error -> no file P.nc'
+             CALL abort_gcm(modname,abort_message,1)
+          endif
+       endif
+
+    elseif (guide_u) then
+       if (ncidpl.eq.-99) then
+          rcod=nf90_open('u.nc',Nf90_NOWRITe,ncidpl)
+          if (rcod.NE.NF_NOERR) THEN
+             abort_message=' Nudging error -> no file u.nc'
+             CALL abort_gcm(modname,abort_message,1)
+          endif
+
+       endif
+
+
+    elseif (guide_v) then
+       if (ncidpl.eq.-99) then
+          rcod=nf90_open('v.nc',nf90_nowrite,ncidpl)
+          if (rcod.NE.NF_NOERR) THEN
+             abort_message=' Nudging error -> no file v.nc'
+             CALL abort_gcm(modname,abort_message,1)
+          endif
+       endif
+
+
+    elseif (guide_T) then
+       if (ncidpl.eq.-99) then
+          rcod=nf90_open('T.nc',nf90_nowrite,ncidpl)
+          if (rcod.NE.NF_NOERR) THEN
+             abort_message=' Nudging error -> no file T.nc'
+             CALL abort_gcm(modname,abort_message,1)
+          endif
+       endif
+
+
+
+    elseif (guide_Q) then
+       if (ncidpl.eq.-99) then
+          rcod=nf90_open('hur.nc',nf90_nowrite, ncidpl)
+          if (rcod.NE.NF_NOERR) THEN
+             abort_message=' Nudging error -> no file hur.nc'
+             CALL abort_gcm(modname,abort_message,1)
+          endif
+       endif
+
+
+    endif
+    error=NF_INQ_DIMID(ncidpl,'LEVEL',rid)
+    IF (error.NE.NF_NOERR) error=NF_INQ_DIMID(ncidpl,'PRESSURE',rid)
+    IF (error.NE.NF_NOERR) THEN
+        abort_message='Nudging: error reading pressure levels'
+        CALL abort_gcm(modname,abort_message,1)
+    ENDIF
+    error=NF_INQ_DIMLEN(ncidpl,rid,nlevnc)
+    write(*,*)trim(modname)//' : number of vertical levels nlevnc', nlevnc
+    rcod = nf90_close(ncidpl)
+
+! ---------------------------------------------
+! Allocation des variables
+! ---------------------------------------------
+    abort_message='nudging allocation error'
+
+    ALLOCATE(apnc(nlevnc), stat = error)
+    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+    ALLOCATE(bpnc(nlevnc), stat = error)
+    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+    apnc=0.;bpnc=0.
+
+    ALLOCATE(alpha_pcor(llm), stat = error)
+    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+    ALLOCATE(alpha_u(ijb_u:ije_u), stat = error)
+    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+    ALLOCATE(alpha_v(ijb_v:ije_v), stat = error)
+    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+    ALLOCATE(alpha_T(ijb_u:ije_u), stat = error)
+    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+    ALLOCATE(alpha_Q(ijb_u:ije_u), stat = error)
+    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+    ALLOCATE(alpha_P(ijb_u:ije_u), stat = error)
+    IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+    alpha_u=0.;alpha_v=0;alpha_T=0;alpha_Q=0;alpha_P=0
+
+    IF (guide_u) THEN
+        ALLOCATE(unat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(ugui1(ijb_u:ije_u,llm), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(unat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(ugui2(ijb_u:ije_u,llm), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        unat1=0.;unat2=0.;ugui1=0.;ugui2=0.
+    ENDIF
+
+    IF (guide_T) THEN
+        ALLOCATE(tnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(tgui1(ijb_u:ije_u,llm), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(tnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(tgui2(ijb_u:ije_u,llm), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        tnat1=0.;tnat2=0.;tgui1=0.;tgui2=0.
+    ENDIF
+
+    IF (guide_Q) THEN
+        ALLOCATE(qnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(qgui1(ijb_u:ije_u,llm), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(qnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(qgui2(ijb_u:ije_u,llm), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        qnat1=0.;qnat2=0.;qgui1=0.;qgui2=0.
+    ENDIF
+
+    IF (guide_v) THEN
+        ALLOCATE(vnat1(iip1,jjb_v:jje_v,nlevnc), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(vgui1(ijb_v:ije_v,llm), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(vnat2(iip1,jjb_v:jje_v,nlevnc), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(vgui2(ijb_v:ije_v,llm), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        vnat1=0.;vnat2=0.;vgui1=0.;vgui2=0.
+    ENDIF
+
+    IF (guide_plevs.EQ.2) THEN
+        ALLOCATE(pnat1(iip1,jjb_u:jje_u,nlevnc), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(pnat2(iip1,jjb_u:jje_u,nlevnc), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        pnat1=0.;pnat2=0.;
+    ENDIF
+
+    IF (guide_P.OR.guide_plevs.EQ.1) THEN
+        ALLOCATE(psnat1(iip1,jjb_u:jje_u), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(psnat2(iip1,jjb_u:jje_u), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        psnat1=0.;psnat2=0.;
+    ENDIF
+    IF (guide_P) THEN
+        ALLOCATE(psgui2(ijb_u:ije_u), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        ALLOCATE(psgui1(ijb_u:ije_u), stat = error)
+        IF (error /= 0) CALL abort_gcm(modname,abort_message,1)
+        psgui1=0.;psgui2=0.
+    ENDIF
+
+! ---------------------------------------------
+!   Lecture du premier etat de guidage.
+! ---------------------------------------------
+    IF (guide_2D) THEN
+        CALL guide_read2D(1)
+    ELSE
+        CALL guide_read(1)
+    ENDIF
+    IF (guide_v) vnat1=vnat2
+    IF (guide_u) unat1=unat2
+    IF (guide_T) tnat1=tnat2
+    IF (guide_Q) qnat1=qnat2
+    IF (guide_plevs.EQ.2) pnat1=pnat2
+    IF (guide_P.OR.guide_plevs.EQ.1) psnat1=psnat2
+
+  END SUBROUTINE guide_init
+
+!=======================================================================
+  SUBROUTINE guide_main(itau,ucov,vcov,teta,q,masse,ps)
+    use exner_hyb_loc_m, only: exner_hyb_loc
+    use exner_milieu_loc_m, only: exner_milieu_loc
+    USE parallel_lmdz
+    USE control_mod
+    USE write_field_loc
+    USE comconst_mod, ONLY: cpp, daysec, dtvr, kappa
+    USE comvert_mod, ONLY: ap, bp, preff, presnivs, pressure_exner
+
+    IMPLICIT NONE
+
+    INCLUDE "dimensions.h"
+    INCLUDE "paramet.h"
+
+    ! Variables entree
+    INTEGER,                           INTENT(IN)    :: itau !pas de temps
+    REAL, DIMENSION (ijb_u:ije_u,llm), INTENT(INOUT) :: ucov,teta,q,masse
+    REAL, DIMENSION (ijb_v:ije_v,llm), INTENT(INOUT) :: vcov
+    REAL, DIMENSION (ijb_u:ije_u),     INTENT(INOUT) :: ps
+
+    ! Variables locales
+    LOGICAL, SAVE :: first=.TRUE.
+!$OMP THREADPRIVATE(first)
+    LOGICAL       :: f_out ! sortie guidage
+    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:) :: f_addu ! var aux: champ de guidage
+    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:) :: f_addv ! var aux: champ de guidage
+    ! Variables pour fonction Exner (P milieu couche)
+    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:,:)    :: pk
+    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:)        :: pks
+    REAL                               :: unskap
+    REAL, ALLOCATABLE, SAVE, DIMENSION (:,:)    :: p ! besoin si guide_P
+    ! Compteurs temps:
+    INTEGER, SAVE :: step_rea,count_no_rea,itau_test ! lecture guidage
+!$OMP THREADPRIVATE(step_rea,count_no_rea,itau_test)
+    REAL          :: ditau, dday_step
+    REAL          :: tau,reste ! position entre 2 etats de guidage
+    REAL, SAVE    :: factt ! pas de temps en fraction de jour
+!$OMP THREADPRIVATE(factt)
+
+    INTEGER       :: i,j,l
+    CHARACTER(LEN=20) :: modname="guide_main"
+
+!$OMP MASTER
+    ijbu=ij_begin ; ijeu=ij_end
+    jjbu=jj_begin ; jjeu=jj_end ; jjnu=jjeu-jjbu+1
+    ijbv=ij_begin ; ijev=ij_end
+    jjbv=jj_begin ; jjev=jj_end ; jjnv=jjev-jjbv+1
+    IF (pole_sud) THEN
+      ijeu=ij_end-iip1
+      ijev=ij_end-iip1
+      jjev=jj_end-1
+      jjnv=jjev-jjbv+1
+    ENDIF
+    IF (pole_nord) THEN
+      ijbu=ij_begin+iip1
+      ijbv=ij_begin
+    ENDIF
+!$OMP END MASTER
+!$OMP BARRIER
+
+!    PRINT *,'---> on rentre dans guide_main'
+!    CALL AllGather_Field(ucov,ip1jmp1,llm)
+!    CALL AllGather_Field(vcov,ip1jm,llm)
+!    CALL AllGather_Field(teta,ip1jmp1,llm)
+!    CALL AllGather_Field(ps,ip1jmp1,1)
+!    CALL AllGather_Field(q,ip1jmp1,llm)
+
+!-----------------------------------------------------------------------
+! Initialisations au premier passage
+!-----------------------------------------------------------------------
+
+    IF (first) THEN
+        first=.FALSE.
+!$OMP MASTER
+        ALLOCATE(f_addu(ijb_u:ije_u,llm) )
+        ALLOCATE(f_addv(ijb_v:ije_v,llm) )
+        ALLOCATE(pk(iip1,jjb_u:jje_u,llm)  )
+        ALLOCATE(pks(iip1,jjb_u:jje_u)  )
+        ALLOCATE(p(ijb_u:ije_u,llmp1) )
+        CALL guide_init
+!$OMP END MASTER
+!$OMP BARRIER
+        itau_test=1001
+        step_rea=1
+        count_no_rea=0
+! Calcul des constantes de rappel
+        factt=dtvr*iperiod/daysec
+!$OMP MASTER
+        call tau2alpha(3, iip1, jjb_v, jje_v, factt, tau_min_v, tau_max_v, alpha_v)
+        call tau2alpha(2, iip1, jjb_u, jje_u, factt, tau_min_u, tau_max_u, alpha_u)
+        call tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_T, tau_max_T, alpha_T)
+        call tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_P, tau_max_P, alpha_P)
+        call tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_Q, tau_max_Q, alpha_Q)
+! correction de rappel dans couche limite
+        if (guide_BL) then
+             alpha_pcor(:)=1.
+        else
+            do l=1,llm
+                alpha_pcor(l)=(1.+tanh(((plim_guide_BL-presnivs(l))/preff)/0.05))/2.
+            enddo
+        endif
+!$OMP END MASTER
+!$OMP BARRIER
+! ini_anal: etat initial egal au guidage
+        IF (ini_anal) THEN
+            CALL guide_interp(ps,teta)
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+            DO l=1,llm
+              IF (guide_u) ucov(ijbu:ijeu,l)=ugui2(ijbu:ijeu,l)
+              IF (guide_v) vcov(ijbv:ijev,l)=ugui2(ijbv:ijev,l)
+              IF (guide_T) teta(ijbu:ijeu,l)=tgui2(ijbu:ijeu,l)
+              IF (guide_Q) q(ijbu:ijeu,l)=qgui2(ijbu:ijeu,l)
+            ENDDO
+
+            IF (guide_P) THEN
+!$OMP MASTER
+                ps(ijbu:ijeu)=psgui2(ijbu:ijeu)
+!$OMP END MASTER
+!$OMP BARRIER
+                CALL pression_loc(ijnb_u,ap,bp,ps,p)
+                CALL massdair_loc(p,masse)
+!$OMP BARRIER
+            ENDIF
+            RETURN
+        ENDIF
+
+    ENDIF !first
+
+!-----------------------------------------------------------------------
+! Lecture des fichiers de guidage ?
+!-----------------------------------------------------------------------
+    IF (iguide_read.NE.0) THEN
+      ditau=real(itau)
+      dday_step=real(day_step)
+      IF (iguide_read.LT.0) THEN
+          tau=ditau/dday_step/REAL(iguide_read)
+      ELSE
+          tau=REAL(iguide_read)*ditau/dday_step
+      ENDIF
+      reste=tau-AINT(tau)
+      IF (reste.EQ.0.) THEN
+          IF (itau_test.EQ.itau) THEN
+            write(*,*)trim(modname)//' second pass in advreel at itau=',&
+            itau
+            CALL abort_gcm("guide_loc_lod","stopped",1)
+          ELSE
+!$OMP MASTER
+              IF (guide_v) vnat1(:,jjbv:jjev,:)=vnat2(:,jjbv:jjev,:)
+              IF (guide_u) unat1(:,jjbu:jjeu,:)=unat2(:,jjbu:jjeu,:)
+              IF (guide_T) tnat1(:,jjbu:jjeu,:)=tnat2(:,jjbu:jjeu,:)
+              IF (guide_Q) qnat1(:,jjbu:jjeu,:)=qnat2(:,jjbu:jjeu,:)
+              IF (guide_plevs.EQ.2) pnat1(:,jjbu:jjeu,:)=pnat2(:,jjbu:jjeu,:)
+              IF (guide_P.OR.guide_plevs.EQ.1) psnat1(:,jjbu:jjeu)=psnat2(:,jjbu:jjeu)
+!$OMP END MASTER
+!$OMP BARRIER
+              step_rea=step_rea+1
+              itau_test=itau
+              if (is_master) then
+                write(*,*)trim(modname)//' Reading nudging files, step ',&
+                    step_rea,'after ',count_no_rea,' skips'
+              endif
+              IF (guide_2D) THEN
+!$OMP MASTER
+                  CALL guide_read2D(step_rea)
+!$OMP END MASTER
+!$OMP BARRIER
+              ELSE
+!$OMP MASTER
+                  CALL guide_read(step_rea)
+!$OMP END MASTER
+!$OMP BARRIER
+              ENDIF
+              count_no_rea=0
+          ENDIF
+      ELSE
+        count_no_rea=count_no_rea+1
+
+      ENDIF
+    ENDIF !iguide_read=0
+
+!-----------------------------------------------------------------------
+! Interpolation et conversion des champs de guidage
+!-----------------------------------------------------------------------
+    IF (MOD(itau,iguide_int).EQ.0) THEN
+        CALL guide_interp(ps,teta)
+    ENDIF
+! Repartition entre 2 etats de guidage
+    IF (iguide_read.NE.0) THEN
+        tau=reste
+    ELSE
+        tau=1.
+    ENDIF
+
+!    CALL WriteField_u('ucov_guide',ucov)
+!    CALL WriteField_v('vcov_guide',vcov)
+!    CALL WriteField_u('teta_guide',teta)
+!    CALL WriteField_u('masse_guide',masse)
+
+
+!-----------------------------------------------------------------------
+!   Ajout des champs de guidage
+!-----------------------------------------------------------------------
+! Sauvegarde du guidage?
+    f_out=((MOD(itau,iguide_sav).EQ.0).AND.guide_sav)
+    IF (f_out) THEN
+
+!$OMP BARRIER
+      CALL pression_loc(ijnb_u,ap,bp,ps,p)
+
+!$OMP BARRIER
+      if (pressure_exner) then
+      CALL exner_hyb_loc( ijnb_u, ps, p, pks, pk)
+      else
+        CALL exner_milieu_loc( ijnb_u, ps, p, pks, pk )
+      endif
+
+!$OMP BARRIER
+
+        unskap=1./kappa
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+        DO l = 1, llm
+            DO j=jjbu,jjeu
+                DO i =1, iip1
+                    p(i+(j-1)*iip1,l) = preff * ( pk(i,j,l)/cpp) ** unskap
+                ENDDO
+            ENDDO
+        ENDDO
+
+        CALL guide_out("SP",jjp1,llm,p(ijb_u:ije_u,1:llm),1.)
+    ENDIF
+
+    if (guide_u) then
+        if (guide_add) then
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+          DO l=1,llm
+           f_addu(ijbu:ijeu,l)=(1.-tau)*ugui1(ijbu:ijeu,l)+tau*ugui2(ijbu:ijeu,l)
+          ENDDO
+        else
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+          DO l=1,llm
+           f_addu(ijbu:ijeu,l)=(1.-tau)*ugui1(ijbu:ijeu,l)+tau*ugui2(ijbu:ijeu,l)-ucov(ijbu:ijeu,l)
+          ENDDO
+        endif
+
+!        CALL WriteField_u('f_addu',f_addu)
+
+        if (guide_zon) CALL guide_zonave_u(1,llm,f_addu)
+        CALL guide_addfield_u(llm,f_addu,alpha_u)
+        IF (f_out) CALL guide_out("ua",jjp1,llm,(1.-tau)*ugui1(ijb_u:ije_u,:)+tau*ugui2(ijb_u:ije_u,:),factt)
+        IF (f_out) CALL guide_out("u",jjp1,llm,ucov(ijb_u:ije_u,:),factt)
+        IF (f_out) THEN
+         ! Ehouarn: fill the gaps adequately...
+         IF (ijbu>ijb_u) f_addu(ijb_u:ijbu-1,:)=0
+         IF (ijeu<ije_u) f_addu(ijeu+1:ije_u,:)=0
+         CALL guide_out("ucov",jjp1,llm,f_addu(ijb_u:ije_u,:)/factt,factt)
+        ENDIF
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+        DO l=1,llm
+          ucov(ijbu:ijeu,l)=ucov(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l)
+        ENDDO
+
+    endif
+
+    if (guide_T) then
+        if (guide_add) then
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+          DO l=1,llm
+            f_addu(ijbu:ijeu,l)=(1.-tau)*tgui1(ijbu:ijeu,l)+tau*tgui2(ijbu:ijeu,l)
+          ENDDO
+        else
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+          DO l=1,llm
+           f_addu(ijbu:ijeu,l)=(1.-tau)*tgui1(ijbu:ijeu,l)+tau*tgui2(ijbu:ijeu,l)-teta(ijbu:ijeu,l)
+          ENDDO
+        endif
+        if (guide_zon) CALL guide_zonave_u(2,llm,f_addu)
+        CALL guide_addfield_u(llm,f_addu,alpha_T)
+        IF (f_out) CALL guide_out("teta",jjp1,llm,f_addu(:,:)/factt,factt)
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+        DO l=1,llm
+          teta(ijbu:ijeu,l)=teta(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l)
+        ENDDO
+    endif
+
+    if (guide_P) then
+        if (guide_add) then
+!$OMP MASTER
+            f_addu(ijbu:ijeu,1)=(1.-tau)*psgui1(ijbu:ijeu)+tau*psgui2(ijbu:ijeu)
+!$OMP END MASTER
+!$OMP BARRIER
+        else
+!$OMP MASTER
+            f_addu(ijbu:ijeu,1)=(1.-tau)*psgui1(ijbu:ijeu)+tau*psgui2(ijbu:ijeu)-ps(ijbu:ijeu)
+!$OMP END MASTER
+!$OMP BARRIER
+        endif
+        if (guide_zon) CALL guide_zonave_u(2,1,f_addu(ijb_u:ije_u,1))
+        CALL guide_addfield_u(1,f_addu(ijb_u:ije_u,1),alpha_P)
+!       IF (f_out) CALL guide_out("ps",jjp1,1,f_addu(ijb_u:ije_u,1)/factt,factt)
+!$OMP MASTER
+        ps(ijbu:ijeu)=ps(ijbu:ijeu)+f_addu(ijbu:ijeu,1)
+!$OMP END MASTER
+!$OMP BARRIER
+        CALL pression_loc(ijnb_u,ap,bp,ps,p)
+        CALL massdair_loc(p,masse)
+!$OMP BARRIER
+    endif
+
+    if (guide_Q) then
+        if (guide_add) then
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+          DO l=1,llm
+            f_addu(ijbu:ijeu,l)=(1.-tau)*qgui1(ijbu:ijeu,l)+tau*qgui2(ijbu:ijeu,l)
+          ENDDO
+        else
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+          DO l=1,llm
+            f_addu(ijbu:ijeu,l)=(1.-tau)*qgui1(ijbu:ijeu,l)+tau*qgui2(ijbu:ijeu,l)-q(ijbu:ijeu,l)
+          ENDDO
+        endif
+        if (guide_zon) CALL guide_zonave_u(2,llm,f_addu)
+        CALL guide_addfield_u(llm,f_addu,alpha_Q)
+        IF (f_out) CALL guide_out("q",jjp1,llm,f_addu(:,:)/factt,factt)
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+        DO l=1,llm
+          q(ijbu:ijeu,l)=q(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l)
+        ENDDO
+    endif
+
+    if (guide_v) then
+        if (guide_add) then
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+          DO l=1,llm
+             f_addv(ijbv:ijev,l)=(1.-tau)*vgui1(ijbv:ijev,l)+tau*vgui2(ijbv:ijev,l)
+          ENDDO
+
+        else
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+          DO l=1,llm
+            f_addv(ijbv:ijev,l)=(1.-tau)*vgui1(ijbv:ijev,l)+tau*vgui2(ijbv:ijev,l)-vcov(ijbv:ijev,l)
+          ENDDO
+
+        endif
+
+        if (guide_zon) CALL guide_zonave_v(2,jjm,llm,f_addv(ijb_v:ije_v,:))
+
+        CALL guide_addfield_v(llm,f_addv(ijb_v:ije_v,:),alpha_v)
+        IF (f_out) CALL guide_out("v",jjm,llm,vcov(ijb_v:ije_v,:),factt)
+        IF (f_out) CALL guide_out("va",jjm,llm,(1.-tau)*vgui1(ijb_v:ije_v,:)+tau*vgui2(ijb_v:ije_v,:),factt)
+        IF (f_out) THEN
+          ! Ehouarn: Fill in the gaps adequately
+          IF (ijbv>ijb_v) f_addv(ijb_v:ijbv-1,:)=0
+          IF (ijev<ije_v) f_addv(ijev+1:ije_v,:)=0
+          CALL guide_out("vcov",jjm,llm,f_addv(ijb_v:ije_v,:)/factt,factt)
+        ENDIF
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+        DO l=1,llm
+          vcov(ijbv:ijev,l)=vcov(ijbv:ijev,l)+f_addv(ijbv:ijev,l)
+        ENDDO
+    endif
+
+  END SUBROUTINE guide_main
+
+
+  SUBROUTINE guide_addfield_u(vsize,field,alpha)
+! field1=a*field1+alpha*field2
+
+    IMPLICIT NONE
+    INCLUDE "dimensions.h"
+    INCLUDE "paramet.h"
+
+    ! input variables
+    INTEGER,                      INTENT(IN)    :: vsize
+    REAL, DIMENSION(ijb_u:ije_u),       INTENT(IN)    :: alpha
+    REAL, DIMENSION(ijb_u:ije_u,vsize), INTENT(INOUT) :: field
+
+    ! Local variables
+    INTEGER :: l
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    DO l=1,vsize
+      field(ijbu:ijeu,l)=alpha(ijbu:ijeu)*field(ijbu:ijeu,l)*alpha_pcor(l)
+    ENDDO
+
+  END SUBROUTINE guide_addfield_u
+
+
+  SUBROUTINE guide_addfield_v(vsize,field,alpha)
+! field1=a*field1+alpha*field2
+
+    IMPLICIT NONE
+    INCLUDE "dimensions.h"
+    INCLUDE "paramet.h"
+
+    ! input variables
+    INTEGER,                      INTENT(IN)    :: vsize
+    REAL, DIMENSION(ijb_v:ije_v),       INTENT(IN)    :: alpha
+    REAL, DIMENSION(ijb_v:ije_v,vsize), INTENT(INOUT) :: field
+
+    ! Local variables
+    INTEGER :: l
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    DO l=1,vsize
+      field(ijbv:ijev,l)=alpha(ijbv:ijev)*field(ijbv:ijev,l)*alpha_pcor(l)
+    ENDDO
+
+  END SUBROUTINE guide_addfield_v
+
+!=======================================================================
+
+  SUBROUTINE guide_zonave_u(typ,vsize,field)
+
+    USE comconst_mod, ONLY: pi
+
+    IMPLICIT NONE
+
+    INCLUDE "dimensions.h"
+    INCLUDE "paramet.h"
+    INCLUDE "comgeom.h"
+
+    ! input/output variables
+    INTEGER,                           INTENT(IN)    :: typ
+    INTEGER,                           INTENT(IN)    :: vsize
+    REAL, DIMENSION(ijb_u:ije_u,vsize), INTENT(INOUT) :: field
+
+    ! Local variables
+    LOGICAL, SAVE                :: first=.TRUE.
+!$OMP THREADPRIVATE(first)
+
+    INTEGER, DIMENSION (2), SAVE :: imin, imax ! averaging domain
+!$OMP THREADPRIVATE(imin,imax)
+    INTEGER                      :: i,j,l,ij
+    REAL, DIMENSION (iip1)       :: lond       ! longitude in Deg.
+    REAL, DIMENSION (jjb_u:jje_u,vsize):: fieldm     ! zon-averaged field
+
+    IF (first) THEN
+        first=.FALSE.
+!Compute domain for averaging
+        lond=rlonu*180./pi
+        imin(1)=1;imax(1)=iip1;
+        imin(2)=1;imax(2)=iip1;
+        IF (guide_reg) THEN
+            DO i=1,iim
+                IF (lond(i).LT.lon_min_g) imin(1)=i
+                IF (lond(i).LE.lon_max_g) imax(1)=i
+            ENDDO
+            lond=rlonv*180./pi
+            DO i=1,iim
+                IF (lond(i).LT.lon_min_g) imin(2)=i
+                IF (lond(i).LE.lon_max_g) imax(2)=i
+            ENDDO
+        ENDIF
+    ENDIF
+
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+      DO l=1,vsize
+        fieldm(:,l)=0.
+      ! Compute zonal average
+
+!correction bug ici
+! ---> a verifier
+! ym         DO j=jjbv,jjev
+         DO j=jjbu,jjeu
+              DO i=imin(typ),imax(typ)
+                  ij=(j-1)*iip1+i
+                  fieldm(j,l)=fieldm(j,l)+field(ij,l)
+              ENDDO
+          ENDDO
+          fieldm(:,l)=fieldm(:,l)/REAL(imax(typ)-imin(typ)+1)
+    ! Compute forcing
+          DO j=jjbu,jjeu
+              DO i=1,iip1
+                  ij=(j-1)*iip1+i
+                  field(ij,l)=fieldm(j,l)
+              ENDDO
+          ENDDO
+      ENDDO
+
+  END SUBROUTINE guide_zonave_u
+
+
+  SUBROUTINE guide_zonave_v(typ,hsize,vsize,field)
+
+    USE comconst_mod, ONLY: pi
+
+    IMPLICIT NONE
+
+    INCLUDE "dimensions.h"
+    INCLUDE "paramet.h"
+    INCLUDE "comgeom.h"
+
+    ! input/output variables
+    INTEGER,                           INTENT(IN)    :: typ
+    INTEGER,                           INTENT(IN)    :: vsize
+    INTEGER,                           INTENT(IN)    :: hsize
+    REAL, DIMENSION(ijb_v:ije_v,vsize), INTENT(INOUT) :: field
+
+    ! Local variables
+    LOGICAL, SAVE                :: first=.TRUE.
+!$OMP THREADPRIVATE(first)
+    INTEGER, DIMENSION (2), SAVE :: imin, imax ! averaging domain
+!$OMP THREADPRIVATE(imin, imax)
+    INTEGER                      :: i,j,l,ij
+    REAL, DIMENSION (iip1)       :: lond       ! longitude in Deg.
+    REAL, DIMENSION (jjb_v:jjev,vsize):: fieldm     ! zon-averaged field
+
+    IF (first) THEN
+        first=.FALSE.
+!Compute domain for averaging
+        lond=rlonu*180./pi
+        imin(1)=1;imax(1)=iip1;
+        imin(2)=1;imax(2)=iip1;
+        IF (guide_reg) THEN
+            DO i=1,iim
+                IF (lond(i).LT.lon_min_g) imin(1)=i
+                IF (lond(i).LE.lon_max_g) imax(1)=i
+            ENDDO
+            lond=rlonv*180./pi
+            DO i=1,iim
+                IF (lond(i).LT.lon_min_g) imin(2)=i
+                IF (lond(i).LE.lon_max_g) imax(2)=i
+            ENDDO
+        ENDIF
+    ENDIF
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+      DO l=1,vsize
+      ! Compute zonal average
+          fieldm(:,l)=0.
+          DO j=jjbv,jjev
+              DO i=imin(typ),imax(typ)
+                  ij=(j-1)*iip1+i
+                  fieldm(j,l)=fieldm(j,l)+field(ij,l)
+              ENDDO
+          ENDDO
+          fieldm(:,l)=fieldm(:,l)/REAL(imax(typ)-imin(typ)+1)
+    ! Compute forcing
+          DO j=jjbv,jjev
+              DO i=1,iip1
+                  ij=(j-1)*iip1+i
+                  field(ij,l)=fieldm(j,l)
+              ENDDO
+          ENDDO
+      ENDDO
+
+
+  END SUBROUTINE guide_zonave_v
+
+!=======================================================================
+  SUBROUTINE guide_interp(psi,teta)
+    use exner_hyb_loc_m, only: exner_hyb_loc
+    use exner_milieu_loc_m, only: exner_milieu_loc
+  USE parallel_lmdz
+  USE mod_hallo
+  USE Bands
+  USE comconst_mod, ONLY: cpp, kappa
+  USE comvert_mod, ONLY: preff, pressure_exner, bp, ap, disvert_type
+  IMPLICIT NONE
+
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom2.h"
+
+  REAL, DIMENSION (iip1,jjb_u:jje_u),     INTENT(IN) :: psi ! Psol gcm
+  REAL, DIMENSION (iip1,jjb_u:jje_u,llm), INTENT(IN) :: teta ! Temp. Pot. gcm
+
+  LOGICAL, SAVE                      :: first=.TRUE.
+!$OMP THREADPRIVATE(first)
+  ! Variables pour niveaux pression:
+  REAL, ALLOCATABLE, SAVE, DIMENSION (:,:,:) :: plnc1,plnc2 !niveaux pression guidage
+  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: plunc,plsnc !niveaux pression modele
+  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)     :: plvnc       !niveaux pression modele
+  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)  :: p           ! pression intercouches
+  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: pls, pext   ! var intermediaire
+  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: pbarx
+  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)     :: pbary
+  ! Variables pour fonction Exner (P milieu couche)
+  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: pk
+  REAL ,ALLOCATABLE, SAVE, DIMENSION (:,:)        :: pks
+  REAL                               :: unskap
+  ! Pression de vapeur saturante
+  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:)      :: qsat
+  !Variables intermediaires interpolation
+  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)    :: zu1,zu2
+  REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:)     :: zv1,zv2
+
+  INTEGER                            :: i,j,l,ij
+  CHARACTER(LEN=20),PARAMETER :: modname="guide_interp"
+  TYPE(Request),SAVE :: Req
+!$OMP THREADPRIVATE(Req)
+
+    if (is_master) write(*,*)trim(modname)//': interpolate nudging variables'
+! -----------------------------------------------------------------
+! Calcul des niveaux de pression champs guidage (pour T et Q)
+! -----------------------------------------------------------------
+    IF (first) THEN
+!$OMP MASTER
+      ALLOCATE(plnc1(iip1,jjb_u:jje_u,nlevnc) )
+      ALLOCATE(plnc2(iip1,jjb_u:jje_u,nlevnc) )
+      ALLOCATE(plunc(iip1,jjb_u:jje_u,llm) )
+      ALLOCATE(plsnc(iip1,jjb_u:jje_u,llm) )
+      ALLOCATE(plvnc(iip1,jjb_v:jje_v,llm) )
+      ALLOCATE(p(iip1,jjb_u:jje_u,llmp1) )
+      ALLOCATE(pls(iip1,jjb_u:jje_u,llm) )
+      ALLOCATE(pext(iip1,jjb_u:jje_u,llm) )
+      ALLOCATE(pbarx(iip1,jjb_u:jje_u,llm) )
+      ALLOCATE(pbary(iip1,jjb_v:jje_v,llm) )
+      ALLOCATE(pk(iip1,jjb_u:jje_u,llm) )
+      ALLOCATE(pks (iip1,jjb_u:jje_u) )
+      ALLOCATE(qsat(ijb_u:ije_u,llm) )
+      ALLOCATE(zu1(iip1,jjb_u:jje_u,llm) )
+      ALLOCATE(zu2(iip1,jjb_u:jje_u,llm) )
+      ALLOCATE(zv1(iip1,jjb_v:jje_v,llm) )
+      ALLOCATE(zv2(iip1,jjb_v:jje_v,llm) )
+!$OMP END MASTER
+!$OMP BARRIER
+    ENDIF
+
+
+
+
+    IF (guide_plevs.EQ.0) THEN
+!$OMP DO
+        DO l=1,nlevnc
+            DO j=jjbu,jjeu
+                DO i=1,iip1
+                    plnc2(i,j,l)=apnc(l)
+                    plnc1(i,j,l)=apnc(l)
+               ENDDO
+            ENDDO
+        ENDDO
+    ENDIF
+
+    if (first) then
+        first=.FALSE.
+!$OMP MASTER
+        write(*,*)trim(modname)//' : check vertical level order'
+        write(*,*)trim(modname)//' LMDZ :'
+        do l=1,llm
+          write(*,*)trim(modname)//' PL(',l,')=',(ap(l)+ap(l+1))/2. &
+                  +psi(1,jjeu)*(bp(l)+bp(l+1))/2.
+        enddo
+        write(*,*)trim(modname)//' nudging file :'
+        SELECT CASE (guide_plevs)
+        CASE (0)
+            do l=1,nlevnc
+              write(*,*)trim(modname)//' PL(',l,')=',plnc2(1,jjbu,l)
+            enddo
+        CASE (1)
+            DO l=1,nlevnc
+              write(*,*)trim(modname)//' PL(',l,')=',&
+                        apnc(l)+bpnc(l)*psnat2(1,jjbu)
+            ENDDO
+        CASE (2)
+            do l=1,nlevnc
+              write(*,*)trim(modname)//' PL(',l,')=',pnat2(1,jjbu,l)
+            enddo
+        END SELECT
+        write(*,*)trim(modname)//' invert ordering: invert_p=',invert_p
+        if (guide_u) then
+            do l=1,nlevnc
+              write(*,*)trim(modname)//' U(',l,')=',unat2(1,jjbu,l)
+            enddo
+        endif
+        if (guide_T) then
+            do l=1,nlevnc
+              write(*,*)trim(modname)//' T(',l,')=',tnat2(1,jjbu,l)
+            enddo
+        endif
+!$OMP END MASTER
+    endif ! of if (first)
+
+    if (guide_plevs /= 1 .or. guide_t .and. .not. guide_teta &
+         .or. guide_q .and. guide_hr) then
+       CALL pression_loc( ijnb_u, ap, bp, psi, p )
+       if (disvert_type==1) then
+          CALL exner_hyb_loc(ijnb_u,psi,p,pks,pk)
+       else ! we assume that we are in the disvert_type==2 case
+          CALL exner_milieu_loc(ijnb_u,psi,p,pks,pk)
+       endif
+    end if
+
+! -----------------------------------------------------------------
+! Calcul niveaux pression modele
+! -----------------------------------------------------------------
+
+!    ....  Calcul de pls , pression au milieu des couches ,en Pascals
+    IF (guide_plevs.EQ.1) THEN
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+        DO l=1,llm
+            DO j=jjbu,jjeu
+                DO i =1, iip1
+                    pls(i,j,l)=(ap(l)+ap(l+1))/2.+psi(i,j)*(bp(l)+bp(l+1))/2.
+                ENDDO
+            ENDDO
+        ENDDO
+    ELSE
+        unskap=1./kappa
+!$OMP BARRIER
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+   DO l = 1, llm
+       DO j=jjbu,jjeu
+           DO i =1, iip1
+               pls(i,j,l) = preff * ( pk(i,j,l)/cpp) ** unskap
+           ENDDO
+       ENDDO
+   ENDDO
+    ENDIF
+
+!   calcul des pressions pour les grilles u et v
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    do l=1,llm
+        do j=jjbu,jjeu
+            do i=1,iip1
+                pext(i,j,l)=pls(i,j,l)*aire(i,j)
+            enddo
+        enddo
+    enddo
+
+     CALL Register_Hallo_u(pext,llm,1,2,2,1,Req)
+     CALL SendRequest(Req)
+!$OMP BARRIER
+     CALL WaitRequest(Req)
+!$OMP BARRIER
+
+    call massbar_loc(pext, pbarx, pbary )
+!$OMP BARRIER
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    do l=1,llm
+        do j=jjbu,jjeu
+            do i=1,iip1
+                plunc(i,j,l)=pbarx(i,j,l)/aireu(i,j)
+                plsnc(i,j,l)=pls(i,j,l)
+            enddo
+        enddo
+    enddo
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    do l=1,llm
+        do j=jjbv,jjev
+            do i=1,iip1
+                plvnc(i,j,l)=pbary(i,j,l)/airev(i,j)
+            enddo
+        enddo
+    enddo
+
+! -----------------------------------------------------------------
+! Interpolation verticale champs guidage sur niveaux modele
+! Conversion en variables gcm (ucov, vcov...)
+! -----------------------------------------------------------------
+    if (guide_P) then
+!$OMP MASTER
+        do j=jjbu,jjeu
+            do i=1,iim
+                ij=(j-1)*iip1+i
+                psgui1(ij)=psnat1(i,j)
+                psgui2(ij)=psnat2(i,j)
+            enddo
+            psgui1(iip1*j)=psnat1(1,j)
+            psgui2(iip1*j)=psnat2(1,j)
+        enddo
+!$OMP END MASTER
+!$OMP BARRIER
+    endif
+
+    IF (guide_T) THEN
+        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
+        IF (guide_plevs.EQ.1) THEN
+!$OMP DO
+            DO l=1,nlevnc
+                DO j=jjbu,jjeu
+                    DO i=1,iip1
+                        plnc2(i,j,l)=apnc(l)+bpnc(l)*psnat2(i,j)
+                        plnc1(i,j,l)=apnc(l)+bpnc(l)*psnat1(i,j)
+                    ENDDO
+                ENDDO
+            ENDDO
+        ELSE IF (guide_plevs.EQ.2) THEN
+!$OMP DO
+            DO l=1,nlevnc
+                DO j=jjbu,jjeu
+                    DO i=1,iip1
+                        plnc2(i,j,l)=pnat2(i,j,l)
+                        plnc1(i,j,l)=pnat1(i,j,l)
+                    ENDDO
+                ENDDO
+            ENDDO
+        ENDIF
+
+        ! Interpolation verticale
+!$OMP MASTER
+        CALL pres2lev(tnat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm,           &
+                    plnc1(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
+        CALL pres2lev(tnat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm,           &
+                    plnc2(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
+!$OMP END MASTER
+!$OMP BARRIER
+        ! Conversion en variables GCM
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+        do l=1,llm
+            do j=jjbu,jjeu
+                IF (guide_teta) THEN
+                    do i=1,iim
+                        ij=(j-1)*iip1+i
+                        tgui1(ij,l)=zu1(i,j,l)
+                        tgui2(ij,l)=zu2(i,j,l)
+                    enddo
+                ELSE
+                    do i=1,iim
+                        ij=(j-1)*iip1+i
+                        tgui1(ij,l)=zu1(i,j,l)*cpp/pk(i,j,l)
+                        tgui2(ij,l)=zu2(i,j,l)*cpp/pk(i,j,l)
+                    enddo
+                ENDIF
+                tgui1(j*iip1,l)=tgui1((j-1)*iip1+1,l)
+                tgui2(j*iip1,l)=tgui2((j-1)*iip1+1,l)
+            enddo
+            if (pole_nord) then
+              do i=1,iip1
+                tgui1(i,l)=tgui1(1,l)
+                tgui2(i,l)=tgui2(1,l)
+              enddo
+            endif
+            if (pole_sud) then
+              do i=1,iip1
+                tgui1(ip1jm+i,l)=tgui1(ip1jm+1,l)
+                tgui2(ip1jm+i,l)=tgui2(ip1jm+1,l)
+              enddo
+           endif
+        enddo
+    ENDIF
+
+    IF (guide_Q) THEN
+        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
+        IF (guide_plevs.EQ.1) THEN
+!$OMP DO
+            DO l=1,nlevnc
+                DO j=jjbu,jjeu
+                    DO i=1,iip1
+                        plnc2(i,j,l)=apnc(l)+bpnc(l)*psnat2(i,j)
+                        plnc1(i,j,l)=apnc(l)+bpnc(l)*psnat1(i,j)
+                    ENDDO
+                ENDDO
+            ENDDO
+        ELSE IF (guide_plevs.EQ.2) THEN
+!$OMP DO
+            DO l=1,nlevnc
+                DO j=jjbu,jjeu
+                    DO i=1,iip1
+                        plnc2(i,j,l)=pnat2(i,j,l)
+                        plnc1(i,j,l)=pnat1(i,j,l)
+                    ENDDO
+                ENDDO
+            ENDDO
+        ENDIF
+
+        ! Interpolation verticale
+!$OMP MASTER
+        CALL pres2lev(qnat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm,             &
+                      plnc1(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
+        CALL pres2lev(qnat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm,             &
+                      plnc2(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
+!$OMP END MASTER
+!$OMP BARRIER
+
+        ! Conversion en variables GCM
+        ! On suppose qu'on a la bonne variable dans le fichier de guidage:
+        ! Hum.Rel si guide_hr, Hum.Spec. sinon.
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+        do l=1,llm
+            do j=jjbu,jjeu
+                do i=1,iim
+                    ij=(j-1)*iip1+i
+                    qgui1(ij,l)=zu1(i,j,l)
+                    qgui2(ij,l)=zu2(i,j,l)
+                enddo
+                qgui1(j*iip1,l)=qgui1((j-1)*iip1+1,l)
+                qgui2(j*iip1,l)=qgui2((j-1)*iip1+1,l)
+            enddo
+            if (pole_nord) then
+              do i=1,iip1
+                qgui1(i,l)=qgui1(1,l)
+                qgui2(i,l)=qgui2(1,l)
+              enddo
+            endif
+            if (pole_sud) then
+              do i=1,iip1
+                qgui1(ip1jm+i,l)=qgui1(ip1jm+1,l)
+                qgui2(ip1jm+i,l)=qgui2(ip1jm+1,l)
+              enddo
+            endif
+        enddo
+        IF (guide_hr) THEN
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+          do l=1,llm
+            CALL q_sat(iip1*jjnu,teta(:,jjbu:jjeu,l)*pk(:,jjbu:jjeu,l)/cpp,       &
+                       plsnc(:,jjbu:jjeu,l),qsat(ijbu:ijeu,l))
+            qgui1(ijbu:ijeu,l)=qgui1(ijbu:ijeu,l)*qsat(ijbu:ijeu,l)*0.01 !hum. rel. en %
+            qgui2(ijbu:ijeu,l)=qgui2(ijbu:ijeu,l)*qsat(ijbu:ijeu,l)*0.01
+          enddo
+
+        ENDIF
+    ENDIF
+
+    IF (guide_u) THEN
+        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
+        IF (guide_plevs.EQ.1) THEN
+!$OMP DO
+            DO l=1,nlevnc
+                DO j=jjbu,jjeu
+                    DO i=1,iim
+                        plnc2(i,j,l)=apnc(l)+bpnc(l)*(psnat2(i,j)*aire(i,j)*alpha1p2(i,j) &
+                       &           +psnat2(i+1,j)*aire(i+1,j)*alpha3p4(i+1,j))/aireu(i,j)
+                        plnc1(i,j,l)=apnc(l)+bpnc(l)*(psnat1(i,j)*aire(i,j)*alpha1p2(i,j) &
+                       &           +psnat1(i+1,j)*aire(i+1,j)*alpha3p4(i+1,j))/aireu(i,j)
+                    ENDDO
+                    plnc2(iip1,j,l)=plnc2(1,j,l)
+                    plnc1(iip1,j,l)=plnc1(1,j,l)
+                ENDDO
+            ENDDO
+        ELSE IF (guide_plevs.EQ.2) THEN
+!$OMP DO
+            DO l=1,nlevnc
+                DO j=jjbu,jjeu
+                    DO i=1,iim
+                        plnc2(i,j,l)=(pnat2(i,j,l)*aire(i,j)*alpha1p2(i,j) &
+                       & +pnat2(i+1,j,l)*aire(i,j)*alpha3p4(i+1,j))/aireu(i,j)
+                        plnc1(i,j,l)=(pnat1(i,j,l)*aire(i,j)*alpha1p2(i,j) &
+                       & +pnat1(i+1,j,l)*aire(i,j)*alpha3p4(i+1,j))/aireu(i,j)
+                    ENDDO
+                    plnc2(iip1,j,l)=plnc2(1,j,l)
+                    plnc1(iip1,j,l)=plnc1(1,j,l)
+                ENDDO
+            ENDDO
+        ENDIF
+
+        ! Interpolation verticale
+!$OMP MASTER
+        CALL pres2lev(unat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm,            &
+                      plnc1(:,jjbu:jjeu,:),plunc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
+        CALL pres2lev(unat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm,            &
+                      plnc2(:,jjbu:jjeu,:),plunc(:,jjbu:jjeu,:),iip1,jjnu,invert_p)
+!$OMP END MASTER
+!$OMP BARRIER
+
+        ! Conversion en variables GCM
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+        do l=1,llm
+            do j=jjbu,jjeu
+                do i=1,iim
+                    ij=(j-1)*iip1+i
+                    ugui1(ij,l)=zu1(i,j,l)*cu(i,j)
+                    ugui2(ij,l)=zu2(i,j,l)*cu(i,j)
+                enddo
+                ugui1(j*iip1,l)=ugui1((j-1)*iip1+1,l)
+                ugui2(j*iip1,l)=ugui2((j-1)*iip1+1,l)
+            enddo
+            if (pole_nord) then
+              do i=1,iip1
+                ugui1(i,l)=0.
+                ugui2(i,l)=0.
+              enddo
+            endif
+            if (pole_sud) then
+              do i=1,iip1
+                ugui1(ip1jm+i,l)=0.
+                ugui2(ip1jm+i,l)=0.
+              enddo
+            endif
+        enddo
+    ENDIF
+
+    IF (guide_v) THEN
+        ! Calcul des nouvelles valeurs des niveaux de pression du guidage
+        IF (guide_plevs.EQ.1) THEN
+         CALL Register_Hallo_u(psnat1,1,1,2,2,1,Req)
+         CALL Register_Hallo_u(psnat2,1,1,2,2,1,Req)
+         CALL SendRequest(Req)
+!$OMP BARRIER
+         CALL WaitRequest(Req)
+!$OMP BARRIER
+!$OMP DO
+            DO l=1,nlevnc
+                DO j=jjbv,jjev
+                    DO i=1,iip1
+                        plnc2(i,j,l)=apnc(l)+bpnc(l)*(psnat2(i,j)*aire(i,j)*alpha2p3(i,j) &
+                       &           +psnat2(i,j+1)*aire(i,j+1)*alpha1p4(i,j+1))/airev(i,j)
+                        plnc1(i,j,l)=apnc(l)+bpnc(l)*(psnat1(i,j)*aire(i,j)*alpha2p3(i,j) &
+                       &           +psnat1(i,j+1)*aire(i,j+1)*alpha1p4(i,j+1))/airev(i,j)
+                    ENDDO
+                ENDDO
+            ENDDO
+        ELSE IF (guide_plevs.EQ.2) THEN
+         CALL Register_Hallo_u(pnat1,llm,1,2,2,1,Req)
+         CALL Register_Hallo_u(pnat2,llm,1,2,2,1,Req)
+         CALL SendRequest(Req)
+!$OMP BARRIER
+         CALL WaitRequest(Req)
+!$OMP BARRIER
+!$OMP DO
+            DO l=1,nlevnc
+                DO j=jjbv,jjev
+                    DO i=1,iip1
+                        plnc2(i,j,l)=(pnat2(i,j,l)*aire(i,j)*alpha2p3(i,j) &
+                       & +pnat2(i,j+1,l)*aire(i,j)*alpha1p4(i,j+1))/airev(i,j)
+                        plnc1(i,j,l)=(pnat1(i,j,l)*aire(i,j)*alpha2p3(i,j) &
+                       & +pnat1(i,j+1,l)*aire(i,j)*alpha1p4(i,j+1))/airev(i,j)
+                    ENDDO
+                ENDDO
+            ENDDO
+        ENDIF
+        ! Interpolation verticale
+
+!$OMP MASTER
+        CALL pres2lev(vnat1(:,jjbv:jjev,:),zv1(:,jjbv:jjev,:),nlevnc,llm,             &
+                      plnc1(:,jjbv:jjev,:),plvnc(:,jjbv:jjev,:),iip1,jjnv,invert_p)
+        CALL pres2lev(vnat2(:,jjbv:jjev,:),zv2(:,jjbv:jjev,:),nlevnc,llm,             &
+                      plnc2(:,jjbv:jjev,:),plvnc(:,jjbv:jjev,:),iip1,jjnv,invert_p)
+!$OMP END MASTER
+!$OMP BARRIER
+        ! Conversion en variables GCM
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+        do l=1,llm
+            do j=jjbv,jjev
+                do i=1,iim
+                    ij=(j-1)*iip1+i
+                    vgui1(ij,l)=zv1(i,j,l)*cv(i,j)
+                    vgui2(ij,l)=zv2(i,j,l)*cv(i,j)
+                enddo
+                vgui1(j*iip1,l)=vgui1((j-1)*iip1+1,l)
+                vgui2(j*iip1,l)=vgui2((j-1)*iip1+1,l)
+            enddo
+        enddo
+    ENDIF
+
+
+  END SUBROUTINE guide_interp
+
+!=======================================================================
+  SUBROUTINE tau2alpha(typ,pim,jjb,jje,factt,taumin,taumax,alpha)
+
+! Calcul des constantes de rappel alpha (=1/tau)
+
+    use comconst_mod, only: pi
+    use serre_mod, only: clat, clon, grossismx, grossismy
+
+    implicit none
+
+    include "dimensions.h"
+    include "paramet.h"
+    include "comgeom2.h"
+
+! input arguments :
+    INTEGER, INTENT(IN) :: typ    ! u(2),v(3), ou scalaire(1)
+    INTEGER, INTENT(IN) :: pim ! dimensions en lon
+    INTEGER, INTENT(IN) :: jjb,jje ! dimensions en lat
+    REAL, INTENT(IN)    :: factt   ! pas de temps en fraction de jour
+    REAL, INTENT(IN)    :: taumin,taumax
+! output arguments:
+    REAL, DIMENSION(pim,jjb:jje), INTENT(OUT) :: alpha
+
+!  local variables:
+    LOGICAL, SAVE               :: first=.TRUE.
+    REAL, SAVE                  :: gamma,dxdy_min,dxdy_max
+    REAL, DIMENSION (iip1,jjp1) :: zdx,zdy
+    REAL, DIMENSION (iip1,jjp1) :: dxdys,dxdyu
+    REAL, DIMENSION (iip1,jjm)  :: dxdyv
+    real dxdy_
+    real zlat,zlon
+    real alphamin,alphamax,xi
+    integer i,j,ilon,ilat
+    character(len=20),parameter :: modname="tau2alpha"
+
+
+    alphamin=factt/taumax
+    alphamax=factt/taumin
+    IF (guide_reg.OR.guide_add) THEN
+        alpha=alphamax
+!-----------------------------------------------------------------------
+! guide_reg: alpha=alpha_min dans region, 0. sinon.
+!-----------------------------------------------------------------------
+        IF (guide_reg) THEN
+            do j=jjb,jje
+                do i=1,pim
+                    if (typ.eq.2) then
+                       zlat=rlatu(j)*180./pi
+                       zlon=rlonu(i)*180./pi
+                    elseif (typ.eq.1) then
+                       zlat=rlatu(j)*180./pi
+                       zlon=rlonv(i)*180./pi
+                    elseif (typ.eq.3) then
+                       zlat=rlatv(j)*180./pi
+                       zlon=rlonv(i)*180./pi
+                    endif
+                    alpha(i,j)=alphamax/16.* &
+                              (1.+tanh((zlat-lat_min_g)/tau_lat))* &
+                              (1.+tanh((lat_max_g-zlat)/tau_lat))* &
+                              (1.+tanh((zlon-lon_min_g)/tau_lon))* &
+                              (1.+tanh((lon_max_g-zlon)/tau_lon))
+                enddo
+            enddo
+        ENDIF
+    ELSE
+!-----------------------------------------------------------------------
+! Sinon, alpha varie entre alpha_min et alpha_max suivant le zoom.
+!-----------------------------------------------------------------------
+!Calcul de l'aire des mailles
+        do j=2,jjm
+            do i=2,iip1
+               zdx(i,j)=0.5*(cu(i-1,j)+cu(i,j))/cos(rlatu(j))
+            enddo
+            zdx(1,j)=zdx(iip1,j)
+        enddo
+        do j=2,jjm
+            do i=1,iip1
+               zdy(i,j)=0.5*(cv(i,j-1)+cv(i,j))
+            enddo
+        enddo
+        do i=1,iip1
+            zdx(i,1)=zdx(i,2)
+            zdx(i,jjp1)=zdx(i,jjm)
+            zdy(i,1)=zdy(i,2)
+            zdy(i,jjp1)=zdy(i,jjm)
+        enddo
+        do j=1,jjp1
+            do i=1,iip1
+               dxdys(i,j)=sqrt(zdx(i,j)*zdx(i,j)+zdy(i,j)*zdy(i,j))
+            enddo
+        enddo
+        IF (typ.EQ.2) THEN
+            do j=1,jjp1
+                do i=1,iim
+                   dxdyu(i,j)=0.5*(dxdys(i,j)+dxdys(i+1,j))
+                enddo
+                dxdyu(iip1,j)=dxdyu(1,j)
+            enddo
+        ENDIF
+        IF (typ.EQ.3) THEN
+            do j=1,jjm
+                do i=1,iip1
+                   dxdyv(i,j)=0.5*(dxdys(i,j)+dxdys(i,j+1))
+                enddo
+            enddo
+        ENDIF
+! Premier appel: calcul des aires min et max et de gamma.
+        IF (first) THEN
+            first=.FALSE.
+            ! coordonnees du centre du zoom
+            CALL coordij(clon,clat,ilon,ilat)
+            ! aire de la maille au centre du zoom
+            dxdy_min=dxdys(ilon,ilat)
+            ! dxdy maximale de la maille
+            dxdy_max=0.
+            do j=1,jjp1
+                do i=1,iip1
+                     dxdy_max=max(dxdy_max,dxdys(i,j))
+                enddo
+            enddo
+            ! Calcul de gamma
+            if (abs(grossismx-1.).lt.0.1.or.abs(grossismy-1.).lt.0.1) then
+              write(*,*)trim(modname)//' ATTENTION modele peu zoome'
+              write(*,*)trim(modname)//' ATTENTION on prend une constante de guidage cste'
+              gamma=0.
+            else
+              gamma=(dxdy_max-2.*dxdy_min)/(dxdy_max-dxdy_min)
+              write(*,*)trim(modname)//' gamma=',gamma
+              if (gamma.lt.1.e-5) then
+                write(*,*)trim(modname)//' gamma =',gamma,'<1e-5'
+                CALL abort_gcm("guide_loc_mod","stopped",1)
+              endif
+              gamma=log(0.5)/log(gamma)
+              if (gamma4) then
+                gamma=min(gamma,4.)
+              endif
+              write(*,*)trim(modname)//' gamma=',gamma
+            endif
+        ENDIF !first
+
+        do j=jjb,jje
+            do i=1,pim
+                if (typ.eq.1) then
+                   dxdy_=dxdys(i,j)
+                   zlat=rlatu(j)*180./pi
+                elseif (typ.eq.2) then
+                   dxdy_=dxdyu(i,j)
+                   zlat=rlatu(j)*180./pi
+                elseif (typ.eq.3) then
+                   dxdy_=dxdyv(i,j)
+                   zlat=rlatv(j)*180./pi
+                endif
+                if (abs(grossismx-1.).lt.0.1.or.abs(grossismy-1.).lt.0.1) then
+                ! pour une grille reguliere, xi=xxx**0=1 -> alpha=alphamin
+                    alpha(i,j)=alphamin
+                else
+                    xi=((dxdy_max-dxdy_)/(dxdy_max-dxdy_min))**gamma
+                    xi=min(xi,1.)
+                    if(lat_min_g.le.zlat .and. zlat.le.lat_max_g) then
+                        alpha(i,j)=xi*alphamin+(1.-xi)*alphamax
+                    else
+                        alpha(i,j)=0.
+                    endif
+                endif
+            enddo
+        enddo
+    ENDIF ! guide_reg
+
+    if (.not. guide_add) alpha = 1. - exp(- alpha)
+
+  END SUBROUTINE tau2alpha
+
+!=======================================================================
+  SUBROUTINE guide_read(timestep)
+    USE netcdf, ONLY: nf90_put_var
+    IMPLICIT NONE
+
+    include "netcdf.inc"
+    include "dimensions.h"
+    include "paramet.h"
+
+    INTEGER, INTENT(IN)   :: timestep
+
+    LOGICAL, SAVE         :: first=.TRUE.
+! Identification fichiers et variables NetCDF:
+    INTEGER, SAVE         :: ncidu,varidu,ncidv,varidv,ncidp,varidp
+    INTEGER, SAVE         :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps
+    INTEGER               :: ncidpl,varidpl,varidap,varidbp,dimid,lendim
+! Variables auxiliaires NetCDF:
+    INTEGER, DIMENSION(4) :: start,count
+    INTEGER               :: status,rcode
+    CHARACTER (len = 80)   :: abort_message
+    CHARACTER (len = 20)   :: modname = 'guide_read'
+    CHARACTER (len = 20)   :: namedim
+    abort_message='pb in guide_read'
+
+! -----------------------------------------------------------------
+! Premier appel: initialisation de la lecture des fichiers
+! -----------------------------------------------------------------
+    if (first) then
+         ncidpl=-99
+         write(*,*),trim(modname)//': opening nudging files '
+! Ap et Bp si Niveaux de pression hybrides
+         if (guide_plevs.EQ.1) then
+             write(*,*),trim(modname)//' Reading nudging on model levels'
+             rcode = nf90_open('apbp.nc', nf90_nowrite, ncidpl)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no file apbp.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             rcode = nf90_inq_varid(ncidpl, 'AP', varidap)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no AP variable in file apbp.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             rcode = nf90_inq_varid(ncidpl, 'BP', varidbp)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no BP variable in file apbp.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             write(*,*),trim(modname)//' ncidpl,varidap',ncidpl,varidap
+         endif
+
+! Pression si guidage sur niveaux P variables
+         if (guide_plevs.EQ.2) then
+             rcode = nf90_open('P.nc', nf90_nowrite, ncidp)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no file P.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             rcode = nf90_inq_varid(ncidp, 'PRES', varidp)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no PRES variable in file P.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             write(*,*),trim(modname)//' ncidp,varidp',ncidp,varidp
+             if (ncidpl.eq.-99) ncidpl=ncidp
+         endif
+
+! Vent zonal
+         if (guide_u) then
+             rcode = nf90_open('u.nc', nf90_nowrite, ncidu)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no file u.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             rcode = nf90_inq_varid(ncidu, 'UWND', varidu)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no UWND variable in file u.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             write(*,*),trim(modname)//' ncidu,varidu',ncidu,varidu
+             if (ncidpl.eq.-99) ncidpl=ncidu
+
+
+             status=NF90_INQ_DIMID(ncidu, "LONU", dimid)
+             status=NF90_INQUIRE_DIMENSION(ncidu,dimid,namedim,lendim)
+             IF (lendim .NE. iip1) THEN
+                abort_message='dimension LONU different from iip1 in u.nc'
+                CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+
+             status=NF90_INQ_DIMID(ncidu, "LATU", dimid)
+             status=NF90_INQUIRE_DIMENSION(ncidu,dimid,namedim,lendim)
+             IF (lendim .NE. jjp1) THEN
+                abort_message='dimension LATU different from jjp1 in u.nc'
+                CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+
+         endif
+
+! Vent meridien
+         if (guide_v) then
+             rcode = nf90_open('v.nc', nf90_nowrite, ncidv)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no file v.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             rcode = nf90_inq_varid(ncidv, 'VWND', varidv)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no VWND variable in file v.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             write(*,*),trim(modname)//' ncidv,varidv',ncidv,varidv
+             if (ncidpl.eq.-99) ncidpl=ncidv
+
+             status=NF90_INQ_DIMID(ncidv, "LONV", dimid)
+             status=NF90_INQUIRE_DIMENSION(ncidv,dimid,namedim,lendim)
+
+                IF (lendim .NE. iip1) THEN
+                abort_message='dimension LONV different from iip1 in v.nc'
+                CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+
+
+             status=NF90_INQ_DIMID(ncidv, "LATV", dimid)
+             status=NF90_INQUIRE_DIMENSION(ncidv,dimid,namedim,lendim)
+             IF (lendim .NE. jjm) THEN
+                abort_message='dimension LATV different from jjm in v.nc'
+                CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+
+        endif
+
+! Temperature
+         if (guide_T) then
+             rcode = nf90_open('T.nc', nf90_nowrite, ncidt)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no file T.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             rcode = nf90_inq_varid(ncidt, 'AIR', varidt)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no AIR variable in file T.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             write(*,*),trim(modname)//' ncidT,varidT',ncidt,varidt
+             if (ncidpl.eq.-99) ncidpl=ncidt
+
+             status=NF90_INQ_DIMID(ncidt, "LONV", dimid)
+             status=NF90_INQUIRE_DIMENSION(ncidt,dimid,namedim,lendim)
+             IF (lendim .NE. iip1) THEN
+                abort_message='dimension LONV different from iip1 in T.nc'
+                CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+
+             status=NF90_INQ_DIMID(ncidt, "LATU", dimid)
+             status=NF90_INQUIRE_DIMENSION(ncidt,dimid,namedim,lendim)
+             IF (lendim .NE. jjp1) THEN
+                abort_message='dimension LATU different from jjp1 in T.nc'
+                CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+
+         endif
+
+! Humidite
+         if (guide_Q) then
+             rcode = nf90_open('hur.nc', nf90_nowrite, ncidQ)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no file hur.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             rcode = nf90_inq_varid(ncidQ, 'RH', varidQ)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no RH variable in file hur.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             write(*,*),trim(modname)//' ncidQ,varidQ',ncidQ,varidQ
+             if (ncidpl.eq.-99) ncidpl=ncidQ
+
+
+             status=NF90_INQ_DIMID(ncidQ, "LONV", dimid)
+             status=NF90_INQUIRE_DIMENSION(ncidQ,dimid,namedim,lendim)
+             IF (lendim .NE. iip1) THEN
+                abort_message='dimension LONV different from iip1 in hur.nc'
+                CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+
+             status=NF90_INQ_DIMID(ncidQ, "LATU", dimid)
+             status=NF90_INQUIRE_DIMENSION(ncidQ,dimid,namedim,lendim)
+             IF (lendim .NE. jjp1) THEN
+                abort_message='dimension LATU different from jjp1 in hur.nc'
+                CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+
+
+         endif
+! Pression de surface
+         if ((guide_P).OR.(guide_plevs.EQ.1)) then
+             rcode = nf90_open('ps.nc', nf90_nowrite, ncidps)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no file ps.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             rcode = nf90_inq_varid(ncidps, 'SP', varidps)
+             IF (rcode.NE.NF_NOERR) THEN
+              abort_message='Nudging: error -> no SP variable in file ps.nc'
+              CALL abort_gcm(modname,abort_message,1)
+             ENDIF
+             write(*,*),trim(modname)//' ncidps,varidps',ncidps,varidps
+         endif
+! Coordonnee verticale
+         if (guide_plevs.EQ.0) then
+              rcode = nf90_inq_varid(ncidpl, 'LEVEL', varidpl)
+              IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl, 'PRESSURE', varidpl)
+              write(*,*),trim(modname)//' ncidpl,varidpl',ncidpl,varidpl
+         endif
+! Coefs ap, bp pour calcul de la pression aux differents niveaux
+         IF (guide_plevs.EQ.1) THEN
+             status = nf90_put_var(ncidpl, varidap, apnc, [1], [nlevnc])
+             status = nf90_put_var(ncidpl, varidbp, bpnc, [1], [nlevnc])
+         ELSEIF (guide_plevs.EQ.0) THEN
+             status = nf90_put_var(ncidpl, varidpl, apnc, [1], [nlevnc])
+!FC Pour les corrections la pression est deja en Pascals on commente la ligne ci-dessous
+             IF(convert_Pa) apnc=apnc*100.! conversion en Pascals
+             bpnc(:)=0.
+         ENDIF
+         first=.FALSE.
+     ENDIF ! (first)
+
+! -----------------------------------------------------------------
+!   lecture des champs u, v, T, Q, ps
+! -----------------------------------------------------------------
+
+!  dimensions pour les champs scalaires et le vent zonal
+     start(1)=1
+     start(2)=jjb_u
+     start(3)=1
+     start(4)=timestep
+
+     count(1)=iip1
+     count(2)=jjnb_u
+     count(3)=nlevnc
+     count(4)=1
+
+     IF (invert_y) start(2)=jjp1-jje_u+1
+! Pression
+     if (guide_plevs.EQ.2) then
+         status = nf90_put_var(ncidp, varidp, pnat2, start, count)
+         IF (invert_y) THEN
+!           PRINT*,"Invertion impossible actuellement"
+!           CALL abort_gcm(modname,abort_message,1)
+           CALL invert_lat(iip1,jjnb_u,nlevnc,pnat2)
+         ENDIF
+     endif
+
+!  Vent zonal
+     if (guide_u) then
+         status = nf90_put_var(ncidu, varidu, unat2, start, count)
+         IF (invert_y) THEN
+!           PRINT*,"Invertion impossible actuellement"
+!           CALL abort_gcm(modname,abort_message,1)
+           CALL invert_lat(iip1,jjnb_u,nlevnc,unat2)
+         ENDIF
+
+     endif
+
+
+!  Temperature
+     if (guide_T) then
+         status = nf90_put_var(ncidt, varidt, tnat2, start, count)
+         IF (invert_y) THEN
+!           PRINT*,"Invertion impossible actuellement"
+!           CALL abort_gcm(modname,abort_message,1)
+           CALL invert_lat(iip1,jjnb_u,nlevnc,tnat2)
+         ENDIF
+     endif
+
+!  Humidite
+     if (guide_Q) then
+         status = nf90_put_var(ncidQ, varidQ, qnat2, start, count)
+         IF (invert_y) THEN
+!           PRINT*,"Invertion impossible actuellement"
+!           CALL abort_gcm(modname,abort_message,1)
+           CALL invert_lat(iip1,jjnb_u,nlevnc,qnat2)
+         ENDIF
+
+     endif
+
+!  Vent meridien
+     if (guide_v) then
+         start(2)=jjb_v
+         count(2)=jjnb_v
+         IF (invert_y) start(2)=jjm-jje_v+1
+         status = nf90_put_var(ncidv, varidv, vnat2, start, count)
+         IF (invert_y) THEN
+!           PRINT*,"Invertion impossible actuellement"
+!           CALL abort_gcm(modname,abort_message,1)
+           CALL invert_lat(iip1,jjnb_v,nlevnc,vnat2)
+         ENDIF
+     endif
+
+!  Pression de surface
+     if ((guide_P).OR.(guide_plevs.EQ.1))  then
+         start(2)=jjb_u
+         start(3)=timestep
+         start(4)=0
+         count(2)=jjnb_u
+         count(3)=1
+         count(4)=0
+         IF (invert_y) start(2)=jjp1-jje_u+1
+         status = nf90_put_var(ncidps, varidps, psnat2, start, count)
+         IF (invert_y) THEN
+!           PRINT*,"Invertion impossible actuellement"
+!           CALL abort_gcm(modname,abort_message,1)
+           CALL invert_lat(iip1,jjnb_u,1,psnat2)
+         ENDIF
+     endif
+
+  END SUBROUTINE guide_read
+
+!=======================================================================
+  SUBROUTINE guide_read2D(timestep)
+    USE netcdf, ONLY: nf90_put_var
+    IMPLICIT NONE
+
+    include "netcdf.inc"
+    include "dimensions.h"
+    include "paramet.h"
+
+    INTEGER, INTENT(IN)   :: timestep
+
+    LOGICAL, SAVE         :: first=.TRUE.
+! Identification fichiers et variables NetCDF:
+    INTEGER, SAVE         :: ncidu,varidu,ncidv,varidv,ncidp,varidp
+    INTEGER, SAVE         :: ncidQ,varidQ,ncidt,varidt,ncidps,varidps
+    INTEGER               :: ncidpl,varidpl,varidap,varidbp
+! Variables auxiliaires NetCDF:
+    INTEGER, DIMENSION(4) :: start,count
+    INTEGER               :: status,rcode
+! Variables for 3D extension:
+    REAL, DIMENSION (jjb_u:jje_u,llm)  :: zu
+    REAL, DIMENSION (jjb_v:jje_v,llm)  :: zv
+    INTEGER               :: i
+    CHARACTER (len = 80)   :: abort_message
+    CHARACTER (len = 20)   :: modname = 'guide_read2D'
+    abort_message='pb in guide_read2D'
+
+! -----------------------------------------------------------------
+! Premier appel: initialisation de la lecture des fichiers
+! -----------------------------------------------------------------
+    if (first) then
+         ncidpl=-99
+         write(*,*)trim(modname)//' : opening nudging files '
+! Ap et Bp si niveaux de pression hybrides
+         if (guide_plevs.EQ.1) then
+           write(*,*)trim(modname)//' Reading nudging on model levels'
+           rcode = nf90_open('apbp.nc', nf90_nowrite, ncidpl)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no file apbp.nc'
+           CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           rcode = nf90_inq_varid(ncidpl, 'AP', varidap)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no AP variable in file apbp.nc'
+           CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           rcode = nf90_inq_varid(ncidpl, 'BP', varidbp)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no BP variable in file apbp.nc'
+             CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           write(*,*)trim(modname)//'ncidpl,varidap',ncidpl,varidap
+         endif
+! Pression
+         if (guide_plevs.EQ.2) then
+           rcode = nf90_open('P.nc', nf90_nowrite, ncidp)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no file P.nc'
+             CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           rcode = nf90_inq_varid(ncidp, 'PRES', varidp)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no PRES variable in file P.nc'
+             CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           write(*,*)trim(modname)//' ncidp,varidp',ncidp,varidp
+           if (ncidpl.eq.-99) ncidpl=ncidp
+         endif
+! Vent zonal
+         if (guide_u) then
+           rcode = nf90_open('u.nc', nf90_nowrite, ncidu)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no file u.nc'
+             CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           rcode = nf90_inq_varid(ncidu, 'UWND', varidu)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no UWND variable in file u.nc'
+             CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           write(*,*)trim(modname)//' ncidu,varidu',ncidu,varidu
+           if (ncidpl.eq.-99) ncidpl=ncidu
+         endif
+
+! Vent meridien
+         if (guide_v) then
+           rcode = nf90_open('v.nc', nf90_nowrite, ncidv)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no file v.nc'
+             CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           rcode = nf90_inq_varid(ncidv, 'VWND', varidv)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no VWND variable in file v.nc'
+             CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           write(*,*)trim(modname)//' ncidv,varidv',ncidv,varidv
+           if (ncidpl.eq.-99) ncidpl=ncidv
+        endif
+! Temperature
+         if (guide_T) then
+           rcode = nf90_open('T.nc', nf90_nowrite, ncidt)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no file T.nc'
+             CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           rcode = nf90_inq_varid(ncidt, 'AIR', varidt)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no AIR variable in file T.nc'
+             CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           write(*,*)trim(modname)//' ncidT,varidT',ncidt,varidt
+           if (ncidpl.eq.-99) ncidpl=ncidt
+         endif
+! Humidite
+         if (guide_Q) then
+           rcode = nf90_open('hur.nc', nf90_nowrite, ncidQ)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no file hur.nc'
+             CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           rcode = nf90_inq_varid(ncidQ, 'RH', varidQ)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no RH,variable in file hur.nc'
+             CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           write(*,*)trim(modname)//' ncidQ,varidQ',ncidQ,varidQ
+           if (ncidpl.eq.-99) ncidpl=ncidQ
+         endif
+! Pression de surface
+         if ((guide_P).OR.(guide_plevs.EQ.1)) then
+           rcode = nf90_open('ps.nc', nf90_nowrite, ncidps)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no file ps.nc'
+             CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           rcode = nf90_inq_varid(ncidps, 'SP', varidps)
+           IF (rcode.NE.NF_NOERR) THEN
+             abort_message='Nudging: error -> no SP variable in file ps.nc'
+             CALL abort_gcm(modname,abort_message,1)
+           ENDIF
+           write(*,*)trim(modname)//' ncidps,varidps',ncidps,varidps
+         endif
+! Coordonnee verticale
+         if (guide_plevs.EQ.0) then
+           rcode = nf90_inq_varid(ncidpl, 'LEVEL', varidpl)
+           IF (rcode.NE.0) rcode = nf90_inq_varid(ncidpl, 'PRESSURE', varidpl)
+           write(*,*)trim(modname)//' ncidpl,varidpl',ncidpl,varidpl
+         endif
+! Coefs ap, bp pour calcul de la pression aux differents niveaux
+         if (guide_plevs.EQ.1) then
+             status = nf90_put_var(ncidpl, varidap, apnc, [1], [nlevnc])
+             status = nf90_put_var(ncidpl, varidbp, bpnc, [1], [nlevnc])
+         elseif (guide_plevs.EQ.0) THEN
+             status = nf90_put_var(ncidpl, varidpl, apnc, [1], [nlevnc])
+             apnc=apnc*100.! conversion en Pascals
+             bpnc(:)=0.
+         endif
+         first=.FALSE.
+     endif ! (first)
+
+! -----------------------------------------------------------------
+!   lecture des champs u, v, T, Q, ps
+! -----------------------------------------------------------------
+
+!  dimensions pour les champs scalaires et le vent zonal
+     start(1)=1
+     start(2)=jjb_u
+     start(3)=1
+     start(4)=timestep
+
+     count(1)=1
+     count(2)=jjnb_u
+     count(3)=nlevnc
+     count(4)=1
+
+     IF (invert_y) start(2)=jjp1-jje_u+1
+!  Pression
+     if (guide_plevs.EQ.2) then
+         status = nf90_put_var(ncidp, varidp, zu, start, count)
+         DO i=1,iip1
+             pnat2(i,:,:)=zu(:,:)
+         ENDDO
+
+         IF (invert_y) THEN
+!           PRINT*,"Invertion impossible actuellement"
+!           CALL abort_gcm(modname,abort_message,1)
+           CALL invert_lat(iip1,jjnb_u,nlevnc,pnat2)
+         ENDIF
+     endif
+!  Vent zonal
+     if (guide_u) then
+         status = nf90_put_var(ncidu, varidu, zu, start, count)
+         DO i=1,iip1
+             unat2(i,:,:)=zu(:,:)
+         ENDDO
+
+         IF (invert_y) THEN
+!           PRINT*,"Invertion impossible actuellement"
+!           CALL abort_gcm(modname,abort_message,1)
+           CALL invert_lat(iip1,jjnb_u,nlevnc,unat2)
+         ENDIF
+     endif
+
+
+!  Temperature
+     if (guide_T) then
+         status = nf90_put_var(ncidt, varidt, zu, start, count)
+         DO i=1,iip1
+             tnat2(i,:,:)=zu(:,:)
+         ENDDO
+
+         IF (invert_y) THEN
+!           PRINT*,"Invertion impossible actuellement"
+!           CALL abort_gcm(modname,abort_message,1)
+           CALL invert_lat(iip1,jjnb_u,nlevnc,tnat2)
+         ENDIF
+     endif
+
+!  Humidite
+     if (guide_Q) then
+         status = nf90_put_var(ncidQ, varidQ, zu, start, count)
+         DO i=1,iip1
+             qnat2(i,:,:)=zu(:,:)
+         ENDDO
+
+         IF (invert_y) THEN
+!           PRINT*,"Invertion impossible actuellement"
+!           CALL abort_gcm(modname,abort_message,1)
+           CALL invert_lat(iip1,jjnb_u,nlevnc,qnat2)
+         ENDIF
+     endif
+
+!  Vent meridien
+     if (guide_v) then
+         start(2)=jjb_v
+         count(2)=jjnb_v
+         IF (invert_y) start(2)=jjm-jje_v+1
+         status = nf90_put_var(ncidv, varidv, zv, start, count)
+         DO i=1,iip1
+             vnat2(i,:,:)=zv(:,:)
+         ENDDO
+
+         IF (invert_y) THEN
+
+!           PRINT*,"Invertion impossible actuellement"
+!           CALL abort_gcm(modname,abort_message,1)
+           CALL invert_lat(iip1,jjnb_v,nlevnc,vnat2)
+         ENDIF
+     endif
+
+!  Pression de surface
+     if ((guide_P).OR.(guide_plevs.EQ.1))  then
+         start(2)=jjb_u
+         start(3)=timestep
+         start(4)=0
+         count(2)=jjnb_u
+         count(3)=1
+         count(4)=0
+         IF (invert_y) start(2)=jjp1-jje_u+1
+         status = nf90_put_var(ncidps, varidps, zu(:, 1), start, count)
+         DO i=1,iip1
+             psnat2(i,:)=zu(:,1)
+         ENDDO
+
+         IF (invert_y) THEN
+!           PRINT*,"Invertion impossible actuellement"
+!           CALL abort_gcm(modname,abort_message,1)
+           CALL invert_lat(iip1,jjnb_u,1,psnat2)
+         ENDIF
+     endif
+
+  END SUBROUTINE guide_read2D
+
+!=======================================================================
+  SUBROUTINE guide_out(varname,hsize,vsize,field_loc,factt)
+    USE parallel_lmdz
+    USE mod_hallo, ONLY : gather_field_u, gather_field_v
+    USE comconst_mod, ONLY: pi
+    USE comvert_mod, ONLY: presnivs
+    use netcdf95, only: nf95_def_var, nf95_put_var
+    use netcdf, only: nf90_float, nf90_put_var
+
+    IMPLICIT NONE
+
+    INCLUDE "dimensions.h"
+    INCLUDE "paramet.h"
+    INCLUDE "netcdf.inc"
+    INCLUDE "comgeom2.h"
+
+    ! Variables entree
+    CHARACTER*(*), INTENT(IN)                      :: varname
+    INTEGER,   INTENT (IN)                         :: hsize,vsize
+!   REAL, DIMENSION (iip1,hsize,vsize), INTENT(IN) :: field_loc
+    REAL, DIMENSION (:,:), INTENT(IN) :: field_loc
+    REAL factt
+
+    ! Variables locales
+    INTEGER, SAVE :: timestep=0
+    ! Identites fichier netcdf
+    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, 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), zt(iip1, jjp1), zq(iip1, jjp1)
+    REAL, ALLOCATABLE, SAVE, DIMENSION(:,:,:) :: field_glo
+    CHARACTER(LEN=20),PARAMETER :: modname="guide_out"
+
+!$OMP MASTER
+    ALLOCATE(field_glo(iip1,hsize,vsize))
+!$OMP END MASTER
+!$OMP BARRIER
+
+!    write(*,*)trim(modname)//' after allocation ',hsize,vsize
+
+    IF (hsize==jjp1) THEN
+        CALL gather_field_u(field_loc,field_glo,vsize)
+    ELSE IF (hsize==jjm) THEN
+       CALL gather_field_v(field_loc,field_glo, vsize)
+    ENDIF
+
+!    write(*,*)trim(modname)//' after 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)
+
+    IF (mpi_rank >  0) THEN
+!$OMP MASTER
+       DEALLOCATE(field_glo)
+!$OMP END MASTER
+!$OMP BARRIER
+
+       RETURN
+    ENDIF
+
+!$OMP MASTER
+    IF (timestep.EQ.0) THEN
+! ----------------------------------------------
+! initialisation fichier de sortie
+! ----------------------------------------------
+! Ouverture du fichier
+        ierr=NF_CREATE("guide_ins.nc",IOR(NF_CLOBBER,NF_64BIT_OFFSET),nid)
+! Definition des dimensions
+        ierr=NF_DEF_DIM(nid,"LONU",iip1,id_lonu)
+        ierr=NF_DEF_DIM(nid,"LONV",iip1,id_lonv)
+        ierr=NF_DEF_DIM(nid,"LATU",jjp1,id_latu)
+        ierr=NF_DEF_DIM(nid,"LATV",jjm,id_latv)
+        ierr=NF_DEF_DIM(nid,"LEVEL",llm,id_lev)
+        ierr=NF_DEF_DIM(nid,"TIME",NF_UNLIMITED,id_tim)
+
+! Creation des variables dimensions
+        ierr=NF_DEF_VAR(nid,"LONU",NF_FLOAT,1,id_lonu,vid_lonu)
+        ierr=NF_DEF_VAR(nid,"LONV",NF_FLOAT,1,id_lonv,vid_lonv)
+        ierr=NF_DEF_VAR(nid,"LATU",NF_FLOAT,1,id_latu,vid_latu)
+        ierr=NF_DEF_VAR(nid,"LATV",NF_FLOAT,1,id_latv,vid_latv)
+        ierr=NF_DEF_VAR(nid,"LEVEL",NF_FLOAT,1,id_lev,vid_lev)
+        ierr=NF_DEF_VAR(nid,"cu",NF_FLOAT,2,(/id_lonu,id_latu/),vid_cu)
+        ierr=NF_DEF_VAR(nid,"cv",NF_FLOAT,2,(/id_lonv,id_latv/),vid_cv)
+        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)
+
+! Enregistrement des variables dimensions
+        ierr = nf90_put_var(nid, vid_lonu, rlonu * 180. / pi)
+        ierr = nf90_put_var(nid, vid_lonv, rlonv * 180. / pi)
+        ierr = nf90_put_var(nid, vid_latu, rlatu * 180. / pi)
+        ierr = nf90_put_var(nid, vid_latv, rlatv * 180. / pi)
+        ierr = nf90_put_var(nid, vid_lev, presnivs)
+        ierr = nf90_put_var(nid, vid_cu, cu)
+        ierr = nf90_put_var(nid, vid_cv, cv)
+        ierr = nf90_put_var(nid, vid_au, zu)
+        ierr = nf90_put_var(nid, vid_av, zv)
+        call nf95_put_var(nid, varid_alpha_t, zt)
+        call nf95_put_var(nid, varid_alpha_q, zq)
+! --------------------------------------------------------------------
+! Cr�ation des variables sauvegard�es
+! --------------------------------------------------------------------
+        ierr = NF_REDEF(nid)
+! Pressure (GCM)
+        dim4=(/id_lonv,id_latu,id_lev,id_tim/)
+        ierr = NF_DEF_VAR(nid,"SP",NF_FLOAT,4,dim4,varid)
+! Surface pressure (guidage)
+        IF (guide_P) THEN
+            dim3=(/id_lonv,id_latu,id_tim/)
+            ierr = NF_DEF_VAR(nid,"ps",NF_FLOAT,3,dim3,varid)
+        ENDIF
+! Zonal wind
+        IF (guide_u) THEN
+            dim4=(/id_lonu,id_latu,id_lev,id_tim/)
+            ierr = NF_DEF_VAR(nid,"u",NF_FLOAT,4,dim4,varid)
+            ierr = NF_DEF_VAR(nid,"ua",NF_FLOAT,4,dim4,varid)
+            ierr = NF_DEF_VAR(nid,"ucov",NF_FLOAT,4,dim4,varid)
+        ENDIF
+! Merid. wind
+        IF (guide_v) THEN
+            dim4=(/id_lonv,id_latv,id_lev,id_tim/)
+            ierr = NF_DEF_VAR(nid,"v",NF_FLOAT,4,dim4,varid)
+            ierr = NF_DEF_VAR(nid,"va",NF_FLOAT,4,dim4,varid)
+            ierr = NF_DEF_VAR(nid,"vcov",NF_FLOAT,4,dim4,varid)
+        ENDIF
+! Pot. Temperature
+        IF (guide_T) THEN
+            dim4=(/id_lonv,id_latu,id_lev,id_tim/)
+            ierr = NF_DEF_VAR(nid,"teta",NF_FLOAT,4,dim4,varid)
+        ENDIF
+! Specific Humidity
+        IF (guide_Q) THEN
+            dim4=(/id_lonv,id_latu,id_lev,id_tim/)
+            ierr = NF_DEF_VAR(nid,"q",NF_FLOAT,4,dim4,varid)
+        ENDIF
+
+        ierr = NF_ENDDEF(nid)
+        ierr = NF_CLOSE(nid)
+    ENDIF ! timestep=0
+
+! --------------------------------------------------------------------
+! Enregistrement du champ
+! --------------------------------------------------------------------
+
+    ierr=NF_OPEN("guide_ins.nc",NF_WRITE,nid)
+
+    IF (varname=="SP") timestep=timestep+1
+
+    ierr = NF_INQ_VARID(nid,varname,varid)
+    SELECT CASE (varname)
+    CASE ("SP","ps")
+        start=(/1,1,1,timestep/)
+        count=(/iip1,jjp1,llm,1/)
+    CASE ("v","va","vcov")
+        start=(/1,1,1,timestep/)
+        count=(/iip1,jjm,llm,1/)
+    CASE DEFAULT
+        start=(/1,1,1,timestep/)
+        count=(/iip1,jjp1,llm,1/)
+    END SELECT
+
+!$OMP END MASTER
+!$OMP BARRIER
+
+    SELECT CASE (varname)
+
+    CASE("u","ua")
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+        DO l=1,llm
+            field_glo(:,2:jjm,l)=field_glo(:,2:jjm,l)/cu(:,2:jjm)
+            field_glo(:,1,l)=0. ; field_glo(:,jjp1,l)=0.
+        ENDDO
+    CASE("v","va")
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+        DO l=1,llm
+           field_glo(:,:,l)=field_glo(:,:,l)/cv(:,:)
+        ENDDO
+    END SELECT
+
+!    if (varname=="ua") then
+!    call dump2d(iip1,jjp1,field_glo,'ua gui1 1ere couche ')
+!    call dump2d(iip1,jjp1,field_glo(:,:,llm),'ua gui1 llm ')
+!    endif
+
+!$OMP MASTER
+
+    ierr = nf90_put_var(nid, varid, field_glo, start, count)
+    ierr = NF_CLOSE(nid)
+
+       DEALLOCATE(field_glo)
+!$OMP END MASTER
+!$OMP BARRIER
+
+  END SUBROUTINE guide_out
+
+
+!===========================================================================
+  subroutine correctbid(iim,nl,x)
+    integer iim,nl
+    real x(iim+1,nl)
+    integer i,l
+    real zz
+
+    do l=1,nl
+        do i=2,iim-1
+            if(abs(x(i,l)).gt.1.e10) then
+               zz=0.5*(x(i-1,l)+x(i+1,l))
+              print*,'correction ',i,l,x(i,l),zz
+               x(i,l)=zz
+            endif
+         enddo
+     enddo
+     return
+  end subroutine correctbid
+
+
+!====================================================================
+! Ascii debug output. Could be reactivated
+!====================================================================
+
+subroutine dump2du(var,varname)
+use parallel_lmdz
+use mod_hallo
+implicit none
+include 'dimensions.h'
+include 'paramet.h'
+
+      CHARACTER (len=*) :: varname
+
+
+real, dimension(ijb_u:ije_u) :: var
+
+real, dimension(ip1jmp1) :: var_glob
+
+    RETURN
+
+    call barrier
+    CALL Gather_field_u(var,var_glob,1)
+    call barrier
+
+    if (mpi_rank==0) then
+       call dump2d(iip1,jjp1,var_glob,varname)
+    endif
+
+    call barrier
+
+    return
+    end subroutine dump2du
+
+!====================================================================
+! Ascii debug output. Could be reactivated
+!====================================================================
+subroutine dumpall
+     implicit none
+     include "dimensions.h"
+     include "paramet.h"
+     include "comgeom.h"
+     call barrier
+     call dump2du(alpha_u(ijb_u:ije_u),'  alpha_u couche 1')
+     call dump2du(unat2(:,jjbu:jjeu,nlevnc),'  unat2 couche nlevnc')
+     call dump2du(ugui1(ijb_u:ije_u,1)*sqrt(unscu2(ijb_u:ije_u)),'  ugui1 couche 1')
+     return
+end subroutine dumpall
+
+!===========================================================================
+END MODULE guide_loc_mod
Index: LMDZ6/trunk/libf/dyn3dmem/iniacademic_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/iniacademic_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,389 +1,0 @@
-!
-! $Id: iniacademic.F90 1625 2012-05-09 13:14:48Z lguez $
-!
-SUBROUTINE iniacademic_loc(vcov,ucov,teta,q,masse,ps,phis,time_0)
-
-  USE filtreg_mod, ONLY: inifilr
-  USE infotrac,    ONLY: nqtot, niso, iqIsoPha, tracers, isoName, addPhase
-  USE control_mod, ONLY: day_step,planet_type
-  use exner_hyb_m, only: exner_hyb
-  use exner_milieu_m, only: exner_milieu
-  USE parallel_lmdz, ONLY: ijb_u, ije_u, ijb_v, ije_v
-  USE IOIPSL, ONLY: getin
-
-  USE Write_Field
-  USE comconst_mod, ONLY: cpp, kappa, g, daysec, dtvr, pi, im, jm
-  USE logic_mod, ONLY: iflag_phys, read_start
-  USE comvert_mod, ONLY: ap, bp, preff, pa, presnivs, pressure_exner
-  USE temps_mod, ONLY: annee_ref, day_ini, day_ref
-  USE ener_mod, ONLY: etot0,ptot0,ztot0,stot0,ang0
-  use netcdf, only : NF90_NOWRITE,NF90_OPEN,NF90_NOERR,NF90_INQ_VARID
-  use netcdf, only : NF90_CLOSE, NF90_GET_VAR
-  USE iso_params_mod   ! tnat_* and alpha_ideal_*
-
-
-  !   Author:    Frederic Hourdin      original: 15/01/93
-  ! The forcing defined here is from Held and Suarez, 1994, Bulletin
-  ! of the American Meteorological Society, 75, 1825.
-
-  IMPLICIT NONE
-
-  !   Declararations:
-  !   ---------------
-
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-  include "academic.h"
-  include "iniprint.h"
-
-  !   Arguments:
-  !   ----------
-
-  REAL,INTENT(OUT) :: time_0
-
-  !   fields
-  REAL,INTENT(OUT) :: vcov(ijb_v:ije_v,llm) ! meridional covariant wind
-  REAL,INTENT(OUT) :: ucov(ijb_u:ije_u,llm) ! zonal covariant wind
-  REAL,INTENT(OUT) :: teta(ijb_u:ije_u,llm) ! potential temperature (K)
-  REAL,INTENT(OUT) :: q(ijb_u:ije_u,llm,nqtot) ! advected tracers (.../kg_of_air)
-  REAL,INTENT(OUT) :: ps(ijb_u:ije_u) ! surface pressure (Pa)
-  REAL,INTENT(OUT) :: masse(ijb_u:ije_u,llm) ! air mass in grid cell (kg)
-  REAL,INTENT(OUT) :: phis(ijb_u:ije_u) ! surface geopotential
-
-  !   Local:
-  !   ------
-
-  REAL,ALLOCATABLE :: vcov_glo(:,:),ucov_glo(:,:),teta_glo(:,:)
-  REAL,ALLOCATABLE :: q_glo(:,:),masse_glo(:,:),ps_glo(:)
-  REAL,ALLOCATABLE :: phis_glo(:)
-  REAL p (ip1jmp1,llmp1  )               ! pression aux interfac.des couches
-  REAL pks(ip1jmp1)                      ! exner au  sol
-  REAL pk(ip1jmp1,llm)                   ! exner au milieu des couches
-  REAL phi(ip1jmp1,llm)                  ! geopotentiel
-  REAL ddsin,zsig,tetapv,w_pv  ! variables auxiliaires
-  real tetastrat ! potential temperature in the stratosphere, in K
-  real tetajl(jjp1,llm)
-  INTEGER i,j,l,lsup,ij, iq, iName, iPhase, iqParent
-
-  integer :: nid_relief,varid,ierr
-  real, dimension(iip1,jjp1) :: relief
-
-
-  REAL teta0,ttp,delt_y,delt_z,eps ! Constantes pour profil de T
-  REAL k_f,k_c_a,k_c_s         ! Constantes de rappel
-  LOGICAL ok_geost             ! Initialisation vent geost. ou nul
-  LOGICAL ok_pv                ! Polar Vortex
-  REAL phi_pv,dphi_pv,gam_pv,tetanoise   ! Constantes pour polar vortex 
-
-  real zz,ran1
-  integer idum
-
-  REAL zdtvr, tnat, alpha_ideal
-  LOGICAL :: ltnat1
-  
-  character(len=*),parameter :: modname="iniacademic"
-  character(len=80) :: abort_message
-
-  ! Sanity check: verify that options selected by user are not incompatible
-  if ((iflag_phys==1).and. .not. read_start) then
-    write(lunout,*) trim(modname)," error: if read_start is set to ", &
-    " false then iflag_phys should not be 1"
-    write(lunout,*) "You most likely want an aquaplanet initialisation", &
-    " (iflag_phys >= 100)"
-    call abort_gcm(modname,"incompatible iflag_phys==1 and read_start==.false.",1)
-  endif
-  
-  !-----------------------------------------------------------------------
-  ! 1. Initializations for Earth-like case
-  ! --------------------------------------
-  !
-  ! initialize planet radius, rotation rate,...
-  call conf_planete
-
-  time_0=0.
-  day_ref=1
-  ! annee_ref=0
-
-  im         = iim
-  jm         = jjm
-  day_ini    = 1
-  dtvr    = daysec/REAL(day_step)
-  zdtvr=dtvr
-  etot0      = 0.
-  ptot0      = 0.
-  ztot0      = 0.
-  stot0      = 0.
-  ang0       = 0.
-
-  if (llm == 1) then
-     ! specific initializations for the shallow water case
-     kappa=1
-  endif
-
-  CALL iniconst
-  CALL inigeom
-  CALL inifilr
-
-  ! Initialize pressure and mass field if read_start=.false.
-  IF (.NOT. read_start) THEN
-    ! allocate global fields:
-!    allocate(vcov_glo(ip1jm,llm))
-
-    allocate(ucov_glo(ip1jmp1,llm))
-    allocate(teta_glo(ip1jmp1,llm))
-    allocate(ps_glo(ip1jmp1))
-    allocate(masse_glo(ip1jmp1,llm))
-    allocate(phis_glo(ip1jmp1))
-
-     ! surface pressure
-     ps_glo(:)=preff
-
-     !------------------------------------------------------------------
-     ! Lecture eventuelle d'un fichier de relief interpollee sur la grille
-     ! du modele.
-     ! On suppose que le fichier relief_in.nc est stoké sur une grille
-     ! iim*jjp1
-     ! Facile a créer à partir de la commande
-     ! cdo remapcon,fichier_output_phys.nc Relief.nc relief_in.nc
-     !------------------------------------------------------------------
-
-     relief=0.
-     ierr = NF90_OPEN ('relief_in.nc', NF90_NOWRITE,nid_relief)
-     if (ierr.EQ.NF90_NOERR) THEN
-         ierr=NF90_INQ_VARID(nid_relief,'RELIEF',varid)
-         if (ierr==NF90_NOERR) THEN
-              ierr=NF90_GET_VAR(nid_relief,varid,relief(1:iim,1:jjp1))
-              relief(iip1,:)=relief(1,:)
-         else
-              CALL abort_gcm ('iniacademic','variable RELIEF pas la',1)
-         endif
-     endif
-     ierr = NF90_CLOSE (nid_relief)
-
-
-     !------------------------------------------------------------------
-     ! Initialisation du geopotentiel au sol et de la pression
-     !------------------------------------------------------------------
-
-     print*,'relief=',minval(relief),maxval(relief),'g=',g
-     do j=1,jjp1
-        do i=1,iip1
-           phis_glo((j-1)*iip1+i)=g*relief(i,j)
-        enddo
-     enddo
-     print*,'phis=',minval(phis),maxval(phis),'g=',g
-
-     CALL pression ( ip1jmp1, ap, bp, ps_glo, p       )
-     if (pressure_exner) then
-       CALL exner_hyb( ip1jmp1, ps_glo, p, pks, pk )
-     else
-       call exner_milieu(ip1jmp1,ps_glo,p,pks,pk)
-     endif
-     CALL massdair(p,masse_glo)
-  ENDIF
-
-  if (llm == 1) then
-     ! initialize fields for the shallow water case, if required
-     if (.not.read_start) then
-        phis(ijb_u:ije_u)=0.
-        q(ijb_u:ije_u,1:llm,1:nqtot)=0
-        CALL sw_case_williamson91_6_loc(vcov,ucov,teta,masse,ps)
-     endif
-  endif
-
-  academic_case: if (iflag_phys >= 2) then
-     ! initializations
-
-     ! 1. local parameters
-     ! by convention, winter is in the southern hemisphere
-     ! Geostrophic wind or no wind?
-     ok_geost=.TRUE.
-     CALL getin('ok_geost',ok_geost)
-     ! Constants for Newtonian relaxation and friction
-     k_f=1.                !friction 
-     CALL getin('k_j',k_f)
-     k_f=1./(daysec*k_f)
-     k_c_s=4.  !cooling surface
-     CALL getin('k_c_s',k_c_s)
-     k_c_s=1./(daysec*k_c_s)
-     k_c_a=40. !cooling free atm
-     CALL getin('k_c_a',k_c_a)
-     k_c_a=1./(daysec*k_c_a)
-     ! Constants for Teta equilibrium profile
-     teta0=315.     ! mean Teta (S.H. 315K)
-     CALL getin('teta0',teta0)
-     ttp=200.       ! Tropopause temperature (S.H. 200K)
-     CALL getin('ttp',ttp)
-     eps=0.         ! Deviation to N-S symmetry(~0-20K)
-     CALL getin('eps',eps)
-     delt_y=60.     ! Merid Temp. Gradient (S.H. 60K)
-     CALL getin('delt_y',delt_y)
-     delt_z=10.     ! Vertical Gradient (S.H. 10K)
-     CALL getin('delt_z',delt_z)
-     ! Polar vortex
-     ok_pv=.false.
-     CALL getin('ok_pv',ok_pv)
-     phi_pv=-50.            ! Latitude of edge of vortex
-     CALL getin('phi_pv',phi_pv)
-     phi_pv=phi_pv*pi/180.
-     dphi_pv=5.             ! Width of the edge
-     CALL getin('dphi_pv',dphi_pv)
-     dphi_pv=dphi_pv*pi/180.
-     gam_pv=4.              ! -dT/dz vortex (in K/km)
-     CALL getin('gam_pv',gam_pv)
-     tetanoise=0.005
-     CALL getin('tetanoise',tetanoise)
-
-     ! 2. Initialize fields towards which to relax
-     ! Friction
-     knewt_g=k_c_a
-     DO l=1,llm
-        zsig=presnivs(l)/preff
-        knewt_t(l)=(k_c_s-k_c_a)*MAX(0.,(zsig-0.7)/0.3)
-        kfrict(l)=k_f*MAX(0.,(zsig-0.7)/0.3)
-     ENDDO
-     DO j=1,jjp1
-        clat4((j-1)*iip1+1:j*iip1)=cos(rlatu(j))**4
-     ENDDO
-
-     ! Potential temperature 
-     DO l=1,llm
-        zsig=presnivs(l)/preff
-        tetastrat=ttp*zsig**(-kappa)
-        tetapv=tetastrat
-        IF ((ok_pv).AND.(zsig.LT.0.1)) THEN
-           tetapv=tetastrat*(zsig*10.)**(kappa*cpp*gam_pv/1000./g)
-        ENDIF
-        DO j=1,jjp1
-           ! Troposphere
-           ddsin=sin(rlatu(j))
-           tetajl(j,l)=teta0-delt_y*ddsin*ddsin+eps*ddsin &
-                -delt_z*(1.-ddsin*ddsin)*log(zsig)
-           if (planet_type=="giant") then
-             tetajl(j,l)=teta0+(delt_y*                   &
-                ((sin(rlatu(j)*3.14159*eps+0.0001))**2)   &
-                / ((rlatu(j)*3.14159*eps+0.0001)**2))     &
-                -delt_z*log(zsig)
-           endif
-           ! Profil stratospherique isotherme (+vortex)
-           w_pv=(1.-tanh((rlatu(j)-phi_pv)/dphi_pv))/2.
-           tetastrat=tetastrat*(1.-w_pv)+tetapv*w_pv             
-           tetajl(j,l)=MAX(tetajl(j,l),tetastrat)  
-        ENDDO
-     ENDDO
-
-     !          CALL writefield('theta_eq',tetajl)
-
-     do l=1,llm
-        do j=1,jjp1
-           do i=1,iip1
-              ij=(j-1)*iip1+i
-              tetarappel(ij,l)=tetajl(j,l)
-           enddo
-        enddo
-     enddo
-
-     ! 3. Initialize fields (if necessary)
-     IF (.NOT. read_start) THEN
-        ! bulk initialization of temperature
-        IF (iflag_phys>10000) THEN
-        ! Particular case to impose a constant temperature T0=0.01*iflag_phys
-           teta_glo(:,:)= 0.01*iflag_phys/(pk(:,:)/cpp)
-        ELSE
-           teta_glo(:,:)=tetarappel(:,:)
-        ENDIF
-        ! geopotential
-        CALL geopot(ip1jmp1,teta_glo,pk,pks,phis_glo,phi)
-
-        ! winds
-        if (ok_geost) then
-           call ugeostr(phi,ucov_glo)
-        else
-           ucov_glo(:,:)=0.
-        endif
-        vcov(ijb_v:ije_v,1:llm)=0.
-
-        ! bulk initialization of tracers
-        if (planet_type=="earth") then
-           ltnat1 = .TRUE.; CALL getin('tnateq1', ltnat1)
-           ! Earth: first two tracers will be water
-           do iq=1,nqtot
-              q(ijb_u:ije_u,:,iq)=0.
-              IF(tracers(iq)%name == addPhase('H2O', 'g')) q(ijb_u:ije_u,:,iq)=1.e-10
-              IF(tracers(iq)%name == addPhase('H2O', 'l')) q(ijb_u:ije_u,:,iq)=1.e-15
-
-              ! CRisi: init des isotopes
-              ! distill de Rayleigh très simplifiée
-              iName    = tracers(iq)%iso_iName
-              if (niso <= 0 .OR. iName <= 0) CYCLE
-              iPhase   = tracers(iq)%iso_iPhase
-              iqParent = tracers(iq)%iqParent
-              IF(tracers(iq)%iso_iZone == 0) THEN
-                 IF(ltnat1) THEN
-                    tnat = 1.0
-                    alpha_ideal = 1.0
-                    WRITE(lunout, *) 'In '//TRIM(modname)//': !!!  Beware: alpha_ideal put to 1  !!!'
-                 ELSE
-                    SELECT CASE(isoName(iName))
-                      CASE('H216O'); tnat = tnat_H216O; alpha_ideal = alpha_ideal_H216O
-                      CASE('H217O'); tnat = tnat_H217O; alpha_ideal = alpha_ideal_H217O
-                      CASE('H218O'); tnat = tnat_H218O; alpha_ideal = alpha_ideal_H218O
-                      CASE('HDO');   tnat = tnat_HDO;   alpha_ideal = alpha_ideal_HDO
-                      CASE('HTO');   tnat = tnat_HTO;   alpha_ideal = alpha_ideal_HTO
-                      CASE DEFAULT
-                         CALL abort_gcm(TRIM(modname),'unknown isotope "'//TRIM(isoName(iName))//'" ; check tracer.def file',1)
-                    END SELECT
-                 END IF
-                 q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqParent)*tnat*(q(ijb_u:ije_u,:,iqParent)/30.e-3)**(alpha_ideal-1.)
-              ELSE !IF(tracers(iq)%iso_iZone == 0) THEN
-                 IF(tracers(iq)%iso_iZone == 1) THEN ! a verifier.
-                    ! correction le 14 mai 2024 pour que tous les traceurs soient de la couleur 1.
-                    ! Sinon, on va avoir des porblèmes de conservation de masse de traceurs.
-                    q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqIsoPha(iName,iPhase))
-                 else !IF(tracers(iq)%iso_iZone == 1) THEN
-                    q(ijb_u:ije_u,:,iq) = 0.0
-                 endif !IF(tracers(iq)%iso_iZone == 1) THEN
-              END IF !IF(tracers(iq)%iso_iZone == 0) THEN
-           enddo
-        else
-           q(ijb_u:ije_u,:,:)=0
-        endif ! of if (planet_type=="earth")
-
-        call check_isotopes(q,ijb_u,ije_u,'iniacademic_loc')
-
-        ! add random perturbation to temperature
-        idum  = -1
-        zz = ran1(idum)
-        idum  = 0
-        do l=1,llm
-           do ij=iip2,ip1jm
-              teta_glo(ij,l)=teta_glo(ij,l)*(1.+tetanoise*ran1(idum))
-           enddo
-        enddo
-
-        ! maintain periodicity in longitude
-        do l=1,llm
-           do ij=1,ip1jmp1,iip1
-              teta_glo(ij+iim,l)=teta_glo(ij,l)
-           enddo
-        enddo
-
-        ! copy data from global array to local array:
-        teta(ijb_u:ije_u,:)=teta_glo(ijb_u:ije_u,:)
-        ucov(ijb_u:ije_u,:)=ucov_glo(ijb_u:ije_u,:)
-!        vcov(ijb_v:ije_v,:)=vcov_glo(ijb_v:ije_v,:)
-        masse(ijb_u:ije_u,:)=masse_glo(ijb_u:ije_u,:)
-        ps(ijb_u:ije_u)=ps_glo(ijb_u:ije_u)
-        phis(ijb_u:ije_u)=phis_glo(ijb_u:ije_u)
-
-        deallocate(teta_glo)
-        deallocate(ucov_glo)
-!        deallocate(vcov_glo)
-        deallocate(masse_glo)
-        deallocate(ps_glo)
-        deallocate(phis_glo)
-     ENDIF ! of IF (.NOT. read_start)
-  endif academic_case
-
-END SUBROUTINE iniacademic_loc
Index: LMDZ6/trunk/libf/dyn3dmem/iniacademic_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/iniacademic_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/iniacademic_loc.f90	(revision 5268)
@@ -0,0 +1,389 @@
+!
+! $Id: iniacademic.F90 1625 2012-05-09 13:14:48Z lguez $
+!
+SUBROUTINE iniacademic_loc(vcov,ucov,teta,q,masse,ps,phis,time_0)
+
+  USE filtreg_mod, ONLY: inifilr
+  USE infotrac,    ONLY: nqtot, niso, iqIsoPha, tracers, isoName, addPhase
+  USE control_mod, ONLY: day_step,planet_type
+  use exner_hyb_m, only: exner_hyb
+  use exner_milieu_m, only: exner_milieu
+  USE parallel_lmdz, ONLY: ijb_u, ije_u, ijb_v, ije_v
+  USE IOIPSL, ONLY: getin
+
+  USE Write_Field
+  USE comconst_mod, ONLY: cpp, kappa, g, daysec, dtvr, pi, im, jm
+  USE logic_mod, ONLY: iflag_phys, read_start
+  USE comvert_mod, ONLY: ap, bp, preff, pa, presnivs, pressure_exner
+  USE temps_mod, ONLY: annee_ref, day_ini, day_ref
+  USE ener_mod, ONLY: etot0,ptot0,ztot0,stot0,ang0
+  use netcdf, only : NF90_NOWRITE,NF90_OPEN,NF90_NOERR,NF90_INQ_VARID
+  use netcdf, only : NF90_CLOSE, NF90_GET_VAR
+  USE iso_params_mod   ! tnat_* and alpha_ideal_*
+
+
+  !   Author:    Frederic Hourdin      original: 15/01/93
+  ! The forcing defined here is from Held and Suarez, 1994, Bulletin
+  ! of the American Meteorological Society, 75, 1825.
+
+  IMPLICIT NONE
+
+  !   Declararations:
+  !   ---------------
+
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+  include "academic.h"
+  include "iniprint.h"
+
+  !   Arguments:
+  !   ----------
+
+  REAL,INTENT(OUT) :: time_0
+
+  !   fields
+  REAL,INTENT(OUT) :: vcov(ijb_v:ije_v,llm) ! meridional covariant wind
+  REAL,INTENT(OUT) :: ucov(ijb_u:ije_u,llm) ! zonal covariant wind
+  REAL,INTENT(OUT) :: teta(ijb_u:ije_u,llm) ! potential temperature (K)
+  REAL,INTENT(OUT) :: q(ijb_u:ije_u,llm,nqtot) ! advected tracers (.../kg_of_air)
+  REAL,INTENT(OUT) :: ps(ijb_u:ije_u) ! surface pressure (Pa)
+  REAL,INTENT(OUT) :: masse(ijb_u:ije_u,llm) ! air mass in grid cell (kg)
+  REAL,INTENT(OUT) :: phis(ijb_u:ije_u) ! surface geopotential
+
+  !   Local:
+  !   ------
+
+  REAL,ALLOCATABLE :: vcov_glo(:,:),ucov_glo(:,:),teta_glo(:,:)
+  REAL,ALLOCATABLE :: q_glo(:,:),masse_glo(:,:),ps_glo(:)
+  REAL,ALLOCATABLE :: phis_glo(:)
+  REAL p (ip1jmp1,llmp1  )               ! pression aux interfac.des couches
+  REAL pks(ip1jmp1)                      ! exner au  sol
+  REAL pk(ip1jmp1,llm)                   ! exner au milieu des couches
+  REAL phi(ip1jmp1,llm)                  ! geopotentiel
+  REAL ddsin,zsig,tetapv,w_pv  ! variables auxiliaires
+  real tetastrat ! potential temperature in the stratosphere, in K
+  real tetajl(jjp1,llm)
+  INTEGER i,j,l,lsup,ij, iq, iName, iPhase, iqParent
+
+  integer :: nid_relief,varid,ierr
+  real, dimension(iip1,jjp1) :: relief
+
+
+  REAL teta0,ttp,delt_y,delt_z,eps ! Constantes pour profil de T
+  REAL k_f,k_c_a,k_c_s         ! Constantes de rappel
+  LOGICAL ok_geost             ! Initialisation vent geost. ou nul
+  LOGICAL ok_pv                ! Polar Vortex
+  REAL phi_pv,dphi_pv,gam_pv,tetanoise   ! Constantes pour polar vortex 
+
+  real zz,ran1
+  integer idum
+
+  REAL zdtvr, tnat, alpha_ideal
+  LOGICAL :: ltnat1
+  
+  character(len=*),parameter :: modname="iniacademic"
+  character(len=80) :: abort_message
+
+  ! Sanity check: verify that options selected by user are not incompatible
+  if ((iflag_phys==1).and. .not. read_start) then
+    write(lunout,*) trim(modname)," error: if read_start is set to ", &
+    " false then iflag_phys should not be 1"
+    write(lunout,*) "You most likely want an aquaplanet initialisation", &
+    " (iflag_phys >= 100)"
+    call abort_gcm(modname,"incompatible iflag_phys==1 and read_start==.false.",1)
+  endif
+  
+  !-----------------------------------------------------------------------
+  ! 1. Initializations for Earth-like case
+  ! --------------------------------------
+  !
+  ! initialize planet radius, rotation rate,...
+  call conf_planete
+
+  time_0=0.
+  day_ref=1
+  ! annee_ref=0
+
+  im         = iim
+  jm         = jjm
+  day_ini    = 1
+  dtvr    = daysec/REAL(day_step)
+  zdtvr=dtvr
+  etot0      = 0.
+  ptot0      = 0.
+  ztot0      = 0.
+  stot0      = 0.
+  ang0       = 0.
+
+  if (llm == 1) then
+     ! specific initializations for the shallow water case
+     kappa=1
+  endif
+
+  CALL iniconst
+  CALL inigeom
+  CALL inifilr
+
+  ! Initialize pressure and mass field if read_start=.false.
+  IF (.NOT. read_start) THEN
+    ! allocate global fields:
+!    allocate(vcov_glo(ip1jm,llm))
+
+    allocate(ucov_glo(ip1jmp1,llm))
+    allocate(teta_glo(ip1jmp1,llm))
+    allocate(ps_glo(ip1jmp1))
+    allocate(masse_glo(ip1jmp1,llm))
+    allocate(phis_glo(ip1jmp1))
+
+     ! surface pressure
+     ps_glo(:)=preff
+
+     !------------------------------------------------------------------
+     ! Lecture eventuelle d'un fichier de relief interpollee sur la grille
+     ! du modele.
+     ! On suppose que le fichier relief_in.nc est stoké sur une grille
+     ! iim*jjp1
+     ! Facile a créer à partir de la commande
+     ! cdo remapcon,fichier_output_phys.nc Relief.nc relief_in.nc
+     !------------------------------------------------------------------
+
+     relief=0.
+     ierr = NF90_OPEN ('relief_in.nc', NF90_NOWRITE,nid_relief)
+     if (ierr.EQ.NF90_NOERR) THEN
+         ierr=NF90_INQ_VARID(nid_relief,'RELIEF',varid)
+         if (ierr==NF90_NOERR) THEN
+              ierr=NF90_GET_VAR(nid_relief,varid,relief(1:iim,1:jjp1))
+              relief(iip1,:)=relief(1,:)
+         else
+              CALL abort_gcm ('iniacademic','variable RELIEF pas la',1)
+         endif
+     endif
+     ierr = NF90_CLOSE (nid_relief)
+
+
+     !------------------------------------------------------------------
+     ! Initialisation du geopotentiel au sol et de la pression
+     !------------------------------------------------------------------
+
+     print*,'relief=',minval(relief),maxval(relief),'g=',g
+     do j=1,jjp1
+        do i=1,iip1
+           phis_glo((j-1)*iip1+i)=g*relief(i,j)
+        enddo
+     enddo
+     print*,'phis=',minval(phis),maxval(phis),'g=',g
+
+     CALL pression ( ip1jmp1, ap, bp, ps_glo, p       )
+     if (pressure_exner) then
+       CALL exner_hyb( ip1jmp1, ps_glo, p, pks, pk )
+     else
+       call exner_milieu(ip1jmp1,ps_glo,p,pks,pk)
+     endif
+     CALL massdair(p,masse_glo)
+  ENDIF
+
+  if (llm == 1) then
+     ! initialize fields for the shallow water case, if required
+     if (.not.read_start) then
+        phis(ijb_u:ije_u)=0.
+        q(ijb_u:ije_u,1:llm,1:nqtot)=0
+        CALL sw_case_williamson91_6_loc(vcov,ucov,teta,masse,ps)
+     endif
+  endif
+
+  academic_case: if (iflag_phys >= 2) then
+     ! initializations
+
+     ! 1. local parameters
+     ! by convention, winter is in the southern hemisphere
+     ! Geostrophic wind or no wind?
+     ok_geost=.TRUE.
+     CALL getin('ok_geost',ok_geost)
+     ! Constants for Newtonian relaxation and friction
+     k_f=1.                !friction 
+     CALL getin('k_j',k_f)
+     k_f=1./(daysec*k_f)
+     k_c_s=4.  !cooling surface
+     CALL getin('k_c_s',k_c_s)
+     k_c_s=1./(daysec*k_c_s)
+     k_c_a=40. !cooling free atm
+     CALL getin('k_c_a',k_c_a)
+     k_c_a=1./(daysec*k_c_a)
+     ! Constants for Teta equilibrium profile
+     teta0=315.     ! mean Teta (S.H. 315K)
+     CALL getin('teta0',teta0)
+     ttp=200.       ! Tropopause temperature (S.H. 200K)
+     CALL getin('ttp',ttp)
+     eps=0.         ! Deviation to N-S symmetry(~0-20K)
+     CALL getin('eps',eps)
+     delt_y=60.     ! Merid Temp. Gradient (S.H. 60K)
+     CALL getin('delt_y',delt_y)
+     delt_z=10.     ! Vertical Gradient (S.H. 10K)
+     CALL getin('delt_z',delt_z)
+     ! Polar vortex
+     ok_pv=.false.
+     CALL getin('ok_pv',ok_pv)
+     phi_pv=-50.            ! Latitude of edge of vortex
+     CALL getin('phi_pv',phi_pv)
+     phi_pv=phi_pv*pi/180.
+     dphi_pv=5.             ! Width of the edge
+     CALL getin('dphi_pv',dphi_pv)
+     dphi_pv=dphi_pv*pi/180.
+     gam_pv=4.              ! -dT/dz vortex (in K/km)
+     CALL getin('gam_pv',gam_pv)
+     tetanoise=0.005
+     CALL getin('tetanoise',tetanoise)
+
+     ! 2. Initialize fields towards which to relax
+     ! Friction
+     knewt_g=k_c_a
+     DO l=1,llm
+        zsig=presnivs(l)/preff
+        knewt_t(l)=(k_c_s-k_c_a)*MAX(0.,(zsig-0.7)/0.3)
+        kfrict(l)=k_f*MAX(0.,(zsig-0.7)/0.3)
+     ENDDO
+     DO j=1,jjp1
+        clat4((j-1)*iip1+1:j*iip1)=cos(rlatu(j))**4
+     ENDDO
+
+     ! Potential temperature 
+     DO l=1,llm
+        zsig=presnivs(l)/preff
+        tetastrat=ttp*zsig**(-kappa)
+        tetapv=tetastrat
+        IF ((ok_pv).AND.(zsig.LT.0.1)) THEN
+           tetapv=tetastrat*(zsig*10.)**(kappa*cpp*gam_pv/1000./g)
+        ENDIF
+        DO j=1,jjp1
+           ! Troposphere
+           ddsin=sin(rlatu(j))
+           tetajl(j,l)=teta0-delt_y*ddsin*ddsin+eps*ddsin &
+                -delt_z*(1.-ddsin*ddsin)*log(zsig)
+           if (planet_type=="giant") then
+             tetajl(j,l)=teta0+(delt_y*                   &
+                ((sin(rlatu(j)*3.14159*eps+0.0001))**2)   &
+                / ((rlatu(j)*3.14159*eps+0.0001)**2))     &
+                -delt_z*log(zsig)
+           endif
+           ! Profil stratospherique isotherme (+vortex)
+           w_pv=(1.-tanh((rlatu(j)-phi_pv)/dphi_pv))/2.
+           tetastrat=tetastrat*(1.-w_pv)+tetapv*w_pv             
+           tetajl(j,l)=MAX(tetajl(j,l),tetastrat)  
+        ENDDO
+     ENDDO
+
+     !          CALL writefield('theta_eq',tetajl)
+
+     do l=1,llm
+        do j=1,jjp1
+           do i=1,iip1
+              ij=(j-1)*iip1+i
+              tetarappel(ij,l)=tetajl(j,l)
+           enddo
+        enddo
+     enddo
+
+     ! 3. Initialize fields (if necessary)
+     IF (.NOT. read_start) THEN
+        ! bulk initialization of temperature
+        IF (iflag_phys>10000) THEN
+        ! Particular case to impose a constant temperature T0=0.01*iflag_phys
+           teta_glo(:,:)= 0.01*iflag_phys/(pk(:,:)/cpp)
+        ELSE
+           teta_glo(:,:)=tetarappel(:,:)
+        ENDIF
+        ! geopotential
+        CALL geopot(ip1jmp1,teta_glo,pk,pks,phis_glo,phi)
+
+        ! winds
+        if (ok_geost) then
+           call ugeostr(phi,ucov_glo)
+        else
+           ucov_glo(:,:)=0.
+        endif
+        vcov(ijb_v:ije_v,1:llm)=0.
+
+        ! bulk initialization of tracers
+        if (planet_type=="earth") then
+           ltnat1 = .TRUE.; CALL getin('tnateq1', ltnat1)
+           ! Earth: first two tracers will be water
+           do iq=1,nqtot
+              q(ijb_u:ije_u,:,iq)=0.
+              IF(tracers(iq)%name == addPhase('H2O', 'g')) q(ijb_u:ije_u,:,iq)=1.e-10
+              IF(tracers(iq)%name == addPhase('H2O', 'l')) q(ijb_u:ije_u,:,iq)=1.e-15
+
+              ! CRisi: init des isotopes
+              ! distill de Rayleigh très simplifiée
+              iName    = tracers(iq)%iso_iName
+              if (niso <= 0 .OR. iName <= 0) CYCLE
+              iPhase   = tracers(iq)%iso_iPhase
+              iqParent = tracers(iq)%iqParent
+              IF(tracers(iq)%iso_iZone == 0) THEN
+                 IF(ltnat1) THEN
+                    tnat = 1.0
+                    alpha_ideal = 1.0
+                    WRITE(lunout, *) 'In '//TRIM(modname)//': !!!  Beware: alpha_ideal put to 1  !!!'
+                 ELSE
+                    SELECT CASE(isoName(iName))
+                      CASE('H216O'); tnat = tnat_H216O; alpha_ideal = alpha_ideal_H216O
+                      CASE('H217O'); tnat = tnat_H217O; alpha_ideal = alpha_ideal_H217O
+                      CASE('H218O'); tnat = tnat_H218O; alpha_ideal = alpha_ideal_H218O
+                      CASE('HDO');   tnat = tnat_HDO;   alpha_ideal = alpha_ideal_HDO
+                      CASE('HTO');   tnat = tnat_HTO;   alpha_ideal = alpha_ideal_HTO
+                      CASE DEFAULT
+                         CALL abort_gcm(TRIM(modname),'unknown isotope "'//TRIM(isoName(iName))//'" ; check tracer.def file',1)
+                    END SELECT
+                 END IF
+                 q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqParent)*tnat*(q(ijb_u:ije_u,:,iqParent)/30.e-3)**(alpha_ideal-1.)
+              ELSE !IF(tracers(iq)%iso_iZone == 0) THEN
+                 IF(tracers(iq)%iso_iZone == 1) THEN ! a verifier.
+                    ! correction le 14 mai 2024 pour que tous les traceurs soient de la couleur 1.
+                    ! Sinon, on va avoir des porblèmes de conservation de masse de traceurs.
+                    q(ijb_u:ije_u,:,iq) = q(ijb_u:ije_u,:,iqIsoPha(iName,iPhase))
+                 else !IF(tracers(iq)%iso_iZone == 1) THEN
+                    q(ijb_u:ije_u,:,iq) = 0.0
+                 endif !IF(tracers(iq)%iso_iZone == 1) THEN
+              END IF !IF(tracers(iq)%iso_iZone == 0) THEN
+           enddo
+        else
+           q(ijb_u:ije_u,:,:)=0
+        endif ! of if (planet_type=="earth")
+
+        call check_isotopes(q,ijb_u,ije_u,'iniacademic_loc')
+
+        ! add random perturbation to temperature
+        idum  = -1
+        zz = ran1(idum)
+        idum  = 0
+        do l=1,llm
+           do ij=iip2,ip1jm
+              teta_glo(ij,l)=teta_glo(ij,l)*(1.+tetanoise*ran1(idum))
+           enddo
+        enddo
+
+        ! maintain periodicity in longitude
+        do l=1,llm
+           do ij=1,ip1jmp1,iip1
+              teta_glo(ij+iim,l)=teta_glo(ij,l)
+           enddo
+        enddo
+
+        ! copy data from global array to local array:
+        teta(ijb_u:ije_u,:)=teta_glo(ijb_u:ije_u,:)
+        ucov(ijb_u:ije_u,:)=ucov_glo(ijb_u:ije_u,:)
+!        vcov(ijb_v:ije_v,:)=vcov_glo(ijb_v:ije_v,:)
+        masse(ijb_u:ije_u,:)=masse_glo(ijb_u:ije_u,:)
+        ps(ijb_u:ije_u)=ps_glo(ijb_u:ije_u)
+        phis(ijb_u:ije_u)=phis_glo(ijb_u:ije_u)
+
+        deallocate(teta_glo)
+        deallocate(ucov_glo)
+!        deallocate(vcov_glo)
+        deallocate(masse_glo)
+        deallocate(ps_glo)
+        deallocate(phis_glo)
+     ENDIF ! of IF (.NOT. read_start)
+  endif academic_case
+
+END SUBROUTINE iniacademic_loc
Index: LMDZ6/trunk/libf/dyn3dmem/initdynav_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/initdynav_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,282 +1,0 @@
-!
-! $Id: initdynav_p.F 1279 2009-12-10 09:02:56Z fairhead $
-!
-subroutine initdynav_loc(day0,anne0,tstep,t_ops,t_wrt)
-
-  ! This routine needs IOIPSL
-   USE IOIPSL
-
-   USE parallel_lmdz
-   use Write_field
-   use misc_mod
-    ! USE infotrac
-   use com_io_dyn_mod, only : histaveid,histvaveid,histuaveid,       &
-         dynhistave_file,dynhistvave_file,dynhistuave_file
-   USE comconst_mod, ONLY: pi
-   USE comvert_mod, ONLY: presnivs
-   USE temps_mod, ONLY: itau_dyn
-
-   implicit none
-
-  !
-  !   Routine d'initialisation des ecritures des fichiers histoires LMDZ
-  !   au format IOIPSL. Initialisation du fichier histoire moyenne.
-  !
-  !   Appels succesifs des routines: histbeg
-  !                              histhori
-  !                              histver
-  !                              histdef
-  !                              histend
-  !
-  !   Entree:
-  !
-  !  day0,anne0: date de reference
-  !  tstep : frequence d'ecriture
-  !  t_ops: frequence de l'operation pour IOIPSL
-  !  t_wrt: frequence d'ecriture sur le fichier
-  !
-  !   Sortie:
-  !  fileid: ID du fichier netcdf cree
-  !
-  !   L. Fairhead, LMD, 03/99
-  !
-  ! =====================================================================
-  !
-  !   Declarations
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-  include "description.h"
-  include "iniprint.h"
-
-  !   Arguments
-  !
-  integer(kind=4) :: day0, anne0
-  real :: tstep, t_ops, t_wrt
-
-  ! This routine needs IOIPSL
-  !   Variables locales
-  !
-  integer :: tau0
-  real :: zjulian
-  integer :: iq
-  real :: rlong(iip1,jjp1), rlat(iip1,jjp1)
-  integer :: uhoriid, vhoriid, thoriid
-  integer :: zvertiid,zvertiidv,zvertiidu
-  integer :: ii,jj
-  integer :: zan, dayref
-  integer :: jjb,jje,jjn
-
-  ! definition du domaine d'ecriture pour le rebuild
-
-  INTEGER,DIMENSION(2) :: ddid
-  INTEGER,DIMENSION(2) :: dsg
-  INTEGER,DIMENSION(2) :: dsl
-  INTEGER,DIMENSION(2) :: dpf
-  INTEGER,DIMENSION(2) :: dpl
-  INTEGER,DIMENSION(2) :: dhs
-  INTEGER,DIMENSION(2) :: dhe
-
-  INTEGER :: dynhistave_domain_id
-  INTEGER :: dynhistvave_domain_id
-  INTEGER :: dynhistuave_domain_id
-
-  if (adjust) return
-
-  !
-  !  Initialisations
-  !
-  pi = 4. * atan (1.)
-  !
-  !  Appel a histbeg: creation du fichier netcdf et initialisations diverses
-  !
-
-  zan = anne0
-  dayref = day0
-  CALL ymds2ju(zan, 1, dayref, 0.0, zjulian)
-  tau0 = itau_dyn
-
-  do jj = 1, jjp1
-    do ii = 1, iip1
-      rlong(ii,jj) = rlonv(ii) * 180. / pi
-      rlat(ii,jj)  = rlatu(jj) * 180. / pi
-    enddo
-  enddo
-
-
-  ! Creation de 3 fichiers pour les differentes grilles horizontales
-  ! Restriction de IOIPSL: seulement 2 coordonnees dans le meme fichier
-  ! Grille Scalaire
-
-  jjb=jj_begin
-  jje=jj_end
-  jjn=jj_nb
-
-  ddid=(/ 1,2 /)
-  dsg=(/ iip1,jjp1 /)
-  dsl=(/ iip1,jjn /)
-  dpf=(/ 1,jjb /)
-  dpl=(/ iip1,jje /)
-  dhs=(/ 0,0 /)
-  dhe=(/ 0,0 /)
-
-
-  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
-        'box',dynhistave_domain_id)
-
-  call histbeg(dynhistave_file,iip1, rlong(:,1), jjn, &
-        rlat(1,jjb:jje), 1, iip1, 1, jjn,tau0, &
-        zjulian, tstep, thoriid, &
-        histaveid,dynhistave_domain_id)
-
-
-  !  Creation du fichier histoire pour les grilles en V et U (oblige pour l'instant,
-  !  IOIPSL ne permet pas de grilles avec des nombres de point differents dans
-  !  un meme fichier)
-  ! Grille V
-
-  jjb=jj_begin
-  jje=jj_end
-  jjn=jj_nb
-  IF (pole_sud) jjn=jjn-1
-  IF (pole_sud) jje=jje-1
-
-  do jj = jjb, jje
-    do ii = 1, iip1
-      rlong(ii,jj) = rlonv(ii) * 180. / pi
-      rlat(ii,jj) = rlatv(jj) * 180. / pi
-    enddo
-  enddo
-
-  ddid=(/ 1,2 /)
-  dsg=(/ iip1,jjm /)
-  dsl=(/ iip1,jjn /)
-  dpf=(/ 1,jjb /)
-  dpl=(/ iip1,jje /)
-  dhs=(/ 0,0 /)
-  dhe=(/ 0,0 /)
-
-
-  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
-        'box',dynhistvave_domain_id)
-
-  call histbeg(dynhistvave_file,iip1, rlong(:,1), jjn, &
-        rlat(1,jjb:jje), 1, iip1, 1, jjn,tau0, &
-        zjulian, tstep, vhoriid, &
-        histvaveid,dynhistvave_domain_id)
-
-  ! Grille U
-
-  do jj = 1, jjp1
-    do ii = 1, iip1
-      rlong(ii,jj) = rlonu(ii) * 180. / pi
-      rlat(ii,jj) = rlatu(jj) * 180. / pi
-    enddo
-  enddo
-
-  jjb=jj_begin
-  jje=jj_end
-  jjn=jj_nb
-
-  ddid=(/ 1,2 /)
-  dsg=(/ iip1,jjp1 /)
-  dsl=(/ iip1,jjn /)
-  dpf=(/ 1,jjb /)
-  dpl=(/ iip1,jje /)
-  dhs=(/ 0,0 /)
-  dhe=(/ 0,0 /)
-
-
-  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
-        'box',dynhistuave_domain_id)
-
-  call histbeg(dynhistuave_file,iip1, rlong(:,1), jjn, &
-        rlat(1,jjb:jje), 1, iip1, 1, jjn,tau0, &
-        zjulian, tstep, uhoriid, &
-        histuaveid,dynhistuave_domain_id)
-
-
-  !
-  !  Appel a histvert pour la grille verticale
-  !
-  call histvert(histaveid,'presnivs','Niveaux Pression&
-        &     approximatifs','mb',llm, presnivs/100., zvertiid,'down')
-  call histvert(histuaveid,'presnivs','Niveaux Pression&
-        &     approximatifs','mb',llm, presnivs/100., zvertiidv,'down')
-  call histvert(histvaveid,'presnivs','Niveaux Pression&
-        &     approximatifs','mb',llm, presnivs/100., zvertiidu,'down')
-
-  !
-  !  Appels a histdef pour la definition des variables a sauvegarder
-  !
-  !  Vents U
-  !
-  jjn=jj_nb
-  call histdef(histuaveid, 'u', 'vent u moyen ', &
-        'm/s', iip1, jjn, uhoriid, llm, 1, llm, zvertiidu, &
-        32, 'ave(X)', t_ops, t_wrt)
-
-  !
-  !  Vents V
-  !
-  if (pole_sud) jjn=jj_nb-1
-  call histdef(histvaveid, 'v', 'vent v moyen', &
-        'm/s', iip1, jjn, vhoriid, llm, 1, llm, zvertiidv, &
-        32, 'ave(X)', t_ops, t_wrt)
-
-  !
-  !  Temperature
-  !
-  jjn=jj_nb
-  call histdef(histaveid, 'temp', 'temperature moyenne', 'K', &
-        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'ave(X)', t_ops, t_wrt)
-  !
-  !  Temperature potentielle
-  !
-  call histdef(histaveid, 'theta', 'temperature potentielle', 'K', &
-        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'ave(X)', t_ops, t_wrt)
-
-
-  !
-  !  Geopotentiel
-  !
-  call histdef(histaveid, 'phi', 'geopotentiel moyen', '-', &
-        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'ave(X)', t_ops, t_wrt)
-  !
-  !  Traceurs
-  !
-  !    DO iq=1,nqtot
-  !      call histdef(histaveid, tracers(iq)%name,
-  ! .                            tracers(iq)%longName, '-',
-  ! .             iip1, jjn, thoriid, llm, 1, llm, zvertiid,
-  ! .             32, 'ave(X)', t_ops, t_wrt)
-  !    enddo
-  !
-  !  Masse
-  !
-  call histdef(histaveid, 'masse', 'masse moyenne', 'kg', &
-        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'ave(X)', t_ops, t_wrt)
-  !
-  !  Pression au sol
-  !
-  call histdef(histaveid, 'ps', 'pression naturelle au sol', 'Pa', &
-        iip1, jjn, thoriid, 1, 1, 1, -99, &
-        32, 'ave(X)', t_ops, t_wrt)
-  !
-  !  Geopotentiel au sol
-  !
-  !  call histdef(histaveid, 'phis', 'geopotentiel au sol', '-',
-  ! .             iip1, jjn, thoriid, 1, 1, 1, -99,
-  ! .             32, 'ave(X)', t_ops, t_wrt)
-  !
-  !  Fin
-  !
-  call histend(histaveid)
-  call histend(histuaveid)
-  call histend(histvaveid)
-
-end subroutine initdynav_loc
Index: LMDZ6/trunk/libf/dyn3dmem/initdynav_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/initdynav_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/initdynav_loc.f90	(revision 5268)
@@ -0,0 +1,282 @@
+!
+! $Id: initdynav_p.F 1279 2009-12-10 09:02:56Z fairhead $
+!
+subroutine initdynav_loc(day0,anne0,tstep,t_ops,t_wrt)
+
+  ! This routine needs IOIPSL
+   USE IOIPSL
+
+   USE parallel_lmdz
+   use Write_field
+   use misc_mod
+    ! USE infotrac
+   use com_io_dyn_mod, only : histaveid,histvaveid,histuaveid,       &
+         dynhistave_file,dynhistvave_file,dynhistuave_file
+   USE comconst_mod, ONLY: pi
+   USE comvert_mod, ONLY: presnivs
+   USE temps_mod, ONLY: itau_dyn
+
+   implicit none
+
+  !
+  !   Routine d'initialisation des ecritures des fichiers histoires LMDZ
+  !   au format IOIPSL. Initialisation du fichier histoire moyenne.
+  !
+  !   Appels succesifs des routines: histbeg
+  !                              histhori
+  !                              histver
+  !                              histdef
+  !                              histend
+  !
+  !   Entree:
+  !
+  !  day0,anne0: date de reference
+  !  tstep : frequence d'ecriture
+  !  t_ops: frequence de l'operation pour IOIPSL
+  !  t_wrt: frequence d'ecriture sur le fichier
+  !
+  !   Sortie:
+  !  fileid: ID du fichier netcdf cree
+  !
+  !   L. Fairhead, LMD, 03/99
+  !
+  ! =====================================================================
+  !
+  !   Declarations
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+  include "description.h"
+  include "iniprint.h"
+
+  !   Arguments
+  !
+  integer(kind=4) :: day0, anne0
+  real :: tstep, t_ops, t_wrt
+
+  ! This routine needs IOIPSL
+  !   Variables locales
+  !
+  integer :: tau0
+  real :: zjulian
+  integer :: iq
+  real :: rlong(iip1,jjp1), rlat(iip1,jjp1)
+  integer :: uhoriid, vhoriid, thoriid
+  integer :: zvertiid,zvertiidv,zvertiidu
+  integer :: ii,jj
+  integer :: zan, dayref
+  integer :: jjb,jje,jjn
+
+  ! definition du domaine d'ecriture pour le rebuild
+
+  INTEGER,DIMENSION(2) :: ddid
+  INTEGER,DIMENSION(2) :: dsg
+  INTEGER,DIMENSION(2) :: dsl
+  INTEGER,DIMENSION(2) :: dpf
+  INTEGER,DIMENSION(2) :: dpl
+  INTEGER,DIMENSION(2) :: dhs
+  INTEGER,DIMENSION(2) :: dhe
+
+  INTEGER :: dynhistave_domain_id
+  INTEGER :: dynhistvave_domain_id
+  INTEGER :: dynhistuave_domain_id
+
+  if (adjust) return
+
+  !
+  !  Initialisations
+  !
+  pi = 4. * atan (1.)
+  !
+  !  Appel a histbeg: creation du fichier netcdf et initialisations diverses
+  !
+
+  zan = anne0
+  dayref = day0
+  CALL ymds2ju(zan, 1, dayref, 0.0, zjulian)
+  tau0 = itau_dyn
+
+  do jj = 1, jjp1
+    do ii = 1, iip1
+      rlong(ii,jj) = rlonv(ii) * 180. / pi
+      rlat(ii,jj)  = rlatu(jj) * 180. / pi
+    enddo
+  enddo
+
+
+  ! Creation de 3 fichiers pour les differentes grilles horizontales
+  ! Restriction de IOIPSL: seulement 2 coordonnees dans le meme fichier
+  ! Grille Scalaire
+
+  jjb=jj_begin
+  jje=jj_end
+  jjn=jj_nb
+
+  ddid=(/ 1,2 /)
+  dsg=(/ iip1,jjp1 /)
+  dsl=(/ iip1,jjn /)
+  dpf=(/ 1,jjb /)
+  dpl=(/ iip1,jje /)
+  dhs=(/ 0,0 /)
+  dhe=(/ 0,0 /)
+
+
+  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
+        'box',dynhistave_domain_id)
+
+  call histbeg(dynhistave_file,iip1, rlong(:,1), jjn, &
+        rlat(1,jjb:jje), 1, iip1, 1, jjn,tau0, &
+        zjulian, tstep, thoriid, &
+        histaveid,dynhistave_domain_id)
+
+
+  !  Creation du fichier histoire pour les grilles en V et U (oblige pour l'instant,
+  !  IOIPSL ne permet pas de grilles avec des nombres de point differents dans
+  !  un meme fichier)
+  ! Grille V
+
+  jjb=jj_begin
+  jje=jj_end
+  jjn=jj_nb
+  IF (pole_sud) jjn=jjn-1
+  IF (pole_sud) jje=jje-1
+
+  do jj = jjb, jje
+    do ii = 1, iip1
+      rlong(ii,jj) = rlonv(ii) * 180. / pi
+      rlat(ii,jj) = rlatv(jj) * 180. / pi
+    enddo
+  enddo
+
+  ddid=(/ 1,2 /)
+  dsg=(/ iip1,jjm /)
+  dsl=(/ iip1,jjn /)
+  dpf=(/ 1,jjb /)
+  dpl=(/ iip1,jje /)
+  dhs=(/ 0,0 /)
+  dhe=(/ 0,0 /)
+
+
+  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
+        'box',dynhistvave_domain_id)
+
+  call histbeg(dynhistvave_file,iip1, rlong(:,1), jjn, &
+        rlat(1,jjb:jje), 1, iip1, 1, jjn,tau0, &
+        zjulian, tstep, vhoriid, &
+        histvaveid,dynhistvave_domain_id)
+
+  ! Grille U
+
+  do jj = 1, jjp1
+    do ii = 1, iip1
+      rlong(ii,jj) = rlonu(ii) * 180. / pi
+      rlat(ii,jj) = rlatu(jj) * 180. / pi
+    enddo
+  enddo
+
+  jjb=jj_begin
+  jje=jj_end
+  jjn=jj_nb
+
+  ddid=(/ 1,2 /)
+  dsg=(/ iip1,jjp1 /)
+  dsl=(/ iip1,jjn /)
+  dpf=(/ 1,jjb /)
+  dpl=(/ iip1,jje /)
+  dhs=(/ 0,0 /)
+  dhe=(/ 0,0 /)
+
+
+  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
+        'box',dynhistuave_domain_id)
+
+  call histbeg(dynhistuave_file,iip1, rlong(:,1), jjn, &
+        rlat(1,jjb:jje), 1, iip1, 1, jjn,tau0, &
+        zjulian, tstep, uhoriid, &
+        histuaveid,dynhistuave_domain_id)
+
+
+  !
+  !  Appel a histvert pour la grille verticale
+  !
+  call histvert(histaveid,'presnivs','Niveaux Pression&
+        &     approximatifs','mb',llm, presnivs/100., zvertiid,'down')
+  call histvert(histuaveid,'presnivs','Niveaux Pression&
+        &     approximatifs','mb',llm, presnivs/100., zvertiidv,'down')
+  call histvert(histvaveid,'presnivs','Niveaux Pression&
+        &     approximatifs','mb',llm, presnivs/100., zvertiidu,'down')
+
+  !
+  !  Appels a histdef pour la definition des variables a sauvegarder
+  !
+  !  Vents U
+  !
+  jjn=jj_nb
+  call histdef(histuaveid, 'u', 'vent u moyen ', &
+        'm/s', iip1, jjn, uhoriid, llm, 1, llm, zvertiidu, &
+        32, 'ave(X)', t_ops, t_wrt)
+
+  !
+  !  Vents V
+  !
+  if (pole_sud) jjn=jj_nb-1
+  call histdef(histvaveid, 'v', 'vent v moyen', &
+        'm/s', iip1, jjn, vhoriid, llm, 1, llm, zvertiidv, &
+        32, 'ave(X)', t_ops, t_wrt)
+
+  !
+  !  Temperature
+  !
+  jjn=jj_nb
+  call histdef(histaveid, 'temp', 'temperature moyenne', 'K', &
+        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'ave(X)', t_ops, t_wrt)
+  !
+  !  Temperature potentielle
+  !
+  call histdef(histaveid, 'theta', 'temperature potentielle', 'K', &
+        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'ave(X)', t_ops, t_wrt)
+
+
+  !
+  !  Geopotentiel
+  !
+  call histdef(histaveid, 'phi', 'geopotentiel moyen', '-', &
+        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'ave(X)', t_ops, t_wrt)
+  !
+  !  Traceurs
+  !
+  !    DO iq=1,nqtot
+  !      call histdef(histaveid, tracers(iq)%name,
+  ! .                            tracers(iq)%longName, '-',
+  ! .             iip1, jjn, thoriid, llm, 1, llm, zvertiid,
+  ! .             32, 'ave(X)', t_ops, t_wrt)
+  !    enddo
+  !
+  !  Masse
+  !
+  call histdef(histaveid, 'masse', 'masse moyenne', 'kg', &
+        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'ave(X)', t_ops, t_wrt)
+  !
+  !  Pression au sol
+  !
+  call histdef(histaveid, 'ps', 'pression naturelle au sol', 'Pa', &
+        iip1, jjn, thoriid, 1, 1, 1, -99, &
+        32, 'ave(X)', t_ops, t_wrt)
+  !
+  !  Geopotentiel au sol
+  !
+  !  call histdef(histaveid, 'phis', 'geopotentiel au sol', '-',
+  ! .             iip1, jjn, thoriid, 1, 1, 1, -99,
+  ! .             32, 'ave(X)', t_ops, t_wrt)
+  !
+  !  Fin
+  !
+  call histend(histaveid)
+  call histend(histuaveid)
+  call histend(histvaveid)
+
+end subroutine initdynav_loc
Index: LMDZ6/trunk/libf/dyn3dmem/initfluxsto_p.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/initfluxsto_p.F90	(revision 5267)
+++ 	(revision )
@@ -1,289 +1,0 @@
-!
-! $Id$
-!
-subroutine initfluxsto_p &
-        (infile,tstep,t_ops,t_wrt, &
-        fileid,filevid,filedid)
-
-  ! This routine needs IOIPSL
-   USE IOIPSL
-
-   USE parallel_lmdz
-   use Write_field
-   use misc_mod
-   USE comconst_mod, ONLY: pi
-   USE comvert_mod, ONLY: nivsigs
-   USE temps_mod, ONLY: annee_ref, day_ref, itau_dyn
-
-  implicit none
-
-  !
-  !   Routine d'initialisation des ecritures des fichiers histoires LMDZ
-  !   au format IOIPSL
-  !
-  !   Appels succesifs des routines: histbeg
-  !                              histhori
-  !                              histver
-  !                              histdef
-  !                              histend
-  !
-  !   Entree:
-  !
-  !  infile: nom du fichier histoire a creer
-  !  day0,anne0: date de reference
-  !  tstep: duree du pas de temps en seconde
-  !  t_ops: frequence de l'operation pour IOIPSL
-  !  t_wrt: frequence d'ecriture sur le fichier
-  !
-  !   Sortie:
-  !  fileid: ID du fichier netcdf cree
-  !  filevid:ID du fichier netcdf pour la grille v
-  !
-  !   L. Fairhead, LMD, 03/99
-  !
-  ! =====================================================================
-  !
-  !   Declarations
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-  include "description.h"
-  include "iniprint.h"
-
-  !   Arguments
-  !
-  character(len=*) :: infile
-  real :: tstep, t_ops, t_wrt
-  integer :: fileid, filevid,filedid
-
-  ! This routine needs IOIPSL
-  !   Variables locales
-  !
-  real :: nivd(1)
-  integer :: tau0
-  real :: zjulian
-  character(len=3) :: str
-  character(len=10) :: ctrac
-  integer :: iq
-  real :: rlong(iip1,jjp1), rlat(iip1,jjp1),rl(1,1)
-  integer :: uhoriid, vhoriid, thoriid, zvertiid,dhoriid,dvertiid
-  integer :: ii,jj
-  integer :: zan, idayref
-  logical :: ok_sync
-  integer :: jjb,jje,jjn
-
-  ! definition du domaine d'ecriture pour le rebuild
-
-  INTEGER,DIMENSION(2) :: ddid
-  INTEGER,DIMENSION(2) :: dsg
-  INTEGER,DIMENSION(2) :: dsl
-  INTEGER,DIMENSION(2) :: dpf
-  INTEGER,DIMENSION(2) :: dpl
-  INTEGER,DIMENSION(2) :: dhs
-  INTEGER,DIMENSION(2) :: dhe
-
-  INTEGER :: dynu_domain_id
-  INTEGER :: dynv_domain_id
-
-  !
-  !  Initialisations
-  !
-  pi = 4. * atan (1.)
-  str='q  '
-  ctrac = 'traceur   '
-  ok_sync = .true.
-  !
-  !  Appel a histbeg: creation du fichier netcdf et initialisations diverses
-  !
-
-  zan = annee_ref
-  idayref = day_ref
-  CALL ymds2ju(zan, 1, idayref, 0.0, zjulian)
-  tau0 = itau_dyn
-
-    do jj = 1, jjp1
-    do ii = 1, iip1
-      rlong(ii,jj) = rlonu(ii) * 180. / pi
-      rlat(ii,jj) = rlatu(jj) * 180. / pi
-    enddo
-  enddo
-
-  jjb=jj_begin
-  jje=jj_end
-  jjn=jj_nb
-
-  ddid=(/ 1,2 /)
-  dsg=(/ iip1,jjp1 /)
-  dsl=(/ iip1,jjn /)
-  dpf=(/ 1,jjb /)
-  dpl=(/ iip1,jje /)
-  dhs=(/ 0,0 /)
-  dhe=(/ 0,0 /)
-
-  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
-        'box',dynu_domain_id)
-
-  call histbeg(trim(infile),iip1, rlong(:,1), jjn, rlat(1,jjb:jje), &
-        1, iip1, 1, jjn, tau0, zjulian, tstep, uhoriid, &
-        fileid,dynu_domain_id)
-  !
-  !  Creation du fichier histoire pour la grille en V (oblige pour l'instant,
-  !  IOIPSL ne permet pas de grilles avec des nombres de point differents dans
-  !  un meme fichier)
-
-
-  do jj = 1, jjm
-    do ii = 1, iip1
-      rlong(ii,jj) = rlonv(ii) * 180. / pi
-      rlat(ii,jj) = rlatv(jj) * 180. / pi
-    enddo
-  enddo
-
-  jjb=jj_begin
-  jje=jj_end
-  jjn=jj_nb
-  if (pole_sud) jje=jj_end-1
-  if (pole_sud) jjn=jj_nb-1
-
-  ddid=(/ 1,2 /)
-  dsg=(/ iip1,jjm /)
-  dsl=(/ iip1,jjn /)
-  dpf=(/ 1,jjb /)
-  dpl=(/ iip1,jje /)
-  dhs=(/ 0,0 /)
-  dhe=(/ 0,0 /)
-
-  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
-        'box',dynv_domain_id)
-
-  call histbeg('fluxstokev',iip1, rlong(:,1), jjn, rlat(1,jjb:jje), &
-        1, iip1, 1, jjn,tau0, zjulian, tstep, vhoriid, &
-        filevid,dynv_domain_id)
-
-  rl(1,1) = 1.
-
-  if (mpi_rank==0) then
-
-    call histbeg('defstoke.nc', 1, rl, 1, rl, &
-          1, 1, 1, 1, &
-          tau0, zjulian, tstep, dhoriid, filedid)
-
-  endif
-  !
-  !  Appel a histhori pour rajouter les autres grilles horizontales
-  !
-  do jj = 1, jjp1
-    do ii = 1, iip1
-      rlong(ii,jj) = rlonv(ii) * 180. / pi
-      rlat(ii,jj) = rlatu(jj) * 180. / pi
-    enddo
-  enddo
-
-  jjb=jj_begin
-  jje=jj_end
-  jjn=jj_nb
-
-  call histhori(fileid, iip1, rlong(:,jjb:jje),jjn,rlat(:,jjb:jje), &
-        'scalar','Grille points scalaires', thoriid)
-
-  !
-  !  Appel a histvert pour la grille verticale
-  !
-  call histvert(fileid, 'sig_s', 'Niveaux sigma', &
-        'sigma_level', &
-        llm, nivsigs, zvertiid)
-  ! Pour le fichier V
-  call histvert(filevid, 'sig_s', 'Niveaux sigma', &
-        'sigma_level', &
-        llm, nivsigs, zvertiid)
-  ! pour le fichier def
-  if (mpi_rank==0) then
-     nivd(1) = 1
-     call histvert(filedid, 'sig_s', 'Niveaux sigma', &
-           'sigma_level', &
-           1, nivd, dvertiid)
-  endif
-  !
-  !  Appels a histdef pour la definition des variables a sauvegarder
-
-    CALL histdef(fileid, "phis", "Surface geop. height", "-", &
-          iip1,jjn,thoriid, 1,1,1, -99, 32, &
-          "once", t_ops, t_wrt)
-
-     CALL histdef(fileid, "aire", "Grid area", "-", &
-           iip1,jjn,thoriid, 1,1,1, -99, 32, &
-           "once", t_ops, t_wrt)
-
-    if (mpi_rank==0) then
-
-    CALL histdef(filedid, "dtvr", "tps dyn", "s", &
-          1,1,dhoriid, 1,1,1, -99, 32, &
-          "once", t_ops, t_wrt)
-
-     CALL histdef(filedid, "istdyn", "tps stock", "s", &
-           1,1,dhoriid, 1,1,1, -99, 32, &
-           "once", t_ops, t_wrt)
-
-     CALL histdef(filedid, "istphy", "tps stock phy", "s", &
-           1,1,dhoriid, 1,1,1, -99, 32, &
-           "once", t_ops, t_wrt)
-
-    endif
-  !
-  ! Masse
-  !
-  call histdef(fileid, 'masse', 'Masse', 'kg', &
-        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'inst(X)', t_ops, t_wrt)
-  !
-  !  Pbaru
-  !
-  call histdef(fileid, 'pbaru', 'flx de masse zonal', 'kg m/s', &
-        iip1, jjn, uhoriid, llm, 1, llm, zvertiid, &
-        32, 'inst(X)', t_ops, t_wrt)
-
-  !
-  !  Pbarv
-  !
-  if (pole_sud) jjn=jj_nb-1
-
-  call histdef(filevid, 'pbarv', 'flx de masse mer', 'kg m/s', &
-        iip1, jjn, vhoriid, llm, 1, llm, zvertiid, &
-        32, 'inst(X)', t_ops, t_wrt)
-  !
-  !  w
-  !
-  if (pole_sud) jjn=jj_nb
-  call histdef(fileid, 'w', 'flx de masse vert', 'kg m/s', &
-        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'inst(X)', t_ops, t_wrt)
-
-  !
-  !  Temperature potentielle
-  !
-  call histdef(fileid, 'teta', 'temperature potentielle', '-', &
-        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'inst(X)', t_ops, t_wrt)
-  !
-
-  !
-  ! Geopotentiel
-  !
-  call histdef(fileid, 'phi', 'geopotentiel instantane', '-', &
-        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'inst(X)', t_ops, t_wrt)
-  !
-  !  Fin
-  !
-  call histend(fileid)
-  call histend(filevid)
-  if (mpi_rank==0) call histend(filedid)
-  if (ok_sync) then
-    call histsync(fileid)
-    call histsync(filevid)
-    if (mpi_rank==0) call histsync(filedid)
-  endif
-
-
-  return
-end subroutine initfluxsto_p
Index: LMDZ6/trunk/libf/dyn3dmem/initfluxsto_p.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/initfluxsto_p.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/initfluxsto_p.f90	(revision 5268)
@@ -0,0 +1,289 @@
+!
+! $Id$
+!
+subroutine initfluxsto_p &
+        (infile,tstep,t_ops,t_wrt, &
+        fileid,filevid,filedid)
+
+  ! This routine needs IOIPSL
+   USE IOIPSL
+
+   USE parallel_lmdz
+   use Write_field
+   use misc_mod
+   USE comconst_mod, ONLY: pi
+   USE comvert_mod, ONLY: nivsigs
+   USE temps_mod, ONLY: annee_ref, day_ref, itau_dyn
+
+  implicit none
+
+  !
+  !   Routine d'initialisation des ecritures des fichiers histoires LMDZ
+  !   au format IOIPSL
+  !
+  !   Appels succesifs des routines: histbeg
+  !                              histhori
+  !                              histver
+  !                              histdef
+  !                              histend
+  !
+  !   Entree:
+  !
+  !  infile: nom du fichier histoire a creer
+  !  day0,anne0: date de reference
+  !  tstep: duree du pas de temps en seconde
+  !  t_ops: frequence de l'operation pour IOIPSL
+  !  t_wrt: frequence d'ecriture sur le fichier
+  !
+  !   Sortie:
+  !  fileid: ID du fichier netcdf cree
+  !  filevid:ID du fichier netcdf pour la grille v
+  !
+  !   L. Fairhead, LMD, 03/99
+  !
+  ! =====================================================================
+  !
+  !   Declarations
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+  include "description.h"
+  include "iniprint.h"
+
+  !   Arguments
+  !
+  character(len=*) :: infile
+  real :: tstep, t_ops, t_wrt
+  integer :: fileid, filevid,filedid
+
+  ! This routine needs IOIPSL
+  !   Variables locales
+  !
+  real :: nivd(1)
+  integer :: tau0
+  real :: zjulian
+  character(len=3) :: str
+  character(len=10) :: ctrac
+  integer :: iq
+  real :: rlong(iip1,jjp1), rlat(iip1,jjp1),rl(1,1)
+  integer :: uhoriid, vhoriid, thoriid, zvertiid,dhoriid,dvertiid
+  integer :: ii,jj
+  integer :: zan, idayref
+  logical :: ok_sync
+  integer :: jjb,jje,jjn
+
+  ! definition du domaine d'ecriture pour le rebuild
+
+  INTEGER,DIMENSION(2) :: ddid
+  INTEGER,DIMENSION(2) :: dsg
+  INTEGER,DIMENSION(2) :: dsl
+  INTEGER,DIMENSION(2) :: dpf
+  INTEGER,DIMENSION(2) :: dpl
+  INTEGER,DIMENSION(2) :: dhs
+  INTEGER,DIMENSION(2) :: dhe
+
+  INTEGER :: dynu_domain_id
+  INTEGER :: dynv_domain_id
+
+  !
+  !  Initialisations
+  !
+  pi = 4. * atan (1.)
+  str='q  '
+  ctrac = 'traceur   '
+  ok_sync = .true.
+  !
+  !  Appel a histbeg: creation du fichier netcdf et initialisations diverses
+  !
+
+  zan = annee_ref
+  idayref = day_ref
+  CALL ymds2ju(zan, 1, idayref, 0.0, zjulian)
+  tau0 = itau_dyn
+
+    do jj = 1, jjp1
+    do ii = 1, iip1
+      rlong(ii,jj) = rlonu(ii) * 180. / pi
+      rlat(ii,jj) = rlatu(jj) * 180. / pi
+    enddo
+  enddo
+
+  jjb=jj_begin
+  jje=jj_end
+  jjn=jj_nb
+
+  ddid=(/ 1,2 /)
+  dsg=(/ iip1,jjp1 /)
+  dsl=(/ iip1,jjn /)
+  dpf=(/ 1,jjb /)
+  dpl=(/ iip1,jje /)
+  dhs=(/ 0,0 /)
+  dhe=(/ 0,0 /)
+
+  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
+        'box',dynu_domain_id)
+
+  call histbeg(trim(infile),iip1, rlong(:,1), jjn, rlat(1,jjb:jje), &
+        1, iip1, 1, jjn, tau0, zjulian, tstep, uhoriid, &
+        fileid,dynu_domain_id)
+  !
+  !  Creation du fichier histoire pour la grille en V (oblige pour l'instant,
+  !  IOIPSL ne permet pas de grilles avec des nombres de point differents dans
+  !  un meme fichier)
+
+
+  do jj = 1, jjm
+    do ii = 1, iip1
+      rlong(ii,jj) = rlonv(ii) * 180. / pi
+      rlat(ii,jj) = rlatv(jj) * 180. / pi
+    enddo
+  enddo
+
+  jjb=jj_begin
+  jje=jj_end
+  jjn=jj_nb
+  if (pole_sud) jje=jj_end-1
+  if (pole_sud) jjn=jj_nb-1
+
+  ddid=(/ 1,2 /)
+  dsg=(/ iip1,jjm /)
+  dsl=(/ iip1,jjn /)
+  dpf=(/ 1,jjb /)
+  dpl=(/ iip1,jje /)
+  dhs=(/ 0,0 /)
+  dhe=(/ 0,0 /)
+
+  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
+        'box',dynv_domain_id)
+
+  call histbeg('fluxstokev',iip1, rlong(:,1), jjn, rlat(1,jjb:jje), &
+        1, iip1, 1, jjn,tau0, zjulian, tstep, vhoriid, &
+        filevid,dynv_domain_id)
+
+  rl(1,1) = 1.
+
+  if (mpi_rank==0) then
+
+    call histbeg('defstoke.nc', 1, rl, 1, rl, &
+          1, 1, 1, 1, &
+          tau0, zjulian, tstep, dhoriid, filedid)
+
+  endif
+  !
+  !  Appel a histhori pour rajouter les autres grilles horizontales
+  !
+  do jj = 1, jjp1
+    do ii = 1, iip1
+      rlong(ii,jj) = rlonv(ii) * 180. / pi
+      rlat(ii,jj) = rlatu(jj) * 180. / pi
+    enddo
+  enddo
+
+  jjb=jj_begin
+  jje=jj_end
+  jjn=jj_nb
+
+  call histhori(fileid, iip1, rlong(:,jjb:jje),jjn,rlat(:,jjb:jje), &
+        'scalar','Grille points scalaires', thoriid)
+
+  !
+  !  Appel a histvert pour la grille verticale
+  !
+  call histvert(fileid, 'sig_s', 'Niveaux sigma', &
+        'sigma_level', &
+        llm, nivsigs, zvertiid)
+  ! Pour le fichier V
+  call histvert(filevid, 'sig_s', 'Niveaux sigma', &
+        'sigma_level', &
+        llm, nivsigs, zvertiid)
+  ! pour le fichier def
+  if (mpi_rank==0) then
+     nivd(1) = 1
+     call histvert(filedid, 'sig_s', 'Niveaux sigma', &
+           'sigma_level', &
+           1, nivd, dvertiid)
+  endif
+  !
+  !  Appels a histdef pour la definition des variables a sauvegarder
+
+    CALL histdef(fileid, "phis", "Surface geop. height", "-", &
+          iip1,jjn,thoriid, 1,1,1, -99, 32, &
+          "once", t_ops, t_wrt)
+
+     CALL histdef(fileid, "aire", "Grid area", "-", &
+           iip1,jjn,thoriid, 1,1,1, -99, 32, &
+           "once", t_ops, t_wrt)
+
+    if (mpi_rank==0) then
+
+    CALL histdef(filedid, "dtvr", "tps dyn", "s", &
+          1,1,dhoriid, 1,1,1, -99, 32, &
+          "once", t_ops, t_wrt)
+
+     CALL histdef(filedid, "istdyn", "tps stock", "s", &
+           1,1,dhoriid, 1,1,1, -99, 32, &
+           "once", t_ops, t_wrt)
+
+     CALL histdef(filedid, "istphy", "tps stock phy", "s", &
+           1,1,dhoriid, 1,1,1, -99, 32, &
+           "once", t_ops, t_wrt)
+
+    endif
+  !
+  ! Masse
+  !
+  call histdef(fileid, 'masse', 'Masse', 'kg', &
+        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'inst(X)', t_ops, t_wrt)
+  !
+  !  Pbaru
+  !
+  call histdef(fileid, 'pbaru', 'flx de masse zonal', 'kg m/s', &
+        iip1, jjn, uhoriid, llm, 1, llm, zvertiid, &
+        32, 'inst(X)', t_ops, t_wrt)
+
+  !
+  !  Pbarv
+  !
+  if (pole_sud) jjn=jj_nb-1
+
+  call histdef(filevid, 'pbarv', 'flx de masse mer', 'kg m/s', &
+        iip1, jjn, vhoriid, llm, 1, llm, zvertiid, &
+        32, 'inst(X)', t_ops, t_wrt)
+  !
+  !  w
+  !
+  if (pole_sud) jjn=jj_nb
+  call histdef(fileid, 'w', 'flx de masse vert', 'kg m/s', &
+        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'inst(X)', t_ops, t_wrt)
+
+  !
+  !  Temperature potentielle
+  !
+  call histdef(fileid, 'teta', 'temperature potentielle', '-', &
+        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'inst(X)', t_ops, t_wrt)
+  !
+
+  !
+  ! Geopotentiel
+  !
+  call histdef(fileid, 'phi', 'geopotentiel instantane', '-', &
+        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'inst(X)', t_ops, t_wrt)
+  !
+  !  Fin
+  !
+  call histend(fileid)
+  call histend(filevid)
+  if (mpi_rank==0) call histend(filedid)
+  if (ok_sync) then
+    call histsync(fileid)
+    call histsync(filevid)
+    if (mpi_rank==0) call histsync(filedid)
+  endif
+
+
+  return
+end subroutine initfluxsto_p
Index: LMDZ6/trunk/libf/dyn3dmem/inithist_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/inithist_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,282 +1,0 @@
-!
-! $Id: initdynav_p.F 1279 2009-12-10 09:02:56Z fairhead $
-!
-subroutine inithist_loc(day0,anne0,tstep,t_ops,t_wrt)
-
-  ! This routine needs IOIPSL
-   USE IOIPSL
-
-   USE parallel_lmdz
-   use Write_field
-   use misc_mod
-   use com_io_dyn_mod, only : histid,histvid,histuid,               &
-         dynhist_file,dynhistv_file,dynhistu_file
-   USE comconst_mod, ONLY: pi
-   USE comvert_mod, ONLY: presnivs
-   USE temps_mod, ONLY: itau_dyn
-
-   implicit none
-
-  !
-  !   Routine d'initialisation des ecritures des fichiers histoires LMDZ
-  !   au format IOIPSL
-  !
-  !   Appels succesifs des routines: histbeg
-  !                              histhori
-  !                              histver
-  !                              histdef
-  !                              histend
-  !
-  !   Entree:
-  !
-  !  day0,anne0: date de reference
-  !  tstep: duree du pas de temps en seconde
-  !  t_ops: frequence de l'operation pour IOIPSL
-  !  t_wrt: frequence d'ecriture sur le fichier
-  !  nq: nombre de traceurs
-  !
-  !
-  !   L. Fairhead, LMD, 03/99
-  !
-  ! =====================================================================
-  !
-  !   Declarations
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-  include "description.h"
-  include "iniprint.h"
-
-  !   Arguments
-  !
-  integer :: day0, anne0
-  real :: tstep, t_ops, t_wrt
-
-  ! This routine needs IOIPSL
-  !   Variables locales
-  !
-  integer :: tau0
-  real :: zjulian
-  integer :: iq
-  real :: rlong(iip1,jjp1), rlat(iip1,jjp1)
-  integer :: uhoriid, vhoriid, thoriid
-  integer :: zvertiid,zvertiidv,zvertiidu
-  integer :: ii,jj
-  integer :: zan, dayref
-  integer :: jjb,jje,jjn
-
-  ! definition du domaine d'ecriture pour le rebuild
-
-  INTEGER,DIMENSION(2) :: ddid
-  INTEGER,DIMENSION(2) :: dsg
-  INTEGER,DIMENSION(2) :: dsl
-  INTEGER,DIMENSION(2) :: dpf
-  INTEGER,DIMENSION(2) :: dpl
-  INTEGER,DIMENSION(2) :: dhs
-  INTEGER,DIMENSION(2) :: dhe
-
-  INTEGER :: dynhist_domain_id
-  INTEGER :: dynhistv_domain_id
-  INTEGER :: dynhistu_domain_id
-
-  if (adjust) return
-
-  !
-  !  Initialisations
-  !
-  pi = 4. * atan (1.)
-  !
-  !  Appel a histbeg: creation du fichier netcdf et initialisations diverses
-  !
-
-  zan = anne0
-  dayref = day0
-  CALL ymds2ju(zan, 1, dayref, 0.0, zjulian)
-  tau0 = itau_dyn
-
-  do jj = 1, jjp1
-    do ii = 1, iip1
-      rlong(ii,jj) = rlonv(ii) * 180. / pi
-      rlat(ii,jj)  = rlatu(jj) * 180. / pi
-    enddo
-  enddo
-
-
-  ! Creation de 3 fichiers pour les differentes grilles horizontales
-  ! Restriction de IOIPSL: seulement 2 coordonnees dans le meme fichier
-  ! Grille Scalaire
-
-  jjb=jj_begin
-  jje=jj_end
-  jjn=jj_nb
-
-  ddid=(/ 1,2 /)
-  dsg=(/ iip1,jjp1 /)
-  dsl=(/ iip1,jjn /)
-  dpf=(/ 1,jjb /)
-  dpl=(/ iip1,jje /)
-  dhs=(/ 0,0 /)
-  dhe=(/ 0,0 /)
-
-
-  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
-        'box',dynhist_domain_id)
-
-  call histbeg(dynhist_file,iip1, rlong(:,1), jjn, &
-        rlat(1,jjb:jje), 1, iip1, 1, jjn,tau0, &
-        zjulian, tstep, thoriid, &
-        histid,dynhist_domain_id)
-
-
-  !  Creation du fichier histoire pour les grilles en V et U (oblige pour l'instant,
-  !  IOIPSL ne permet pas de grilles avec des nombres de point differents dans
-  !  un meme fichier)
-  ! Grille V
-
-  jjb=jj_begin
-  jje=jj_end
-  jjn=jj_nb
-  IF (pole_sud) jjn=jjn-1
-  IF (pole_sud) jje=jje-1
-
-  do jj = jjb, jje
-    do ii = 1, iip1
-      rlong(ii,jj) = rlonv(ii) * 180. / pi
-      rlat(ii,jj) = rlatv(jj) * 180. / pi
-    enddo
-  enddo
-
-  ddid=(/ 1,2 /)
-  dsg=(/ iip1,jjm /)
-  dsl=(/ iip1,jjn /)
-  dpf=(/ 1,jjb /)
-  dpl=(/ iip1,jje /)
-  dhs=(/ 0,0 /)
-  dhe=(/ 0,0 /)
-
-
-  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
-        'box',dynhistv_domain_id)
-
-  call histbeg(dynhistv_file,iip1, rlong(:,1), jjn, &
-        rlat(1,jjb:jje), 1, iip1, 1, jjn,tau0, &
-        zjulian, tstep, vhoriid, &
-        histvid,dynhistv_domain_id)
-
-  ! Grille U
-
-  do jj = 1, jjp1
-    do ii = 1, iip1
-      rlong(ii,jj) = rlonu(ii) * 180. / pi
-      rlat(ii,jj) = rlatu(jj) * 180. / pi
-    enddo
-  enddo
-
-  jjb=jj_begin
-  jje=jj_end
-  jjn=jj_nb
-
-  ddid=(/ 1,2 /)
-  dsg=(/ iip1,jjp1 /)
-  dsl=(/ iip1,jjn /)
-  dpf=(/ 1,jjb /)
-  dpl=(/ iip1,jje /)
-  dhs=(/ 0,0 /)
-  dhe=(/ 0,0 /)
-
-
-  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
-        'box',dynhistu_domain_id)
-
-  call histbeg(dynhistu_file,iip1, rlong(:,1), jjn, &
-        rlat(1,jjb:jje), 1, iip1, 1, jjn,tau0, &
-        zjulian, tstep, uhoriid, &
-        histuid,dynhistu_domain_id)
-
-
-  ! -------------------------------------------------------------
-  !  Appel a histvert pour la grille verticale
-  ! -------------------------------------------------------------
-  call histvert(histid, 'presnivs', 'Niveaux pression','mb', &
-        llm, presnivs/100., zvertiid,'down')
-  call histvert(histvid, 'presnivs', 'Niveaux pression','mb', &
-        llm, presnivs/100., zvertiidv,'down')
-  call histvert(histuid, 'presnivs', 'Niveaux pression','mb', &
-        llm, presnivs/100., zvertiidu,'down')
-
-  !
-  ! -------------------------------------------------------------
-  !  Appels a histdef pour la definition des variables a sauvegarder
-  ! -------------------------------------------------------------
-  !
-  !  Vents U
-  !
-  jjn=jj_nb
-  call histdef(histuid, 'u', 'vent u', &
-        'm/s', iip1, jjn, uhoriid, llm, 1, llm, zvertiidu, &
-        32, 'inst(X)', t_ops, t_wrt)
-
-  !
-  !  Vents V
-  !
-  if (pole_sud) jjn=jj_nb-1
-  call histdef(histvid, 'v', 'vent v', &
-        'm/s', iip1, jjn, vhoriid, llm, 1, llm, zvertiidv, &
-        32, 'inst(X)', t_ops, t_wrt)
-
-  !
-  !  Temperature
-  !
-  jjn=jj_nb
-  call histdef(histid, 'temp', 'temperature', 'K', &
-        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'inst(X)', t_ops, t_wrt)
-  !
-  !  Temperature potentielle
-  !
-  call histdef(histid, 'theta', 'temperature potentielle', 'K', &
-        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'inst(X)', t_ops, t_wrt)
-
-
-  !
-  !  Geopotentiel
-  !
-  call histdef(histid, 'phi', 'geopotentiel', '-', &
-        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'inst(X)', t_ops, t_wrt)
-  !
-  !  Traceurs
-  !
-  !    DO iq=1,nqtot
-  !      call histdef(histid, tracers(iq)%name,
-  ! .             tracers(iq)%longName, '-',
-  ! .             iip1, jjn, thoriid, llm, 1, llm, zvertiid,
-  ! .             32, 'inst(X)', t_ops, t_wrt)
-  !    enddo
-  !
-  !  Masse
-  !
-  call histdef(histid, 'masse', 'masse', 'kg', &
-        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
-        32, 'inst(X)', t_ops, t_wrt)
-  !
-  !  Pression au sol
-  !
-  call histdef(histid, 'ps', 'pression naturelle au sol', 'Pa', &
-        iip1, jjn, thoriid, 1, 1, 1, -99, &
-        32, 'inst(X)', t_ops, t_wrt)
-  !
-  !  Geopotentiel au sol
-  !
-  !  call histdef(histid, 'phis', 'geopotentiel au sol', '-',
-  ! .             iip1, jjn, thoriid, 1, 1, 1, -99,
-  ! .             32, 'inst(X)', t_ops, t_wrt)
-  !
-  !  Fin
-  !
-  call histend(histid)
-  call histend(histuid)
-  call histend(histvid)
-
-end subroutine inithist_loc
Index: LMDZ6/trunk/libf/dyn3dmem/inithist_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/inithist_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/inithist_loc.f90	(revision 5268)
@@ -0,0 +1,282 @@
+!
+! $Id: initdynav_p.F 1279 2009-12-10 09:02:56Z fairhead $
+!
+subroutine inithist_loc(day0,anne0,tstep,t_ops,t_wrt)
+
+  ! This routine needs IOIPSL
+   USE IOIPSL
+
+   USE parallel_lmdz
+   use Write_field
+   use misc_mod
+   use com_io_dyn_mod, only : histid,histvid,histuid,               &
+         dynhist_file,dynhistv_file,dynhistu_file
+   USE comconst_mod, ONLY: pi
+   USE comvert_mod, ONLY: presnivs
+   USE temps_mod, ONLY: itau_dyn
+
+   implicit none
+
+  !
+  !   Routine d'initialisation des ecritures des fichiers histoires LMDZ
+  !   au format IOIPSL
+  !
+  !   Appels succesifs des routines: histbeg
+  !                              histhori
+  !                              histver
+  !                              histdef
+  !                              histend
+  !
+  !   Entree:
+  !
+  !  day0,anne0: date de reference
+  !  tstep: duree du pas de temps en seconde
+  !  t_ops: frequence de l'operation pour IOIPSL
+  !  t_wrt: frequence d'ecriture sur le fichier
+  !  nq: nombre de traceurs
+  !
+  !
+  !   L. Fairhead, LMD, 03/99
+  !
+  ! =====================================================================
+  !
+  !   Declarations
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+  include "description.h"
+  include "iniprint.h"
+
+  !   Arguments
+  !
+  integer :: day0, anne0
+  real :: tstep, t_ops, t_wrt
+
+  ! This routine needs IOIPSL
+  !   Variables locales
+  !
+  integer :: tau0
+  real :: zjulian
+  integer :: iq
+  real :: rlong(iip1,jjp1), rlat(iip1,jjp1)
+  integer :: uhoriid, vhoriid, thoriid
+  integer :: zvertiid,zvertiidv,zvertiidu
+  integer :: ii,jj
+  integer :: zan, dayref
+  integer :: jjb,jje,jjn
+
+  ! definition du domaine d'ecriture pour le rebuild
+
+  INTEGER,DIMENSION(2) :: ddid
+  INTEGER,DIMENSION(2) :: dsg
+  INTEGER,DIMENSION(2) :: dsl
+  INTEGER,DIMENSION(2) :: dpf
+  INTEGER,DIMENSION(2) :: dpl
+  INTEGER,DIMENSION(2) :: dhs
+  INTEGER,DIMENSION(2) :: dhe
+
+  INTEGER :: dynhist_domain_id
+  INTEGER :: dynhistv_domain_id
+  INTEGER :: dynhistu_domain_id
+
+  if (adjust) return
+
+  !
+  !  Initialisations
+  !
+  pi = 4. * atan (1.)
+  !
+  !  Appel a histbeg: creation du fichier netcdf et initialisations diverses
+  !
+
+  zan = anne0
+  dayref = day0
+  CALL ymds2ju(zan, 1, dayref, 0.0, zjulian)
+  tau0 = itau_dyn
+
+  do jj = 1, jjp1
+    do ii = 1, iip1
+      rlong(ii,jj) = rlonv(ii) * 180. / pi
+      rlat(ii,jj)  = rlatu(jj) * 180. / pi
+    enddo
+  enddo
+
+
+  ! Creation de 3 fichiers pour les differentes grilles horizontales
+  ! Restriction de IOIPSL: seulement 2 coordonnees dans le meme fichier
+  ! Grille Scalaire
+
+  jjb=jj_begin
+  jje=jj_end
+  jjn=jj_nb
+
+  ddid=(/ 1,2 /)
+  dsg=(/ iip1,jjp1 /)
+  dsl=(/ iip1,jjn /)
+  dpf=(/ 1,jjb /)
+  dpl=(/ iip1,jje /)
+  dhs=(/ 0,0 /)
+  dhe=(/ 0,0 /)
+
+
+  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
+        'box',dynhist_domain_id)
+
+  call histbeg(dynhist_file,iip1, rlong(:,1), jjn, &
+        rlat(1,jjb:jje), 1, iip1, 1, jjn,tau0, &
+        zjulian, tstep, thoriid, &
+        histid,dynhist_domain_id)
+
+
+  !  Creation du fichier histoire pour les grilles en V et U (oblige pour l'instant,
+  !  IOIPSL ne permet pas de grilles avec des nombres de point differents dans
+  !  un meme fichier)
+  ! Grille V
+
+  jjb=jj_begin
+  jje=jj_end
+  jjn=jj_nb
+  IF (pole_sud) jjn=jjn-1
+  IF (pole_sud) jje=jje-1
+
+  do jj = jjb, jje
+    do ii = 1, iip1
+      rlong(ii,jj) = rlonv(ii) * 180. / pi
+      rlat(ii,jj) = rlatv(jj) * 180. / pi
+    enddo
+  enddo
+
+  ddid=(/ 1,2 /)
+  dsg=(/ iip1,jjm /)
+  dsl=(/ iip1,jjn /)
+  dpf=(/ 1,jjb /)
+  dpl=(/ iip1,jje /)
+  dhs=(/ 0,0 /)
+  dhe=(/ 0,0 /)
+
+
+  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
+        'box',dynhistv_domain_id)
+
+  call histbeg(dynhistv_file,iip1, rlong(:,1), jjn, &
+        rlat(1,jjb:jje), 1, iip1, 1, jjn,tau0, &
+        zjulian, tstep, vhoriid, &
+        histvid,dynhistv_domain_id)
+
+  ! Grille U
+
+  do jj = 1, jjp1
+    do ii = 1, iip1
+      rlong(ii,jj) = rlonu(ii) * 180. / pi
+      rlat(ii,jj) = rlatu(jj) * 180. / pi
+    enddo
+  enddo
+
+  jjb=jj_begin
+  jje=jj_end
+  jjn=jj_nb
+
+  ddid=(/ 1,2 /)
+  dsg=(/ iip1,jjp1 /)
+  dsl=(/ iip1,jjn /)
+  dpf=(/ 1,jjb /)
+  dpl=(/ iip1,jje /)
+  dhs=(/ 0,0 /)
+  dhe=(/ 0,0 /)
+
+
+  call flio_dom_set(mpi_size,mpi_rank,ddid,dsg,dsl,dpf,dpl,dhs,dhe, &
+        'box',dynhistu_domain_id)
+
+  call histbeg(dynhistu_file,iip1, rlong(:,1), jjn, &
+        rlat(1,jjb:jje), 1, iip1, 1, jjn,tau0, &
+        zjulian, tstep, uhoriid, &
+        histuid,dynhistu_domain_id)
+
+
+  ! -------------------------------------------------------------
+  !  Appel a histvert pour la grille verticale
+  ! -------------------------------------------------------------
+  call histvert(histid, 'presnivs', 'Niveaux pression','mb', &
+        llm, presnivs/100., zvertiid,'down')
+  call histvert(histvid, 'presnivs', 'Niveaux pression','mb', &
+        llm, presnivs/100., zvertiidv,'down')
+  call histvert(histuid, 'presnivs', 'Niveaux pression','mb', &
+        llm, presnivs/100., zvertiidu,'down')
+
+  !
+  ! -------------------------------------------------------------
+  !  Appels a histdef pour la definition des variables a sauvegarder
+  ! -------------------------------------------------------------
+  !
+  !  Vents U
+  !
+  jjn=jj_nb
+  call histdef(histuid, 'u', 'vent u', &
+        'm/s', iip1, jjn, uhoriid, llm, 1, llm, zvertiidu, &
+        32, 'inst(X)', t_ops, t_wrt)
+
+  !
+  !  Vents V
+  !
+  if (pole_sud) jjn=jj_nb-1
+  call histdef(histvid, 'v', 'vent v', &
+        'm/s', iip1, jjn, vhoriid, llm, 1, llm, zvertiidv, &
+        32, 'inst(X)', t_ops, t_wrt)
+
+  !
+  !  Temperature
+  !
+  jjn=jj_nb
+  call histdef(histid, 'temp', 'temperature', 'K', &
+        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'inst(X)', t_ops, t_wrt)
+  !
+  !  Temperature potentielle
+  !
+  call histdef(histid, 'theta', 'temperature potentielle', 'K', &
+        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'inst(X)', t_ops, t_wrt)
+
+
+  !
+  !  Geopotentiel
+  !
+  call histdef(histid, 'phi', 'geopotentiel', '-', &
+        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'inst(X)', t_ops, t_wrt)
+  !
+  !  Traceurs
+  !
+  !    DO iq=1,nqtot
+  !      call histdef(histid, tracers(iq)%name,
+  ! .             tracers(iq)%longName, '-',
+  ! .             iip1, jjn, thoriid, llm, 1, llm, zvertiid,
+  ! .             32, 'inst(X)', t_ops, t_wrt)
+  !    enddo
+  !
+  !  Masse
+  !
+  call histdef(histid, 'masse', 'masse', 'kg', &
+        iip1, jjn, thoriid, llm, 1, llm, zvertiid, &
+        32, 'inst(X)', t_ops, t_wrt)
+  !
+  !  Pression au sol
+  !
+  call histdef(histid, 'ps', 'pression naturelle au sol', 'Pa', &
+        iip1, jjn, thoriid, 1, 1, 1, -99, &
+        32, 'inst(X)', t_ops, t_wrt)
+  !
+  !  Geopotentiel au sol
+  !
+  !  call histdef(histid, 'phis', 'geopotentiel au sol', '-',
+  ! .             iip1, jjn, thoriid, 1, 1, 1, -99,
+  ! .             32, 'inst(X)', t_ops, t_wrt)
+  !
+  !  Fin
+  !
+  call histend(histid)
+  call histend(histuid)
+  call histend(histvid)
+
+end subroutine inithist_loc
Index: LMDZ6/trunk/libf/dyn3dmem/integrd_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/integrd_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,47 +1,0 @@
-MODULE integrd_mod
-
-  REAL,POINTER,SAVE :: p(:,:)
-  REAL,POINTER,SAVE :: deltap(:,:)
-  REAL,POINTER,SAVE :: ps(:)
-
-
-  
-CONTAINS
-
-  SUBROUTINE integrd_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE dimensions_mod
-  USE advect_new_mod,ONLY : advect_new_allocate
-  IMPLICIT NONE
-  TYPE(distrib),POINTER :: d
-
-
-    d=>distrib_caldyn
-    CALL allocate_u(p,llmp1,d)
-    CALL allocate_u(deltap,llm,d)
-    CALL allocate_u(ps,d)
-    ps(:)=0
-
-    
-  END SUBROUTINE integrd_allocate
-  
-  SUBROUTINE integrd_switch_caldyn(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-
-    CALL switch_u(p,distrib_caldyn,dist)
-    CALL switch_u(deltap,distrib_caldyn,dist)
-    CALL switch_u(ps,distrib_caldyn,dist)
-
-    
-    
-  END SUBROUTINE integrd_switch_caldyn
-  
-
-  
-END MODULE integrd_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/integrd_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/integrd_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/integrd_mod.f90	(revision 5268)
@@ -0,0 +1,47 @@
+MODULE integrd_mod
+
+  REAL,POINTER,SAVE :: p(:,:)
+  REAL,POINTER,SAVE :: deltap(:,:)
+  REAL,POINTER,SAVE :: ps(:)
+
+
+  
+CONTAINS
+
+  SUBROUTINE integrd_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE dimensions_mod
+  USE advect_new_mod,ONLY : advect_new_allocate
+  IMPLICIT NONE
+  TYPE(distrib),POINTER :: d
+
+
+    d=>distrib_caldyn
+    CALL allocate_u(p,llmp1,d)
+    CALL allocate_u(deltap,llm,d)
+    CALL allocate_u(ps,d)
+    ps(:)=0
+
+    
+  END SUBROUTINE integrd_allocate
+  
+  SUBROUTINE integrd_switch_caldyn(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+
+    CALL switch_u(p,distrib_caldyn,dist)
+    CALL switch_u(deltap,distrib_caldyn,dist)
+    CALL switch_u(ps,distrib_caldyn,dist)
+
+    
+    
+  END SUBROUTINE integrd_switch_caldyn
+  
+
+  
+END MODULE integrd_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/leapfrog_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/leapfrog_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,1875 +1,0 @@
-SUBROUTINE leapfrog_loc(ucov0,vcov0,teta0,ps0, &
-        masse0,phis0,q0,time_0)
-
-   USE misc_mod
-   USE parallel_lmdz
-   USE times
-   USE mod_hallo
-   USE Bands
-   USE Write_Field
-   USE Write_Field_p
-   USE vampir
-   USE timer_filtre, ONLY : print_filtre_timer
-   USE infotrac
-   USE guide_loc_mod, ONLY : guide_main
-   USE getparam
-   USE control_mod
-   USE mod_filtreg_p
-   USE write_field_loc
-   USE allocate_field_mod
-   USE call_dissip_mod, ONLY : call_dissip
-   USE call_calfis_mod, ONLY : call_calfis
-   USE leapfrog_mod, ONLY : ucov,vcov,teta,ps,masse,phis,q,dq &
-         ,ucovm1,vcovm1,tetam1,massem1,psm1,p,pks,pk,pkf,flxw &
-         ,pbaru,pbarv,du,dv,dteta,phi,dp,w &
-         ,leapfrog_allocate,leapfrog_switch_caldyn,leapfrog_switch_dissip
-
-   use exner_hyb_loc_m, only: exner_hyb_loc
-   use exner_milieu_loc_m, only: exner_milieu_loc
-   USE comconst_mod, ONLY: cpp, dtvr, ihf
-   USE comvert_mod, ONLY: ap, bp, pressure_exner
-   USE logic_mod, ONLY: iflag_phys,ok_guide,forward,leapf,apphys, &
-         statcl,conser,apdiss,purmats,ok_strato
-   USE temps_mod, ONLY: itaufin,jD_ref,jH_ref,day_ini, &
-         day_ref,start_time,dt
-   USE mod_xios_dyn3dmem, ONLY : dyn3d_ctx_handle
-   USE lmdz_xios, ONLY: xios_update_calendar, &
-         xios_set_current_context, &
-         using_xios
-   USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_INCA, CPPKEY_REPROBUS, CPPKEY_DEBUGIO
-   USE strings_mod, ONLY: int2str
-
-  IMPLICIT NONE
-
-   ! ......   Version  du 10/01/98    ..........
-
-   !        avec  coordonnees  verticales hybrides
-  !   avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 )
-
-  !=======================================================================
-  !
-  !   Auteur:  P. Le Van /L. Fairhead/F.Hourdin
-  !   -------
-  !
-  !   Objet:
-  !   ------
-  !
-  !   GCM LMD nouvelle grille
-  !
-  !=======================================================================
-  !
-  !  ... Dans inigeom , nouveaux calculs pour les elongations  cu , cv
-  !  et possibilite d'appeler une fonction f(y)  a derivee tangente
-  !  hyperbolique a la  place de la fonction a derivee sinusoidale.
-
-  !  ... Possibilite de choisir le shema pour l'advection de
-  !    q  , en modifiant iadv dans traceur.def  (10/02) .
-  !
-  !  Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron,10/99)
-  !  Pour Van-Leer iadv=10
-  !
-  !-----------------------------------------------------------------------
-  !   Declarations:
-  !   -------------
-
-  include "dimensions.h"
-  include "paramet.h"
-  include "comdissnew.h"
-  include "comgeom.h"
-  include "description.h"
-  include "iniprint.h"
-  include "academic.h"
-
-  REAL,INTENT(IN) :: time_0 ! not used
-
-  !   dynamical variables:
-  REAL,INTENT(IN) :: ucov0(ijb_u:ije_u,llm)    ! zonal covariant wind
-  REAL,INTENT(IN) :: vcov0(ijb_v:ije_v,llm)    ! meridional covariant wind
-  REAL,INTENT(IN) :: teta0(ijb_u:ije_u,llm)    ! potential temperature
-  REAL,INTENT(IN) :: q0(ijb_u:ije_u,llm,nqtot) ! advected tracers
-  REAL,INTENT(IN) :: ps0(ijb_u:ije_u)          ! surface pressure (Pa)
-  REAL,INTENT(IN) :: masse0(ijb_u:ije_u,llm)   ! air mass
-  REAL,INTENT(IN) :: phis0(ijb_u:ije_u)        ! geopotentiat at the surface
-
-  real :: zqmin,zqmax
-
-   ! REAL,SAVE,ALLOCATABLE :: p (:,:  )               ! pression aux interfac.des couches
-   ! REAL,SAVE,ALLOCATABLE :: pks(:)                      ! exner au  sol
-   ! REAL,SAVE,ALLOCATABLE :: pk(:,:)                   ! exner au milieu des couches
-   ! REAL,SAVE,ALLOCATABLE :: pkf(:,:)                  ! exner filt.au milieu des couches
-   ! REAL,SAVE,ALLOCATABLE :: phi(:,:)                  ! geopotentiel
-   ! REAL,SAVE,ALLOCATABLE :: w(:,:)                    ! vitesse verticale
-
-  ! variables dynamiques intermediaire pour le transport
-   ! REAL,SAVE,ALLOCATABLE :: pbaru(:,:),pbarv(:,:) !flux de masse
-
-  !   variables dynamiques au pas -1
-   ! REAL,SAVE,ALLOCATABLE :: vcovm1(:,:),ucovm1(:,:)
-  !      REAL,SAVE,ALLOCATABLE :: tetam1(:,:),psm1(:)
-   ! REAL,SAVE,ALLOCATABLE :: massem1(:,:)
-
-  !   tendances dynamiques
-   ! REAL,SAVE,ALLOCATABLE :: dv(:,:),du(:,:)
-   ! REAL,SAVE,ALLOCATABLE :: dteta(:,:),dp(:)
-   ! REAL,DIMENSION(:,:,:), ALLOCATABLE, SAVE :: dq
-
-  !   tendances de la dissipation
-   ! REAL,SAVE,ALLOCATABLE :: dvdis(:,:),dudis(:,:)
-   ! REAL,SAVE,ALLOCATABLE :: dtetadis(:,:)
-
-  !   tendances physiques
-  REAL,SAVE,ALLOCATABLE :: dvfi(:,:),dufi(:,:)
-  REAL,SAVE,ALLOCATABLE :: dtetafi(:,:)
-  REAL,SAVE,ALLOCATABLE :: dpfi(:)
-  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: dqfi
-
-  !   variables pour le fichier histoire
-  REAL :: dtav      ! intervalle de temps elementaire
-
-  REAL :: tppn(iim),tpps(iim),tpn,tps
-  !
-  INTEGER :: itau,itaufinp1,iav
-   ! INTEGER  iday ! jour julien
-  REAL :: time
-
-  REAL :: SSUM
-   ! REAL,SAVE,ALLOCATABLE :: finvmaold(:,:)
-
-  !ym      LOGICAL  lafin
-  LOGICAL :: lafin
-  INTEGER :: ij,iq,l
-  INTEGER :: ik
-
-  real :: time_step, t_wrt, t_ops
-
-  ! jD_cur: jour julien courant
-  ! jH_cur: heure julienne courante
-  REAL :: jD_cur, jH_cur
-  INTEGER :: an, mois, jour
-  REAL :: secondes
-
-  logical :: physic
-  LOGICAL :: first,callinigrads
-
-  data callinigrads/.true./
-  character(len=10) :: string10
-
-   ! REAL,SAVE,ALLOCATABLE :: flxw(:,:) ! flux de masse verticale
-
-  !+jld variables test conservation energie
-   ! REAL,SAVE,ALLOCATABLE :: ecin(:,:),ecin0(:,:)
-  ! Tendance de la temp. potentiel d (theta)/ d t due a la
-  ! tansformation d'energie cinetique en energie thermique
-  ! cree par la dissipation
-  !  REAL,SAVE,ALLOCATABLE :: dtetaecdt(:,:)
-  !  REAL,SAVE,ALLOCATABLE :: vcont(:,:),ucont(:,:)
-  !  REAL,SAVE,ALLOCATABLE :: vnat(:,:),unat(:,:)
-  REAL :: d_h_vcol, d_qt, d_qw, d_ql, d_ec
-  CHARACTER(len=15) :: ztit
-  !!      INTEGER   ip_ebil_dyn  ! PRINT level for energy conserv. diag.
-   ! SAVE      ip_ebil_dyn
-   ! DATA      ip_ebil_dyn/0/
-  !-jld
-
-  character(len=80) :: dynhist_file, dynhistave_file
-  character(len=*),parameter :: modname="leapfrog_loc"
-  character(len=80) :: abort_message
-
-
-  logical,PARAMETER :: dissip_conservative=.TRUE.
-
-  INTEGER :: testita
-  PARAMETER (testita = 9)
-
-  logical , parameter :: flag_verif = .false.
-
-  ! declaration liees au parallelisme
-  INTEGER :: ierr
-  LOGICAL :: FirstCaldyn
-  LOGICAL :: FirstPhysic
-  INTEGER :: ijb,ije,j,i
-  type(Request) :: TestRequest
-  type(Request) :: Request_Dissip
-  type(Request) :: Request_physic
-
-  INTEGER :: true_itau
-  INTEGER :: iapptrac
-  INTEGER :: AdjustCount
-   ! INTEGER :: var_time
-  LOGICAL :: ok_start_timer=.FALSE.
-  LOGICAL, SAVE :: firstcall=.TRUE.
-  TYPE(distrib),SAVE :: new_dist
-
-  call check_isotopes(q0,ijb_u,ije_u,'leapfrog204: debut')
-
-!$OMP MASTER
-  ItCount=0
-!$OMP END MASTER
-  true_itau=0
-  FirstCaldyn=.TRUE.
-  FirstPhysic=.TRUE.
-  iapptrac=0
-  AdjustCount = 0
-  lafin=.false.
-
-  if (nday>=0) then
-     itaufin   = nday*day_step
-  else
-     itaufin   = -nday
-  endif
-
-  itaufinp1 = itaufin +1
-
-  call check_isotopes(q0,ijb_u,ije_u,'leapfrog 226')
-
-  itau = 0
-  physic=.true.
-  if (iflag_phys==0.or.iflag_phys==2) physic=.false.
-  CALL init_nan
-  CALL leapfrog_allocate
-  ucov=ucov0
-  vcov=vcov0
-  teta=teta0
-  ps=ps0
-  masse=masse0
-  phis=phis0
-  q=q0
-
-  call check_isotopes(q,ijb_u,ije_u,'leapfrog 239')
-
-   ! iday = day_ini+itau/day_step
-   ! time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
-   !    IF(time.GT.1.) THEN
-   !     time = time-1.
-   !     iday = iday+1
-   !    ENDIF
-
-  ! Allocate variables depending on dynamic variable nqtot
-!$OMP MASTER
-  if (firstcall) then
-  !
-  !  ALLOCATE(p(ijb_u:ije_u,llmp1))
-  !      ALLOCATE(pks(ijb_u:ije_u))
-  !  ALLOCATE(pk(ijb_u:ije_u,llm))
-  !  ALLOCATE(pkf(ijb_u:ije_u,llm))
-  !  ALLOCATE(phi(ijb_u:ije_u,llm))
-  !  ALLOCATE(w(ijb_u:ije_u,llm))
-  !  ALLOCATE(pbaru(ip1jmp1,llm),pbarv(ip1jm,llm))
-  !  ALLOCATE(vcovm1(ijb_v:ije_v,llm),ucovm1(ijb_u:ije_u,llm))
-  !  ALLOCATE(tetam1(ijb_u:ije_u,llm),psm1(ijb_u:ije_u))
-  !  ALLOCATE(massem1(ijb_u:ije_u,llm))
-  !  ALLOCATE(dv(ijb_v:ije_v,llm),du(ijb_u:ije_u,llm))
-  !  ALLOCATE(dteta(ijb_u:ije_u,llm),dp(ijb_u:ije_u))
-  !  ALLOCATE(dvdis(ijb_v:ije_v,llm),dudis(ijb_u:ije_u,llm))
-  !  ALLOCATE(dtetadis(ijb_u:ije_u,llm))
-  ALLOCATE(dvfi(ijb_v:ije_v,llm),dufi(ijb_u:ije_u,llm))
-  ALLOCATE(dtetafi(ijb_u:ije_u,llm))
-  ALLOCATE(dpfi(ijb_u:ije_u))
-   ! ALLOCATE(dq(ijb_u:ije_u,llm,nqtot))
-  ALLOCATE(dqfi(ijb_u:ije_u,llm,nqtot))
-   ! ALLOCATE(dqfi_tmp(iip1,llm,nqtot))
-   ! ALLOCATE(finvmaold(ijb_u:ije_u,llm))
-   ! ALLOCATE(flxw(ijb_u:ije_u,llm))
-   ! ALLOCATE(ecin(ijb_u:ije_u,llm),ecin0(ijb_u:ije_u,llm))
-   ! ALLOCATE(dtetaecdt(ijb_u:ije_u,llm))
-   ! ALLOCATE(vcont(ijb_v:ije_v,llm),ucont(ijb_u:ije_u,llm))
-   ! ALLOCATE(vnat(ijb_v:ije_v,llm),unat(ijb_u:ije_u,llm))
-  endif
-!$OMP END MASTER
-!$OMP BARRIER
-
-             ! CALL dynredem1_loc("restart.nc",0.0,
-  ! &                           vcov,ucov,teta,q,masse,ps)
-
-
-  !-----------------------------------------------------------------------
-  !   On initialise la pression et la fonction d'Exner :
-  !   --------------------------------------------------
-
-!$OMP MASTER
-  dq(:,:,:)=0.
-  CALL pression ( ijnb_u, ap, bp, ps, p       )
-!$OMP END MASTER
-  if (pressure_exner) then
-  CALL exner_hyb_loc( ijnb_u, ps, p, pks, pk, pkf)
-  else
-    CALL exner_milieu_loc( ijnb_u, ps, p, pks, pk, pkf )
-  endif
-  !-----------------------------------------------------------------------
-  !   Debut de l'integration temporelle:
-  !   ----------------------------------
-  ! et du parallelisme !!
-
-   1   CONTINUE ! Matsuno Forward step begins here
-
-  !   date: (NB: date remains unchanged for Backward step)
-  !   -----
-
-  jD_cur = jD_ref + day_ini - day_ref +                             &
-        (itau+1)/day_step
-  jH_cur = jH_ref + start_time +                                    &
-        mod(itau+1,day_step)/float(day_step)
-  if (jH_cur > 1.0 ) then
-    jD_cur = jD_cur +1.
-    jH_cur = jH_cur -1.
-  endif
-
-  call check_isotopes(q,ijb_u,ije_u,'leapfrog 321')
-
-  if (ok_guide) then
-    call guide_main(itau,ucov,vcov,teta,q,masse,ps)
-!$OMP BARRIER
-  endif
-
-
-
-  !
-  ! IF( MOD( itau, 10* day_step ).EQ.0 )  THEN
-  !   CALL  test_period ( ucov,vcov,teta,q,p,phis )
-  !   PRINT *,' ----   Test_period apres continue   OK ! -----', itau
-  ! ENDIF
-  !
-  !ym      CALL SCOPY( ijmllm ,vcov , 1, vcovm1 , 1 )
-  !ym      CALL SCOPY( ijp1llm,ucov , 1, ucovm1 , 1 )
-  !ym      CALL SCOPY( ijp1llm,teta , 1, tetam1 , 1 )
-  !ym      CALL SCOPY( ijp1llm,masse, 1, massem1, 1 )
-  !ym      CALL SCOPY( ip1jmp1, ps  , 1,   psm1 , 1 )
-
-   if (FirstCaldyn) then
-!$OMP MASTER
-     ucovm1=ucov
-     vcovm1=vcov
-     tetam1= teta
-     massem1= masse
-     psm1= ps
-
-  ! Ehouarn: finvmaold is actually not used
-      ! finvmaold = masse
-!$OMP END MASTER
-!$OMP BARRIER
-      ! CALL filtreg_p ( finvmaold ,jjb_u,jje_u,jjb_u,jje_u,jjp1, llm,
-  ! &                    -2,2, .TRUE., 1 )
-   else
-  ! Save fields obtained at previous time step as '...m1'
-     ijb=ij_begin
-     ije=ij_end
-
-!$OMP MASTER
-     psm1     (ijb:ije) = ps    (ijb:ije)
-!$OMP END MASTER
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-     DO l=1,llm
-       ije=ij_end
-       ucovm1   (ijb:ije,l) = ucov  (ijb:ije,l)
-       tetam1   (ijb:ije,l) = teta  (ijb:ije,l)
-       massem1  (ijb:ije,l) = masse (ijb:ije,l)
-        ! finvmaold(ijb:ije,l)=masse(ijb:ije,l)
-
-       if (pole_sud) ije=ij_end-iip1
-       vcovm1(ijb:ije,l) = vcov  (ijb:ije,l)
-
-
-     ENDDO
-!$OMP ENDDO
-
-
-  ! Ehouarn: finvmaold not used
-       ! CALL filtreg_p(finvmaold ,jjb_u,jje_u,jj_begin,jj_end,jjp1,
-  ! .                    llm, -2,2, .TRUE., 1 )
-
-   endif ! of if (FirstCaldyn)
-
-  forward = .TRUE.
-  leapf   = .FALSE.
-  dt      =  dtvr
-
-  !   ...    P.Le Van .26/04/94  ....
-
-  !ym      CALL SCOPY   ( ijp1llm,   masse, 1, finvmaold,     1 )
-  !ym      CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 )
-
-  !ym  ne sert a rien
-  !ym      call minmax(ijp1llm,q(:,:,3),zqmin,zqmax)
-
-
-     call check_isotopes(q,ijb_u,ije_u,'leapfrog 400')
-
-   2   CONTINUE ! Matsuno backward or leapfrog step begins here
-
-
-  call check_isotopes(q,ijb_u,ije_u,'leapfrog 402')
-
-!$OMP MASTER
-  ItCount=ItCount+1
-  if (MOD(ItCount,1)==1) then
-    debug=.true.
-  else
-    debug=.false.
-  endif
-!$OMP END MASTER
-  !-----------------------------------------------------------------------
-
-  !   date: (NB: only leapfrog step requires recomputing date)
-  !   -----
-
-  IF (leapf) THEN
-    jD_cur = jD_ref + day_ini - day_ref + &
-          (itau+1)/day_step
-    jH_cur = jH_ref + start_time + &
-          mod(itau+1,day_step)/float(day_step)
-    if (jH_cur > 1.0 ) then
-      jD_cur = jD_cur +1.
-      jH_cur = jH_cur -1.
-    endif
-  ENDIF
-
-  !   gestion des appels de la physique et des dissipations:
-  !   ------------------------------------------------------
-  !
-  !   ...    P.Le Van  ( 6/02/95 )  ....
-
-  apphys = .FALSE.
-  statcl = .FALSE.
-  conser = .FALSE.
-  apdiss = .FALSE.
-
-  IF( purmats ) THEN
-  ! ! Purely Matsuno time stepping
-     IF( MOD(itau,iconser) .EQ.0.AND.  forward    ) conser = .TRUE.
-     IF( MOD(itau,dissip_period ).EQ.0.AND..NOT.forward ) &
-           apdiss = .TRUE.
-     IF( MOD(itau,iphysiq ).EQ.0.AND..NOT.forward &
-           .and. physic                        ) apphys = .TRUE.
-  ELSE
-  ! ! Leapfrog/Matsuno time stepping
-     IF( MOD(itau   ,iconser) .EQ. 0              ) conser = .TRUE.
-     IF( MOD(itau+1,dissip_period).EQ.0 .AND. .NOT. forward ) &
-           apdiss = .TRUE.
-     IF( MOD(itau+1,iphysiq).EQ.0.AND.physic) apphys=.TRUE.
-  END IF
-
-  ! Ehouarn: for Shallow Water case (ie: 1 vertical layer),
-       ! supress dissipation step
-  if (llm.eq.1) then
-    apdiss=.false.
-  endif
-
-  !ym    ---> Pour le moment
-  !ym      apphys = .FALSE.
-  statcl = .FALSE.
-  ! conser = .FALSE. ! ie: no output of control variables to stdout in //
-
-  if (firstCaldyn) then
-!$OMP MASTER
-      call Set_Distrib(distrib_caldyn)
-!$OMP END MASTER
-!$OMP BARRIER
-      firstCaldyn=.FALSE.
-  !ym          call InitTime
-!$OMP MASTER
-      call Init_timer
-!$OMP END MASTER
-  endif
-
-!$OMP MASTER
-  IF (ok_start_timer) THEN
-    CALL InitTime
-    ok_start_timer=.FALSE.
-  ENDIF
-!$OMP END MASTER
-
-
-  call check_isotopes(q,ijb_u,ije_u,'leapfrog 471')
-
-  !ym  PAS D'AJUSTEMENT POUR LE MOMENT
-  if (Adjust) then
-    AdjustCount=AdjustCount+1
-     ! if (iapptrac==iapp_tracvl .and. (forward.OR. leapf)
-  ! &         .and. itau/iphysiq>2 .and. Adjustcount>30) then
-    if (Adjustcount>1) then
-       AdjustCount=0
-!$OMP MASTER
-       call allgather_timer_average
-
-    if (prt_level > 9) then
-
-    print *,'*********************************'
-    print *,'******    TIMER CALDYN     ******'
-    do i=0,mpi_size-1
-      print *,'proc',i,' :   Nb Bandes  :',jj_nb_caldyn(i), &
-            '  : temps moyen :', &
-            timer_average(jj_nb_caldyn(i),timer_caldyn,i), &
-            '+-',timer_delta(jj_nb_caldyn(i),timer_caldyn,i)
-    enddo
-
-    print *,'*********************************'
-    print *,'******    TIMER VANLEER    ******'
-    do i=0,mpi_size-1
-      print *,'proc',i,' :   Nb Bandes  :',jj_nb_vanleer(i), &
-            '  : temps moyen :', &
-            timer_average(jj_nb_vanleer(i),timer_vanleer,i), &
-            '+-',timer_delta(jj_nb_vanleer(i),timer_vanleer,i)
-    enddo
-
-    print *,'*********************************'
-    print *,'******    TIMER DISSIP    ******'
-    do i=0,mpi_size-1
-      print *,'proc',i,' :   Nb Bandes  :',jj_nb_dissip(i), &
-            '  : temps moyen :', &
-            timer_average(jj_nb_dissip(i),timer_dissip,i), &
-            '+-',timer_delta(jj_nb_dissip(i),timer_dissip,i)
-    enddo
-
-     ! if (mpi_rank==0) call WriteBands
-
-   endif
-
-     call AdjustBands_caldyn(new_dist)
-!$OMP END MASTER
-!$OMP BARRIER
-     CALL leapfrog_switch_caldyn(new_dist)
-!$OMP BARRIER
-
-
-!$OMP MASTER
-     distrib_caldyn=new_dist
-     CALL set_distrib(distrib_caldyn)
-!$OMP END MASTER
-!$OMP BARRIER
-      ! call Register_SwapFieldHallo(ucov,ucov,ip1jmp1,llm,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(ucovm1,ucovm1,ip1jmp1,llm,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(vcov,vcov,ip1jm,llm,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(vcovm1,vcovm1,ip1jm,llm,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(teta,teta,ip1jmp1,llm,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(tetam1,tetam1,ip1jmp1,llm,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(masse,masse,ip1jmp1,llm,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(massem1,massem1,ip1jmp1,llm,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(ps,ps,ip1jmp1,1,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(psm1,psm1,ip1jmp1,1,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(pkf,pkf,ip1jmp1,llm,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(pk,pk,ip1jmp1,llm,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(pks,pks,ip1jmp1,1,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(phis,phis,ip1jmp1,1,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(phi,phi,ip1jmp1,llm,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !     call Register_SwapFieldHallo(finvmaold,finvmaold,ip1jmp1,llm,
-  ! &                                jj_Nb_caldyn,0,0,TestRequest)
-  !
-  !    do j=1,nqtot
-  !     call Register_SwapFieldHallo(q(:,:,j),q(:,:,j),ip1jmp1,llm,
-  ! &                                jj_nb_caldyn,0,0,TestRequest)
-  !    enddo
-  !
-  !     call Set_Distrib(distrib_caldyn)
-  !     call SendRequest(TestRequest)
-  !     call WaitRequest(TestRequest)
-
-!$OMP MASTER
-    call AdjustBands_dissip(new_dist)
-!$OMP END MASTER
-!$OMP BARRIER
-    CALL leapfrog_switch_dissip(new_dist)
-!$OMP BARRIER
-!$OMP MASTER
-    distrib_dissip=new_dist
-!$OMP END MASTER
-!$OMP BARRIER
-     ! call AdjustBands_physic
-
-!$OMP MASTER
-    if (mpi_rank==0) call WriteBands
-!$OMP END MASTER
-
-
-  endif
-  endif
-
-
-  call check_isotopes(q,ijb_u,ije_u,'leapfrog 589')
-
-  !-----------------------------------------------------------------------
-  !   calcul des tendances dynamiques:
-  !   --------------------------------
-!$OMP BARRIER
-!$OMP MASTER
-   call VTb(VThallo)
-!$OMP END MASTER
-
-   call Register_Hallo_u(ucov,llm,1,1,1,1,TestRequest)
-   call Register_Hallo_v(vcov,llm,1,1,1,1,TestRequest)
-   call Register_Hallo_u(teta,llm,1,1,1,1,TestRequest)
-   call Register_Hallo_u(ps,1,1,2,2,1,TestRequest)
-   call Register_Hallo_u(pkf,llm,1,1,1,1,TestRequest)
-   call Register_Hallo_u(pk,llm,1,1,1,1,TestRequest)
-   call Register_Hallo_u(pks,1,1,1,1,1,TestRequest)
-   call Register_Hallo_u(p,llmp1,1,1,1,1,TestRequest)
-
-    ! do j=1,nqtot
-    !   call Register_Hallo(q(1,1,j),ip1jmp1,llm,1,1,1,1,
-  ! *                       TestRequest)
-  !    enddo
-
-   call SendRequest(TestRequest)
-!$OMP BARRIER
-   call WaitRequest(TestRequest)
-
-!$OMP MASTER
-   call VTe(VThallo)
-!$OMP END MASTER
-!$OMP BARRIER
-
-  if (debug) then
-    call WriteField_u('ucov',ucov)
-    call WriteField_v('vcov',vcov)
-    call WriteField_u('teta',teta)
-    call WriteField_u('ps',ps)
-    call WriteField_u('masse',masse)
-    call WriteField_u('pk',pk)
-    call WriteField_u('pks',pks)
-    call WriteField_u('pkf',pkf)
-    call WriteField_u('phis',phis)
-    do iq=1,nqtot
-      call WriteField_u('q'//trim(int2str(iq)), &
-            q(:,:,iq))
-    enddo
-  endif
-
-
-  True_itau=True_itau+1
-
-!$OMP MASTER
-  IF (prt_level>9) THEN
-    WRITE(lunout,*)"leapfrog_p: Iteration No",True_itau
-  ENDIF
-
-
-  call start_timer(timer_caldyn)
-
-  ! ! compute geopotential phi()
-  CALL geopot_loc  ( ip1jmp1, teta  , pk , pks,  phis  , phi   )
-
-  call check_isotopes(q,ijb_u,ije_u,'leapfrog 651')
-
-  call VTb(VTcaldyn)
-!$OMP END MASTER
-   ! var_time=time+iday-day_ini
-
-!$OMP BARRIER
-   ! CALL FTRACE_REGION_BEGIN("caldyn")
-  time = jD_cur + jH_cur
-
-  CALL caldyn_loc &
-        ( itau,ucov,vcov,teta,ps,masse,pk,pkf,phis , &
-        phi,conser,du,dv,dteta,dp,w, pbaru,pbarv, time )
-
-   ! CALL FTRACE_REGION_END("caldyn")
-
-!$OMP MASTER
-  if (mpi_rank==0.AND.conser) THEN
-     WRITE(lunout,*) 'leapfrog_loc, Time step: ',itau,' Day:',time
-  ENDIF
-  call VTe(VTcaldyn)
-!$OMP END MASTER
-
-IF (CPPKEY_DEBUGIO) THEN
-  call WriteField_u('du',du)
-  call WriteField_v('dv',dv)
-  call WriteField_u('dteta',dteta)
-  call WriteField_u('dp',dp)
-  call WriteField_u('w',w)
-  call WriteField_u('pbaru',pbaru)
-  call WriteField_v('pbarv',pbarv)
-  call WriteField_u('p',p)
-  call WriteField_u('masse',masse)
-  call WriteField_u('pk',pk)
-END IF
-  !-----------------------------------------------------------------------
-  !   calcul des tendances advection des traceurs (dont l'humidite)
-  !   -------------------------------------------------------------
-
-  call check_isotopes(q,ijb_u,ije_u, &
-        'leapfrog 686: avant caladvtrac')
-
-  IF( forward.OR. leapf )  THEN
-  ! Ehouarn: NB: fields sent to advtrac are those at the beginning of the time step
-    ! !write(*,*) 'leapfrog 679: avant CALL caladvtrac_loc'
-     CALL caladvtrac_loc(q,pbaru,pbarv, &
-           p, masse, dq,  teta, &
-           flxw,pk, iapptrac)
-
-  ! call creation of mass flux
-     IF (offline .AND. .NOT. adjust) THEN
-        CALL fluxstokenc_p(pbaru,pbarv,masse,teta,phi)
-     ENDIF
-
-     ! !write(*,*) 'leapfrog 719'
-     call check_isotopes(q,ijb_u,ije_u, &
-           'leapfrog 698: apres caladvtrac')
-
-   ! do j=1,nqtot
-   !   call WriteField_u('qadv'//trim(int2str(j)),q(:,:,j))
-   ! enddo
-
-  ! Ehouarn: Storage of mass flux for off-line tracers... not implemented...
-
-  ENDIF ! of IF( forward.OR. leapf )
-
-
-  !-----------------------------------------------------------------------
-  !   integrations dynamique et traceurs:
-  !   ----------------------------------
-
-!$OMP MASTER
-   call VTb(VTintegre)
-!$OMP END MASTER
-IF (CPPKEY_DEBUGIO) THEN
-  if (true_itau>20) then
-  call WriteField_u('ucovm1',ucovm1)
-  call WriteField_v('vcovm1',vcovm1)
-  call WriteField_u('tetam1',tetam1)
-  call WriteField_u('psm1',psm1)
-  call WriteField_u('ucov_int',ucov)
-  call WriteField_v('vcov_int',vcov)
-  call WriteField_u('teta_int',teta)
-  call WriteField_u('ps_int',ps)
-  endif
-END IF
-!$OMP BARRIER
-    ! CALL FTRACE_REGION_BEGIN("integrd")
-
-   ! !write(*,*) 'leapfrog 720'
-   call check_isotopes(q,ijb_u,ije_u,'leapfrog 756')
-
-   ! ! CRisi: pourquoi aller jusqu'à 2 et non pas jusqu'à nqtot??
-   CALL integrd_loc ( nqtot,vcovm1,ucovm1,tetam1,psm1,massem1 , &
-         dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps,masse,phis)
-  ! $              finvmaold                                    )
-
-  !  !write(*,*) 'leapfrog 724'
-   call check_isotopes(q,ijb_u,ije_u,'leapfrog 762')
-
-    ! CALL FTRACE_REGION_END("integrd")
-!$OMP BARRIER
-IF (CPPKEY_DEBUGIO) THEN
-  call WriteField_u('ucovm1',ucovm1)
-  call WriteField_v('vcovm1',vcovm1)
-  call WriteField_u('tetam1',tetam1)
-  call WriteField_u('psm1',psm1)
-  call WriteField_u('ucov_int',ucov)
-  call WriteField_v('vcov_int',vcov)
-  call WriteField_u('teta_int',teta)
-  call WriteField_u('ps_int',ps)
-END IF
-
-  call check_isotopes(q,ijb_u,ije_u,'leapfrog 775')
-
-   ! do j=1,nqtot
-   !   call WriteField_p('q'//trim(int2str(j)),
-  ! .                reshape(q(:,:,j),(/iip1,jmp1,llm/)))
-  !    call WriteField_p('dq'//trim(int2str(j)),
-  ! .                reshape(dq(:,:,j),(/iip1,jmp1,llm/)))
-  !  enddo
-
-
-!$OMP MASTER
-   call VTe(VTintegre)
-!$OMP END MASTER
-  ! .P.Le Van (26/04/94  ajout de  finvpold dans l'appel d'integrd)
-  !
-  !-----------------------------------------------------------------------
-  !   calcul des tendances physiques:
-  !   -------------------------------
-  !    ########   P.Le Van ( Modif le  6/02/95 )   ###########
-  !
-   IF( purmats )  THEN
-      IF( itau.EQ.itaufin.AND..NOT.forward ) lafin = .TRUE.
-   ELSE
-      IF( itau+1.EQ. itaufin )              lafin = .TRUE.
-   ENDIF
-
-  !c$OMP END PARALLEL
-
-  !
-  !
-   IF( apphys )  THEN
-
-     CALL call_calfis(itau,lafin,ucov,vcov,teta,masse,ps, &
-           phis,q,flxw)
-  ! #ifdef DEBUG_IO
-      ! call WriteField_u('ucovfi',ucov)
-      ! call WriteField_v('vcovfi',vcov)
-      ! call WriteField_u('tetafi',teta)
-      ! call WriteField_u('pfi',p)
-      ! call WriteField_u('pkfi',pk)
-      ! do j=1,nqtot
-      !   call WriteField_u('qfi'//trim(int2str(j)),q(:,:,j))
-      ! enddo
-  ! #endif
-  ! c
-  ! c     .......   Ajout   P.Le Van ( 17/04/96 )   ...........
-  ! c
-  ! cc$OMP PARALLEL DEFAULT(SHARED)
-  ! cc$OMP+         PRIVATE(rdaym_ini,rdayvrai,ijb,ije)
-
-  ! c$OMP MASTER
-      !  call suspend_timer(timer_caldyn)
-
-      !  write(lunout,*)
-   ! &   'leapfrog_p: Entree dans la physique : Iteration No ',true_itau
-  ! c$OMP END MASTER
-
-   !     CALL pression_loc (  ip1jmp1, ap, bp, ps,  p      )
-
-  ! c$OMP BARRIER
-   !     CALL exner_hyb_loc(  ip1jmp1, ps, p,pks, pk, pkf )
-  ! c$OMP BARRIER
-   !       jD_cur = jD_ref + day_ini - day_ref
-   ! $        + int (itau * dtvr / daysec)
-   !       jH_cur = jH_ref +                                            &
-   ! &              (itau * dtvr / daysec - int(itau * dtvr / daysec))
-  ! !         call ju2ymds(jD_cur+jH_cur, an, mois, jour, secondes)
-
-  ! c rajout debug
-  ! c       lafin = .true.
-
-
-  ! c   Inbterface avec les routines de phylmd (phymars ... )
-  ! c   -----------------------------------------------------
-
-  ! c+jld
-
-  ! c  Diagnostique de conservation de l'energie : initialisation
-  !
-  ! c-jld
-  ! c$OMP BARRIER
-  ! c$OMP MASTER
-  !     call VTb(VThallo)
-  ! c$OMP END MASTER
-
-  ! #ifdef DEBUG_IO
-  !     call WriteField_u('ucovfi',ucov)
-  !     call WriteField_v('vcovfi',vcov)
-  !     call WriteField_u('tetafi',teta)
-  !     call WriteField_u('pfi',p)
-  !     call WriteField_u('pkfi',pk)
-  ! #endif
-  !     call SetTag(Request_physic,800)
-  !
-  !     call Register_SwapField_u(ucov,ucov,distrib_physic,
-  !  *                            Request_physic,up=2,down=2)
-  !
-  !     call Register_SwapField_v(vcov,vcov,distrib_physic,
-  !  *                            Request_physic,up=2,down=2)
-
-  !     call Register_SwapField_u(teta,teta,distrib_physic,
-  !  *                            Request_physic,up=2,down=2)
-  !
-  !     call Register_SwapField_u(masse,masse,distrib_physic,
-  !  *                            Request_physic,up=1,down=2)
-
-  !     call Register_SwapField_u(p,p,distrib_physic,
-  !  *                            Request_physic,up=2,down=2)
-  !
-  !     call Register_SwapField_u(pk,pk,distrib_physic,
-  !  *                            Request_physic,up=2,down=2)
-  !
-  !     call Register_SwapField_u(phis,phis,distrib_physic,
-  !  *                            Request_physic,up=2,down=2)
-  !
-  !     call Register_SwapField_u(phi,phi,distrib_physic,
-  !  *                            Request_physic,up=2,down=2)
-  !
-  !     call Register_SwapField_u(w,w,distrib_physic,
-  !  *                            Request_physic,up=2,down=2)
-  !
-  !     call Register_SwapField_u(q,q,distrib_physic,
-  !  *                            Request_physic,up=2,down=2)
-
-  !     call Register_SwapField_u(flxw,flxw,distrib_physic,
-  !  *                            Request_physic,up=2,down=2)
-  !
-  !     call SendRequest(Request_Physic)
-  ! c$OMP BARRIER
-  !     call WaitRequest(Request_Physic)
-
-  ! c$OMP BARRIER
-  ! c$OMP MASTER
-  !     call Set_Distrib(distrib_Physic)
-  !     call VTe(VThallo)
-  !
-  !     call VTb(VTphysiq)
-  ! c$OMP END MASTER
-  ! c$OMP BARRIER
-
-  ! #ifdef DEBUG_IO
-  !   call WriteField_u('ucovfi',ucov)
-  !   call WriteField_v('vcovfi',vcov)
-  !   call WriteField_u('tetafi',teta)
-  !   call WriteField_u('pfi',p)
-  !   call WriteField_u('pkfi',pk)
-  !   do j=1,nqtot
-  !     call WriteField_u('qfi'//trim(int2str(j)),q(:,:,j))
-  !   enddo
-  ! #endif
-  !    STOP
-  ! c$OMP BARRIER
-  ! !        CALL FTRACE_REGION_BEGIN("calfis")
-  !     CALL calfis_loc(lafin ,jD_cur, jH_cur,
-  !  $               ucov,vcov,teta,q,masse,ps,p,pk,phis,phi ,
-  !  $               du,dv,dteta,dq,
-  !  $               flxw,
-  !  $               dufi,dvfi,dtetafi,dqfi,dpfi  )
-  ! !        CALL FTRACE_REGION_END("calfis")
-  ! !        ijb=ij_begin
-  ! !        ije=ij_end
-  ! !        if ( .not. pole_nord) then
-  ! !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  ! !          DO l=1,llm
-  ! !          dufi_tmp(1:iip1,l)   = dufi(ijb:ijb+iim,l)
-  ! !          dvfi_tmp(1:iip1,l)   = dvfi(ijb:ijb+iim,l)
-  ! !          dtetafi_tmp(1:iip1,l)= dtetafi(ijb:ijb+iim,l)
-  ! !          dqfi_tmp(1:iip1,l,:) = dqfi(ijb:ijb+iim,l,:)
-  ! !          ENDDO
-  ! !c$OMP END DO NOWAIT
-  ! !
-  ! !c$OMP MASTER
-  ! !          dpfi_tmp(1:iip1)     = dpfi(ijb:ijb+iim)
-  ! !c$OMP END MASTER
-  ! !        endif ! of if ( .not. pole_nord)
-
-  ! !c$OMP BARRIER
-  ! !c$OMP MASTER
-  ! !        call Set_Distrib(distrib_physic_bis)
-
-  ! !        call VTb(VThallo)
-  ! !c$OMP END MASTER
-  ! !c$OMP BARRIER
-  ! !
-  ! !        call Register_Hallo_u(dufi,llm,
-  ! !     *                      1,0,0,1,Request_physic)
-  ! !
-  ! !        call Register_Hallo_v(dvfi,llm,
-  ! !     *                      1,0,0,1,Request_physic)
-  ! !
-  ! !        call Register_Hallo_u(dtetafi,llm,
-  ! !     *                      1,0,0,1,Request_physic)
-  ! !
-  ! !        call Register_Hallo_u(dpfi,1,
-  ! !     *                      1,0,0,1,Request_physic)
-  ! !
-  ! !        do j=1,nqtot
-  ! !          call Register_Hallo_u(dqfi(ijb_u,1,j),llm,
-  ! !     *                        1,0,0,1,Request_physic)
-  ! !        enddo
-  ! !
-  ! !        call SendRequest(Request_Physic)
-  ! !c$OMP BARRIER
-  ! !        call WaitRequest(Request_Physic)
-  ! !
-  ! !c$OMP BARRIER
-  ! !c$OMP MASTER
-  ! !        call VTe(VThallo)
-  ! !
-  ! !        call set_Distrib(distrib_Physic)
-  ! !c$OMP END MASTER
-  ! !c$OMP BARRIER
-  ! !                ijb=ij_begin
-  ! !        if (.not. pole_nord) then
-  ! !
-  ! !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  ! !          DO l=1,llm
-  ! !            dufi(ijb:ijb+iim,l) = dufi(ijb:ijb+iim,l)+dufi_tmp(1:iip1,l)
-  ! !            dvfi(ijb:ijb+iim,l) = dvfi(ijb:ijb+iim,l)+dvfi_tmp(1:iip1,l)
-  ! !            dtetafi(ijb:ijb+iim,l) = dtetafi(ijb:ijb+iim,l)
-  ! !     &                              +dtetafi_tmp(1:iip1,l)
-  ! !            dqfi(ijb:ijb+iim,l,:) = dqfi(ijb:ijb+iim,l,:)
-  ! !     &                              + dqfi_tmp(1:iip1,l,:)
-  ! !          ENDDO
-  ! !c$OMP END DO NOWAIT
-  ! !
-  ! !c$OMP MASTER
-  ! !          dpfi(ijb:ijb+iim)   = dpfi(ijb:ijb+iim)+ dpfi_tmp(1:iip1)
-  ! !c$OMP END MASTER
-  ! !
-  ! !        endif ! of if (.not. pole_nord)
-
-  ! #ifdef DEBUG_IO
-  !     call WriteField_u('dufi',dufi)
-  !     call WriteField_v('dvfi',dvfi)
-  !     call WriteField_u('dtetafi',dtetafi)
-  !     call WriteField_u('dpfi',dpfi)
-  !     do j=1,nqtot
-  !       call WriteField_u('dqfi'//trim(int2str(j)),dqfi(:,:,j))
-  !    enddo
-  ! #endif
-
-  ! c$OMP BARRIER
-
-  ! c      ajout des tendances physiques:
-  ! c      ------------------------------
-  ! #ifdef DEBUG_IO
-  !     call WriteField_u('ucovfi',ucov)
-  !     call WriteField_v('vcovfi',vcov)
-  !     call WriteField_u('tetafi',teta)
-  !         call WriteField_u('psfi',ps)
-  !     do j=1,nqtot
-  !       call WriteField_u('qfi'//trim(int2str(j)),q(:,:,j))
-  !    enddo
-  ! #endif
-
-  !      IF (ok_strato) THEN
-  !        CALL top_bound_loc( vcov,ucov,teta,masse,dufi,dvfi,dtetafi)
-  !      ENDIF
-
-  ! #ifdef DEBUG_IO
-  !     call WriteField_u('ucovfi',ucov)
-  !     call WriteField_v('vcovfi',vcov)
-  !     call WriteField_u('tetafi',teta)
-  !         call WriteField_u('psfi',ps)
-  !     do j=1,nqtot
-  !       call WriteField_u('qfi'//trim(int2str(j)),q(:,:,j))
-  !    enddo
-  ! #endif
-
-  !       CALL addfi_loc( dtphys, leapf, forward   ,
-  !  $                  ucov, vcov, teta , q   ,ps ,
-  !  $                 dufi, dvfi, dtetafi , dqfi ,dpfi  )
-
-  ! #ifdef DEBUG_IO
-  !     call WriteField_u('ucovfi',ucov)
-  !     call WriteField_v('vcovfi',vcov)
-  !     call WriteField_u('tetafi',teta)
-  !         call WriteField_u('psfi',ps)
-  !     do j=1,nqtot
-  !       call WriteField_u('qfi'//trim(int2str(j)),q(:,:,j))
-  !    enddo
-  ! #endif
-
-  ! c$OMP BARRIER
-  ! c$OMP MASTER
-  !     call VTe(VTphysiq)
-
-  !     call VTb(VThallo)
-  ! c$OMP END MASTER
-
-  !     call SetTag(Request_physic,800)
-  !     call Register_SwapField_u(ucov,ucov,
-  !  *                               distrib_caldyn,Request_physic)
-  !
-  !     call Register_SwapField_v(vcov,vcov,
-  !  *                               distrib_caldyn,Request_physic)
-  !
-  !     call Register_SwapField_u(teta,teta,
-  !  *                               distrib_caldyn,Request_physic)
-  !
-  !     call Register_SwapField_u(masse,masse,
-  !  *                               distrib_caldyn,Request_physic)
-
-  !     call Register_SwapField_u(p,p,
-  !  *                               distrib_caldyn,Request_physic)
-  !
-  !     call Register_SwapField_u(pk,pk,
-  !  *                               distrib_caldyn,Request_physic)
-  !
-  !     call Register_SwapField_u(phis,phis,
-  !  *                               distrib_caldyn,Request_physic)
-  !
-  !     call Register_SwapField_u(phi,phi,
-  !  *                               distrib_caldyn,Request_physic)
-  !
-  !     call Register_SwapField_u(w,w,
-  !  *                               distrib_caldyn,Request_physic)
-
-  !     call Register_SwapField_u(q,q,
-  !  *                               distrib_caldyn,Request_physic)
-  !
-  !     call SendRequest(Request_Physic)
-  ! c$OMP BARRIER
-  !     call WaitRequest(Request_Physic)
-
-  ! c$OMP BARRIER
-  ! c$OMP MASTER
-  !    call VTe(VThallo)
-  !    call set_distrib(distrib_caldyn)
-  ! c$OMP END MASTER
-  ! c$OMP BARRIER
-  ! c
-  ! c  Diagnostique de conservation de l'energie : difference
-  !   IF (ip_ebil_dyn.ge.1 ) THEN
-  !       ztit='bil phys'
-  !       CALL diagedyn(ztit,2,1,1,dtphys
-  !  e  , ucov    , vcov , ps, p ,pk , teta , q(:,:,1), q(:,:,2))
-  !   ENDIF
-
-  ! #ifdef DEBUG_IO
-  !     call WriteField_u('ucovfi',ucov)
-  !     call WriteField_v('vcovfi',vcov)
-  !     call WriteField_u('tetafi',teta)
-  !         call WriteField_u('psfi',ps)
-  !     do j=1,nqtot
-  !       call WriteField_u('qfi'//trim(int2str(j)),q(:,:,j))
-  !    enddo
-  ! #endif
-
-
-  ! c-jld
-!$OMP MASTER
-     if (FirstPhysic) then
-       ok_start_timer=.TRUE.
-       FirstPhysic=.false.
-     endif
-!$OMP END MASTER
-   ENDIF ! of IF( apphys )
-
-   call check_isotopes(q,ijb_u,ije_u,'leapfrog 1132')
-    ! !write(*,*) 'leapfrog 1134: iflag_phys=',iflag_phys
-
-  IF(iflag_phys.EQ.2) THEN ! "Newtonian" case
-!$OMP MASTER
-     if (FirstPhysic) then
-       ok_start_timer=.TRUE.
-       FirstPhysic=.false.
-     endif
-!$OMP END MASTER
-
-
-  !   Calcul academique de la physique = Rappel Newtonien + fritcion
-  !   --------------------------------------------------------------
-  !ym       teta(:,:)=teta(:,:)
-  !ym     s  -iphysiq*dtvr*(teta(:,:)-tetarappel(:,:))/taurappel
-   ijb=ij_begin
-   ije=ij_end
-  !LF       teta(ijb:ije,:)=teta(ijb:ije,:)
-  !LF     s  -iphysiq*dtvr*(teta(ijb:ije,:)-tetarappel(ijb:ije,:))/taurappel
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-   do l=1,llm
-   teta(ijb:ije,l)=teta(ijb:ije,l) -dtvr* &
-         (teta(ijb:ije,l)-tetarappel(ijb:ije,l))* &
-         (knewt_g+knewt_t(l)*clat4(ijb:ije))
-   enddo
-!$OMP END DO
-
-!$OMP MASTER
-   if (planet_type.eq."giant") then
-     ! ! add an intrinsic heat flux at the base of the atmosphere
-     teta(ijb:ije,1) = teta(ijb:ije,1) &
-           + dtvr * aire(ijb:ije) * ihf / cpp / masse(ijb:ije,1)
-   endif
-!$OMP END MASTER
-!$OMP BARRIER
-
-
-   call Register_Hallo_u(ucov,llm,0,1,1,0,Request_Physic)
-   call Register_Hallo_v(vcov,llm,1,1,1,1,Request_Physic)
-   call SendRequest(Request_Physic)
-!$OMP BARRIER
-   call WaitRequest(Request_Physic)
-!$OMP BARRIER
-   call friction_loc(ucov,vcov,dtvr)
-!$OMP BARRIER
-
-    ! ! Sponge layer (if any)
-    IF (ok_strato) THEN
-      CALL top_bound_loc(vcov,ucov,teta,masse,dtvr)
-!$OMP BARRIER
-    ENDIF ! of IF (ok_strato)
-  ENDIF ! of IF(iflag_phys.EQ.2)
-
-
-    CALL pression_loc ( ip1jmp1, ap, bp, ps, p                  )
-!$OMP BARRIER
-    if (pressure_exner) then
-    CALL exner_hyb_loc( ijnb_u, ps, p, pks, pk, pkf )
-    else
-      CALL exner_milieu_loc( ijnb_u, ps, p, pks, pk, pkf )
-    endif
-!$OMP BARRIER
-    CALL massdair_loc(p,masse)
-!$OMP BARRIER
-
-  !c$OMP END PARALLEL
-    call check_isotopes(q,ijb_u,ije_u,'leapfrog 1196')
-
-  !-----------------------------------------------------------------------
-  !   dissipation horizontale et verticale  des petites echelles:
-  !   ----------------------------------------------------------
-  ! !write(*,*) 'leapfrog 1163: apdiss=',apdiss
-  IF(apdiss) THEN
-
-    CALL call_dissip(ucov,vcov,teta,p,pk,ps)
-  !cc$OMP  PARALLEL DEFAULT(SHARED)
-  !cc$OMP+          PRIVATE(ijb,ije,tppn,tpn,tpps,tps)
-  !c$OMP MASTER
-     ! call suspend_timer(timer_caldyn)
-  !
-  !c       print*,'Entree dans la dissipation : Iteration No ',true_itau
-  !c   calcul de l'energie cinetique avant dissipation
-  !c       print *,'Passage dans la dissipation'
-
-  !    call VTb(VThallo)
-  !c$OMP END MASTER
-
-  !c$OMP BARRIER
-
-  !    call Register_SwapField_u(ucov,ucov,distrib_dissip,
-  ! *                            Request_dissip,up=1,down=1)
-
-  !    call Register_SwapField_v(vcov,vcov,distrib_dissip,
-  ! *                            Request_dissip,up=1,down=1)
-
-  !    call Register_SwapField_u(teta,teta,distrib_dissip,
-  ! *                            Request_dissip)
-
-  !    call Register_SwapField_u(p,p,distrib_dissip,
-  ! *                            Request_dissip)
-
-  !    call Register_SwapField_u(pk,pk,distrib_dissip,
-  ! *                            Request_dissip)
-
-  !    call SendRequest(Request_dissip)
-  !c$OMP BARRIER
-  !    call WaitRequest(Request_dissip)
-
-  !c$OMP BARRIER
-  !c$OMP MASTER
-  !    call set_distrib(distrib_dissip)
-  !    call VTe(VThallo)
-  !    call VTb(VTdissipation)
-  !    call start_timer(timer_dissip)
-  !c$OMP END MASTER
-  !c$OMP BARRIER
-
-  !    call covcont_loc(llm,ucov,vcov,ucont,vcont)
-  !    call enercin_loc(vcov,ucov,vcont,ucont,ecin0)
-
-  !c   dissipation
-
-  !!        CALL FTRACE_REGION_BEGIN("dissip")
-  !    CALL dissip_loc(vcov,ucov,teta,p,dvdis,dudis,dtetadis)
-
-  !#ifdef DEBUG_IO
-  !    call WriteField_u('dudis',dudis)
-  !    call WriteField_v('dvdis',dvdis)
-  !    call WriteField_u('dtetadis',dtetadis)
-  !#endif
-  !
-  !!      CALL FTRACE_REGION_END("dissip")
-  !
-  !    ijb=ij_begin
-  !    ije=ij_end
-  !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  !    DO l=1,llm
-  !      ucov(ijb:ije,l)=ucov(ijb:ije,l)+dudis(ijb:ije,l)
-  !    ENDDO
-  !c$OMP END DO NOWAIT
-  !    if (pole_sud) ije=ije-iip1
-  !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  !    DO l=1,llm
-  !      vcov(ijb:ije,l)=vcov(ijb:ije,l)+dvdis(ijb:ije,l)
-  !    ENDDO
-  !c$OMP END DO NOWAIT
-
-  !c       teta=teta+dtetadis
-
-
-  !c------------------------------------------------------------------------
-  !    if (dissip_conservative) then
-  !C       On rajoute la tendance due a la transform. Ec -> E therm. cree
-  !C       lors de la dissipation
-  !c$OMP BARRIER
-  !c$OMP MASTER
-  !        call suspend_timer(timer_dissip)
-  !        call VTb(VThallo)
-  !c$OMP END MASTER
-  !        call Register_Hallo_u(ucov,llm,1,1,1,1,Request_Dissip)
-  !        call Register_Hallo_v(vcov,llm,1,1,1,1,Request_Dissip)
-  !        call SendRequest(Request_Dissip)
-  !c$OMP BARRIER
-  !        call WaitRequest(Request_Dissip)
-  !c$OMP MASTER
-  !        call VTe(VThallo)
-  !        call resume_timer(timer_dissip)
-  !c$OMP END MASTER
-  !c$OMP BARRIER
-  !        call covcont_loc(llm,ucov,vcov,ucont,vcont)
-  !        call enercin_loc(vcov,ucov,vcont,ucont,ecin)
-  !
-  !        ijb=ij_begin
-  !        ije=ij_end
-  !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  !        do l=1,llm
-  !          do ij=ijb,ije
-  !            dtetaecdt(ij,l)= (ecin0(ij,l)-ecin(ij,l))/ pk(ij,l)
-  !            dtetadis(ij,l)=dtetadis(ij,l)+dtetaecdt(ij,l)
-  !          enddo
-  !        enddo
-  !c$OMP END DO NOWAIT
-  !   endif
-
-  !   ijb=ij_begin
-  !   ije=ij_end
-  !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  !     do l=1,llm
-  !       do ij=ijb,ije
-  !          teta(ij,l)=teta(ij,l)+dtetadis(ij,l)
-  !       enddo
-  !     enddo
-  !c$OMP END DO NOWAIT
-  !c------------------------------------------------------------------------
-
-
-  !c    .......        P. Le Van (  ajout  le 17/04/96  )   ...........
-  !c   ...      Calcul de la valeur moyenne, unique de h aux poles  .....
-  !c
-
-  !    ijb=ij_begin
-  !    ije=ij_end
-  !
-  !    if (pole_nord) then
-  !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  !      DO l  =  1, llm
-  !        DO ij =  1,iim
-  !         tppn(ij)  = aire(  ij    ) * teta(  ij    ,l)
-  !        ENDDO
-  !         tpn  = SSUM(iim,tppn,1)/apoln
-
-  !        DO ij = 1, iip1
-  !         teta(  ij    ,l) = tpn
-  !        ENDDO
-  !      ENDDO
-  !c$OMP END DO NOWAIT
-
-  !c$OMP MASTER
-  !      DO ij =  1,iim
-  !        tppn(ij)  = aire(  ij    ) * ps (  ij    )
-  !      ENDDO
-  !        tpn  = SSUM(iim,tppn,1)/apoln
-  !
-  !      DO ij = 1, iip1
-  !        ps(  ij    ) = tpn
-  !      ENDDO
-  !c$OMP END MASTER
-  !    endif
-  !
-  !    if (pole_sud) then
-  !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  !      DO l  =  1, llm
-  !        DO ij =  1,iim
-  !         tpps(ij)  = aire(ij+ip1jm) * teta(ij+ip1jm,l)
-  !        ENDDO
-  !         tps  = SSUM(iim,tpps,1)/apols
-
-  !        DO ij = 1, iip1
-  !         teta(ij+ip1jm,l) = tps
-  !        ENDDO
-  !      ENDDO
-  !c$OMP END DO NOWAIT
-
-  !c$OMP MASTER
-  !      DO ij =  1,iim
-  !        tpps(ij)  = aire(ij+ip1jm) * ps (ij+ip1jm)
-  !      ENDDO
-  !        tps  = SSUM(iim,tpps,1)/apols
-  !
-  !      DO ij = 1, iip1
-  !        ps(ij+ip1jm) = tps
-  !      ENDDO
-  !c$OMP END MASTER
-  !    endif
-
-
-  !c$OMP BARRIER
-  !c$OMP MASTER
-  !    call VTe(VTdissipation)
-
-  !    call stop_timer(timer_dissip)
-  !
-  !    call VTb(VThallo)
-  !c$OMP END MASTER
-  !    call Register_SwapField_u(ucov,ucov,distrib_caldyn,
-  ! *                            Request_dissip)
-
-  !    call Register_SwapField_v(vcov,vcov,distrib_caldyn,
-  ! *                            Request_dissip)
-
-  !    call Register_SwapField_u(teta,teta,distrib_caldyn,
-  ! *                            Request_dissip)
-
-  !    call Register_SwapField_u(p,p,distrib_caldyn,
-  ! *                            Request_dissip)
-
-  !    call Register_SwapField_u(pk,pk,distrib_caldyn,
-  ! *                            Request_dissip)
-
-  !    call SendRequest(Request_dissip)
-  !c$OMP BARRIER
-  !    call WaitRequest(Request_dissip)
-
-  !c$OMP BARRIER
-  !c$OMP MASTER
-  !    call set_distrib(distrib_caldyn)
-  !    call VTe(VThallo)
-  !    call resume_timer(timer_caldyn)
-  !c        print *,'fin dissipation'
-  !c$OMP END MASTER
-  !c$OMP BARRIER
-   END IF ! of IF(apdiss)
-
-  !c$OMP END PARALLEL
-
-  ! ajout debug
-           ! IF( lafin ) then
-           !   abort_message = 'Simulation finished'
-           !   call abort_gcm(modname,abort_message,0)
-           ! ENDIF
-
-   call check_isotopes(q,ijb_u,ije_u,'leapfrog 1430')
-
-  !   ********************************************************************
-  !   ********************************************************************
-  !   .... fin de l'integration dynamique  et physique pour le pas itau ..
-  !   ********************************************************************
-  !   ********************************************************************
-
-  !   preparation du pas d'integration suivant  ......
-  !ym      call WriteField('ucov',reshape(ucov,(/iip1,jmp1,llm/)))
-  !ym      call WriteField('vcov',reshape(vcov,(/iip1,jjm,llm/)))
-!$OMP MASTER
-  call stop_timer(timer_caldyn)
-!$OMP END MASTER
-  IF (itau==itaumax) then
-!$OMP MASTER
-     call allgather_timer_average
-     call barrier
-     if (mpi_rank==0) then
-
-        print *,'*********************************'
-        print *,'******    TIMER CALDYN     ******'
-        do i=0,mpi_size-1
-           print *,'proc',i,' :   Nb Bandes  :',jj_nb_caldyn(i), &
-                 '  : temps moyen :', &
-                 timer_average(jj_nb_caldyn(i),timer_caldyn,i)
-        enddo
-
-        print *,'*********************************'
-        print *,'******    TIMER VANLEER    ******'
-        do i=0,mpi_size-1
-           print *,'proc',i,' :   Nb Bandes  :',jj_nb_vanleer(i), &
-                 '  : temps moyen :', &
-                 timer_average(jj_nb_vanleer(i),timer_vanleer,i)
-        enddo
-
-        print *,'*********************************'
-        print *,'******    TIMER DISSIP    ******'
-        do i=0,mpi_size-1
-           print *,'proc',i,' :   Nb Bandes  :',jj_nb_dissip(i), &
-                 '  : temps moyen :', &
-                 timer_average(jj_nb_dissip(i),timer_dissip,i)
-        enddo
-
-        print *,'*********************************'
-        print *,'******    TIMER PHYSIC    ******'
-        do i=0,mpi_size-1
-           print *,'proc',i,' :   Nb Bandes  :',jj_nb_physic(i), &
-                 '  : temps moyen :', &
-                 timer_average(jj_nb_physic(i),timer_physic,i)
-        enddo
-
-     endif
-     CALL barrier
-     print *,'Taille du Buffer MPI (REAL*8)',MaxBufferSize
-  print *,'Taille du Buffer MPI utilise (REAL*8)',MaxBufferSize_Used
-   print *, 'Temps total ecoule sur la parallelisation :',DiffTime()
-  print *, 'Temps CPU ecoule sur la parallelisation :',DiffCpuTime()
-     CALL print_filtre_timer
-!$OMP END MASTER
-     CALL dynredem1_loc("restart.nc",0.0, &
-           vcov,ucov,teta,q,masse,ps)
-!$OMP MASTER
-     call fin_getparam
-!$OMP END MASTER
-
-     if (ok_guide) then
-       ! ! set ok_guide to false to avoid extra output
-       ! ! in following forward step
-       ok_guide=.false.
-     endif
-
-IF (CPPKEY_INCA) THEN
-     IF (ANY(type_trac == ['inca','inco'])) THEN
-        CALL finalize_inca
-  ! switching back to LMDZDYN context
-!$OMP MASTER
-        IF (ok_dyn_xios) THEN
-           CALL xios_set_current_context(dyn3d_ctx_handle)
-        ENDIF
-!$OMP END MASTER
-     ENDIF
-END IF
-IF (CPPKEY_REPROBUS) THEN
-     if (type_trac == 'repr') CALL finalize_reprobus
-END IF
-
-!$OMP MASTER
-     call finalize_parallel
-!$OMP END MASTER
-!$OMP BARRIER
-     RETURN
-  ENDIF
-
-  call check_isotopes(q,ijb_u,ije_u,'leapfrog 1509')
-
-  IF ( .NOT.purmats ) THEN
-    ! ........................................................
-    ! ..............  schema matsuno + leapfrog  ..............
-    ! ........................................................
-
-        IF(forward.OR. leapf) THEN
-          itau= itau + 1
-           ! iday= day_ini+itau/day_step
-           ! time= REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
-           !   IF(time.GT.1.) THEN
-           !     time = time-1.
-           !     iday = iday+1
-           !   ENDIF
-        ENDIF
-
-
-        IF( itau.EQ. itaufinp1 ) then
-
-          if (flag_verif) then
-            write(79,*) 'ucov',ucov
-            write(80,*) 'vcov',vcov
-            write(81,*) 'teta',teta
-            write(82,*) 'ps',ps
-            write(83,*) 'q',q
-            WRITE(85,*) 'q1 = ',q(:,:,1)
-            WRITE(86,*) 'q3 = ',q(:,:,3)
-          endif
-
-
-!$OMP MASTER
-          call fin_getparam
-!$OMP END MASTER
-
-IF (CPPKEY_INCA) THEN
-          IF (ANY(type_trac == ['inca','inco'])) THEN
-             CALL finalize_inca
-  ! switching back to LMDZDYN context
-!$OMP MASTER
-             IF (ok_dyn_xios) THEN
-                CALL xios_set_current_context(dyn3d_ctx_handle)
-             ENDIF
-!$OMP END MASTER
-          ENDIF
-END IF
-IF (CPPKEY_REPROBUS) THEN
-          if (type_trac == 'repr') CALL finalize_reprobus
-END IF
-
-!$OMP MASTER
-          call finalize_parallel
-!$OMP END MASTER
-          abort_message = 'Simulation finished'
-          call abort_gcm(modname,abort_message,0)
-          RETURN
-        ENDIF
-  !-----------------------------------------------------------------------
-  !   ecriture du fichier histoire moyenne:
-  !   -------------------------------------
-
-        IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
-!$OMP BARRIER
-           IF(itau.EQ.itaufin) THEN
-              iav=1
-           ELSE
-              iav=0
-           ENDIF
-
-          ! ! Ehouarn: re-compute geopotential for outputs
-!$OMP BARRIER
-!$OMP MASTER
-          CALL geopot_loc(ip1jmp1,teta,pk,pks,phis,phi)
-!$OMP END MASTER
-!$OMP BARRIER
-
-         IF (ok_dynzon) THEN
-
-          CALL bilan_dyn_loc(2,dtvr*iperiod,dtvr*day_step*periodav, &
-                ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,q)
-
-          ENDIF !ok_dynzon
-
-          IF (ok_dyn_ave) THEN
-             CALL writedynav_loc(itau,vcov, &
-                   ucov,teta,pk,phi,q,masse,ps,phis)
-          ENDIF
-
-
-
-        ENDIF
-
-        call check_isotopes(q,ijb_u,ije_u,'leapfrog 1584')
-
-  !-----------------------------------------------------------------------
-  !   ecriture de la bande histoire:
-  !   ------------------------------
-
-        IF( MOD(itau,iecri).EQ.0) THEN
-         ! ! Ehouarn: output only during LF or Backward Matsuno
-         if (leapf.or.(.not.leapf.and.(.not.forward))) then
-
-!$OMP BARRIER
-!$OMP MASTER
-          CALL geopot_loc(ip1jmp1,teta,pk,pks,phis,phi)
-!$OMP END MASTER
-!$OMP BARRIER
-
-         if (ok_dyn_ins) then
-             CALL writehist_loc(itau,vcov,ucov,teta,pk,phi,q, &
-                   masse,ps,phis)
-         endif
-
-
-          IF (ok_dyn_xios) THEN
-!$OMP MASTER
-             CALL xios_update_calendar(itau)
-!$OMP END MASTER
-!$OMP BARRIER
-             CALL writedyn_xios(vcov, &
-                   ucov,teta,pk,phi,q,masse,ps,phis)
-          ENDIF
-
-      endif                 ! of if (leapf.or.(.not.leapf.and.(.not.forward)))
-
-
-       ENDIF ! of IF(MOD(itau,iecri).EQ.0)
-
-        IF(itau.EQ.itaufin) THEN
-
-!$OMP BARRIER
-
-           ! if (planet_type.eq."earth") then
-  ! Write an Earth-format restart file
-            CALL dynredem1_loc("restart.nc",0.0, &
-                  vcov,ucov,teta,q,masse,ps)
-           ! endif ! of if (planet_type.eq."earth")
-            if (ok_guide) then
-              ! ! set ok_guide to false to avoid extra output
-              ! ! in following forward step
-              ok_guide=.false.
-            endif
-
-           ! CLOSE(99)
-        ENDIF ! of IF (itau.EQ.itaufin)
-
-        call check_isotopes(q,ijb_u,ije_u,'leapfrog 1624')
-
-  !-----------------------------------------------------------------------
-  !   gestion de l'integration temporelle:
-  !   ------------------------------------
-
-        IF( MOD(itau,iperiod).EQ.0 )    THEN
-                GO TO 1
-        ELSE IF ( MOD(itau-1,iperiod).EQ. 0 ) THEN
-
-               IF( forward )  THEN
-   ! fin du pas forward et debut du pas backward
-
-                  forward = .FALSE.
-                    leapf = .FALSE.
-                       GO TO 2
-
-               ELSE
-   ! fin du pas backward et debut du premier pas leapfrog
-
-                    leapf =  .TRUE.
-                    dt  =  2.*dtvr
-                    GO TO 2
-               END IF
-        ELSE
-
-   ! ......   pas leapfrog  .....
-
-             leapf = .TRUE.
-             dt  = 2.*dtvr
-             GO TO 2
-        END IF ! of IF (MOD(itau,iperiod).EQ.0)
-               ! !    ELSEIF (MOD(itau-1,iperiod).EQ.0)
-
-
-  ELSE ! of IF (.not.purmats)
-
-
-    call check_isotopes(q,ijb_u,ije_u,'leapfrog 1664')
-
-    ! ........................................................
-    ! ..............       schema  matsuno        ...............
-    ! ........................................................
-        IF( forward )  THEN
-
-         itau =  itau + 1
-          ! iday = day_ini+itau/day_step
-          ! time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
-  !
-  !              IF(time.GT.1.) THEN
-  !               time = time-1.
-  !               iday = iday+1
-  !              ENDIF
-
-           forward =  .FALSE.
-           IF( itau.EQ. itaufinp1 ) then
-!$OMP MASTER
-             call fin_getparam
-!$OMP END MASTER
-
-IF (CPPKEY_INCA) THEN
-             IF (ANY(type_trac == ['inca','inco'])) THEN
-                CALL finalize_inca
-  ! switching back to LMDZDYN context
-!$OMP MASTER
-                IF (ok_dyn_xios) THEN
-                   CALL xios_set_current_context(dyn3d_ctx_handle)
-                ENDIF
-!$OMP END MASTER
-             ENDIF
-
-END IF
-IF (CPPKEY_REPROBUS) THEN
-             if (type_trac == 'repr') CALL finalize_reprobus
-END IF
-
-!$OMP MASTER
-             call finalize_parallel
-!$OMP END MASTER
-             abort_message = 'Simulation finished'
-             call abort_gcm(modname,abort_message,0)
-             RETURN
-           ENDIF
-           GO TO 2
-
-        ELSE ! of IF(forward) i.e. backward step
-
-
-          call check_isotopes(q,ijb_u,ije_u,'leapfrog 1698')
-
-          IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
-           IF(itau.EQ.itaufin) THEN
-              iav=1
-           ELSE
-              iav=0
-           ENDIF
-
-          ! ! Ehouarn: re-compute geopotential for outputs
-!$OMP BARRIER
-!$OMP MASTER
-          CALL geopot_loc(ip1jmp1,teta,pk,pks,phis,phi)
-!$OMP END MASTER
-!$OMP BARRIER
-
-           IF (ok_dynzon) THEN
-           CALL bilan_dyn_loc(2,dtvr*iperiod,dtvr*day_step*periodav, &
-                 ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,q)
-           ENDIF
-
-           IF (ok_dyn_ave) THEN
-             CALL writedynav_loc(itau,vcov, &
-                   ucov,teta,pk,phi,q,masse,ps,phis)
-           ENDIF
-
-
-
-          ENDIF ! of IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin)
-
-
-           IF(MOD(itau,iecri         ).EQ.0) THEN
-
-!$OMP BARRIER
-!$OMP MASTER
-          CALL geopot_loc(ip1jmp1,teta,pk,pks,phis,phi)
-!$OMP END MASTER
-!$OMP BARRIER
-
-
-          if (ok_dyn_ins) then
-             CALL writehist_loc(itau,vcov,ucov,teta,pk,phi,q, &
-                   masse,ps,phis)
-          endif ! of if (ok_dyn_ins)
-
-
-          IF (ok_dyn_xios) THEN
-!$OMP MASTER
-             CALL xios_update_calendar(itau)
-!$OMP END MASTER
-!$OMP BARRIER
-             CALL writedyn_xios(vcov, &
-                   ucov,teta,pk,phi,q,masse,ps,phis)
-          ENDIF
-
-       ENDIF                ! of IF(MOD(itau,iecri).EQ.0)
-
-
-          IF(itau.EQ.itaufin) THEN
-             ! if (planet_type.eq."earth") then
-               CALL dynredem1_loc("restart.nc",0.0, &
-                     vcov,ucov,teta,q,masse,ps)
-            ! endif ! of if (planet_type.eq."earth")
-            if (ok_guide) then
-              ! ! set ok_guide to false to avoid extra output
-              ! ! in following forward step
-              ok_guide=.false.
-            endif
-
-          ENDIF ! of IF(itau.EQ.itaufin)
-
-          forward = .TRUE.
-          GO TO  1
-
-        ENDIF ! of IF (forward)
-
-
-        call check_isotopes(q,ijb_u,ije_u,'leapfrog 1750')
-
-  END IF ! of IF(.not.purmats)
-!$OMP MASTER
-  call fin_getparam
-!$OMP END MASTER
-
-IF (CPPKEY_INCA) THEN
-  IF (ANY(type_trac == ['inca','inco'])) THEN
-     CALL finalize_inca
-  ! switching back to LMDZDYN context
-!$OMP MASTER
-     IF (ok_dyn_xios) THEN
-        CALL xios_set_current_context(dyn3d_ctx_handle)
-     ENDIF
-!$OMP END MASTER
-  ENDIF
-
-END IF
-IF (CPPKEY_REPROBUS) THEN
-  if (type_trac == 'repr') CALL finalize_reprobus
-END IF
-
-!$OMP MASTER
-  call finalize_parallel
-!$OMP END MASTER
-  abort_message = 'Simulation finished'
-  call abort_gcm(modname,abort_message,0)
-  RETURN
-END SUBROUTINE leapfrog_loc
Index: LMDZ6/trunk/libf/dyn3dmem/leapfrog_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/leapfrog_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/leapfrog_loc.f90	(revision 5268)
@@ -0,0 +1,1875 @@
+SUBROUTINE leapfrog_loc(ucov0,vcov0,teta0,ps0, &
+        masse0,phis0,q0,time_0)
+
+   USE misc_mod
+   USE parallel_lmdz
+   USE times
+   USE mod_hallo
+   USE Bands
+   USE Write_Field
+   USE Write_Field_p
+   USE vampir
+   USE timer_filtre, ONLY : print_filtre_timer
+   USE infotrac
+   USE guide_loc_mod, ONLY : guide_main
+   USE getparam
+   USE control_mod
+   USE mod_filtreg_p
+   USE write_field_loc
+   USE allocate_field_mod
+   USE call_dissip_mod, ONLY : call_dissip
+   USE call_calfis_mod, ONLY : call_calfis
+   USE leapfrog_mod, ONLY : ucov,vcov,teta,ps,masse,phis,q,dq &
+         ,ucovm1,vcovm1,tetam1,massem1,psm1,p,pks,pk,pkf,flxw &
+         ,pbaru,pbarv,du,dv,dteta,phi,dp,w &
+         ,leapfrog_allocate,leapfrog_switch_caldyn,leapfrog_switch_dissip
+
+   use exner_hyb_loc_m, only: exner_hyb_loc
+   use exner_milieu_loc_m, only: exner_milieu_loc
+   USE comconst_mod, ONLY: cpp, dtvr, ihf
+   USE comvert_mod, ONLY: ap, bp, pressure_exner
+   USE logic_mod, ONLY: iflag_phys,ok_guide,forward,leapf,apphys, &
+         statcl,conser,apdiss,purmats,ok_strato
+   USE temps_mod, ONLY: itaufin,jD_ref,jH_ref,day_ini, &
+         day_ref,start_time,dt
+   USE mod_xios_dyn3dmem, ONLY : dyn3d_ctx_handle
+   USE lmdz_xios, ONLY: xios_update_calendar, &
+         xios_set_current_context, &
+         using_xios
+   USE lmdz_cppkeys_wrapper, ONLY: CPPKEY_INCA, CPPKEY_REPROBUS, CPPKEY_DEBUGIO
+   USE strings_mod, ONLY: int2str
+
+  IMPLICIT NONE
+
+   ! ......   Version  du 10/01/98    ..........
+
+   !        avec  coordonnees  verticales hybrides
+  !   avec nouveaux operat. dissipation * ( gradiv2,divgrad2,nxgraro2 )
+
+  !=======================================================================
+  !
+  !   Auteur:  P. Le Van /L. Fairhead/F.Hourdin
+  !   -------
+  !
+  !   Objet:
+  !   ------
+  !
+  !   GCM LMD nouvelle grille
+  !
+  !=======================================================================
+  !
+  !  ... Dans inigeom , nouveaux calculs pour les elongations  cu , cv
+  !  et possibilite d'appeler une fonction f(y)  a derivee tangente
+  !  hyperbolique a la  place de la fonction a derivee sinusoidale.
+
+  !  ... Possibilite de choisir le shema pour l'advection de
+  !    q  , en modifiant iadv dans traceur.def  (10/02) .
+  !
+  !  Pour Van-Leer + Vapeur d'eau saturee, iadv(1)=4. (F.Codron,10/99)
+  !  Pour Van-Leer iadv=10
+  !
+  !-----------------------------------------------------------------------
+  !   Declarations:
+  !   -------------
+
+  include "dimensions.h"
+  include "paramet.h"
+  include "comdissnew.h"
+  include "comgeom.h"
+  include "description.h"
+  include "iniprint.h"
+  include "academic.h"
+
+  REAL,INTENT(IN) :: time_0 ! not used
+
+  !   dynamical variables:
+  REAL,INTENT(IN) :: ucov0(ijb_u:ije_u,llm)    ! zonal covariant wind
+  REAL,INTENT(IN) :: vcov0(ijb_v:ije_v,llm)    ! meridional covariant wind
+  REAL,INTENT(IN) :: teta0(ijb_u:ije_u,llm)    ! potential temperature
+  REAL,INTENT(IN) :: q0(ijb_u:ije_u,llm,nqtot) ! advected tracers
+  REAL,INTENT(IN) :: ps0(ijb_u:ije_u)          ! surface pressure (Pa)
+  REAL,INTENT(IN) :: masse0(ijb_u:ije_u,llm)   ! air mass
+  REAL,INTENT(IN) :: phis0(ijb_u:ije_u)        ! geopotentiat at the surface
+
+  real :: zqmin,zqmax
+
+   ! REAL,SAVE,ALLOCATABLE :: p (:,:  )               ! pression aux interfac.des couches
+   ! REAL,SAVE,ALLOCATABLE :: pks(:)                      ! exner au  sol
+   ! REAL,SAVE,ALLOCATABLE :: pk(:,:)                   ! exner au milieu des couches
+   ! REAL,SAVE,ALLOCATABLE :: pkf(:,:)                  ! exner filt.au milieu des couches
+   ! REAL,SAVE,ALLOCATABLE :: phi(:,:)                  ! geopotentiel
+   ! REAL,SAVE,ALLOCATABLE :: w(:,:)                    ! vitesse verticale
+
+  ! variables dynamiques intermediaire pour le transport
+   ! REAL,SAVE,ALLOCATABLE :: pbaru(:,:),pbarv(:,:) !flux de masse
+
+  !   variables dynamiques au pas -1
+   ! REAL,SAVE,ALLOCATABLE :: vcovm1(:,:),ucovm1(:,:)
+  !      REAL,SAVE,ALLOCATABLE :: tetam1(:,:),psm1(:)
+   ! REAL,SAVE,ALLOCATABLE :: massem1(:,:)
+
+  !   tendances dynamiques
+   ! REAL,SAVE,ALLOCATABLE :: dv(:,:),du(:,:)
+   ! REAL,SAVE,ALLOCATABLE :: dteta(:,:),dp(:)
+   ! REAL,DIMENSION(:,:,:), ALLOCATABLE, SAVE :: dq
+
+  !   tendances de la dissipation
+   ! REAL,SAVE,ALLOCATABLE :: dvdis(:,:),dudis(:,:)
+   ! REAL,SAVE,ALLOCATABLE :: dtetadis(:,:)
+
+  !   tendances physiques
+  REAL,SAVE,ALLOCATABLE :: dvfi(:,:),dufi(:,:)
+  REAL,SAVE,ALLOCATABLE :: dtetafi(:,:)
+  REAL,SAVE,ALLOCATABLE :: dpfi(:)
+  REAL,DIMENSION(:,:,:),ALLOCATABLE,SAVE :: dqfi
+
+  !   variables pour le fichier histoire
+  REAL :: dtav      ! intervalle de temps elementaire
+
+  REAL :: tppn(iim),tpps(iim),tpn,tps
+  !
+  INTEGER :: itau,itaufinp1,iav
+   ! INTEGER  iday ! jour julien
+  REAL :: time
+
+  REAL :: SSUM
+   ! REAL,SAVE,ALLOCATABLE :: finvmaold(:,:)
+
+  !ym      LOGICAL  lafin
+  LOGICAL :: lafin
+  INTEGER :: ij,iq,l
+  INTEGER :: ik
+
+  real :: time_step, t_wrt, t_ops
+
+  ! jD_cur: jour julien courant
+  ! jH_cur: heure julienne courante
+  REAL :: jD_cur, jH_cur
+  INTEGER :: an, mois, jour
+  REAL :: secondes
+
+  logical :: physic
+  LOGICAL :: first,callinigrads
+
+  data callinigrads/.true./
+  character(len=10) :: string10
+
+   ! REAL,SAVE,ALLOCATABLE :: flxw(:,:) ! flux de masse verticale
+
+  !+jld variables test conservation energie
+   ! REAL,SAVE,ALLOCATABLE :: ecin(:,:),ecin0(:,:)
+  ! Tendance de la temp. potentiel d (theta)/ d t due a la
+  ! tansformation d'energie cinetique en energie thermique
+  ! cree par la dissipation
+  !  REAL,SAVE,ALLOCATABLE :: dtetaecdt(:,:)
+  !  REAL,SAVE,ALLOCATABLE :: vcont(:,:),ucont(:,:)
+  !  REAL,SAVE,ALLOCATABLE :: vnat(:,:),unat(:,:)
+  REAL :: d_h_vcol, d_qt, d_qw, d_ql, d_ec
+  CHARACTER(len=15) :: ztit
+  !!      INTEGER   ip_ebil_dyn  ! PRINT level for energy conserv. diag.
+   ! SAVE      ip_ebil_dyn
+   ! DATA      ip_ebil_dyn/0/
+  !-jld
+
+  character(len=80) :: dynhist_file, dynhistave_file
+  character(len=*),parameter :: modname="leapfrog_loc"
+  character(len=80) :: abort_message
+
+
+  logical,PARAMETER :: dissip_conservative=.TRUE.
+
+  INTEGER :: testita
+  PARAMETER (testita = 9)
+
+  logical , parameter :: flag_verif = .false.
+
+  ! declaration liees au parallelisme
+  INTEGER :: ierr
+  LOGICAL :: FirstCaldyn
+  LOGICAL :: FirstPhysic
+  INTEGER :: ijb,ije,j,i
+  type(Request) :: TestRequest
+  type(Request) :: Request_Dissip
+  type(Request) :: Request_physic
+
+  INTEGER :: true_itau
+  INTEGER :: iapptrac
+  INTEGER :: AdjustCount
+   ! INTEGER :: var_time
+  LOGICAL :: ok_start_timer=.FALSE.
+  LOGICAL, SAVE :: firstcall=.TRUE.
+  TYPE(distrib),SAVE :: new_dist
+
+  call check_isotopes(q0,ijb_u,ije_u,'leapfrog204: debut')
+
+!$OMP MASTER
+  ItCount=0
+!$OMP END MASTER
+  true_itau=0
+  FirstCaldyn=.TRUE.
+  FirstPhysic=.TRUE.
+  iapptrac=0
+  AdjustCount = 0
+  lafin=.false.
+
+  if (nday>=0) then
+     itaufin   = nday*day_step
+  else
+     itaufin   = -nday
+  endif
+
+  itaufinp1 = itaufin +1
+
+  call check_isotopes(q0,ijb_u,ije_u,'leapfrog 226')
+
+  itau = 0
+  physic=.true.
+  if (iflag_phys==0.or.iflag_phys==2) physic=.false.
+  CALL init_nan
+  CALL leapfrog_allocate
+  ucov=ucov0
+  vcov=vcov0
+  teta=teta0
+  ps=ps0
+  masse=masse0
+  phis=phis0
+  q=q0
+
+  call check_isotopes(q,ijb_u,ije_u,'leapfrog 239')
+
+   ! iday = day_ini+itau/day_step
+   ! time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
+   !    IF(time.GT.1.) THEN
+   !     time = time-1.
+   !     iday = iday+1
+   !    ENDIF
+
+  ! Allocate variables depending on dynamic variable nqtot
+!$OMP MASTER
+  if (firstcall) then
+  !
+  !  ALLOCATE(p(ijb_u:ije_u,llmp1))
+  !      ALLOCATE(pks(ijb_u:ije_u))
+  !  ALLOCATE(pk(ijb_u:ije_u,llm))
+  !  ALLOCATE(pkf(ijb_u:ije_u,llm))
+  !  ALLOCATE(phi(ijb_u:ije_u,llm))
+  !  ALLOCATE(w(ijb_u:ije_u,llm))
+  !  ALLOCATE(pbaru(ip1jmp1,llm),pbarv(ip1jm,llm))
+  !  ALLOCATE(vcovm1(ijb_v:ije_v,llm),ucovm1(ijb_u:ije_u,llm))
+  !  ALLOCATE(tetam1(ijb_u:ije_u,llm),psm1(ijb_u:ije_u))
+  !  ALLOCATE(massem1(ijb_u:ije_u,llm))
+  !  ALLOCATE(dv(ijb_v:ije_v,llm),du(ijb_u:ije_u,llm))
+  !  ALLOCATE(dteta(ijb_u:ije_u,llm),dp(ijb_u:ije_u))
+  !  ALLOCATE(dvdis(ijb_v:ije_v,llm),dudis(ijb_u:ije_u,llm))
+  !  ALLOCATE(dtetadis(ijb_u:ije_u,llm))
+  ALLOCATE(dvfi(ijb_v:ije_v,llm),dufi(ijb_u:ije_u,llm))
+  ALLOCATE(dtetafi(ijb_u:ije_u,llm))
+  ALLOCATE(dpfi(ijb_u:ije_u))
+   ! ALLOCATE(dq(ijb_u:ije_u,llm,nqtot))
+  ALLOCATE(dqfi(ijb_u:ije_u,llm,nqtot))
+   ! ALLOCATE(dqfi_tmp(iip1,llm,nqtot))
+   ! ALLOCATE(finvmaold(ijb_u:ije_u,llm))
+   ! ALLOCATE(flxw(ijb_u:ije_u,llm))
+   ! ALLOCATE(ecin(ijb_u:ije_u,llm),ecin0(ijb_u:ije_u,llm))
+   ! ALLOCATE(dtetaecdt(ijb_u:ije_u,llm))
+   ! ALLOCATE(vcont(ijb_v:ije_v,llm),ucont(ijb_u:ije_u,llm))
+   ! ALLOCATE(vnat(ijb_v:ije_v,llm),unat(ijb_u:ije_u,llm))
+  endif
+!$OMP END MASTER
+!$OMP BARRIER
+
+             ! CALL dynredem1_loc("restart.nc",0.0,
+  ! &                           vcov,ucov,teta,q,masse,ps)
+
+
+  !-----------------------------------------------------------------------
+  !   On initialise la pression et la fonction d'Exner :
+  !   --------------------------------------------------
+
+!$OMP MASTER
+  dq(:,:,:)=0.
+  CALL pression ( ijnb_u, ap, bp, ps, p       )
+!$OMP END MASTER
+  if (pressure_exner) then
+  CALL exner_hyb_loc( ijnb_u, ps, p, pks, pk, pkf)
+  else
+    CALL exner_milieu_loc( ijnb_u, ps, p, pks, pk, pkf )
+  endif
+  !-----------------------------------------------------------------------
+  !   Debut de l'integration temporelle:
+  !   ----------------------------------
+  ! et du parallelisme !!
+
+   1   CONTINUE ! Matsuno Forward step begins here
+
+  !   date: (NB: date remains unchanged for Backward step)
+  !   -----
+
+  jD_cur = jD_ref + day_ini - day_ref +                             &
+        (itau+1)/day_step
+  jH_cur = jH_ref + start_time +                                    &
+        mod(itau+1,day_step)/float(day_step)
+  if (jH_cur > 1.0 ) then
+    jD_cur = jD_cur +1.
+    jH_cur = jH_cur -1.
+  endif
+
+  call check_isotopes(q,ijb_u,ije_u,'leapfrog 321')
+
+  if (ok_guide) then
+    call guide_main(itau,ucov,vcov,teta,q,masse,ps)
+!$OMP BARRIER
+  endif
+
+
+
+  !
+  ! IF( MOD( itau, 10* day_step ).EQ.0 )  THEN
+  !   CALL  test_period ( ucov,vcov,teta,q,p,phis )
+  !   PRINT *,' ----   Test_period apres continue   OK ! -----', itau
+  ! ENDIF
+  !
+  !ym      CALL SCOPY( ijmllm ,vcov , 1, vcovm1 , 1 )
+  !ym      CALL SCOPY( ijp1llm,ucov , 1, ucovm1 , 1 )
+  !ym      CALL SCOPY( ijp1llm,teta , 1, tetam1 , 1 )
+  !ym      CALL SCOPY( ijp1llm,masse, 1, massem1, 1 )
+  !ym      CALL SCOPY( ip1jmp1, ps  , 1,   psm1 , 1 )
+
+   if (FirstCaldyn) then
+!$OMP MASTER
+     ucovm1=ucov
+     vcovm1=vcov
+     tetam1= teta
+     massem1= masse
+     psm1= ps
+
+  ! Ehouarn: finvmaold is actually not used
+      ! finvmaold = masse
+!$OMP END MASTER
+!$OMP BARRIER
+      ! CALL filtreg_p ( finvmaold ,jjb_u,jje_u,jjb_u,jje_u,jjp1, llm,
+  ! &                    -2,2, .TRUE., 1 )
+   else
+  ! Save fields obtained at previous time step as '...m1'
+     ijb=ij_begin
+     ije=ij_end
+
+!$OMP MASTER
+     psm1     (ijb:ije) = ps    (ijb:ije)
+!$OMP END MASTER
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+     DO l=1,llm
+       ije=ij_end
+       ucovm1   (ijb:ije,l) = ucov  (ijb:ije,l)
+       tetam1   (ijb:ije,l) = teta  (ijb:ije,l)
+       massem1  (ijb:ije,l) = masse (ijb:ije,l)
+        ! finvmaold(ijb:ije,l)=masse(ijb:ije,l)
+
+       if (pole_sud) ije=ij_end-iip1
+       vcovm1(ijb:ije,l) = vcov  (ijb:ije,l)
+
+
+     ENDDO
+!$OMP ENDDO
+
+
+  ! Ehouarn: finvmaold not used
+       ! CALL filtreg_p(finvmaold ,jjb_u,jje_u,jj_begin,jj_end,jjp1,
+  ! .                    llm, -2,2, .TRUE., 1 )
+
+   endif ! of if (FirstCaldyn)
+
+  forward = .TRUE.
+  leapf   = .FALSE.
+  dt      =  dtvr
+
+  !   ...    P.Le Van .26/04/94  ....
+
+  !ym      CALL SCOPY   ( ijp1llm,   masse, 1, finvmaold,     1 )
+  !ym      CALL filtreg ( finvmaold ,jjp1, llm, -2,2, .TRUE., 1 )
+
+  !ym  ne sert a rien
+  !ym      call minmax(ijp1llm,q(:,:,3),zqmin,zqmax)
+
+
+     call check_isotopes(q,ijb_u,ije_u,'leapfrog 400')
+
+   2   CONTINUE ! Matsuno backward or leapfrog step begins here
+
+
+  call check_isotopes(q,ijb_u,ije_u,'leapfrog 402')
+
+!$OMP MASTER
+  ItCount=ItCount+1
+  if (MOD(ItCount,1)==1) then
+    debug=.true.
+  else
+    debug=.false.
+  endif
+!$OMP END MASTER
+  !-----------------------------------------------------------------------
+
+  !   date: (NB: only leapfrog step requires recomputing date)
+  !   -----
+
+  IF (leapf) THEN
+    jD_cur = jD_ref + day_ini - day_ref + &
+          (itau+1)/day_step
+    jH_cur = jH_ref + start_time + &
+          mod(itau+1,day_step)/float(day_step)
+    if (jH_cur > 1.0 ) then
+      jD_cur = jD_cur +1.
+      jH_cur = jH_cur -1.
+    endif
+  ENDIF
+
+  !   gestion des appels de la physique et des dissipations:
+  !   ------------------------------------------------------
+  !
+  !   ...    P.Le Van  ( 6/02/95 )  ....
+
+  apphys = .FALSE.
+  statcl = .FALSE.
+  conser = .FALSE.
+  apdiss = .FALSE.
+
+  IF( purmats ) THEN
+  ! ! Purely Matsuno time stepping
+     IF( MOD(itau,iconser) .EQ.0.AND.  forward    ) conser = .TRUE.
+     IF( MOD(itau,dissip_period ).EQ.0.AND..NOT.forward ) &
+           apdiss = .TRUE.
+     IF( MOD(itau,iphysiq ).EQ.0.AND..NOT.forward &
+           .and. physic                        ) apphys = .TRUE.
+  ELSE
+  ! ! Leapfrog/Matsuno time stepping
+     IF( MOD(itau   ,iconser) .EQ. 0              ) conser = .TRUE.
+     IF( MOD(itau+1,dissip_period).EQ.0 .AND. .NOT. forward ) &
+           apdiss = .TRUE.
+     IF( MOD(itau+1,iphysiq).EQ.0.AND.physic) apphys=.TRUE.
+  END IF
+
+  ! Ehouarn: for Shallow Water case (ie: 1 vertical layer),
+       ! supress dissipation step
+  if (llm.eq.1) then
+    apdiss=.false.
+  endif
+
+  !ym    ---> Pour le moment
+  !ym      apphys = .FALSE.
+  statcl = .FALSE.
+  ! conser = .FALSE. ! ie: no output of control variables to stdout in //
+
+  if (firstCaldyn) then
+!$OMP MASTER
+      call Set_Distrib(distrib_caldyn)
+!$OMP END MASTER
+!$OMP BARRIER
+      firstCaldyn=.FALSE.
+  !ym          call InitTime
+!$OMP MASTER
+      call Init_timer
+!$OMP END MASTER
+  endif
+
+!$OMP MASTER
+  IF (ok_start_timer) THEN
+    CALL InitTime
+    ok_start_timer=.FALSE.
+  ENDIF
+!$OMP END MASTER
+
+
+  call check_isotopes(q,ijb_u,ije_u,'leapfrog 471')
+
+  !ym  PAS D'AJUSTEMENT POUR LE MOMENT
+  if (Adjust) then
+    AdjustCount=AdjustCount+1
+     ! if (iapptrac==iapp_tracvl .and. (forward.OR. leapf)
+  ! &         .and. itau/iphysiq>2 .and. Adjustcount>30) then
+    if (Adjustcount>1) then
+       AdjustCount=0
+!$OMP MASTER
+       call allgather_timer_average
+
+    if (prt_level > 9) then
+
+    print *,'*********************************'
+    print *,'******    TIMER CALDYN     ******'
+    do i=0,mpi_size-1
+      print *,'proc',i,' :   Nb Bandes  :',jj_nb_caldyn(i), &
+            '  : temps moyen :', &
+            timer_average(jj_nb_caldyn(i),timer_caldyn,i), &
+            '+-',timer_delta(jj_nb_caldyn(i),timer_caldyn,i)
+    enddo
+
+    print *,'*********************************'
+    print *,'******    TIMER VANLEER    ******'
+    do i=0,mpi_size-1
+      print *,'proc',i,' :   Nb Bandes  :',jj_nb_vanleer(i), &
+            '  : temps moyen :', &
+            timer_average(jj_nb_vanleer(i),timer_vanleer,i), &
+            '+-',timer_delta(jj_nb_vanleer(i),timer_vanleer,i)
+    enddo
+
+    print *,'*********************************'
+    print *,'******    TIMER DISSIP    ******'
+    do i=0,mpi_size-1
+      print *,'proc',i,' :   Nb Bandes  :',jj_nb_dissip(i), &
+            '  : temps moyen :', &
+            timer_average(jj_nb_dissip(i),timer_dissip,i), &
+            '+-',timer_delta(jj_nb_dissip(i),timer_dissip,i)
+    enddo
+
+     ! if (mpi_rank==0) call WriteBands
+
+   endif
+
+     call AdjustBands_caldyn(new_dist)
+!$OMP END MASTER
+!$OMP BARRIER
+     CALL leapfrog_switch_caldyn(new_dist)
+!$OMP BARRIER
+
+
+!$OMP MASTER
+     distrib_caldyn=new_dist
+     CALL set_distrib(distrib_caldyn)
+!$OMP END MASTER
+!$OMP BARRIER
+      ! call Register_SwapFieldHallo(ucov,ucov,ip1jmp1,llm,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(ucovm1,ucovm1,ip1jmp1,llm,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(vcov,vcov,ip1jm,llm,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(vcovm1,vcovm1,ip1jm,llm,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(teta,teta,ip1jmp1,llm,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(tetam1,tetam1,ip1jmp1,llm,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(masse,masse,ip1jmp1,llm,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(massem1,massem1,ip1jmp1,llm,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(ps,ps,ip1jmp1,1,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(psm1,psm1,ip1jmp1,1,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(pkf,pkf,ip1jmp1,llm,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(pk,pk,ip1jmp1,llm,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(pks,pks,ip1jmp1,1,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(phis,phis,ip1jmp1,1,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(phi,phi,ip1jmp1,llm,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !     call Register_SwapFieldHallo(finvmaold,finvmaold,ip1jmp1,llm,
+  ! &                                jj_Nb_caldyn,0,0,TestRequest)
+  !
+  !    do j=1,nqtot
+  !     call Register_SwapFieldHallo(q(:,:,j),q(:,:,j),ip1jmp1,llm,
+  ! &                                jj_nb_caldyn,0,0,TestRequest)
+  !    enddo
+  !
+  !     call Set_Distrib(distrib_caldyn)
+  !     call SendRequest(TestRequest)
+  !     call WaitRequest(TestRequest)
+
+!$OMP MASTER
+    call AdjustBands_dissip(new_dist)
+!$OMP END MASTER
+!$OMP BARRIER
+    CALL leapfrog_switch_dissip(new_dist)
+!$OMP BARRIER
+!$OMP MASTER
+    distrib_dissip=new_dist
+!$OMP END MASTER
+!$OMP BARRIER
+     ! call AdjustBands_physic
+
+!$OMP MASTER
+    if (mpi_rank==0) call WriteBands
+!$OMP END MASTER
+
+
+  endif
+  endif
+
+
+  call check_isotopes(q,ijb_u,ije_u,'leapfrog 589')
+
+  !-----------------------------------------------------------------------
+  !   calcul des tendances dynamiques:
+  !   --------------------------------
+!$OMP BARRIER
+!$OMP MASTER
+   call VTb(VThallo)
+!$OMP END MASTER
+
+   call Register_Hallo_u(ucov,llm,1,1,1,1,TestRequest)
+   call Register_Hallo_v(vcov,llm,1,1,1,1,TestRequest)
+   call Register_Hallo_u(teta,llm,1,1,1,1,TestRequest)
+   call Register_Hallo_u(ps,1,1,2,2,1,TestRequest)
+   call Register_Hallo_u(pkf,llm,1,1,1,1,TestRequest)
+   call Register_Hallo_u(pk,llm,1,1,1,1,TestRequest)
+   call Register_Hallo_u(pks,1,1,1,1,1,TestRequest)
+   call Register_Hallo_u(p,llmp1,1,1,1,1,TestRequest)
+
+    ! do j=1,nqtot
+    !   call Register_Hallo(q(1,1,j),ip1jmp1,llm,1,1,1,1,
+  ! *                       TestRequest)
+  !    enddo
+
+   call SendRequest(TestRequest)
+!$OMP BARRIER
+   call WaitRequest(TestRequest)
+
+!$OMP MASTER
+   call VTe(VThallo)
+!$OMP END MASTER
+!$OMP BARRIER
+
+  if (debug) then
+    call WriteField_u('ucov',ucov)
+    call WriteField_v('vcov',vcov)
+    call WriteField_u('teta',teta)
+    call WriteField_u('ps',ps)
+    call WriteField_u('masse',masse)
+    call WriteField_u('pk',pk)
+    call WriteField_u('pks',pks)
+    call WriteField_u('pkf',pkf)
+    call WriteField_u('phis',phis)
+    do iq=1,nqtot
+      call WriteField_u('q'//trim(int2str(iq)), &
+            q(:,:,iq))
+    enddo
+  endif
+
+
+  True_itau=True_itau+1
+
+!$OMP MASTER
+  IF (prt_level>9) THEN
+    WRITE(lunout,*)"leapfrog_p: Iteration No",True_itau
+  ENDIF
+
+
+  call start_timer(timer_caldyn)
+
+  ! ! compute geopotential phi()
+  CALL geopot_loc  ( ip1jmp1, teta  , pk , pks,  phis  , phi   )
+
+  call check_isotopes(q,ijb_u,ije_u,'leapfrog 651')
+
+  call VTb(VTcaldyn)
+!$OMP END MASTER
+   ! var_time=time+iday-day_ini
+
+!$OMP BARRIER
+   ! CALL FTRACE_REGION_BEGIN("caldyn")
+  time = jD_cur + jH_cur
+
+  CALL caldyn_loc &
+        ( itau,ucov,vcov,teta,ps,masse,pk,pkf,phis , &
+        phi,conser,du,dv,dteta,dp,w, pbaru,pbarv, time )
+
+   ! CALL FTRACE_REGION_END("caldyn")
+
+!$OMP MASTER
+  if (mpi_rank==0.AND.conser) THEN
+     WRITE(lunout,*) 'leapfrog_loc, Time step: ',itau,' Day:',time
+  ENDIF
+  call VTe(VTcaldyn)
+!$OMP END MASTER
+
+IF (CPPKEY_DEBUGIO) THEN
+  call WriteField_u('du',du)
+  call WriteField_v('dv',dv)
+  call WriteField_u('dteta',dteta)
+  call WriteField_u('dp',dp)
+  call WriteField_u('w',w)
+  call WriteField_u('pbaru',pbaru)
+  call WriteField_v('pbarv',pbarv)
+  call WriteField_u('p',p)
+  call WriteField_u('masse',masse)
+  call WriteField_u('pk',pk)
+END IF
+  !-----------------------------------------------------------------------
+  !   calcul des tendances advection des traceurs (dont l'humidite)
+  !   -------------------------------------------------------------
+
+  call check_isotopes(q,ijb_u,ije_u, &
+        'leapfrog 686: avant caladvtrac')
+
+  IF( forward.OR. leapf )  THEN
+  ! Ehouarn: NB: fields sent to advtrac are those at the beginning of the time step
+    ! !write(*,*) 'leapfrog 679: avant CALL caladvtrac_loc'
+     CALL caladvtrac_loc(q,pbaru,pbarv, &
+           p, masse, dq,  teta, &
+           flxw,pk, iapptrac)
+
+  ! call creation of mass flux
+     IF (offline .AND. .NOT. adjust) THEN
+        CALL fluxstokenc_p(pbaru,pbarv,masse,teta,phi)
+     ENDIF
+
+     ! !write(*,*) 'leapfrog 719'
+     call check_isotopes(q,ijb_u,ije_u, &
+           'leapfrog 698: apres caladvtrac')
+
+   ! do j=1,nqtot
+   !   call WriteField_u('qadv'//trim(int2str(j)),q(:,:,j))
+   ! enddo
+
+  ! Ehouarn: Storage of mass flux for off-line tracers... not implemented...
+
+  ENDIF ! of IF( forward.OR. leapf )
+
+
+  !-----------------------------------------------------------------------
+  !   integrations dynamique et traceurs:
+  !   ----------------------------------
+
+!$OMP MASTER
+   call VTb(VTintegre)
+!$OMP END MASTER
+IF (CPPKEY_DEBUGIO) THEN
+  if (true_itau>20) then
+  call WriteField_u('ucovm1',ucovm1)
+  call WriteField_v('vcovm1',vcovm1)
+  call WriteField_u('tetam1',tetam1)
+  call WriteField_u('psm1',psm1)
+  call WriteField_u('ucov_int',ucov)
+  call WriteField_v('vcov_int',vcov)
+  call WriteField_u('teta_int',teta)
+  call WriteField_u('ps_int',ps)
+  endif
+END IF
+!$OMP BARRIER
+    ! CALL FTRACE_REGION_BEGIN("integrd")
+
+   ! !write(*,*) 'leapfrog 720'
+   call check_isotopes(q,ijb_u,ije_u,'leapfrog 756')
+
+   ! ! CRisi: pourquoi aller jusqu'à 2 et non pas jusqu'à nqtot??
+   CALL integrd_loc ( nqtot,vcovm1,ucovm1,tetam1,psm1,massem1 , &
+         dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps,masse,phis)
+  ! $              finvmaold                                    )
+
+  !  !write(*,*) 'leapfrog 724'
+   call check_isotopes(q,ijb_u,ije_u,'leapfrog 762')
+
+    ! CALL FTRACE_REGION_END("integrd")
+!$OMP BARRIER
+IF (CPPKEY_DEBUGIO) THEN
+  call WriteField_u('ucovm1',ucovm1)
+  call WriteField_v('vcovm1',vcovm1)
+  call WriteField_u('tetam1',tetam1)
+  call WriteField_u('psm1',psm1)
+  call WriteField_u('ucov_int',ucov)
+  call WriteField_v('vcov_int',vcov)
+  call WriteField_u('teta_int',teta)
+  call WriteField_u('ps_int',ps)
+END IF
+
+  call check_isotopes(q,ijb_u,ije_u,'leapfrog 775')
+
+   ! do j=1,nqtot
+   !   call WriteField_p('q'//trim(int2str(j)),
+  ! .                reshape(q(:,:,j),(/iip1,jmp1,llm/)))
+  !    call WriteField_p('dq'//trim(int2str(j)),
+  ! .                reshape(dq(:,:,j),(/iip1,jmp1,llm/)))
+  !  enddo
+
+
+!$OMP MASTER
+   call VTe(VTintegre)
+!$OMP END MASTER
+  ! .P.Le Van (26/04/94  ajout de  finvpold dans l'appel d'integrd)
+  !
+  !-----------------------------------------------------------------------
+  !   calcul des tendances physiques:
+  !   -------------------------------
+  !    ########   P.Le Van ( Modif le  6/02/95 )   ###########
+  !
+   IF( purmats )  THEN
+      IF( itau.EQ.itaufin.AND..NOT.forward ) lafin = .TRUE.
+   ELSE
+      IF( itau+1.EQ. itaufin )              lafin = .TRUE.
+   ENDIF
+
+  !c$OMP END PARALLEL
+
+  !
+  !
+   IF( apphys )  THEN
+
+     CALL call_calfis(itau,lafin,ucov,vcov,teta,masse,ps, &
+           phis,q,flxw)
+  ! #ifdef DEBUG_IO
+      ! call WriteField_u('ucovfi',ucov)
+      ! call WriteField_v('vcovfi',vcov)
+      ! call WriteField_u('tetafi',teta)
+      ! call WriteField_u('pfi',p)
+      ! call WriteField_u('pkfi',pk)
+      ! do j=1,nqtot
+      !   call WriteField_u('qfi'//trim(int2str(j)),q(:,:,j))
+      ! enddo
+  ! #endif
+  ! c
+  ! c     .......   Ajout   P.Le Van ( 17/04/96 )   ...........
+  ! c
+  ! cc$OMP PARALLEL DEFAULT(SHARED)
+  ! cc$OMP+         PRIVATE(rdaym_ini,rdayvrai,ijb,ije)
+
+  ! c$OMP MASTER
+      !  call suspend_timer(timer_caldyn)
+
+      !  write(lunout,*)
+   ! &   'leapfrog_p: Entree dans la physique : Iteration No ',true_itau
+  ! c$OMP END MASTER
+
+   !     CALL pression_loc (  ip1jmp1, ap, bp, ps,  p      )
+
+  ! c$OMP BARRIER
+   !     CALL exner_hyb_loc(  ip1jmp1, ps, p,pks, pk, pkf )
+  ! c$OMP BARRIER
+   !       jD_cur = jD_ref + day_ini - day_ref
+   ! $        + int (itau * dtvr / daysec)
+   !       jH_cur = jH_ref +                                            &
+   ! &              (itau * dtvr / daysec - int(itau * dtvr / daysec))
+  ! !         call ju2ymds(jD_cur+jH_cur, an, mois, jour, secondes)
+
+  ! c rajout debug
+  ! c       lafin = .true.
+
+
+  ! c   Inbterface avec les routines de phylmd (phymars ... )
+  ! c   -----------------------------------------------------
+
+  ! c+jld
+
+  ! c  Diagnostique de conservation de l'energie : initialisation
+  !
+  ! c-jld
+  ! c$OMP BARRIER
+  ! c$OMP MASTER
+  !     call VTb(VThallo)
+  ! c$OMP END MASTER
+
+  ! #ifdef DEBUG_IO
+  !     call WriteField_u('ucovfi',ucov)
+  !     call WriteField_v('vcovfi',vcov)
+  !     call WriteField_u('tetafi',teta)
+  !     call WriteField_u('pfi',p)
+  !     call WriteField_u('pkfi',pk)
+  ! #endif
+  !     call SetTag(Request_physic,800)
+  !
+  !     call Register_SwapField_u(ucov,ucov,distrib_physic,
+  !  *                            Request_physic,up=2,down=2)
+  !
+  !     call Register_SwapField_v(vcov,vcov,distrib_physic,
+  !  *                            Request_physic,up=2,down=2)
+
+  !     call Register_SwapField_u(teta,teta,distrib_physic,
+  !  *                            Request_physic,up=2,down=2)
+  !
+  !     call Register_SwapField_u(masse,masse,distrib_physic,
+  !  *                            Request_physic,up=1,down=2)
+
+  !     call Register_SwapField_u(p,p,distrib_physic,
+  !  *                            Request_physic,up=2,down=2)
+  !
+  !     call Register_SwapField_u(pk,pk,distrib_physic,
+  !  *                            Request_physic,up=2,down=2)
+  !
+  !     call Register_SwapField_u(phis,phis,distrib_physic,
+  !  *                            Request_physic,up=2,down=2)
+  !
+  !     call Register_SwapField_u(phi,phi,distrib_physic,
+  !  *                            Request_physic,up=2,down=2)
+  !
+  !     call Register_SwapField_u(w,w,distrib_physic,
+  !  *                            Request_physic,up=2,down=2)
+  !
+  !     call Register_SwapField_u(q,q,distrib_physic,
+  !  *                            Request_physic,up=2,down=2)
+
+  !     call Register_SwapField_u(flxw,flxw,distrib_physic,
+  !  *                            Request_physic,up=2,down=2)
+  !
+  !     call SendRequest(Request_Physic)
+  ! c$OMP BARRIER
+  !     call WaitRequest(Request_Physic)
+
+  ! c$OMP BARRIER
+  ! c$OMP MASTER
+  !     call Set_Distrib(distrib_Physic)
+  !     call VTe(VThallo)
+  !
+  !     call VTb(VTphysiq)
+  ! c$OMP END MASTER
+  ! c$OMP BARRIER
+
+  ! #ifdef DEBUG_IO
+  !   call WriteField_u('ucovfi',ucov)
+  !   call WriteField_v('vcovfi',vcov)
+  !   call WriteField_u('tetafi',teta)
+  !   call WriteField_u('pfi',p)
+  !   call WriteField_u('pkfi',pk)
+  !   do j=1,nqtot
+  !     call WriteField_u('qfi'//trim(int2str(j)),q(:,:,j))
+  !   enddo
+  ! #endif
+  !    STOP
+  ! c$OMP BARRIER
+  ! !        CALL FTRACE_REGION_BEGIN("calfis")
+  !     CALL calfis_loc(lafin ,jD_cur, jH_cur,
+  !  $               ucov,vcov,teta,q,masse,ps,p,pk,phis,phi ,
+  !  $               du,dv,dteta,dq,
+  !  $               flxw,
+  !  $               dufi,dvfi,dtetafi,dqfi,dpfi  )
+  ! !        CALL FTRACE_REGION_END("calfis")
+  ! !        ijb=ij_begin
+  ! !        ije=ij_end
+  ! !        if ( .not. pole_nord) then
+  ! !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  ! !          DO l=1,llm
+  ! !          dufi_tmp(1:iip1,l)   = dufi(ijb:ijb+iim,l)
+  ! !          dvfi_tmp(1:iip1,l)   = dvfi(ijb:ijb+iim,l)
+  ! !          dtetafi_tmp(1:iip1,l)= dtetafi(ijb:ijb+iim,l)
+  ! !          dqfi_tmp(1:iip1,l,:) = dqfi(ijb:ijb+iim,l,:)
+  ! !          ENDDO
+  ! !c$OMP END DO NOWAIT
+  ! !
+  ! !c$OMP MASTER
+  ! !          dpfi_tmp(1:iip1)     = dpfi(ijb:ijb+iim)
+  ! !c$OMP END MASTER
+  ! !        endif ! of if ( .not. pole_nord)
+
+  ! !c$OMP BARRIER
+  ! !c$OMP MASTER
+  ! !        call Set_Distrib(distrib_physic_bis)
+
+  ! !        call VTb(VThallo)
+  ! !c$OMP END MASTER
+  ! !c$OMP BARRIER
+  ! !
+  ! !        call Register_Hallo_u(dufi,llm,
+  ! !     *                      1,0,0,1,Request_physic)
+  ! !
+  ! !        call Register_Hallo_v(dvfi,llm,
+  ! !     *                      1,0,0,1,Request_physic)
+  ! !
+  ! !        call Register_Hallo_u(dtetafi,llm,
+  ! !     *                      1,0,0,1,Request_physic)
+  ! !
+  ! !        call Register_Hallo_u(dpfi,1,
+  ! !     *                      1,0,0,1,Request_physic)
+  ! !
+  ! !        do j=1,nqtot
+  ! !          call Register_Hallo_u(dqfi(ijb_u,1,j),llm,
+  ! !     *                        1,0,0,1,Request_physic)
+  ! !        enddo
+  ! !
+  ! !        call SendRequest(Request_Physic)
+  ! !c$OMP BARRIER
+  ! !        call WaitRequest(Request_Physic)
+  ! !
+  ! !c$OMP BARRIER
+  ! !c$OMP MASTER
+  ! !        call VTe(VThallo)
+  ! !
+  ! !        call set_Distrib(distrib_Physic)
+  ! !c$OMP END MASTER
+  ! !c$OMP BARRIER
+  ! !                ijb=ij_begin
+  ! !        if (.not. pole_nord) then
+  ! !
+  ! !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  ! !          DO l=1,llm
+  ! !            dufi(ijb:ijb+iim,l) = dufi(ijb:ijb+iim,l)+dufi_tmp(1:iip1,l)
+  ! !            dvfi(ijb:ijb+iim,l) = dvfi(ijb:ijb+iim,l)+dvfi_tmp(1:iip1,l)
+  ! !            dtetafi(ijb:ijb+iim,l) = dtetafi(ijb:ijb+iim,l)
+  ! !     &                              +dtetafi_tmp(1:iip1,l)
+  ! !            dqfi(ijb:ijb+iim,l,:) = dqfi(ijb:ijb+iim,l,:)
+  ! !     &                              + dqfi_tmp(1:iip1,l,:)
+  ! !          ENDDO
+  ! !c$OMP END DO NOWAIT
+  ! !
+  ! !c$OMP MASTER
+  ! !          dpfi(ijb:ijb+iim)   = dpfi(ijb:ijb+iim)+ dpfi_tmp(1:iip1)
+  ! !c$OMP END MASTER
+  ! !
+  ! !        endif ! of if (.not. pole_nord)
+
+  ! #ifdef DEBUG_IO
+  !     call WriteField_u('dufi',dufi)
+  !     call WriteField_v('dvfi',dvfi)
+  !     call WriteField_u('dtetafi',dtetafi)
+  !     call WriteField_u('dpfi',dpfi)
+  !     do j=1,nqtot
+  !       call WriteField_u('dqfi'//trim(int2str(j)),dqfi(:,:,j))
+  !    enddo
+  ! #endif
+
+  ! c$OMP BARRIER
+
+  ! c      ajout des tendances physiques:
+  ! c      ------------------------------
+  ! #ifdef DEBUG_IO
+  !     call WriteField_u('ucovfi',ucov)
+  !     call WriteField_v('vcovfi',vcov)
+  !     call WriteField_u('tetafi',teta)
+  !         call WriteField_u('psfi',ps)
+  !     do j=1,nqtot
+  !       call WriteField_u('qfi'//trim(int2str(j)),q(:,:,j))
+  !    enddo
+  ! #endif
+
+  !      IF (ok_strato) THEN
+  !        CALL top_bound_loc( vcov,ucov,teta,masse,dufi,dvfi,dtetafi)
+  !      ENDIF
+
+  ! #ifdef DEBUG_IO
+  !     call WriteField_u('ucovfi',ucov)
+  !     call WriteField_v('vcovfi',vcov)
+  !     call WriteField_u('tetafi',teta)
+  !         call WriteField_u('psfi',ps)
+  !     do j=1,nqtot
+  !       call WriteField_u('qfi'//trim(int2str(j)),q(:,:,j))
+  !    enddo
+  ! #endif
+
+  !       CALL addfi_loc( dtphys, leapf, forward   ,
+  !  $                  ucov, vcov, teta , q   ,ps ,
+  !  $                 dufi, dvfi, dtetafi , dqfi ,dpfi  )
+
+  ! #ifdef DEBUG_IO
+  !     call WriteField_u('ucovfi',ucov)
+  !     call WriteField_v('vcovfi',vcov)
+  !     call WriteField_u('tetafi',teta)
+  !         call WriteField_u('psfi',ps)
+  !     do j=1,nqtot
+  !       call WriteField_u('qfi'//trim(int2str(j)),q(:,:,j))
+  !    enddo
+  ! #endif
+
+  ! c$OMP BARRIER
+  ! c$OMP MASTER
+  !     call VTe(VTphysiq)
+
+  !     call VTb(VThallo)
+  ! c$OMP END MASTER
+
+  !     call SetTag(Request_physic,800)
+  !     call Register_SwapField_u(ucov,ucov,
+  !  *                               distrib_caldyn,Request_physic)
+  !
+  !     call Register_SwapField_v(vcov,vcov,
+  !  *                               distrib_caldyn,Request_physic)
+  !
+  !     call Register_SwapField_u(teta,teta,
+  !  *                               distrib_caldyn,Request_physic)
+  !
+  !     call Register_SwapField_u(masse,masse,
+  !  *                               distrib_caldyn,Request_physic)
+
+  !     call Register_SwapField_u(p,p,
+  !  *                               distrib_caldyn,Request_physic)
+  !
+  !     call Register_SwapField_u(pk,pk,
+  !  *                               distrib_caldyn,Request_physic)
+  !
+  !     call Register_SwapField_u(phis,phis,
+  !  *                               distrib_caldyn,Request_physic)
+  !
+  !     call Register_SwapField_u(phi,phi,
+  !  *                               distrib_caldyn,Request_physic)
+  !
+  !     call Register_SwapField_u(w,w,
+  !  *                               distrib_caldyn,Request_physic)
+
+  !     call Register_SwapField_u(q,q,
+  !  *                               distrib_caldyn,Request_physic)
+  !
+  !     call SendRequest(Request_Physic)
+  ! c$OMP BARRIER
+  !     call WaitRequest(Request_Physic)
+
+  ! c$OMP BARRIER
+  ! c$OMP MASTER
+  !    call VTe(VThallo)
+  !    call set_distrib(distrib_caldyn)
+  ! c$OMP END MASTER
+  ! c$OMP BARRIER
+  ! c
+  ! c  Diagnostique de conservation de l'energie : difference
+  !   IF (ip_ebil_dyn.ge.1 ) THEN
+  !       ztit='bil phys'
+  !       CALL diagedyn(ztit,2,1,1,dtphys
+  !  e  , ucov    , vcov , ps, p ,pk , teta , q(:,:,1), q(:,:,2))
+  !   ENDIF
+
+  ! #ifdef DEBUG_IO
+  !     call WriteField_u('ucovfi',ucov)
+  !     call WriteField_v('vcovfi',vcov)
+  !     call WriteField_u('tetafi',teta)
+  !         call WriteField_u('psfi',ps)
+  !     do j=1,nqtot
+  !       call WriteField_u('qfi'//trim(int2str(j)),q(:,:,j))
+  !    enddo
+  ! #endif
+
+
+  ! c-jld
+!$OMP MASTER
+     if (FirstPhysic) then
+       ok_start_timer=.TRUE.
+       FirstPhysic=.false.
+     endif
+!$OMP END MASTER
+   ENDIF ! of IF( apphys )
+
+   call check_isotopes(q,ijb_u,ije_u,'leapfrog 1132')
+    ! !write(*,*) 'leapfrog 1134: iflag_phys=',iflag_phys
+
+  IF(iflag_phys.EQ.2) THEN ! "Newtonian" case
+!$OMP MASTER
+     if (FirstPhysic) then
+       ok_start_timer=.TRUE.
+       FirstPhysic=.false.
+     endif
+!$OMP END MASTER
+
+
+  !   Calcul academique de la physique = Rappel Newtonien + fritcion
+  !   --------------------------------------------------------------
+  !ym       teta(:,:)=teta(:,:)
+  !ym     s  -iphysiq*dtvr*(teta(:,:)-tetarappel(:,:))/taurappel
+   ijb=ij_begin
+   ije=ij_end
+  !LF       teta(ijb:ije,:)=teta(ijb:ije,:)
+  !LF     s  -iphysiq*dtvr*(teta(ijb:ije,:)-tetarappel(ijb:ije,:))/taurappel
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+   do l=1,llm
+   teta(ijb:ije,l)=teta(ijb:ije,l) -dtvr* &
+         (teta(ijb:ije,l)-tetarappel(ijb:ije,l))* &
+         (knewt_g+knewt_t(l)*clat4(ijb:ije))
+   enddo
+!$OMP END DO
+
+!$OMP MASTER
+   if (planet_type.eq."giant") then
+     ! ! add an intrinsic heat flux at the base of the atmosphere
+     teta(ijb:ije,1) = teta(ijb:ije,1) &
+           + dtvr * aire(ijb:ije) * ihf / cpp / masse(ijb:ije,1)
+   endif
+!$OMP END MASTER
+!$OMP BARRIER
+
+
+   call Register_Hallo_u(ucov,llm,0,1,1,0,Request_Physic)
+   call Register_Hallo_v(vcov,llm,1,1,1,1,Request_Physic)
+   call SendRequest(Request_Physic)
+!$OMP BARRIER
+   call WaitRequest(Request_Physic)
+!$OMP BARRIER
+   call friction_loc(ucov,vcov,dtvr)
+!$OMP BARRIER
+
+    ! ! Sponge layer (if any)
+    IF (ok_strato) THEN
+      CALL top_bound_loc(vcov,ucov,teta,masse,dtvr)
+!$OMP BARRIER
+    ENDIF ! of IF (ok_strato)
+  ENDIF ! of IF(iflag_phys.EQ.2)
+
+
+    CALL pression_loc ( ip1jmp1, ap, bp, ps, p                  )
+!$OMP BARRIER
+    if (pressure_exner) then
+    CALL exner_hyb_loc( ijnb_u, ps, p, pks, pk, pkf )
+    else
+      CALL exner_milieu_loc( ijnb_u, ps, p, pks, pk, pkf )
+    endif
+!$OMP BARRIER
+    CALL massdair_loc(p,masse)
+!$OMP BARRIER
+
+  !c$OMP END PARALLEL
+    call check_isotopes(q,ijb_u,ije_u,'leapfrog 1196')
+
+  !-----------------------------------------------------------------------
+  !   dissipation horizontale et verticale  des petites echelles:
+  !   ----------------------------------------------------------
+  ! !write(*,*) 'leapfrog 1163: apdiss=',apdiss
+  IF(apdiss) THEN
+
+    CALL call_dissip(ucov,vcov,teta,p,pk,ps)
+  !cc$OMP  PARALLEL DEFAULT(SHARED)
+  !cc$OMP+          PRIVATE(ijb,ije,tppn,tpn,tpps,tps)
+  !c$OMP MASTER
+     ! call suspend_timer(timer_caldyn)
+  !
+  !c       print*,'Entree dans la dissipation : Iteration No ',true_itau
+  !c   calcul de l'energie cinetique avant dissipation
+  !c       print *,'Passage dans la dissipation'
+
+  !    call VTb(VThallo)
+  !c$OMP END MASTER
+
+  !c$OMP BARRIER
+
+  !    call Register_SwapField_u(ucov,ucov,distrib_dissip,
+  ! *                            Request_dissip,up=1,down=1)
+
+  !    call Register_SwapField_v(vcov,vcov,distrib_dissip,
+  ! *                            Request_dissip,up=1,down=1)
+
+  !    call Register_SwapField_u(teta,teta,distrib_dissip,
+  ! *                            Request_dissip)
+
+  !    call Register_SwapField_u(p,p,distrib_dissip,
+  ! *                            Request_dissip)
+
+  !    call Register_SwapField_u(pk,pk,distrib_dissip,
+  ! *                            Request_dissip)
+
+  !    call SendRequest(Request_dissip)
+  !c$OMP BARRIER
+  !    call WaitRequest(Request_dissip)
+
+  !c$OMP BARRIER
+  !c$OMP MASTER
+  !    call set_distrib(distrib_dissip)
+  !    call VTe(VThallo)
+  !    call VTb(VTdissipation)
+  !    call start_timer(timer_dissip)
+  !c$OMP END MASTER
+  !c$OMP BARRIER
+
+  !    call covcont_loc(llm,ucov,vcov,ucont,vcont)
+  !    call enercin_loc(vcov,ucov,vcont,ucont,ecin0)
+
+  !c   dissipation
+
+  !!        CALL FTRACE_REGION_BEGIN("dissip")
+  !    CALL dissip_loc(vcov,ucov,teta,p,dvdis,dudis,dtetadis)
+
+  !#ifdef DEBUG_IO
+  !    call WriteField_u('dudis',dudis)
+  !    call WriteField_v('dvdis',dvdis)
+  !    call WriteField_u('dtetadis',dtetadis)
+  !#endif
+  !
+  !!      CALL FTRACE_REGION_END("dissip")
+  !
+  !    ijb=ij_begin
+  !    ije=ij_end
+  !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  !    DO l=1,llm
+  !      ucov(ijb:ije,l)=ucov(ijb:ije,l)+dudis(ijb:ije,l)
+  !    ENDDO
+  !c$OMP END DO NOWAIT
+  !    if (pole_sud) ije=ije-iip1
+  !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  !    DO l=1,llm
+  !      vcov(ijb:ije,l)=vcov(ijb:ije,l)+dvdis(ijb:ije,l)
+  !    ENDDO
+  !c$OMP END DO NOWAIT
+
+  !c       teta=teta+dtetadis
+
+
+  !c------------------------------------------------------------------------
+  !    if (dissip_conservative) then
+  !C       On rajoute la tendance due a la transform. Ec -> E therm. cree
+  !C       lors de la dissipation
+  !c$OMP BARRIER
+  !c$OMP MASTER
+  !        call suspend_timer(timer_dissip)
+  !        call VTb(VThallo)
+  !c$OMP END MASTER
+  !        call Register_Hallo_u(ucov,llm,1,1,1,1,Request_Dissip)
+  !        call Register_Hallo_v(vcov,llm,1,1,1,1,Request_Dissip)
+  !        call SendRequest(Request_Dissip)
+  !c$OMP BARRIER
+  !        call WaitRequest(Request_Dissip)
+  !c$OMP MASTER
+  !        call VTe(VThallo)
+  !        call resume_timer(timer_dissip)
+  !c$OMP END MASTER
+  !c$OMP BARRIER
+  !        call covcont_loc(llm,ucov,vcov,ucont,vcont)
+  !        call enercin_loc(vcov,ucov,vcont,ucont,ecin)
+  !
+  !        ijb=ij_begin
+  !        ije=ij_end
+  !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  !        do l=1,llm
+  !          do ij=ijb,ije
+  !            dtetaecdt(ij,l)= (ecin0(ij,l)-ecin(ij,l))/ pk(ij,l)
+  !            dtetadis(ij,l)=dtetadis(ij,l)+dtetaecdt(ij,l)
+  !          enddo
+  !        enddo
+  !c$OMP END DO NOWAIT
+  !   endif
+
+  !   ijb=ij_begin
+  !   ije=ij_end
+  !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  !     do l=1,llm
+  !       do ij=ijb,ije
+  !          teta(ij,l)=teta(ij,l)+dtetadis(ij,l)
+  !       enddo
+  !     enddo
+  !c$OMP END DO NOWAIT
+  !c------------------------------------------------------------------------
+
+
+  !c    .......        P. Le Van (  ajout  le 17/04/96  )   ...........
+  !c   ...      Calcul de la valeur moyenne, unique de h aux poles  .....
+  !c
+
+  !    ijb=ij_begin
+  !    ije=ij_end
+  !
+  !    if (pole_nord) then
+  !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  !      DO l  =  1, llm
+  !        DO ij =  1,iim
+  !         tppn(ij)  = aire(  ij    ) * teta(  ij    ,l)
+  !        ENDDO
+  !         tpn  = SSUM(iim,tppn,1)/apoln
+
+  !        DO ij = 1, iip1
+  !         teta(  ij    ,l) = tpn
+  !        ENDDO
+  !      ENDDO
+  !c$OMP END DO NOWAIT
+
+  !c$OMP MASTER
+  !      DO ij =  1,iim
+  !        tppn(ij)  = aire(  ij    ) * ps (  ij    )
+  !      ENDDO
+  !        tpn  = SSUM(iim,tppn,1)/apoln
+  !
+  !      DO ij = 1, iip1
+  !        ps(  ij    ) = tpn
+  !      ENDDO
+  !c$OMP END MASTER
+  !    endif
+  !
+  !    if (pole_sud) then
+  !c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  !      DO l  =  1, llm
+  !        DO ij =  1,iim
+  !         tpps(ij)  = aire(ij+ip1jm) * teta(ij+ip1jm,l)
+  !        ENDDO
+  !         tps  = SSUM(iim,tpps,1)/apols
+
+  !        DO ij = 1, iip1
+  !         teta(ij+ip1jm,l) = tps
+  !        ENDDO
+  !      ENDDO
+  !c$OMP END DO NOWAIT
+
+  !c$OMP MASTER
+  !      DO ij =  1,iim
+  !        tpps(ij)  = aire(ij+ip1jm) * ps (ij+ip1jm)
+  !      ENDDO
+  !        tps  = SSUM(iim,tpps,1)/apols
+  !
+  !      DO ij = 1, iip1
+  !        ps(ij+ip1jm) = tps
+  !      ENDDO
+  !c$OMP END MASTER
+  !    endif
+
+
+  !c$OMP BARRIER
+  !c$OMP MASTER
+  !    call VTe(VTdissipation)
+
+  !    call stop_timer(timer_dissip)
+  !
+  !    call VTb(VThallo)
+  !c$OMP END MASTER
+  !    call Register_SwapField_u(ucov,ucov,distrib_caldyn,
+  ! *                            Request_dissip)
+
+  !    call Register_SwapField_v(vcov,vcov,distrib_caldyn,
+  ! *                            Request_dissip)
+
+  !    call Register_SwapField_u(teta,teta,distrib_caldyn,
+  ! *                            Request_dissip)
+
+  !    call Register_SwapField_u(p,p,distrib_caldyn,
+  ! *                            Request_dissip)
+
+  !    call Register_SwapField_u(pk,pk,distrib_caldyn,
+  ! *                            Request_dissip)
+
+  !    call SendRequest(Request_dissip)
+  !c$OMP BARRIER
+  !    call WaitRequest(Request_dissip)
+
+  !c$OMP BARRIER
+  !c$OMP MASTER
+  !    call set_distrib(distrib_caldyn)
+  !    call VTe(VThallo)
+  !    call resume_timer(timer_caldyn)
+  !c        print *,'fin dissipation'
+  !c$OMP END MASTER
+  !c$OMP BARRIER
+   END IF ! of IF(apdiss)
+
+  !c$OMP END PARALLEL
+
+  ! ajout debug
+           ! IF( lafin ) then
+           !   abort_message = 'Simulation finished'
+           !   call abort_gcm(modname,abort_message,0)
+           ! ENDIF
+
+   call check_isotopes(q,ijb_u,ije_u,'leapfrog 1430')
+
+  !   ********************************************************************
+  !   ********************************************************************
+  !   .... fin de l'integration dynamique  et physique pour le pas itau ..
+  !   ********************************************************************
+  !   ********************************************************************
+
+  !   preparation du pas d'integration suivant  ......
+  !ym      call WriteField('ucov',reshape(ucov,(/iip1,jmp1,llm/)))
+  !ym      call WriteField('vcov',reshape(vcov,(/iip1,jjm,llm/)))
+!$OMP MASTER
+  call stop_timer(timer_caldyn)
+!$OMP END MASTER
+  IF (itau==itaumax) then
+!$OMP MASTER
+     call allgather_timer_average
+     call barrier
+     if (mpi_rank==0) then
+
+        print *,'*********************************'
+        print *,'******    TIMER CALDYN     ******'
+        do i=0,mpi_size-1
+           print *,'proc',i,' :   Nb Bandes  :',jj_nb_caldyn(i), &
+                 '  : temps moyen :', &
+                 timer_average(jj_nb_caldyn(i),timer_caldyn,i)
+        enddo
+
+        print *,'*********************************'
+        print *,'******    TIMER VANLEER    ******'
+        do i=0,mpi_size-1
+           print *,'proc',i,' :   Nb Bandes  :',jj_nb_vanleer(i), &
+                 '  : temps moyen :', &
+                 timer_average(jj_nb_vanleer(i),timer_vanleer,i)
+        enddo
+
+        print *,'*********************************'
+        print *,'******    TIMER DISSIP    ******'
+        do i=0,mpi_size-1
+           print *,'proc',i,' :   Nb Bandes  :',jj_nb_dissip(i), &
+                 '  : temps moyen :', &
+                 timer_average(jj_nb_dissip(i),timer_dissip,i)
+        enddo
+
+        print *,'*********************************'
+        print *,'******    TIMER PHYSIC    ******'
+        do i=0,mpi_size-1
+           print *,'proc',i,' :   Nb Bandes  :',jj_nb_physic(i), &
+                 '  : temps moyen :', &
+                 timer_average(jj_nb_physic(i),timer_physic,i)
+        enddo
+
+     endif
+     CALL barrier
+     print *,'Taille du Buffer MPI (REAL*8)',MaxBufferSize
+  print *,'Taille du Buffer MPI utilise (REAL*8)',MaxBufferSize_Used
+   print *, 'Temps total ecoule sur la parallelisation :',DiffTime()
+  print *, 'Temps CPU ecoule sur la parallelisation :',DiffCpuTime()
+     CALL print_filtre_timer
+!$OMP END MASTER
+     CALL dynredem1_loc("restart.nc",0.0, &
+           vcov,ucov,teta,q,masse,ps)
+!$OMP MASTER
+     call fin_getparam
+!$OMP END MASTER
+
+     if (ok_guide) then
+       ! ! set ok_guide to false to avoid extra output
+       ! ! in following forward step
+       ok_guide=.false.
+     endif
+
+IF (CPPKEY_INCA) THEN
+     IF (ANY(type_trac == ['inca','inco'])) THEN
+        CALL finalize_inca
+  ! switching back to LMDZDYN context
+!$OMP MASTER
+        IF (ok_dyn_xios) THEN
+           CALL xios_set_current_context(dyn3d_ctx_handle)
+        ENDIF
+!$OMP END MASTER
+     ENDIF
+END IF
+IF (CPPKEY_REPROBUS) THEN
+     if (type_trac == 'repr') CALL finalize_reprobus
+END IF
+
+!$OMP MASTER
+     call finalize_parallel
+!$OMP END MASTER
+!$OMP BARRIER
+     RETURN
+  ENDIF
+
+  call check_isotopes(q,ijb_u,ije_u,'leapfrog 1509')
+
+  IF ( .NOT.purmats ) THEN
+    ! ........................................................
+    ! ..............  schema matsuno + leapfrog  ..............
+    ! ........................................................
+
+        IF(forward.OR. leapf) THEN
+          itau= itau + 1
+           ! iday= day_ini+itau/day_step
+           ! time= REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
+           !   IF(time.GT.1.) THEN
+           !     time = time-1.
+           !     iday = iday+1
+           !   ENDIF
+        ENDIF
+
+
+        IF( itau.EQ. itaufinp1 ) then
+
+          if (flag_verif) then
+            write(79,*) 'ucov',ucov
+            write(80,*) 'vcov',vcov
+            write(81,*) 'teta',teta
+            write(82,*) 'ps',ps
+            write(83,*) 'q',q
+            WRITE(85,*) 'q1 = ',q(:,:,1)
+            WRITE(86,*) 'q3 = ',q(:,:,3)
+          endif
+
+
+!$OMP MASTER
+          call fin_getparam
+!$OMP END MASTER
+
+IF (CPPKEY_INCA) THEN
+          IF (ANY(type_trac == ['inca','inco'])) THEN
+             CALL finalize_inca
+  ! switching back to LMDZDYN context
+!$OMP MASTER
+             IF (ok_dyn_xios) THEN
+                CALL xios_set_current_context(dyn3d_ctx_handle)
+             ENDIF
+!$OMP END MASTER
+          ENDIF
+END IF
+IF (CPPKEY_REPROBUS) THEN
+          if (type_trac == 'repr') CALL finalize_reprobus
+END IF
+
+!$OMP MASTER
+          call finalize_parallel
+!$OMP END MASTER
+          abort_message = 'Simulation finished'
+          call abort_gcm(modname,abort_message,0)
+          RETURN
+        ENDIF
+  !-----------------------------------------------------------------------
+  !   ecriture du fichier histoire moyenne:
+  !   -------------------------------------
+
+        IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
+!$OMP BARRIER
+           IF(itau.EQ.itaufin) THEN
+              iav=1
+           ELSE
+              iav=0
+           ENDIF
+
+          ! ! Ehouarn: re-compute geopotential for outputs
+!$OMP BARRIER
+!$OMP MASTER
+          CALL geopot_loc(ip1jmp1,teta,pk,pks,phis,phi)
+!$OMP END MASTER
+!$OMP BARRIER
+
+         IF (ok_dynzon) THEN
+
+          CALL bilan_dyn_loc(2,dtvr*iperiod,dtvr*day_step*periodav, &
+                ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,q)
+
+          ENDIF !ok_dynzon
+
+          IF (ok_dyn_ave) THEN
+             CALL writedynav_loc(itau,vcov, &
+                   ucov,teta,pk,phi,q,masse,ps,phis)
+          ENDIF
+
+
+
+        ENDIF
+
+        call check_isotopes(q,ijb_u,ije_u,'leapfrog 1584')
+
+  !-----------------------------------------------------------------------
+  !   ecriture de la bande histoire:
+  !   ------------------------------
+
+        IF( MOD(itau,iecri).EQ.0) THEN
+         ! ! Ehouarn: output only during LF or Backward Matsuno
+         if (leapf.or.(.not.leapf.and.(.not.forward))) then
+
+!$OMP BARRIER
+!$OMP MASTER
+          CALL geopot_loc(ip1jmp1,teta,pk,pks,phis,phi)
+!$OMP END MASTER
+!$OMP BARRIER
+
+         if (ok_dyn_ins) then
+             CALL writehist_loc(itau,vcov,ucov,teta,pk,phi,q, &
+                   masse,ps,phis)
+         endif
+
+
+          IF (ok_dyn_xios) THEN
+!$OMP MASTER
+             CALL xios_update_calendar(itau)
+!$OMP END MASTER
+!$OMP BARRIER
+             CALL writedyn_xios(vcov, &
+                   ucov,teta,pk,phi,q,masse,ps,phis)
+          ENDIF
+
+      endif                 ! of if (leapf.or.(.not.leapf.and.(.not.forward)))
+
+
+       ENDIF ! of IF(MOD(itau,iecri).EQ.0)
+
+        IF(itau.EQ.itaufin) THEN
+
+!$OMP BARRIER
+
+           ! if (planet_type.eq."earth") then
+  ! Write an Earth-format restart file
+            CALL dynredem1_loc("restart.nc",0.0, &
+                  vcov,ucov,teta,q,masse,ps)
+           ! endif ! of if (planet_type.eq."earth")
+            if (ok_guide) then
+              ! ! set ok_guide to false to avoid extra output
+              ! ! in following forward step
+              ok_guide=.false.
+            endif
+
+           ! CLOSE(99)
+        ENDIF ! of IF (itau.EQ.itaufin)
+
+        call check_isotopes(q,ijb_u,ije_u,'leapfrog 1624')
+
+  !-----------------------------------------------------------------------
+  !   gestion de l'integration temporelle:
+  !   ------------------------------------
+
+        IF( MOD(itau,iperiod).EQ.0 )    THEN
+                GO TO 1
+        ELSE IF ( MOD(itau-1,iperiod).EQ. 0 ) THEN
+
+               IF( forward )  THEN
+   ! fin du pas forward et debut du pas backward
+
+                  forward = .FALSE.
+                    leapf = .FALSE.
+                       GO TO 2
+
+               ELSE
+   ! fin du pas backward et debut du premier pas leapfrog
+
+                    leapf =  .TRUE.
+                    dt  =  2.*dtvr
+                    GO TO 2
+               END IF
+        ELSE
+
+   ! ......   pas leapfrog  .....
+
+             leapf = .TRUE.
+             dt  = 2.*dtvr
+             GO TO 2
+        END IF ! of IF (MOD(itau,iperiod).EQ.0)
+               ! !    ELSEIF (MOD(itau-1,iperiod).EQ.0)
+
+
+  ELSE ! of IF (.not.purmats)
+
+
+    call check_isotopes(q,ijb_u,ije_u,'leapfrog 1664')
+
+    ! ........................................................
+    ! ..............       schema  matsuno        ...............
+    ! ........................................................
+        IF( forward )  THEN
+
+         itau =  itau + 1
+          ! iday = day_ini+itau/day_step
+          ! time = REAL(itau-(iday-day_ini)*day_step)/day_step+time_0
+  !
+  !              IF(time.GT.1.) THEN
+  !               time = time-1.
+  !               iday = iday+1
+  !              ENDIF
+
+           forward =  .FALSE.
+           IF( itau.EQ. itaufinp1 ) then
+!$OMP MASTER
+             call fin_getparam
+!$OMP END MASTER
+
+IF (CPPKEY_INCA) THEN
+             IF (ANY(type_trac == ['inca','inco'])) THEN
+                CALL finalize_inca
+  ! switching back to LMDZDYN context
+!$OMP MASTER
+                IF (ok_dyn_xios) THEN
+                   CALL xios_set_current_context(dyn3d_ctx_handle)
+                ENDIF
+!$OMP END MASTER
+             ENDIF
+
+END IF
+IF (CPPKEY_REPROBUS) THEN
+             if (type_trac == 'repr') CALL finalize_reprobus
+END IF
+
+!$OMP MASTER
+             call finalize_parallel
+!$OMP END MASTER
+             abort_message = 'Simulation finished'
+             call abort_gcm(modname,abort_message,0)
+             RETURN
+           ENDIF
+           GO TO 2
+
+        ELSE ! of IF(forward) i.e. backward step
+
+
+          call check_isotopes(q,ijb_u,ije_u,'leapfrog 1698')
+
+          IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
+           IF(itau.EQ.itaufin) THEN
+              iav=1
+           ELSE
+              iav=0
+           ENDIF
+
+          ! ! Ehouarn: re-compute geopotential for outputs
+!$OMP BARRIER
+!$OMP MASTER
+          CALL geopot_loc(ip1jmp1,teta,pk,pks,phis,phi)
+!$OMP END MASTER
+!$OMP BARRIER
+
+           IF (ok_dynzon) THEN
+           CALL bilan_dyn_loc(2,dtvr*iperiod,dtvr*day_step*periodav, &
+                 ps,masse,pk,pbaru,pbarv,teta,phi,ucov,vcov,q)
+           ENDIF
+
+           IF (ok_dyn_ave) THEN
+             CALL writedynav_loc(itau,vcov, &
+                   ucov,teta,pk,phi,q,masse,ps,phis)
+           ENDIF
+
+
+
+          ENDIF ! of IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin)
+
+
+           IF(MOD(itau,iecri         ).EQ.0) THEN
+
+!$OMP BARRIER
+!$OMP MASTER
+          CALL geopot_loc(ip1jmp1,teta,pk,pks,phis,phi)
+!$OMP END MASTER
+!$OMP BARRIER
+
+
+          if (ok_dyn_ins) then
+             CALL writehist_loc(itau,vcov,ucov,teta,pk,phi,q, &
+                   masse,ps,phis)
+          endif ! of if (ok_dyn_ins)
+
+
+          IF (ok_dyn_xios) THEN
+!$OMP MASTER
+             CALL xios_update_calendar(itau)
+!$OMP END MASTER
+!$OMP BARRIER
+             CALL writedyn_xios(vcov, &
+                   ucov,teta,pk,phi,q,masse,ps,phis)
+          ENDIF
+
+       ENDIF                ! of IF(MOD(itau,iecri).EQ.0)
+
+
+          IF(itau.EQ.itaufin) THEN
+             ! if (planet_type.eq."earth") then
+               CALL dynredem1_loc("restart.nc",0.0, &
+                     vcov,ucov,teta,q,masse,ps)
+            ! endif ! of if (planet_type.eq."earth")
+            if (ok_guide) then
+              ! ! set ok_guide to false to avoid extra output
+              ! ! in following forward step
+              ok_guide=.false.
+            endif
+
+          ENDIF ! of IF(itau.EQ.itaufin)
+
+          forward = .TRUE.
+          GO TO  1
+
+        ENDIF ! of IF (forward)
+
+
+        call check_isotopes(q,ijb_u,ije_u,'leapfrog 1750')
+
+  END IF ! of IF(.not.purmats)
+!$OMP MASTER
+  call fin_getparam
+!$OMP END MASTER
+
+IF (CPPKEY_INCA) THEN
+  IF (ANY(type_trac == ['inca','inco'])) THEN
+     CALL finalize_inca
+  ! switching back to LMDZDYN context
+!$OMP MASTER
+     IF (ok_dyn_xios) THEN
+        CALL xios_set_current_context(dyn3d_ctx_handle)
+     ENDIF
+!$OMP END MASTER
+  ENDIF
+
+END IF
+IF (CPPKEY_REPROBUS) THEN
+  if (type_trac == 'repr') CALL finalize_reprobus
+END IF
+
+!$OMP MASTER
+  call finalize_parallel
+!$OMP END MASTER
+  abort_message = 'Simulation finished'
+  call abort_gcm(modname,abort_message,0)
+  RETURN
+END SUBROUTINE leapfrog_loc
Index: LMDZ6/trunk/libf/dyn3dmem/leapfrog_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/leapfrog_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,157 +1,0 @@
-MODULE leapfrog_mod
-
-  REAL,POINTER,SAVE :: ucov(:,:) ! zonal covariant wind
-  REAL,POINTER,SAVE :: vcov(:,:) ! meridional covariant wind
-  REAL,POINTER,SAVE :: teta(:,:) ! potential temperature
-  REAL,POINTER,SAVE :: ps(:) ! surface pressure
-  REAL,POINTER,SAVE :: masse(:,:) ! air mass
-  REAL,POINTER,SAVE :: phis(:) ! geopotential at the surface
-  REAL,POINTER,SAVE :: q(:,:,:) ! advected tracers
-  REAL,POINTER,SAVE :: p(:,:) ! interlayer pressure
-  REAL,POINTER,SAVE :: pks(:) ! Exner at the surface
-  REAL,POINTER,SAVE :: pk(:,:) ! Exner at mid-layer
-  REAL,POINTER,SAVE :: pkf(:,:) ! filtered Exner
-  REAL,POINTER,SAVE :: phi(:,:) ! geopotential
-  REAL,POINTER,SAVE :: w(:,:) ! vertical velocity
-  REAL,POINTER,SAVE :: pbaru(:,:)
-  REAL,POINTER,SAVE :: pbarv(:,:)
-  REAL,POINTER,SAVE :: vcovm1(:,:)
-  REAL,POINTER,SAVE :: ucovm1(:,:)
-  REAL,POINTER,SAVE :: tetam1(:,:)
-  REAL,POINTER,SAVE :: psm1(:)
-  REAL,POINTER,SAVE :: massem1(:,:)
-  REAL,POINTER,SAVE :: dv(:,:)
-  REAL,POINTER,SAVE :: du(:,:)
-  REAL,POINTER,SAVE :: dteta(:,:)
-  REAL,POINTER,SAVE :: dp(:)
-  REAL,POINTER,SAVE :: dq(:,:,:)
-  REAL,POINTER,SAVE :: finvmaold(:,:)
-  REAL,POINTER,SAVE :: flxw(:,:)
-  REAL,POINTER,SAVE :: unat(:,:)
-  REAL,POINTER,SAVE :: vnat(:,:)
- 
-
-  
-CONTAINS
-
-  SUBROUTINE leapfrog_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE dimensions_mod
-  USE infotrac
-  USE caldyn_mod,ONLY : caldyn_allocate
-  USE integrd_mod,ONLY : integrd_allocate
-  USE caladvtrac_mod,ONLY : caladvtrac_allocate
-  USE call_calfis_mod,ONLY : call_calfis_allocate
-  USE call_dissip_mod, ONLY : call_dissip_allocate
-  IMPLICIT NONE
-  TYPE(distrib),POINTER :: d
-
-
-    d=>distrib_caldyn
-    CALL allocate_u(ucov,llm,d)
-    CALL allocate_v(vcov,llm,d)
-    CALL allocate_u(teta,llm,d)
-    CALL allocate_u(ps,d)
-    CALL allocate_u(masse,llm,d)
-    CALL allocate_u(phis,d)
-    CALL allocate_u(q,llm,nqtot,d)
-    CALL allocate_u(p,llmp1,d)
-    CALL allocate_u(pks,d)
-    CALL allocate_u(pk,llm,d)
-    CALL allocate_u(pkf,llm,d)
-    CALL allocate_u(phi,llm,d)
-    CALL allocate_u(w,llm,d)
-    CALL allocate_u(pbaru,llm,d)
-    CALL allocate_v(pbarv,llm,d)
-    CALL allocate_v(vcovm1,llm,d)
-    CALL allocate_u(ucovm1,llm,d)
-    CALL allocate_u(tetam1,llm,d)
-    CALL allocate_u(psm1,d)
-    CALL allocate_u(massem1,llm,d)
-    CALL allocate_v(dv,llm,d)
-    CALL allocate_u(du,llm,d)
-    CALL allocate_u(dteta,llm,d)
-    CALL allocate_u(dp,d)
-    CALL allocate_u(dq,llm,nqtot,d)
-    CALL allocate_u(finvmaold,llm,d)
-    CALL allocate_u(flxw,llm,d)
-    CALL allocate_u(unat,llm,d)
-    CALL allocate_v(vnat,llm,d)
-    
-    CALL caldyn_allocate
-    CALL integrd_allocate
-    CALL caladvtrac_allocate
-    CALL call_calfis_allocate
-    CALL call_dissip_allocate
-        
-  END SUBROUTINE leapfrog_allocate
-  
-  SUBROUTINE leapfrog_switch_caldyn(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  USE caldyn_mod,ONLY : caldyn_switch_caldyn
-  USE integrd_mod,ONLY : integrd_switch_caldyn
-  USE caladvtrac_mod,ONLY : caladvtrac_switch_caldyn
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-
-    CALL switch_u(ucov,distrib_caldyn,dist)
-    CALL switch_v(vcov,distrib_caldyn,dist)
-    CALL switch_u(teta,distrib_caldyn,dist)
-    CALL switch_u(ps,distrib_caldyn,dist)
-    CALL switch_u(masse,distrib_caldyn,dist)
-    CALL switch_u(phis,distrib_caldyn,dist,up=halo_max,down=halo_max)
-    CALL switch_u(q,distrib_caldyn,dist)
-    CALL switch_u(p,distrib_caldyn,dist)
-    CALL switch_u(pks,distrib_caldyn,dist)
-    CALL switch_u(pk,distrib_caldyn,dist)
-    CALL switch_u(pkf,distrib_caldyn,dist)
-    CALL switch_u(phi,distrib_caldyn,dist)
-    CALL switch_u(w,distrib_caldyn,dist)
-    CALL switch_u(pbaru,distrib_caldyn,dist)
-    CALL switch_v(pbarv,distrib_caldyn,dist)
-    CALL switch_v(vcovm1,distrib_caldyn,dist)
-    CALL switch_u(ucovm1,distrib_caldyn,dist)
-    CALL switch_u(tetam1,distrib_caldyn,dist)
-    CALL switch_u(psm1,distrib_caldyn,dist)
-    CALL switch_u(massem1,distrib_caldyn,dist)
-    CALL switch_v(dv,distrib_caldyn,dist)
-    CALL switch_u(du,distrib_caldyn,dist)
-    CALL switch_u(dteta,distrib_caldyn,dist)
-    CALL switch_u(dp,distrib_caldyn,dist)
-    CALL switch_u(dq,distrib_caldyn,dist)
-    CALL switch_u(finvmaold,distrib_caldyn,dist)
-    CALL switch_u(flxw,distrib_caldyn,dist)
-    CALL switch_u(unat,distrib_caldyn,dist)
-    CALL switch_v(vnat,distrib_caldyn,dist)
-
-    
-    CALL caldyn_switch_caldyn(dist)
-    CALL integrd_switch_caldyn(dist)
-    CALL caladvtrac_switch_caldyn(dist)
-    
-  END SUBROUTINE leapfrog_switch_caldyn
-  
-  SUBROUTINE leapfrog_switch_dissip(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  USE call_dissip_mod,ONLY : call_dissip_switch_dissip
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-
-    CALL call_dissip_switch_dissip(dist)
-    
-  END SUBROUTINE leapfrog_switch_dissip
-  
-END MODULE leapfrog_mod  
-
-
-
-
-
-
-
Index: LMDZ6/trunk/libf/dyn3dmem/leapfrog_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/leapfrog_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/leapfrog_mod.f90	(revision 5268)
@@ -0,0 +1,157 @@
+MODULE leapfrog_mod
+
+  REAL,POINTER,SAVE :: ucov(:,:) ! zonal covariant wind
+  REAL,POINTER,SAVE :: vcov(:,:) ! meridional covariant wind
+  REAL,POINTER,SAVE :: teta(:,:) ! potential temperature
+  REAL,POINTER,SAVE :: ps(:) ! surface pressure
+  REAL,POINTER,SAVE :: masse(:,:) ! air mass
+  REAL,POINTER,SAVE :: phis(:) ! geopotential at the surface
+  REAL,POINTER,SAVE :: q(:,:,:) ! advected tracers
+  REAL,POINTER,SAVE :: p(:,:) ! interlayer pressure
+  REAL,POINTER,SAVE :: pks(:) ! Exner at the surface
+  REAL,POINTER,SAVE :: pk(:,:) ! Exner at mid-layer
+  REAL,POINTER,SAVE :: pkf(:,:) ! filtered Exner
+  REAL,POINTER,SAVE :: phi(:,:) ! geopotential
+  REAL,POINTER,SAVE :: w(:,:) ! vertical velocity
+  REAL,POINTER,SAVE :: pbaru(:,:)
+  REAL,POINTER,SAVE :: pbarv(:,:)
+  REAL,POINTER,SAVE :: vcovm1(:,:)
+  REAL,POINTER,SAVE :: ucovm1(:,:)
+  REAL,POINTER,SAVE :: tetam1(:,:)
+  REAL,POINTER,SAVE :: psm1(:)
+  REAL,POINTER,SAVE :: massem1(:,:)
+  REAL,POINTER,SAVE :: dv(:,:)
+  REAL,POINTER,SAVE :: du(:,:)
+  REAL,POINTER,SAVE :: dteta(:,:)
+  REAL,POINTER,SAVE :: dp(:)
+  REAL,POINTER,SAVE :: dq(:,:,:)
+  REAL,POINTER,SAVE :: finvmaold(:,:)
+  REAL,POINTER,SAVE :: flxw(:,:)
+  REAL,POINTER,SAVE :: unat(:,:)
+  REAL,POINTER,SAVE :: vnat(:,:)
+ 
+
+  
+CONTAINS
+
+  SUBROUTINE leapfrog_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE dimensions_mod
+  USE infotrac
+  USE caldyn_mod,ONLY : caldyn_allocate
+  USE integrd_mod,ONLY : integrd_allocate
+  USE caladvtrac_mod,ONLY : caladvtrac_allocate
+  USE call_calfis_mod,ONLY : call_calfis_allocate
+  USE call_dissip_mod, ONLY : call_dissip_allocate
+  IMPLICIT NONE
+  TYPE(distrib),POINTER :: d
+
+
+    d=>distrib_caldyn
+    CALL allocate_u(ucov,llm,d)
+    CALL allocate_v(vcov,llm,d)
+    CALL allocate_u(teta,llm,d)
+    CALL allocate_u(ps,d)
+    CALL allocate_u(masse,llm,d)
+    CALL allocate_u(phis,d)
+    CALL allocate_u(q,llm,nqtot,d)
+    CALL allocate_u(p,llmp1,d)
+    CALL allocate_u(pks,d)
+    CALL allocate_u(pk,llm,d)
+    CALL allocate_u(pkf,llm,d)
+    CALL allocate_u(phi,llm,d)
+    CALL allocate_u(w,llm,d)
+    CALL allocate_u(pbaru,llm,d)
+    CALL allocate_v(pbarv,llm,d)
+    CALL allocate_v(vcovm1,llm,d)
+    CALL allocate_u(ucovm1,llm,d)
+    CALL allocate_u(tetam1,llm,d)
+    CALL allocate_u(psm1,d)
+    CALL allocate_u(massem1,llm,d)
+    CALL allocate_v(dv,llm,d)
+    CALL allocate_u(du,llm,d)
+    CALL allocate_u(dteta,llm,d)
+    CALL allocate_u(dp,d)
+    CALL allocate_u(dq,llm,nqtot,d)
+    CALL allocate_u(finvmaold,llm,d)
+    CALL allocate_u(flxw,llm,d)
+    CALL allocate_u(unat,llm,d)
+    CALL allocate_v(vnat,llm,d)
+    
+    CALL caldyn_allocate
+    CALL integrd_allocate
+    CALL caladvtrac_allocate
+    CALL call_calfis_allocate
+    CALL call_dissip_allocate
+        
+  END SUBROUTINE leapfrog_allocate
+  
+  SUBROUTINE leapfrog_switch_caldyn(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  USE caldyn_mod,ONLY : caldyn_switch_caldyn
+  USE integrd_mod,ONLY : integrd_switch_caldyn
+  USE caladvtrac_mod,ONLY : caladvtrac_switch_caldyn
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+
+    CALL switch_u(ucov,distrib_caldyn,dist)
+    CALL switch_v(vcov,distrib_caldyn,dist)
+    CALL switch_u(teta,distrib_caldyn,dist)
+    CALL switch_u(ps,distrib_caldyn,dist)
+    CALL switch_u(masse,distrib_caldyn,dist)
+    CALL switch_u(phis,distrib_caldyn,dist,up=halo_max,down=halo_max)
+    CALL switch_u(q,distrib_caldyn,dist)
+    CALL switch_u(p,distrib_caldyn,dist)
+    CALL switch_u(pks,distrib_caldyn,dist)
+    CALL switch_u(pk,distrib_caldyn,dist)
+    CALL switch_u(pkf,distrib_caldyn,dist)
+    CALL switch_u(phi,distrib_caldyn,dist)
+    CALL switch_u(w,distrib_caldyn,dist)
+    CALL switch_u(pbaru,distrib_caldyn,dist)
+    CALL switch_v(pbarv,distrib_caldyn,dist)
+    CALL switch_v(vcovm1,distrib_caldyn,dist)
+    CALL switch_u(ucovm1,distrib_caldyn,dist)
+    CALL switch_u(tetam1,distrib_caldyn,dist)
+    CALL switch_u(psm1,distrib_caldyn,dist)
+    CALL switch_u(massem1,distrib_caldyn,dist)
+    CALL switch_v(dv,distrib_caldyn,dist)
+    CALL switch_u(du,distrib_caldyn,dist)
+    CALL switch_u(dteta,distrib_caldyn,dist)
+    CALL switch_u(dp,distrib_caldyn,dist)
+    CALL switch_u(dq,distrib_caldyn,dist)
+    CALL switch_u(finvmaold,distrib_caldyn,dist)
+    CALL switch_u(flxw,distrib_caldyn,dist)
+    CALL switch_u(unat,distrib_caldyn,dist)
+    CALL switch_v(vnat,distrib_caldyn,dist)
+
+    
+    CALL caldyn_switch_caldyn(dist)
+    CALL integrd_switch_caldyn(dist)
+    CALL caladvtrac_switch_caldyn(dist)
+    
+  END SUBROUTINE leapfrog_switch_caldyn
+  
+  SUBROUTINE leapfrog_switch_dissip(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  USE call_dissip_mod,ONLY : call_dissip_switch_dissip
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+
+    CALL call_dissip_switch_dissip(dist)
+    
+  END SUBROUTINE leapfrog_switch_dissip
+  
+END MODULE leapfrog_mod  
+
+
+
+
+
+
+
Index: LMDZ6/trunk/libf/dyn3dmem/logic_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/logic_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,48 +1,0 @@
-!
-! $Id: $
-!
-MODULE logic_mod
-
-IMPLICIT NONE
-
-  LOGICAL purmats ! true if time stepping is purely Matsuno scheme
-                  ! false implies Matsuno-Leapfrog time stepping scheme
-  LOGICAL forward ! true if during forward phase of Matsuno step
-  LOGICAL leapf ! true if during a leapfrog time stepping step
-  LOGICAL apphys ! true if during a time step when physics will be called
-  LOGICAL statcl
-  LOGICAL conser
-  LOGICAL apdiss ! true if during a time step when dissipation will be called
-  LOGICAL apdelq
-  LOGICAL saison
-  LOGICAL ecripar
-  LOGICAL fxyhypb ! true if using hyperbolic function discretization
-                  ! for latitudinal grid 
-  LOGICAL ysinus ! true if using sine function discretiation
-                 ! for latitudinal grid
-  LOGICAL read_start ! true if reading a start.nc file to initialize fields
-  LOGICAL ok_guide ! true if nudging
-  LOGICAL ok_strato
-  LOGICAL ok_gradsfile
-  LOGICAL ok_limit  ! true for boundary conditions file creation (limit.nc)
-  LOGICAL ok_etat0  ! true for initial states creation (start.nc, startphy.nc)
-  LOGICAL read_orop ! true for sub-cell scales orographic params read in file
-  LOGICAL hybrid ! vertical coordinate is hybrid if true (sigma otherwise)
-                 ! (only used if disvert_type==2)
-  LOGICAL adv_qsat_liq ! true if qsat is calculated alwats wrt liquid for
-                       ! adapted Van Leer advection scheme
-  INTEGER iflag_phys ! type of physics to call: 0 none, 1: phy*** package,
-                     ! 2: Held & Suarez, 101-200: aquaplanets & terraplanets
-  INTEGER iflag_trac
-
-!$OMP THREADPRIVATE(purmats,forward,leapf,apphys,statcl,conser, &
-!$OMP     apdiss,apdelq,saison,ecripar,fxyhypb,ysinus, &
-!$OMP     read_start,ok_guide,ok_strato,ok_gradsfile, &
-!$OMP     ok_limit,ok_etat0,hybrid, adv_qsat_liq)
-!$OMP THREADPRIVATE(iflag_phys,iflag_trac)
-
-!WARNING: when adding a threadprivate variable in this module
-!        do not forget to add it to the copyin clause when opening an OpenMP
-!        parallel section. e.g. in gcm before call leapfrog_loc 
-
-END MODULE logic_mod
Index: LMDZ6/trunk/libf/dyn3dmem/logic_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/logic_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/logic_mod.f90	(revision 5268)
@@ -0,0 +1,48 @@
+!
+! $Id: $
+!
+MODULE logic_mod
+
+IMPLICIT NONE
+
+  LOGICAL purmats ! true if time stepping is purely Matsuno scheme
+                  ! false implies Matsuno-Leapfrog time stepping scheme
+  LOGICAL forward ! true if during forward phase of Matsuno step
+  LOGICAL leapf ! true if during a leapfrog time stepping step
+  LOGICAL apphys ! true if during a time step when physics will be called
+  LOGICAL statcl
+  LOGICAL conser
+  LOGICAL apdiss ! true if during a time step when dissipation will be called
+  LOGICAL apdelq
+  LOGICAL saison
+  LOGICAL ecripar
+  LOGICAL fxyhypb ! true if using hyperbolic function discretization
+                  ! for latitudinal grid 
+  LOGICAL ysinus ! true if using sine function discretiation
+                 ! for latitudinal grid
+  LOGICAL read_start ! true if reading a start.nc file to initialize fields
+  LOGICAL ok_guide ! true if nudging
+  LOGICAL ok_strato
+  LOGICAL ok_gradsfile
+  LOGICAL ok_limit  ! true for boundary conditions file creation (limit.nc)
+  LOGICAL ok_etat0  ! true for initial states creation (start.nc, startphy.nc)
+  LOGICAL read_orop ! true for sub-cell scales orographic params read in file
+  LOGICAL hybrid ! vertical coordinate is hybrid if true (sigma otherwise)
+                 ! (only used if disvert_type==2)
+  LOGICAL adv_qsat_liq ! true if qsat is calculated alwats wrt liquid for
+                       ! adapted Van Leer advection scheme
+  INTEGER iflag_phys ! type of physics to call: 0 none, 1: phy*** package,
+                     ! 2: Held & Suarez, 101-200: aquaplanets & terraplanets
+  INTEGER iflag_trac
+
+!$OMP THREADPRIVATE(purmats,forward,leapf,apphys,statcl,conser, &
+!$OMP     apdiss,apdelq,saison,ecripar,fxyhypb,ysinus, &
+!$OMP     read_start,ok_guide,ok_strato,ok_gradsfile, &
+!$OMP     ok_limit,ok_etat0,hybrid, adv_qsat_liq)
+!$OMP THREADPRIVATE(iflag_phys,iflag_trac)
+
+!WARNING: when adding a threadprivate variable in this module
+!        do not forget to add it to the copyin clause when opening an OpenMP
+!        parallel section. e.g. in gcm before call leapfrog_loc 
+
+END MODULE logic_mod
Index: LMDZ6/trunk/libf/dyn3dmem/massbar_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/massbar_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,76 +1,0 @@
-SUBROUTINE massbar_loc(masse,massebx,masseby)
-!
-!-------------------------------------------------------------------------------
-! Authors: P. Le Van , Fr. Hourdin.
-!-------------------------------------------------------------------------------
-! Purpose: Compute air mass mean along X and Y in each cell.
-! See iniconst for more details.
-  USE parallel_lmdz
-  IMPLICIT NONE
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-!===============================================================================
-! Arguments:
-  REAL, INTENT(IN)  :: masse  (ijb_u:ije_u,llm)
-  REAL, INTENT(OUT) :: massebx(ijb_u:ije_u,llm)
-  REAL, INTENT(OUT) :: masseby(ijb_v:ije_v,llm)
-!-------------------------------------------------------------------------------
-! Method used. Each scalar point is associated to 4 area coefficients:
-!    * alpha1(i,j) at point ( i+1/4,j-1/4 )
-!    * alpha2(i,j) at point ( i+1/4,j+1/4 )
-!    * alpha3(i,j) at point ( i-1/4,j+1/4 )
-!    * alpha4(i,j) at point ( i-1/4,j-1/4 )
-! where alpha1(i,j) = aire(i+1/4,j-1/4)/ aire(i,j)
-!
-!   alpha4 .         . alpha1    . alpha4
-!    (i,j)             (i,j)       (i+1,j)
-!
-!             P .        U .          . P
-!           (i,j)       (i,j)         (i+1,j)
-!
-!   alpha3 .         . alpha2    .alpha3 
-!    (i,j)              (i,j)     (i+1,j)
-!
-!             V .        Z .          . V
-!           (i,j)
-!
-!   alpha4 .         . alpha1    .alpha4
-!   (i,j+1)            (i,j+1)   (i+1,j+1) 
-!
-!             P .        U .          . P
-!          (i,j+1)                    (i+1,j+1)
-!
-!
-!    massebx(i,j) = masse(i  ,j) * ( alpha1(i  ,j) + alpha2(i,j))   +
-!                   masse(i+1,j) * ( alpha3(i+1,j) + alpha4(i+1,j) )
-!     localized at point  ... U (i,j) ...
-!
-!    masseby(i,j) = masse(i,j  ) * ( alpha2(i,j  ) + alpha3(i,j  )  +
-!                   masse(i,j+1) * ( alpha1(i,j+1) + alpha4(i,j+1)  
-!     localized at point  ... V (i,j) ...
-!===============================================================================
-! Local variables:
-  INTEGER :: ij, l, ijb, ije
-!===============================================================================
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)  
-  DO l=1,llm
-    ijb=ij_begin
-    ije=ij_end+iip1
-    IF(pole_sud) ije=ije-iip1
-    DO ij=ijb,ije-1
-      massebx(ij,l)=masse(ij,l)*alpha1p2(ij)+masse(ij+1   ,l)*alpha3p4(ij+1)
-    END DO
-    DO ij=ijb+iim,ije+iim,iip1; massebx(ij,l)=massebx(ij-iim,l); END DO
-    ijb=ij_begin-iip1
-    ije=ij_end+iip1
-    IF(pole_nord) ijb=ij_begin
-    IF(pole_sud) ije=ij_end-iip1
-    DO ij=ijb,ije
-      masseby(ij,l)=masse(ij,l)*alpha2p3(ij)+masse(ij+iip1,l)*alpha1p4(ij+iip1)
-    END DO
-  END DO
-!$OMP END DO NOWAIT
-
-END SUBROUTINE massbar_loc
-
Index: LMDZ6/trunk/libf/dyn3dmem/massbar_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/massbar_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/massbar_loc.f90	(revision 5268)
@@ -0,0 +1,76 @@
+SUBROUTINE massbar_loc(masse,massebx,masseby)
+!
+!-------------------------------------------------------------------------------
+! Authors: P. Le Van , Fr. Hourdin.
+!-------------------------------------------------------------------------------
+! Purpose: Compute air mass mean along X and Y in each cell.
+! See iniconst for more details.
+  USE parallel_lmdz
+  IMPLICIT NONE
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+!===============================================================================
+! Arguments:
+  REAL, INTENT(IN)  :: masse  (ijb_u:ije_u,llm)
+  REAL, INTENT(OUT) :: massebx(ijb_u:ije_u,llm)
+  REAL, INTENT(OUT) :: masseby(ijb_v:ije_v,llm)
+!-------------------------------------------------------------------------------
+! Method used. Each scalar point is associated to 4 area coefficients:
+!    * alpha1(i,j) at point ( i+1/4,j-1/4 )
+!    * alpha2(i,j) at point ( i+1/4,j+1/4 )
+!    * alpha3(i,j) at point ( i-1/4,j+1/4 )
+!    * alpha4(i,j) at point ( i-1/4,j-1/4 )
+! where alpha1(i,j) = aire(i+1/4,j-1/4)/ aire(i,j)
+!
+!   alpha4 .         . alpha1    . alpha4
+!    (i,j)             (i,j)       (i+1,j)
+!
+!             P .        U .          . P
+!           (i,j)       (i,j)         (i+1,j)
+!
+!   alpha3 .         . alpha2    .alpha3 
+!    (i,j)              (i,j)     (i+1,j)
+!
+!             V .        Z .          . V
+!           (i,j)
+!
+!   alpha4 .         . alpha1    .alpha4
+!   (i,j+1)            (i,j+1)   (i+1,j+1) 
+!
+!             P .        U .          . P
+!          (i,j+1)                    (i+1,j+1)
+!
+!
+!    massebx(i,j) = masse(i  ,j) * ( alpha1(i  ,j) + alpha2(i,j))   +
+!                   masse(i+1,j) * ( alpha3(i+1,j) + alpha4(i+1,j) )
+!     localized at point  ... U (i,j) ...
+!
+!    masseby(i,j) = masse(i,j  ) * ( alpha2(i,j  ) + alpha3(i,j  )  +
+!                   masse(i,j+1) * ( alpha1(i,j+1) + alpha4(i,j+1)  
+!     localized at point  ... V (i,j) ...
+!===============================================================================
+! Local variables:
+  INTEGER :: ij, l, ijb, ije
+!===============================================================================
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)  
+  DO l=1,llm
+    ijb=ij_begin
+    ije=ij_end+iip1
+    IF(pole_sud) ije=ije-iip1
+    DO ij=ijb,ije-1
+      massebx(ij,l)=masse(ij,l)*alpha1p2(ij)+masse(ij+1   ,l)*alpha3p4(ij+1)
+    END DO
+    DO ij=ijb+iim,ije+iim,iip1; massebx(ij,l)=massebx(ij-iim,l); END DO
+    ijb=ij_begin-iip1
+    ije=ij_end+iip1
+    IF(pole_nord) ijb=ij_begin
+    IF(pole_sud) ije=ij_end-iip1
+    DO ij=ijb,ije
+      masseby(ij,l)=masse(ij,l)*alpha2p3(ij)+masse(ij+iip1,l)*alpha1p4(ij+iip1)
+    END DO
+  END DO
+!$OMP END DO NOWAIT
+
+END SUBROUTINE massbar_loc
+
Index: LMDZ6/trunk/libf/dyn3dmem/massbarxy_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/massbarxy_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,38 +1,0 @@
-SUBROUTINE massbarxy_loc(masse,massebxy)
-!
-!-------------------------------------------------------------------------------
-! Authors: P. Le Van , Fr. Hourdin.
-!-------------------------------------------------------------------------------
-! Purpose: Compute air mass mean along X and Y in each cell.
-! See iniconst for more details.
-  USE parallel_lmdz
-  IMPLICIT NONE
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-!===============================================================================
-! Arguments:
-  REAL, INTENT(IN)  :: masse   (ijb_u:ije_u,llm)
-  REAL, INTENT(OUT) :: massebxy(ijb_v:ije_v,llm)
-!===============================================================================
-! Local variables:
-  INTEGER :: ij, l, ijb, ije
-!===============================================================================
-  ijb=ij_begin-iip1
-  ije=ij_end
-  IF(pole_nord) ijb=ijb+iip1
-  IF(pole_sud)  ije=ije-iip1
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)    
-  DO l=1,llm
-    DO ij=ijb,ije-1
-      massebxy(ij,l)=masse(ij     ,l)*alpha2(ij     ) + &
-     +               masse(ij+1   ,l)*alpha3(ij+1   ) + &
-     +               masse(ij+iip1,l)*alpha1(ij+iip1) + &
-     +               masse(ij+iip2,l)*alpha4(ij+iip2)
-    END DO
-    DO ij=ijb+iip1-1,ije+iip1-1,iip1; massebxy(ij,l)=massebxy(ij-iim,l); END DO
-  END DO
-!$OMP END DO NOWAIT
-
-END SUBROUTINE massbarxy_loc
-
Index: LMDZ6/trunk/libf/dyn3dmem/massbarxy_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/massbarxy_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/massbarxy_loc.f90	(revision 5268)
@@ -0,0 +1,38 @@
+SUBROUTINE massbarxy_loc(masse,massebxy)
+!
+!-------------------------------------------------------------------------------
+! Authors: P. Le Van , Fr. Hourdin.
+!-------------------------------------------------------------------------------
+! Purpose: Compute air mass mean along X and Y in each cell.
+! See iniconst for more details.
+  USE parallel_lmdz
+  IMPLICIT NONE
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+!===============================================================================
+! Arguments:
+  REAL, INTENT(IN)  :: masse   (ijb_u:ije_u,llm)
+  REAL, INTENT(OUT) :: massebxy(ijb_v:ije_v,llm)
+!===============================================================================
+! Local variables:
+  INTEGER :: ij, l, ijb, ije
+!===============================================================================
+  ijb=ij_begin-iip1
+  ije=ij_end
+  IF(pole_nord) ijb=ijb+iip1
+  IF(pole_sud)  ije=ije-iip1
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)    
+  DO l=1,llm
+    DO ij=ijb,ije-1
+      massebxy(ij,l)=masse(ij     ,l)*alpha2(ij     ) + &
+     +               masse(ij+1   ,l)*alpha3(ij+1   ) + &
+     +               masse(ij+iip1,l)*alpha1(ij+iip1) + &
+     +               masse(ij+iip2,l)*alpha4(ij+iip2)
+    END DO
+    DO ij=ijb+iip1-1,ije+iip1-1,iip1; massebxy(ij,l)=massebxy(ij-iim,l); END DO
+  END DO
+!$OMP END DO NOWAIT
+
+END SUBROUTINE massbarxy_loc
+
Index: LMDZ6/trunk/libf/dyn3dmem/mod_hallo.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/mod_hallo.F90	(revision 5267)
+++ 	(revision )
@@ -1,1863 +1,0 @@
-module mod_Hallo
-USE parallel_lmdz
-implicit none
-  logical,save :: use_mpi_alloc
-  integer, parameter :: MaxProc=512
-  integer, parameter :: DefaultMaxBufferSize=1024*1024*100
-  integer, SAVE :: MaxBufferSize=0
-  integer, parameter :: ListSize=1000
-  
-  integer,save       :: MaxBufferSize_Used
-!$OMP THREADPRIVATE( MaxBufferSize_Used)
-
-   real,save,pointer,dimension(:) :: Buffer
-!$OMP THREADPRIVATE(Buffer)
-
-   integer,save,dimension(Listsize) :: Buffer_Pos
-   integer,save :: Index_Pos
-!$OMP THREADPRIVATE(Buffer_Pos,Index_pos)
-   
-  type Hallo
-    real, dimension(:,:),pointer :: Field
-    integer :: offset
-    integer :: size
-    integer :: NbLevel
-    integer :: Stride
-  end type Hallo
-  
-  type request_SR
-    integer :: NbRequest=0
-    integer :: NbRequestMax=0
-    integer :: BufferSize
-    integer :: Pos
-    integer :: Index 
-    type(Hallo), POINTER :: Hallo(:)
-    integer :: MSG_Request
-  end type request_SR
-
-  type request
-    type(request_SR),dimension(0:MaxProc-1) :: RequestSend
-    type(request_SR),dimension(0:MaxProc-1) :: RequestRecv
-    integer :: tag=1
-  end type request
-  
-   TYPE(distrib),SAVE :: distrib_gather
-
-
-  INTERFACE Register_SwapField_u
-    MODULE PROCEDURE Register_SwapField1d_u,Register_SwapField2d_u1d,Register_SwapField3d_u, &
-                     Register_SwapField1d_u_bis,Register_SwapField2d_u1d_bis,Register_SwapField3d_u_bis
-  END INTERFACE Register_SwapField_u
-
-  INTERFACE Register_SwapField_v
-    MODULE PROCEDURE Register_SwapField1d_v,Register_SwapField2d_v1d,Register_SwapField3d_v,&
-                     Register_SwapField1d_v_bis,Register_SwapField2d_v1d_bis,Register_SwapField3d_v_bis
-  END INTERFACE Register_SwapField_v
-
-  INTERFACE Register_SwapField2d_u
-    MODULE PROCEDURE Register_SwapField1d_u2d,Register_SwapField2d_u2d,Register_SwapField3d_u2d, &
-                     Register_SwapField1d_u2d_bis,Register_SwapField2d_u2d_bis,Register_SwapField3d_u2d_bis
-  END INTERFACE Register_SwapField2d_u
-
-  INTERFACE Register_SwapField2d_v
-    MODULE PROCEDURE Register_SwapField1d_v2d,Register_SwapField2d_v2d,Register_SwapField3d_v2d, &
-                     Register_SwapField1d_v2d_bis,Register_SwapField2d_v2d_bis,Register_SwapField3d_v2d_bis
-  END INTERFACE Register_SwapField2d_v
-
-  contains
-
-  subroutine Init_mod_hallo
-  USE dimensions_mod
-  USE IOIPSL
-    implicit none
-    integer :: jj_nb_gather(0:mpi_size-1)
-    
-    Index_Pos=1
-    Buffer_Pos(Index_Pos)=1
-    MaxBufferSize_Used=0
-!$OMP MASTER     
-    MaxBufferSize=DefaultMaxBufferSize
-    CALL getin("mpi_buffer_size",MaxBufferSize)
-!$OMP END MASTER
-!$OMP BARRIER
-    
-    IF (use_mpi_alloc .AND. using_mpi) THEN
-      CALL create_global_mpi_buffer
-    ELSE 
-      CALL create_standard_mpi_buffer
-    ENDIF
-     
-!$OMP MASTER     
-     jj_nb_gather(:)=0
-     jj_nb_gather(0)=jjp1
-     
-     CALL create_distrib(jj_nb_gather,distrib_gather) 
-!$OMP END MASTER
-!$OMP BARRIER
-
-  end subroutine init_mod_hallo
-
-  SUBROUTINE create_standard_mpi_buffer
-  IMPLICIT NONE
-    
-    ALLOCATE(Buffer(MaxBufferSize))
-    
-  END SUBROUTINE create_standard_mpi_buffer
-  
-  SUBROUTINE create_global_mpi_buffer
-  USE lmdz_mpi
-  IMPLICIT NONE
-    POINTER (Pbuffer,MPI_Buffer(MaxBufferSize))
-    REAL :: MPI_Buffer
-    INTEGER(KIND=MPI_ADDRESS_KIND) :: BS 
-    INTEGER :: i,ierr
-
-!  Allocation du buffer MPI
-      Bs=8*MaxBufferSize
-!$OMP CRITICAL (MPI)
-      CALL MPI_ALLOC_MEM(BS,MPI_INFO_NULL,Pbuffer,ierr)
-!$OMP END CRITICAL (MPI)
-      DO i=1,MaxBufferSize
-	MPI_Buffer(i)=i
-      ENDDO
-     
-      CALL  Associate_buffer(MPI_Buffer)
-      
-  CONTAINS
-     
-     SUBROUTINE Associate_buffer(MPI_Buffer)
-     IMPLICIT NONE
-       REAL,DIMENSION(:),target :: MPI_Buffer  
-
-         Buffer=>MPI_Buffer
- 
-      END SUBROUTINE  Associate_buffer
-                                      
-  END SUBROUTINE create_global_mpi_buffer
- 
-      
-  subroutine allocate_buffer(Size,Index,Pos)
-  implicit none
-    integer :: Size
-    integer :: Index
-    integer :: Pos
-
-    if (Buffer_pos(Index_pos)+Size>MaxBufferSize_Used) MaxBufferSize_Used=Buffer_pos(Index_pos)+Size  
-    if (Buffer_pos(Index_pos)+Size>MaxBufferSize) then
-      print *,'STOP :: La taille de MaxBufferSize dans mod_hallo.F90 est trop petite !!!!'
-      CALL abort_gcm("mod_hallo","stopped",1)
-    endif
-    
-    if (Index_pos>=ListSize) then
-      print *,'STOP :: La taille de ListSize dans mod_hallo.F90 est trop petite !!!!'
-      CALL abort_gcm("mod_hallo","stopped",1)
-    endif
-     
-    Pos=Buffer_Pos(Index_Pos)
-    Buffer_Pos(Index_pos+1)=Buffer_Pos(Index_Pos)+Size
-    Index_Pos=Index_Pos+1
-    Index=Index_Pos
-    
-  end subroutine allocate_buffer
-     
-  subroutine deallocate_buffer(Index)
-  implicit none
-    integer :: Index
-    
-    Buffer_Pos(Index)=-1
-    
-    do while (Buffer_Pos(Index_Pos)==-1 .and. Index_Pos>1)
-      Index_Pos=Index_Pos-1
-    end do
-
-  end subroutine deallocate_buffer  
-  
-  subroutine SetTag(a_request,tag)
-  implicit none
-    type(request):: a_request
-    integer :: tag
-    
-    a_request%tag=tag
-  end subroutine SetTag
-  
-  
-  subroutine New_Hallo(Field,Stride,NbLevel,offset,size,Ptr_request)
-    integer :: Stride
-    integer :: NbLevel
-    integer :: size
-    integer :: offset
-    real, dimension(Stride,NbLevel),target :: Field
-    type(request_SR),pointer :: Ptr_request
-    type(Hallo),POINTER :: NewHallos(:),HalloSwitch(:), NewHallo
-    
-    Ptr_Request%NbRequest=Ptr_Request%NbRequest+1
-    IF(Ptr_Request%NbRequestMax==0) THEN
-       Ptr_Request%NbRequestMax=10
-       ALLOCATE(Ptr_Request%Hallo(Ptr_Request%NbRequestMax))
-    ELSE IF ( Ptr_Request%NbRequest > Ptr_Request%NbRequestMax) THEN
-      Ptr_Request%NbRequestMax=INT(Ptr_Request%NbRequestMax*1.2)
-      ALLOCATE(NewHallos(Ptr_Request%NbRequestMax))
-      NewHallos(1:Ptr_Request%NbRequest-1)=Ptr_Request%hallo(1:Ptr_Request%NbRequest-1)
-      HalloSwitch=>Ptr_Request%hallo
-      Ptr_Request%hallo=>NewHallos
-      DEALLOCATE(HalloSwitch)
-    ENDIF
-    
-    NewHallo=>Ptr_Request%hallo(Ptr_Request%NbRequest)
-          
-    NewHallo%Field=>Field
-    NewHallo%Stride=Stride
-    NewHallo%NbLevel=NbLevel
-    NewHallo%size=size
-    NewHallo%offset=offset
-    
-  end subroutine New_Hallo
-  
-  subroutine Register_SendField(Field,ij,ll,offset,size,target,a_request)
-  USE dimensions_mod
-  implicit none
-
-    
-      INTEGER :: ij,ll,offset,size,target
-      REAL, dimension(ij,ll) :: Field
-      type(request),target :: a_request
-      type(request_SR),pointer :: Ptr_request
-
-      Ptr_Request=>a_request%RequestSend(target)
-
-      call New_Hallo(Field,ij,ll,offset,size,Ptr_request)
-      
-   end subroutine Register_SendField      
-      
-  subroutine Register_RecvField(Field,ij,ll,offset,size,target,a_request)
-  USE dimensions_mod
-  implicit none
-
-   
-      INTEGER :: ij,ll,offset,size,target
-      REAL, dimension(ij,ll) :: Field
-      type(request),target :: a_request
-      type(request_SR),pointer :: Ptr_request
-
-      Ptr_Request=>a_request%RequestRecv(target)
-            
-      call New_Hallo(Field,ij,ll,offset,size,Ptr_request)
-
-      
-   end subroutine Register_RecvField      
-  
-  subroutine Register_SwapField(FieldS,FieldR,ij,ll,jj_Nb_New,a_request)
-  USE dimensions_mod
-      implicit none
-
-    
-    INTEGER :: ij,ll
-    REAL, dimension(ij,ll) :: FieldS
-    REAL, dimension(ij,ll) :: FieldR
-    type(request) :: a_request
-    integer,dimension(0:MPI_Size-1) :: jj_Nb_New   
-    integer,dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
-    
-    integer ::i,jje,jjb
-    
-    jj_begin_New(0)=1
-    jj_End_New(0)=jj_Nb_New(0)
-    do i=1,MPI_Size-1
-      jj_begin_New(i)=jj_end_New(i-1)+1
-      jj_end_New(i)=jj_begin_new(i)+jj_Nb_New(i)-1
-    enddo
-    
-    do i=0,MPI_Size-1
-      if (i /= MPI_Rank) then
-        jjb=max(jj_begin_new(i),jj_begin)
-        jje=min(jj_end_new(i),jj_end)
-        
-        if (ij==ip1jm .and. jje==jjp1) jje=jjm
-        
-        if (jje >= jjb) then
-          call Register_SendField(FieldS,ij,ll,jjb,jje-jjb+1,i,a_request) 
-        endif
-        
-        jjb=max(jj_begin_new(MPI_Rank),jj_begin_Para(i))
-        jje=min(jj_end_new(MPI_Rank),jj_end_Para(i))
-        
-        if (ij==ip1jm .and. jje==jjp1) jje=jjm
-        
-        if (jje >= jjb) then
-          call Register_RecvField(FieldR,ij,ll,jjb,jje-jjb+1,i,a_request) 
-        endif
-        
-      endif
-    enddo
-    
-  end subroutine Register_SwapField    
-  
-
-  
-  subroutine Register_SwapFieldHallo(FieldS,FieldR,ij,ll,jj_Nb_New,Up,Down,a_request)
-  USE dimensions_mod
-  
-      implicit none
-    
-    INTEGER :: ij,ll,Up,Down
-    REAL, dimension(ij,ll) :: FieldS
-    REAL, dimension(ij,ll) :: FieldR
-    type(request) :: a_request
-    integer,dimension(0:MPI_Size-1) :: jj_Nb_New   
-    integer,dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
-    
-    integer ::i,jje,jjb
-    
-    jj_begin_New(0)=1
-    jj_End_New(0)=jj_Nb_New(0)
-    do i=1,MPI_Size-1
-      jj_begin_New(i)=jj_end_New(i-1)+1
-      jj_end_New(i)=jj_begin_new(i)+jj_Nb_New(i)-1
-    enddo
-    
-    do i=0,MPI_Size-1
-      jj_begin_New(i)=max(1,jj_begin_New(i)-Up)
-      jj_end_New(i)=min(jjp1,jj_end_new(i)+Down)
-    enddo
-   
-    do i=0,MPI_Size-1
-      if (i /= MPI_Rank) then
-        jjb=max(jj_begin_new(i),jj_begin)
-        jje=min(jj_end_new(i),jj_end)
-        
-        if (ij==ip1jm .and. jje==jjp1) jje=jjm
-        
-        if (jje >= jjb) then
-          call Register_SendField(FieldS,ij,ll,jjb,jje-jjb+1,i,a_request) 
-        endif
-        
-        jjb=max(jj_begin_new(MPI_Rank),jj_begin_Para(i))
-        jje=min(jj_end_new(MPI_Rank),jj_end_Para(i))
-        
-        if (ij==ip1jm .and. jje==jjp1) jje=jjm
-        
-        if (jje >= jjb) then
-          call Register_RecvField(FieldR,ij,ll,jjb,jje-jjb+1,i,a_request) 
-        endif
-        
-      endif
-    enddo
-    
-  end subroutine Register_SwapFieldHallo
-
-
-
-  SUBROUTINE Register_SwapField1d_u(FieldS,FieldR,new_dist,a_request,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    REAL, DIMENSION(current_dist%ijb_u:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%ijb_u:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-
-    CALL  Register_SwapField_gen_u(FieldS,FieldR,1,current_dist,new_dist,halo_up,halo_down,a_request)
-        
-  END SUBROUTINE  Register_SwapField1d_u 
-
-  SUBROUTINE Register_SwapField1d_u_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    TYPE(distrib),INTENT(IN)          :: old_dist
-    REAL, DIMENSION(old_dist%ijb_u:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%ijb_u:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-
-    CALL  Register_SwapField_gen_u(FieldS,FieldR,1,old_dist,new_dist,halo_up,halo_down,a_request)
-        
-  END SUBROUTINE  Register_SwapField1d_u_bis 
-
-
-  SUBROUTINE Register_SwapField2d_u1d(FieldS,FieldR,new_dist,a_request,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-    IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    REAL, DIMENSION(current_dist%ijb_u:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%ijb_u:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,2)
-    
-    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField2d_u1d
-
-  SUBROUTINE Register_SwapField2d_u1d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-    IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    TYPE(distrib),INTENT(IN) :: old_dist
-    REAL, DIMENSION(old_dist%ijb_u:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%ijb_u:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,2)
-    
-    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField2d_u1d_bis
-   
-
-  SUBROUTINE Register_SwapField3d_u(FieldS,FieldR,new_dist,a_request,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    REAL, DIMENSION(current_dist%ijb_u:,:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%ijb_u:,:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,2)*size(FieldS,3)
-    
-    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField3d_u 
-
-  SUBROUTINE Register_SwapField3d_u_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    TYPE(distrib),INTENT(IN) :: old_dist
-    REAL, DIMENSION(old_dist%ijb_u:,:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%ijb_u:,:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,2)*size(FieldS,3)
-    
-    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField3d_u_bis 
-  
-
-
- SUBROUTINE Register_SwapField1d_u2d(FieldS,FieldR,new_dist,a_request,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-
-      IMPLICIT NONE
-
-    TYPE(distrib),INTENT(IN)          :: new_dist !LF
-    REAL, DIMENSION(current_dist%jjb_u:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%jjb_u:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-
-    CALL  Register_SwapField_gen_u(FieldS,FieldR,1,current_dist,new_dist,halo_up,halo_down,a_request)
-        
-  END SUBROUTINE  Register_SwapField1d_u2d 
-
- SUBROUTINE Register_SwapField1d_u2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-
-      IMPLICIT NONE
-
-    TYPE(distrib),INTENT(IN)          :: new_dist !LF
-    TYPE(distrib),INTENT(IN)          :: old_dist
-    REAL, DIMENSION(old_dist%jjb_u:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%jjb_u:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-
-    CALL  Register_SwapField_gen_u(FieldS,FieldR,1,old_dist,new_dist,halo_up,halo_down,a_request)
-        
-  END SUBROUTINE  Register_SwapField1d_u2d_bis 
-
-
-  SUBROUTINE Register_SwapField2d_u2d(FieldS,FieldR,new_dist,a_request,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    REAL, DIMENSION(current_dist%jjb_u:,:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%jjb_u:,:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,3)
-    
-    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField2d_u2d
-
-  SUBROUTINE Register_SwapField2d_u2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    TYPE(distrib),INTENT(IN) :: old_dist
-    REAL, DIMENSION(old_dist%jjb_u:,:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%jjb_u:,:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,3)
-    
-    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField2d_u2d_bis
-   
-
-  SUBROUTINE Register_SwapField3d_u2d(FieldS,FieldR,new_dist,a_request,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    REAL, DIMENSION(current_dist%jjb_u:,:,:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%jjb_u:,:,:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,3)*size(FieldS,4)
-    
-    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField3d_u2d 
-
-  SUBROUTINE Register_SwapField3d_u2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    TYPE(distrib),INTENT(IN) :: old_dist
-    REAL, DIMENSION(old_dist%jjb_u:,:,:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%jjb_u:,:,:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,3)*size(FieldS,4)
-    
-    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField3d_u2d_bis 
-
-
-
-
-
-
-
-  SUBROUTINE Register_SwapField1d_v(FieldS,FieldR,new_dist,a_request,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    REAL, DIMENSION(current_dist%ijb_v:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%ijb_v:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-
-    CALL  Register_SwapField_gen_v(FieldS,FieldR,1,current_dist,new_dist,halo_up,halo_down,a_request)
-        
-  END SUBROUTINE  Register_SwapField1d_v 
-
-  SUBROUTINE Register_SwapField1d_v_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    TYPE(distrib),INTENT(IN) :: old_dist
-    REAL, DIMENSION(old_dist%ijb_v:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%ijb_v:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-
-    CALL  Register_SwapField_gen_v(FieldS,FieldR,1,old_dist,new_dist,halo_up,halo_down,a_request)
-        
-  END SUBROUTINE  Register_SwapField1d_v_bis 
-
-
-  SUBROUTINE Register_SwapField2d_v1d(FieldS,FieldR,new_dist,a_request,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-   
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    REAL, DIMENSION(current_dist%ijb_v:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%ijb_v:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,2)
-    
-    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField2d_v1d
-  
-  SUBROUTINE Register_SwapField2d_v1d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-   
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    TYPE(distrib),INTENT(IN)          :: old_dist
-    REAL, DIMENSION(old_dist%ijb_v:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%ijb_v:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,2)
-    
-    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField2d_v1d_bis
-  
-   
-
-  SUBROUTINE Register_SwapField3d_v(FieldS,FieldR,new_dist,a_request,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    REAL, DIMENSION(current_dist%ijb_v:,:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%ijb_v:,:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,2)*size(FieldS,3)
-    
-    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField3d_v 
-
-  SUBROUTINE Register_SwapField3d_v_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    TYPE(distrib),INTENT(IN) :: old_dist
-    REAL, DIMENSION(old_dist%ijb_v:,:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%ijb_v:,:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,2)*size(FieldS,3)
-    
-    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField3d_v_bis 
-
-
-
-
-  SUBROUTINE Register_SwapField1d_v2d(FieldS,FieldR,new_dist,a_request,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist !LF
-    REAL, DIMENSION(current_dist%jjb_v:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%jjb_v:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-
-    CALL  Register_SwapField_gen_v(FieldS,FieldR,1,current_dist,new_dist,halo_up,halo_down,a_request)
-        
-  END SUBROUTINE  Register_SwapField1d_v2d
-
-  SUBROUTINE Register_SwapField1d_v2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist !LF
-    TYPE(distrib),INTENT(IN) :: old_dist
-    REAL, DIMENSION(old_dist%jjb_v:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%jjb_v:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-
-    CALL  Register_SwapField_gen_v(FieldS,FieldR,1,old_dist,new_dist,halo_up,halo_down,a_request)
-        
-  END SUBROUTINE  Register_SwapField1d_v2d_bis
-
-
-  SUBROUTINE Register_SwapField2d_v2d(FieldS,FieldR,new_dist,a_request,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    REAL, DIMENSION(current_dist%jjb_v:,:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%jjb_v:,:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,3)
-    
-    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField2d_v2d
-   
-  SUBROUTINE Register_SwapField2d_v2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    TYPE(distrib),INTENT(IN) :: old_dist
-    REAL, DIMENSION(old_dist%jjb_v:,:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%jjb_v:,:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,3)
-    
-    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField2d_v2d_bis
-   
-
-  SUBROUTINE Register_SwapField3d_v2d(FieldS,FieldR,new_dist,a_request,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    REAL, DIMENSION(current_dist%jjb_v:,:,:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%jjb_v:,:,:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,3)*size(FieldS,4)
-    
-    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField3d_v2d 
-  
-  SUBROUTINE Register_SwapField3d_v2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-    
-    TYPE(distrib),INTENT(IN)          :: new_dist
-    TYPE(distrib),INTENT(IN) :: old_dist
-    REAL, DIMENSION(old_dist%jjb_v:,:,:,:),INTENT(IN)     :: FieldS
-    REAL, DIMENSION(new_dist%jjb_v:,:,:,:),INTENT(OUT)    :: FieldR
-    INTEGER,OPTIONAL,INTENT(IN)       :: up
-    INTEGER,OPTIONAL,INTENT(IN)       :: down      
-    TYPE(request),INTENT(INOUT)         :: a_request
-
-    INTEGER                           :: halo_up
-    INTEGER                           :: halo_down
-    INTEGER                           :: ll
-        
-    
-    halo_up=0
-    halo_down=0
-    IF (PRESENT(up))   halo_up=up
-    IF (PRESENT(down)) halo_down=down
-    
-    ll=size(FieldS,3)*size(FieldS,4)
-    
-    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
-    
-  END SUBROUTINE  Register_SwapField3d_v2d_bis 
-  
-  
-
-  SUBROUTINE Register_SwapField_gen_u(FieldS,FieldR,ll,old_dist,new_dist,Up,Down,a_request)
-  USE parallel_lmdz
-  USE dimensions_mod
-      IMPLICIT NONE
-   
-    INTEGER :: ll,Up,Down
-    TYPE(distrib)  :: old_dist
-    TYPE(distrib)  :: new_dist
-    REAL, DIMENSION(old_dist%ijb_u:old_dist%ije_u,ll) :: FieldS
-    REAL, DIMENSION(new_dist%ijb_u:new_dist%ije_u,ll) :: FieldR
-    TYPE(request) :: a_request
-    INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Nb_New   
-    INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
-    
-    INTEGER ::i,l,jje,jjb,ijb,ije
-    
-    DO i=0,MPI_Size-1
-      jj_begin_New(i)=max(1,new_dist%jj_begin_para(i)-Up)
-      jj_end_New(i)=min(jjp1,new_dist%jj_end_para(i)+Down)
-    ENDDO
-   
-    DO i=0,MPI_Size-1
-      IF (i /= MPI_Rank) THEN
-        jjb=max(jj_begin_new(i),old_dist%jj_begin)
-        jje=min(jj_end_new(i),old_dist%jj_end)
-        
-        IF (jje >= jjb) THEN
-          CALL Register_SendField(FieldS,old_dist%ijnb_u,ll,jjb-old_dist%jjb_u+1,jje-jjb+1,i,a_request) 
-        ENDIF
-        
-        jjb=max(jj_begin_new(MPI_Rank),old_dist%jj_begin_Para(i))
-        jje=min(jj_end_new(MPI_Rank),old_dist%jj_end_Para(i))
-        
-        IF (jje >= jjb) THEN
-          CALL Register_RecvField(FieldR,new_dist%ijnb_u,ll,jjb-new_dist%jjb_u+1,jje-jjb+1,i,a_request) 
-        ENDIF
-      ELSE
-        jjb=max(jj_begin_new(i),old_dist%jj_begin)
-        jje=min(jj_end_new(i),old_dist%jj_end)
-        ijb=(jjb-1)*iip1+1
-        ije=jje*iip1
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)           
-        DO l=1,ll
-          FieldR(ijb:ije,l)=FieldS(ijb:ije,l)              
-        ENDDO
-!$OMP END DO NOWAIT
-      ENDIF
-    ENDDO
-    
-  END SUBROUTINE Register_SwapField_gen_u
-
-
-
-  SUBROUTINE Register_SwapField_gen_v(FieldS,FieldR,ll,old_dist,new_dist,Up,Down,a_request)
-  USE parallel_lmdz
-  USE dimensions_mod
-    IMPLICIT NONE
-    
-    INTEGER :: ll,Up,Down
-    TYPE(distrib)  :: old_dist
-    TYPE(distrib)  :: new_dist
-    REAL, DIMENSION(old_dist%ijb_v:old_dist%ije_v,ll) :: FieldS
-    REAL, DIMENSION(new_dist%ijb_v:new_dist%ije_v,ll) :: FieldR
-    TYPE(request) :: a_request
-    INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Nb_New   
-    INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
-    
-    INTEGER ::i,l,jje,jjb,ijb,ije
-    
-    DO i=0,MPI_Size-1
-      jj_begin_New(i)=max(1,new_dist%jj_begin_para(i)-Up)
-      jj_end_New(i)=min(jjp1,new_dist%jj_end_para(i)+Down)
-    ENDDO
-   
-    DO i=0,MPI_Size-1
-      IF (i /= MPI_Rank) THEN
-        jjb=max(jj_begin_new(i),old_dist%jj_begin)
-        jje=min(jj_end_new(i),old_dist%jj_end)
-
-        IF (jje==jjp1) jje=jjm        
-
-        IF (jje >= jjb) THEN
-          CALL Register_SendField(FieldS,old_dist%ijnb_v,ll,jjb-old_dist%jjb_v+1,jje-jjb+1,i,a_request) 
-        ENDIF
-        
-        jjb=max(jj_begin_new(MPI_Rank),old_dist%jj_begin_Para(i))
-        jje=min(jj_end_new(MPI_Rank),old_dist%jj_end_Para(i))
-
-        IF (jje==jjp1) jje=jjm
-        
-        IF (jje >= jjb) THEN
-          CALL Register_RecvField(FieldR,new_dist%ijnb_v,ll,jjb-new_dist%jjb_v+1,jje-jjb+1,i,a_request) 
-        ENDIF
-      ELSE
-        jjb=max(jj_begin_new(i),old_dist%jj_begin)
-        jje=min(jj_end_new(i),old_dist%jj_end)
-        IF (jje==jjp1) jje=jjm
-        ijb=(jjb-1)*iip1+1
-        ije=jje*iip1
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)           
-        DO l=1,ll
-          FieldR(ijb:ije,l)=FieldS(ijb:ije,l)
-        ENDDO              
-!$OMP END DO NOWAIT
-      ENDIF
-    ENDDO
-    
-  END SUBROUTINE Register_SwapField_gen_v
-
-
- 
-
-  
-  subroutine Register_Hallo(Field,ij,ll,RUp,Rdown,SUp,SDown,a_request)
-  USE dimensions_mod
-  USE lmdz_mpi
-      implicit none
-
-      INTEGER :: ij,ll
-      REAL, dimension(ij,ll) :: Field
-      INTEGER :: Sup,Sdown,rup,rdown
-      type(request) :: a_request
-      type(Hallo),pointer :: PtrHallo
-      LOGICAL :: SendUp,SendDown
-      LOGICAL :: RecvUp,RecvDown
-   
- 
-      SendUp=.TRUE.
-      SendDown=.TRUE.
-      RecvUp=.TRUE.
-      RecvDown=.TRUE.
-        
-      IF (pole_nord) THEN
-        SendUp=.FALSE.
-        RecvUp=.FALSE.
-      ENDIF
-  
-      IF (pole_sud) THEN
-        SendDown=.FALSE.
-        RecvDown=.FALSE.
-      ENDIF
-      
-      if (Sup.eq.0) then
-        SendUp=.FALSE.
-       endif
-      
-      if (Sdown.eq.0) then
-        SendDown=.FALSE.
-      endif
-
-      if (Rup.eq.0) then
-        RecvUp=.FALSE.
-      endif
-      
-      if (Rdown.eq.0) then
-        RecvDown=.FALSE.
-      endif
-      
-      IF (SendUp) THEN
-        call Register_SendField(Field,ij,ll,jj_begin,SUp,MPI_Rank-1,a_request)
-      ENDIF
-  
-      IF (SendDown) THEN
-        call Register_SendField(Field,ij,ll,jj_end-SDown+1,SDown,MPI_Rank+1,a_request)
-      ENDIF
-    
-  
-      IF (RecvUp) THEN
-        call Register_RecvField(Field,ij,ll,jj_begin-Rup,RUp,MPI_Rank-1,a_request)
-      ENDIF
-  
-      IF (RecvDown) THEN
-        call Register_RecvField(Field,ij,ll,jj_end+1,RDown,MPI_Rank+1,a_request)
-      ENDIF
-  
-    end subroutine Register_Hallo
-
-
-  subroutine Register_Hallo_u(Field,ll,RUp,Rdown,SUp,SDown,a_request)
-  USE dimensions_mod
-  USE lmdz_mpi
-      implicit none
-      INTEGER :: ll
-      REAL, dimension(ijb_u:ije_u,ll) :: Field
-      INTEGER :: Sup,Sdown,rup,rdown
-      type(request) :: a_request
-      type(Hallo),pointer :: PtrHallo
-      LOGICAL :: SendUp,SendDown
-      LOGICAL :: RecvUp,RecvDown
-   
- 
-      SendUp=.TRUE.
-      SendDown=.TRUE.
-      RecvUp=.TRUE.
-      RecvDown=.TRUE.
-        
-      IF (pole_nord) THEN
-        SendUp=.FALSE.
-        RecvUp=.FALSE.
-      ENDIF
-  
-      IF (pole_sud) THEN
-        SendDown=.FALSE.
-        RecvDown=.FALSE.
-      ENDIF
-      
-      if (Sup.eq.0) then
-        SendUp=.FALSE.
-       endif
-      
-      if (Sdown.eq.0) then
-        SendDown=.FALSE.
-      endif
-
-      if (Rup.eq.0) then
-        RecvUp=.FALSE.
-      endif
-      
-      if (Rdown.eq.0) then
-        RecvDown=.FALSE.
-      endif
-      
-      IF (SendUp) THEN
-        call Register_SendField(Field,ijnb_u,ll,jj_begin-jjb_u+1,SUp,MPI_Rank-1,a_request)
-      ENDIF
-  
-      IF (SendDown) THEN
-        call Register_SendField(Field,ijnb_u,ll,jj_end-SDown+1-jjb_u+1,SDown,MPI_Rank+1,a_request)
-      ENDIF
-    
-  
-      IF (RecvUp) THEN
-        call Register_RecvField(Field,ijnb_u,ll,jj_begin-Rup-jjb_u+1,RUp,MPI_Rank-1,a_request)
-      ENDIF
-  
-      IF (RecvDown) THEN
-        call Register_RecvField(Field,ijnb_u,ll,jj_end+1-jjb_u+1,RDown,MPI_Rank+1,a_request)
-      ENDIF
-  
-    end subroutine Register_Hallo_u
-
-  subroutine Register_Hallo_v(Field,ll,RUp,Rdown,SUp,SDown,a_request)
-  USE dimensions_mod
-  USE lmdz_mpi
-      implicit none
-      INTEGER :: ll
-      REAL, dimension(ijb_v:ije_v,ll) :: Field
-      INTEGER :: Sup,Sdown,rup,rdown
-      type(request) :: a_request
-      type(Hallo),pointer :: PtrHallo
-      LOGICAL :: SendUp,SendDown
-      LOGICAL :: RecvUp,RecvDown
-   
- 
-      SendUp=.TRUE.
-      SendDown=.TRUE.
-      RecvUp=.TRUE.
-      RecvDown=.TRUE.
-        
-      IF (pole_nord) THEN
-        SendUp=.FALSE.
-        RecvUp=.FALSE.
-      ENDIF
-  
-      IF (pole_sud) THEN
-        SendDown=.FALSE.
-        RecvDown=.FALSE.
-      ENDIF
-      
-      if (Sup.eq.0) then
-        SendUp=.FALSE.
-       endif
-      
-      if (Sdown.eq.0) then
-        SendDown=.FALSE.
-      endif
-
-      if (Rup.eq.0) then
-        RecvUp=.FALSE.
-      endif
-      
-      if (Rdown.eq.0) then
-        RecvDown=.FALSE.
-      endif
-      
-      IF (SendUp) THEN
-        call Register_SendField(Field,ijnb_v,ll,jj_begin-jjb_v+1,SUp,MPI_Rank-1,a_request)
-      ENDIF
-  
-      IF (SendDown) THEN
-        call Register_SendField(Field,ijnb_v,ll,jj_end-SDown+1-jjb_v+1,SDown,MPI_Rank+1,a_request)
-      ENDIF
-    
-  
-      IF (RecvUp) THEN
-        call Register_RecvField(Field,ijnb_v,ll,jj_begin-Rup-jjb_v+1,RUp,MPI_Rank-1,a_request)
-      ENDIF
-  
-      IF (RecvDown) THEN
-        call Register_RecvField(Field,ijnb_v,ll,jj_end+1-jjb_v+1,RDown,MPI_Rank+1,a_request)
-      ENDIF
-  
-    end subroutine Register_Hallo_v
-    
-    subroutine SendRequest(a_Request)
-    USE dimensions_mod
-    USE lmdz_mpi
-      implicit none
-
-      type(request),target :: a_request
-      type(request_SR),pointer :: Req
-      type(Hallo),pointer :: PtrHallo
-      integer :: SizeBuffer
-      integer :: i,rank,l,ij,Pos,ierr
-      integer :: offset
-      real,dimension(:,:),pointer :: Field
-      integer :: Nb
-       
-      do rank=0,MPI_SIZE-1
-      
-        Req=>a_Request%RequestSend(rank)
-        
-        SizeBuffer=0
-        do i=1,Req%NbRequest
-          PtrHallo=>Req%Hallo(i)
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 
-          DO l=1,PtrHallo%NbLevel
-            SizeBuffer=SizeBuffer+PtrHallo%size*iip1
-          ENDDO
-!$OMP ENDDO NOWAIT          
-        enddo
-      
-         Req%BufferSize=SizeBuffer
-         if (Req%NbRequest>0) then
-       
-          call allocate_buffer(SizeBuffer,Req%Index,Req%pos)
-
-          Pos=Req%Pos
-          do i=1,Req%NbRequest
-            PtrHallo=>Req%Hallo(i)
-            offset=(PtrHallo%offset-1)*iip1+1
-            Nb=iip1*PtrHallo%size-1
-            Field=>PtrHallo%Field
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)           
-            do l=1,PtrHallo%NbLevel
-!cdir NODEP
-              do ij=0,Nb
-	        Buffer(Pos+ij)=Field(Offset+ij,l)
-	      enddo
-              
-              Pos=Pos+Nb+1
-            enddo
-!$OMP END DO NOWAIT            
-          enddo
-    
-         if (SizeBuffer>0) then
-!$OMP CRITICAL (MPI)
-         
-         call MPI_ISEND(Buffer(req%Pos),SizeBuffer,MPI_REAL_LMDZ,rank,a_request%tag+1000*omp_rank,     &
-                         COMM_LMDZ,Req%MSG_Request,ierr)
-         IF (.NOT.using_mpi) THEN
-           PRINT *,'Erreur, echange MPI en mode sequentiel !!!'
-           CALL abort_gcm("mod_hallo","stopped",1)
-         ENDIF
-!         PRINT *,"-------------------------------------------------------------------"
-!         PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->"
-!         PRINT *,"Requete envoye au proc :",rank,"tag :",a_request%tag+1000*omp_rank
-!         PRINT *,"Taille du message :",SizeBuffer,"requete no :",Req%MSG_Request
-!         PRINT *,"-------------------------------------------------------------------"
-!$OMP END CRITICAL (MPI)
-        endif
-       endif
-    enddo
-   
-           
-      do rank=0,MPI_SIZE-1
-         
-          Req=>a_Request%RequestRecv(rank)
-          SizeBuffer=0
-          
-	  do i=1,Req%NbRequest
-            PtrHallo=>Req%Hallo(i)
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 
-            DO l=1,PtrHallo%NbLevel
-              SizeBuffer=SizeBuffer+PtrHallo%size*iip1
-            ENDDO
-!$OMP ENDDO NOWAIT          
-          enddo
-          
-          Req%BufferSize=SizeBuffer
-          
-          if (Req%NbRequest>0) then
-          call allocate_buffer(SizeBuffer,Req%Index,Req%Pos)
-   
-          if (SizeBuffer>0) then
-
-!$OMP CRITICAL (MPI)
-
-             call MPI_IRECV(Buffer(Req%Pos),SizeBuffer,MPI_REAL_LMDZ,rank,a_request%tag+1000*omp_rank,     &
-                           COMM_LMDZ,Req%MSG_Request,ierr)
-
-             IF (.NOT.using_mpi) THEN
-               PRINT *,'Erreur, echange MPI en mode sequentiel !!!'
-               CALL abort_gcm("mod_hallo","stopped",1)
-             ENDIF
-
-!         PRINT *,"-------------------------------------------------------------------"
-!         PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->"
-!         PRINT *,"Requete en attente du proc :",rank,"tag :",a_request%tag+1000*omp_rank
-!         PRINT *,"Taille du message :",SizeBuffer,"requete no :",Req%MSG_Request
-!         PRINT *,"-------------------------------------------------------------------"
-
-!$OMP END CRITICAL (MPI)
-          endif
-        endif
-      
-      enddo
-                        
-   end subroutine SendRequest 
-   
-   subroutine WaitRequest(a_Request)
-   USE dimensions_mod
-   USE lmdz_mpi
-   implicit none
-      
-      type(request),target :: a_request
-      type(request_SR),pointer :: Req
-      type(Hallo),pointer :: PtrHallo
-      integer, dimension(2*mpi_size) :: TabRequest
-      integer, dimension(MPI_STATUS_SIZE,2*mpi_size) :: TabStatus
-      integer :: NbRequest
-      integer :: i,rank,pos,ij,l,ierr
-      integer :: offset
-      integer :: Nb
-      
-      
-      NbRequest=0
-      do rank=0,MPI_SIZE-1
-        Req=>a_request%RequestSend(rank)
-        if (Req%NbRequest>0 .AND. Req%BufferSize > 0) then
-          NbRequest=NbRequest+1
-          TabRequest(NbRequest)=Req%MSG_Request
-        endif
-      enddo
-      
-      do rank=0,MPI_SIZE-1
-        Req=>a_request%RequestRecv(rank)
-        if (Req%NbRequest>0 .AND. Req%BufferSize > 0 ) then
-          NbRequest=NbRequest+1
-          TabRequest(NbRequest)=Req%MSG_Request
-        endif
-      enddo
-     
-      if (NbRequest>0) then
-!$OMP CRITICAL (MPI)
-!        PRINT *,"-------------------------------------------------------------------"
-!        PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"en attente"
-!        PRINT *,"No des requetes :",TabRequest(1:NbRequest)
-        call MPI_WAITALL(NbRequest,TabRequest,TabStatus,ierr)
-!        PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"complete"
-!        PRINT *,"-------------------------------------------------------------------"
-!$OMP END CRITICAL (MPI)
-      endif
-      do rank=0,MPI_Size-1
-        Req=>a_request%RequestRecv(rank)
-        if (Req%NbRequest>0) then
-          Pos=Req%Pos
-          do i=1,Req%NbRequest
-            PtrHallo=>Req%Hallo(i)
-            offset=(PtrHallo%offset-1)*iip1+1
-	    Nb=iip1*PtrHallo%size-1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)            
-	    do l=1,PtrHallo%NbLevel
-!cdir NODEP
-              do ij=0,Nb
-	        PtrHallo%Field(offset+ij,l)=Buffer(Pos+ij)
-	      enddo
-
-              Pos=Pos+Nb+1
-	    enddo
-!$OMP ENDDO NOWAIT	    
-          enddo
-        endif
-      enddo
-      
-      do rank=0,MPI_SIZE-1
-        Req=>a_request%RequestSend(rank)
-        if (Req%NbRequest>0) then
-          call deallocate_buffer(Req%Index)
-          Req%NbRequest=0 
-        endif
-      enddo
-              
-      do rank=0,MPI_SIZE-1
-        Req=>a_request%RequestRecv(rank)
-        if (Req%NbRequest>0) then
-          call deallocate_buffer(Req%Index)
-          Req%NbRequest=0 
-        endif
-      enddo
-     
-      a_request%tag=1
-    end subroutine WaitRequest
-     
-   subroutine WaitSendRequest(a_Request)
-   USE lmdz_mpi
-   USE dimensions_mod
-   implicit none
-   
-      type(request),target :: a_request
-      type(request_SR),pointer :: Req
-      type(Hallo),pointer :: PtrHallo
-      integer, dimension(mpi_size) :: TabRequest
-      integer, dimension(MPI_STATUS_SIZE,mpi_size) :: TabStatus
-      integer :: NbRequest
-      integer :: i,rank,pos,ij,l,ierr
-      integer :: offset
-      
-      
-      NbRequest=0
-      do rank=0,MPI_SIZE-1
-        Req=>a_request%RequestSend(rank)
-        if (Req%NbRequest>0) then
-          NbRequest=NbRequest+1
-          TabRequest(NbRequest)=Req%MSG_Request
-        endif
-      enddo
-      
-
-      if (NbRequest>0 .AND. Req%BufferSize > 0 ) THEN 
-!$OMP CRITICAL (MPI)     
-!        PRINT *,"-------------------------------------------------------------------"
-!        PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"en attente"
-!        PRINT *,"No des requetes :",TabRequest(1:NbRequest)
-         call MPI_WAITALL(NbRequest,TabRequest,TabStatus,ierr)
-!        PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"complete"
-!        PRINT *,"-------------------------------------------------------------------"
-
-!$OMP END CRITICAL (MPI)
-      endif      
-      
-      do rank=0,MPI_SIZE-1
-        Req=>a_request%RequestSend(rank)
-        if (Req%NbRequest>0) then
-          call deallocate_buffer(Req%Index)
-          Req%NbRequest=0 
-        endif
-      enddo
-              
-      a_request%tag=1
-    end subroutine WaitSendRequest
-    
-   subroutine WaitRecvRequest(a_Request)
-   USE dimensions_mod
-   USE lmdz_mpi
-   implicit none
-      type(request),target :: a_request
-      type(request_SR),pointer :: Req
-      type(Hallo),pointer :: PtrHallo
-      integer, dimension(mpi_size) :: TabRequest
-      integer, dimension(MPI_STATUS_SIZE,mpi_size) :: TabStatus
-      integer :: NbRequest
-      integer :: i,rank,pos,ij,l,ierr
-      integer :: offset,Nb
-      
-      
-      NbRequest=0
-      
-      do rank=0,MPI_SIZE-1
-        Req=>a_request%RequestRecv(rank)
-        if (Req%NbRequest>0 .AND. Req%BufferSize > 0 ) then
-          NbRequest=NbRequest+1
-          TabRequest(NbRequest)=Req%MSG_Request
-        endif
-      enddo
-     
-      
-      if (NbRequest>0) then
-!$OMP CRITICAL (MPI)     
-!        PRINT *,"-------------------------------------------------------------------"
-!        PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"en attente"
-!        PRINT *,"No des requetes :",TabRequest(1:NbRequest)
-         call MPI_WAITALL(NbRequest,TabRequest,TabStatus,ierr)
-!        PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"complete"
-!        PRINT *,"-------------------------------------------------------------------"
-!$OMP END CRITICAL (MPI)     
-      endif
-      
-      do rank=0,MPI_Size-1
-        Req=>a_request%RequestRecv(rank)
-        if (Req%NbRequest>0) then
-          Pos=Req%Pos
-          do i=1,Req%NbRequest
-            PtrHallo=>Req%Hallo(i)
-            offset=(PtrHallo%offset-1)*iip1+1
-	    Nb=iip1*PtrHallo%size-1
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)            
-	    do l=1,PtrHallo%NbLevel
-!cdir NODEP
-              do ij=0,Nb
-	        PtrHallo%Field(offset+ij,l)=Buffer(Pos+ij)
-	      enddo
-                 Pos=Pos+Nb+1
-            enddo
-!$OMP END DO NOWAIT
-          enddo
-        endif
-      enddo
-      
-           
-      do rank=0,MPI_SIZE-1
-        Req=>a_request%RequestRecv(rank)
-        if (Req%NbRequest>0) then
-          call deallocate_buffer(Req%Index)
-          Req%NbRequest=0 
-        endif
-      enddo
-     
-      a_request%tag=1
-    end subroutine WaitRecvRequest
-    
-    
-    
-    subroutine CopyField(FieldS,FieldR,ij,ll,jj_Nb_New)
-    USE dimensions_mod
-  
-      implicit none
-    
-    INTEGER :: ij,ll,l
-    REAL, dimension(ij,ll) :: FieldS
-    REAL, dimension(ij,ll) :: FieldR
-    integer,dimension(0:MPI_Size-1) :: jj_Nb_New   
-    integer,dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
-    
-    integer ::i,jje,jjb,ijb,ije
-    
-    jj_begin_New(0)=1
-    jj_End_New(0)=jj_Nb_New(0)
-    do i=1,MPI_Size-1
-      jj_begin_New(i)=jj_end_New(i-1)+1
-      jj_end_New(i)=jj_begin_new(i)+jj_Nb_New(i)-1
-    enddo
-    
-    jjb=max(jj_begin,jj_begin_new(MPI_Rank))
-    jje=min(jj_end,jj_end_new(MPI_Rank))
-    if (ij==ip1jm) jje=min(jje,jjm)
-
-    if (jje >= jjb) then
-      ijb=(jjb-1)*iip1+1
-      ije=jje*iip1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-      do l=1,ll
-        FieldR(ijb:ije,l)=FieldS(ijb:ije,l)
-      enddo
-!$OMP ENDDO NOWAIT
-    endif
-
-
-  end subroutine CopyField    
-
-  subroutine CopyFieldHallo(FieldS,FieldR,ij,ll,jj_Nb_New,Up,Down)
-  USE dimensions_mod
-  
-      implicit none
-    
-    INTEGER :: ij,ll,Up,Down
-    REAL, dimension(ij,ll) :: FieldS
-    REAL, dimension(ij,ll) :: FieldR
-    integer,dimension(0:MPI_Size-1) :: jj_Nb_New   
-    integer,dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
-
-    integer ::i,jje,jjb,ijb,ije,l
-
-     
-    jj_begin_New(0)=1
-    jj_End_New(0)=jj_Nb_New(0)
-    do i=1,MPI_Size-1
-      jj_begin_New(i)=jj_end_New(i-1)+1
-      jj_end_New(i)=jj_begin_new(i)+jj_Nb_New(i)-1
-    enddo
-
-        
-    jjb=max(jj_begin,jj_begin_new(MPI_Rank)-Up)
-    jje=min(jj_end,jj_end_new(MPI_Rank)+Down)
-    if (ij==ip1jm) jje=min(jje,jjm)
-    
-    
-    if (jje >= jjb) then
-      ijb=(jjb-1)*iip1+1
-      ije=jje*iip1
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-      do l=1,ll
-        FieldR(ijb:ije,l)=FieldS(ijb:ije,l)
-      enddo
-!$OMP ENDDO NOWAIT
-
-    endif
-   end subroutine CopyFieldHallo        
-
-   subroutine Gather_field_u(field_loc,field_glo,ll)
-   USE dimensions_mod
-   implicit none
-     integer :: ll
-     real :: field_loc(ijb_u:ije_u,ll)
-     real :: field_glo(ip1jmp1,ll)
-     type(request) :: request_gather
-     integer       :: l
-
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-     DO l=1,ll
-       field_glo(ij_begin:ij_end,l)=field_loc(ij_begin:ij_end,l)
-     ENDDO
-     
-     call register_SwapField(field_glo,field_glo,ip1jmp1,ll,distrib_gather%jj_nb_para,request_gather)
-     call SendRequest(request_gather)
-!$OMP BARRIER
-     call WaitRequest(request_gather)       
-!$OMP BARRIER
-
-    end subroutine Gather_field_u
-        
-   subroutine Gather_field_v(field_loc,field_glo,ll)
-   USE dimensions_mod
-   implicit none
-     integer :: ll
-     real :: field_loc(ijb_v:ije_v,ll)
-     real :: field_glo(ip1jm,ll)
-     type(request) :: request_gather
-     integer :: ijb,ije
-     integer       :: l
-     
-   
-     ijb=ij_begin
-     ije=ij_end
-     if (pole_sud) ije=ij_end-iip1
-        
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-     DO l=1,ll
-       field_glo(ijb:ije,l)=field_loc(ijb:ije,l)
-     ENDDO
-     
-     call register_SwapField(field_glo,field_glo,ip1jm,ll,distrib_gather%jj_nb_para,request_gather)
-     call SendRequest(request_gather)
-!$OMP BARRIER
-     call WaitRequest(request_gather)       
-!$OMP BARRIER
-
-    end subroutine Gather_field_v
-     
-   subroutine Scatter_field_u(field_glo,field_loc,ll)
-   USE dimensions_mod
-   implicit none
-     integer :: ll
-     real :: field_glo(ip1jmp1,ll)
-     real :: field_loc(ijb_u:ije_u,ll)
-     type(request) :: request_gather
-     TYPE(distrib) :: distrib_swap
-     integer       :: l
-     
-!$OMP BARRIER
-!$OMP MASTER     
-     call get_current_distrib(distrib_swap)
-     call set_Distrib(distrib_gather)
-!$OMP END MASTER
-!$OMP BARRIER
- 
-     call register_SwapField(field_glo,field_glo,ip1jmp1,ll,distrib_swap%jj_nb_para,request_gather)
-     call SendRequest(request_gather)
-!$OMP BARRIER
-     call WaitRequest(request_gather)       
-!$OMP BARRIER
-!$OMP MASTER     
-     call set_Distrib(distrib_swap)
-!$OMP END MASTER
-!$OMP BARRIER
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-       DO l=1,ll
-         field_loc(ij_begin:ij_end,l)=field_glo(ij_begin:ij_end,l)
-       ENDDO
-
-    end subroutine Scatter_field_u
-
-   subroutine Scatter_field_v(field_glo,field_loc,ll)
-   USE dimensions_mod
-   implicit none
-     integer :: ll
-     real :: field_glo(ip1jmp1,ll)
-     real :: field_loc(ijb_v:ije_v,ll)
-     type(request) :: request_gather
-     TYPE(distrib) :: distrib_swap
-     integer       :: ijb,ije,l
-     
-
-!$OMP BARRIER
-!$OMP MASTER     
-     call get_current_distrib(distrib_swap)
-     call set_Distrib(distrib_gather)
-!$OMP END MASTER
-!$OMP BARRIER
-     call register_SwapField(field_glo,field_glo,ip1jm,ll,distrib_swap%jj_nb_para,request_gather)
-     call SendRequest(request_gather)
-!$OMP BARRIER
-     call WaitRequest(request_gather)       
-!$OMP BARRIER
-!$OMP MASTER
-     call set_Distrib(distrib_swap)
-!$OMP END MASTER
-!$OMP BARRIER
-     ijb=ij_begin
-     ije=ij_end
-     if (pole_sud) ije=ij_end-iip1
-     
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-       DO l=1,ll
-         field_loc(ijb:ije,l)=field_glo(ijb:ije,l)
-       ENDDO
-
-    end subroutine Scatter_field_v
-              
-end module mod_Hallo 
-   
Index: LMDZ6/trunk/libf/dyn3dmem/mod_hallo.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/mod_hallo.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/mod_hallo.f90	(revision 5268)
@@ -0,0 +1,1863 @@
+module mod_Hallo
+USE parallel_lmdz
+implicit none
+  logical,save :: use_mpi_alloc
+  integer, parameter :: MaxProc=512
+  integer, parameter :: DefaultMaxBufferSize=1024*1024*100
+  integer, SAVE :: MaxBufferSize=0
+  integer, parameter :: ListSize=1000
+  
+  integer,save       :: MaxBufferSize_Used
+!$OMP THREADPRIVATE( MaxBufferSize_Used)
+
+   real,save,pointer,dimension(:) :: Buffer
+!$OMP THREADPRIVATE(Buffer)
+
+   integer,save,dimension(Listsize) :: Buffer_Pos
+   integer,save :: Index_Pos
+!$OMP THREADPRIVATE(Buffer_Pos,Index_pos)
+   
+  type Hallo
+    real, dimension(:,:),pointer :: Field
+    integer :: offset
+    integer :: size
+    integer :: NbLevel
+    integer :: Stride
+  end type Hallo
+  
+  type request_SR
+    integer :: NbRequest=0
+    integer :: NbRequestMax=0
+    integer :: BufferSize
+    integer :: Pos
+    integer :: Index 
+    type(Hallo), POINTER :: Hallo(:)
+    integer :: MSG_Request
+  end type request_SR
+
+  type request
+    type(request_SR),dimension(0:MaxProc-1) :: RequestSend
+    type(request_SR),dimension(0:MaxProc-1) :: RequestRecv
+    integer :: tag=1
+  end type request
+  
+   TYPE(distrib),SAVE :: distrib_gather
+
+
+  INTERFACE Register_SwapField_u
+    MODULE PROCEDURE Register_SwapField1d_u,Register_SwapField2d_u1d,Register_SwapField3d_u, &
+                     Register_SwapField1d_u_bis,Register_SwapField2d_u1d_bis,Register_SwapField3d_u_bis
+  END INTERFACE Register_SwapField_u
+
+  INTERFACE Register_SwapField_v
+    MODULE PROCEDURE Register_SwapField1d_v,Register_SwapField2d_v1d,Register_SwapField3d_v,&
+                     Register_SwapField1d_v_bis,Register_SwapField2d_v1d_bis,Register_SwapField3d_v_bis
+  END INTERFACE Register_SwapField_v
+
+  INTERFACE Register_SwapField2d_u
+    MODULE PROCEDURE Register_SwapField1d_u2d,Register_SwapField2d_u2d,Register_SwapField3d_u2d, &
+                     Register_SwapField1d_u2d_bis,Register_SwapField2d_u2d_bis,Register_SwapField3d_u2d_bis
+  END INTERFACE Register_SwapField2d_u
+
+  INTERFACE Register_SwapField2d_v
+    MODULE PROCEDURE Register_SwapField1d_v2d,Register_SwapField2d_v2d,Register_SwapField3d_v2d, &
+                     Register_SwapField1d_v2d_bis,Register_SwapField2d_v2d_bis,Register_SwapField3d_v2d_bis
+  END INTERFACE Register_SwapField2d_v
+
+  contains
+
+  subroutine Init_mod_hallo
+  USE dimensions_mod
+  USE IOIPSL
+    implicit none
+    integer :: jj_nb_gather(0:mpi_size-1)
+    
+    Index_Pos=1
+    Buffer_Pos(Index_Pos)=1
+    MaxBufferSize_Used=0
+!$OMP MASTER     
+    MaxBufferSize=DefaultMaxBufferSize
+    CALL getin("mpi_buffer_size",MaxBufferSize)
+!$OMP END MASTER
+!$OMP BARRIER
+    
+    IF (use_mpi_alloc .AND. using_mpi) THEN
+      CALL create_global_mpi_buffer
+    ELSE 
+      CALL create_standard_mpi_buffer
+    ENDIF
+     
+!$OMP MASTER     
+     jj_nb_gather(:)=0
+     jj_nb_gather(0)=jjp1
+     
+     CALL create_distrib(jj_nb_gather,distrib_gather) 
+!$OMP END MASTER
+!$OMP BARRIER
+
+  end subroutine init_mod_hallo
+
+  SUBROUTINE create_standard_mpi_buffer
+  IMPLICIT NONE
+    
+    ALLOCATE(Buffer(MaxBufferSize))
+    
+  END SUBROUTINE create_standard_mpi_buffer
+  
+  SUBROUTINE create_global_mpi_buffer
+  USE lmdz_mpi
+  IMPLICIT NONE
+    POINTER (Pbuffer,MPI_Buffer(MaxBufferSize))
+    REAL :: MPI_Buffer
+    INTEGER(KIND=MPI_ADDRESS_KIND) :: BS 
+    INTEGER :: i,ierr
+
+!  Allocation du buffer MPI
+      Bs=8*MaxBufferSize
+!$OMP CRITICAL (MPI)
+      CALL MPI_ALLOC_MEM(BS,MPI_INFO_NULL,Pbuffer,ierr)
+!$OMP END CRITICAL (MPI)
+      DO i=1,MaxBufferSize
+	MPI_Buffer(i)=i
+      ENDDO
+     
+      CALL  Associate_buffer(MPI_Buffer)
+      
+  CONTAINS
+     
+     SUBROUTINE Associate_buffer(MPI_Buffer)
+     IMPLICIT NONE
+       REAL,DIMENSION(:),target :: MPI_Buffer  
+
+         Buffer=>MPI_Buffer
+ 
+      END SUBROUTINE  Associate_buffer
+                                      
+  END SUBROUTINE create_global_mpi_buffer
+ 
+      
+  subroutine allocate_buffer(Size,Index,Pos)
+  implicit none
+    integer :: Size
+    integer :: Index
+    integer :: Pos
+
+    if (Buffer_pos(Index_pos)+Size>MaxBufferSize_Used) MaxBufferSize_Used=Buffer_pos(Index_pos)+Size  
+    if (Buffer_pos(Index_pos)+Size>MaxBufferSize) then
+      print *,'STOP :: La taille de MaxBufferSize dans mod_hallo.F90 est trop petite !!!!'
+      CALL abort_gcm("mod_hallo","stopped",1)
+    endif
+    
+    if (Index_pos>=ListSize) then
+      print *,'STOP :: La taille de ListSize dans mod_hallo.F90 est trop petite !!!!'
+      CALL abort_gcm("mod_hallo","stopped",1)
+    endif
+     
+    Pos=Buffer_Pos(Index_Pos)
+    Buffer_Pos(Index_pos+1)=Buffer_Pos(Index_Pos)+Size
+    Index_Pos=Index_Pos+1
+    Index=Index_Pos
+    
+  end subroutine allocate_buffer
+     
+  subroutine deallocate_buffer(Index)
+  implicit none
+    integer :: Index
+    
+    Buffer_Pos(Index)=-1
+    
+    do while (Buffer_Pos(Index_Pos)==-1 .and. Index_Pos>1)
+      Index_Pos=Index_Pos-1
+    end do
+
+  end subroutine deallocate_buffer  
+  
+  subroutine SetTag(a_request,tag)
+  implicit none
+    type(request):: a_request
+    integer :: tag
+    
+    a_request%tag=tag
+  end subroutine SetTag
+  
+  
+  subroutine New_Hallo(Field,Stride,NbLevel,offset,size,Ptr_request)
+    integer :: Stride
+    integer :: NbLevel
+    integer :: size
+    integer :: offset
+    real, dimension(Stride,NbLevel),target :: Field
+    type(request_SR),pointer :: Ptr_request
+    type(Hallo),POINTER :: NewHallos(:),HalloSwitch(:), NewHallo
+    
+    Ptr_Request%NbRequest=Ptr_Request%NbRequest+1
+    IF(Ptr_Request%NbRequestMax==0) THEN
+       Ptr_Request%NbRequestMax=10
+       ALLOCATE(Ptr_Request%Hallo(Ptr_Request%NbRequestMax))
+    ELSE IF ( Ptr_Request%NbRequest > Ptr_Request%NbRequestMax) THEN
+      Ptr_Request%NbRequestMax=INT(Ptr_Request%NbRequestMax*1.2)
+      ALLOCATE(NewHallos(Ptr_Request%NbRequestMax))
+      NewHallos(1:Ptr_Request%NbRequest-1)=Ptr_Request%hallo(1:Ptr_Request%NbRequest-1)
+      HalloSwitch=>Ptr_Request%hallo
+      Ptr_Request%hallo=>NewHallos
+      DEALLOCATE(HalloSwitch)
+    ENDIF
+    
+    NewHallo=>Ptr_Request%hallo(Ptr_Request%NbRequest)
+          
+    NewHallo%Field=>Field
+    NewHallo%Stride=Stride
+    NewHallo%NbLevel=NbLevel
+    NewHallo%size=size
+    NewHallo%offset=offset
+    
+  end subroutine New_Hallo
+  
+  subroutine Register_SendField(Field,ij,ll,offset,size,target,a_request)
+  USE dimensions_mod
+  implicit none
+
+    
+      INTEGER :: ij,ll,offset,size,target
+      REAL, dimension(ij,ll) :: Field
+      type(request),target :: a_request
+      type(request_SR),pointer :: Ptr_request
+
+      Ptr_Request=>a_request%RequestSend(target)
+
+      call New_Hallo(Field,ij,ll,offset,size,Ptr_request)
+      
+   end subroutine Register_SendField      
+      
+  subroutine Register_RecvField(Field,ij,ll,offset,size,target,a_request)
+  USE dimensions_mod
+  implicit none
+
+   
+      INTEGER :: ij,ll,offset,size,target
+      REAL, dimension(ij,ll) :: Field
+      type(request),target :: a_request
+      type(request_SR),pointer :: Ptr_request
+
+      Ptr_Request=>a_request%RequestRecv(target)
+            
+      call New_Hallo(Field,ij,ll,offset,size,Ptr_request)
+
+      
+   end subroutine Register_RecvField      
+  
+  subroutine Register_SwapField(FieldS,FieldR,ij,ll,jj_Nb_New,a_request)
+  USE dimensions_mod
+      implicit none
+
+    
+    INTEGER :: ij,ll
+    REAL, dimension(ij,ll) :: FieldS
+    REAL, dimension(ij,ll) :: FieldR
+    type(request) :: a_request
+    integer,dimension(0:MPI_Size-1) :: jj_Nb_New   
+    integer,dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
+    
+    integer ::i,jje,jjb
+    
+    jj_begin_New(0)=1
+    jj_End_New(0)=jj_Nb_New(0)
+    do i=1,MPI_Size-1
+      jj_begin_New(i)=jj_end_New(i-1)+1
+      jj_end_New(i)=jj_begin_new(i)+jj_Nb_New(i)-1
+    enddo
+    
+    do i=0,MPI_Size-1
+      if (i /= MPI_Rank) then
+        jjb=max(jj_begin_new(i),jj_begin)
+        jje=min(jj_end_new(i),jj_end)
+        
+        if (ij==ip1jm .and. jje==jjp1) jje=jjm
+        
+        if (jje >= jjb) then
+          call Register_SendField(FieldS,ij,ll,jjb,jje-jjb+1,i,a_request) 
+        endif
+        
+        jjb=max(jj_begin_new(MPI_Rank),jj_begin_Para(i))
+        jje=min(jj_end_new(MPI_Rank),jj_end_Para(i))
+        
+        if (ij==ip1jm .and. jje==jjp1) jje=jjm
+        
+        if (jje >= jjb) then
+          call Register_RecvField(FieldR,ij,ll,jjb,jje-jjb+1,i,a_request) 
+        endif
+        
+      endif
+    enddo
+    
+  end subroutine Register_SwapField    
+  
+
+  
+  subroutine Register_SwapFieldHallo(FieldS,FieldR,ij,ll,jj_Nb_New,Up,Down,a_request)
+  USE dimensions_mod
+  
+      implicit none
+    
+    INTEGER :: ij,ll,Up,Down
+    REAL, dimension(ij,ll) :: FieldS
+    REAL, dimension(ij,ll) :: FieldR
+    type(request) :: a_request
+    integer,dimension(0:MPI_Size-1) :: jj_Nb_New   
+    integer,dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
+    
+    integer ::i,jje,jjb
+    
+    jj_begin_New(0)=1
+    jj_End_New(0)=jj_Nb_New(0)
+    do i=1,MPI_Size-1
+      jj_begin_New(i)=jj_end_New(i-1)+1
+      jj_end_New(i)=jj_begin_new(i)+jj_Nb_New(i)-1
+    enddo
+    
+    do i=0,MPI_Size-1
+      jj_begin_New(i)=max(1,jj_begin_New(i)-Up)
+      jj_end_New(i)=min(jjp1,jj_end_new(i)+Down)
+    enddo
+   
+    do i=0,MPI_Size-1
+      if (i /= MPI_Rank) then
+        jjb=max(jj_begin_new(i),jj_begin)
+        jje=min(jj_end_new(i),jj_end)
+        
+        if (ij==ip1jm .and. jje==jjp1) jje=jjm
+        
+        if (jje >= jjb) then
+          call Register_SendField(FieldS,ij,ll,jjb,jje-jjb+1,i,a_request) 
+        endif
+        
+        jjb=max(jj_begin_new(MPI_Rank),jj_begin_Para(i))
+        jje=min(jj_end_new(MPI_Rank),jj_end_Para(i))
+        
+        if (ij==ip1jm .and. jje==jjp1) jje=jjm
+        
+        if (jje >= jjb) then
+          call Register_RecvField(FieldR,ij,ll,jjb,jje-jjb+1,i,a_request) 
+        endif
+        
+      endif
+    enddo
+    
+  end subroutine Register_SwapFieldHallo
+
+
+
+  SUBROUTINE Register_SwapField1d_u(FieldS,FieldR,new_dist,a_request,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    REAL, DIMENSION(current_dist%ijb_u:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%ijb_u:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+
+    CALL  Register_SwapField_gen_u(FieldS,FieldR,1,current_dist,new_dist,halo_up,halo_down,a_request)
+        
+  END SUBROUTINE  Register_SwapField1d_u 
+
+  SUBROUTINE Register_SwapField1d_u_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    TYPE(distrib),INTENT(IN)          :: old_dist
+    REAL, DIMENSION(old_dist%ijb_u:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%ijb_u:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+
+    CALL  Register_SwapField_gen_u(FieldS,FieldR,1,old_dist,new_dist,halo_up,halo_down,a_request)
+        
+  END SUBROUTINE  Register_SwapField1d_u_bis 
+
+
+  SUBROUTINE Register_SwapField2d_u1d(FieldS,FieldR,new_dist,a_request,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+    IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    REAL, DIMENSION(current_dist%ijb_u:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%ijb_u:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,2)
+    
+    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField2d_u1d
+
+  SUBROUTINE Register_SwapField2d_u1d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+    IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    TYPE(distrib),INTENT(IN) :: old_dist
+    REAL, DIMENSION(old_dist%ijb_u:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%ijb_u:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,2)
+    
+    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField2d_u1d_bis
+   
+
+  SUBROUTINE Register_SwapField3d_u(FieldS,FieldR,new_dist,a_request,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    REAL, DIMENSION(current_dist%ijb_u:,:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%ijb_u:,:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,2)*size(FieldS,3)
+    
+    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField3d_u 
+
+  SUBROUTINE Register_SwapField3d_u_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    TYPE(distrib),INTENT(IN) :: old_dist
+    REAL, DIMENSION(old_dist%ijb_u:,:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%ijb_u:,:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,2)*size(FieldS,3)
+    
+    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField3d_u_bis 
+  
+
+
+ SUBROUTINE Register_SwapField1d_u2d(FieldS,FieldR,new_dist,a_request,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+
+      IMPLICIT NONE
+
+    TYPE(distrib),INTENT(IN)          :: new_dist !LF
+    REAL, DIMENSION(current_dist%jjb_u:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%jjb_u:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+
+    CALL  Register_SwapField_gen_u(FieldS,FieldR,1,current_dist,new_dist,halo_up,halo_down,a_request)
+        
+  END SUBROUTINE  Register_SwapField1d_u2d 
+
+ SUBROUTINE Register_SwapField1d_u2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+
+      IMPLICIT NONE
+
+    TYPE(distrib),INTENT(IN)          :: new_dist !LF
+    TYPE(distrib),INTENT(IN)          :: old_dist
+    REAL, DIMENSION(old_dist%jjb_u:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%jjb_u:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+
+    CALL  Register_SwapField_gen_u(FieldS,FieldR,1,old_dist,new_dist,halo_up,halo_down,a_request)
+        
+  END SUBROUTINE  Register_SwapField1d_u2d_bis 
+
+
+  SUBROUTINE Register_SwapField2d_u2d(FieldS,FieldR,new_dist,a_request,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    REAL, DIMENSION(current_dist%jjb_u:,:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%jjb_u:,:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,3)
+    
+    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField2d_u2d
+
+  SUBROUTINE Register_SwapField2d_u2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    TYPE(distrib),INTENT(IN) :: old_dist
+    REAL, DIMENSION(old_dist%jjb_u:,:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%jjb_u:,:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,3)
+    
+    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField2d_u2d_bis
+   
+
+  SUBROUTINE Register_SwapField3d_u2d(FieldS,FieldR,new_dist,a_request,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    REAL, DIMENSION(current_dist%jjb_u:,:,:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%jjb_u:,:,:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,3)*size(FieldS,4)
+    
+    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField3d_u2d 
+
+  SUBROUTINE Register_SwapField3d_u2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    TYPE(distrib),INTENT(IN) :: old_dist
+    REAL, DIMENSION(old_dist%jjb_u:,:,:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%jjb_u:,:,:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,3)*size(FieldS,4)
+    
+    CALL  Register_SwapField_gen_u(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField3d_u2d_bis 
+
+
+
+
+
+
+
+  SUBROUTINE Register_SwapField1d_v(FieldS,FieldR,new_dist,a_request,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    REAL, DIMENSION(current_dist%ijb_v:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%ijb_v:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+
+    CALL  Register_SwapField_gen_v(FieldS,FieldR,1,current_dist,new_dist,halo_up,halo_down,a_request)
+        
+  END SUBROUTINE  Register_SwapField1d_v 
+
+  SUBROUTINE Register_SwapField1d_v_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    TYPE(distrib),INTENT(IN) :: old_dist
+    REAL, DIMENSION(old_dist%ijb_v:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%ijb_v:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+
+    CALL  Register_SwapField_gen_v(FieldS,FieldR,1,old_dist,new_dist,halo_up,halo_down,a_request)
+        
+  END SUBROUTINE  Register_SwapField1d_v_bis 
+
+
+  SUBROUTINE Register_SwapField2d_v1d(FieldS,FieldR,new_dist,a_request,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+   
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    REAL, DIMENSION(current_dist%ijb_v:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%ijb_v:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,2)
+    
+    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField2d_v1d
+  
+  SUBROUTINE Register_SwapField2d_v1d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+   
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    TYPE(distrib),INTENT(IN)          :: old_dist
+    REAL, DIMENSION(old_dist%ijb_v:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%ijb_v:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,2)
+    
+    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField2d_v1d_bis
+  
+   
+
+  SUBROUTINE Register_SwapField3d_v(FieldS,FieldR,new_dist,a_request,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    REAL, DIMENSION(current_dist%ijb_v:,:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%ijb_v:,:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,2)*size(FieldS,3)
+    
+    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField3d_v 
+
+  SUBROUTINE Register_SwapField3d_v_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    TYPE(distrib),INTENT(IN) :: old_dist
+    REAL, DIMENSION(old_dist%ijb_v:,:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%ijb_v:,:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,2)*size(FieldS,3)
+    
+    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField3d_v_bis 
+
+
+
+
+  SUBROUTINE Register_SwapField1d_v2d(FieldS,FieldR,new_dist,a_request,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist !LF
+    REAL, DIMENSION(current_dist%jjb_v:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%jjb_v:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+
+    CALL  Register_SwapField_gen_v(FieldS,FieldR,1,current_dist,new_dist,halo_up,halo_down,a_request)
+        
+  END SUBROUTINE  Register_SwapField1d_v2d
+
+  SUBROUTINE Register_SwapField1d_v2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist !LF
+    TYPE(distrib),INTENT(IN) :: old_dist
+    REAL, DIMENSION(old_dist%jjb_v:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%jjb_v:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+
+    CALL  Register_SwapField_gen_v(FieldS,FieldR,1,old_dist,new_dist,halo_up,halo_down,a_request)
+        
+  END SUBROUTINE  Register_SwapField1d_v2d_bis
+
+
+  SUBROUTINE Register_SwapField2d_v2d(FieldS,FieldR,new_dist,a_request,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    REAL, DIMENSION(current_dist%jjb_v:,:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%jjb_v:,:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,3)
+    
+    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField2d_v2d
+   
+  SUBROUTINE Register_SwapField2d_v2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    TYPE(distrib),INTENT(IN) :: old_dist
+    REAL, DIMENSION(old_dist%jjb_v:,:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%jjb_v:,:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,3)
+    
+    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField2d_v2d_bis
+   
+
+  SUBROUTINE Register_SwapField3d_v2d(FieldS,FieldR,new_dist,a_request,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    REAL, DIMENSION(current_dist%jjb_v:,:,:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%jjb_v:,:,:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,3)*size(FieldS,4)
+    
+    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,current_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField3d_v2d 
+  
+  SUBROUTINE Register_SwapField3d_v2d_bis(FieldS,FieldR,new_dist,a_request,old_dist,up,down)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+    
+    TYPE(distrib),INTENT(IN)          :: new_dist
+    TYPE(distrib),INTENT(IN) :: old_dist
+    REAL, DIMENSION(old_dist%jjb_v:,:,:,:),INTENT(IN)     :: FieldS
+    REAL, DIMENSION(new_dist%jjb_v:,:,:,:),INTENT(OUT)    :: FieldR
+    INTEGER,OPTIONAL,INTENT(IN)       :: up
+    INTEGER,OPTIONAL,INTENT(IN)       :: down      
+    TYPE(request),INTENT(INOUT)         :: a_request
+
+    INTEGER                           :: halo_up
+    INTEGER                           :: halo_down
+    INTEGER                           :: ll
+        
+    
+    halo_up=0
+    halo_down=0
+    IF (PRESENT(up))   halo_up=up
+    IF (PRESENT(down)) halo_down=down
+    
+    ll=size(FieldS,3)*size(FieldS,4)
+    
+    CALL  Register_SwapField_gen_v(FieldS,FieldR,ll,old_dist,new_dist,halo_up,halo_down,a_request)
+    
+  END SUBROUTINE  Register_SwapField3d_v2d_bis 
+  
+  
+
+  SUBROUTINE Register_SwapField_gen_u(FieldS,FieldR,ll,old_dist,new_dist,Up,Down,a_request)
+  USE parallel_lmdz
+  USE dimensions_mod
+      IMPLICIT NONE
+   
+    INTEGER :: ll,Up,Down
+    TYPE(distrib)  :: old_dist
+    TYPE(distrib)  :: new_dist
+    REAL, DIMENSION(old_dist%ijb_u:old_dist%ije_u,ll) :: FieldS
+    REAL, DIMENSION(new_dist%ijb_u:new_dist%ije_u,ll) :: FieldR
+    TYPE(request) :: a_request
+    INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Nb_New   
+    INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
+    
+    INTEGER ::i,l,jje,jjb,ijb,ije
+    
+    DO i=0,MPI_Size-1
+      jj_begin_New(i)=max(1,new_dist%jj_begin_para(i)-Up)
+      jj_end_New(i)=min(jjp1,new_dist%jj_end_para(i)+Down)
+    ENDDO
+   
+    DO i=0,MPI_Size-1
+      IF (i /= MPI_Rank) THEN
+        jjb=max(jj_begin_new(i),old_dist%jj_begin)
+        jje=min(jj_end_new(i),old_dist%jj_end)
+        
+        IF (jje >= jjb) THEN
+          CALL Register_SendField(FieldS,old_dist%ijnb_u,ll,jjb-old_dist%jjb_u+1,jje-jjb+1,i,a_request) 
+        ENDIF
+        
+        jjb=max(jj_begin_new(MPI_Rank),old_dist%jj_begin_Para(i))
+        jje=min(jj_end_new(MPI_Rank),old_dist%jj_end_Para(i))
+        
+        IF (jje >= jjb) THEN
+          CALL Register_RecvField(FieldR,new_dist%ijnb_u,ll,jjb-new_dist%jjb_u+1,jje-jjb+1,i,a_request) 
+        ENDIF
+      ELSE
+        jjb=max(jj_begin_new(i),old_dist%jj_begin)
+        jje=min(jj_end_new(i),old_dist%jj_end)
+        ijb=(jjb-1)*iip1+1
+        ije=jje*iip1
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)           
+        DO l=1,ll
+          FieldR(ijb:ije,l)=FieldS(ijb:ije,l)              
+        ENDDO
+!$OMP END DO NOWAIT
+      ENDIF
+    ENDDO
+    
+  END SUBROUTINE Register_SwapField_gen_u
+
+
+
+  SUBROUTINE Register_SwapField_gen_v(FieldS,FieldR,ll,old_dist,new_dist,Up,Down,a_request)
+  USE parallel_lmdz
+  USE dimensions_mod
+    IMPLICIT NONE
+    
+    INTEGER :: ll,Up,Down
+    TYPE(distrib)  :: old_dist
+    TYPE(distrib)  :: new_dist
+    REAL, DIMENSION(old_dist%ijb_v:old_dist%ije_v,ll) :: FieldS
+    REAL, DIMENSION(new_dist%ijb_v:new_dist%ije_v,ll) :: FieldR
+    TYPE(request) :: a_request
+    INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Nb_New   
+    INTEGER,DIMENSION(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
+    
+    INTEGER ::i,l,jje,jjb,ijb,ije
+    
+    DO i=0,MPI_Size-1
+      jj_begin_New(i)=max(1,new_dist%jj_begin_para(i)-Up)
+      jj_end_New(i)=min(jjp1,new_dist%jj_end_para(i)+Down)
+    ENDDO
+   
+    DO i=0,MPI_Size-1
+      IF (i /= MPI_Rank) THEN
+        jjb=max(jj_begin_new(i),old_dist%jj_begin)
+        jje=min(jj_end_new(i),old_dist%jj_end)
+
+        IF (jje==jjp1) jje=jjm        
+
+        IF (jje >= jjb) THEN
+          CALL Register_SendField(FieldS,old_dist%ijnb_v,ll,jjb-old_dist%jjb_v+1,jje-jjb+1,i,a_request) 
+        ENDIF
+        
+        jjb=max(jj_begin_new(MPI_Rank),old_dist%jj_begin_Para(i))
+        jje=min(jj_end_new(MPI_Rank),old_dist%jj_end_Para(i))
+
+        IF (jje==jjp1) jje=jjm
+        
+        IF (jje >= jjb) THEN
+          CALL Register_RecvField(FieldR,new_dist%ijnb_v,ll,jjb-new_dist%jjb_v+1,jje-jjb+1,i,a_request) 
+        ENDIF
+      ELSE
+        jjb=max(jj_begin_new(i),old_dist%jj_begin)
+        jje=min(jj_end_new(i),old_dist%jj_end)
+        IF (jje==jjp1) jje=jjm
+        ijb=(jjb-1)*iip1+1
+        ije=jje*iip1
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)           
+        DO l=1,ll
+          FieldR(ijb:ije,l)=FieldS(ijb:ije,l)
+        ENDDO              
+!$OMP END DO NOWAIT
+      ENDIF
+    ENDDO
+    
+  END SUBROUTINE Register_SwapField_gen_v
+
+
+ 
+
+  
+  subroutine Register_Hallo(Field,ij,ll,RUp,Rdown,SUp,SDown,a_request)
+  USE dimensions_mod
+  USE lmdz_mpi
+      implicit none
+
+      INTEGER :: ij,ll
+      REAL, dimension(ij,ll) :: Field
+      INTEGER :: Sup,Sdown,rup,rdown
+      type(request) :: a_request
+      type(Hallo),pointer :: PtrHallo
+      LOGICAL :: SendUp,SendDown
+      LOGICAL :: RecvUp,RecvDown
+   
+ 
+      SendUp=.TRUE.
+      SendDown=.TRUE.
+      RecvUp=.TRUE.
+      RecvDown=.TRUE.
+        
+      IF (pole_nord) THEN
+        SendUp=.FALSE.
+        RecvUp=.FALSE.
+      ENDIF
+  
+      IF (pole_sud) THEN
+        SendDown=.FALSE.
+        RecvDown=.FALSE.
+      ENDIF
+      
+      if (Sup.eq.0) then
+        SendUp=.FALSE.
+       endif
+      
+      if (Sdown.eq.0) then
+        SendDown=.FALSE.
+      endif
+
+      if (Rup.eq.0) then
+        RecvUp=.FALSE.
+      endif
+      
+      if (Rdown.eq.0) then
+        RecvDown=.FALSE.
+      endif
+      
+      IF (SendUp) THEN
+        call Register_SendField(Field,ij,ll,jj_begin,SUp,MPI_Rank-1,a_request)
+      ENDIF
+  
+      IF (SendDown) THEN
+        call Register_SendField(Field,ij,ll,jj_end-SDown+1,SDown,MPI_Rank+1,a_request)
+      ENDIF
+    
+  
+      IF (RecvUp) THEN
+        call Register_RecvField(Field,ij,ll,jj_begin-Rup,RUp,MPI_Rank-1,a_request)
+      ENDIF
+  
+      IF (RecvDown) THEN
+        call Register_RecvField(Field,ij,ll,jj_end+1,RDown,MPI_Rank+1,a_request)
+      ENDIF
+  
+    end subroutine Register_Hallo
+
+
+  subroutine Register_Hallo_u(Field,ll,RUp,Rdown,SUp,SDown,a_request)
+  USE dimensions_mod
+  USE lmdz_mpi
+      implicit none
+      INTEGER :: ll
+      REAL, dimension(ijb_u:ije_u,ll) :: Field
+      INTEGER :: Sup,Sdown,rup,rdown
+      type(request) :: a_request
+      type(Hallo),pointer :: PtrHallo
+      LOGICAL :: SendUp,SendDown
+      LOGICAL :: RecvUp,RecvDown
+   
+ 
+      SendUp=.TRUE.
+      SendDown=.TRUE.
+      RecvUp=.TRUE.
+      RecvDown=.TRUE.
+        
+      IF (pole_nord) THEN
+        SendUp=.FALSE.
+        RecvUp=.FALSE.
+      ENDIF
+  
+      IF (pole_sud) THEN
+        SendDown=.FALSE.
+        RecvDown=.FALSE.
+      ENDIF
+      
+      if (Sup.eq.0) then
+        SendUp=.FALSE.
+       endif
+      
+      if (Sdown.eq.0) then
+        SendDown=.FALSE.
+      endif
+
+      if (Rup.eq.0) then
+        RecvUp=.FALSE.
+      endif
+      
+      if (Rdown.eq.0) then
+        RecvDown=.FALSE.
+      endif
+      
+      IF (SendUp) THEN
+        call Register_SendField(Field,ijnb_u,ll,jj_begin-jjb_u+1,SUp,MPI_Rank-1,a_request)
+      ENDIF
+  
+      IF (SendDown) THEN
+        call Register_SendField(Field,ijnb_u,ll,jj_end-SDown+1-jjb_u+1,SDown,MPI_Rank+1,a_request)
+      ENDIF
+    
+  
+      IF (RecvUp) THEN
+        call Register_RecvField(Field,ijnb_u,ll,jj_begin-Rup-jjb_u+1,RUp,MPI_Rank-1,a_request)
+      ENDIF
+  
+      IF (RecvDown) THEN
+        call Register_RecvField(Field,ijnb_u,ll,jj_end+1-jjb_u+1,RDown,MPI_Rank+1,a_request)
+      ENDIF
+  
+    end subroutine Register_Hallo_u
+
+  subroutine Register_Hallo_v(Field,ll,RUp,Rdown,SUp,SDown,a_request)
+  USE dimensions_mod
+  USE lmdz_mpi
+      implicit none
+      INTEGER :: ll
+      REAL, dimension(ijb_v:ije_v,ll) :: Field
+      INTEGER :: Sup,Sdown,rup,rdown
+      type(request) :: a_request
+      type(Hallo),pointer :: PtrHallo
+      LOGICAL :: SendUp,SendDown
+      LOGICAL :: RecvUp,RecvDown
+   
+ 
+      SendUp=.TRUE.
+      SendDown=.TRUE.
+      RecvUp=.TRUE.
+      RecvDown=.TRUE.
+        
+      IF (pole_nord) THEN
+        SendUp=.FALSE.
+        RecvUp=.FALSE.
+      ENDIF
+  
+      IF (pole_sud) THEN
+        SendDown=.FALSE.
+        RecvDown=.FALSE.
+      ENDIF
+      
+      if (Sup.eq.0) then
+        SendUp=.FALSE.
+       endif
+      
+      if (Sdown.eq.0) then
+        SendDown=.FALSE.
+      endif
+
+      if (Rup.eq.0) then
+        RecvUp=.FALSE.
+      endif
+      
+      if (Rdown.eq.0) then
+        RecvDown=.FALSE.
+      endif
+      
+      IF (SendUp) THEN
+        call Register_SendField(Field,ijnb_v,ll,jj_begin-jjb_v+1,SUp,MPI_Rank-1,a_request)
+      ENDIF
+  
+      IF (SendDown) THEN
+        call Register_SendField(Field,ijnb_v,ll,jj_end-SDown+1-jjb_v+1,SDown,MPI_Rank+1,a_request)
+      ENDIF
+    
+  
+      IF (RecvUp) THEN
+        call Register_RecvField(Field,ijnb_v,ll,jj_begin-Rup-jjb_v+1,RUp,MPI_Rank-1,a_request)
+      ENDIF
+  
+      IF (RecvDown) THEN
+        call Register_RecvField(Field,ijnb_v,ll,jj_end+1-jjb_v+1,RDown,MPI_Rank+1,a_request)
+      ENDIF
+  
+    end subroutine Register_Hallo_v
+    
+    subroutine SendRequest(a_Request)
+    USE dimensions_mod
+    USE lmdz_mpi
+      implicit none
+
+      type(request),target :: a_request
+      type(request_SR),pointer :: Req
+      type(Hallo),pointer :: PtrHallo
+      integer :: SizeBuffer
+      integer :: i,rank,l,ij,Pos,ierr
+      integer :: offset
+      real,dimension(:,:),pointer :: Field
+      integer :: Nb
+       
+      do rank=0,MPI_SIZE-1
+      
+        Req=>a_Request%RequestSend(rank)
+        
+        SizeBuffer=0
+        do i=1,Req%NbRequest
+          PtrHallo=>Req%Hallo(i)
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 
+          DO l=1,PtrHallo%NbLevel
+            SizeBuffer=SizeBuffer+PtrHallo%size*iip1
+          ENDDO
+!$OMP ENDDO NOWAIT          
+        enddo
+      
+         Req%BufferSize=SizeBuffer
+         if (Req%NbRequest>0) then
+       
+          call allocate_buffer(SizeBuffer,Req%Index,Req%pos)
+
+          Pos=Req%Pos
+          do i=1,Req%NbRequest
+            PtrHallo=>Req%Hallo(i)
+            offset=(PtrHallo%offset-1)*iip1+1
+            Nb=iip1*PtrHallo%size-1
+            Field=>PtrHallo%Field
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)           
+            do l=1,PtrHallo%NbLevel
+!cdir NODEP
+              do ij=0,Nb
+	        Buffer(Pos+ij)=Field(Offset+ij,l)
+	      enddo
+              
+              Pos=Pos+Nb+1
+            enddo
+!$OMP END DO NOWAIT            
+          enddo
+    
+         if (SizeBuffer>0) then
+!$OMP CRITICAL (MPI)
+         
+         call MPI_ISEND(Buffer(req%Pos),SizeBuffer,MPI_REAL_LMDZ,rank,a_request%tag+1000*omp_rank,     &
+                         COMM_LMDZ,Req%MSG_Request,ierr)
+         IF (.NOT.using_mpi) THEN
+           PRINT *,'Erreur, echange MPI en mode sequentiel !!!'
+           CALL abort_gcm("mod_hallo","stopped",1)
+         ENDIF
+!         PRINT *,"-------------------------------------------------------------------"
+!         PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->"
+!         PRINT *,"Requete envoye au proc :",rank,"tag :",a_request%tag+1000*omp_rank
+!         PRINT *,"Taille du message :",SizeBuffer,"requete no :",Req%MSG_Request
+!         PRINT *,"-------------------------------------------------------------------"
+!$OMP END CRITICAL (MPI)
+        endif
+       endif
+    enddo
+   
+           
+      do rank=0,MPI_SIZE-1
+         
+          Req=>a_Request%RequestRecv(rank)
+          SizeBuffer=0
+          
+	  do i=1,Req%NbRequest
+            PtrHallo=>Req%Hallo(i)
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 
+            DO l=1,PtrHallo%NbLevel
+              SizeBuffer=SizeBuffer+PtrHallo%size*iip1
+            ENDDO
+!$OMP ENDDO NOWAIT          
+          enddo
+          
+          Req%BufferSize=SizeBuffer
+          
+          if (Req%NbRequest>0) then
+          call allocate_buffer(SizeBuffer,Req%Index,Req%Pos)
+   
+          if (SizeBuffer>0) then
+
+!$OMP CRITICAL (MPI)
+
+             call MPI_IRECV(Buffer(Req%Pos),SizeBuffer,MPI_REAL_LMDZ,rank,a_request%tag+1000*omp_rank,     &
+                           COMM_LMDZ,Req%MSG_Request,ierr)
+
+             IF (.NOT.using_mpi) THEN
+               PRINT *,'Erreur, echange MPI en mode sequentiel !!!'
+               CALL abort_gcm("mod_hallo","stopped",1)
+             ENDIF
+
+!         PRINT *,"-------------------------------------------------------------------"
+!         PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->"
+!         PRINT *,"Requete en attente du proc :",rank,"tag :",a_request%tag+1000*omp_rank
+!         PRINT *,"Taille du message :",SizeBuffer,"requete no :",Req%MSG_Request
+!         PRINT *,"-------------------------------------------------------------------"
+
+!$OMP END CRITICAL (MPI)
+          endif
+        endif
+      
+      enddo
+                        
+   end subroutine SendRequest 
+   
+   subroutine WaitRequest(a_Request)
+   USE dimensions_mod
+   USE lmdz_mpi
+   implicit none
+      
+      type(request),target :: a_request
+      type(request_SR),pointer :: Req
+      type(Hallo),pointer :: PtrHallo
+      integer, dimension(2*mpi_size) :: TabRequest
+      integer, dimension(MPI_STATUS_SIZE,2*mpi_size) :: TabStatus
+      integer :: NbRequest
+      integer :: i,rank,pos,ij,l,ierr
+      integer :: offset
+      integer :: Nb
+      
+      
+      NbRequest=0
+      do rank=0,MPI_SIZE-1
+        Req=>a_request%RequestSend(rank)
+        if (Req%NbRequest>0 .AND. Req%BufferSize > 0) then
+          NbRequest=NbRequest+1
+          TabRequest(NbRequest)=Req%MSG_Request
+        endif
+      enddo
+      
+      do rank=0,MPI_SIZE-1
+        Req=>a_request%RequestRecv(rank)
+        if (Req%NbRequest>0 .AND. Req%BufferSize > 0 ) then
+          NbRequest=NbRequest+1
+          TabRequest(NbRequest)=Req%MSG_Request
+        endif
+      enddo
+     
+      if (NbRequest>0) then
+!$OMP CRITICAL (MPI)
+!        PRINT *,"-------------------------------------------------------------------"
+!        PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"en attente"
+!        PRINT *,"No des requetes :",TabRequest(1:NbRequest)
+        call MPI_WAITALL(NbRequest,TabRequest,TabStatus,ierr)
+!        PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"complete"
+!        PRINT *,"-------------------------------------------------------------------"
+!$OMP END CRITICAL (MPI)
+      endif
+      do rank=0,MPI_Size-1
+        Req=>a_request%RequestRecv(rank)
+        if (Req%NbRequest>0) then
+          Pos=Req%Pos
+          do i=1,Req%NbRequest
+            PtrHallo=>Req%Hallo(i)
+            offset=(PtrHallo%offset-1)*iip1+1
+	    Nb=iip1*PtrHallo%size-1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)            
+	    do l=1,PtrHallo%NbLevel
+!cdir NODEP
+              do ij=0,Nb
+	        PtrHallo%Field(offset+ij,l)=Buffer(Pos+ij)
+	      enddo
+
+              Pos=Pos+Nb+1
+	    enddo
+!$OMP ENDDO NOWAIT	    
+          enddo
+        endif
+      enddo
+      
+      do rank=0,MPI_SIZE-1
+        Req=>a_request%RequestSend(rank)
+        if (Req%NbRequest>0) then
+          call deallocate_buffer(Req%Index)
+          Req%NbRequest=0 
+        endif
+      enddo
+              
+      do rank=0,MPI_SIZE-1
+        Req=>a_request%RequestRecv(rank)
+        if (Req%NbRequest>0) then
+          call deallocate_buffer(Req%Index)
+          Req%NbRequest=0 
+        endif
+      enddo
+     
+      a_request%tag=1
+    end subroutine WaitRequest
+     
+   subroutine WaitSendRequest(a_Request)
+   USE lmdz_mpi
+   USE dimensions_mod
+   implicit none
+   
+      type(request),target :: a_request
+      type(request_SR),pointer :: Req
+      type(Hallo),pointer :: PtrHallo
+      integer, dimension(mpi_size) :: TabRequest
+      integer, dimension(MPI_STATUS_SIZE,mpi_size) :: TabStatus
+      integer :: NbRequest
+      integer :: i,rank,pos,ij,l,ierr
+      integer :: offset
+      
+      
+      NbRequest=0
+      do rank=0,MPI_SIZE-1
+        Req=>a_request%RequestSend(rank)
+        if (Req%NbRequest>0) then
+          NbRequest=NbRequest+1
+          TabRequest(NbRequest)=Req%MSG_Request
+        endif
+      enddo
+      
+
+      if (NbRequest>0 .AND. Req%BufferSize > 0 ) THEN 
+!$OMP CRITICAL (MPI)     
+!        PRINT *,"-------------------------------------------------------------------"
+!        PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"en attente"
+!        PRINT *,"No des requetes :",TabRequest(1:NbRequest)
+         call MPI_WAITALL(NbRequest,TabRequest,TabStatus,ierr)
+!        PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"complete"
+!        PRINT *,"-------------------------------------------------------------------"
+
+!$OMP END CRITICAL (MPI)
+      endif      
+      
+      do rank=0,MPI_SIZE-1
+        Req=>a_request%RequestSend(rank)
+        if (Req%NbRequest>0) then
+          call deallocate_buffer(Req%Index)
+          Req%NbRequest=0 
+        endif
+      enddo
+              
+      a_request%tag=1
+    end subroutine WaitSendRequest
+    
+   subroutine WaitRecvRequest(a_Request)
+   USE dimensions_mod
+   USE lmdz_mpi
+   implicit none
+      type(request),target :: a_request
+      type(request_SR),pointer :: Req
+      type(Hallo),pointer :: PtrHallo
+      integer, dimension(mpi_size) :: TabRequest
+      integer, dimension(MPI_STATUS_SIZE,mpi_size) :: TabStatus
+      integer :: NbRequest
+      integer :: i,rank,pos,ij,l,ierr
+      integer :: offset,Nb
+      
+      
+      NbRequest=0
+      
+      do rank=0,MPI_SIZE-1
+        Req=>a_request%RequestRecv(rank)
+        if (Req%NbRequest>0 .AND. Req%BufferSize > 0 ) then
+          NbRequest=NbRequest+1
+          TabRequest(NbRequest)=Req%MSG_Request
+        endif
+      enddo
+     
+      
+      if (NbRequest>0) then
+!$OMP CRITICAL (MPI)     
+!        PRINT *,"-------------------------------------------------------------------"
+!        PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"en attente"
+!        PRINT *,"No des requetes :",TabRequest(1:NbRequest)
+         call MPI_WAITALL(NbRequest,TabRequest,TabStatus,ierr)
+!        PRINT *,"Process de rang",mpi_rank,"Task : ",omp_rank,"--->",NbRequest,"complete"
+!        PRINT *,"-------------------------------------------------------------------"
+!$OMP END CRITICAL (MPI)     
+      endif
+      
+      do rank=0,MPI_Size-1
+        Req=>a_request%RequestRecv(rank)
+        if (Req%NbRequest>0) then
+          Pos=Req%Pos
+          do i=1,Req%NbRequest
+            PtrHallo=>Req%Hallo(i)
+            offset=(PtrHallo%offset-1)*iip1+1
+	    Nb=iip1*PtrHallo%size-1
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)            
+	    do l=1,PtrHallo%NbLevel
+!cdir NODEP
+              do ij=0,Nb
+	        PtrHallo%Field(offset+ij,l)=Buffer(Pos+ij)
+	      enddo
+                 Pos=Pos+Nb+1
+            enddo
+!$OMP END DO NOWAIT
+          enddo
+        endif
+      enddo
+      
+           
+      do rank=0,MPI_SIZE-1
+        Req=>a_request%RequestRecv(rank)
+        if (Req%NbRequest>0) then
+          call deallocate_buffer(Req%Index)
+          Req%NbRequest=0 
+        endif
+      enddo
+     
+      a_request%tag=1
+    end subroutine WaitRecvRequest
+    
+    
+    
+    subroutine CopyField(FieldS,FieldR,ij,ll,jj_Nb_New)
+    USE dimensions_mod
+  
+      implicit none
+    
+    INTEGER :: ij,ll,l
+    REAL, dimension(ij,ll) :: FieldS
+    REAL, dimension(ij,ll) :: FieldR
+    integer,dimension(0:MPI_Size-1) :: jj_Nb_New   
+    integer,dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
+    
+    integer ::i,jje,jjb,ijb,ije
+    
+    jj_begin_New(0)=1
+    jj_End_New(0)=jj_Nb_New(0)
+    do i=1,MPI_Size-1
+      jj_begin_New(i)=jj_end_New(i-1)+1
+      jj_end_New(i)=jj_begin_new(i)+jj_Nb_New(i)-1
+    enddo
+    
+    jjb=max(jj_begin,jj_begin_new(MPI_Rank))
+    jje=min(jj_end,jj_end_new(MPI_Rank))
+    if (ij==ip1jm) jje=min(jje,jjm)
+
+    if (jje >= jjb) then
+      ijb=(jjb-1)*iip1+1
+      ije=jje*iip1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+      do l=1,ll
+        FieldR(ijb:ije,l)=FieldS(ijb:ije,l)
+      enddo
+!$OMP ENDDO NOWAIT
+    endif
+
+
+  end subroutine CopyField    
+
+  subroutine CopyFieldHallo(FieldS,FieldR,ij,ll,jj_Nb_New,Up,Down)
+  USE dimensions_mod
+  
+      implicit none
+    
+    INTEGER :: ij,ll,Up,Down
+    REAL, dimension(ij,ll) :: FieldS
+    REAL, dimension(ij,ll) :: FieldR
+    integer,dimension(0:MPI_Size-1) :: jj_Nb_New   
+    integer,dimension(0:MPI_Size-1) :: jj_Begin_New,jj_End_New
+
+    integer ::i,jje,jjb,ijb,ije,l
+
+     
+    jj_begin_New(0)=1
+    jj_End_New(0)=jj_Nb_New(0)
+    do i=1,MPI_Size-1
+      jj_begin_New(i)=jj_end_New(i-1)+1
+      jj_end_New(i)=jj_begin_new(i)+jj_Nb_New(i)-1
+    enddo
+
+        
+    jjb=max(jj_begin,jj_begin_new(MPI_Rank)-Up)
+    jje=min(jj_end,jj_end_new(MPI_Rank)+Down)
+    if (ij==ip1jm) jje=min(jje,jjm)
+    
+    
+    if (jje >= jjb) then
+      ijb=(jjb-1)*iip1+1
+      ije=jje*iip1
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+      do l=1,ll
+        FieldR(ijb:ije,l)=FieldS(ijb:ije,l)
+      enddo
+!$OMP ENDDO NOWAIT
+
+    endif
+   end subroutine CopyFieldHallo        
+
+   subroutine Gather_field_u(field_loc,field_glo,ll)
+   USE dimensions_mod
+   implicit none
+     integer :: ll
+     real :: field_loc(ijb_u:ije_u,ll)
+     real :: field_glo(ip1jmp1,ll)
+     type(request) :: request_gather
+     integer       :: l
+
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+     DO l=1,ll
+       field_glo(ij_begin:ij_end,l)=field_loc(ij_begin:ij_end,l)
+     ENDDO
+     
+     call register_SwapField(field_glo,field_glo,ip1jmp1,ll,distrib_gather%jj_nb_para,request_gather)
+     call SendRequest(request_gather)
+!$OMP BARRIER
+     call WaitRequest(request_gather)       
+!$OMP BARRIER
+
+    end subroutine Gather_field_u
+        
+   subroutine Gather_field_v(field_loc,field_glo,ll)
+   USE dimensions_mod
+   implicit none
+     integer :: ll
+     real :: field_loc(ijb_v:ije_v,ll)
+     real :: field_glo(ip1jm,ll)
+     type(request) :: request_gather
+     integer :: ijb,ije
+     integer       :: l
+     
+   
+     ijb=ij_begin
+     ije=ij_end
+     if (pole_sud) ije=ij_end-iip1
+        
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+     DO l=1,ll
+       field_glo(ijb:ije,l)=field_loc(ijb:ije,l)
+     ENDDO
+     
+     call register_SwapField(field_glo,field_glo,ip1jm,ll,distrib_gather%jj_nb_para,request_gather)
+     call SendRequest(request_gather)
+!$OMP BARRIER
+     call WaitRequest(request_gather)       
+!$OMP BARRIER
+
+    end subroutine Gather_field_v
+     
+   subroutine Scatter_field_u(field_glo,field_loc,ll)
+   USE dimensions_mod
+   implicit none
+     integer :: ll
+     real :: field_glo(ip1jmp1,ll)
+     real :: field_loc(ijb_u:ije_u,ll)
+     type(request) :: request_gather
+     TYPE(distrib) :: distrib_swap
+     integer       :: l
+     
+!$OMP BARRIER
+!$OMP MASTER     
+     call get_current_distrib(distrib_swap)
+     call set_Distrib(distrib_gather)
+!$OMP END MASTER
+!$OMP BARRIER
+ 
+     call register_SwapField(field_glo,field_glo,ip1jmp1,ll,distrib_swap%jj_nb_para,request_gather)
+     call SendRequest(request_gather)
+!$OMP BARRIER
+     call WaitRequest(request_gather)       
+!$OMP BARRIER
+!$OMP MASTER     
+     call set_Distrib(distrib_swap)
+!$OMP END MASTER
+!$OMP BARRIER
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+       DO l=1,ll
+         field_loc(ij_begin:ij_end,l)=field_glo(ij_begin:ij_end,l)
+       ENDDO
+
+    end subroutine Scatter_field_u
+
+   subroutine Scatter_field_v(field_glo,field_loc,ll)
+   USE dimensions_mod
+   implicit none
+     integer :: ll
+     real :: field_glo(ip1jmp1,ll)
+     real :: field_loc(ijb_v:ije_v,ll)
+     type(request) :: request_gather
+     TYPE(distrib) :: distrib_swap
+     integer       :: ijb,ije,l
+     
+
+!$OMP BARRIER
+!$OMP MASTER     
+     call get_current_distrib(distrib_swap)
+     call set_Distrib(distrib_gather)
+!$OMP END MASTER
+!$OMP BARRIER
+     call register_SwapField(field_glo,field_glo,ip1jm,ll,distrib_swap%jj_nb_para,request_gather)
+     call SendRequest(request_gather)
+!$OMP BARRIER
+     call WaitRequest(request_gather)       
+!$OMP BARRIER
+!$OMP MASTER
+     call set_Distrib(distrib_swap)
+!$OMP END MASTER
+!$OMP BARRIER
+     ijb=ij_begin
+     ije=ij_end
+     if (pole_sud) ije=ij_end-iip1
+     
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+       DO l=1,ll
+         field_loc(ijb:ije,l)=field_glo(ijb:ije,l)
+       ENDDO
+
+    end subroutine Scatter_field_v
+              
+end module mod_Hallo 
+   
Index: LMDZ6/trunk/libf/dyn3dmem/mod_xios_dyn3dmem.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/mod_xios_dyn3dmem.F90	(revision 5267)
+++ 	(revision )
@@ -1,260 +1,0 @@
-!
-! $Id$
-!
-! This module contains the interface between the LMDZ dynamics dyn3dmem module and XIOS.
-! 
-! Lists of subroutines
-!      xios_dyn3dmem_init : context / calendar / domain / axis initialisations
-!
-! Initialisation of communicator between LMDZ and XIOS is done elsewhere: wxios_init called by init_const_mpi 
-!                                                                         (one of the first calls in gcm.F90)
-! L. Fairhead 11/2017
-!
-!
-
-MODULE mod_xios_dyn3dmem
-
-     USE lmdz_xios
-     USE wxios, ONLY : g_comm
-     CHARACTER(len=100), SAVE :: dyn3d_ctx_name = "LMDZDYN"
-     TYPE(xios_context), SAVE :: dyn3d_ctx_handle
-!$OMP THREADPRIVATE(dyn3d_ctx_name, dyn3d_ctx_handle)
- 
-  INTERFACE writefield_dyn_u
-     MODULE PROCEDURE writefield_dyn1d_u, writefield_dyn2d_u
-  END INTERFACE writefield_dyn_u
-
-  INTERFACE writefield_dyn_v
-     MODULE PROCEDURE writefield_dyn1d_v, writefield_dyn2d_v
-  END INTERFACE writefield_dyn_v
-
-     REAL, ALLOCATABLE, SAVE :: NewField_U(:,:,:), NewField_V(:,:,:)
-  
-
-   CONTAINS
-
-   SUBROUTINE xios_dyn3dmem_init(xios_cal_type, anref, moisref, jourref,heureref, an, mois, jour, heure, zdtvr)
-
-
-     USE comvert_mod, ONLY: presnivs
-     USE parallel_lmdz
-
-     IMPLICIT NONE
-
-     INCLUDE 'dimensions.h'
-     INCLUDE "paramet.h"
-     INCLUDE 'comgeom.h'
-
-     TYPE(xios_duration) :: tstep_xios
-     TYPE(xios_date)                :: start_date
-     TYPE(xios_date)                :: time_origin
-     INTEGER :: an, mois, jour
-     REAL :: heure
-     CHARACTER (len=10) :: xios_cal_type
-     INTEGER :: anref, moisref, jourref
-     REAL :: heureref
-     REAL :: zdtvr
-     TYPE(xios_domain) :: dom_grid_U, dom_grid_V, dom_grid_T
-     REAL :: rlong(iip1), rlat(jjp1)
-     REAL :: pi
-     INTEGER :: ii, jj, jjb, jje, jjn
-
-!      WRITE(*,*)'Entree mod_xios_dyn3dmem'
-
-! 0 Initialisations
-     pi = 4. * ATAN (1.)
-! allocation of fields passed to xios
-!$OMP BARRIER
-!$OMP MASTER
-     allocate(NewField_U(iip1, jj_begin:jj_end, llm))
-     allocate(NewField_V(iip1, jj_begin:jj_end, llm))     
-!$OMP END MASTER
-!$OMP BARRIER
-
-! 1 Context initialisation
-!$OMP MASTER
-     CALL xios_context_initialize(dyn3d_ctx_name, g_comm)
-     CALL xios_get_handle(dyn3d_ctx_name, dyn3d_ctx_handle)
-     CALL xios_set_current_context(dyn3d_ctx_handle)  
-
-!     WRITE(*,*)'apres context initialisation mod_xios_dyn3dmem'
-
-! 2 calendar stuff
-
-     tstep_xios%second=zdtvr
-     CALL xios_define_calendar(type=xios_cal_type, start_date=xios_date(an, mois, jour,INT(heure),0,0), &
-            time_origin=xios_date(anref,moisref,jourref,INT(heureref),0,0), timestep=tstep_xios)
-
-!     WRITE(*,*)'apres  calendrier mod_xios_dyn3dmem'
-
-! 3 domain / grids / axis
-! Domains:
-      rlong(:) = rlonu(:) * 180. / pi
-      rlat(:) = rlatu(:) * 180. / pi
-
-      CALL xios_set_domain_attr("domain_U", ni_glo=iip1, nj_glo=jjp1,          &
-          type="rectilinear",ibegin=0, ni=iip1, jbegin=jj_begin-1, nj=jj_nb,   &
-          data_dim = 2, lonvalue_1d=rlong(1:iip1), latvalue_1d=rlat(jj_begin:jj_end))
-
-      jjb=jj_begin
-      jje=jj_end
-      jjn=jj_nb
-      IF (pole_sud) jjn=jjn-1
-      IF (pole_sud) jje=jje-1
-
-
-      rlong(:) = rlonv(:) * 180. / pi
-      do jj = jjb, jje
-        rlat(jj) = rlatv(jj) * 180. / pi
-      enddo
-      
-      CALL xios_set_domain_attr("domain_V", ni_glo=iip1, nj_glo=jjm,            &
-          type="rectilinear",ibegin=0, ni=iip1, jbegin=jj_begin-1, nj=jjn,   &
-          data_dim = 2, lonvalue_1d=rlong(1:iip1), latvalue_1d=rlat(jjb:jje))
-
-
-      rlong(:) = rlonv(:) * 180. / pi
-      rlat(:) = rlatu(:) * 180. / pi 
-      CALL xios_set_domain_attr("domain_T", ni_glo=iip1, nj_glo=jjp1,          &
-          type="rectilinear",ibegin=0, ni=iip1, jbegin=jj_begin-1, nj=jj_nb,   &
-          data_dim = 2, lonvalue_1d=rlong(1:iip1), latvalue_1d=rlat(jj_begin:jj_end))
-      
-!     WRITE(*,*)'apres  domaine mod_xios_dyn3dmem'
-! Vertical axis
-       CALL xios_set_axis_attr("presnivs",n_glo=llm,value=presnivs)
-!     WRITE(*,*)'apres  vertical axis mod_xios_dyn3dmem'
-! 4 end of context definition
-       CALL xios_close_context_definition()
-!     WRITE(*,*)'apres close context init. axis mod_xios_dyn3dmem'
-!$OMP END MASTER
-   END SUBROUTINE xios_dyn3dmem_init
-
-   SUBROUTINE  writefield_dyn1d_u(name,Field)
-
-     USE parallel_lmdz
-     IMPLICIT NONE
-     include 'dimensions.h'
-     include 'paramet.h'
-     CHARACTER(LEN=*)   :: name
-     REAL, DIMENSION(ij_begin:ij_end) :: Field
-     REAL, DIMENSION(iip1,  jj_begin:jj_end) :: NewField
-      LOGICAL,SAVE :: debuglf=.true.
-!$OMP THREADPRIVATE(debuglf)
-     
-     NewField(:,jj_begin:jj_end)=reshape(Field(ij_begin:ij_end),(/iip1,jj_nb/))
-
-!$OMP BARRIER       
-!$OMP MASTER
-     CALL xios_send_field(name, NewField)
-!$OMP END MASTER   
-  
-   END SUBROUTINE  writefield_dyn1d_u
-
-   SUBROUTINE  writefield_dyn2d_u(name,Field)
-
-     USE parallel_lmdz
-     IMPLICIT NONE
-     include 'dimensions.h'
-     include 'paramet.h'
-     CHARACTER(LEN=*)   :: name
-     REAL, DIMENSION(ij_begin:ij_end,llm) :: Field
-!     REAL, ALLOCATABLE, SAVE :: NewField(:,:,:)
-     INTEGER :: i,j,l, count
-
-!!!!!$OMP BARRIER
-!!!!!$OMP MASTER
-!!!!     allocate(NewField(iip1, jj_begin:jj_end, llm))
-!!!!!$OMP END MASTER
-!!!!!$OMP BARRIER
-
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 
-     DO l = 1, llm
-       NewField_U(:,jj_begin:jj_end,l)=reshape(Field(ij_begin:ij_end,l),(/iip1,jj_nb/))
-     ENDDO
-!$OMP ENDDO
-!$OMP BARRIER 
-
-!$OMP MASTER
-     CALL xios_send_field(name, NewField_U)
-!!!!     DEALLOCATE(NewField)
-!$OMP END MASTER   
-!$OMP BARRIER
-  
-   END SUBROUTINE  writefield_dyn2d_u
-
-   SUBROUTINE  writefield_dyn1d_v(name,Field)
-
-     USE parallel_lmdz
-     IMPLICIT NONE
-     include 'dimensions.h'
-     include 'paramet.h'
-     CHARACTER(LEN=*)   :: name
-     REAL, DIMENSION(ij_begin:ij_end) :: Field
-     REAL, DIMENSION(iip1,  jj_begin:jj_end) :: NewField
-     INTEGER ::  jje, ije, jjn
-
-     IF (pole_sud) THEN
-       jje=jj_end-1
-       ije=ij_end-iip1
-       jjn=jj_nb-1
-     ELSE
-       jje=jj_end
-       ije=ij_end
-       jjn=jj_nb
-     ENDIF
-
-     NewField(:,jj_begin:jje)=reshape(Field(ij_begin:ije),(/iip1,jjn/))
-
-!$OMP BARRIER       
-!$OMP MASTER
-     CALL xios_send_field(name, NewField(:,jj_begin:jje))
-!$OMP END MASTER   
-  
-   END SUBROUTINE  writefield_dyn1d_v
-
-   SUBROUTINE  writefield_dyn2d_v(name,Field)
-
-     USE parallel_lmdz
-     IMPLICIT NONE
-     include 'dimensions.h'
-     include 'paramet.h'
-     CHARACTER(LEN=*)   :: name
-     REAL, DIMENSION(ij_begin:ij_end,llm) :: Field
-!!!!     REAL, ALLOCATABLE, SAVE :: NewField(:,:,:)
-     INTEGER :: l, jje, ije, jjn
-
-!!!!!$OMP BARRIER
-!!!!!$OMP MASTER
-!!!!     allocate(NewField(iip1,  jj_begin:jj_end,llm))
-!!!!!$OMP END MASTER
-!!!!!$OMP BARRIER
-
-     IF (pole_sud) THEN
-       jje=jj_end-1
-       ije=ij_end-iip1
-       jjn=jj_nb-1
-     ELSE
-       jje=jj_end
-       ije=ij_end
-       jjn=jj_nb
-     ENDIF
-
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-     DO l = 1, llm
-        NewField_V(:,jj_begin:jje,l)=reshape(Field(ij_begin:ije,l),(/iip1,jjn/))
-     ENDDO
-!$OMP ENDDO
-!$OMP BARRIER       
-
-!$OMP MASTER
-     CALL xios_send_field(name, NewField_V(:,jj_begin:jje,:))
-!!!!     DEALLOCATE(NewField)
-!$OMP END MASTER   
-!$OMP BARRIER 
-  
-   END SUBROUTINE  writefield_dyn2d_v
-   
-END MODULE mod_xios_dyn3dmem 
-
Index: LMDZ6/trunk/libf/dyn3dmem/mod_xios_dyn3dmem.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/mod_xios_dyn3dmem.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/mod_xios_dyn3dmem.f90	(revision 5268)
@@ -0,0 +1,260 @@
+!
+! $Id$
+!
+! This module contains the interface between the LMDZ dynamics dyn3dmem module and XIOS.
+! 
+! Lists of subroutines
+!      xios_dyn3dmem_init : context / calendar / domain / axis initialisations
+!
+! Initialisation of communicator between LMDZ and XIOS is done elsewhere: wxios_init called by init_const_mpi 
+!                                                                         (one of the first calls in gcm.F90)
+! L. Fairhead 11/2017
+!
+!
+
+MODULE mod_xios_dyn3dmem
+
+     USE lmdz_xios
+     USE wxios, ONLY : g_comm
+     CHARACTER(len=100), SAVE :: dyn3d_ctx_name = "LMDZDYN"
+     TYPE(xios_context), SAVE :: dyn3d_ctx_handle
+!$OMP THREADPRIVATE(dyn3d_ctx_name, dyn3d_ctx_handle)
+ 
+  INTERFACE writefield_dyn_u
+     MODULE PROCEDURE writefield_dyn1d_u, writefield_dyn2d_u
+  END INTERFACE writefield_dyn_u
+
+  INTERFACE writefield_dyn_v
+     MODULE PROCEDURE writefield_dyn1d_v, writefield_dyn2d_v
+  END INTERFACE writefield_dyn_v
+
+     REAL, ALLOCATABLE, SAVE :: NewField_U(:,:,:), NewField_V(:,:,:)
+  
+
+   CONTAINS
+
+   SUBROUTINE xios_dyn3dmem_init(xios_cal_type, anref, moisref, jourref,heureref, an, mois, jour, heure, zdtvr)
+
+
+     USE comvert_mod, ONLY: presnivs
+     USE parallel_lmdz
+
+     IMPLICIT NONE
+
+     INCLUDE 'dimensions.h'
+     INCLUDE "paramet.h"
+     INCLUDE 'comgeom.h'
+
+     TYPE(xios_duration) :: tstep_xios
+     TYPE(xios_date)                :: start_date
+     TYPE(xios_date)                :: time_origin
+     INTEGER :: an, mois, jour
+     REAL :: heure
+     CHARACTER (len=10) :: xios_cal_type
+     INTEGER :: anref, moisref, jourref
+     REAL :: heureref
+     REAL :: zdtvr
+     TYPE(xios_domain) :: dom_grid_U, dom_grid_V, dom_grid_T
+     REAL :: rlong(iip1), rlat(jjp1)
+     REAL :: pi
+     INTEGER :: ii, jj, jjb, jje, jjn
+
+!      WRITE(*,*)'Entree mod_xios_dyn3dmem'
+
+! 0 Initialisations
+     pi = 4. * ATAN (1.)
+! allocation of fields passed to xios
+!$OMP BARRIER
+!$OMP MASTER
+     allocate(NewField_U(iip1, jj_begin:jj_end, llm))
+     allocate(NewField_V(iip1, jj_begin:jj_end, llm))     
+!$OMP END MASTER
+!$OMP BARRIER
+
+! 1 Context initialisation
+!$OMP MASTER
+     CALL xios_context_initialize(dyn3d_ctx_name, g_comm)
+     CALL xios_get_handle(dyn3d_ctx_name, dyn3d_ctx_handle)
+     CALL xios_set_current_context(dyn3d_ctx_handle)  
+
+!     WRITE(*,*)'apres context initialisation mod_xios_dyn3dmem'
+
+! 2 calendar stuff
+
+     tstep_xios%second=zdtvr
+     CALL xios_define_calendar(type=xios_cal_type, start_date=xios_date(an, mois, jour,INT(heure),0,0), &
+            time_origin=xios_date(anref,moisref,jourref,INT(heureref),0,0), timestep=tstep_xios)
+
+!     WRITE(*,*)'apres  calendrier mod_xios_dyn3dmem'
+
+! 3 domain / grids / axis
+! Domains:
+      rlong(:) = rlonu(:) * 180. / pi
+      rlat(:) = rlatu(:) * 180. / pi
+
+      CALL xios_set_domain_attr("domain_U", ni_glo=iip1, nj_glo=jjp1,          &
+          type="rectilinear",ibegin=0, ni=iip1, jbegin=jj_begin-1, nj=jj_nb,   &
+          data_dim = 2, lonvalue_1d=rlong(1:iip1), latvalue_1d=rlat(jj_begin:jj_end))
+
+      jjb=jj_begin
+      jje=jj_end
+      jjn=jj_nb
+      IF (pole_sud) jjn=jjn-1
+      IF (pole_sud) jje=jje-1
+
+
+      rlong(:) = rlonv(:) * 180. / pi
+      do jj = jjb, jje
+        rlat(jj) = rlatv(jj) * 180. / pi
+      enddo
+      
+      CALL xios_set_domain_attr("domain_V", ni_glo=iip1, nj_glo=jjm,            &
+          type="rectilinear",ibegin=0, ni=iip1, jbegin=jj_begin-1, nj=jjn,   &
+          data_dim = 2, lonvalue_1d=rlong(1:iip1), latvalue_1d=rlat(jjb:jje))
+
+
+      rlong(:) = rlonv(:) * 180. / pi
+      rlat(:) = rlatu(:) * 180. / pi 
+      CALL xios_set_domain_attr("domain_T", ni_glo=iip1, nj_glo=jjp1,          &
+          type="rectilinear",ibegin=0, ni=iip1, jbegin=jj_begin-1, nj=jj_nb,   &
+          data_dim = 2, lonvalue_1d=rlong(1:iip1), latvalue_1d=rlat(jj_begin:jj_end))
+      
+!     WRITE(*,*)'apres  domaine mod_xios_dyn3dmem'
+! Vertical axis
+       CALL xios_set_axis_attr("presnivs",n_glo=llm,value=presnivs)
+!     WRITE(*,*)'apres  vertical axis mod_xios_dyn3dmem'
+! 4 end of context definition
+       CALL xios_close_context_definition()
+!     WRITE(*,*)'apres close context init. axis mod_xios_dyn3dmem'
+!$OMP END MASTER
+   END SUBROUTINE xios_dyn3dmem_init
+
+   SUBROUTINE  writefield_dyn1d_u(name,Field)
+
+     USE parallel_lmdz
+     IMPLICIT NONE
+     include 'dimensions.h'
+     include 'paramet.h'
+     CHARACTER(LEN=*)   :: name
+     REAL, DIMENSION(ij_begin:ij_end) :: Field
+     REAL, DIMENSION(iip1,  jj_begin:jj_end) :: NewField
+      LOGICAL,SAVE :: debuglf=.true.
+!$OMP THREADPRIVATE(debuglf)
+     
+     NewField(:,jj_begin:jj_end)=reshape(Field(ij_begin:ij_end),(/iip1,jj_nb/))
+
+!$OMP BARRIER       
+!$OMP MASTER
+     CALL xios_send_field(name, NewField)
+!$OMP END MASTER   
+  
+   END SUBROUTINE  writefield_dyn1d_u
+
+   SUBROUTINE  writefield_dyn2d_u(name,Field)
+
+     USE parallel_lmdz
+     IMPLICIT NONE
+     include 'dimensions.h'
+     include 'paramet.h'
+     CHARACTER(LEN=*)   :: name
+     REAL, DIMENSION(ij_begin:ij_end,llm) :: Field
+!     REAL, ALLOCATABLE, SAVE :: NewField(:,:,:)
+     INTEGER :: i,j,l, count
+
+!!!!!$OMP BARRIER
+!!!!!$OMP MASTER
+!!!!     allocate(NewField(iip1, jj_begin:jj_end, llm))
+!!!!!$OMP END MASTER
+!!!!!$OMP BARRIER
+
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 
+     DO l = 1, llm
+       NewField_U(:,jj_begin:jj_end,l)=reshape(Field(ij_begin:ij_end,l),(/iip1,jj_nb/))
+     ENDDO
+!$OMP ENDDO
+!$OMP BARRIER 
+
+!$OMP MASTER
+     CALL xios_send_field(name, NewField_U)
+!!!!     DEALLOCATE(NewField)
+!$OMP END MASTER   
+!$OMP BARRIER
+  
+   END SUBROUTINE  writefield_dyn2d_u
+
+   SUBROUTINE  writefield_dyn1d_v(name,Field)
+
+     USE parallel_lmdz
+     IMPLICIT NONE
+     include 'dimensions.h'
+     include 'paramet.h'
+     CHARACTER(LEN=*)   :: name
+     REAL, DIMENSION(ij_begin:ij_end) :: Field
+     REAL, DIMENSION(iip1,  jj_begin:jj_end) :: NewField
+     INTEGER ::  jje, ije, jjn
+
+     IF (pole_sud) THEN
+       jje=jj_end-1
+       ije=ij_end-iip1
+       jjn=jj_nb-1
+     ELSE
+       jje=jj_end
+       ije=ij_end
+       jjn=jj_nb
+     ENDIF
+
+     NewField(:,jj_begin:jje)=reshape(Field(ij_begin:ije),(/iip1,jjn/))
+
+!$OMP BARRIER       
+!$OMP MASTER
+     CALL xios_send_field(name, NewField(:,jj_begin:jje))
+!$OMP END MASTER   
+  
+   END SUBROUTINE  writefield_dyn1d_v
+
+   SUBROUTINE  writefield_dyn2d_v(name,Field)
+
+     USE parallel_lmdz
+     IMPLICIT NONE
+     include 'dimensions.h'
+     include 'paramet.h'
+     CHARACTER(LEN=*)   :: name
+     REAL, DIMENSION(ij_begin:ij_end,llm) :: Field
+!!!!     REAL, ALLOCATABLE, SAVE :: NewField(:,:,:)
+     INTEGER :: l, jje, ije, jjn
+
+!!!!!$OMP BARRIER
+!!!!!$OMP MASTER
+!!!!     allocate(NewField(iip1,  jj_begin:jj_end,llm))
+!!!!!$OMP END MASTER
+!!!!!$OMP BARRIER
+
+     IF (pole_sud) THEN
+       jje=jj_end-1
+       ije=ij_end-iip1
+       jjn=jj_nb-1
+     ELSE
+       jje=jj_end
+       ije=ij_end
+       jjn=jj_nb
+     ENDIF
+
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+     DO l = 1, llm
+        NewField_V(:,jj_begin:jje,l)=reshape(Field(ij_begin:ije,l),(/iip1,jjn/))
+     ENDDO
+!$OMP ENDDO
+!$OMP BARRIER       
+
+!$OMP MASTER
+     CALL xios_send_field(name, NewField_V(:,jj_begin:jje,:))
+!!!!     DEALLOCATE(NewField)
+!$OMP END MASTER   
+!$OMP BARRIER 
+  
+   END SUBROUTINE  writefield_dyn2d_v
+   
+END MODULE mod_xios_dyn3dmem 
+
Index: LMDZ6/trunk/libf/dyn3dmem/nxgraro2_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/nxgraro2_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,39 +1,0 @@
-MODULE nxgraro2_mod
-
-  REAL,POINTER,SAVE ::  grx( :,: )
-  REAL,POINTER,SAVE ::  gry( :,: )
-  REAL,POINTER,SAVE ::  rot( :,: )
-  
-CONTAINS
-
-  SUBROUTINE nxgraro2_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE dimensions_mod
-  IMPLICIT NONE
-    TYPE(distrib),POINTER :: d
-    d=>distrib_dissip
-
-    CALL allocate_u(grx,llm,d)
-    CALL allocate_v(gry,llm,d)
-    CALL allocate_v(rot,llm,d)
-
-    
-  END SUBROUTINE nxgraro2_allocate
-  
-  SUBROUTINE nxgraro2_switch_dissip(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-
-    CALL switch_u(grx,distrib_dissip,dist)
-    CALL switch_v(gry,distrib_dissip,dist)
-    CALL switch_v(rot,distrib_dissip,dist)
-
-
-  END SUBROUTINE nxgraro2_switch_dissip
-  
-END MODULE nxgraro2_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/nxgraro2_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/nxgraro2_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/nxgraro2_mod.f90	(revision 5268)
@@ -0,0 +1,39 @@
+MODULE nxgraro2_mod
+
+  REAL,POINTER,SAVE ::  grx( :,: )
+  REAL,POINTER,SAVE ::  gry( :,: )
+  REAL,POINTER,SAVE ::  rot( :,: )
+  
+CONTAINS
+
+  SUBROUTINE nxgraro2_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE dimensions_mod
+  IMPLICIT NONE
+    TYPE(distrib),POINTER :: d
+    d=>distrib_dissip
+
+    CALL allocate_u(grx,llm,d)
+    CALL allocate_v(gry,llm,d)
+    CALL allocate_v(rot,llm,d)
+
+    
+  END SUBROUTINE nxgraro2_allocate
+  
+  SUBROUTINE nxgraro2_switch_dissip(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+
+    CALL switch_u(grx,distrib_dissip,dist)
+    CALL switch_v(gry,distrib_dissip,dist)
+    CALL switch_v(rot,distrib_dissip,dist)
+
+
+  END SUBROUTINE nxgraro2_switch_dissip
+  
+END MODULE nxgraro2_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/temps_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/temps_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,35 +1,0 @@
-!
-! $Id: temps_mod.F90 -1   $
-!
-MODULE temps_mod
-
-IMPLICIT NONE  
-
-  INTEGER   itaufin ! total number of dynamical steps for the run
-  INTEGER   itau_dyn
-  INTEGER   itau_phy
-  INTEGER   day_ini ! initial day # of simulation sequence
-  INTEGER   day_end ! final day # ; i.e. day # when this simulation ends
-  INTEGER   annee_ref
-  INTEGER   day_ref
-  INTEGER   year_len
-  REAL      dt ! (dynamics) time step (changes if doing Matsuno or LF step)
-  REAL      jD_ref ! reference julian day date (beginning of experiment)
-  REAL      jH_ref ! reference julian "hour" of reference julian date
-  REAL      start_time
-  CHARACTER (len=10) :: calend ! calendar type
-  INTEGER   offline_time ! offline frequency storage
-
-  ! Additionnal Mars stuff:
-  REAL hour_ini ! initial fraction of day of simulation sequence (0=<hour_ini<1)
-
-!$OMP THREADPRIVATE(dt,jD_ref,jH_ref,start_time,hour_ini,                        &
-!$OMP                day_ini,day_end,annee_ref,day_ref,itau_dyn,itau_phy,itaufin,&
-!$OMP                calend)        
-
-!WARNING: when adding a threadprivate variable in this module
-!        do not forget to add it to the copyin clause when opening an OpenMP
-!        parallel section. e.g. in gcm before call leapfrog_loc and/or
-!        possibly in iniphysiq
-
-END MODULE temps_mod
Index: LMDZ6/trunk/libf/dyn3dmem/temps_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/temps_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/temps_mod.f90	(revision 5268)
@@ -0,0 +1,35 @@
+!
+! $Id: temps_mod.F90 -1   $
+!
+MODULE temps_mod
+
+IMPLICIT NONE  
+
+  INTEGER   itaufin ! total number of dynamical steps for the run
+  INTEGER   itau_dyn
+  INTEGER   itau_phy
+  INTEGER   day_ini ! initial day # of simulation sequence
+  INTEGER   day_end ! final day # ; i.e. day # when this simulation ends
+  INTEGER   annee_ref
+  INTEGER   day_ref
+  INTEGER   year_len
+  REAL      dt ! (dynamics) time step (changes if doing Matsuno or LF step)
+  REAL      jD_ref ! reference julian day date (beginning of experiment)
+  REAL      jH_ref ! reference julian "hour" of reference julian date
+  REAL      start_time
+  CHARACTER (len=10) :: calend ! calendar type
+  INTEGER   offline_time ! offline frequency storage
+
+  ! Additionnal Mars stuff:
+  REAL hour_ini ! initial fraction of day of simulation sequence (0=<hour_ini<1)
+
+!$OMP THREADPRIVATE(dt,jD_ref,jH_ref,start_time,hour_ini,                        &
+!$OMP                day_ini,day_end,annee_ref,day_ref,itau_dyn,itau_phy,itaufin,&
+!$OMP                calend)        
+
+!WARNING: when adding a threadprivate variable in this module
+!        do not forget to add it to the copyin clause when opening an OpenMP
+!        parallel section. e.g. in gcm before call leapfrog_loc and/or
+!        possibly in iniphysiq
+
+END MODULE temps_mod
Index: LMDZ6/trunk/libf/dyn3dmem/times.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/times.F90	(revision 5267)
+++ 	(revision )
@@ -1,235 +1,0 @@
-module times
-  integer,private,save :: Last_Count=0
-  real, private,save :: Last_cpuCount=0
-  logical, private,save :: AllTimer_IsActive=.false.
-  
-  integer, parameter :: nb_timer = 4
-  integer, parameter :: timer_caldyn  = 1
-  integer, parameter :: timer_vanleer = 2
-  integer, parameter :: timer_dissip = 3
-  integer, parameter :: timer_physic = 4
-  integer, parameter :: stopped = 1
-  integer, parameter :: running = 2
-  integer, parameter :: suspended = 3 
-  
-  integer :: max_size
-  real,    allocatable, dimension(:,:,:) :: timer_table
-  real,    allocatable, dimension(:,:,:) :: timer_table_sqr 
-  integer, allocatable, dimension(:,:,:) :: timer_iteration
-  real,    allocatable, dimension(:,:,:) :: timer_average
-  real,    allocatable, dimension(:,:,:) :: timer_delta
-  real,    allocatable,dimension(:) :: timer_running, last_time
-  integer, allocatable,dimension(:) :: timer_state
-  
-  contains
-  
-  subroutine init_timer
-    USE parallel_lmdz
-    implicit none
-    INCLUDE "dimensions.h"
-    INCLUDE "paramet.h"
-    
-    max_size=jjm+1
-    allocate(timer_table(max_size,nb_timer,0:mpi_size-1))
-    allocate(timer_table_sqr(max_size,nb_timer,0:mpi_size-1))
-    allocate(timer_iteration(max_size,nb_timer,0:mpi_size-1))
-    allocate(timer_average(max_size,nb_timer,0:mpi_size-1))
-    allocate(timer_delta(max_size,nb_timer,0:mpi_size-1))
-    allocate(timer_running(nb_timer))
-    allocate(timer_state(nb_timer))
-    allocate(last_time(nb_timer))
-    
-    timer_table(:,:,:)=0
-    timer_table_sqr(:,:,:)=0
-    timer_iteration(:,:,:)=0
-    timer_average(:,:,:)=0
-    timer_delta(:,:,:)=0
-    timer_state(:)=stopped      
-  end subroutine init_timer
-  
-  subroutine start_timer(no_timer)
-    implicit none
-    integer :: no_timer
-    
-    if (AllTimer_IsActive) then
-    
-      if (timer_state(no_timer)/=stopped) then
-        CALL abort_gcm("times","start_timer :: timer is already running or suspended",1)
-      else
-        timer_state(no_timer)=running
-      endif
-      
-      timer_running(no_timer)=0
-      call cpu_time(last_time(no_timer))
-    
-    endif
-    
-  end subroutine start_timer
-  
-  subroutine suspend_timer(no_timer)
-    implicit none
-    integer :: no_timer
-     
-    if (AllTimer_IsActive) then   
-      if (timer_state(no_timer)/=running) then
-         CALL abort_gcm("times","suspend_timer :: timer is not running",1)
-      else
-        timer_state(no_timer)=suspended
-      endif
-    
-      timer_running(no_timer)=timer_running(no_timer)-last_time(no_timer)
-      call cpu_time(last_time(no_timer))
-      timer_running(no_timer)=timer_running(no_timer)+last_time(no_timer)
-    endif
-  end subroutine suspend_timer
-  
-  subroutine resume_timer(no_timer)
-    implicit none
-    integer :: no_timer
-     
-    if (AllTimer_IsActive) then   
-      if (timer_state(no_timer)/=suspended) then
-        CALL abort_gcm("times","resume_timer :: timer is not suspended",1)
-      else
-        timer_state(no_timer)=running
-      endif
-      
-      call cpu_time(last_time(no_timer))
-    endif
-    
-  end subroutine resume_timer
-
-  subroutine stop_timer(no_timer)
-    USE parallel_lmdz
-    implicit none
-    integer :: no_timer
-    integer :: N
-    real :: V,V2
-    
-    if (AllTimer_IsActive) then
-       
-      if (timer_state(no_timer)/=running) then
-        CALL abort_gcm("times","stop_timer :: timer is not running",1)
-      else
-        timer_state(no_timer)=stopped
-      endif
-    
-      timer_running(no_timer)=timer_running(no_timer)-last_time(no_timer)
-      call cpu_time(last_time(no_timer))
-      timer_running(no_timer)=timer_running(no_timer)+last_time(no_timer)
-    
-      timer_table(jj_nb,no_timer,mpi_rank)=timer_table(jj_nb,no_timer,mpi_rank)+timer_running(no_timer)
-      timer_table_sqr(jj_nb,no_timer,mpi_rank)=timer_table_sqr(jj_nb,no_timer,mpi_rank)+timer_running(no_timer)**2
-      timer_iteration(jj_nb,no_timer,mpi_rank)=timer_iteration(jj_nb,no_timer,mpi_rank)+1
-      timer_average(jj_nb,no_timer,mpi_rank)=timer_table(jj_nb,no_timer,mpi_rank)/timer_iteration(jj_nb,no_timer,mpi_rank)
-      if (timer_iteration(jj_nb,no_timer,mpi_rank)>=2) then
-        N=timer_iteration(jj_nb,no_timer,mpi_rank)
-	V2=timer_table_sqr(jj_nb,no_timer,mpi_rank)
-	V=timer_table(jj_nb,no_timer,mpi_rank)
-	timer_delta(jj_nb,no_timer,mpi_rank)=sqrt(ABS(V2-V*V/N)/(N-1)) 
-      else
-        timer_delta(jj_nb,no_timer,mpi_rank)=0
-      endif
-    endif
-    
-  end subroutine stop_timer
-   
-  subroutine allgather_timer
-    USE parallel_lmdz
-    USE lmdz_mpi
-    implicit none
-
-    integer :: ierr
-    integer :: data_size
-    real, allocatable,dimension(:,:) :: tmp_table
-
-    IF (using_mpi) THEN    
-   
-      if (AllTimer_IsActive) then
-    
-    
-      allocate(tmp_table(max_size,nb_timer))
-    
-      data_size=max_size*nb_timer
-    
-      tmp_table(:,:)=timer_table(:,:,mpi_rank)
-      call mpi_allgather(tmp_table(1,1),data_size,MPI_REAL_LMDZ,timer_table(1,1,0),data_size,MPI_REAL_LMDZ,COMM_LMDZ,ierr)
-      tmp_table(:,:)=timer_table_sqr(:,:,mpi_rank)
-      call mpi_allgather(tmp_table(1,1),data_size,MPI_REAL_LMDZ,timer_table_sqr(1,1,0),data_size,MPI_REAL_LMDZ,COMM_LMDZ,ierr)
-      deallocate(tmp_table)
-    
-      endif
-      
-    ENDIF ! using_mpi
-    
-  end subroutine allgather_timer
-  
-  subroutine allgather_timer_average
-    USE parallel_lmdz
-    USE lmdz_mpi
-    implicit none
-    integer :: ierr
-    integer :: data_size
-    real, allocatable,dimension(:,:),target :: tmp_table
-    integer, allocatable,dimension(:,:),target :: tmp_iter
-    integer :: istats
-
-    IF (using_mpi) THEN
-        
-      if (AllTimer_IsActive) then
-    
-      allocate(tmp_table(max_size,nb_timer))
-      allocate(tmp_iter(max_size,nb_timer))
-   
-      data_size=max_size*nb_timer
-
-      tmp_table(:,:)=timer_average(:,:,mpi_rank)
-      call mpi_allgather(tmp_table(1,1),data_size,MPI_REAL_LMDZ,timer_average(1,1,0),data_size,MPI_REAL_LMDZ,COMM_LMDZ,ierr)
-      tmp_table(:,:)=timer_delta(:,:,mpi_rank)
-      call mpi_allgather(tmp_table(1,1),data_size,MPI_REAL_LMDZ,timer_delta(1,1,0),data_size,MPI_REAL_LMDZ,COMM_LMDZ,ierr)
-      tmp_iter(:,:)=timer_iteration(:,:,mpi_rank)
-      call mpi_allgather(tmp_iter(1,1),data_size,MPI_INTEGER,timer_iteration(1,1,0),data_size,MPI_INTEGER,COMM_LMDZ,ierr)
-      deallocate(tmp_table)
-    
-      endif
-      
-    ENDIF  ! using_mp�
-  end subroutine allgather_timer_average
-  
-  subroutine InitTime
-  implicit none
-    integer :: count,count_rate,count_max
-    
-    AllTimer_IsActive=.TRUE.
-    if (AllTimer_IsActive) then
-      call system_clock(count,count_rate,count_max)
-      call cpu_time(Last_cpuCount)
-      Last_Count=count
-    endif
-  end subroutine InitTime
-  
-  function DiffTime()
-  implicit none
-    double precision :: DiffTime
-    integer :: count,count_rate,count_max
-  
-    call system_clock(count,count_rate,count_max)
-    if (Count>=Last_Count) then
-      DiffTime=(1.*(Count-last_Count))/count_rate
-    else
-      DiffTime=(1.*(Count-last_Count+Count_max))/count_rate
-    endif
-    Last_Count=Count 
-  end function DiffTime
-  
-  function DiffCpuTime()
-  implicit none
-    real :: DiffCpuTime
-    real :: Count
-    
-    call cpu_time(Count)
-    DiffCpuTime=Count-Last_cpuCount
-    Last_cpuCount=Count 
-  end function DiffCpuTime
-
-end module times
Index: LMDZ6/trunk/libf/dyn3dmem/times.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/times.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/times.f90	(revision 5268)
@@ -0,0 +1,235 @@
+module times
+  integer,private,save :: Last_Count=0
+  real, private,save :: Last_cpuCount=0
+  logical, private,save :: AllTimer_IsActive=.false.
+  
+  integer, parameter :: nb_timer = 4
+  integer, parameter :: timer_caldyn  = 1
+  integer, parameter :: timer_vanleer = 2
+  integer, parameter :: timer_dissip = 3
+  integer, parameter :: timer_physic = 4
+  integer, parameter :: stopped = 1
+  integer, parameter :: running = 2
+  integer, parameter :: suspended = 3 
+  
+  integer :: max_size
+  real,    allocatable, dimension(:,:,:) :: timer_table
+  real,    allocatable, dimension(:,:,:) :: timer_table_sqr 
+  integer, allocatable, dimension(:,:,:) :: timer_iteration
+  real,    allocatable, dimension(:,:,:) :: timer_average
+  real,    allocatable, dimension(:,:,:) :: timer_delta
+  real,    allocatable,dimension(:) :: timer_running, last_time
+  integer, allocatable,dimension(:) :: timer_state
+  
+  contains
+  
+  subroutine init_timer
+    USE parallel_lmdz
+    implicit none
+    INCLUDE "dimensions.h"
+    INCLUDE "paramet.h"
+    
+    max_size=jjm+1
+    allocate(timer_table(max_size,nb_timer,0:mpi_size-1))
+    allocate(timer_table_sqr(max_size,nb_timer,0:mpi_size-1))
+    allocate(timer_iteration(max_size,nb_timer,0:mpi_size-1))
+    allocate(timer_average(max_size,nb_timer,0:mpi_size-1))
+    allocate(timer_delta(max_size,nb_timer,0:mpi_size-1))
+    allocate(timer_running(nb_timer))
+    allocate(timer_state(nb_timer))
+    allocate(last_time(nb_timer))
+    
+    timer_table(:,:,:)=0
+    timer_table_sqr(:,:,:)=0
+    timer_iteration(:,:,:)=0
+    timer_average(:,:,:)=0
+    timer_delta(:,:,:)=0
+    timer_state(:)=stopped      
+  end subroutine init_timer
+  
+  subroutine start_timer(no_timer)
+    implicit none
+    integer :: no_timer
+    
+    if (AllTimer_IsActive) then
+    
+      if (timer_state(no_timer)/=stopped) then
+        CALL abort_gcm("times","start_timer :: timer is already running or suspended",1)
+      else
+        timer_state(no_timer)=running
+      endif
+      
+      timer_running(no_timer)=0
+      call cpu_time(last_time(no_timer))
+    
+    endif
+    
+  end subroutine start_timer
+  
+  subroutine suspend_timer(no_timer)
+    implicit none
+    integer :: no_timer
+     
+    if (AllTimer_IsActive) then   
+      if (timer_state(no_timer)/=running) then
+         CALL abort_gcm("times","suspend_timer :: timer is not running",1)
+      else
+        timer_state(no_timer)=suspended
+      endif
+    
+      timer_running(no_timer)=timer_running(no_timer)-last_time(no_timer)
+      call cpu_time(last_time(no_timer))
+      timer_running(no_timer)=timer_running(no_timer)+last_time(no_timer)
+    endif
+  end subroutine suspend_timer
+  
+  subroutine resume_timer(no_timer)
+    implicit none
+    integer :: no_timer
+     
+    if (AllTimer_IsActive) then   
+      if (timer_state(no_timer)/=suspended) then
+        CALL abort_gcm("times","resume_timer :: timer is not suspended",1)
+      else
+        timer_state(no_timer)=running
+      endif
+      
+      call cpu_time(last_time(no_timer))
+    endif
+    
+  end subroutine resume_timer
+
+  subroutine stop_timer(no_timer)
+    USE parallel_lmdz
+    implicit none
+    integer :: no_timer
+    integer :: N
+    real :: V,V2
+    
+    if (AllTimer_IsActive) then
+       
+      if (timer_state(no_timer)/=running) then
+        CALL abort_gcm("times","stop_timer :: timer is not running",1)
+      else
+        timer_state(no_timer)=stopped
+      endif
+    
+      timer_running(no_timer)=timer_running(no_timer)-last_time(no_timer)
+      call cpu_time(last_time(no_timer))
+      timer_running(no_timer)=timer_running(no_timer)+last_time(no_timer)
+    
+      timer_table(jj_nb,no_timer,mpi_rank)=timer_table(jj_nb,no_timer,mpi_rank)+timer_running(no_timer)
+      timer_table_sqr(jj_nb,no_timer,mpi_rank)=timer_table_sqr(jj_nb,no_timer,mpi_rank)+timer_running(no_timer)**2
+      timer_iteration(jj_nb,no_timer,mpi_rank)=timer_iteration(jj_nb,no_timer,mpi_rank)+1
+      timer_average(jj_nb,no_timer,mpi_rank)=timer_table(jj_nb,no_timer,mpi_rank)/timer_iteration(jj_nb,no_timer,mpi_rank)
+      if (timer_iteration(jj_nb,no_timer,mpi_rank)>=2) then
+        N=timer_iteration(jj_nb,no_timer,mpi_rank)
+	V2=timer_table_sqr(jj_nb,no_timer,mpi_rank)
+	V=timer_table(jj_nb,no_timer,mpi_rank)
+	timer_delta(jj_nb,no_timer,mpi_rank)=sqrt(ABS(V2-V*V/N)/(N-1)) 
+      else
+        timer_delta(jj_nb,no_timer,mpi_rank)=0
+      endif
+    endif
+    
+  end subroutine stop_timer
+   
+  subroutine allgather_timer
+    USE parallel_lmdz
+    USE lmdz_mpi
+    implicit none
+
+    integer :: ierr
+    integer :: data_size
+    real, allocatable,dimension(:,:) :: tmp_table
+
+    IF (using_mpi) THEN    
+   
+      if (AllTimer_IsActive) then
+    
+    
+      allocate(tmp_table(max_size,nb_timer))
+    
+      data_size=max_size*nb_timer
+    
+      tmp_table(:,:)=timer_table(:,:,mpi_rank)
+      call mpi_allgather(tmp_table(1,1),data_size,MPI_REAL_LMDZ,timer_table(1,1,0),data_size,MPI_REAL_LMDZ,COMM_LMDZ,ierr)
+      tmp_table(:,:)=timer_table_sqr(:,:,mpi_rank)
+      call mpi_allgather(tmp_table(1,1),data_size,MPI_REAL_LMDZ,timer_table_sqr(1,1,0),data_size,MPI_REAL_LMDZ,COMM_LMDZ,ierr)
+      deallocate(tmp_table)
+    
+      endif
+      
+    ENDIF ! using_mpi
+    
+  end subroutine allgather_timer
+  
+  subroutine allgather_timer_average
+    USE parallel_lmdz
+    USE lmdz_mpi
+    implicit none
+    integer :: ierr
+    integer :: data_size
+    real, allocatable,dimension(:,:),target :: tmp_table
+    integer, allocatable,dimension(:,:),target :: tmp_iter
+    integer :: istats
+
+    IF (using_mpi) THEN
+        
+      if (AllTimer_IsActive) then
+    
+      allocate(tmp_table(max_size,nb_timer))
+      allocate(tmp_iter(max_size,nb_timer))
+   
+      data_size=max_size*nb_timer
+
+      tmp_table(:,:)=timer_average(:,:,mpi_rank)
+      call mpi_allgather(tmp_table(1,1),data_size,MPI_REAL_LMDZ,timer_average(1,1,0),data_size,MPI_REAL_LMDZ,COMM_LMDZ,ierr)
+      tmp_table(:,:)=timer_delta(:,:,mpi_rank)
+      call mpi_allgather(tmp_table(1,1),data_size,MPI_REAL_LMDZ,timer_delta(1,1,0),data_size,MPI_REAL_LMDZ,COMM_LMDZ,ierr)
+      tmp_iter(:,:)=timer_iteration(:,:,mpi_rank)
+      call mpi_allgather(tmp_iter(1,1),data_size,MPI_INTEGER,timer_iteration(1,1,0),data_size,MPI_INTEGER,COMM_LMDZ,ierr)
+      deallocate(tmp_table)
+    
+      endif
+      
+    ENDIF  ! using_mp�
+  end subroutine allgather_timer_average
+  
+  subroutine InitTime
+  implicit none
+    integer :: count,count_rate,count_max
+    
+    AllTimer_IsActive=.TRUE.
+    if (AllTimer_IsActive) then
+      call system_clock(count,count_rate,count_max)
+      call cpu_time(Last_cpuCount)
+      Last_Count=count
+    endif
+  end subroutine InitTime
+  
+  function DiffTime()
+  implicit none
+    double precision :: DiffTime
+    integer :: count,count_rate,count_max
+  
+    call system_clock(count,count_rate,count_max)
+    if (Count>=Last_Count) then
+      DiffTime=(1.*(Count-last_Count))/count_rate
+    else
+      DiffTime=(1.*(Count-last_Count+Count_max))/count_rate
+    endif
+    Last_Count=Count 
+  end function DiffTime
+  
+  function DiffCpuTime()
+  implicit none
+    real :: DiffCpuTime
+    real :: Count
+    
+    call cpu_time(Count)
+    DiffCpuTime=Count-Last_cpuCount
+    Last_cpuCount=Count 
+  end function DiffCpuTime
+
+end module times
Index: LMDZ6/trunk/libf/dyn3dmem/tourpot_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/tourpot_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,64 +1,0 @@
-SUBROUTINE tourpot_loc ( vcov, ucov, massebxy, vorpot )
-!
-!-------------------------------------------------------------------------------
-! Authors: P. Le Van.
-!-------------------------------------------------------------------------------
-! Purpose: Compute potential vorticity.
-  USE parallel_lmdz
-  USE mod_filtreg_p
-  IMPLICIT NONE
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-!===============================================================================
-! Arguments:
-  REAL, INTENT(IN)  :: vcov    (ijb_v:ije_v,llm)
-  REAL, INTENT(IN)  :: ucov    (ijb_u:ije_u,llm)
-  REAL, INTENT(IN)  :: massebxy(ijb_v:ije_v,llm)
-  REAL, INTENT(OUT) :: vorpot  (ijb_v:ije_v,llm)
-!===============================================================================
-! Method used:
-!   vorpot = ( Filtre( d(vcov)/dx - d(ucov)/dy ) + fext ) /psbarxy
-!===============================================================================
-! Local variables:
-  INTEGER :: l, ij, ije, ijb, jje, jjb
-  REAL    :: rot(ijb_v:ije_v,llm)
-!===============================================================================
-
-  ijb=ij_begin-iip1
-  ije=ij_end
-  IF(pole_nord) ijb=ij_begin
-
-!--- Wind vorticity ; correction: rot(iip1,j,l) = rot(1,j,l)
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-    IF(pole_sud) ije=ij_end-iip1-1
-    DO ij=ijb,ije
-      rot(ij,l)=vcov(ij+1,l)-vcov(ij,l)+ucov(ij+iip1,l)-ucov(ij,l)
-    END DO
-    IF(pole_sud) ije=ij_end-iip1
-    DO ij=ijb+iip1-1,ije,iip1; rot(ij,l)=rot(ij-iim,l); END DO
-  END DO
-!$OMP END DO NOWAIT
-
-!--- Filter
-  jjb=jj_begin-1
-  jje=jj_end
-  IF(pole_nord) jjb=jjb+1
-  IF(pole_sud)  jje=jje-1
-  CALL filtreg_p(rot,jjb_v,jje_v,jjb,jje,jjm,llm,2,1,.FALSE.,1)
-
-!--- Potential vorticity ; correction: rot(iip1,j,l) = rot(1,j,l)
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  DO l=1,llm
-    IF(pole_sud) ije=ij_end-iip1-1
-    DO ij=ijb,ije
-      vorpot(ij,l)=(rot(ij,l)+fext(ij))/massebxy(ij,l)
-    END DO
-    IF(pole_sud) ije=ij_end-iip1
-    DO ij=ijb+iip1-1,ije,iip1; vorpot(ij,l)=vorpot(ij-iim,l); END DO
-  END DO
-!$OMP END DO NOWAIT
-
-END SUBROUTINE tourpot_loc
-
Index: LMDZ6/trunk/libf/dyn3dmem/tourpot_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/tourpot_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/tourpot_loc.f90	(revision 5268)
@@ -0,0 +1,64 @@
+SUBROUTINE tourpot_loc ( vcov, ucov, massebxy, vorpot )
+!
+!-------------------------------------------------------------------------------
+! Authors: P. Le Van.
+!-------------------------------------------------------------------------------
+! Purpose: Compute potential vorticity.
+  USE parallel_lmdz
+  USE mod_filtreg_p
+  IMPLICIT NONE
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+!===============================================================================
+! Arguments:
+  REAL, INTENT(IN)  :: vcov    (ijb_v:ije_v,llm)
+  REAL, INTENT(IN)  :: ucov    (ijb_u:ije_u,llm)
+  REAL, INTENT(IN)  :: massebxy(ijb_v:ije_v,llm)
+  REAL, INTENT(OUT) :: vorpot  (ijb_v:ije_v,llm)
+!===============================================================================
+! Method used:
+!   vorpot = ( Filtre( d(vcov)/dx - d(ucov)/dy ) + fext ) /psbarxy
+!===============================================================================
+! Local variables:
+  INTEGER :: l, ij, ije, ijb, jje, jjb
+  REAL    :: rot(ijb_v:ije_v,llm)
+!===============================================================================
+
+  ijb=ij_begin-iip1
+  ije=ij_end
+  IF(pole_nord) ijb=ij_begin
+
+!--- Wind vorticity ; correction: rot(iip1,j,l) = rot(1,j,l)
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+    IF(pole_sud) ije=ij_end-iip1-1
+    DO ij=ijb,ije
+      rot(ij,l)=vcov(ij+1,l)-vcov(ij,l)+ucov(ij+iip1,l)-ucov(ij,l)
+    END DO
+    IF(pole_sud) ije=ij_end-iip1
+    DO ij=ijb+iip1-1,ije,iip1; rot(ij,l)=rot(ij-iim,l); END DO
+  END DO
+!$OMP END DO NOWAIT
+
+!--- Filter
+  jjb=jj_begin-1
+  jje=jj_end
+  IF(pole_nord) jjb=jjb+1
+  IF(pole_sud)  jje=jje-1
+  CALL filtreg_p(rot,jjb_v,jje_v,jjb,jje,jjm,llm,2,1,.FALSE.,1)
+
+!--- Potential vorticity ; correction: rot(iip1,j,l) = rot(1,j,l)
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  DO l=1,llm
+    IF(pole_sud) ije=ij_end-iip1-1
+    DO ij=ijb,ije
+      vorpot(ij,l)=(rot(ij,l)+fext(ij))/massebxy(ij,l)
+    END DO
+    IF(pole_sud) ije=ij_end-iip1
+    DO ij=ijb+iip1-1,ije,iip1; vorpot(ij,l)=vorpot(ij-iim,l); END DO
+  END DO
+!$OMP END DO NOWAIT
+
+END SUBROUTINE tourpot_loc
+
Index: LMDZ6/trunk/libf/dyn3dmem/vitvert_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/vitvert_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,39 +1,0 @@
-SUBROUTINE vitvert_loc(convm, w)
-!
-!-------------------------------------------------------------------------------
-! Authors: P. Le Van , Fr. Hourdin.
-!-------------------------------------------------------------------------------
-! Purpose: Compute vertical speed at sigma levels.
-  USE parallel_lmdz
-  USE comvert_mod, ONLY: bp
-  
-  IMPLICIT NONE
-  include "dimensions.h"
-  include "paramet.h"
-!===============================================================================
-! Arguments:
-  REAL, INTENT(IN)  :: convm(ijb_u:ije_u,llm)
-  REAL, INTENT(OUT) :: w    (ijb_u:ije_u,llm)
-!===============================================================================
-! Notes: Vertical speed is oriented from bottom to top.
-!   * At ground - level sigma(1):     w(i,j,1) = 0.
-!   * At top    - level sigma(llm+1): w(i,j,l) = 0. (not stored in w)
-!===============================================================================
-! Local variables:
-  INTEGER :: l, ijb, ije
-!===============================================================================
-  ijb=ij_begin
-  ije=ij_end+iip1
-  IF(pole_sud) ije=ij_end
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)      
-  DO l=1,llmm1
-    w(ijb:ije,l+1)=convm(ijb:ije,l+1)-bp(l+1)*convm(ijb:ije,1)
-  END DO
-!$OMP END DO
-!$OMP MASTER
-  w(ijb:ije,1)=0.
-!$OMP END MASTER
-!$OMP BARRIER
-
-END SUBROUTINE vitvert_loc
-
Index: LMDZ6/trunk/libf/dyn3dmem/vitvert_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/vitvert_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/vitvert_loc.f90	(revision 5268)
@@ -0,0 +1,39 @@
+SUBROUTINE vitvert_loc(convm, w)
+!
+!-------------------------------------------------------------------------------
+! Authors: P. Le Van , Fr. Hourdin.
+!-------------------------------------------------------------------------------
+! Purpose: Compute vertical speed at sigma levels.
+  USE parallel_lmdz
+  USE comvert_mod, ONLY: bp
+  
+  IMPLICIT NONE
+  include "dimensions.h"
+  include "paramet.h"
+!===============================================================================
+! Arguments:
+  REAL, INTENT(IN)  :: convm(ijb_u:ije_u,llm)
+  REAL, INTENT(OUT) :: w    (ijb_u:ije_u,llm)
+!===============================================================================
+! Notes: Vertical speed is oriented from bottom to top.
+!   * At ground - level sigma(1):     w(i,j,1) = 0.
+!   * At top    - level sigma(llm+1): w(i,j,l) = 0. (not stored in w)
+!===============================================================================
+! Local variables:
+  INTEGER :: l, ijb, ije
+!===============================================================================
+  ijb=ij_begin
+  ije=ij_end+iip1
+  IF(pole_sud) ije=ij_end
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)      
+  DO l=1,llmm1
+    w(ijb:ije,l+1)=convm(ijb:ije,l+1)-bp(l+1)*convm(ijb:ije,1)
+  END DO
+!$OMP END DO
+!$OMP MASTER
+  w(ijb:ije,1)=0.
+!$OMP END MASTER
+!$OMP BARRIER
+
+END SUBROUTINE vitvert_loc
+
Index: LMDZ6/trunk/libf/dyn3dmem/vlspltgen_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/vlspltgen_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,54 +1,0 @@
-MODULE vlspltgen_mod
-
-  REAL,POINTER,SAVE :: qsat(:,:)
-  REAL,POINTER,SAVE :: mu(:,:) ! CRisi: on ajoute une dimension
-  REAL,POINTER,SAVE :: mv(:,:)
-  REAL,POINTER,SAVE :: mw(:,:,:)
-  REAL,POINTER,SAVE :: zm(:,:,:)
-  REAL,POINTER,SAVE :: zq(:,:,:)
- 
-CONTAINS
-
-  SUBROUTINE vlspltgen_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE infotrac
-  USE vlz_mod,ONLY : vlz_allocate 
-  IMPLICIT NONE
-  INCLUDE "dimensions.h"
-  INCLUDE "paramet.h"
-  TYPE(distrib),POINTER :: d
-    
-    d=>distrib_vanleer
-    CALL allocate_u(qsat,llm,d)
-    CALL allocate_u(mu,llm,d)
-    CALL allocate_v(mv,llm,d)
-    CALL allocate_u(mw,llm+1,nqtot,d)
-    CALL allocate_u(zm,llm,nqtot,d)
-    CALL allocate_u(zq,llm,nqtot,d)
-
-    CALL vlz_allocate
-
-  END SUBROUTINE vlspltgen_allocate
-  
-  SUBROUTINE vlspltgen_switch_vanleer(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  USE vlz_mod,ONLY : vlz_switch_vanleer 
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-  
-    CALL switch_u(qsat,distrib_vanleer,dist)
-    CALL switch_u(mu,distrib_vanleer,dist)
-    CALL switch_u(mv,distrib_vanleer,dist)
-    CALL switch_u(mw,distrib_vanleer,dist)
-    CALL switch_u(zm,distrib_vanleer,dist)
-    CALL switch_u(zq,distrib_vanleer,dist)
-
-    CALL vlz_switch_vanleer(dist)
-
-  END SUBROUTINE vlspltgen_switch_vanleer  
-  
-END MODULE vlspltgen_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/vlspltgen_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/vlspltgen_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/vlspltgen_mod.f90	(revision 5268)
@@ -0,0 +1,54 @@
+MODULE vlspltgen_mod
+
+  REAL,POINTER,SAVE :: qsat(:,:)
+  REAL,POINTER,SAVE :: mu(:,:) ! CRisi: on ajoute une dimension
+  REAL,POINTER,SAVE :: mv(:,:)
+  REAL,POINTER,SAVE :: mw(:,:,:)
+  REAL,POINTER,SAVE :: zm(:,:,:)
+  REAL,POINTER,SAVE :: zq(:,:,:)
+ 
+CONTAINS
+
+  SUBROUTINE vlspltgen_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE infotrac
+  USE vlz_mod,ONLY : vlz_allocate 
+  IMPLICIT NONE
+  INCLUDE "dimensions.h"
+  INCLUDE "paramet.h"
+  TYPE(distrib),POINTER :: d
+    
+    d=>distrib_vanleer
+    CALL allocate_u(qsat,llm,d)
+    CALL allocate_u(mu,llm,d)
+    CALL allocate_v(mv,llm,d)
+    CALL allocate_u(mw,llm+1,nqtot,d)
+    CALL allocate_u(zm,llm,nqtot,d)
+    CALL allocate_u(zq,llm,nqtot,d)
+
+    CALL vlz_allocate
+
+  END SUBROUTINE vlspltgen_allocate
+  
+  SUBROUTINE vlspltgen_switch_vanleer(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  USE vlz_mod,ONLY : vlz_switch_vanleer 
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+  
+    CALL switch_u(qsat,distrib_vanleer,dist)
+    CALL switch_u(mu,distrib_vanleer,dist)
+    CALL switch_u(mv,distrib_vanleer,dist)
+    CALL switch_u(mw,distrib_vanleer,dist)
+    CALL switch_u(zm,distrib_vanleer,dist)
+    CALL switch_u(zq,distrib_vanleer,dist)
+
+    CALL vlz_switch_vanleer(dist)
+
+  END SUBROUTINE vlspltgen_switch_vanleer  
+  
+END MODULE vlspltgen_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/vlz_mod.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/vlz_mod.F90	(revision 5267)
+++ 	(revision )
@@ -1,46 +1,0 @@
-MODULE vlz_mod
-
-  REAL,POINTER,SAVE :: wq(:,:,:)
-  REAL,POINTER,SAVE :: dzq(:,:)
-  REAL,POINTER,SAVE :: dzqw(:,:)
-  REAL,POINTER,SAVE :: adzqw(:,:)
-  ! CRisi: pour les traceurs:
-  REAL,POINTER,SAVE :: Ratio(:,:,:)
-  
-CONTAINS
-
-  SUBROUTINE vlz_allocate
-  USE bands
-  USE allocate_field_mod
-  USE parallel_lmdz
-  USE infotrac
-  USE dimensions_mod
-  IMPLICIT NONE
-  TYPE(distrib),POINTER :: d
-    
-    d=>distrib_vanleer
-    CALL allocate_u(wq,llm+1,nqtot,d)
-    CALL allocate_u(dzq,llm,d)
-    CALL allocate_u(dzqw,llm,d)
-    CALL allocate_u(adzqw,llm,d)
-    IF(ANY(tracers(:)%nqDescen > 0)) CALL allocate_u(Ratio,llm,nqtot,d)
-
-  END SUBROUTINE vlz_allocate
-  
-  SUBROUTINE vlz_switch_vanleer(dist)
-  USE allocate_field_mod
-  USE bands
-  USE parallel_lmdz
-  USE infotrac
-  IMPLICIT NONE
-    TYPE(distrib),INTENT(IN) :: dist
-  
-    CALL switch_u(wq,distrib_vanleer,dist)
-    CALL switch_u(dzq,distrib_vanleer,dist)
-    CALL switch_u(dzqw,distrib_vanleer,dist)
-    CALL switch_u(adzqw,distrib_vanleer,dist)
-    IF(ANY(tracers(:)%nqDescen > 0)) CALL switch_u(Ratio,distrib_vanleer,dist)
-
-  END SUBROUTINE vlz_switch_vanleer  
-  
-END MODULE vlz_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/vlz_mod.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/vlz_mod.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/vlz_mod.f90	(revision 5268)
@@ -0,0 +1,46 @@
+MODULE vlz_mod
+
+  REAL,POINTER,SAVE :: wq(:,:,:)
+  REAL,POINTER,SAVE :: dzq(:,:)
+  REAL,POINTER,SAVE :: dzqw(:,:)
+  REAL,POINTER,SAVE :: adzqw(:,:)
+  ! CRisi: pour les traceurs:
+  REAL,POINTER,SAVE :: Ratio(:,:,:)
+  
+CONTAINS
+
+  SUBROUTINE vlz_allocate
+  USE bands
+  USE allocate_field_mod
+  USE parallel_lmdz
+  USE infotrac
+  USE dimensions_mod
+  IMPLICIT NONE
+  TYPE(distrib),POINTER :: d
+    
+    d=>distrib_vanleer
+    CALL allocate_u(wq,llm+1,nqtot,d)
+    CALL allocate_u(dzq,llm,d)
+    CALL allocate_u(dzqw,llm,d)
+    CALL allocate_u(adzqw,llm,d)
+    IF(ANY(tracers(:)%nqDescen > 0)) CALL allocate_u(Ratio,llm,nqtot,d)
+
+  END SUBROUTINE vlz_allocate
+  
+  SUBROUTINE vlz_switch_vanleer(dist)
+  USE allocate_field_mod
+  USE bands
+  USE parallel_lmdz
+  USE infotrac
+  IMPLICIT NONE
+    TYPE(distrib),INTENT(IN) :: dist
+  
+    CALL switch_u(wq,distrib_vanleer,dist)
+    CALL switch_u(dzq,distrib_vanleer,dist)
+    CALL switch_u(dzqw,distrib_vanleer,dist)
+    CALL switch_u(adzqw,distrib_vanleer,dist)
+    IF(ANY(tracers(:)%nqDescen > 0)) CALL switch_u(Ratio,distrib_vanleer,dist)
+
+  END SUBROUTINE vlz_switch_vanleer  
+  
+END MODULE vlz_mod  
Index: LMDZ6/trunk/libf/dyn3dmem/write_field_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/write_field_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,155 +1,0 @@
-module write_field_loc
-implicit none
-  
-  interface WriteField_u
-    module procedure Write_field1d_u,Write_Field2d_u
-  end interface WriteField_u
-
-  interface WriteField_v
-    module procedure Write_field1d_v,Write_Field2d_v
-  end interface WriteField_v
-  
-  contains
-  
-  subroutine write_field1D_u(name,Field)
-    character(len=*)   :: name
-    real, dimension(:) :: Field
-
-    CALL write_field_u_gen(name,Field,1)
-
-  end subroutine write_field1D_u
-
-  subroutine write_field2D_u(name,Field)
-    implicit none
-      
-    character(len=*)   :: name
-    real, dimension(:,:) :: Field
-    integer :: ll
-    
-    ll=size(field,2)    
-    CALL write_field_u_gen(name,Field,ll)
-    
-    end subroutine write_field2D_u
-
-
-   SUBROUTINE write_field_u_gen(name,Field,ll)
-    USE parallel_lmdz
-    USE write_field
-    USE mod_hallo
-    implicit none
-    include 'dimensions.h'
-    include 'paramet.h'
-      
-    character(len=*)   :: name
-    real, dimension(ijb_u:ije_u,ll) :: Field
-    real, allocatable,SAVE :: New_Field(:,:,:)
-    integer,dimension(0:mpi_size-1) :: jj_nb_master
-    type(Request),SAVE :: Request_write
-!$OMP THREADPRIVATE(Request_write)
-    integer :: ll,i
-    
-    
-    jj_nb_master(:)=0
-    jj_nb_master(0)=jjp1
-!$OMP BARRIER
-!$OMP MASTER
-    allocate(New_Field(iip1,jjp1,ll))
-!$OMP END MASTER
-!$OMP BARRIER
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    DO i=1,ll    
-      New_Field(:,jj_begin:jj_end,i)=reshape(Field(ij_begin:ij_end,i),(/iip1,jj_nb/))
-    ENDDO
-!$OMP BARRIER    
-    call Register_SwapField(new_field,new_field,ip1jmp1,ll,jj_Nb_master,Request_write)
-    call SendRequest(Request_write)
-!$OMP BARRIER
-    call WaitRequest(Request_write)     
-!$OMP BARRIER
-
-!$OMP MASTER
-    if (MPI_Rank==0) call WriteField(name,New_Field)
-    DEALLOCATE(New_Field)
-!$OMP END MASTER        
-!$OMP BARRIER
-    END SUBROUTINE write_field_u_gen
-
-
-  subroutine write_field1D_v(name,Field)
-    character(len=*)   :: name
-    real, dimension(:) :: Field
-
-    CALL write_field_v_gen(name,Field,1)
-
-  end subroutine write_field1D_v
-
-  subroutine write_field2D_v(name,Field)
-    implicit none
-      
-    character(len=*)   :: name
-    real, dimension(:,:) :: Field
-    integer :: ll
-    
-    ll=size(field,2)    
-    CALL write_field_v_gen(name,Field,ll)
-    
-    end subroutine write_field2D_v
-
-
-   SUBROUTINE write_field_v_gen(name,Field,ll)
-    USE parallel_lmdz
-    USE write_field
-    USE mod_hallo
-    implicit none
-    include 'dimensions.h'
-    include 'paramet.h'
-      
-    character(len=*)   :: name
-    real, dimension(ijb_v:ije_v,ll) :: Field
-    real, allocatable,SAVE :: New_Field(:,:,:)
-    integer,dimension(0:mpi_size-1) :: jj_nb_master
-    type(Request),SAVE :: Request_write
-!$OMP THREADPRIVATE(Request_write)    
-    integer :: ll,i,jje,ije,jjn
-    
-    
-    jj_nb_master(:)=0
-    jj_nb_master(0)=jjp1
-
-!$OMP BARRIER
-!$OMP MASTER
-    allocate(New_Field(iip1,jjm,ll))
-!$OMP END MASTER
-!$OMP BARRIER
-
-   IF (pole_sud) THEN
-     jje=jj_end-1
-     ije=ij_end-iip1
-     jjn=jj_nb-1
-   ELSE
-     jje=jj_end
-     ije=ij_end
-     jjn=jj_nb
-   ENDIF
-   
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-    DO i=1,ll    
-      New_Field(:,jj_begin:jje,i)=reshape(Field(ij_begin:ije,i),(/iip1,jjn/))
-    ENDDO
-!$OMP BARRIER    
-    call Register_SwapField(new_field,new_field,ip1jm,ll,jj_Nb_master,Request_write)
-    call SendRequest(Request_write)
-!$OMP BARRIER
-    call WaitRequest(Request_write)     
-!$OMP BARRIER
-
-!$OMP MASTER
-    if (MPI_Rank==0) call WriteField(name,New_Field)
-    DEALLOCATE(New_Field)
-!$OMP END MASTER        
-!$OMP BARRIER
-    END SUBROUTINE write_field_v_gen
-    
-end module write_field_loc
-  
Index: LMDZ6/trunk/libf/dyn3dmem/write_field_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/write_field_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/write_field_loc.f90	(revision 5268)
@@ -0,0 +1,155 @@
+module write_field_loc
+implicit none
+  
+  interface WriteField_u
+    module procedure Write_field1d_u,Write_Field2d_u
+  end interface WriteField_u
+
+  interface WriteField_v
+    module procedure Write_field1d_v,Write_Field2d_v
+  end interface WriteField_v
+  
+  contains
+  
+  subroutine write_field1D_u(name,Field)
+    character(len=*)   :: name
+    real, dimension(:) :: Field
+
+    CALL write_field_u_gen(name,Field,1)
+
+  end subroutine write_field1D_u
+
+  subroutine write_field2D_u(name,Field)
+    implicit none
+      
+    character(len=*)   :: name
+    real, dimension(:,:) :: Field
+    integer :: ll
+    
+    ll=size(field,2)    
+    CALL write_field_u_gen(name,Field,ll)
+    
+    end subroutine write_field2D_u
+
+
+   SUBROUTINE write_field_u_gen(name,Field,ll)
+    USE parallel_lmdz
+    USE write_field
+    USE mod_hallo
+    implicit none
+    include 'dimensions.h'
+    include 'paramet.h'
+      
+    character(len=*)   :: name
+    real, dimension(ijb_u:ije_u,ll) :: Field
+    real, allocatable,SAVE :: New_Field(:,:,:)
+    integer,dimension(0:mpi_size-1) :: jj_nb_master
+    type(Request),SAVE :: Request_write
+!$OMP THREADPRIVATE(Request_write)
+    integer :: ll,i
+    
+    
+    jj_nb_master(:)=0
+    jj_nb_master(0)=jjp1
+!$OMP BARRIER
+!$OMP MASTER
+    allocate(New_Field(iip1,jjp1,ll))
+!$OMP END MASTER
+!$OMP BARRIER
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    DO i=1,ll    
+      New_Field(:,jj_begin:jj_end,i)=reshape(Field(ij_begin:ij_end,i),(/iip1,jj_nb/))
+    ENDDO
+!$OMP BARRIER    
+    call Register_SwapField(new_field,new_field,ip1jmp1,ll,jj_Nb_master,Request_write)
+    call SendRequest(Request_write)
+!$OMP BARRIER
+    call WaitRequest(Request_write)     
+!$OMP BARRIER
+
+!$OMP MASTER
+    if (MPI_Rank==0) call WriteField(name,New_Field)
+    DEALLOCATE(New_Field)
+!$OMP END MASTER        
+!$OMP BARRIER
+    END SUBROUTINE write_field_u_gen
+
+
+  subroutine write_field1D_v(name,Field)
+    character(len=*)   :: name
+    real, dimension(:) :: Field
+
+    CALL write_field_v_gen(name,Field,1)
+
+  end subroutine write_field1D_v
+
+  subroutine write_field2D_v(name,Field)
+    implicit none
+      
+    character(len=*)   :: name
+    real, dimension(:,:) :: Field
+    integer :: ll
+    
+    ll=size(field,2)    
+    CALL write_field_v_gen(name,Field,ll)
+    
+    end subroutine write_field2D_v
+
+
+   SUBROUTINE write_field_v_gen(name,Field,ll)
+    USE parallel_lmdz
+    USE write_field
+    USE mod_hallo
+    implicit none
+    include 'dimensions.h'
+    include 'paramet.h'
+      
+    character(len=*)   :: name
+    real, dimension(ijb_v:ije_v,ll) :: Field
+    real, allocatable,SAVE :: New_Field(:,:,:)
+    integer,dimension(0:mpi_size-1) :: jj_nb_master
+    type(Request),SAVE :: Request_write
+!$OMP THREADPRIVATE(Request_write)    
+    integer :: ll,i,jje,ije,jjn
+    
+    
+    jj_nb_master(:)=0
+    jj_nb_master(0)=jjp1
+
+!$OMP BARRIER
+!$OMP MASTER
+    allocate(New_Field(iip1,jjm,ll))
+!$OMP END MASTER
+!$OMP BARRIER
+
+   IF (pole_sud) THEN
+     jje=jj_end-1
+     ije=ij_end-iip1
+     jjn=jj_nb-1
+   ELSE
+     jje=jj_end
+     ije=ij_end
+     jjn=jj_nb
+   ENDIF
+   
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    DO i=1,ll    
+      New_Field(:,jj_begin:jje,i)=reshape(Field(ij_begin:ije,i),(/iip1,jjn/))
+    ENDDO
+!$OMP BARRIER    
+    call Register_SwapField(new_field,new_field,ip1jm,ll,jj_Nb_master,Request_write)
+    call SendRequest(Request_write)
+!$OMP BARRIER
+    call WaitRequest(Request_write)     
+!$OMP BARRIER
+
+!$OMP MASTER
+    if (MPI_Rank==0) call WriteField(name,New_Field)
+    DEALLOCATE(New_Field)
+!$OMP END MASTER        
+!$OMP BARRIER
+    END SUBROUTINE write_field_v_gen
+    
+end module write_field_loc
+  
Index: LMDZ6/trunk/libf/dyn3dmem/write_field_p.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/write_field_p.F90	(revision 5267)
+++ 	(revision )
@@ -1,73 +1,0 @@
-module write_field_p
-implicit none
-  
-  interface WriteField_p
-    module procedure Write_field3d_p,Write_Field2d_p,Write_Field1d_p
-  end interface WriteField_p
-  
-  contains
-  
-  subroutine write_field1D_p(name,Field)
-    USE parallel_lmdz
-    USE write_field
-    implicit none
-  
-    integer, parameter :: MaxDim=1
-    character(len=*)   :: name
-    real, dimension(:) :: Field
-    real, dimension(:),allocatable :: New_Field
-    integer, dimension(MaxDim) :: Dim
-    
-    
-    Dim=shape(Field)
-    allocate(New_Field(Dim(1)))
-    New_Field(:)=Field(:)
-    call Gather_Field(New_Field,dim(1),1,0)
-    
-    if (MPI_Rank==0) call WriteField(name,New_Field)
-    
-    end subroutine write_field1D_p
-
-  subroutine write_field2D_p(name,Field)
-    USE parallel_lmdz
-    USE write_field
-    implicit none
-  
-    integer, parameter :: MaxDim=2
-    character(len=*)   :: name
-    real, dimension(:,:) :: Field
-    real, dimension(:,:),allocatable :: New_Field
-    integer, dimension(MaxDim) :: Dim
-    
-    Dim=shape(Field)
-    allocate(New_Field(Dim(1),Dim(2)))
-    New_Field(:,:)=Field(:,:)
-    call Gather_Field(New_Field(1,1),dim(1)*dim(2),1,0)
-    
-    if (MPI_Rank==0) call WriteField(name,New_Field)
-    
-     
-  end subroutine write_field2D_p
-  
-  subroutine write_field3D_p(name,Field)
-    USE parallel_lmdz
-    USE write_field
-    implicit none
-  
-    integer, parameter :: MaxDim=3
-    character(len=*)   :: name
-    real, dimension(:,:,:) :: Field
-    real, dimension(:,:,:),allocatable :: New_Field
-    integer, dimension(MaxDim) :: Dim
-    
-    Dim=shape(Field)
-    allocate(New_Field(Dim(1),Dim(2),Dim(3)))
-    New_Field(:,:,:)=Field(:,:,:)
-    call Gather_Field(New_Field(1,1,1),dim(1)*dim(2),dim(3),0)
-    
-   if (MPI_Rank==0) call WriteField(name,New_Field)
-    
-  end subroutine write_field3D_p  
-
-end module write_field_p
-  
Index: LMDZ6/trunk/libf/dyn3dmem/write_field_p.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/write_field_p.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/write_field_p.f90	(revision 5268)
@@ -0,0 +1,73 @@
+module write_field_p
+implicit none
+  
+  interface WriteField_p
+    module procedure Write_field3d_p,Write_Field2d_p,Write_Field1d_p
+  end interface WriteField_p
+  
+  contains
+  
+  subroutine write_field1D_p(name,Field)
+    USE parallel_lmdz
+    USE write_field
+    implicit none
+  
+    integer, parameter :: MaxDim=1
+    character(len=*)   :: name
+    real, dimension(:) :: Field
+    real, dimension(:),allocatable :: New_Field
+    integer, dimension(MaxDim) :: Dim
+    
+    
+    Dim=shape(Field)
+    allocate(New_Field(Dim(1)))
+    New_Field(:)=Field(:)
+    call Gather_Field(New_Field,dim(1),1,0)
+    
+    if (MPI_Rank==0) call WriteField(name,New_Field)
+    
+    end subroutine write_field1D_p
+
+  subroutine write_field2D_p(name,Field)
+    USE parallel_lmdz
+    USE write_field
+    implicit none
+  
+    integer, parameter :: MaxDim=2
+    character(len=*)   :: name
+    real, dimension(:,:) :: Field
+    real, dimension(:,:),allocatable :: New_Field
+    integer, dimension(MaxDim) :: Dim
+    
+    Dim=shape(Field)
+    allocate(New_Field(Dim(1),Dim(2)))
+    New_Field(:,:)=Field(:,:)
+    call Gather_Field(New_Field(1,1),dim(1)*dim(2),1,0)
+    
+    if (MPI_Rank==0) call WriteField(name,New_Field)
+    
+     
+  end subroutine write_field2D_p
+  
+  subroutine write_field3D_p(name,Field)
+    USE parallel_lmdz
+    USE write_field
+    implicit none
+  
+    integer, parameter :: MaxDim=3
+    character(len=*)   :: name
+    real, dimension(:,:,:) :: Field
+    real, dimension(:,:,:),allocatable :: New_Field
+    integer, dimension(MaxDim) :: Dim
+    
+    Dim=shape(Field)
+    allocate(New_Field(Dim(1),Dim(2),Dim(3)))
+    New_Field(:,:,:)=Field(:,:,:)
+    call Gather_Field(New_Field(1,1,1),dim(1)*dim(2),dim(3),0)
+    
+   if (MPI_Rank==0) call WriteField(name,New_Field)
+    
+  end subroutine write_field3D_p  
+
+end module write_field_p
+  
Index: LMDZ6/trunk/libf/dyn3dmem/writedyn_xios.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/writedyn_xios.F90	(revision 5267)
+++ 	(revision )
@@ -1,181 +1,0 @@
-
-! $Id$
-!
-      SUBROUTINE writedyn_xios( vcov, ucov,teta,ppk,phi,q, &
-     &                           masse,ps,phis)
-
-      USE lmdz_xios
-      USE parallel_lmdz
-      USE misc_mod
-      USE infotrac, ONLY : nqtot
-      use com_io_dyn_mod, only : histaveid,histvaveid,histuaveid
-      USE comconst_mod, ONLY: cpp
-      USE temps_mod, ONLY: itau_dyn
-      USE mod_xios_dyn3dmem, ONLY : writefield_dyn_u, writefield_dyn_v
-      
-      implicit none
-!
-!   Ecriture du fichier histoire au format xios
-!
-!
-!   Entree:
-!      vcov: vents v covariants
-!      ucov: vents u covariants
-!      teta: temperature potentielle
-!      phi : geopotentiel instantane
-!      q   : traceurs
-!      masse: masse
-!      ps   :pression au sol
-!      phis : geopotentiel au sol
-!      
-!   L. Fairhead, LMD, 03/21
-!
-! =====================================================================
-!
-!   Declarations
-      include "dimensions.h"
-      include "paramet.h"
-      include "comgeom.h"
-      include "description.h"
-      include "iniprint.h"
-
-!
-!   Arguments
-!
-
-      REAL vcov(ijb_v:ije_v,llm),ucov(ijb_u:ije_u,llm) 
-      REAL teta(ijb_u:ije_u,llm),phi(ijb_u:ije_u,llm)
-      REAL ppk(ijb_u:ije_u,llm)                  
-      REAL ps(ijb_u:ije_u),masse(ijb_u:ije_u,llm)                   
-      REAL phis(ijb_u:ije_u)                  
-      REAL q(ijb_u:ije_u,llm,nqtot)
-      integer time
-
-
-!   Variables locales
-!
-      INTEGER,SAVE,ALLOCATABLE :: ndex2d(:),ndexu(:),ndexv(:)
-      INTEGER :: iq, ii, ll
-      REAL,SAVE,ALLOCATABLE :: tm(:,:)
-      REAL,SAVE,ALLOCATABLE :: vnat(:,:),unat(:,:)
-      REAL,SAVE,ALLOCATABLE :: vbuffer(:,:)
-      logical ok_sync
-      integer itau_w
-      integer :: ijb,ije,jjn
-      LOGICAL,SAVE :: first=.TRUE.
-      LOGICAL,SAVE :: debuglf=.true.
-!$OMP THREADPRIVATE(debuglf)
-!$OMP THREADPRIVATE(first)
-
-!
-!  Initialisations
-!
-
-!      WRITE(*,*)'IN WRITEDYN_XIOS'
-      IF (first) THEN
-!$OMP BARRIER
-!$OMP MASTER
-        ALLOCATE(unat(ijb_u:ije_u,llm))
-        ALLOCATE(vnat(ijb_v:ije_v,llm))
-        IF (pole_sud) THEN
-           ALLOCATE(vbuffer(ijb_v:ije_v+iip1,llm))
-        ELSE
-           ALLOCATE(vbuffer(ijb_v:ije_v+iip1,llm))
-        ENDIF
-        ALLOCATE(tm(ijb_u:ije_u,llm))
-        ALLOCATE(ndex2d(ijnb_u*llm))
-        ALLOCATE(ndexu(ijnb_u*llm))
-        ALLOCATE(ndexv(ijnb_v*llm))
-        unat = 0.; vnat = 0.; tm = 0. ;
-        ndex2d = 0
-        ndexu = 0
-        ndexv = 0
-        vbuffer=0.
-!$OMP END MASTER
-!$OMP BARRIER
-        first=.FALSE.
-      ENDIF
-      
-      ok_sync = .TRUE.
-      itau_w = itau_dyn + time
-
-! Passage aux composantes naturelles du vent
-      call covnat_loc(llm, ucov, vcov, unat, vnat)
-
-!
-!  Appels a histwrite pour l'ecriture des variables a sauvegarder
-!
-!  Vents U
-!
-      ijb=ij_begin
-      ije=ij_end
-      jjn=jj_nb
-     
-      CALL writefield_dyn_u('U', unat(ijb:ije,:))
-
-!
-!  Vents V
-!
-      ije=ij_end
-      IF (pole_sud) THEN
-         jjn=jj_nb-1
-         ije=ij_end-iip1
-      ENDIF
-      vbuffer(ijb:ije,:)=vnat(ijb:ije,:)
-
-
-      IF (pole_sud) THEN
-         CALL writefield_dyn_v('V', vbuffer(ijb:ije+iip1,:))
-      ELSE
-         CALL writefield_dyn_v('V', vbuffer(ijb:ije,:))
-      ENDIF
-      
-
-      
-!
-!  Temperature potentielle moyennee
-!
-      ijb=ij_begin
-      ije=ij_end
-      jjn=jj_nb
-     CALL writefield_dyn_u('THETA', teta(ijb:ije,:))
-
-!
-!  Temperature moyennee
-!
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)       
-      do ll=1,llm
-        do ii = ijb, ije
-          tm(ii,ll) = teta(ii,ll) * ppk(ii,ll)/cpp
-        enddo
-      enddo
-!$OMP ENDDO
-      CALL writefield_dyn_u('TEMP', tm(ijb:ije,:))
-
-
-!
-!  Geopotentiel
-!
-      CALL writefield_dyn_u('PHI', phi(ijb:ije,:))
-
-
-!
-! Tracers?
-!
-!        DO iq=1,nqtot
-!        ENDDO
-
-
-!
-!  Masse
-!
-      CALL writefield_dyn_u('MASSE', masse(ijb:ije,:))
-
-
-!
-!  Pression au sol
-!
-      CALL writefield_dyn_u('PS', ps(ijb:ije))
-
-      END
Index: LMDZ6/trunk/libf/dyn3dmem/writedyn_xios.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/writedyn_xios.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/writedyn_xios.f90	(revision 5268)
@@ -0,0 +1,181 @@
+
+! $Id$
+!
+      SUBROUTINE writedyn_xios( vcov, ucov,teta,ppk,phi,q, &
+     &                           masse,ps,phis)
+
+      USE lmdz_xios
+      USE parallel_lmdz
+      USE misc_mod
+      USE infotrac, ONLY : nqtot
+      use com_io_dyn_mod, only : histaveid,histvaveid,histuaveid
+      USE comconst_mod, ONLY: cpp
+      USE temps_mod, ONLY: itau_dyn
+      USE mod_xios_dyn3dmem, ONLY : writefield_dyn_u, writefield_dyn_v
+      
+      implicit none
+!
+!   Ecriture du fichier histoire au format xios
+!
+!
+!   Entree:
+!      vcov: vents v covariants
+!      ucov: vents u covariants
+!      teta: temperature potentielle
+!      phi : geopotentiel instantane
+!      q   : traceurs
+!      masse: masse
+!      ps   :pression au sol
+!      phis : geopotentiel au sol
+!      
+!   L. Fairhead, LMD, 03/21
+!
+! =====================================================================
+!
+!   Declarations
+      include "dimensions.h"
+      include "paramet.h"
+      include "comgeom.h"
+      include "description.h"
+      include "iniprint.h"
+
+!
+!   Arguments
+!
+
+      REAL vcov(ijb_v:ije_v,llm),ucov(ijb_u:ije_u,llm) 
+      REAL teta(ijb_u:ije_u,llm),phi(ijb_u:ije_u,llm)
+      REAL ppk(ijb_u:ije_u,llm)                  
+      REAL ps(ijb_u:ije_u),masse(ijb_u:ije_u,llm)                   
+      REAL phis(ijb_u:ije_u)                  
+      REAL q(ijb_u:ije_u,llm,nqtot)
+      integer time
+
+
+!   Variables locales
+!
+      INTEGER,SAVE,ALLOCATABLE :: ndex2d(:),ndexu(:),ndexv(:)
+      INTEGER :: iq, ii, ll
+      REAL,SAVE,ALLOCATABLE :: tm(:,:)
+      REAL,SAVE,ALLOCATABLE :: vnat(:,:),unat(:,:)
+      REAL,SAVE,ALLOCATABLE :: vbuffer(:,:)
+      logical ok_sync
+      integer itau_w
+      integer :: ijb,ije,jjn
+      LOGICAL,SAVE :: first=.TRUE.
+      LOGICAL,SAVE :: debuglf=.true.
+!$OMP THREADPRIVATE(debuglf)
+!$OMP THREADPRIVATE(first)
+
+!
+!  Initialisations
+!
+
+!      WRITE(*,*)'IN WRITEDYN_XIOS'
+      IF (first) THEN
+!$OMP BARRIER
+!$OMP MASTER
+        ALLOCATE(unat(ijb_u:ije_u,llm))
+        ALLOCATE(vnat(ijb_v:ije_v,llm))
+        IF (pole_sud) THEN
+           ALLOCATE(vbuffer(ijb_v:ije_v+iip1,llm))
+        ELSE
+           ALLOCATE(vbuffer(ijb_v:ije_v+iip1,llm))
+        ENDIF
+        ALLOCATE(tm(ijb_u:ije_u,llm))
+        ALLOCATE(ndex2d(ijnb_u*llm))
+        ALLOCATE(ndexu(ijnb_u*llm))
+        ALLOCATE(ndexv(ijnb_v*llm))
+        unat = 0.; vnat = 0.; tm = 0. ;
+        ndex2d = 0
+        ndexu = 0
+        ndexv = 0
+        vbuffer=0.
+!$OMP END MASTER
+!$OMP BARRIER
+        first=.FALSE.
+      ENDIF
+      
+      ok_sync = .TRUE.
+      itau_w = itau_dyn + time
+
+! Passage aux composantes naturelles du vent
+      call covnat_loc(llm, ucov, vcov, unat, vnat)
+
+!
+!  Appels a histwrite pour l'ecriture des variables a sauvegarder
+!
+!  Vents U
+!
+      ijb=ij_begin
+      ije=ij_end
+      jjn=jj_nb
+     
+      CALL writefield_dyn_u('U', unat(ijb:ije,:))
+
+!
+!  Vents V
+!
+      ije=ij_end
+      IF (pole_sud) THEN
+         jjn=jj_nb-1
+         ije=ij_end-iip1
+      ENDIF
+      vbuffer(ijb:ije,:)=vnat(ijb:ije,:)
+
+
+      IF (pole_sud) THEN
+         CALL writefield_dyn_v('V', vbuffer(ijb:ije+iip1,:))
+      ELSE
+         CALL writefield_dyn_v('V', vbuffer(ijb:ije,:))
+      ENDIF
+      
+
+      
+!
+!  Temperature potentielle moyennee
+!
+      ijb=ij_begin
+      ije=ij_end
+      jjn=jj_nb
+     CALL writefield_dyn_u('THETA', teta(ijb:ije,:))
+
+!
+!  Temperature moyennee
+!
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)       
+      do ll=1,llm
+        do ii = ijb, ije
+          tm(ii,ll) = teta(ii,ll) * ppk(ii,ll)/cpp
+        enddo
+      enddo
+!$OMP ENDDO
+      CALL writefield_dyn_u('TEMP', tm(ijb:ije,:))
+
+
+!
+!  Geopotentiel
+!
+      CALL writefield_dyn_u('PHI', phi(ijb:ije,:))
+
+
+!
+! Tracers?
+!
+!        DO iq=1,nqtot
+!        ENDDO
+
+
+!
+!  Masse
+!
+      CALL writefield_dyn_u('MASSE', masse(ijb:ije,:))
+
+
+!
+!  Pression au sol
+!
+      CALL writefield_dyn_u('PS', ps(ijb:ije))
+
+      END
Index: LMDZ6/trunk/libf/dyn3dmem/writedynav_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/writedynav_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,220 +1,0 @@
-!
-! $Id: writedynav_p.F 1279 2009-12-10 09:02:56Z fairhead $
-!
-subroutine writedynav_loc( time, vcov, ucov,teta,ppk,phi,q, &
-        masse,ps,phis)
-
-  ! This routine needs IOIPSL
-  USE ioipsl
-
-  USE parallel_lmdz
-  USE misc_mod
-  USE infotrac, ONLY : nqtot
-  use com_io_dyn_mod, only : histaveid,histvaveid,histuaveid
-  USE comconst_mod, ONLY: cpp
-  USE temps_mod, ONLY: itau_dyn
-
-  implicit none
-
-  !
-  !   Ecriture du fichier histoire au format IOIPSL
-  !
-  !   Appels succesifs des routines: histwrite
-  !
-  !   Entree:
-  !  histid: ID du fichier histoire
-  !  time: temps de l'ecriture
-  !  vcov: vents v covariants
-  !  ucov: vents u covariants
-  !  teta: temperature potentielle
-  !  phi : geopotentiel instantane
-  !  q   : traceurs
-  !  masse: masse
-  !  ps   :pression au sol
-  !  phis : geopotentiel au sol
-  !
-  !
-  !   Sortie:
-  !  fileid: ID du fichier netcdf cree
-  !
-  !   L. Fairhead, LMD, 03/99
-  !
-  ! =====================================================================
-  !
-  !   Declarations
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-  include "description.h"
-  include "iniprint.h"
-
-  !
-  !   Arguments
-  !
-
-  REAL :: vcov(ijb_v:ije_v,llm),ucov(ijb_u:ije_u,llm)
-  REAL :: teta(ijb_u:ije_u,llm),phi(ijb_u:ije_u,llm)
-  REAL :: ppk(ijb_u:ije_u,llm)
-  REAL :: ps(ijb_u:ije_u),masse(ijb_u:ije_u,llm)
-  REAL :: phis(ijb_u:ije_u)
-  REAL :: q(ijb_u:ije_u,llm,nqtot)
-  integer :: time
-
-
-  ! This routine needs IOIPSL
-  !   Variables locales
-  !
-  INTEGER,SAVE,ALLOCATABLE :: ndex2d(:),ndexu(:),ndexv(:)
-  INTEGER :: iq, ii, ll
-  REAL,SAVE,ALLOCATABLE :: tm(:,:)
-  REAL,SAVE,ALLOCATABLE :: vnat(:,:),unat(:,:)
-  logical :: ok_sync
-  integer :: itau_w
-  integer :: ijb,ije,jjn
-  LOGICAL,SAVE :: first=.TRUE.
-!$OMP THREADPRIVATE(first)
-
-  !
-  !  Initialisations
-  !
-  if (adjust) return
-
-  IF (first) THEN
-!$OMP BARRIER
-!$OMP MASTER
-    ALLOCATE(unat(ijb_u:ije_u,llm))
-    ALLOCATE(vnat(ijb_v:ije_v,llm))
-    ALLOCATE(tm(ijb_u:ije_u,llm))
-    ALLOCATE(ndex2d(ijnb_u*llm))
-    ALLOCATE(ndexu(ijnb_u*llm))
-    ALLOCATE(ndexv(ijnb_v*llm))
-    ndex2d = 0
-    ndexu = 0
-    ndexv = 0
-!$OMP END MASTER
-!$OMP BARRIER
-    first=.FALSE.
-  ENDIF
-
-  ok_sync = .TRUE.
-  itau_w = itau_dyn + time
-
-  ! Passage aux composantes naturelles du vent
-  call covnat_loc(llm, ucov, vcov, unat, vnat)
-
-  !
-  !  Appels a histwrite pour l'ecriture des variables a sauvegarder
-  !
-  !  Vents U
-  !
-
-!$OMP BARRIER
-!$OMP MASTER
-  ijb=ij_begin
-  ije=ij_end
-  jjn=jj_nb
-
-  call histwrite(histuaveid, 'u', itau_w, unat(ijb:ije,:), &
-        iip1*jjn*llm, ndexu)
-!$OMP END MASTER
-
-  !
-  !  Vents V
-  !
-  ije=ij_end
-  if (pole_sud) jjn=jj_nb-1
-  if (pole_sud) ije=ij_end-iip1
-!$OMP BARRIER
-!$OMP MASTER
-  call histwrite(histvaveid, 'v', itau_w, vnat(ijb:ije,:), &
-        iip1*jjn*llm, ndexv)
-!$OMP END MASTER
-
-
-  !
-  !  Temperature potentielle moyennee
-  !
-  ijb=ij_begin
-  ije=ij_end
-  jjn=jj_nb
-!$OMP MASTER
-  call histwrite(histaveid, 'theta', itau_w, teta(ijb:ije,:), &
-        iip1*jjn*llm, ndexu)
-!$OMP END MASTER
-
-  !
-  !  Temperature moyennee
-  !
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  do ll=1,llm
-    do ii = ijb, ije
-      tm(ii,ll) = teta(ii,ll) * ppk(ii,ll)/cpp
-    enddo
-  enddo
-!$OMP ENDDO
-
-!$OMP MASTER
-  call histwrite(histaveid, 'temp', itau_w, tm(ijb:ije,:), &
-        iip1*jjn*llm, ndexu)
-!$OMP END MASTER
-
-
-  !
-  !  Geopotentiel
-  !
-!$OMP MASTER
-  call histwrite(histaveid, 'phi', itau_w, phi(ijb:ije,:), &
-        iip1*jjn*llm, ndexu)
-!$OMP END MASTER
-
-
-  !
-  !  Traceurs
-  !
-  !!$OMP MASTER
-  !    DO iq=1,nqtot
-  !      call histwrite(histaveid, tracers(iq)%longName, itau_w, &
-  ! .                   q(ijb:ije,:,iq), iip1*jjn*llm, ndexu)
-  !    enddo
-  !!$OMP END MASTER
-
-
-  !
-  !  Masse
-  !
-!$OMP MASTER
-   call histwrite(histaveid, 'masse', itau_w, masse(ijb:ije,:), &
-         iip1*jjn*llm, ndexu)
-!$OMP END MASTER
-
-
-  !
-  !  Pression au sol
-  !
-!$OMP MASTER
-
-   call histwrite(histaveid, 'ps', itau_w, ps(ijb:ije), &
-         iip1*jjn, ndex2d)
-!$OMP END MASTER
-
-  !
-  !  Geopotentiel au sol
-  !
-!$OMP MASTER
-    ! call histwrite(histaveid, 'phis', itau_w, phis(ijb:ije),
-  ! .                 iip1*jjn, ndex2d)
-!$OMP END MASTER
-
-  !
-  !  Fin
-  !
-!$OMP MASTER
-  if (ok_sync) then
-      call histsync(histaveid)
-      call histsync(histvaveid)
-      call histsync(histuaveid)
-  ENDIF
-!$OMP END MASTER
-
-end subroutine writedynav_loc
Index: LMDZ6/trunk/libf/dyn3dmem/writedynav_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/writedynav_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/writedynav_loc.f90	(revision 5268)
@@ -0,0 +1,220 @@
+!
+! $Id: writedynav_p.F 1279 2009-12-10 09:02:56Z fairhead $
+!
+subroutine writedynav_loc( time, vcov, ucov,teta,ppk,phi,q, &
+        masse,ps,phis)
+
+  ! This routine needs IOIPSL
+  USE ioipsl
+
+  USE parallel_lmdz
+  USE misc_mod
+  USE infotrac, ONLY : nqtot
+  use com_io_dyn_mod, only : histaveid,histvaveid,histuaveid
+  USE comconst_mod, ONLY: cpp
+  USE temps_mod, ONLY: itau_dyn
+
+  implicit none
+
+  !
+  !   Ecriture du fichier histoire au format IOIPSL
+  !
+  !   Appels succesifs des routines: histwrite
+  !
+  !   Entree:
+  !  histid: ID du fichier histoire
+  !  time: temps de l'ecriture
+  !  vcov: vents v covariants
+  !  ucov: vents u covariants
+  !  teta: temperature potentielle
+  !  phi : geopotentiel instantane
+  !  q   : traceurs
+  !  masse: masse
+  !  ps   :pression au sol
+  !  phis : geopotentiel au sol
+  !
+  !
+  !   Sortie:
+  !  fileid: ID du fichier netcdf cree
+  !
+  !   L. Fairhead, LMD, 03/99
+  !
+  ! =====================================================================
+  !
+  !   Declarations
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+  include "description.h"
+  include "iniprint.h"
+
+  !
+  !   Arguments
+  !
+
+  REAL :: vcov(ijb_v:ije_v,llm),ucov(ijb_u:ije_u,llm)
+  REAL :: teta(ijb_u:ije_u,llm),phi(ijb_u:ije_u,llm)
+  REAL :: ppk(ijb_u:ije_u,llm)
+  REAL :: ps(ijb_u:ije_u),masse(ijb_u:ije_u,llm)
+  REAL :: phis(ijb_u:ije_u)
+  REAL :: q(ijb_u:ije_u,llm,nqtot)
+  integer :: time
+
+
+  ! This routine needs IOIPSL
+  !   Variables locales
+  !
+  INTEGER,SAVE,ALLOCATABLE :: ndex2d(:),ndexu(:),ndexv(:)
+  INTEGER :: iq, ii, ll
+  REAL,SAVE,ALLOCATABLE :: tm(:,:)
+  REAL,SAVE,ALLOCATABLE :: vnat(:,:),unat(:,:)
+  logical :: ok_sync
+  integer :: itau_w
+  integer :: ijb,ije,jjn
+  LOGICAL,SAVE :: first=.TRUE.
+!$OMP THREADPRIVATE(first)
+
+  !
+  !  Initialisations
+  !
+  if (adjust) return
+
+  IF (first) THEN
+!$OMP BARRIER
+!$OMP MASTER
+    ALLOCATE(unat(ijb_u:ije_u,llm))
+    ALLOCATE(vnat(ijb_v:ije_v,llm))
+    ALLOCATE(tm(ijb_u:ije_u,llm))
+    ALLOCATE(ndex2d(ijnb_u*llm))
+    ALLOCATE(ndexu(ijnb_u*llm))
+    ALLOCATE(ndexv(ijnb_v*llm))
+    ndex2d = 0
+    ndexu = 0
+    ndexv = 0
+!$OMP END MASTER
+!$OMP BARRIER
+    first=.FALSE.
+  ENDIF
+
+  ok_sync = .TRUE.
+  itau_w = itau_dyn + time
+
+  ! Passage aux composantes naturelles du vent
+  call covnat_loc(llm, ucov, vcov, unat, vnat)
+
+  !
+  !  Appels a histwrite pour l'ecriture des variables a sauvegarder
+  !
+  !  Vents U
+  !
+
+!$OMP BARRIER
+!$OMP MASTER
+  ijb=ij_begin
+  ije=ij_end
+  jjn=jj_nb
+
+  call histwrite(histuaveid, 'u', itau_w, unat(ijb:ije,:), &
+        iip1*jjn*llm, ndexu)
+!$OMP END MASTER
+
+  !
+  !  Vents V
+  !
+  ije=ij_end
+  if (pole_sud) jjn=jj_nb-1
+  if (pole_sud) ije=ij_end-iip1
+!$OMP BARRIER
+!$OMP MASTER
+  call histwrite(histvaveid, 'v', itau_w, vnat(ijb:ije,:), &
+        iip1*jjn*llm, ndexv)
+!$OMP END MASTER
+
+
+  !
+  !  Temperature potentielle moyennee
+  !
+  ijb=ij_begin
+  ije=ij_end
+  jjn=jj_nb
+!$OMP MASTER
+  call histwrite(histaveid, 'theta', itau_w, teta(ijb:ije,:), &
+        iip1*jjn*llm, ndexu)
+!$OMP END MASTER
+
+  !
+  !  Temperature moyennee
+  !
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  do ll=1,llm
+    do ii = ijb, ije
+      tm(ii,ll) = teta(ii,ll) * ppk(ii,ll)/cpp
+    enddo
+  enddo
+!$OMP ENDDO
+
+!$OMP MASTER
+  call histwrite(histaveid, 'temp', itau_w, tm(ijb:ije,:), &
+        iip1*jjn*llm, ndexu)
+!$OMP END MASTER
+
+
+  !
+  !  Geopotentiel
+  !
+!$OMP MASTER
+  call histwrite(histaveid, 'phi', itau_w, phi(ijb:ije,:), &
+        iip1*jjn*llm, ndexu)
+!$OMP END MASTER
+
+
+  !
+  !  Traceurs
+  !
+  !!$OMP MASTER
+  !    DO iq=1,nqtot
+  !      call histwrite(histaveid, tracers(iq)%longName, itau_w, &
+  ! .                   q(ijb:ije,:,iq), iip1*jjn*llm, ndexu)
+  !    enddo
+  !!$OMP END MASTER
+
+
+  !
+  !  Masse
+  !
+!$OMP MASTER
+   call histwrite(histaveid, 'masse', itau_w, masse(ijb:ije,:), &
+         iip1*jjn*llm, ndexu)
+!$OMP END MASTER
+
+
+  !
+  !  Pression au sol
+  !
+!$OMP MASTER
+
+   call histwrite(histaveid, 'ps', itau_w, ps(ijb:ije), &
+         iip1*jjn, ndex2d)
+!$OMP END MASTER
+
+  !
+  !  Geopotentiel au sol
+  !
+!$OMP MASTER
+    ! call histwrite(histaveid, 'phis', itau_w, phis(ijb:ije),
+  ! .                 iip1*jjn, ndex2d)
+!$OMP END MASTER
+
+  !
+  !  Fin
+  !
+!$OMP MASTER
+  if (ok_sync) then
+      call histsync(histaveid)
+      call histsync(histvaveid)
+      call histsync(histuaveid)
+  ENDIF
+!$OMP END MASTER
+
+end subroutine writedynav_loc
Index: LMDZ6/trunk/libf/dyn3dmem/writehist_loc.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/writehist_loc.F90	(revision 5267)
+++ 	(revision )
@@ -1,219 +1,0 @@
-!
-! $Id: writedynav_p.F 1279 2009-12-10 09:02:56Z fairhead $
-!
-subroutine writehist_loc( time, vcov, ucov,teta,ppk,phi,q, &
-        masse,ps,phis)
-
-  ! This routine needs IOIPSL
-  USE ioipsl
-
-  USE parallel_lmdz
-  USE misc_mod
-  USE infotrac, ONLY : nqtot
-  use com_io_dyn_mod, only : histid,histvid,histuid
-  USE comconst_mod, ONLY: cpp
-  USE temps_mod, ONLY: itau_dyn
-
-  implicit none
-
-  !
-  !   Ecriture du fichier histoire au format IOIPSL
-  !
-  !   Appels succesifs des routines: histwrite
-  !
-  !   Entree:
-  !  histid: ID du fichier histoire
-  !  time: temps de l'ecriture
-  !  vcov: vents v covariants
-  !  ucov: vents u covariants
-  !  teta: temperature potentielle
-  !  phi : geopotentiel instantane
-  !  q   : traceurs
-  !  masse: masse
-  !  ps   :pression au sol
-  !  phis : geopotentiel au sol
-  !
-  !
-  !   Sortie:
-  !  fileid: ID du fichier netcdf cree
-  !
-  !   L. Fairhead, LMD, 03/99
-  !
-  ! =====================================================================
-  !
-  !   Declarations
-  include "dimensions.h"
-  include "paramet.h"
-  include "comgeom.h"
-  include "description.h"
-  include "iniprint.h"
-
-  !
-  !   Arguments
-  !
-
-  REAL :: vcov(ijb_v:ije_v,llm),ucov(ijb_u:ije_u,llm)
-  REAL :: teta(ijb_u:ije_u,llm),phi(ijb_u:ije_u,llm)
-  REAL :: ppk(ijb_u:ije_u,llm)
-  REAL :: ps(ijb_u:ije_u),masse(ijb_u:ije_u,llm)
-  REAL :: phis(ijb_u:ije_u)
-  REAL :: q(ijb_u:ije_u,llm,nqtot)
-  integer :: time
-
-
-  ! This routine needs IOIPSL
-  !   Variables locales
-  !
-  INTEGER,SAVE,ALLOCATABLE :: ndex2d(:),ndexu(:),ndexv(:)
-  INTEGER :: iq, ii, ll
-  REAL,SAVE,ALLOCATABLE :: tm(:,:)
-  REAL,SAVE,ALLOCATABLE :: vnat(:,:),unat(:,:)
-  logical :: ok_sync
-  integer :: itau_w
-  integer :: ijb,ije,jjn
-  LOGICAL,SAVE :: first=.TRUE.
-!$OMP THREADPRIVATE(first)
-
-  !
-  !  Initialisations
-  !
-  if (adjust) return
-
-  IF (first) THEN
-!$OMP BARRIER
-!$OMP MASTER
-    ALLOCATE(unat(ijb_u:ije_u,llm))
-    ALLOCATE(vnat(ijb_v:ije_v,llm))
-    ALLOCATE(tm(ijb_u:ije_u,llm))
-    ALLOCATE(ndex2d(ijnb_u*llm))
-    ALLOCATE(ndexu(ijnb_u*llm))
-    ALLOCATE(ndexv(ijnb_v*llm))
-    ndex2d = 0
-    ndexu = 0
-    ndexv = 0
-!$OMP END MASTER
-!$OMP BARRIER
-    first=.FALSE.
-  ENDIF
-
-  ok_sync = .TRUE.
-  itau_w = itau_dyn + time
-
-  ! Passage aux composantes naturelles du vent
-  call covnat_loc(llm, ucov, vcov, unat, vnat)
-
-  !
-  !  Appels a histwrite pour l'ecriture des variables a sauvegarder
-  !
-  !  Vents U
-  !
-
-!$OMP BARRIER
-!$OMP MASTER
-  ijb=ij_begin
-  ije=ij_end
-  jjn=jj_nb
-
-  call histwrite(histuid, 'u', itau_w, unat(ijb:ije,:), &
-        iip1*jjn*llm, ndexu)
-!$OMP END MASTER
-
-  !
-  !  Vents V
-  !
-  ije=ij_end
-  if (pole_sud) jjn=jj_nb-1
-  if (pole_sud) ije=ij_end-iip1
-!$OMP BARRIER
-!$OMP MASTER
-  call histwrite(histvid, 'v', itau_w, vnat(ijb:ije,:), &
-        iip1*jjn*llm, ndexv)
-!$OMP END MASTER
-
-
-  !
-  !  Temperature potentielle
-  !
-  ijb=ij_begin
-  ije=ij_end
-  jjn=jj_nb
-!$OMP MASTER
-  call histwrite(histid, 'theta', itau_w, teta(ijb:ije,:), &
-        iip1*jjn*llm, ndexu)
-!$OMP END MASTER
-
-  !
-  !  Temperature
-  !
-
-!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-  do ll=1,llm
-    do ii = ijb, ije
-      tm(ii,ll) = teta(ii,ll) * ppk(ii,ll)/cpp
-    enddo
-  enddo
-!$OMP ENDDO
-
-!$OMP MASTER
-  call histwrite(histid, 'temp', itau_w, tm(ijb:ije,:), &
-        iip1*jjn*llm, ndexu)
-!$OMP END MASTER
-
-
-  !
-  !  Geopotentiel
-  !
-!$OMP MASTER
-  call histwrite(histid, 'phi', itau_w, phi(ijb:ije,:), &
-        iip1*jjn*llm, ndexu)
-!$OMP END MASTER
-
-
-  !
-  !  Traceurs
-  !
-  !!$OMP MASTER
-  !    DO iq=1,nqtot
-  !      call histwrite(histid, tracers(iq)%longName, itau_w,
-  ! .                   q(ijb:ije,:,iq), iip1*jjn*llm, ndexu)
-  !    enddo
-  !!$OMP END MASTER
-
-
-  !
-  !  Masse
-  !
-!$OMP MASTER
-   call histwrite(histid, 'masse', itau_w, masse(ijb:ije,:), &
-         iip1*jjn*llm, ndexu)
-!$OMP END MASTER
-
-
-  !
-  !  Pression au sol
-  !
-!$OMP MASTER
-   call histwrite(histid, 'ps', itau_w, ps(ijb:ije), &
-         iip1*jjn, ndex2d)
-!$OMP END MASTER
-
-  !
-  !  Geopotentiel au sol
-  !
-!$OMP MASTER
-    ! call histwrite(histid, 'phis', itau_w, phis(ijb:ije),
-  ! .                 iip1*jjn, ndex2d)
-!$OMP END MASTER
-
-  !
-  !  Fin
-  !
-!$OMP MASTER
-  if (ok_sync) then
-    call histsync(histid)
-    call histsync(histvid)
-    call histsync(histuid)
-  endif
-!$OMP END MASTER
-
-end subroutine writehist_loc
Index: LMDZ6/trunk/libf/dyn3dmem/writehist_loc.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3dmem/writehist_loc.f90	(revision 5268)
+++ LMDZ6/trunk/libf/dyn3dmem/writehist_loc.f90	(revision 5268)
@@ -0,0 +1,219 @@
+!
+! $Id: writedynav_p.F 1279 2009-12-10 09:02:56Z fairhead $
+!
+subroutine writehist_loc( time, vcov, ucov,teta,ppk,phi,q, &
+        masse,ps,phis)
+
+  ! This routine needs IOIPSL
+  USE ioipsl
+
+  USE parallel_lmdz
+  USE misc_mod
+  USE infotrac, ONLY : nqtot
+  use com_io_dyn_mod, only : histid,histvid,histuid
+  USE comconst_mod, ONLY: cpp
+  USE temps_mod, ONLY: itau_dyn
+
+  implicit none
+
+  !
+  !   Ecriture du fichier histoire au format IOIPSL
+  !
+  !   Appels succesifs des routines: histwrite
+  !
+  !   Entree:
+  !  histid: ID du fichier histoire
+  !  time: temps de l'ecriture
+  !  vcov: vents v covariants
+  !  ucov: vents u covariants
+  !  teta: temperature potentielle
+  !  phi : geopotentiel instantane
+  !  q   : traceurs
+  !  masse: masse
+  !  ps   :pression au sol
+  !  phis : geopotentiel au sol
+  !
+  !
+  !   Sortie:
+  !  fileid: ID du fichier netcdf cree
+  !
+  !   L. Fairhead, LMD, 03/99
+  !
+  ! =====================================================================
+  !
+  !   Declarations
+  include "dimensions.h"
+  include "paramet.h"
+  include "comgeom.h"
+  include "description.h"
+  include "iniprint.h"
+
+  !
+  !   Arguments
+  !
+
+  REAL :: vcov(ijb_v:ije_v,llm),ucov(ijb_u:ije_u,llm)
+  REAL :: teta(ijb_u:ije_u,llm),phi(ijb_u:ije_u,llm)
+  REAL :: ppk(ijb_u:ije_u,llm)
+  REAL :: ps(ijb_u:ije_u),masse(ijb_u:ije_u,llm)
+  REAL :: phis(ijb_u:ije_u)
+  REAL :: q(ijb_u:ije_u,llm,nqtot)
+  integer :: time
+
+
+  ! This routine needs IOIPSL
+  !   Variables locales
+  !
+  INTEGER,SAVE,ALLOCATABLE :: ndex2d(:),ndexu(:),ndexv(:)
+  INTEGER :: iq, ii, ll
+  REAL,SAVE,ALLOCATABLE :: tm(:,:)
+  REAL,SAVE,ALLOCATABLE :: vnat(:,:),unat(:,:)
+  logical :: ok_sync
+  integer :: itau_w
+  integer :: ijb,ije,jjn
+  LOGICAL,SAVE :: first=.TRUE.
+!$OMP THREADPRIVATE(first)
+
+  !
+  !  Initialisations
+  !
+  if (adjust) return
+
+  IF (first) THEN
+!$OMP BARRIER
+!$OMP MASTER
+    ALLOCATE(unat(ijb_u:ije_u,llm))
+    ALLOCATE(vnat(ijb_v:ije_v,llm))
+    ALLOCATE(tm(ijb_u:ije_u,llm))
+    ALLOCATE(ndex2d(ijnb_u*llm))
+    ALLOCATE(ndexu(ijnb_u*llm))
+    ALLOCATE(ndexv(ijnb_v*llm))
+    ndex2d = 0
+    ndexu = 0
+    ndexv = 0
+!$OMP END MASTER
+!$OMP BARRIER
+    first=.FALSE.
+  ENDIF
+
+  ok_sync = .TRUE.
+  itau_w = itau_dyn + time
+
+  ! Passage aux composantes naturelles du vent
+  call covnat_loc(llm, ucov, vcov, unat, vnat)
+
+  !
+  !  Appels a histwrite pour l'ecriture des variables a sauvegarder
+  !
+  !  Vents U
+  !
+
+!$OMP BARRIER
+!$OMP MASTER
+  ijb=ij_begin
+  ije=ij_end
+  jjn=jj_nb
+
+  call histwrite(histuid, 'u', itau_w, unat(ijb:ije,:), &
+        iip1*jjn*llm, ndexu)
+!$OMP END MASTER
+
+  !
+  !  Vents V
+  !
+  ije=ij_end
+  if (pole_sud) jjn=jj_nb-1
+  if (pole_sud) ije=ij_end-iip1
+!$OMP BARRIER
+!$OMP MASTER
+  call histwrite(histvid, 'v', itau_w, vnat(ijb:ije,:), &
+        iip1*jjn*llm, ndexv)
+!$OMP END MASTER
+
+
+  !
+  !  Temperature potentielle
+  !
+  ijb=ij_begin
+  ije=ij_end
+  jjn=jj_nb
+!$OMP MASTER
+  call histwrite(histid, 'theta', itau_w, teta(ijb:ije,:), &
+        iip1*jjn*llm, ndexu)
+!$OMP END MASTER
+
+  !
+  !  Temperature
+  !
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+  do ll=1,llm
+    do ii = ijb, ije
+      tm(ii,ll) = teta(ii,ll) * ppk(ii,ll)/cpp
+    enddo
+  enddo
+!$OMP ENDDO
+
+!$OMP MASTER
+  call histwrite(histid, 'temp', itau_w, tm(ijb:ije,:), &
+        iip1*jjn*llm, ndexu)
+!$OMP END MASTER
+
+
+  !
+  !  Geopotentiel
+  !
+!$OMP MASTER
+  call histwrite(histid, 'phi', itau_w, phi(ijb:ije,:), &
+        iip1*jjn*llm, ndexu)
+!$OMP END MASTER
+
+
+  !
+  !  Traceurs
+  !
+  !!$OMP MASTER
+  !    DO iq=1,nqtot
+  !      call histwrite(histid, tracers(iq)%longName, itau_w,
+  ! .                   q(ijb:ije,:,iq), iip1*jjn*llm, ndexu)
+  !    enddo
+  !!$OMP END MASTER
+
+
+  !
+  !  Masse
+  !
+!$OMP MASTER
+   call histwrite(histid, 'masse', itau_w, masse(ijb:ije,:), &
+         iip1*jjn*llm, ndexu)
+!$OMP END MASTER
+
+
+  !
+  !  Pression au sol
+  !
+!$OMP MASTER
+   call histwrite(histid, 'ps', itau_w, ps(ijb:ije), &
+         iip1*jjn, ndex2d)
+!$OMP END MASTER
+
+  !
+  !  Geopotentiel au sol
+  !
+!$OMP MASTER
+    ! call histwrite(histid, 'phis', itau_w, phis(ijb:ije),
+  ! .                 iip1*jjn, ndex2d)
+!$OMP END MASTER
+
+  !
+  !  Fin
+  !
+!$OMP MASTER
+  if (ok_sync) then
+    call histsync(histid)
+    call histsync(histvid)
+    call histsync(histuid)
+  endif
+!$OMP END MASTER
+
+end subroutine writehist_loc
