Index: LMDZ6/trunk/libf/dyn3d/advtrac.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3d/advtrac.F90	(revision 4046)
+++ LMDZ6/trunk/libf/dyn3d/advtrac.F90	(revision 4050)
@@ -9,5 +9,5 @@
   !            M.A Filiberti (04/2002)
   !
-  USE infotrac, ONLY: nqtot, iadv,nqperes,ok_iso_verif
+  USE infotrac, ONLY: nqtot, tracers, nqperes,ok_iso_verif
   USE control_mod, ONLY: iapp_tracvl, day_step
   USE comconst_mod, ONLY: dtvr
@@ -72,4 +72,5 @@
   real cflz(ip1jmp1,llm)
   real, save :: cflxmax(llm),cflymax(llm),cflzmax(llm)
+  INTEGER :: iadv
 
   IF(iadvtr.EQ.0) THEN
@@ -226,9 +227,11 @@
      do iq=1,nqperes
         !        call clock(t_initial)
-        if(iadv(iq) == 0) cycle 
+       iadv = tracers(iq)%iadv
+       SELECT CASE(iadv)
+         CASE(0); CYCLE
+         CASE(10)
         !   ----------------------------------------------------------------
         !   Schema de Van Leer I MUSCL
         !   ----------------------------------------------------------------
-        if(iadv(iq).eq.10) THEN
            ! CRisi: on fait passer tout q pour avoir acces aux fils
            
@@ -236,9 +239,9 @@
            call vlsplt(q,2.,massem,wg,pbarug,pbarvg,dtvr,iq)
            
+         CASE(14)
            !   ----------------------------------------------------------------
            !   Schema "pseudo amont" + test sur humidite specifique
            !    pour la vapeur d'eau. F. Codron
            !   ----------------------------------------------------------------
-        else if(iadv(iq).eq.14) then
            !
            !write(*,*) 'advtrac 248: iq,q(1721,19,:)=',iq,q(1721,19,:)
@@ -246,10 +249,10 @@
                 pbarug,pbarvg,dtvr,p,pk,teta,iq)
            
+         CASE(12)
            !   ----------------------------------------------------------------
            !   Schema de Frederic Hourdin
            !   ----------------------------------------------------------------
-        else if(iadv(iq).eq.12) then
            !            Pas de temps adaptatif
-           call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
+           call adaptdt(iadv,dtbon,n,pbarug,massem)
            if (n.GT.1) then
               write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=', &
@@ -259,7 +262,7 @@
               call advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,1)
            end do
-        else if(iadv(iq).eq.13) then
+         CASE(13)
            !            Pas de temps adaptatif
-           call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
+           call adaptdt(iadv,dtbon,n,pbarug,massem)
            if (n.GT.1) then
               write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=', &
@@ -269,16 +272,16 @@
               call advn(q(1,1,iq),massem,wg,pbarug,pbarvg,dtbon,2)
            end do
+         CASE(20)
            !   ----------------------------------------------------------------
            !   Schema de pente SLOPES
            !   ----------------------------------------------------------------
-        else if (iadv(iq).eq.20) then
            call pentes_ini (q(1,1,iq),wg,massem,pbarug,pbarvg,0)
 
+         CASE(30)
            !   ----------------------------------------------------------------
            !   Schema de Prather
            !   ----------------------------------------------------------------
-        else if (iadv(iq).eq.30) then
            !            Pas de temps adaptatif
-           call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
+           call adaptdt(iadv,dtbon,n,pbarug,massem)
            if (n.GT.1) then
               write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=', &
@@ -288,13 +291,12 @@
                 n,dtbon)
 
+         CASE(11,16,17,18)
            !   ----------------------------------------------------------------
            !   Schemas PPM Lin et Rood
            !   ----------------------------------------------------------------
-        else if (iadv(iq).eq.11.OR.(iadv(iq).GE.16.AND. &
-             iadv(iq).LE.18)) then
 
            !        Test sur le flux horizontal
            !        Pas de temps adaptatif
-           call adaptdt(iadv(iq),dtbon,n,pbarug,massem)
+           call adaptdt(iadv,dtbon,n,pbarug,massem)
            if (n.GT.1) then
               write(*,*) 'WARNING horizontal dt=',dtbon,'dtvr=', &
