Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/advtrac_loc.F
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/advtrac_loc.F	(revision 3851)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/advtrac_loc.F	(revision 3852)
@@ -24,5 +24,5 @@
       USE Vampir
       USE times
-      USE infotrac, ONLY: nqtot, iadv, ok_iso_verif
+      USE infotrac, ONLY: nqtot, tracers
       USE control_mod, ONLY: iapp_tracvl, day_step, planet_type
       USE advtrac_mod, ONLY: finmasse
@@ -60,4 +60,5 @@
       INTEGER ij,l,iq,iiq
       REAL zdpmin, zdpmax
+      INTEGER, POINTER :: iadv(:)
 c----------------------------------------------------------
 c     Rajouts pour PPM
@@ -77,4 +78,6 @@
       type(Request),SAVE :: testRequest
 !$OMP THREADPRIVATE(testRequest)
+
+      iadv => tracers(:)%iadv
 
 c  test sur l''eventuelle creation de valeurs negatives de la masse
@@ -157,7 +160,6 @@
 
           !write(*,*) 'advtrac 162: apres appel vlspltgen_loc'
-      if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'advtrac 162')
-      endif !if (ok_iso_verif) then
+
+      call check_isotopes(q,ijb_u,ije_u,'advtrac 162')
 
 #ifdef DEBUG_IO     
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/check_isotopes_loc.F
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/check_isotopes_loc.F	(revision 3851)
+++ 	(revision )
@@ -1,215 +1,0 @@
-        subroutine check_isotopes(q,ijb,ije,err_msg)
-        USE infotrac
-        USE parallel_lmdz
-        implicit none
-
-#include "dimensions.h"
-
-        ! inputs
-        integer ijb,ije ! peut être local et différent de ijb_u,ije_u, ex: dans qminimum
-        real q(ijb_u:ije_u,llm,nqtot)
-        character*(*) err_msg ! message d''erreur à afficher
-
-        ! locals
-        integer ixt,phase,k,i,iq,iiso,izone,ieau,iqeau
-        real xtractot,xiiso
-        real borne
-        real qmin
-        real errmax ! erreur maximale en absolu.
-        real errmaxrel ! erreur maximale en relatif autorisée
-        real deltaDmax,deltaDmin
-        real ridicule
-        parameter (borne=1e19)
-        parameter (errmax=1e-8)
-        parameter (errmaxrel=1e-3)
-        parameter (qmin=1e-11)
-        parameter (deltaDmax=200.0,deltaDmin=-999.9)
-        parameter (ridicule=1e-12)
-        real deltaD
-
-        if (ok_isotopes) then
-
-        !write(*,*) 'check_isotopes 31: err_msg=',err_msg
-        ! verifier que rien n'est NaN
-        do ixt=1,ntraciso
-          do phase=1,nqo
-            iq=iqiso(ixt,phase)
-c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-            do k=1,llm
-              DO i = ijb,ije
-                if ((q(i,k,iq).gt.-borne).and.
-     :            (q(i,k,iq).lt.borne)) then
-                else !if ((x(ixt,i,j).gt.-borne).and.
-                  write(*,*) 'erreur detectee par iso_verif_noNaN:'
-                  write(*,*) err_msg
-                  write(*,*) 'q,i,k,iq=',q(i,k,iq),i,k,iq
-                  write(*,*) 'borne=',borne
-                  stop
-                endif  !if ((x(ixt,i,j).gt.-borne).and.
-              enddo !DO i = ijb,ije
-            enddo !do k=1,llm
-c$OMP END DO NOWAIT
-          enddo !do phase=1,nqo
-        enddo !do ixt=1,ntraciso
-
-        !write(*,*) 'check_isotopes 52'
-        ! verifier que l'eau normale est OK
-        if (use_iso(1)) then
-          ixt=indnum_fn_num(1)
-          do phase=1,nqo
-            iq=iqiso(ixt,phase)
-c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-            do k=1,llm
-            DO i = ijb,ije  
-              if ((abs(q(i,k,phase)-q(i,k,iq)).gt.errmax).and.
-     :          (abs((q(i,k,phase)-q(i,k,iq))/
-     :           max(max(abs(q(i,k,phase)),abs(q(i,k,iq))),1e-18))
-     :           .gt.errmaxrel)) then
-                  write(*,*) 'erreur detectee par iso_verif_egalite:'
-                  write(*,*) err_msg
-                  write(*,*) 'ixt,phase,ijb=',ixt,phase,ijb
-                  write(*,*) 'q,iq,i,k=',q(i,k,iq),iq,i,k
-                  write(*,*) 'q(i,k,phase)=',q(i,k,phase)
-                  stop
-              endif !if ((abs(q(i,k,phase)-q(i,k,iq)).gt.errmax).and.
-              ! bidouille pour éviter divergence:
-              q(i,k,iq)= q(i,k,phase) 
-            enddo ! DO i = ijb,ije
-            enddo !do k=1,llm
-c$OMP END DO NOWAIT
-          enddo ! do phase=1,nqo 
-        endif !if (use_iso(1)) then
-        
-        !write(*,*) 'check_isotopes 78'
-        ! verifier que HDO est raisonable
-        if (use_iso(2)) then
-          ixt=indnum_fn_num(2)
-          do phase=1,nqo
-            iq=iqiso(ixt,phase)
-c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-            do k=1,llm
-            DO i = ijb,ije
-            if (q(i,k,iq).gt.qmin) then
-             deltaD=(q(i,k,iq)/q(i,k,phase)/tnat(2)-1)*1000
-             if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then
-                  write(*,*) 'erreur detectee par iso_verif_aberrant:'
-                  write(*,*) err_msg
-                  write(*,*) 'ixt,phase=',ixt,phase
-                  write(*,*) 'q,iq,i,k,=',q(i,k,iq),iq,i,k
-                  write(*,*) 'q=',q(i,k,:)
-                  write(*,*) 'deltaD=',deltaD
-                  stop
-             endif !if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then
-            endif !if (q(i,k,iq).gt.qmin) then
-            enddo !DO i = ijb,ije
-            enddo !do k=1,llm
-c$OMP END DO NOWAIT
-          enddo ! do phase=1,nqo 
-        endif !if (use_iso(2)) then
-
-        !write(*,*) 'check_isotopes 103'
-        ! verifier que O18 est raisonable
-        if (use_iso(3)) then
-          ixt=indnum_fn_num(3)
-          do phase=1,nqo
-            iq=iqiso(ixt,phase)
-c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-            do k=1,llm
-            DO i = ijb,ije
-            if (q(i,k,iq).gt.qmin) then
-             deltaD=(q(i,k,iq)/q(i,k,phase)/tnat(3)-1)*1000
-             if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then
-                  write(*,*) 'erreur detectee iso_verif_aberrant O18:'
-                  write(*,*) err_msg
-                  write(*,*) 'ixt,phase=',ixt,phase
-                  write(*,*) 'q,iq,i,k,=',q(i,k,phase),iq,i,k
-                  write(*,*) 'xt=',q(i,k,:)
-                  write(*,*) 'deltaO18=',deltaD
-                  stop
-             endif !if ((deltaD.gt.deltaDmax).or.(deltaD.lt.deltaDmin)) then
-            endif !if (q(i,k,iq).gt.qmin) then
-            enddo !DO i = ijb,ije
-            enddo !do k=1,llm
-c$OMP END DO NOWAIT
-          enddo ! do phase=1,nqo 
-        endif !if (use_iso(2)) then
-
-
-        !write(*,*) 'check_isotopes 129'
-        if (ok_isotrac) then
-
-          if (use_iso(2).and.use_iso(1)) then
-            do izone=1,ntraceurs_zone
-             ixt=index_trac(izone,indnum_fn_num(2))
-             ieau=index_trac(izone,indnum_fn_num(1))
-             do phase=1,nqo
-               iq=iqiso(ixt,phase)
-               iqeau=iqiso(ieau,phase)
-c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-               do k=1,llm
-                DO i = ijb,ije
-                if (q(i,k,iq).gt.qmin) then
-                 deltaD=(q(i,k,iq)/q(i,k,iqeau)/tnat(2)-1)*1000
-                 if ((deltaD.gt.deltaDmax).or.
-     &                   (deltaD.lt.deltaDmin)) then
-                  write(*,*) 'erreur dans iso_verif_aberrant trac:'
-                  write(*,*) err_msg
-                  write(*,*) 'izone,phase=',izone,phase
-                  write(*,*) 'ixt,ieau=',ixt,ieau
-                  write(*,*) 'q,iq,i,k,=',q(i,k,iq),iq,i,k
-                  write(*,*) 'deltaD=',deltaD
-                  stop
-                 endif !if ((deltaD.gt.deltaDmax).or.
-                endif !if (q(i,k,iq).gt.qmin) then
-                enddo !DO i = ijb,ije
-                enddo  ! do k=1,llm
-c$OMP END DO NOWAIT
-              enddo ! do phase=1,nqo    
-            enddo !do izone=1,ntraceurs_zone
-          endif !if (use_iso(2).and.use_iso(1)) then
-
-          do iiso=1,niso
-           do phase=1,nqo
-              iq=iqiso(iiso,phase)
-c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-              do k=1,llm
-                DO i = ijb,ije
-                   xtractot=0.0
-                   xiiso=q(i,k,iq)
-                   do izone=1,ntraceurs_zone
-                      iq=iqiso(index_trac(izone,iiso),phase)
-                      xtractot=xtractot+ q(i,k,iq)
-                   enddo !do izone=1,ntraceurs_zone
-                   if ((abs(xtractot-xiiso).gt.errmax).and.
-     :                  (abs(xtractot-xiiso)/
-     :                  max(max(abs(xtractot),abs(xiiso)),1e-18)
-     :                  .gt.errmaxrel)) then
-                  write(*,*) 'erreur detectee par iso_verif_traceurs:'
-                  write(*,*) err_msg
-                  write(*,*) 'iiso,phase=',iiso,phase
-                  write(*,*) 'i,k,=',i,k
-                  write(*,*) 'q(i,k,:)=',q(i,k,:)
-                  stop
-                 endif !if ((abs(q(i,k,phase)-q(i,k,iq)).gt.errmax).and.
-                  
-                 ! bidouille pour éviter divergence:
-                 if (abs(xtractot).gt.ridicule) then
-                   do izone=1,ntraceurs_zone
-                     ixt=index_trac(izone,iiso) 
-                     q(i,k,iq)=q(i,k,iq)/xtractot*xiiso
-                   enddo !do izone=1,ntraceurs_zone                
-                  endif !if ((abs(xtractot).gt.ridicule) then
-                enddo !DO i = ijb,ije
-              enddo !do k=1,llm
-c$OMP END DO NOWAIT
-           enddo !do phase=1,nqo
-          enddo !do iiso=1,niso
-
-        endif !if (ok_isotrac) then
-
-        endif ! if (ok_isotopes)
-        !write(*,*) 'check_isotopes 198'
-        
-        end
-
-
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/check_isotopes_loc.F90
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/check_isotopes_loc.F90	(revision 3852)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/check_isotopes_loc.F90	(revision 3852)
@@ -0,0 +1,155 @@
+SUBROUTINE check_isotopes(q, ijb, ije, err_msg)
+  USE strings_mod, ONLY: strIdx, msg
+  USE infotrac,    ONLY: isotope, isoSelect, iH2O, isoCheck, isoName, nqtot, niso, nitr, nzon, npha, iTraPha, iZonIso, tnat
+  USE parallel_lmdz
+  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=256) :: msg1, modname
+  INTEGER :: ixt, ipha, k, i, iq, iiso, izon, ieau, iqeau
+  INTEGER, ALLOCATABLE :: ix(:)
+  REAL    :: xtractot, xiiso, deltaD, q1, q2
+  REAL, PARAMETER :: borne     = 1e19,  &
+                     errmax    = 1e-8,  &        !--- Max. absolute error
+                     errmaxrel = 1e-8,  &        !--- Max. relative error
+                     qmin      = 1e-11, &
+                     deltaDmax = 200.0, &
+                     deltaDmin =-999.9, &
+                     ridicule  = 1e-12
+  INTEGER, SAVE :: ixH2O, ixHDO, ixO18
+!OMP THREADPRIVATE(ixH2O, ixHDO, ixO18)
+  LOGICAL, SAVE :: first=.TRUE.
+!OMP THREADPRIVATE(first)
+
+  modname = 'check_isotopes'
+  IF(first) THEN
+    IF(isoSelect('H2O')) RETURN
+    ixH2O = strIdx(isoName,'H2[16]O')
+    ixHDO = strIdx(isoName,'H[2]HO')
+    ixO18 = strIdx(isoName,'H2[18]O')
+    first = .FALSE.
+  ELSE
+    IF(isoSelect(iH2O)) RETURN
+  END IF
+  IF(.NOT.isoCheck .OR. niso == 0) RETURN        !--- No need to check or no isotopes => finished
+
+  !--- CHECK FOR NaNs (FOR ALL THE ISOTOPES, INCLUDING GEOGRAPHIC TAGGING TRACERS)
+  DO ixt = 1, nitr
+    DO ipha = 1, npha
+      iq = iTraPha(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)')isoName(ixt),i,k,iq,q(i,k,iq); CALL msg(msg1)
+          CALL abort_gcm(modname, 'Error in iso_verif_noNaN: '//TRIM(err_msg), 1)
+          STOP
+        END DO
+      END DO
+!$OMP END DO NOWAIT
+    END DO
+  END DO
+
+  !--- CHECK CONSERVATION (MAIN ISOTOPE AND PARENT CONCENTRATIONS MUST BE EQUAL)
+  ixt = iH2O
+  IF(ixt /= 0) THEN
+    DO ipha = 1, npha
+      iq = iTraPha(ixt,ipha)
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+      DO k = 1, llm
+        DO i = ijb, ije
+          q1 = q(i,k,ipha); q2 = q(i,k,iq)
+          IF(ABS(q1-q2) <= errmax .OR. ABS(q1-q2)/MAX(MAX(ABS(q1),ABS(q2)),1e-18) < errmaxrel) CYCLE
+          WRITE(msg1,'("ixt = ",i0)')ixt;                                      CALL msg(msg1)
+          WRITE(msg1,'("q(",i0,",",i0,",iq=",i0,") = ",ES12.4)')i, k, iq, q2;  CALL msg(msg1)
+          WRITE(msg1,'("q(",i0,",",i0,",ipha=",i0,") = ",ES12.4)')i,k,ipha,q1; CALL msg(msg1)
+          CALL abort_gcm(modname, 'Error in iso_verif_egalite: '//TRIM(err_msg), 1)
+          q(i,k,iq) = q(i,k,ipha)                !--- Bidouille pour convergence
+        END DO
+      END DO
+!$OMP END DO NOWAIT
+    END DO
+  END IF
+
+  !--- CHECK DELTA ANOMALIES
+  ix = [ixHDO, ixO18]
+  DO iiso = 1, SIZE(ix)
+    ixt = ix(iiso)
+    IF(ixt  == 0) CYCLE
+    DO ipha = 1, npha
+      iq = iTraPha(ixt,ipha)
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+      DO k = 1, llm
+        DO i = ijb, ije
+          q1 = q(i,k,ipha); q2 = q(i,k,iq)
+          IF(q2 <= qmin) CYCLE
+          deltaD = (q2/q1/tnat(ixt)-1)*1000
+          IF(deltaD <= deltaDmax .AND. deltaD >= deltaDmin) CYCLE
+          WRITE(msg1,'("ixt = ",i0)')ixt;                                     CALL msg(msg1)
+          WRITE(msg1,'("q(",i0,",",i0,",iq=",i0,") = ",ES12.4)')i, k, iq, q2; CALL msg(msg1)
+          WRITE(msg1,'("q=",ES12.4)')q(i,k,:);                                CALL msg(msg1)
+          WRITE(msg1,'("deltaD=",ES12.4)')deltaD;                             CALL msg(msg1)
+          CALL abort_gcm(modname, 'Error in iso_verif_aberrant: '//TRIM(err_msg), 1)
+        END DO
+      END DO
+!$OMP END DO NOWAIT
+    END DO
+  END DO
+
+  !--- CHECK FOR TAGGING TRACERS DELTAD ANOMALIES
+  IF(nitr == 0) RETURN
+  IF(ixH2O /= 0 .AND. ixHDO /= 0) THEN
+    DO izon = 1, nzon
+      ixt  = iZonIso(izon, ixHDO)
+      ieau = iZonIso(izon, ixH2O)
+      DO ipha = 1, npha
+        iq    = iTraPha(ixt,  ipha)
+        iqeau = iTraPha(ieau, ipha)
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+        DO k = 1, llm
+          DO i = ijb, ije
+            IF(q(i,k,iq)<=qmin) CYCLE
+            deltaD = (q(i,k,iq)/q(i,k,iqeau)/tnat(ixHDO)-1)*1000
+            IF(deltaD <= deltaDmax .AND. deltaD >= deltaDmin) CYCLE
+            WRITE(msg1,'("izon, ipha =",2i0)')izon, ipha;                              CALL msg(msg1)
+            WRITE(msg1,'( "ixt, ieau =",2i0)') ixt, ieau;                              CALL msg(msg1)
+            WRITE(msg1,'("q(",i0,",",i0,",iq=",i0,") = ",ES12.4)')i, k, iq, q(i,k,iq); CALL msg(msg1)
+            WRITE(msg1,'("deltaD=",ES12.4)')deltaD;                                    CALL msg(msg1)
+            CALL abort_gcm(modname, 'Error in iso_verif_aberrant trac: '//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, npha
+      iq = iTraPha(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, iTraPha(iZonIso(1:nzon,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))
+            WRITE(msg1,'("iiso, ipha =",2i0)')iiso, ipha;              CALL msg(msg1)
+            WRITE(msg1,'("i, k =",2i0)')i, k;                          CALL msg(msg1)
+            WRITE(msg1,'("q(",i0,",",i0,":) = ",ES12.4)')i,k,q(i,k,:); CALL msg(msg1)
+            STOP
+          END IF
+          IF(ABS(xtractot) <= ridicule) CYCLE
+          DO izon = 1, nzon
+            ixt = iZonIso(izon, iiso) 
+            q(i,k,iq) = q(i,k,iq) / xtractot * xiiso
+          END DO
+        END DO
+      END DO
+!$OMP END DO NOWAIT
+    END DO
+  END DO
+
+END SUBROUTINE check_isotopes
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/dynetat0_loc.F90
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/dynetat0_loc.F90	(revision 3851)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/dynetat0_loc.F90	(revision 3852)
@@ -7,5 +7,5 @@
 !-------------------------------------------------------------------------------
   USE parallel_lmdz
-  USE infotrac
+  USE infotrac, ONLY: nqtot, niso, tracers, iTraPha, tnat, alpha_ideal, tra
   USE netcdf, ONLY: NF90_OPEN,  NF90_INQUIRE_DIMENSION, NF90_INQ_VARID,        &
       NF90_NOWRITE, NF90_CLOSE, NF90_INQUIRE_VARIABLE,  NF90_GET_VAR, NF90_NoErr
@@ -39,5 +39,5 @@
 !===============================================================================
 ! Local variables:
-  CHARACTER(LEN=256) :: msg, var, modname
+  CHARACTER(LEN=256) :: sdum, var, modname
   INTEGER, PARAMETER :: length=100
   INTEGER :: iq, fID, vID, idecal, ierr
@@ -152,19 +152,13 @@
   ALLOCATE(q_glo(ip1jmp1,llm))
   DO iq=1,nqtot
-    var=tname(iq)
+    tr => tracers(iq)
+    var = tr%name
+    IF(NF90_INQ_VARID(fID,var,vID)==NF90_NoErr) THEN
+      CALL get_var2(var ,q_glo); q(ijb_u:ije_u,:,iq)=q_glo(ijb_u:ije_u,:); CYCLE
 #ifdef INCA
-    IF (var .eq. "O3" ) THEN 
-       IF(NF90_INQ_VARID(fID,var,vID) == NF90_NoErr) THEN
-          CALL get_var2(var,q_glo); q(ijb_u:ije_u,:,iq)=q_glo(ijb_u:ije_u,:); CYCLE
-       ELSE
-          WRITE(lunout,*) 'Tracer O3 is missing - it is initialized to OX'
-          IF(NF90_INQ_VARID(fID,"OX",vID) == NF90_NoErr) THEN
-             CALL get_var2("OX",q_glo); q(ijb_u:ije_u,:,iq)=q_glo(ijb_u:ije_u,:); CYCLE
-          ENDIF
-       ENDIF
-    ENDIF
+    ELSE IF(NF90_INQ_VARID(fID,"OX",vID) == NF90_NoErr .AND. var == 'O3') THEN
+      WRITE(lunout,*) 'Tracer O3 is missing - it is initialized to OX'
+      CALL get_var2("OX",q_glo); q(ijb_u:ije_u,:,iq)=q_glo(ijb_u:ije_u,:); CYCLE
 #endif
-    IF(NF90_INQ_VARID(fID,var,vID)==NF90_NoErr) THEN
-      CALL get_var2(var,q_glo); q(ijb_u:ije_u,:,iq)=q_glo(ijb_u:ije_u,:); CYCLE
     END IF
     WRITE(lunout,*)TRIM(modname)//": Tracer <"//TRIM(var)//"> is missing"
@@ -173,8 +167,8 @@
    !--- CRisi: for isotops, theoretical initialization using very simplified
    !           Rayleigh distillation las.
-    IF(ok_isotopes.AND.iso_num(iq)>0) THEN
-      IF(zone_num(iq)==0) q(:,:,iq)=q(:,:,iqpere(iq))*tnat(iso_num(iq))        &
-     &           *(q(:,:,iqpere(iq))/30.e-3)**(alpha_ideal(iso_num(iq))-1)
-      IF(zone_num(iq)==1) q(:,:,iq)=q(:,:,iqiso(iso_indnum(iq),phase_num(iq)))
+    IF(niso > 0 .AND. tr%iso_num > 0) THEN
+      IF(tr%iso_zon == 0) q(:,:,iq) = q(:,:,tr%iprnt)         *        tnat(tr%iso_num) &
+                                   * (q(:,:,tr%iprnt)/30.e-3)**(alpha_ideal(tr%iso_num)-1)
+      IF(tr%iso_zon == 1) q(:,:,iq) = q(:,:,iTraPha(tr%iso_num,tr%iso_pha))
     END IF
   END DO
@@ -195,6 +189,6 @@
     s1='value of '//TRIM(str1)//' ='
     s2=' read in starting file differs from parametrized '//TRIM(str2)//' ='
-    WRITE(msg,'(10x,a,i4,2x,a,i4)'),s1,n1,s2,n2
-    CALL ABORT_gcm(TRIM(modname),TRIM(msg),1)
+    WRITE(sdum,'(10x,a,i4,2x,a,i4)'),s1,n1,s2,n2
+    CALL ABORT_gcm(TRIM(modname),TRIM(sdum),1)
   END IF
 END SUBROUTINE check_dim
@@ -246,10 +240,10 @@
   IF(ierr==NF90_NoERR) RETURN
   SELECT CASE(typ)
-    CASE('inq');   msg="Field <"//TRIM(nam)//"> is missing"
-    CASE('get');   msg="Reading failed for <"//TRIM(nam)//">"
-    CASE('open');  msg="File opening failed for <"//TRIM(nam)//">"
-    CASE('close'); msg="File closing failed for <"//TRIM(nam)//">"
+    CASE('inq');   sdum="Field <"//TRIM(nam)//"> is missing"
+    CASE('get');   sdum="Reading failed for <"//TRIM(nam)//">"
+    CASE('open');  sdum="File opening failed for <"//TRIM(nam)//">"
+    CASE('close'); sdum="File closing failed for <"//TRIM(nam)//">"
   END SELECT
-  CALL ABORT_gcm(TRIM(modname),TRIM(msg),ierr)
+  CALL ABORT_gcm(TRIM(modname),TRIM(sdum),ierr)
 END SUBROUTINE err
 
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/dynredem_loc.F90
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/dynredem_loc.F90	(revision 3851)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/dynredem_loc.F90	(revision 3852)
@@ -9,5 +9,5 @@
   USE parallel_lmdz
   USE mod_hallo
-  USE infotrac
+  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,   &
@@ -151,5 +151,5 @@
   CALL cre_var(nid,"teta" ,"Temperature",[rlonvID,rlatuID,sID,timID])
   DO iq=1,nqtot
-    CALL cre_var(nid,tname(iq),ttext(iq),[rlonvID,rlatuID,sID,timID])
+    CALL cre_var(nid,tracers(iq)%name(iq),tracers(iq)%lnam,[rlonvID,rlatuID,sID,timID])
   END DO
   CALL cre_var(nid,"masse","Masse d air"    ,[rlonvID,rlatuID,sID,timID])
@@ -174,6 +174,5 @@
   USE parallel_lmdz
   USE mod_hallo
-  USE infotrac
-  USE control_mod
+  USE infotrac, ONLY: nqtot, tracers, type_trac
   USE netcdf,   ONLY: NF90_OPEN,  NF90_NOWRITE, NF90_GET_VAR, NF90_INQ_VARID,  &
                       NF90_CLOSE, NF90_WRITE,   NF90_PUT_VAR, NF90_NoErr
@@ -248,5 +247,5 @@
 
 !--- Save tracers
-  DO iq=1,nqtot; var=tname(iq); ierr=-1
+  DO iq=1,nqtot; var=tracers(iq)%name; ierr=-1
     IF(lread_inca) THEN                  !--- Possibly read from "start_trac.nc"
 !$OMP MASTER      
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/iniacademic_loc.F90
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/iniacademic_loc.F90	(revision 3851)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/iniacademic_loc.F90	(revision 3852)
@@ -7,6 +7,5 @@
   use exner_hyb_m, only: exner_hyb
   use exner_milieu_m, only: exner_milieu
-  USE infotrac, ONLY: nqtot,niso_possibles,ok_isotopes,iqpere,ok_iso_verif,tnat,alpha_ideal, &
-        & iqiso,phase_num,iso_indnum,iso_num,zone_num
+  USE infotrac, ONLY: nqtot, niso, tracers, iTraPha, tnat, alpha_ideal, tra
   USE control_mod, ONLY: day_step,planet_type
   USE parallel_lmdz, ONLY: ijb_u, ije_u, ijb_v, ije_v
@@ -79,5 +78,7 @@
 
   REAL zdtvr
-  
+
+  TYPE(tra), POINTER :: tr
+
   character(len=*),parameter :: modname="iniacademic"
   character(len=80) :: abort_message
@@ -279,15 +280,12 @@
               ! CRisi: init des isotopes
               ! distill de Rayleigh très simplifiée
-              if (ok_isotopes) then
-                if ((iso_num(i).gt.0).and.(zone_num(i).eq.0)) then          
-                   q(ijb_u:ije_u,:,i)=q(ijb_u:ije_u,:,iqpere(i))       &
-      &                  *tnat(iso_num(i))                             &
-      &                  *(q(ijb_u:ije_u,:,iqpere(i))/30.e-3)                              &
-     &                   **(alpha_ideal(iso_num(i))-1)
-                endif                
-                if ((iso_num(i).gt.0).and.(zone_num(i).eq.1)) then
-                  q(ijb_u:ije_u,:,i)=q(ijb_u:ije_u,:,iqiso(iso_indnum(i),phase_num(i)))
-                endif
-              endif !if (ok_isotopes) then
+              tr => tracers(i)
+              IF(niso > 0 .AND. tr%iso_num > 0) THEN
+                IF(tr%iso_zon == 0) &
+                  q(ijb_u:ije_u,:,i) = q(ijb_u:ije_u,:,tr%iprnt)         *        tnat(tr%iso_num)
+                                     *(q(ijb_u:ije_u,:,tr%iprnt)/30.e-3)**(alpha_ideal(tr%iso_num)-1)
+                IF(tr%iso_zon == 1) &
+                  q(ijb_u:ije_u,:,i) = q(ijb_u:ije_u,:,iTraPha(tr%iso_num,tr%iso_pha))
+              END IF
 
            enddo
@@ -296,7 +294,5 @@
         endif ! of if (planet_type=="earth")
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'iniacademic_loc')
-        endif !if (ok_iso_verif) then
+        call check_isotopes(q,ijb_u,ije_u,'iniacademic_loc')
 
         ! add random perturbation to temperature
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/integrd_loc.F
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/integrd_loc.F	(revision 3851)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/integrd_loc.F	(revision 3852)
@@ -11,5 +11,4 @@
       USE write_field
       USE integrd_mod
-      USE infotrac, ONLY: ok_iso_verif ! ajout CRisi
       USE comconst_mod, ONLY: pi
       USE logic_mod, ONLY: leapf
@@ -347,7 +346,5 @@
 c$OMP BARRIER
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb,ije,'integrd 342')
-        endif !if (ok_iso_verif) then
+        call check_isotopes(q,ijb,ije,'integrd 342')
 
         !write(*,*) 'integrd 341'
@@ -355,7 +352,5 @@
         !write(*,*) 'integrd 343'
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb,ije,'integrd 346')
-        endif !if (ok_iso_verif) then
+        call check_isotopes(q,ijb,ije,'integrd 346')
 c
 c    .....  Calcul de la valeur moyenne, unique  aux poles pour  q .....
@@ -408,7 +403,5 @@
       ENDIF
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb,ije,'integrd 409')
-        endif !if (ok_iso_verif) then
+      call check_isotopes(q,ijb,ije,'integrd 409')
       
 ! Ehouarn: forget about finvmaold
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/leapfrog_loc.F
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/leapfrog_loc.F	(revision 3851)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/leapfrog_loc.F	(revision 3852)
@@ -20,5 +20,5 @@
        USE vampir
        USE timer_filtre, ONLY : print_filtre_timer
-       USE infotrac
+       USE infotrac, ONLY: nqtot
        USE guide_loc_mod, ONLY : guide_main
        USE getparam
@@ -204,7 +204,5 @@
       TYPE(distrib),SAVE :: new_dist
 
-      if (ok_iso_verif) then
-         call check_isotopes(q0,ijb_u,ije_u,'leapfrog204: debut')
-      endif !if (ok_iso_verif) then
+      call check_isotopes(q0,ijb_u,ije_u,'leapfrog204: debut')
       
 c$OMP MASTER
@@ -226,7 +224,5 @@
       itaufinp1 = itaufin +1
 
-      if (ok_iso_verif) then
-        call check_isotopes(q0,ijb_u,ije_u,'leapfrog 226')
-      endif !if (ok_iso_verif) then
+      call check_isotopes(q0,ijb_u,ije_u,'leapfrog 226')
 
       itau = 0
@@ -243,7 +239,5 @@
       q=q0
 
-      if (ok_iso_verif) then
-        call check_isotopes(q,ijb_u,ije_u,'leapfrog 239')
-      endif !if (ok_iso_verif) then
+      call check_isotopes(q,ijb_u,ije_u,'leapfrog 239')
       
 !      iday = day_ini+itau/day_step
@@ -324,7 +318,5 @@
       endif
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 321')
-        endif !if (ok_iso_verif) then
+      call check_isotopes(q,ijb_u,ije_u,'leapfrog 321')
 
 #ifdef CPP_IOIPSL
@@ -406,14 +398,10 @@
 
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 400')
-        endif !if (ok_iso_verif) then
+        call check_isotopes(q,ijb_u,ije_u,'leapfrog 400')
 
    2  CONTINUE ! Matsuno backward or leapfrog step begins here
 
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 402')
-        endif !if (ok_iso_verif) then
+        call check_isotopes(q,ijb_u,ije_u,'leapfrog 402')
 
 c$OMP MASTER
@@ -497,7 +485,5 @@
 
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 471')
-        endif !if (ok_iso_verif) then
+      call check_isotopes(q,ijb_u,ije_u,'leapfrog 471')
 
 !ym  PAS D'AJUSTEMENT POUR LE MOMENT     
@@ -618,8 +604,5 @@
       endif       
      
-      
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 589')
-        endif !if (ok_iso_verif) then
+      call check_isotopes(q,ijb_u,ije_u,'leapfrog 589')
       
 c-----------------------------------------------------------------------
@@ -683,8 +666,6 @@
       ! compute geopotential phi()
       CALL geopot_loc  ( ip1jmp1, teta  , pk , pks,  phis  , phi   )
-        
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 651')
-        endif !if (ok_iso_verif) then
+
+      call check_isotopes(q,ijb_u,ije_u,'leapfrog 651')
       
       call VTb(VTcaldyn)
@@ -725,8 +706,6 @@
 c   -------------------------------------------------------------
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,
+      call check_isotopes(q,ijb_u,ije_u,
      &           'leapfrog 686: avant caladvtrac')
-        endif !if (ok_iso_verif) then
       
       IF( forward. OR . leapf )  THEN
@@ -738,8 +717,6 @@
 
          !write(*,*) 'leapfrog 719'
-         if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,
+         call check_isotopes(q,ijb_u,ije_u,
      &           'leapfrog 698: apres caladvtrac')
-         endif !if (ok_iso_verif) then
 
 !      do j=1,nqtot
@@ -775,7 +752,5 @@
 
        !write(*,*) 'leapfrog 720' 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 756')
-        endif !if (ok_iso_verif) then
+      call check_isotopes(q,ijb_u,ije_u,'leapfrog 756')
 
        ! CRisi: pourquoi aller jusqu'à 2 et non pas jusqu'à nqtot?? 
@@ -785,7 +760,5 @@
 
        !write(*,*) 'leapfrog 724'       
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 762')
-        endif !if (ok_iso_verif) then 
+      call check_isotopes(q,ijb_u,ije_u,'leapfrog 762')
  
 !       CALL FTRACE_REGION_END("integrd")
@@ -802,7 +775,5 @@
 #endif    
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 775')
-        endif !if (ok_iso_verif) then
+      call check_isotopes(q,ijb_u,ije_u,'leapfrog 775')
 
 c      do j=1,nqtot
@@ -1164,7 +1135,5 @@
        ENDIF ! of IF( apphys )
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1132')
-        endif !if (ok_iso_verif) then
+       call check_isotopes(q,ijb_u,ije_u,'leapfrog 1132')
         !write(*,*) 'leapfrog 1134: iflag_phys=',iflag_phys
 
@@ -1233,7 +1202,5 @@
 
 cc$OMP END PARALLEL
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1196')
-        endif !if (ok_iso_verif) then
+        call check_isotopes(q,ijb_u,ije_u,'leapfrog 1196')
 
 c-----------------------------------------------------------------------
@@ -1470,7 +1437,5 @@
 c              ENDIF
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1430')
-        endif !if (ok_iso_verif) then     
+      call check_isotopes(q,ijb_u,ije_u,'leapfrog 1430')
  
 c   ********************************************************************
@@ -1555,8 +1520,6 @@
          RETURN
       ENDIF
-      
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1509')
-        endif !if (ok_iso_verif) then
+
+      call check_isotopes(q,ijb_u,ije_u,'leapfrog 1509')
 
       IF ( .NOT.purmats ) THEN
@@ -1645,7 +1608,5 @@
             ENDIF
 
-        if (ok_iso_verif) then
            call check_isotopes(q,ijb_u,ije_u,'leapfrog 1584')
-        endif !if (ok_iso_verif) then
 
 c-----------------------------------------------------------------------
@@ -1685,7 +1646,5 @@
             ENDIF ! of IF (itau.EQ.itaufin)
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1624')
-        endif !if (ok_iso_verif) then
+            call check_isotopes(q,ijb_u,ije_u,'leapfrog 1624')
 
 c-----------------------------------------------------------------------
@@ -1724,8 +1683,5 @@
       ELSE ! of IF (.not.purmats)
 
-
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1664')
-        endif !if (ok_iso_verif) then
+        call check_isotopes(q,ijb_u,ije_u,'leapfrog 1664')
 
 c       ........................................................
@@ -1771,8 +1727,5 @@
             ELSE ! of IF(forward) i.e. backward step
 
-              
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1698')
-        endif !if (ok_iso_verif) then  
+              call check_isotopes(q,ijb_u,ije_u,'leapfrog 1698')
 
               IF(MOD(itau,iperiod).EQ.0 .OR. itau.EQ.itaufin) THEN
@@ -1834,8 +1787,5 @@
             ENDIF ! of IF (forward)
 
-
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb_u,ije_u,'leapfrog 1750')
-        endif !if (ok_iso_verif) then
+            call check_isotopes(q,ijb_u,ije_u,'leapfrog 1750')
 
       END IF ! of IF(.not.purmats)
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/massbarxy_loc.F90
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/massbarxy_loc.F90	(revision 3851)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/massbarxy_loc.F90	(revision 3852)
@@ -27,7 +27,7 @@
     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)
+                     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
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/qminimum_loc.F
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/qminimum_loc.F	(revision 3851)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/qminimum_loc.F	(revision 3852)
@@ -4,6 +4,5 @@
       SUBROUTINE qminimum_loc( q,nqtot,deltap )
       USE parallel_lmdz
-      USE infotrac, ONLY: ok_isotopes,ntraciso,iqiso,ok_iso_verif,             &
-     &   ratiomin,qperemin ! CRisi 23nov2020
+      USE infotrac, ONLY: nitr, iTraPha, qperemin ! CRisi 23nov2020
       IMPLICIT none
 c
@@ -55,7 +54,5 @@
 
         !write(lunout,*) 'qminimum 52: entree'
-        if (ok_iso_verif) then
-           call check_isotopes(q,ij_begin,ij_end,'qminimum 52')   
-        endif !if (ok_iso_verif) then     
+        call check_isotopes(q,ij_begin,ij_end,'qminimum 52')   
 
       ijb=ij_begin
@@ -69,14 +66,12 @@
       DO 1000 k = 1, llm
       DO 1040 i = ijb, ije
-            if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
-
-              if (ok_isotopes) then
-                 zx_defau_diag(i,k,iq_liq)=AMAX1
-     :               ( seuil_liq - q(i,k,iq_liq), 0.0 )
-              endif !if (ok_isotopes) then
-
-               q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
-               q(i,k,iq_liq) = seuil_liq
-            endif
+         if (seuil_liq - q(i,k,iq_liq) .gt. 0.d0 ) then
+
+           if (nitr > 0) zx_defau_diag(i,k,iq_liq) =
+     &          AMAX1( seuil_liq - q(i,k,iq_liq), 0.0 )
+
+           q(i,k,iq_vap) = q(i,k,iq_vap) + q(i,k,iq_liq) - seuil_liq
+           q(i,k,iq_liq) = seuil_liq
+         endif
  1040 CONTINUE
  1000 CONTINUE
@@ -100,7 +95,6 @@
          if ( seuil_vap - q(i,k,iq) .gt. 0.d0 ) then
 
-            if (ok_isotopes) then
-              zx_defau_diag(i,k,iq)=AMAX1( seuil_vap - q(i,k,iq), 0.0 )
-            endif !if (ok_isotopes) then
+            if (nitr > 0) zx_defau_diag(i,k,iq) =
+     &           AMAX1( seuil_vap - q(i,k,iq), 0.0 )
 
             q(i,k-1,iq) =  q(i,k-1,iq) - ( seuil_vap - q(i,k,iq) ) *
@@ -141,5 +135,5 @@
 
       !write(lunout,*) 'qminimum 128'
-      if (ok_isotopes) then
+      if (nitr > 0) then
               !write(lunout,*) 'qminimum 140'
       ! CRisi: traiter de même les traceurs d'eau
@@ -180,56 +174,52 @@
                 call abort_gcm("qminimum","not enough vapor",1)
               endif  
-            do ixt=1,ntraciso
+            do ixt=1,nitr
 !                write(lunout,*) 'qmin 168: ixt=',ixt
-!                write(lunout,*) 'q(i,k,iqiso(ixt,iq_vap)=',
-!     :             q(i,k,iqiso(ixt,iq_vap))
+!                write(lunout,*) 'q(i,k,iTraPha(ixt,iq_vap)=',
+!     :             q(i,k,iTraPha(ixt,iq_vap))
 !                write(lunout,*) 'zx_defau_diag(i,k,iq_vap)=',
 !     :                  zx_defau_diag(i,k,iq_vap)
-!                write(lunout,*) 'q(i,k-1,iqiso(ixt,iq_vap)=',
-!     :                   q(i,k-1,iqiso(ixt,iq_vap))     
-
-               q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap))
+!                write(lunout,*) 'q(i,k-1,iTraPha(ixt,iq_vap)=',
+!     :                   q(i,k-1,iTraPha(ixt,iq_vap))     
+
+               q(i,k,iTraPha(ixt,iq_vap))=q(i,k,iTraPha(ixt,iq_vap))
      :              +zx_defau_diag(i,k,iq_vap)
-     :              *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
+     :              *q(i,k-1,iTraPha(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
                 
-              if (ok_iso_verif) then
-                if (iso_verif_noNaN_nostop(q(i,k,iqiso(ixt,iq_vap)),
-     :                   'qminimum 155').eq.1) then
+               if (iso_verif_noNaN_nostop(q(i,k,iTraPha(ixt,iq_vap)),
+     :                   'qminimum 155')) then
                    write(*,*) 'i,k,ixt=',i,k,ixt
                    write(*,*) 'q_follow(i,k-1,iq_vap)=',
      :                   q_follow(i,k-1,iq_vap)
-                   write(*,*) 'q(i,k,iqiso(ixt,iq_vap))=',
-     :                   q(i,k,iqiso(ixt,iq_vap))
+                   write(*,*) 'q(i,k,iTraPha(ixt,iq_vap))=',
+     :                   q(i,k,iTraPha(ixt,iq_vap))
                    write(*,*) 'zx_defau_diag(i,k,iq_vap)=',
      :                   zx_defau_diag(i,k,iq_vap)
-                   write(*,*) 'q(i,k-1,iqiso(ixt,iq_vap))=',
-     :                   q(i,k-1,iqiso(ixt,iq_vap))
+                   write(*,*) 'q(i,k-1,iTraPha(ixt,iq_vap))=',
+     :                   q(i,k-1,iTraPha(ixt,iq_vap))
                    stop
-                endif
-              endif
+               endif
 
               ! et on la retranche en k-1
-               q(i,k-1,iqiso(ixt,iq_vap))=q(i,k-1,iqiso(ixt,iq_vap))
+               q(i,k-1,iTraPha(ixt,iq_vap))=q(i,k-1,iTraPha(ixt,iq_vap))
      :              -zx_defau_diag(i,k,iq_vap)
      :              *deltap(i,k)/deltap(i,k-1)
-     :              *q(i,k-1,iqiso(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
-
-               if (ok_iso_verif) then
-                if (iso_verif_noNaN_nostop(q(i,k-1,iqiso(ixt,iq_vap)),
-     :                   'qminimum 175').eq.1) then
+     :              *q(i,k-1,iTraPha(ixt,iq_vap))/q_follow(i,k-1,iq_vap)
+
+               if (iso_verif_noNaN_nostop(q(i,k-1,iTraPha(ixt,iq_vap)),
+     :                   'qminimum 175')) then
                    write(*,*) 'k,i,ixt=',k,i,ixt
                    write(*,*) 'q_follow(i,k-1,iq_vap)=',
      :                   q_follow(i,k-1,iq_vap)
-                   write(*,*) 'q(i,k,iqiso(ixt,iq_vap))=',
-     :                   q(i,k,iqiso(ixt,iq_vap))
+                   write(*,*) 'q(i,k,iTraPha(ixt,iq_vap))=',
+     :                   q(i,k,iTraPha(ixt,iq_vap))
                    write(*,*) 'zx_defau_diag(i,k,iq_vap)=',
      :                   zx_defau_diag(i,k,iq_vap)
-                   write(*,*) 'q(i,k-1,iqiso(ixt,iq_vap))=',
-     :                   q(i,k-1,iqiso(ixt,iq_vap))
+                   write(*,*) 'q(i,k-1,iTraPha(ixt,iq_vap))=',
+     :                   q(i,k-1,iTraPha(ixt,iq_vap))
                    stop
-                endif
-              endif 
-
-              enddo !do ixt=1,niso
+               endif 
+
+              enddo !do ixt=1,nitr
               q_follow(i,k,iq_vap)=   q_follow(i,k,iq_vap)
      :               +zx_defau_diag(i,k,iq_vap)
@@ -242,7 +232,5 @@
         enddo !do k=2,llm
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb,ije,'qminimum 168')
-        endif !if (ok_iso_verif) then
+        call check_isotopes(q,ijb,ije,'qminimum 168')
         
       
@@ -255,13 +243,13 @@
 
               ! on ajoute eau liquide en k en k              
-              do ixt=1,ntraciso
-               q(i,k,iqiso(ixt,iq_liq))=q(i,k,iqiso(ixt,iq_liq))
+              do ixt=1,nitr
+               q(i,k,iTraPha(ixt,iq_liq))=q(i,k,iTraPha(ixt,iq_liq))
      :              +zx_defau_diag(i,k,iq_liq)
-     :              *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap)
+     :              *q(i,k,iTraPha(ixt,iq_vap))/q_follow(i,k,iq_vap)
               ! et on la retranche à la vapeur en k
-               q(i,k,iqiso(ixt,iq_vap))=q(i,k,iqiso(ixt,iq_vap))
+               q(i,k,iTraPha(ixt,iq_vap))=q(i,k,iTraPha(ixt,iq_vap))
      :              -zx_defau_diag(i,k,iq_liq)
-     :              *q(i,k,iqiso(ixt,iq_vap))/q_follow(i,k,iq_vap)   
-              enddo !do ixt=1,niso
+     :              *q(i,k,iTraPha(ixt,iq_vap))/q_follow(i,k,iq_vap)   
+              enddo !do ixt=1,nitr
               q_follow(i,k,iq_liq)=   q_follow(i,k,iq_liq)
      :               +zx_defau_diag(i,k,iq_liq)
@@ -273,9 +261,7 @@
        enddo !do k=2,llm  
 
-        if (ok_iso_verif) then
-           call check_isotopes(q,ijb,ije,'qminimum 197')
-        endif !if (ok_iso_verif) then
-
-      endif !if (ok_isotopes) then
+       call check_isotopes(q,ijb,ije,'qminimum 197')
+
+      endif !if (nitr > 0)
       !write(*,*) 'qminimum 188'
 c
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlsplt_loc.F
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlsplt_loc.F	(revision 3851)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlsplt_loc.F	(revision 3852)
@@ -14,5 +14,5 @@
 c   --------------------------------------------------------------------
       USE parallel_lmdz
-      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils, ! CRisi                 &
+      USE infotrac, ONLY : nqtot,tracers, tra,         ! CRisi                 &
      &                     qperemin,masseqmin,ratiomin ! MVals et CRisi
       IMPLICIT NONE
@@ -44,5 +44,6 @@
 
       REAL Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi
-      INTEGER ifils,iq2 ! CRisi
+      INTEGER ichld,iq2 ! CRisi
+      TYPE(tra), POINTER :: tr
 
       Logical extremum
@@ -54,5 +55,7 @@
 
       INTEGER ijb,ije,ijb_x,ije_x
-      
+
+      tr => tracers(iq)
+
       !write(*,*) 'vlsplt 58: entree dans vlx_loc, iq,ijb_x=',
 !     &   iq,ijb_x
@@ -330,11 +333,11 @@
 ! Il faut faire ça avant d'avoir mis à jour q et masse
 
-       if (nqfils(iq).gt.0) then
-       do ifils=1,nqdesc(iq)
-       !do ifils=1,nqfils(iq) ! modif C Risi 22nov2020
+       if (tr%ndesc > 0) then
+       do ichld=1,tr%ndesc
+       !do ichld=1,tr%nchld ! modif C Risi 22nov2020
         ! attention: comme Ratio est utilisé comme q dans l'appel
         ! recursif, il doit contenir à lui seul tous les indices de tous
         ! les descendants!
-         iq2=iqfils(ifils,iq)
+         iq2=tr%idesc(ichld)
 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
          DO l=1,llm
@@ -352,10 +355,10 @@
          enddo
 c$OMP END DO NOWAIT
-        enddo !do ifils=1,nqdesc(iq)
-        do ifils=1,nqfils(iq)
-         iq2=iqfils(ifils,iq)
+        enddo !do ichld=1,tr%ndesc
+        do ichld=1,tr%nchld
+         iq2=tr%idesc(ichld)
          call vlx_loc(Ratio,pente_max,masse,u_mq,ijb_x,ije_x,iq2)
-        enddo !do ifils=1,nqfils(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo !do ichld=1,tr%nchld
+      endif !if (tr%ndesc > 0) then
 ! end CRisi
 
@@ -383,8 +386,8 @@
       ! On calcule q entre ijb+1 et ije -> on fait pareil pour ratio 
       ! puis on boucle en longitude
-      if (nqfils(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-       !do ifils=1,nqfils(iq) ! modif C Risi 22nov2020
-         iq2=iqfils(ifils,iq)  
+      if (tr%ndesc > 0) then  
+       do ichld=1,tr%ndesc
+       !do ichld=1,tr%nchld ! modif C Risi 22nov2020
+         iq2=tr%idesc(ichld)  
 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
          DO l=1,llm
@@ -397,6 +400,6 @@
          enddo !DO l=1,llm
 c$OMP END DO NOWAIT
-        enddo !do ifils=1,nqdesc(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo !do ichld=1,tr%ndesc
+      endif !if (tr%ndesc > 0) then
 
       !write(*,*) 'vlsplt 399: iq,ijb_x=',iq,ijb_x
@@ -422,5 +425,5 @@
 c   --------------------------------------------------------------------
       USE parallel_lmdz
-      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils, ! CRisi                 &
+      USE infotrac, ONLY : nqtot, tracers, tra,        ! CRisi                 &
      &                     qperemin,masseqmin,ratiomin ! MVals et CRisi    
       USE comconst_mod, ONLY: pi
@@ -468,5 +471,6 @@
 
       REAL Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi
-      INTEGER ifils,iq2 ! CRisi
+      INTEGER ichld,iq2 ! CRisi
+      TYPE(tra), POINTER :: tr
 c
 c
@@ -478,4 +482,6 @@
       INTEGER ijb,ije
       INTEGER ijbm,ijem
+
+      tr => tracers(iq)
 
       ijb=ij_begin-2*iip1
@@ -732,5 +738,5 @@
 ! CRisi: appel récursif de l'advection sur les fils.
 ! Il faut faire ça avant d'avoir mis à jour q et masse
-      !write(*,*) 'vly 689: iq,nqfils(iq)=',iq,nqfils(iq) 
+      !write(*,*) 'vly 689: iq,tr%nchld=',iq,tr%nchld 
 
       ijb=ij_begin-2*iip1
@@ -743,8 +749,8 @@
       if (pole_sud)  ijem=ij_end
 
-      if (nqfils(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-       !do ifils=1,nqfils(iq) ! modif C Risi 22nov2020
-         iq2=iqfils(ifils,iq)
+      if (tr%ndesc > 0) then  
+       do ichld=1,tr%ndesc
+       !do ichld=1,tr%nchld ! modif C Risi 22nov2020
+         iq2=tr%idesc(ichld)
 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 
          DO l=1,llm
@@ -767,11 +773,11 @@
          enddo !DO l=1,llm
 c$OMP END DO NOWAIT
-        enddo !do ifils=1,nqdesc(iq)
-
-        do ifils=1,nqfils(iq)
-         iq2=iqfils(ifils,iq)
+        enddo !do ichld=1,tr%ndesc
+
+        do ichld=1,tr%nchld
+         iq2=tr%idesc(ichld)
          call vly_loc(Ratio,pente_max,masse,qbyv,iq2)
-        enddo !do ifils=1,nqfils(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo !do ichld=1,tr%nchld
+      endif !if (tr%ndesc > 0) then
 ! end CRisi
       
@@ -862,7 +868,7 @@
 !      if (pole_sud)  ije=ij_end
 
-      if (nqfils(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-         iq2=iqfils(ifils,iq)  
+      if (tr%ndesc > 0) then  
+       do ichld=1,tr%ndesc
+         iq2=tr%idesc(ichld)  
 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
          DO l=1,llm
@@ -872,6 +878,6 @@
          enddo
 c$OMP END DO NOWAIT
-        enddo !do ifils=1,nqdesc(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo !do ichld=1,tr%ndesc
+      endif !if (tr%ndesc > 0) then
 
 
@@ -895,5 +901,5 @@
       USE parallel_lmdz
       USE vlz_mod
-      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils, ! CRisi                 &
+      USE infotrac, ONLY : nqtot, tracers, tra,        ! CRisi                 &
      &                     qperemin,masseqmin,ratiomin ! MVals et CRisi
       
@@ -946,5 +952,5 @@
       ! Ces varibles doivent être déclarées en pointer et en save dans
       ! vlz_loc si on veut qu'elles soient vues par tous les threads.  
-      INTEGER ifils,iq2 ! CRisi
+      INTEGER ichld,iq2 ! CRisi
 
 
@@ -1159,9 +1165,9 @@
 ! CRisi: appel récursif de l'advection sur les fils.
 ! Il faut faire ça avant d'avoir mis à jour q et masse
-      !write(*,*) 'vlsplt 942: iq,nqfils(iq)=',iq,nqfils(iq)
-      if (nqfils(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-       !do ifils=1,nqfils(iq) ! modif C Risi 22 nov 2020
-         iq2=iqfils(ifils,iq)
+      !write(*,*) 'vlsplt 942: iq,tr%nchld=',iq,tr%nchld
+      if (tr%ndesc > 0) then  
+       do ichld=1,tr%ndesc
+       !do ichld=1,tr%nchld ! modif C Risi 22 nov 2020
+         iq2=tr%idesc(ichld)
 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
          DO l=1,llm
@@ -1179,12 +1185,12 @@
          enddo
 c$OMP END DO NOWAIT
-        enddo !do ifils=1,nqdesc(iq)
+        enddo !do ichld=1,tr%ndesc
 c$OMP BARRIER
 
-        do ifils=1,nqfils(iq)
-         iq2=iqfils(ifils,iq)
+        do ichld=1,tr%nchld
+         iq2=tr%idesc(ichld)
          call vlz_loc(Ratio,pente_max,masse,w,ijb_x,ije_x,iq2)
-        enddo !do ifils=1,nqfils(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo !do ichld=1,tr%nchld
+      endif !if (tr%ndesc > 0) then
 ! end CRisi  
 
@@ -1207,7 +1213,7 @@
       
 ! retablir les fils en rapport de melange par rapport a l'air:
-      if (nqfils(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-         iq2=iqfils(ifils,iq)  
+      if (tr%ndesc > 0) then  
+       do ichld=1,tr%ndesc
+         iq2=tr%idesc(ichld)  
 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
          DO l=1,llm
@@ -1217,6 +1223,6 @@
          enddo
 c$OMP END DO NOWAIT
-        enddo !do ifils=1,nqdesc(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo !do ichld=1,tr%ndesc
+      endif !if (tr%ndesc > 0) then
 
       RETURN
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlspltgen_loc.F
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlspltgen_loc.F	(revision 3851)
+++ 	(revision )
@@ -1,605 +1,0 @@
-!
-! $Header$
-!
-       SUBROUTINE vlspltgen_loc( q,iadv,pente_max,masse,w,pbaru,pbarv,
-     &                           pdt, p,pk,teta                 )
-     
-c
-c     Auteurs:   P.Le Van, F.Hourdin, F.Forget, F.Codron 
-c
-c    ********************************************************************
-c          Shema  d'advection " pseudo amont " .
-c      + test sur humidite specifique: Q advecte< Qsat aval
-c                   (F. Codron, 10/99)
-c    ********************************************************************
-c     q,pbaru,pbarv,w sont des arguments d'entree  pour le s-pg ....
-c
-c     pente_max facteur de limitation des pentes: 2 en general
-c                                                0 pour un schema amont
-c     pbaru,pbarv,w flux de masse en u ,v ,w
-c     pdt pas de temps
-c
-c     teta temperature potentielle, p pression aux interfaces,
-c     pk exner au milieu des couches necessaire pour calculer Qsat
-c   --------------------------------------------------------------------
-      USE parallel_lmdz
-      USE mod_hallo
-      USE Write_Field_loc
-      USE VAMPIR
-      ! CRisi: on rajoute variables utiles d'infotrac  
-      USE infotrac, ONLY : nqtot,nqperes,nqdesc,nqfils,iqfils, 
-     &    ok_iso_verif
-      USE vlspltgen_mod
-      USE comconst_mod, ONLY: cpp
-      IMPLICIT NONE
-
-c
-      include "dimensions.h"
-      include "paramet.h"
-
-c
-c   Arguments:
-c   ----------
-      INTEGER iadv(nqtot)
-      REAL masse(ijb_u:ije_u,llm),pente_max
-      REAL pbaru( ijb_u:ije_u,llm ),pbarv( ijb_v:ije_v,llm)
-      REAL q(ijb_u:ije_u,llm,nqtot)
-      REAL w(ijb_u:ije_u,llm),pdt
-      REAL p(ijb_u:ije_u,llmp1),teta(ijb_u:ije_u,llm)
-      REAL pk(ijb_u:ije_u,llm)
-c
-c      Local 
-c   ---------
-c
-      INTEGER ij,l
-c
-      REAL zzpbar, zzw
-
-      REAL qmin,qmax
-      DATA qmin,qmax/0.,1.e33/
-
-c--pour rapport de melange saturant--
-
-      REAL rtt,retv,r2es,r3les,r3ies,r4les,r4ies,play
-      REAL ptarg,pdelarg,foeew,zdelta
-      REAL tempe(ijb_u:ije_u)
-      INTEGER ijb,ije,iq,iq2,ifils
-      LOGICAL, SAVE :: firstcall=.TRUE.
-!$OMP THREADPRIVATE(firstcall)
-      type(request),SAVE :: MyRequest1
-!$OMP THREADPRIVATE(MyRequest1)
-      type(request),SAVE :: MyRequest2
-!$OMP THREADPRIVATE(MyRequest2)
-c    fonction psat(T)
-
-       FOEEW ( PTARG,PDELARG ) = EXP (
-     *          (R3LES*(1.-PDELARG)+R3IES*PDELARG) * (PTARG-RTT)
-     * / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)) )
-
-        r2es  = 380.11733 
-        r3les = 17.269
-        r3ies = 21.875
-        r4les = 35.86
-        r4ies = 7.66
-        retv = 0.6077667
-        rtt  = 273.16
-
-c Allocate variables depending on dynamic variable nqtot
-
-         IF (firstcall) THEN
-            firstcall=.FALSE.
-         END IF
-c-- Calcul de Qsat en chaque point
-c-- approximation: au milieu des couches play(l)=(p(l)+p(l+1))/2
-c   pour eviter une exponentielle.
-
-      call SetTag(MyRequest1,100)
-      call SetTag(MyRequest2,101)
-
-        
-        ijb=ij_begin-iip1
-        ije=ij_end+iip1
-        if (pole_nord) ijb=ij_begin
-        if (pole_sud) ije=ij_end
-        
-c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 
-        DO l = 1, llm
-         DO ij = ijb, ije
-          tempe(ij) = teta(ij,l) * pk(ij,l) /cpp
-         ENDDO
-         DO ij = ijb, ije
-          zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
-          play   = 0.5*(p(ij,l)+p(ij,l+1))
-          qsat(ij,l) = MIN(0.5, r2es* FOEEW(tempe(ij),zdelta) / play )
-          qsat(ij,l) = qsat(ij,l) / ( 1. - retv * qsat(ij,l) )
-         ENDDO
-        ENDDO
-c$OMP END DO NOWAIT
-c      PRINT*,'Debut vlsplt version debug sans vlyqs'
-
-        zzpbar = 0.5 * pdt
-        zzw    = pdt
-
-      ijb=ij_begin
-      ije=ij_end
-      if (pole_nord) ijb=ijb+iip1
-      if (pole_sud)  ije=ije-iip1
-
-c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)       
-      DO l=1,llm
-        DO ij = ijb,ije
-            mu(ij,l)=pbaru(ij,l) * zzpbar
-         ENDDO
-      ENDDO
-c$OMP END DO NOWAIT
-      
-      ijb=ij_begin-iip1
-      ije=ij_end
-      if (pole_nord) ijb=ij_begin
-      if (pole_sud)  ije=ij_end-iip1
-
-c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-      DO l=1,llm
-         DO ij=ijb,ije
-            mv(ij,l)=pbarv(ij,l) * zzpbar
-         ENDDO
-      ENDDO
-c$OMP END DO NOWAIT
-
-      ijb=ij_begin
-      ije=ij_end
-
-      DO iq=1,nqtot
-c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)      
-      DO l=1,llm
-         DO ij=ijb,ije
-            mw(ij,l,iq)=w(ij,l) * zzw
-         ENDDO
-      ENDDO
-c$OMP END DO NOWAIT
-      ENDDO
-
-      DO iq=1,nqtot  
-c$OMP MASTER
-      DO ij=ijb,ije
-         mw(ij,llm+1,iq)=0.
-      ENDDO
-c$OMP END MASTER
-      ENDDO
-
-c      CALL SCOPY(ijp1llm,q,1,zq,1)
-c      CALL SCOPY(ijp1llm,masse,1,zm,1)
-
-       ijb=ij_begin
-       ije=ij_end
-
-      DO iq=1,nqtot       
-c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 
-        DO l=1,llm
-          zq(ijb:ije,l,iq)=q(ijb:ije,l,iq)
-          zm(ijb:ije,l,iq)=masse(ijb:ije,l)
-        ENDDO
-c$OMP END DO NOWAIT
-      ENDDO
-
-#ifdef DEBUG_IO     
-       CALL WriteField_u('mu',mu)
-       CALL WriteField_v('mv',mv)
-       CALL WriteField_u('mw',mw)
-       CALL WriteField_u('qsat',qsat)
-#endif
-
-      ! verif temporaire
-      ijb=ij_begin
-      ije=ij_end  
-      if (ok_iso_verif) then
-        call check_isotopes(zq,ijb,ije,'vlspltgen_loc 191')
-      endif !if (ok_iso_verif) then   
-
-c$OMP BARRIER           
-!      DO iq=1,nqtot
-      DO iq=1,nqperes ! CRisi: on ne boucle que sur les pères= ceux qui sont transportés directement par l'air
-       !write(*,*) 'vlspltgen 192: iq,iadv=',iq,iadv(iq)
-#ifdef DEBUG_IO    
-       CALL WriteField_u('zq',zq(:,:,iq))
-       CALL WriteField_u('zm',zm(:,:,iq)) 
-#endif
-        if(iadv(iq) == 0) then
-        
-          cycle 
-        
-        else if (iadv(iq)==10) then
-
-#ifdef _ADV_HALO        
-! CRisi: on ajoute les nombres de fils et tableaux des fils
-! On suppose qu'on ne peut advecter les fils que par le schéma 10.  
-          call vlx_loc(zq,pente_max,zm,mu,
-     &                     ij_begin,ij_begin+2*iip1-1,iq)
-          call vlx_loc(zq,pente_max,zm,mu,
-     &               ij_end-2*iip1+1,ij_end,iq)
-#else
-          call vlx_loc(zq,pente_max,zm,mu,
-     &                     ij_begin,ij_end,iq)
-#endif
-
-c$OMP MASTER
-          call VTb(VTHallo)
-c$OMP END MASTER
-          call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest1)
-          call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest1)
-! CRisi
-          do ifils=1,nqdesc(iq)
-            iq2=iqfils(ifils,iq)
-            call Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest1)
-            call Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest1)
-          enddo
-
-c$OMP MASTER
-          call VTe(VTHallo)
-c$OMP END MASTER
-        else if (iadv(iq)==14) then
-
-#ifdef _ADV_HALO           
-          call vlxqs_loc(zq,pente_max,zm,mu,
-     &                   qsat,ij_begin,ij_begin+2*iip1-1,iq)
-          call vlxqs_loc(zq,pente_max,zm,mu,
-     &                   qsat,ij_end-2*iip1+1,ij_end,iq)
-#else
-          call vlxqs_loc(zq,pente_max,zm,mu,
-     &                   qsat,ij_begin,ij_end,iq)
-#endif
-
-c$OMP MASTER
-          call VTb(VTHallo)
-c$OMP END MASTER
-
-          call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest1)
-          call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest1)
-          do ifils=1,nqdesc(iq)
-            iq2=iqfils(ifils,iq)
-            call Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest1)
-            call Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest1)
-          enddo
-
-c$OMP MASTER
-          call VTe(VTHallo)
-c$OMP END MASTER 
-        else
-        
-          stop 'vlspltgen_p : schema non parallelise'
-      
-        endif
-      
-      enddo !DO iq=1,nqperes
-      
-      
-c$OMP BARRIER      
-c$OMP MASTER      
-      call VTb(VTHallo)
-c$OMP END MASTER
-
-      call SendRequest(MyRequest1)
-
-c$OMP MASTER
-      call VTe(VTHallo)
-c$OMP END MASTER       
-c$OMP BARRIER
-
-      ! verif temporaire
-      ijb=ij_begin-2*iip1
-      ije=ij_end+2*iip1  
-      if (pole_nord) ijb=ij_begin
-      if (pole_sud)  ije=ij_end  
-      if (ok_iso_verif) then
-           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 280')
-      endif !if (ok_iso_verif) then
-
-      do iq=1,nqperes
-        !write(*,*) 'vlspltgen 279: iq=',iq
-
-        if(iadv(iq) == 0) then
-        
-          cycle 
-        
-        else if (iadv(iq)==10) then
-
-#ifdef _ADV_HALLO
-          call vlx_loc(zq,pente_max,zm,mu,
-     &                 ij_begin+2*iip1,ij_end-2*iip1,iq)
-#endif        
-        else if (iadv(iq)==14) then
-#ifdef _ADV_HALLO
-          call vlxqs_loc(zq,pente_max,zm,mu,
-     &                    qsat,ij_begin+2*iip1,ij_end-2*iip1,iq)
-#endif    
-        else
-        
-          stop 'vlspltgen_p : schema non parallelise'
-      
-        endif
-      
-      enddo
-c$OMP BARRIER      
-c$OMP MASTER
-      call VTb(VTHallo)
-c$OMP END MASTER
-
-!      call WaitRecvRequest(MyRequest1)
-!      call WaitSendRequest(MyRequest1)
-c$OMP BARRIER
-       call WaitRequest(MyRequest1)
-
-
-c$OMP MASTER
-      call VTe(VTHallo)
-c$OMP END MASTER
-c$OMP BARRIER
-
-      
-      if (ok_iso_verif) then
-           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 326')
-      endif !if (ok_iso_verif) then        
-      if (ok_iso_verif) then
-           ijb=ij_begin-2*iip1
-           ije=ij_end+2*iip1
-           if (pole_nord) ijb=ij_begin
-           if (pole_sud)  ije=ij_end
-           call check_isotopes(zq,ijb,ije,'vlspltgen_loc 336')
-      endif !if (ok_iso_verif) then  
-
-      do iq=1,nqperes
-       !write(*,*) 'vlspltgen 321: iq=',iq
-#ifdef DEBUG_IO    
-       CALL WriteField_u('zq',zq(:,:,iq))
-       CALL WriteField_u('zm',zm(:,:,iq))
-#endif
-
-        if(iadv(iq) == 0) then
-        
-          cycle 
-        
-        else if (iadv(iq)==10) then
-        
-          call vly_loc(zq,pente_max,zm,mv,iq)
-  
-        else if (iadv(iq)==14) then
-      
-          call vlyqs_loc(zq,pente_max,zm,mv,
-     &                   qsat,iq)
- 
-        else
-        
-          stop 'vlspltgen_p : schema non parallelise'
-      
-        endif
-       
-       enddo
-
-      if (ok_iso_verif) then
-           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 357')
-      endif !if (ok_iso_verif) then
-
-      do iq=1,nqperes
-      !write(*,*) 'vlspltgen 349: iq=',iq
-#ifdef DEBUG_IO    
-       CALL WriteField_u('zq',zq(:,:,iq))
-       CALL WriteField_u('zm',zm(:,:,iq))
-#endif
-        if(iadv(iq) == 0) then 
-          
-          cycle 
-        
-        else if (iadv(iq)==10 .or. iadv(iq)==14 ) then
-
-c$OMP BARRIER        
-#ifdef _ADV_HALLO
-          call vlz_loc(zq,pente_max,zm,mw,
-     &               ij_begin,ij_begin+2*iip1-1,iq)
-          call vlz_loc(zq,pente_max,zm,mw,
-     &               ij_end-2*iip1+1,ij_end,iq)
-#else
-          call vlz_loc(zq,pente_max,zm,mw,
-     &               ij_begin,ij_end,iq)
-#endif
-c$OMP BARRIER
-
-c$OMP MASTER
-          call VTb(VTHallo)
-c$OMP END MASTER
-
-          call Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest2)
-          call Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest2)
-          ! CRisi
-          do ifils=1,nqdesc(iq)
-            iq2=iqfils(ifils,iq)
-            call Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest2)
-            call Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest2)
-          enddo      
-c$OMP MASTER
-          call VTe(VTHallo)
-c$OMP END MASTER        
-c$OMP BARRIER
-        else
-        
-          stop 'vlspltgen_p : schema non parallelise'
-      
-        endif
-      
-      enddo
-c$OMP BARRIER      
-
-c$OMP MASTER        
-      call VTb(VTHallo)
-c$OMP END MASTER
-
-      call SendRequest(MyRequest2)
-
-c$OMP MASTER
-      call VTe(VTHallo)
-c$OMP END MASTER        
-
-
-      if (ok_iso_verif) then
-           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 429')
-      endif !if (ok_iso_verif) then 
-
-c$OMP BARRIER
-      do iq=1,nqperes
-      !write(*,*) 'vlspltgen 409: iq=',iq
-
-        if(iadv(iq) == 0) then
-          
-          cycle 
-        
-        else if (iadv(iq)==10 .or. iadv(iq)==14 ) then
-c$OMP BARRIER        
-
-#ifdef _ADV_HALLO
-          call vlz_loc(zq,pente_max,zm,mw,
-     &               ij_begin+2*iip1,ij_end-2*iip1,iq)
-#endif
-
-c$OMP BARRIER        
-        else
-        
-          stop 'vlspltgen_p : schema non parallelise'
-      
-        endif
-      
-      enddo
-      !write(*,*) 'vlspltgen_loc 476'
-
-c$OMP BARRIER
-      !write(*,*) 'vlspltgen_loc 477'
-c$OMP MASTER
-      call VTb(VTHallo)
-c$OMP END MASTER
-
-!      call WaitRecvRequest(MyRequest2)
-!      call WaitSendRequest(MyRequest2)
-c$OMP BARRIER
-       CALL WaitRequest(MyRequest2)
-
-c$OMP MASTER
-      call VTe(VTHallo)
-c$OMP END MASTER
-c$OMP BARRIER
-
-
-      !write(*,*) 'vlspltgen_loc 494'
-      if (ok_iso_verif) then
-           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 461')
-      endif !if (ok_iso_verif) then
-
-      do iq=1,nqperes
-      !write(*,*) 'vlspltgen 449: iq=',iq
-#ifdef DEBUG_IO    
-       CALL WriteField_u('zq',zq(:,:,iq))
-       CALL WriteField_u('zm',zm(:,:,iq))
-#endif
-        if(iadv(iq) == 0) then
-        
-          cycle 
-        
-        else if (iadv(iq)==10) then
-        
-          call vly_loc(zq,pente_max,zm,mv,iq)
-  
-        else if (iadv(iq)==14) then
-      
-          call vlyqs_loc(zq,pente_max,zm,mv,
-     &                   qsat,iq)
- 
-        else
-        
-          stop 'vlspltgen_p : schema non parallelise'
-      
-        endif
-       
-       enddo !do iq=1,nqperes
-
-      if (ok_iso_verif) then
-           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 493')
-      endif !if (ok_iso_verif) then
-
-      do iq=1,nqperes
-      !write(*,*) 'vlspltgen 477: iq=',iq
-#ifdef DEBUG_IO    
-       CALL WriteField_u('zq',zq(:,:,iq))
-       CALL WriteField_u('zm',zm(:,:,iq))
-#endif
-        if(iadv(iq) == 0) then 
-          
-          cycle 
-        
-        else if (iadv(iq)==10) then
-        
-          call vlx_loc(zq,pente_max,zm,mu,
-     &               ij_begin,ij_end,iq)
-  
-        else if (iadv(iq)==14) then
-      
-          call vlxqs_loc(zq,pente_max,zm,mu,
-     &                 qsat, ij_begin,ij_end,iq)
- 
-        else
-        
-          stop 'vlspltgen_p : schema non parallelise'
-      
-        endif
-       
-       enddo !do iq=1,nqperes
-
-      !write(*,*) 'vlspltgen 550: apres derniere serie de call vlx'
-      if (ok_iso_verif) then
-           call check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 521')
-      endif !if (ok_iso_verif) then
-     
-      ijb=ij_begin
-      ije=ij_end
-      !write(*,*) 'vlspltgen_loc 557'
-c$OMP BARRIER      
-
-      !write(*,*) 'vlspltgen_loc 559'  
-      DO iq=1,nqtot
-       !write(*,*) 'vlspltgen_loc 561, iq=',iq  
-#ifdef DEBUG_IO    
-       CALL WriteField_u('zq',zq(:,:,iq))
-       CALL WriteField_u('zm',zm(:,:,iq))
-#endif
-c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)          
-        DO l=1,llm
-           DO ij=ijb,ije
-c             print *,'zq-->',ij,l,iq,zq(ij,l,iq)
-c             print *,'q-->',ij,l,iq,q(ij,l,iq)
-             q(ij,l,iq)=zq(ij,l,iq)
-           ENDDO
-        ENDDO
-c$OMP END DO NOWAIT    
-      !write(*,*) 'vlspltgen_loc 575'      
-
-c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
-        DO l=1,llm
-           DO ij=ijb,ije-iip1+1,iip1
-              q(ij+iim,l,iq)=q(ij,l,iq)
-           ENDDO
-        ENDDO
-c$OMP END DO NOWAIT  
-      !write(*,*) 'vlspltgen_loc 583'  
-      ENDDO !DO iq=1,nqtot
-        
-      if (ok_iso_verif) then
-           call check_isotopes(q,ij_begin,ij_end,'vlspltgen_loc 557')
-      endif !if (ok_iso_verif) then
-
-c$OMP BARRIER
-
-cc$OMP MASTER      
-c      call WaitSendRequest(MyRequest1) 
-c      call WaitSendRequest(MyRequest2)
-cc$OMP END MASTER
-cc$OMP BARRIER
-
-      !write(*,*) 'vlspltgen 597: sortie'  
-      RETURN
-      END
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlspltgen_loc.F90
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlspltgen_loc.F90	(revision 3852)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlspltgen_loc.F90	(revision 3852)
@@ -0,0 +1,504 @@
+SUBROUTINE vlspltgen_loc( q,iadv,pente_max,masse,w,pbaru,pbarv,pdt,p,pk,teta)
+
+!  Auteurs:   P.Le Van, F.Hourdin, F.Forget, F.Codron 
+!
+! ********************************************************************
+!       Shema  d'advection " pseudo amont " .
+!   + test sur humidite specifique: Q advecte< Qsat aval
+!		(F. Codron, 10/99)
+! ********************************************************************
+!  q,pbaru,pbarv,w sont des arguments d'entree  pour le s-pg ....
+!
+!  pente_max facteur de limitation des pentes: 2 en general
+!					     0 pour un schema amont
+!  pbaru,pbarv,w flux de masse en u ,v ,w
+!  pdt pas de temps
+!
+!  teta temperature potentielle, p pression aux interfaces,
+!  pk exner au milieu des couches necessaire pour calculer Qsat
+!--------------------------------------------------------------------
+  USE parallel_lmdz
+  USE mod_hallo
+  USE Write_Field_loc
+  USE VAMPIR
+  USE infotrac, ONLY : nqtot, tracers, tra
+  USE vlspltgen_mod
+  USE comconst_mod, ONLY: cpp
+  IMPLICIT NONE
+
+  include "dimensions.h"
+  include "paramet.h"
+
+!
+! Arguments:
+!----------
+  REAL, DIMENSION(ijb_u:ije_u,llm,nqtot), INTENT(INOUT) :: q
+  INTEGER, DIMENSION(nqtot),              INTENT(IN)    :: iadv
+  REAL,                                   INTENT(IN)    :: pdt, pente_max
+  REAL, DIMENSION(ijb_u:ije_u,llm),       INTENT(IN)    :: pk, pbaru, masse, w, teta
+  REAL, DIMENSION(ijb_v:ije_v,llm),       INTENT(IN)    ::     pbarv
+  REAL, DIMENSION(ijb_u:ije_u,llmp1),     INTENT(IN)    :: p
+!
+! Local 
+!---------
+  INTEGER :: ij, l
+  REAL    :: zzpbar, zzw
+  REAL, PARAMETER :: qmin = 0., qmax = 1.e33
+  TYPE(tra), POINTER :: tr
+
+!--pour rapport de melange saturant--
+  REAL, PARAMETER ::   &
+    r2es  = 380.11733, &
+    r3les = 17.269,    &
+    r3ies = 21.875,    &
+    r4les = 35.86,     &
+    r4ies = 7.66,      &
+    retv  = 0.6077667, &
+    rtt   = 273.16
+
+  REAL    :: play, ptarg, pdelarg, foeew, zdelta, tempe(ijb_u:ije_u)
+  INTEGER :: ijb,ije,iq,iq2,ichld
+  LOGICAL, SAVE :: firstcall=.TRUE.
+!$OMP THREADPRIVATE(firstcall)
+  TYPE(request), SAVE :: MyRequest1, MyRequest2
+!$OMP THREADPRIVATE     (MyRequest1, MyRequest2)
+
+!    fonction psat(T)
+  FOEEW ( PTARG,PDELARG ) = EXP ( (R3LES*(1.-PDELARG)+R3IES*PDELARG) * (PTARG-RTT) &
+                         / (PTARG-(R4LES*(1.-PDELARG)+R4IES*PDELARG)) )
+
+! Allocate variables depending on dynamic variable nqtot
+  IF(firstcall) THEN
+     firstcall=.FALSE.
+  END IF
+!-- Calcul de Qsat en chaque point
+!-- approximation: au milieu des couches play(l)=(p(l)+p(l+1))/2
+!   pour eviter une exponentielle.
+
+  CALL SetTag(MyRequest1,100)
+  CALL SetTag(MyRequest2,101)
+
+  ijb=ij_begin-iip1; IF(pole_nord) ijb=ij_begin
+  ije=ij_end  +iip1; IF(pole_sud)  ije=ij_end
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 
+  DO l = 1, llm
+    DO ij = ijb, ije
+      tempe(ij) = teta(ij,l) * pk(ij,l) /cpp
+    END DO
+    DO ij = ijb, ije
+      zdelta = MAX( 0., SIGN(1., rtt - tempe(ij)) )
+      play   = 0.5*(p(ij,l)+p(ij,l+1))
+      qsat(ij,l) = MIN(0.5, r2es* FOEEW(tempe(ij),zdelta) / play )
+      qsat(ij,l) = qsat(ij,l) / ( 1. - retv * qsat(ij,l) )
+    END DO
+  END DO
+!$OMP END DO NOWAIT
+!     PRINT*,'Debut vlsplt version debug sans vlyqs'
+
+  zzpbar = 0.5 * pdt
+  zzw    = pdt
+
+  ijb=ij_begin; IF(pole_nord) ijb=ijb+iip1
+  ije=ij_end;   IF(pole_sud)  ije=ije-iip1
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)       
+  DO l=1,llm
+    DO ij = ijb,ije
+      mu(ij,l)=pbaru(ij,l) * zzpbar
+    END DO
+  END DO
+!$OMP END DO NOWAIT
+      
+  ijb=ij_begin-iip1; IF(pole_nord) 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
+      mv(ij,l)=pbarv(ij,l) * zzpbar
+    END DO
+  END DO
+!$OMP END DO NOWAIT
+
+  ijb=ij_begin
+  ije=ij_end
+  DO iq=1,nqtot
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)      
+    DO l=1,llm
+      DO ij=ijb,ije
+        mw(ij,l,iq)=w(ij,l) * zzw
+      END DO
+    END DO
+!$OMP END DO NOWAIT
+  END DO
+
+  DO iq=1,nqtot  
+!$OMP MASTER
+    DO ij=ijb,ije
+      mw(ij,llm+1,iq)=0.
+    END DO
+!$OMP END MASTER
+  END DO
+
+!  CALL SCOPY(ijp1llm,q,1,zq,1)
+!  CALL SCOPY(ijp1llm,masse,1,zm,1)
+
+  ijb=ij_begin
+  ije=ij_end
+  DO iq=1,nqtot       
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 
+    DO l=1,llm
+      zq(ijb:ije,l,iq)=q(ijb:ije,l,iq)
+      zm(ijb:ije,l,iq)=masse(ijb:ije,l)
+    END DO
+!$OMP END DO NOWAIT
+  END DO
+
+#ifdef DEBUG_IO     
+  CALL WriteField_u('mu',mu)
+  CALL WriteField_v('mv',mv)
+  CALL WriteField_u('mw',mw)
+  CALL WriteField_u('qsat',qsat)
+#endif
+
+  ! verif temporaire
+  ijb=ij_begin
+  ije=ij_end  
+  CALL check_isotopes(zq,ijb,ije,'vlspltgen_loc 191')
+
+!$OMP BARRIER           
+  DO iq=1,nqtot
+    tr => tracers(iq)
+    ! CRisi: on ne boucle que sur les parents = ceux qui sont transportes directement par l'air
+    IF(tr%igen /= 1) CYCLE
+!    write(*,*) 'vlspltgen 192: iq,iadv=',iq,iadv(iq)
+#ifdef DEBUG_IO    
+    CALL WriteField_u('zq',zq(:,:,iq))
+    CALL WriteField_u('zm',zm(:,:,iq)) 
+#endif
+    !----------------------------------------------------------------------
+    SELECT CASE(iadv(iq))
+    !----------------------------------------------------------------------
+      CASE(0); CYCLE
+    !----------------------------------------------------------------------
+      CASE(10)
+#ifdef _ADV_HALO        
+        ! CRisi: on ajoute les nombres de fils et tableaux des fils
+        ! On suppose qu'on ne peut advecter les fils que par le schéma 10.  
+        CALL vlx_loc(zq,pente_max,zm,mu,ij_begin,ij_begin+2*iip1-1,iq)
+        CALL vlx_loc(zq,pente_max,zm,mu,ij_end-2*iip1+1,ij_end,iq)
+#else
+        CALL vlx_loc(zq,pente_max,zm,mu,ij_begin,ij_end,iq)
+#endif
+!$OMP MASTER
+        CALL VTb(VTHallo)
+!$OMP END MASTER
+        CALL Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest1)
+        CALL Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest1)
+! CRisi
+        DO ichld=1,tr%ndesc
+          iq2=tr%idesc(ichld)
+          CALL Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest1)
+          CALL Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest1)
+        END DO
+!$OMP MASTER
+        CALL VTe(VTHallo)
+!$OMP END MASTER
+    !----------------------------------------------------------------------
+      CASE(14)
+#ifdef _ADV_HALO           
+        CALL vlxqs_loc(zq,pente_max,zm,mu,qsat,ij_begin,ij_begin+2*iip1-1,iq)
+        CALL vlxqs_loc(zq,pente_max,zm,mu,qsat,ij_end-2*iip1+1,ij_end,iq)
+#else
+        CALL vlxqs_loc(zq,pente_max,zm,mu,qsat,ij_begin,ij_end,iq)
+#endif
+!$OMP MASTER
+        CALL VTb(VTHallo)
+!$OMP END MASTER
+        CALL Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest1)
+        CALL Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest1)
+        DO ichld=1,tr%ndesc
+          iq2=tr%idesc(ichld)
+          CALL Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest1)
+          CALL Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest1)
+        END DO
+!$OMP MASTER
+        CALL VTe(VTHallo)
+!$OMP END MASTER 
+    !----------------------------------------------------------------------
+      CASE DEFAULT; STOP 'vlspltgen_p : schema non parallelise'
+    !----------------------------------------------------------------------
+    END SELECT
+    !----------------------------------------------------------------------
+  END DO
+!$OMP BARRIER      
+
+!$OMP MASTER      
+  CALL VTb(VTHallo)
+!$OMP END MASTER
+  CALL SendRequest(MyRequest1)
+!$OMP MASTER
+  CALL VTe(VTHallo)
+!$OMP END MASTER       
+
+!$OMP BARRIER
+
+  ! verif temporaire
+  ijb=ij_begin-2*iip1; IF(pole_nord) ijb=ij_begin
+  ije=ij_end  +2*iip1; IF(pole_sud)  ije=ij_end
+  CALL check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 280')
+
+  DO iq=1,nqtot
+    tr => tracers(iq)
+!    write(*,*) 'vlspltgen 279: iq=',iq
+    IF(tr%igen /= 1) CYCLE
+    !----------------------------------------------------------------------
+    SELECT CASE(iadv(iq))
+    !----------------------------------------------------------------------
+      CASE(0); CYCLE
+    !----------------------------------------------------------------------
+      CASE(10)
+#ifdef _ADV_HALLO
+        CALL vlx_loc(zq,pente_max,zm,mu,ij_begin+2*iip1,ij_end-2*iip1,iq)
+#endif
+    !----------------------------------------------------------------------
+      CASE(14)
+#ifdef _ADV_HALLO
+        CALL vlxqs_loc(zq,pente_max,zm,mu,qsat,ij_begin+2*iip1,ij_end-2*iip1,iq)
+#endif
+      CASE DEFAULT; STOP 'vlspltgen_p : schema non parallelise'
+    !----------------------------------------------------------------------
+    END SELECT
+    !----------------------------------------------------------------------
+  END DO
+!$OMP BARRIER      
+
+!$OMP MASTER
+  CALL VTb(VTHallo)
+!$OMP END MASTER
+
+!  CALL WaitRecvRequest(MyRequest1)
+!  CALL WaitSendRequest(MyRequest1)
+!$OMP BARRIER
+  CALL WaitRequest(MyRequest1)
+
+
+!$OMP MASTER
+  CALL VTe(VTHallo)
+!$OMP END MASTER
+!$OMP BARRIER
+
+  CALL check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 326')
+
+  ijb=ij_begin-2*iip1; IF(pole_nord) ijb=ij_begin
+  ije=ij_end  +2*iip1; IF(pole_sud)  ije=ij_end
+
+  CALL check_isotopes(zq,ijb,ije,'vlspltgen_loc 336')
+
+  DO iq=1,nqtot
+    tr => tracers(iq)
+!    write(*,*) 'vlspltgen 321: iq=',iq
+    IF(tr%igen /= 1) CYCLE
+#ifdef DEBUG_IO    
+    CALL WriteField_u('zq',zq(:,:,iq))
+    CALL WriteField_u('zm',zm(:,:,iq))
+#endif
+    !----------------------------------------------------------------------
+    SELECT CASE(iadv(iq))
+      CASE(0); CYCLE
+      CASE(10); CALL   vly_loc(zq,pente_max,zm,mv,iq)
+      CASE(14); CALL vlyqs_loc(zq,pente_max,zm,mv,qsat,iq)
+      CASE DEFAULT; STOP 'vlspltgen_p : schema non parallelise'
+    END SELECT
+    !----------------------------------------------------------------------
+  END DO
+
+  CALL check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 357')
+
+  DO iq=1,nqtot
+    tr => tracers(iq)
+!    write(*,*) 'vlspltgen 349: iq=',iq
+    IF(tr%igen /= 1) CYCLE
+#ifdef DEBUG_IO    
+    CALL WriteField_u('zq',zq(:,:,iq))
+    CALL WriteField_u('zm',zm(:,:,iq))
+#endif
+    !----------------------------------------------------------------------
+    SELECT CASE(iadv(iq))
+    !----------------------------------------------------------------------
+      CASE(0); CYCLE
+    !----------------------------------------------------------------------
+      CASE(10,14)
+!$OMP BARRIER        
+#ifdef _ADV_HALLO
+    	CALL vlz_loc(zq,pente_max,zm,mw,ij_begin,ij_begin+2*iip1-1,iq)
+    	CALL vlz_loc(zq,pente_max,zm,mw,ij_end-2*iip1+1,ij_end,iq)
+#else
+        CALL vlz_loc(zq,pente_max,zm,mw,ij_begin,ij_end,iq)
+#endif
+!$OMP BARRIER
+!$OMP MASTER
+        CALL VTb(VTHallo)
+!$OMP END MASTER
+    	CALL Register_Hallo_u(zq(:,:,iq),llm,2,2,2,2,MyRequest2)
+    	CALL Register_Hallo_u(zm(:,:,iq),llm,1,1,1,1,MyRequest2)
+    	! CRisi
+    	DO ichld=1,tr%ndesc
+    	  iq2=tr%idesc(ichld)
+    	  CALL Register_Hallo_u(zq(:,:,iq2),llm,2,2,2,2,MyRequest2)
+    	  CALL Register_Hallo_u(zm(:,:,iq2),llm,1,1,1,1,MyRequest2)
+    	END DO
+!$OMP MASTER
+        CALL VTe(VTHallo)
+!$OMP END MASTER        
+!$OMP BARRIER
+    !----------------------------------------------------------------------
+      CASE DEFAULT; STOP 'vlspltgen_p : schema non parallelise'
+    !----------------------------------------------------------------------
+    END SELECT
+    !----------------------------------------------------------------------
+  END DO
+!$OMP BARRIER      
+
+
+!$OMP MASTER        
+  CALL VTb(VTHallo)
+!$OMP END MASTER
+
+  CALL SendRequest(MyRequest2)
+
+!$OMP MASTER
+  CALL VTe(VTHallo)
+!$OMP END MASTER        
+
+  CALL check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 429')
+
+!$OMP BARRIER
+  DO iq=1,nqtot
+    tr => tracers(iq)
+!    write(*,*) 'vlspltgen 409: iq=',iq
+    IF(tr%igen /= 1) CYCLE
+    !----------------------------------------------------------------------
+    SELECT CASE(iadv(iq))
+    !----------------------------------------------------------------------
+      CASE(0); CYCLE
+    !----------------------------------------------------------------------
+      CASE(10,14)
+!$OMP BARRIER        
+#ifdef _ADV_HALLO
+        CALL vlz_loc(zq,pente_max,zm,mw,ij_begin+2*iip1,ij_end-2*iip1,iq)
+#endif
+!$OMP BARRIER
+    !----------------------------------------------------------------------
+      CASE DEFAULT; STOP 'vlspltgen_p : schema non parallelise'
+    !----------------------------------------------------------------------
+    END SELECT
+    !----------------------------------------------------------------------
+  END DO
+!  write(*,*) 'vlspltgen_loc 476'
+
+!$OMP BARRIER
+!  write(*,*) 'vlspltgen_loc 477'
+!$OMP MASTER
+  CALL VTb(VTHallo)
+!$OMP END MASTER
+
+!  CALL WaitRecvRequest(MyRequest2)
+!  CALL WaitSendRequest(MyRequest2)
+!$OMP BARRIER
+  CALL WaitRequest(MyRequest2)
+
+!$OMP MASTER
+  CALL VTe(VTHallo)
+!$OMP END MASTER
+!$OMP BARRIER
+
+!  write(*,*) 'vlspltgen_loc 494'
+  CALL check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 461')
+
+  DO iq=1,nqtot
+    tr => tracers(iq)
+!    write(*,*) 'vlspltgen 449: iq=',iq
+    IF(tr%igen /= 1) CYCLE
+#ifdef DEBUG_IO    
+      CALL WriteField_u('zq',zq(:,:,iq))
+      CALL WriteField_u('zm',zm(:,:,iq))
+#endif
+    !----------------------------------------------------------------------
+    SELECT CASE(iadv(iq))
+      CASE(0); CYCLE
+      CASE(10); CALL   vly_loc(zq,pente_max,zm,mv,iq)
+      CASE(14); CALL vlyqs_loc(zq,pente_max,zm,mv,qsat,iq)
+      CASE DEFAULT; STOP 'vlspltgen_p : schema non parallelise'
+    END SELECT
+    !----------------------------------------------------------------------
+  END DO
+
+  CALL check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 493')
+
+  DO iq=1,nqtot
+    tr => tracers(iq)
+!    write(*,*) 'vlspltgen 477: iq=',iq
+    IF(tr%igen /= 1) CYCLE
+#ifdef DEBUG_IO    
+    CALL WriteField_u('zq',zq(:,:,iq))
+    CALL WriteField_u('zm',zm(:,:,iq))
+#endif
+    !----------------------------------------------------------------------
+    SELECT CASE(iadv(iq))
+      CASE(0); CYCLE
+      CASE(10); CALL   vlx_loc(zq,pente_max,zm,mu,     ij_begin,ij_end,iq)
+      CASE(14); CALL vlxqs_loc(zq,pente_max,zm,mu,qsat,ij_begin,ij_end,iq)
+      CASE DEFAULT; STOP 'vlspltgen_p : schema non parallelise'
+    END SELECT
+    !----------------------------------------------------------------------
+  END DO
+
+!  write(*,*) 'vlspltgen 550: apres derniere serie de call vlx'
+  CALL check_isotopes(zq,ij_begin,ij_end,'vlspltgen_loc 521')
+ 
+  ijb=ij_begin
+  ije=ij_end
+!  write(*,*) 'vlspltgen_loc 557'
+!$OMP BARRIER      
+
+!  write(*,*) 'vlspltgen_loc 559'  
+  DO iq=1,nqtot
+  !  write(*,*) 'vlspltgen_loc 561, iq=',iq  
+#ifdef DEBUG_IO    
+    CALL WriteField_u('zq',zq(:,:,iq))
+    CALL WriteField_u('zm',zm(:,:,iq))
+#endif
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)          
+    DO l=1,llm
+      DO ij=ijb,ije
+!   	  print *,'zq-->',ij,l,iq,zq(ij,l,iq)
+!   	  print *,'q-->',ij,l,iq,q(ij,l,iq)
+    	q(ij,l,iq)=zq(ij,l,iq)
+      END DO
+    END DO
+!$OMP END DO NOWAIT    
+  !  write(*,*) 'vlspltgen_loc 575'      
+
+!$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
+    DO l=1,llm
+      DO ij=ijb,ije-iip1+1,iip1
+    	 q(ij+iim,l,iq)=q(ij,l,iq)
+      END DO
+    END DO
+!$OMP END DO NOWAIT  
+!  write(*,*) 'vlspltgen_loc 583'  
+  END DO
+        
+  CALL check_isotopes(q,ij_begin,ij_end,'vlspltgen_loc 557')
+
+!$OMP BARRIER
+
+!!$OMP MASTER      
+!      call WaitSendRequest(MyRequest1) 
+!      call WaitSendRequest(MyRequest2)
+!!$OMP END MASTER
+!!$OMP BARRIER
+
+!  write(*,*) 'vlspltgen 597: sortie'  
+
+END
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlspltqs_loc.F
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlspltqs_loc.F	(revision 3851)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlspltqs_loc.F	(revision 3852)
@@ -12,5 +12,5 @@
 c   --------------------------------------------------------------------
       USE parallel_lmdz