@@ -316,5 +318,5 @@
 
            !-----------------------------------------------------------
-           !        Ss-prg interface LMDZ.4->PPM3d
+           !        Ss-prg interface LMDZ.4->PPM3d (ss-prg de Lin)
            !-----------------------------------------------------------
 
@@ -327,6 +329,6 @@
               !                         VL (version PPM) horiz. et PPM vert.
               !----------------------------------------------------------------
-              if (iadv(iq).eq.11) then
-                 !                  Ss-prg PPM3d de Lin
+             SELECT CASE(iadv)
+               CASE(11)
                  call ppm3d(1,qppm(1,1,iq), &
                       psppm,psppm, &
@@ -335,9 +337,8 @@
                       fill,dum,220.)
 
+               CASE(16)
                  !-------------------------------------------------------------
                  !                           Monotonic PPM
                  !-------------------------------------------------------------
-              else if (iadv(iq).eq.16) then
-                 !                  Ss-prg PPM3d de Lin
                  call ppm3d(1,qppm(1,1,iq), &
                       psppm,psppm, &
@@ -347,9 +348,8 @@
                  !-------------------------------------------------------------
 
+               CASE(17)
                  !-------------------------------------------------------------
                  !                           Semi Monotonic PPM
                  !-------------------------------------------------------------
-              else if (iadv(iq).eq.17) then
-                 !                  Ss-prg PPM3d de Lin
                  call ppm3d(1,qppm(1,1,iq), &
                       psppm,psppm, &
@@ -359,9 +359,8 @@
                  !-------------------------------------------------------------
 
+               CASE(18)
                  !-------------------------------------------------------------
                  !                         Positive Definite PPM
                  !-------------------------------------------------------------
-              else if (iadv(iq).eq.18) then
-                 !                  Ss-prg PPM3d de Lin
                  call ppm3d(1,qppm(1,1,iq), &
                       psppm,psppm, &
@@ -370,5 +369,5 @@
                       fill,dum,220.)
                  !-------------------------------------------------------------
-              endif
+             END SELECT
            enddo
            !-----------------------------------------------------------------
@@ -376,5 +375,5 @@
            !-----------------------------------------------------------------
            call interpost(q(1,1,iq),qppm(1,1,iq))
-        endif
+         END SELECT
         !----------------------------------------------------------------------
 
Index: LMDZ6/trunk/libf/dyn3d/check_isotopes.F
===================================================================
--- LMDZ6/trunk/libf/dyn3d/check_isotopes.F	(revision 4046)
+++ LMDZ6/trunk/libf/dyn3d/check_isotopes.F	(revision 4050)
@@ -1,4 +1,6 @@
         subroutine check_isotopes_seq(q,ip1jmp1,err_msg)
-        USE infotrac
+        USE infotrac, ONLY: nqtot, nqo, niso, ntraciso, ntraceurs_zone, 
+     &                     ok_isotopes, ok_isotrac, use_iso, 
+     &                     iqiso, index_trac,indnum_fn_num, tnat
         implicit none
 
Index: LMDZ6/trunk/libf/dyn3d/dynetat0.f90
===================================================================
--- LMDZ6/trunk/libf/dyn3d/dynetat0.f90	(revision 4046)
+++ LMDZ6/trunk/libf/dyn3d/dynetat0.f90	(revision 4050)
@@ -6,9 +6,9 @@
 ! Purpose: Initial state reading.
 !-------------------------------------------------------------------------------
-  USE infotrac
+  USE infotrac,    ONLY: nqtot, tracers, iqiso, iso_indnum, tnat, alpha_ideal, &
+                         ok_isotopes, maxlen
   USE netcdf,      ONLY: NF90_OPEN,  NF90_NOWRITE, NF90_INQ_VARID, NF90_NoErr, &
                          NF90_CLOSE, NF90_GET_VAR
   USE control_mod, ONLY: planet_type
-  USE strings_mod, ONLY: maxlen
   USE assert_eq_m, ONLY: assert_eq
   USE comvert_mod, ONLY: pa,preff
@@ -39,5 +39,5 @@
   CHARACTER(LEN=maxlen) :: msg, var, modname
   INTEGER, PARAMETER :: length=100
-  INTEGER :: iq, fID, vID, idecal!, iml, jml, lml, nqt
+  INTEGER :: iq, fID, vID, idecal, iqParent, iName, iZone, iPhase
   REAL    :: time, tab_cntrl(length)               !--- RUN PARAMS TABLE
 !-------------------------------------------------------------------------------
@@ -135,9 +135,13 @@
     q(:,:,:,iq)=0.
    !--- 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)))
+   !           Rayleigh distillation law.
+    iName = tracers(iq)%iso_iName
+    iZone = tracers(iq)%iso_iZone
+    iPhase= tracers(iq)%iso_iPhase
+    iqParent = tracers(iq)%iqParent
+    IF(ok_isotopes .AND. iName>0) THEN
+      IF(iZone==0) q(:,:,:,iq) = q(:,:,:,iqParent)*tnat(iName)    &
+                               *(q(:,:,:,iqParent)/30.e-3)**(alpha_ideal(iName)-1.)
+      IF(iZone==1) q(:,:,:,iq) = q(:,:,:,iqiso(iso_indnum(iq),iPhase))
     END IF
   END DO
Index: LMDZ6/trunk/libf/dyn3d/dynredem.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3d/dynredem.F90	(revision 4046)
+++ LMDZ6/trunk/libf/dyn3d/dynredem.F90	(revision 4050)
@@ -7,10 +7,9 @@
   USE IOIPSL
 #endif
-  USE infotrac
+  USE infotrac, ONLY: nqtot, tracers, maxlen
   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_var1, put_var2, err, modname, fil
-  USE strings_mod, ONLY: maxlen
   USE comvert_mod, ONLY: ap,bp,aps,bps,presnivs,pseudoalt,pa,preff, &
                               nivsig,nivsigs
@@ -167,5 +166,5 @@
 ! Purpose: Write the NetCDF restart file (append).
 !-------------------------------------------------------------------------------
-  USE infotrac
+  USE infotrac, ONLY: nqtot, tracers, type_trac, maxlen
   USE control_mod
   USE netcdf,   ONLY: NF90_OPEN,  NF90_NOWRITE, NF90_GET_VAR, NF90_INQ_VARID,  &
Index: LMDZ6/trunk/libf/dyn3d/iniacademic.F90
===================================================================
--- LMDZ6/trunk/libf/dyn3d/iniacademic.F90	(revision 4046)
+++ LMDZ6/trunk/libf/dyn3d/iniacademic.F90	(revision 4050)
@@ -5,5 +5,6 @@
 
   USE filtreg_mod, ONLY: inifilr
-  USE infotrac
+  USE infotrac,    ONLY: nqtot,niso_possibles,ok_isotopes,ok_iso_verif,tnat,alpha_ideal, &
+        & iqiso,iso_indnum, tracers
   USE control_mod, ONLY: day_step,planet_type
 #ifdef CPP_IOIPSL
@@ -61,5 +62,5 @@
   real tetastrat ! potential temperature in the stratosphere, in K
   real tetajl(jjp1,llm)
-  INTEGER i,j,l,lsup,ij
+  INTEGER i,j,l,lsup,ij, iq
 
   REAL teta0,ttp,delt_y,delt_z,eps ! Constantes pour profil de T
@@ -70,5 +71,5 @@
 
   real zz,ran1
-  integer idum
+  integer idum, iqParent, iName, iZone, iPhase
 
   REAL zdtvr
@@ -275,21 +276,19 @@
         if (planet_type=="earth") then
            ! Earth: first two tracers will be water
-           do i=1,nqtot
-              if (i == 1) q(:,:,i)=1.e-10
-              if (i == 2) q(:,:,i)=1.e-15
-              if (i.gt.2) q(:,:,i)=0.
+           do iq=1,nqtot
+              q(:,:,iq)=0.
+              IF(tracers(iq)%name == 'H2Ov') q(:,:,iq)=1.e-10
+              IF(tracers(iq)%name == 'H2Ol') q(:,:,iq)=1.e-15
 
               ! 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(:,:,i)=q(:,:,iqpere(i))             &