-      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils, ! CRisi                 &
+      USE infotrac, ONLY : nqtot, tracers, tra,        ! CRisi                 &
      &                     qperemin,masseqmin,ratiomin ! MVals et CRisi
       IMPLICIT NONE
@@ -40,6 +40,6 @@
       REAL u_mq(ijb_u:ije_u,llm)
       REAL Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi
-      INTEGER ifils,iq2 ! CRisi
-
+      INTEGER ichld,iq2 ! CRisi
+      TYPE(tra), POINTER :: tr
 
       REAL      SSUM
@@ -47,5 +47,7 @@
 
       INTEGER ijb,ije,ijb_x,ije_x
-      
+
+      tr => tracers(iq)
+
       !write(*,*) 'vlspltqs 58: entree vlxqs_loc, iq,ijb_x=',
 !     &   iq,ijb_x
@@ -337,10 +339,10 @@
 ! CRisi: appel récursif de l'advection sur les fils.
 ! Il faut faire ça avant d'avoir mis à jour q et masse
-      !write(*,*) 'vlspltqs 336: iq,ijb_x,nqfils(iq)=',
-!     &     iq,ijb_x,nqfils(iq)  
-
-      if (nqfils(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-         iq2=iqfils(ifils,iq)
+      !write(*,*) 'vlspltqs 336: iq,ijb_x,tr%nchld=',
+!     &     iq,ijb_x,tr%nchld  
+
+      if(tr%ndesc > 0) then  
+       do ichld=1,tr%ndesc
+         iq2=tr%idesc(ichld)
 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
          DO l=1,llm
@@ -356,11 +358,11 @@
          enddo
 c$OMP END DO NOWAIT
-        enddo !do ifils=1,nqfils(iq)
-        do ifils=1,nqfils(iq)
-         iq2=iqfils(ifils,iq)
+        enddo !do ichld=1,tr%nchld
+        do ichld=1,tr%nchld
+         iq2=tr%idesc(ichld)
          !write(*,*) 'vlxqs 349: on appelle vlx pour iq2=',iq2
          call vlx_loc(Ratio,pente_max,masse,u_mq,ijb_x,ije_x,iq2)
-        enddo !do ifils=1,nqfils(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo !do ichld=1,tr%nchld
+      endif !if(tr%ndesc > 0)
 ! end CRisi
 
@@ -389,7 +391,7 @@
 
 ! retablir les fils en rapport de melange par rapport a l'air:
-      if (nqfils(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-         iq2=iqfils(ifils,iq)  
+      if(tr%ndesc > 0) then  
+       do ichld=1,tr%ndesc
+         iq2=tr%idesc(ichld)  
 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
          DO l=1,llm
@@ -402,6 +404,6 @@
          enddo
 c$OMP END DO NOWAIT
-        enddo !do ifils=1,nqdesc(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo !do ichld=1,tr%ndesc
+      endif !if(tr%ndesc > 0)
 
       !write(*,*) 'vlspltqs 399: iq,ijb_x=',iq,ijb_x
@@ -426,5 +428,5 @@
 c   --------------------------------------------------------------------
       USE parallel_lmdz
-      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils, ! CRisi                 &
+      USE infotrac, ONLY : nqtot, tracers, tra,        ! CRisi                 &
      &                     qperemin,masseqmin,ratiomin ! MVals et CRisi
       USE comconst_mod, ONLY: pi
@@ -470,5 +472,6 @@
 c
       REAL Ratio(ijb_u:ije_u,llm,nqtot) ! CRisi
-      INTEGER ifils,iq2 ! CRisi
+      INTEGER ichld,iq2 ! CRisi
+      TYPE(tra), POINTER :: tr
 
       REAL      SSUM
@@ -733,5 +736,5 @@
 ! CRisi: appel récursif de l'advection sur les fils.
 ! Il faut faire ça avant d'avoir mis à jour q et masse
-      !write(*,*) 'vlyqs 689: iq,nqfils(iq)=',iq,nqfils(iq)
+      !write(*,*) 'vlyqs 689: iq,tr%nchld=',iq,tr%nchld
       
       ijb=ij_begin-2*iip1
@@ -747,7 +750,7 @@
       !write(lunout,*) 'ij_begin,ij_end=',ij_begin,ij_end
       !write(lunout,*) 'pole_nord,pole_sud=',pole_nord,pole_sud
-      if (nqfils(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-         iq2=iqfils(ifils,iq)
+      if(tr%ndesc > 0) then  
+       do ichld=1,tr%ndesc
+         iq2=tr%idesc(ichld)
 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
          DO l=1,llm
@@ -771,11 +774,11 @@
          enddo !DO l=1,llm
 c$OMP END DO NOWAIT
-        enddo !do ifils=1,nqdesc(iq)
-        do ifils=1,nqfils(iq)
-         iq2=iqfils(ifils,iq)
+        enddo !do ichld=1,tr%ndesc
+        do ichld=1,tr%nchld
+         iq2=tr%idesc(ichld)
          !write(lunout,*) 'vly: appel recursiv vly iq2=',iq2
          call vly_loc(Ratio,pente_max,masse,qbyv,iq2)
-        enddo !do ifils=1,nqfils(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo !do ichld=1,tr%nchld
+      endif !if(tr%ndesc > 0)
 
         
@@ -856,7 +859,7 @@
 !      if (pole_sud)  ije=ij_end-iip1
   
-      if (nqfils(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-         iq2=iqfils(ifils,iq)  
+      if(tr%ndesc > 0) then  
+       do ichld=1,tr%ndesc
+         iq2=tr%idesc(ichld)  
 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)   
          DO l=1,llm
@@ -866,6 +869,6 @@
          enddo
 c$OMP END DO NOWAIT
-        enddo !do ifils=1,nqdesc(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo !do ichld=1,tr%ndesc
+      endif !if(tr%ndesc > 0)
 
 
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlz_mod.F90
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlz_mod.F90	(revision 3851)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/vlz_mod.F90	(revision 3852)
@@ -15,5 +15,5 @@
   USE allocate_field_mod
   USE parallel_lmdz
-  USE infotrac
+  USE infotrac, ONLY: nqtot, tracers
   USE dimensions_mod
   IMPLICIT NONE
@@ -25,8 +25,8 @@
     CALL allocate_u(dzqw,llm,d)
     CALL allocate_u(adzqw,llm,d)
-    if (nqdesc_tot.gt.0) then
-    !CALL allocate_u(masseq,llm,nqtot,d)
-    CALL allocate_u(Ratio,llm,nqtot,d)
-    endif !if (nqdesc_tot.gt.0) then
+    IF(ANY(tracers(:)%ndesc > 0) THEN
+      !CALL allocate_u(masseq,llm,nqtot,d)
+      CALL allocate_u(Ratio,llm,nqtot,d)
+    END IF
 
   END SUBROUTINE vlz_allocate
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/writedynav_loc.F
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/writedynav_loc.F	(revision 3851)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/writedynav_loc.F	(revision 3852)
@@ -11,5 +11,5 @@
       USE parallel_lmdz
       USE misc_mod
-      USE infotrac, ONLY : nqtot, ttext
+      USE infotrac, ONLY : nqtot
       use com_io_dyn_mod, only : histaveid,histvaveid,histuaveid
       USE comconst_mod, ONLY: cpp
@@ -177,5 +177,5 @@
 !!$OMP MASTER      
 !        DO iq=1,nqtot
-!          call histwrite(histaveid, ttext(iq), itau_w, q(ijb:ije,:,iq), 
+!          call histwrite(histaveid, tracers(iq)%lnam, itau_w, q(ijb:ije,:,iq), 
 !     .                   iip1*jjn*llm, ndexu)
 !        enddo
Index: LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/writehist_loc.F
===================================================================
--- LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/writehist_loc.F	(revision 3851)
+++ LMDZ6/branches/LMDZ-tracers/libf/dyn3dmem/writehist_loc.F	(revision 3852)
@@ -11,5 +11,5 @@
       USE parallel_lmdz
       USE misc_mod
-      USE infotrac, ONLY : nqtot, ttext
+      USE infotrac, ONLY : nqtot
       use com_io_dyn_mod, only : histid,histvid,histuid
       USE comconst_mod, ONLY: cpp
@@ -177,5 +177,5 @@
 !!$OMP MASTER      
 !        DO iq=1,nqtot
-!          call histwrite(histid, ttext(iq), itau_w, q(ijb:ije,:,iq), 
+!          call histwrite(histid, tracers(iq)%lnam, itau_w, q(ijb:ije,:,iq), 
 !     .                   iip1*jjn*llm, ndexu)
 !        enddo