-      &                  *tnat(iso_num(i))               &
-      &                  *(q(:,:,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(:,:,i)=q(:,:,iqiso(iso_indnum(i),phase_num(i)))
-                endif
+              iName = tracers(iq)%iso_iName
+              iZone = tracers(iq)%iso_iZone
+              iPhase= tracers(iq)%iso_iPhase
+              iqParent = tracers(iq)%iqParent
+              if (ok_isotopes .AND. iName > 0) then
+                if (iZone == 0) q(:,:,iq) = q(:,:,iqParent)*tnat(iName) &
+                                          *(q(:,:,iqParent)/30.e-3)**(alpha_ideal(iName)-1)
+                if (iZone == 1) q(:,:,iq) = q(:,:,iqiso(iso_indnum(iq),iPhase))
               endif !if (ok_isotopes) then
 
Index: LMDZ6/trunk/libf/dyn3d/vlsplt.F
===================================================================
--- LMDZ6/trunk/libf/dyn3d/vlsplt.F	(revision 4046)
+++ LMDZ6/trunk/libf/dyn3d/vlsplt.F	(revision 4050)
@@ -4,5 +4,5 @@
 
       SUBROUTINE vlsplt(q,pente_max,masse,w,pbaru,pbarv,pdt,iq)
-      USE infotrac, ONLY: nqtot,nqdesc,iqfils
+      USE infotrac, ONLY: nqtot,tracers
 c
 c     Auteurs:   P.Le Van, F.Hourdin, F.Forget 
@@ -83,10 +83,8 @@
       CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1)
         
-      if (nqdesc(iq).gt.0) then  
-        do ifils=1,nqdesc(iq)
-          iq2=iqfils(ifils,iq)
-          CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1)
-        enddo  
-      endif !if (nqfils(iq).gt.0) then
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1)
+      enddo  
 
 cprint*,'Entree vlx1'
@@ -122,22 +120,20 @@
       ENDDO
       ! CRisi: aussi pour les fils
-      if (nqdesc(iq).gt.0) then
-      do ifils=1,nqdesc(iq)
-        iq2=iqfils(ifils,iq)
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
         DO l=1,llm
-         DO ij=1,ip1jmp1
-           q(ij,l,iq2)=zq(ij,l,iq2)
-         ENDDO
-         DO ij=1,ip1jm+1,iip1
+          DO ij=1,ip1jmp1
+            q(ij,l,iq2)=zq(ij,l,iq2)
+          ENDDO
+          DO ij=1,ip1jm+1,iip1
             q(ij+iim,l,iq2)=q(ij,l,iq2)
-         ENDDO
+          ENDDO
         ENDDO
-      enddo !do ifils=1,nqdesc(iq)    
-      endif ! if (nqdesc(iq).gt.0) then    
+      enddo
 
       RETURN
       END
       RECURSIVE SUBROUTINE vlx(q,pente_max,masse,u_m,iq)
-      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils, ! CRisi
+      USE infotrac, ONLY : nqtot,tracers, ! CRisi
      &                     qperemin,masseqmin,ratiomin ! MVals et CRisi
 
@@ -449,29 +445,27 @@
 ! CRisi: appel récursif de l'advection sur les fils.
 ! Il faut faire ça avant d'avoir mis à jour q et masse
-      !write(*,*) 'vlsplt 326: iq,nqfils(iq)=',iq,nqfils(iq) 
+      !write(*,*) 'vlsplt 326: iq,nqDesc(iq)=',iq,tracers(iq)%nqDescen
       
-      if (nqdesc(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-         iq2=iqfils(ifils,iq)
-         DO l=1,llm
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        DO l=1,llm
           DO ij=iip2,ip1jm
-           ! On a besoin de q et masse seulement entre iip2 et ip1jm 
-           !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
-           !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
-           !Mvals: veiller a ce qu'on n'ait pas de denominateur nul
-           masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin)
-           if (q(ij,l,iq).gt.qperemin) then
-             Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
-           else
-             Ratio(ij,l,iq2)=ratiomin
-           endif
+            ! On a besoin de q et masse seulement entre iip2 et ip1jm 
+            !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
+            !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
+            !Mvals: veiller a ce qu'on n'ait pas de denominateur nul
+            masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin)
+            if (q(ij,l,iq).gt.qperemin) then
+              Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
+            else
+              Ratio(ij,l,iq2)=ratiomin
+            endif
           enddo   
-         enddo
-        enddo !do ifils=1,nqdesc(iq)
-        do ifils=1,nqfils(iq)
-         iq2=iqfils(ifils,iq)
-         call vlx(Ratio,pente_max,masseq,u_mq,iq2)
-        enddo !do ifils=1,nqfils(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo
+      enddo
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        call vlx(Ratio,pente_max,masseq,u_mq,iq2)
+      enddo
 ! end CRisi
 
@@ -498,8 +492,7 @@
       ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio 
       ! puis on boucle en longitude
-      if (nqfils(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-         iq2=iqfils(ifils,iq)  
-         DO l=1,llm
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        DO l=1,llm
           DO ij=iip2+1,ip1jm
             q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)            
@@ -508,7 +501,6 @@
              q(ij-iim,l,iq2)=q(ij,l,iq2)
           enddo ! DO ij=ijb+iip1-1,ije,iip1
-         enddo !DO l=1,llm
-        enddo !do ifils=1,nqdesc(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo !DO l=1,llm
+      enddo
 
 c     CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
@@ -519,5 +511,5 @@
       END
       RECURSIVE SUBROUTINE vly(q,pente_max,masse,masse_adv_v,iq)
-      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils, ! CRisi
+      USE infotrac, ONLY : nqtot,tracers, ! CRisi
      &                     qperemin,masseqmin,ratiomin ! MVals et CRisi
 c
@@ -778,31 +770,29 @@
 ! 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,nqDesc(iq)=',iq,tracers(iq)%nqDescen
    
-      if (nqfils(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-         iq2=iqfils(ifils,iq)
-         DO l=1,llm
-         DO ij=1,ip1jmp1
-           ! attention, chaque fils doit avoir son masseq, sinon, le 1er
-           ! fils ecrase le masseq de ses freres.
-           !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
-           !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)     
-           !MVals: veiller a ce qu'on n'ait pas de denominateur nul
-           masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin)
-           if (q(ij,l,iq).gt.qperemin) then
-             Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
-           else
-             Ratio(ij,l,iq2)=ratiomin
-           endif 
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        DO l=1,llm
+          DO ij=1,ip1jmp1
+            ! attention, chaque fils doit avoir son masseq, sinon, le 1er
+            ! fils ecrase le masseq de ses freres.
+            !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
+            !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)     
+            !MVals: veiller a ce qu'on n'ait pas de denominateur nul
+            masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin)
+            if (q(ij,l,iq).gt.qperemin) then
+              Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
+            else
+              Ratio(ij,l,iq2)=ratiomin
+            endif 
           enddo   
-         enddo
-        enddo !do ifils=1,nqdesc(iq)
-
-        do ifils=1,nqfils(iq)
-         iq2=iqfils(ifils,iq)
-         call vly(Ratio,pente_max,masseq,qbyv,iq2)
-        enddo !do ifils=1,nqfils(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo
+      enddo
+
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        call vly(Ratio,pente_max,masseq,qbyv,iq2)
+      enddo
 
       DO l=1,llm
@@ -872,14 +862,12 @@
   
 ! 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)  
-         DO l=1,llm
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        DO l=1,llm
           DO ij=1,ip1jmp1
             q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)            
           enddo
-         enddo
-        enddo !do ifils=1,nqdesc(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo
+      enddo
 
       !write(*,*) 'vly 853: sortie'
@@ -888,5 +876,5 @@
       END
       RECURSIVE SUBROUTINE vlz(q,pente_max,masse,w,iq)
-      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils, ! CRisi 
+      USE infotrac, ONLY : nqtot,tracers, ! CRisi 
      &                     qperemin,masseqmin,ratiomin ! MVals et CRisi
 c
@@ -1009,28 +997,26 @@
 ! 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)
-         iq2=iqfils(ifils,iq)
-         DO l=1,llm
+      !write(*,*) 'vlsplt 942: iq,nqChilds(iq)=',iq,nqChilds(iq)
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        DO l=1,llm
           DO ij=1,ip1jmp1
-           !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
-           !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)        
-           !MVals: veiller a ce qu'on n'ait pas de denominateur nul
-           masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin)
-           if (q(ij,l,iq).gt.qperemin) then
-             Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
-           else
-             Ratio(ij,l,iq2)=ratiomin
-           endif      
+            !masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
+            !Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)        
+            !MVals: veiller a ce qu'on n'ait pas de denominateur nul
+            masseq(ij,l,iq2)=max(masse(ij,l,iq)*q(ij,l,iq),masseqmin)
+            if (q(ij,l,iq).gt.qperemin) then
+              Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
+            else
+              Ratio(ij,l,iq2)=ratiomin
+            endif      
           enddo   
-         enddo
-        enddo !do ifils=1,nqdesc(iq)
+        enddo
+      enddo
         
-        do ifils=1,nqfils(iq)
-         iq2=iqfils(ifils,iq)         
-         call vlz(Ratio,pente_max,masseq,wq,iq2)
-        enddo !do ifils=1,nqfils(iq)
-      endif !if (nqfils(iq).gt.0) then
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        call vlz(Ratio,pente_max,masseq,wq,iq2)
+      enddo
 ! end CRisi  
 
@@ -1045,14 +1031,12 @@
 
 ! 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)  
-         DO l=1,llm
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        DO l=1,llm
           DO ij=1,ip1jmp1
             q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)            
           enddo
-         enddo
-        enddo !do ifils=1,nqdesc(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo
+      enddo
       !write(*,*) 'vlsplt 1032'
 
Index: LMDZ6/trunk/libf/dyn3d/vlspltqs.F
===================================================================
--- LMDZ6/trunk/libf/dyn3d/vlspltqs.F	(revision 4046)
+++ LMDZ6/trunk/libf/dyn3d/vlspltqs.F	(revision 4050)
@@ -4,5 +4,5 @@
        SUBROUTINE vlspltqs ( q,pente_max,masse,w,pbaru,pbarv,pdt,
      ,                                  p,pk,teta,iq             )
-       USE infotrac, ONLY: nqtot,nqdesc,iqfils
+       USE infotrac, ONLY: nqtot,tracers
 c
 c     Auteurs:   P.Le Van, F.Hourdin, F.Forget, F.Codron 
@@ -121,10 +121,8 @@
       CALL SCOPY(ijp1llm,q(1,1,iq),1,zq(1,1,iq),1)
       CALL SCOPY(ijp1llm,masse,1,zm(1,1,iq),1)
-      if (nqdesc(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-        iq2=iqfils(ifils,iq)
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
         CALL SCOPY(ijp1llm,q(1,1,iq2),1,zq(1,1,iq2),1)
-       enddo  
-      endif !if (nqfils(iq).gt.0) then
+      enddo  
 
 c      call minmaxq(zq,qmin,qmax,'avant vlxqs     ')
@@ -162,17 +160,15 @@
       ENDDO
       ! CRisi: aussi pour les fils
-      if (nqdesc(iq).gt.0) then
-      do ifils=1,nqdesc(iq)
-        iq2=iqfils(ifils,iq)
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
         DO l=1,llm
-         DO ij=1,ip1jmp1
-           q(ij,l,iq2)=zq(ij,l,iq2)
-         ENDDO
-         DO ij=1,ip1jm+1,iip1
+          DO ij=1,ip1jmp1
+            q(ij,l,iq2)=zq(ij,l,iq2)
+          ENDDO
+          DO ij=1,ip1jm+1,iip1
             q(ij+iim,l,iq2)=q(ij,l,iq2)
-         ENDDO
+          ENDDO
         ENDDO
-      enddo !do ifils=1,nqdesc(iq)  
-      endif ! if (nqfils(iq).gt.0) then
+      enddo 
       !write(*,*) 'vlspltqs 183: fin de la routine'
 
@@ -180,5 +176,5 @@
       END
       SUBROUTINE vlxqs(q,pente_max,masse,u_m,qsat,iq)
-      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi
+      USE infotrac, ONLY : nqtot,tracers ! CRisi
 
 c
@@ -483,22 +479,20 @@
 ! CRisi: appel récursif de l'advection sur les fils.
 ! Il faut faire ça avant d'avoir mis à jour q et masse
-      !write(*,*) 'vlspltqs 326: iq,nqfils(iq)=',iq,nqfils(iq) 
+      !write(*,*) 'vlspltqs 326: iq,nqChilds(iq)=',iq,tracers(iq)%nqChilds
       
-      if (nqfils(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-         iq2=iqfils(ifils,iq)
-         DO l=1,llm
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        DO l=1,llm
           DO ij=iip2,ip1jm
-           ! On a besoin de q et masse seulement entre iip2 et ip1jm 
-           masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
-           Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
+          ! On a besoin de q et masse seulement entre iip2 et ip1jm 
+            masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
+            Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)
           enddo   
-         enddo
-        enddo !do ifils=1,nqdesc(iq)
-        do ifils=1,nqfils(iq)
-         iq2=iqfils(ifils,iq)
-         call vlx(Ratio,pente_max,masseq,u_mq,iq2)
-        enddo !do ifils=1,nqfils(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo
+      enddo
+      do ifils=1,tracers(iq)%nqChilds
+        iq2=tracers(iq)%iqDescen(ifils)
+        call vlx(Ratio,pente_max,masseq,u_mq,iq2)
+      enddo
 ! end CRisi
 
@@ -523,17 +517,15 @@
       ! On calcule q entre iip2+1,ip1jm -> on fait pareil pour ratio 
       ! puis on boucle en longitude
-      if (nqdesc(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-         iq2=iqfils(ifils,iq)  
-         DO l=1,llm
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        DO l=1,llm
           DO ij=iip2+1,ip1jm
             q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)            
           enddo
           DO ij=iip1+iip1,ip1jm,iip1
-             q(ij-iim,l,iq2)=q(ij,l,iq2)
-          enddo ! DO ij=ijb+iip1-1,ije,iip1
-         enddo !DO l=1,llm
-        enddo !do ifils=1,nqdesc(iq)
-      endif !if (nqfils(iq).gt.0) then
+            q(ij-iim,l,iq2)=q(ij,l,iq2)
+          enddo
+        enddo
+      enddo
 
 c     CALL SCOPY((jjm-1)*llm,q(iip1+iip1,1),iip1,q(iip2,1),iip1)
@@ -544,5 +536,5 @@
       END
       SUBROUTINE vlyqs(q,pente_max,masse,masse_adv_v,qsat,iq)
-      USE infotrac, ONLY : nqtot,nqfils,nqdesc,iqfils ! CRisi
+      USE infotrac, ONLY : nqtot,tracers ! CRisi
 c
 c     Auteurs:   P.Le Van, F.Hourdin, F.Forget 
@@ -794,23 +786,20 @@
 ! 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,nqDesc(iq)=',iq,tracers(iq)%nqDescen
    
-      if (nqfils(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-         iq2=iqfils(ifils,iq)
-         DO l=1,llm
-         DO ij=1,ip1jmp1
-           masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
-           Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)     
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        DO l=1,llm
+          DO ij=1,ip1jmp1
+            masseq(ij,l,iq2)=masse(ij,l,iq)*q(ij,l,iq)
+            Ratio(ij,l,iq2)=q(ij,l,iq2)/q(ij,l,iq)     
           enddo   
-         enddo
-        enddo !do ifils=1,nqdesc(iq)
-
-        do ifils=1,nqfils(iq)
-         iq2=iqfils(ifils,iq)
-         !write(*,*) 'vlyqs 783: appel rec de vly, iq2=',iq2
-         call vly(Ratio,pente_max,masseq,qbyv,iq2)
-        enddo !do ifils=1,nqfils(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo
+      enddo
+      do ifils=1,tracers(iq)%nqChilds
+        iq2=tracers(iq)%iqDescen(ifils)
+        !write(*,*) 'vlyqs 783: appel rec de vly, iq2=',iq2
+        call vly(Ratio,pente_max,masseq,qbyv,iq2)
+      enddo
 
       DO l=1,llm
@@ -868,14 +857,12 @@
 
 ! retablir les fils en rapport de melange par rapport a l'air:
-      if (nqdesc(iq).gt.0) then  
-       do ifils=1,nqdesc(iq)
-         iq2=iqfils(ifils,iq)  
-         DO l=1,llm
+      do ifils=1,tracers(iq)%nqDescen
+        iq2=tracers(iq)%iqDescen(ifils)
+        DO l=1,llm
           DO ij=1,ip1jmp1
             q(ij,l,iq2)=q(ij,l,iq)*Ratio(ij,l,iq2)            
           enddo
-         enddo
-        enddo !do ifils=1,nqdesc(iq)
-      endif !if (nqfils(iq).gt.0) then
+        enddo
+      enddo
       !write(*,*) 'vly 879'
 
